@vendure/admin-ui-plugin 2.1.0-next.3 → 2.1.0-next.4
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"280.d7210217b250418b.js","mappings":"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","names":["replaceLast","target","search","replace","lastIndex","lastIndexOf","substr","ProductDetailService","constructor","dataService","this","getTaxCategories","settings","mapSingle","data","taxCategories","items","pipe","shareReplay","createProductWithVariants","input","createVariantsConfig","languageCode","createProduct$","product","createProduct","nonEmptyOptionGroups","groups","filter","g","values","length","createOptionGroups$","createProductOptionGroups","forkJoin","mergeMap","optionGroups","map","optionGroup","addOptionGroupToProduct","productId","id","optionGroupId","of","variants","v","optionIds","optionValues","optionName","index","option","options","find","o","name","Error","og","reduce","flat","createProductVariants","stockLocationId","c","code","normalizeString","translations","createProductOptionGroup","variantData","notNullOrUndefined","join","price","sku","stockLevels","stockOnHand","stock","updateProduct","updateOptions","autoUpdate","productInput","variantsInput","updateOperations","updateVariantsInput","getProductVariantsForProduct","productVariants","push","productOldName","findTranslation","productNewName","variant","currentVariantName","variantInput","existingVariantInput","i","variantTranslation","updateProductVariants","updateProductOption","updateProductVariantNames$","oldOptionName","newOptionName","variantsToUpdate","includes","variantName","deleteProductVariant","switchMap","result","DeletionResult","DELETED","getProduct","single$","throwError","message","i0","i1","factory","ɵfac","providedIn","_r3","ctx_r2","save","ctx_r0","detailForm","pristine","invalid","ctx_r8","optionGroupCustomFields","optionGroup_r6","get","updatePermission","optionControl_r18","value","optionControl_r19","createdAt","optionControl_r20","updatedAt","optionControl_r21","ctx_r15","optionControl_r22","ctx_r17","optionCustomFields","optionControl_r23","$event","_r25","$implicit","ctx_r24","paginationSettings","currentPage","ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_ng_template_3_Template","ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_ng_template_6_Template","ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_ng_template_9_Template","ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_ng_template_12_Template","ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_ng_template_15_Template","ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_ng_template_18_Template","options_r11","ctx_r9","itemsPerPage","ProductOptionsEditorComponent_form_22_vdr_card_2_ng_container_11_Template","ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_Template","i_r7","ctx_r5","getOptions","ProductOptionsEditorComponent_form_22_vdr_card_2_Template","ctx_r1","getOptionGroups","ProductOptionsEditorComponent","BaseDetailComponent","route","router","serverConfigService","productDetailService","formBuilder","changeDetector","notificationService","super","autoUpdateVariantNames","Permission","UpdateCatalog","UpdateProduct","getCustomFieldConfig","ngOnInit","optionGroups$","snapshot","entity","tap","group","UntypedFormGroup","UntypedFormArray","init","controls","$product","combineLatest","entity$","languageCode$","take","optionGroupForm","dirty","optionGroupEntity","getUpdatedOptionGroup","updateProductOptionGroup","optionForm","getUpdatedOption","subscribe","markAsPristine","markForCheck","success","_","err","error","optionGroupFormGroup","createUpdatedTranslatable","translatable","updatedFields","customFieldConfig","defaultTranslation","optionFormGroup","setFormValues","groupsForm","groupTranslation","groupForm","setOptionGroupForm","setCustomFieldsForm","optionsForm","array","addControl","optionTranslation","setOptionForm","customFields","formGroup","currentTranslation","customValueFieldsGroup","hash","field","setCustomFieldFormValues","control","setValue","i2","i3","i4","selectors","features","decls","vars","consts","template","rf","ctx","setLanguage","ProductOptionsEditorComponent_button_20_Template","ProductOptionsEditorComponent_form_22_Template","availableLanguages$","cancel","ctx_r4","confirm","form","CreateProductOptionGroupDialogComponent","Validators","required","updateCode","nameControl","codeControl","resolveWith","CreateProductOptionGroupDialogComponent_ng_template_0_Template","CreateProductOptionGroupDialogComponent_ng_template_8_Template","optionGroup_r5","ctx_r3","existingVariant","_r7","ctx_r6","CreateProductVariantDialogComponent","record","currencyCode","FormControl","valueChanges","Object","every","entries","groupCode","optionId","groupId","getGroupIdFromCode","Number","getGroupCodeFromId","CreateProductVariantDialogComponent_ng_template_0_Template","CreateProductVariantDialogComponent_vdr_form_field_3_Template","CreateProductVariantDialogComponent_clr_alert_4_Template","CreateProductVariantDialogComponent_div_5_Template","CreateProductVariantDialogComponent_ng_template_16_Template","option_r3","_r8","ctx_r7","removeOption","i_r5","updateOption","cancelBubble","ctx_r11","editName","isLast_r4","lastSelected","locked","groupName","editingIndex","OptionValueInputComponent_div_1_vdr_chip_1_Template","OPTION_VALUE_INPUT_VALUE_ACCESSOR","provide","NG_VALUE_ACCESSOR","useExisting","forwardRef","OptionValueInputComponent","multi","formValue","add","EventEmitter","remove","edit","disabled","isFocussed","registerOnChange","fn","onChangeFn","registerOnTouched","onTouchFn","setDisabledState","isDisabled","writeValue","obj","focus","textArea","nativeElement","event","optionValue","nameInputs","setTimeout","newName","emit","handleKey","key","addOptionValue","preventDefault","removeLastOption","handleBlur","parseInputIntoOptions","unique","split","s","trim","viewQuery","ElementRef","_r12","_r1","OptionValueInputComponent_div_1_Template","group_r10","_r14","i_r11","addOption","ctx_r16","removeOptionGroup","isNew","variant_r18","variant_r19","variant_r20","variant_r21","variant_r22","optionGroup_r23","option_r29","_r33","variant_r25","item","ctx_r31","setOptionToAddToVariant","ctx_r35","addOptionToVariant","ctx_r28","optionsToAddToVariant","ProductVariantsEditorComponent_vdr_dt2_column_33_ng_template_1_vdr_chip_0_Template","ProductVariantsEditorComponent_vdr_dt2_column_33_ng_template_1_ng_template_1_Template","getOption","_r27","ProductVariantsEditorComponent_vdr_dt2_column_33_ng_template_1_Template","variant_r40","variant_r41","priceWithTax","variant_r42","_r44","ctx_r43","deleteVariant","GeneratedVariant","config","keys","ProductVariantsEditorComponent","modalService","formValueChanged","optionsChanged","searchTermControl","selectionManager","SelectionManager","multiSelect","itemsAreEqual","a","b","additiveMode","refresh$","Subject","paramMap","getDefaultUiLanguage","getActiveChannel","activeChannel","defaultCurrencyCode","product$","getProductVariantsOptions","parent","startWith","variants$","term","toLowerCase","totalItems$","p","allUsedOptionIds","allUsedOptionGroupIds","setItemsPerPage","setPageNumber","page","onFormChanged","variantInfo","enabled","canDeactivate","addOptionGroup","fromComponent","locals","EMPTY","next","usedByVariantsCount","dialog","title","body","translationVars","count","buttons","type","label","returnValue","val","removeOptionGroupFromProduct","force","__typename","addOptionToGroup","productOptionGroupId","createProductOption","deleteProductOption","variantId","response","createNewVariant","ProductVariantsEditorComponent_div_2_Template","ProductVariantsEditorComponent_ng_template_20_Template","ProductVariantsEditorComponent_ng_template_23_Template","ProductVariantsEditorComponent_ng_template_26_Template","ProductVariantsEditorComponent_ng_template_29_Template","ProductVariantsEditorComponent_ng_template_32_Template","ProductVariantsEditorComponent_vdr_dt2_column_33_Template","ProductVariantsEditorComponent_ng_template_37_Template","ProductVariantsEditorComponent_ng_template_40_Template","ProductVariantsEditorComponent_ng_template_43_Template","ProductVariantsResolver","BaseEntityResolver","mapStream","createRoutes","pageService","path","component","PageComponent","locationId","breadcrumb","children","getPageTabRoutes","link","CanDeactivateDetailGuard","resolve","inject","DataService","params","createResolveData","productOptionsEditorBreadcrumb","selectValues","selectedValues","ApplyFacetDialogComponent","ngAfterViewInit","selector","FacetValueSelectorComponent","ApplyFacetDialogComponent_ng_template_0_Template","ApplyFacetDialogComponent_ng_template_2_Template","_r2","ASSET_DETAIL_QUERY","gql","ASSET_FRAGMENT","TAG_FRAGMENT","AssetDetailComponent","TypedBaseDetailComponent","FormGroup","tags","getCustomFieldsDefaults","ngOnDestroy","destroy","onAssetChange","markAsDirty","updateAsset","t","AssetDetailComponent_button_5_Template","_c0","AssetListComponent","BaseListComponent","searchTerm$","BehaviorSubject","undefined","filterByTags$","uploading","setQueryFn","args","getAssetList","refetchOnChannelChange","assets","skip","searchTerm","contains","sort","SortOrder","DESC","tagsOperator","LogicalOperator","AND","paginationConfig$","itemsPerPage$","currentPage$","totalItems","debounceTime","takeUntil","destroy$","refresh","allTags$","getTagList","filesSelected","files","createAssets","finalize","successCount","deleteAssets","showModalAndDelete","r","assetIds","res","items$","_c1","_r10","previewAsset","featuredAsset","selectAssets","ctx_r13","AssetsComponent_div_0_img_2_Template","AssetsComponent_div_0_div_3_Template","AssetsComponent_div_0_ng_container_5_Template","AssetsComponent_div_0_div_6_Template","updatePermissions","_r20","ctx_r19","_r22","ctx_r21","_r24","ctx_r23","AssetsComponent_ng_template_1_img_1_Template","AssetsComponent_ng_template_1_div_2_Template","AssetsComponent_ng_template_1_ng_container_3_Template","AssetsComponent_ng_template_1_button_4_Template","_r29","dropListDropped","asset_r26","ctx_r30","setAsFeatured","ctx_r32","removeAsset","index_r27","ctx_r25","isFeatured","AssetsComponent_ng_template_3_div_1_Template","compact","AssetsComponent","assetsSetter","slice","change","AssetPickerDialogComponent","size","concat","emitChangeEvent","asset","AssetPreviewDialogComponent","closable","moveItemInArray","previousContainer","container","hostVars","hostBindings","AssetsComponent_div_0_Template","AssetsComponent_ng_template_1_Template","AssetsComponent_ng_template_3_Template","AssignProductsToChannelDialogComponent_ng_template_0_ng_container_0_Template","AssignProductsToChannelDialogComponent_ng_template_0_ng_template_1_Template","isProductVariantMode","selectedChannel","row_r9","pricePreview","ctx_r10","AssignProductsToChannelDialogComponent_tr_33_ng_template_7_Template","AssignProductsToChannelDialogComponent_tr_33_ng_template_8_Template","currentChannel","_r11","ctx_r14","_r18","assign","AssignProductsToChannelDialogComponent_ng_template_35_ng_template_4_Template","AssignProductsToChannelDialogComponent_ng_template_35_ng_template_5_Template","_r15","AssignProductsToChannelDialogComponent","productVariantIds","priceFactorControl","UntypedFormControl","selectedChannelIdControl","activeChannelId$","client","userStatus","activeChannelId","allChannels$","getChannels","channels","availableChannels","ids","selectChannel","variantsPreview$","from","getTopVariants","factor","channelIds","assignVariantsToChannel","channelId","priceFactor","channel","assignProductsToChannel","productIds","_this","_asyncToGenerator","lastValueFrom","getProductVariants","filterOperator","OR","in","AssignProductsToChannelDialogComponent_ng_template_0_Template","AssignProductsToChannelDialogComponent_ng_template_29_Template","AssignProductsToChannelDialogComponent_ng_template_30_Template","AssignProductsToChannelDialogComponent_tr_33_Template","AssignProductsToChannelDialogComponent_ng_template_35_Template","currentChannelIds","GET_PRODUCTS_WITH_FACET_VALUES_BY_IDS","GET_VARIANTS_WITH_FACET_VALUES_BY_IDS","UPDATE_PRODUCTS_BULK","UPDATE_VARIANTS_BULK","item_r6","facetValue_r10","_r13","removeFacetValue","BulkAddFacetValuesDialogComponent_table_7_tr_2_div_4_Template","BulkAddFacetValuesDialogComponent_table_7_tr_2_vdr_facet_value_chip_6_Template","facetValues","BulkAddFacetValuesDialogComponent_table_7_tr_2_Template","addFacetValues","facetValuesRemoved","BulkAddFacetValuesDialogComponent","changeDetectorRef","mode","state","fetchData$","query","products","subscription","unsubscribe","facetValueId","fv","selectedFacetValueIds","sv","mutate","facetValueIds","BulkAddFacetValuesDialogComponent_ng_template_0_Template","BulkAddFacetValuesDialogComponent_table_7_Template","BulkAddFacetValuesDialogComponent_ng_template_8_Template","BulkAddFacetValuesDialogComponent_ng_template_10_Template","variant_r6","variant_r7","variant_r8","variant_r9","variant_r10","CollectionContentsComponent","previewUpdatedFilters","filterTermControl","isLoading","collectionIdChange$","parentIdChange$","filterChanges$","inheritFiltersChanges$","contentsCurrentPage$","queryParamMap","qpm","distinctUntilChanged","contentsItemsPerPage$","perPage","filterTerm$","setContentsPageNumber","asObservable","inheritFilters","collection$","parentId","filterTerm","filters","filterClause","collection","previewCollectionVariants","catchError","getCollectionContents","contents$","contentsTotalItems$","ngOnChanges","changes","collectionId","currentValue","updatedFilters","complete","setParam","setContentsItemsPerPage","navigate","relativeTo","queryParams","n","queryParamsHandling","replaceUrl","contentQueries","dirIndex","TemplateRef","CollectionContentsComponent_ng_container_3_Template","CollectionContentsComponent_ng_template_14_Template","CollectionContentsComponent_ng_template_17_Template","CollectionContentsComponent_ng_template_20_Template","CollectionContentsComponent_ng_template_23_Template","CollectionContentsComponent_ng_template_26_Template","headerTemplate","onToggleAllClick","areAllCurrentItemsSelected","sort_r16","sortOrder","_r23","ngIf","toggleSortOrder","CollectionDataTableComponent_th_8_div_5_clr_icon_2_Template","CollectionDataTableComponent_th_8_div_5_clr_icon_3_Template","CollectionDataTableComponent_th_8_div_5_clr_icon_4_Template","CollectionDataTableComponent_th_8_div_5_div_5_Template","CollectionDataTableComponent_th_8_div_5_Template","column_r13","expand","align","heading","activeFilter_r29","ctx_r27","CollectionDataTableComponent_tr_13_ng_container_8_vdr_data_table_filters_2_Template","CollectionDataTableComponent_tr_13_ng_container_8_vdr_data_table_filters_3_Template","ctx_r26","activeFilters","_r31","toggleSearchFilterRow","CollectionDataTableComponent_tr_13_ng_container_6_Template","CollectionDataTableComponent_tr_13_ng_container_7_Template","CollectionDataTableComponent_tr_13_ng_container_8_Template","showSearchFilterRow","visibleSortedColumns","searchComponent","customSearchTemplate","_r9","item_r32","i_r33","emptyStateLabel","_r35","ctx_r34","itemsPerPageChange","_c2","currentStart","currentEnd","_r37","ctx_r36","pageChange","_r46","item_r38","ctx_r44","onRowClick","ctx_r41","activeIndex","absoluteIndex","isSelected","CollectionDataTableComponent_ng_template_23_td_3_ng_container_2_ng_container_1_Template","componentConfig_r52","_c3","injector","CollectionDataTableComponent_ng_template_23_td_3_ng_template_3_ng_container_0_Template","column_r48","_c4","depth_r39","CollectionDataTableComponent_ng_template_23_td_3_ng_container_2_Template","CollectionDataTableComponent_ng_template_23_td_3_ng_template_3_Template","ctx_r42","customComponents","_r50","CollectionDataTableComponent_ng_template_23_ng_container_5_ng_container_1_Template","subCollection_r59","CollectionDataTableComponent_ng_template_23_td_2_Template","CollectionDataTableComponent_ng_template_23_td_3_Template","CollectionDataTableComponent_ng_template_23_ng_container_5_Template","_c5","getSubcollections","CollectionDataTableComponent","DataTable2Component","localStorageService","dragDrop","changeOrder","dragRefs","sortPredicate","dropList","getSortedItems","subCollections","allCollections","subCollectionMatches","forEach","collectionRowList","removeItem","ref","toArray","dropContainer","_dragRef","_withDropContainer","_dropListRef","addItem","onDrop","isTopLevel","breadcrumbs","pageIndexOffset","parentIndex","findIndex","adjustedIndex","currentIndex","splice","previousIndex","adjustedPreviousIndex","CdkDropList","CdkDrag","CollectionDataTableComponent_vdr_data_table_filter_presets_0_Template","CollectionDataTableComponent_th_7_Template","CollectionDataTableComponent_th_8_Template","onColumnReorder","onColumnsReset","CollectionDataTableComponent_tr_13_Template","CollectionDataTableComponent_ng_container_15_Template","CollectionDataTableComponent_tr_18_Template","CollectionDataTableComponent_vdr_items_per_page_controls_20_Template","CollectionDataTableComponent_div_21_Template","CollectionDataTableComponent_vdr_pagination_controls_22_Template","CollectionDataTableComponent_ng_template_23_Template","disableSelect","selection","uiLanguage$","sortedColumns","_c7","trackByFn","_r17","create","ctx_r18","assetsChanged","CollectionDetailComponent_ng_template_11_button_0_Template","entity_r21","breadcrumb_r24","CollectionDetailComponent_vdr_page_block_28_li_3_a_1_Template","CollectionDetailComponent_vdr_page_block_28_li_3_a_2_Template","CollectionDetailComponent_vdr_page_block_28_li_3_ng_container_3_Template","isFirst_r25","isLast_r26","CollectionDetailComponent_vdr_page_block_28_li_3_Template","entity_r22","removeFilter","filter_r32","ctx_r12","getFilterDefinition","filter_r37","_r39","ctx_r38","addFilter","description","CollectionDetailComponent_div_64_button_9_Template","allFilters","_r42","toggleLivePreview","count_r40","tmp_1_0","tmp_3_0","livePreview","COLLECTION_DETAIL_QUERY","COLLECTION_FRAGMENT","CollectionDetailComponent","slug","unicodePatternValidator","visible","assetChanges","UpdateCollection","filterRemoved$","getCollectionFilters","collectionFilters","filtersFormArray","inheritFiltersControl","inheritFilters$","updatedFilters$","merge","statusChanges","touched","mapOperationsToInputs","_filter","arg","arguments","parentId$","pm","f","updateSlug","nameValue","slugControl","currentSlugIsEmpty","collectionFilter","filtersArray","argsHash","output","getConfigArgValue","removeAt","markAsTouched","getUpdatedCollection","isPrivate","createCollection","category","updateCollection","contentsComponent","set","JSON","stringify","patchValue","formArray","clear","featuredAssetId","operations","formValueOperations","j","encodeConfigArgValue","CollectionDetailComponent_button_9_Template","CollectionDetailComponent_ng_template_11_Template","CollectionDetailComponent_ng_container_23_Template","CollectionDetailComponent_ng_template_24_Template","CollectionDetailComponent_vdr_card_26_Template","CollectionDetailComponent_vdr_page_block_28_Template","CollectionDetailComponent_vdr_card_46_Template","CollectionDetailComponent_ng_container_59_Template","CollectionDetailComponent_ng_template_60_Template","CollectionDetailComponent_ng_container_63_Template","CollectionDetailComponent_div_64_Template","CollectionDetailComponent_ng_template_72_Template","isNew$","_r4","CollectionBreadcrumbPipe","transform","collection_r5","depth_r7","_r16","collection_r6","toggleExpanded","MoveCollectionsDialogComponent_ng_template_14_button_2_clr_icon_1_Template","MoveCollectionsDialogComponent_ng_template_14_button_2_clr_icon_2_Template","expandedIds","pure","MoveCollectionsDialogComponent_ng_template_14_clr_icon_1_Template","MoveCollectionsDialogComponent_ng_template_14_button_2_Template","MoveCollectionsDialogComponent_ng_template_14_button_3_Template","_r19","item_r26","MoveCollectionsDialogComponent_ng_template_17_ng_container_1_ng_container_1_div_1_Template","breadcrumbs_r22","MoveCollectionsDialogComponent_ng_template_17_ng_container_1_ng_container_1_Template","MoveCollectionsDialogComponent_ng_template_17_ng_container_1_span_2_Template","MoveCollectionsDialogComponent_ng_template_17_ng_container_1_Template","collection_r20","collection_r28","MoveCollectionsDialogComponent","i18nService","expandedIds$","getCollectionsResult","getCollections","topLevelOnly","refetch","rootCollectionId$","collections","rootCollectionId","translate","position","subCollections$","MoveCollectionsDialogComponent_ng_template_0_Template","MoveCollectionsDialogComponent_ng_template_11_Template","MoveCollectionsDialogComponent_ng_template_14_Template","MoveCollectionsDialogComponent_ng_template_17_Template","MoveCollectionsDialogComponent_ng_template_20_Template","deleteCollectionsBulkAction","createBulkDeleteAction","location","requiresPermission","userPermissions","DeleteCollection","DeleteCatalog","getItemName","bulkDelete","deleteCollections","moveCollectionsBulkAction","icon","onClick","hostComponent","clearSelection","ModalService","NotificationService","inputs","moveCollection","assignCollectionsToChannelBulkAction","createBulkAssignToChannelAction","bulkAssignToChannel","collectionIds","assignCollectionsToChannel","removeCollectionsFromChannelBulkAction","createBulkRemoveFromChannelAction","bulkRemoveFromChannel","removeCollectionsFromChannel","collection_r13","collection_r14","collection_r15","collection_r16","depth_r18","_r26","collection_r17","CollectionListComponent_ng_template_11_ng_template_24_button_2_clr_icon_1_Template","CollectionListComponent_ng_template_11_ng_template_24_button_2_clr_icon_2_Template","ctx_r20","CollectionListComponent_ng_template_11_ng_template_24_clr_icon_1_Template","CollectionListComponent_ng_template_11_ng_template_24_button_2_Template","item_r34","CollectionListComponent_ng_template_11_ng_template_27_ng_container_1_ng_container_1_div_1_Template","breadcrumbs_r30","CollectionListComponent_ng_template_11_ng_template_27_ng_container_1_ng_container_1_Template","CollectionListComponent_ng_template_11_ng_template_27_ng_container_1_span_2_Template","CollectionListComponent_ng_template_11_ng_template_27_ng_container_1_Template","collection_r36","CollectionListComponent_ng_template_11_ng_template_33_vdr_chip_0_Template","CollectionListComponent_ng_template_11_ng_template_33_vdr_chip_1_Template","collection_r37","collection_r40","customField_r41","sorts","_r43","ctx_r45","onRearrange","CollectionListComponent_ng_template_11_ng_template_12_Template","CollectionListComponent_ng_template_11_ng_template_15_Template","CollectionListComponent_ng_template_11_ng_template_18_Template","CollectionListComponent_ng_template_11_ng_template_21_Template","CollectionListComponent_ng_template_11_ng_template_24_Template","CollectionListComponent_ng_template_11_ng_template_27_Template","CollectionListComponent_ng_template_11_ng_template_30_Template","CollectionListComponent_ng_template_11_ng_template_33_Template","CollectionListComponent_ng_template_11_ng_template_36_Template","CollectionListComponent_ng_template_11_vdr_dt2_custom_field_column_37_Template","activeCollectionIndex$","ctx_r46","activeCollectionId$","CollectionListComponent_ng_template_12_ng_container_0_Template","CollectionListComponent","TypedBaseListComponent","createFilterCollection","addIdFilter","addDateFilters","kind","filterField","toFilterInput","eq","addCustomFieldFilters","connectToRoute","createSortCollection","defaultSort","addSort","addCustomFieldSorts","configure","document","GetCollectionListDocument","getItems","setVariables","_take","createFilterInput","createSortInput","refreshListOnChanges","activeCollectionTitle$","match","closeContents","contents","setContentLanguage","expanded","CollectionListComponent_a_8_Template","CollectionListComponent_ng_template_11_Template","CollectionListComponent_ng_template_12_Template","contentLanguage$","CollectionTreeService","allMoveListItems","_rearrange$","_delete$","rearrange$","delete$","setCollectionTree","tree","collectionTree","resetMoveList","getMoveListItems","calculateAllMoveListItems","ancestorIdPath","has","newParentId","onMove","onDelete","visit","node","parentPath","child","Set","collection_r2","CollectionTreeNodeComponent_div_3_button_5_clr_icon_1_Template","CollectionTreeNodeComponent_div_3_button_5_clr_icon_2_Template","expandAll","item_r19","move","hasUpdatePermission$","activeCollectionId","toggleSelection","CollectionTreeNodeComponent_div_3_button_5_Template","CollectionTreeNodeComponent_div_3_ng_template_6_Template","CollectionTreeNodeComponent_div_3_vdr_chip_10_Template","CollectionTreeNodeComponent_div_3_div_19_Template","CollectionTreeNodeComponent_div_3_a_24_Template","restoredCtx","i_r3","moveUp","moveDown","CollectionTreeNodeComponent_div_3_button_39_Template","ctx_r29","delete","CollectionTreeNodeComponent_div_3_vdr_collection_tree_node_46_Template","depth","_r5","_c6","moveListItems","hasDeletePermission$","CollectionTreeNodeComponent","collectionTreeService","parentName","permissions$","permissions","perms","selectionChanges$","expandAllChange","previousValue","drop","arrayToTree","nodes","currentState","topLevelNodes","mappedArr","currentStateMap","treeToMap","nodeMap","Map","hasOwnProperty","mappedElem","CollectionTreeNodeComponent_div_3_Template","i5","i14","styles","changeDetection","CollectionTreeComponent","rearrange","deleteCollection","variant_r3","outputs","CollectionTreeComponent_vdr_collection_tree_node_0_Template","ConfirmVariantDeletionDialogComponent","ConfirmVariantDeletionDialogComponent_ng_template_0_Template","ConfirmVariantDeletionDialogComponent_li_4_Template","ConfirmVariantDeletionDialogComponent_ng_template_5_Template","FacetDetailComponent_ng_template_11_button_0_Template","entity_r14","customValueFields","i_r20","updateValueCode","FacetDetailComponent_vdr_card_42_table_2_tr_13_td_8_Template","deleteFacetValue","value_r19","FacetDetailComponent_vdr_card_42_table_2_ng_container_10_Template","FacetDetailComponent_vdr_card_42_table_2_tr_13_Template","addFacetValue","FacetDetailComponent_vdr_card_42_table_2_Template","FacetDetailComponent_vdr_card_42_button_4_Template","getValuesFormArray","FACET_DETAIL_QUERY","FACET_WITH_VALUES_FRAGMENT","FacetDetailComponent","facet","UpdateFacet","currentCode","customValueFieldIsSet","valuesFormArray","valueGroup","newValue","fieldDef","insert","facetForm","newFacet","getUpdatedFacet","createFacet","valuesArray","updateFacet","createdValues","getCreatedFacetValues","createFacetValues","GetFacetDetailDocument","updatedValues","getUpdatedFacetValues","updateFacetValues","deleted","deleteFacetValues","currentValuesFormArray","valueTranslation","valueControl","fieldValue","facetFormGroup","facetId","dirtyValues","formRow","toString","dirtyValueValues","FacetDetailComponent_button_9_Template","FacetDetailComponent_ng_template_11_Template","FacetDetailComponent_ng_container_23_Template","FacetDetailComponent_ng_template_24_Template","FacetDetailComponent_vdr_page_entity_info_27_Template","FacetDetailComponent_vdr_card_40_Template","FacetDetailComponent_vdr_card_42_Template","deleteFacetsBulkAction","DeleteFacet","shouldRetryItem","retrying","deleteFacets","assignFacetsToChannelBulkAction","facetIds","assignFacetsToChannel","removeFacetsFromChannelBulkAction","removeFacetsFromChannel","isErrorResult","removeFacetsFromChannelBulkAction2","getTranslationVars","getChannelCodeFromUserStatus","iconClass","isVisible","currentChannelIsNotDefault","res2","removedCount","errors","errorIds","result2","notRemovedCount","then","channelCode","facet_r9","facet_r10","facet_r11","facet_r12","facet_r13","FacetListComponent_ng_template_34_vdr_chip_0_Template","FacetListComponent_ng_template_34_vdr_chip_1_Template","facet_r14","value_r21","facet_r17","valueList","initialLimit","toggleDisplayLimit","FacetListComponent_ng_template_37_button_4_ng_container_1_Template","FacetListComponent_ng_template_37_button_4_ng_template_2_Template","displayLimit","FacetListComponent_ng_template_37_vdr_facet_value_chip_1_Template","FacetListComponent_ng_template_37_vdr_chip_3_Template","FacetListComponent_ng_template_37_button_4_Template","customField_r31","FACET_LIST_QUERY","FACET_WITH_VALUE_LIST_FRAGMENT","FacetListComponent","GetFacetListDocument","facets","FacetListComponent_a_8_Template","FacetListComponent_ng_template_19_Template","FacetListComponent_ng_template_22_Template","FacetListComponent_ng_template_25_Template","FacetListComponent_ng_template_28_Template","FacetListComponent_ng_template_31_Template","FacetListComponent_ng_template_34_Template","FacetListComponent_ng_template_37_Template","FacetListComponent_vdr_dt2_custom_field_column_38_Template","group_r2","_r6","handleEnter","generateVariants","location_r17","selectedStockLocationId","GenerateProductVariantsComponent_ng_container_5_vdr_form_field_3_option_3_Template","stockLocations_r12","variant_r24","GenerateProductVariantsComponent_ng_container_5_div_4_tr_15_td_1_Template","GenerateProductVariantsComponent_ng_container_5_div_4_tr_15_td_2_Template","variantFormValues","GenerateProductVariantsComponent_ng_container_5_div_4_th_4_Template","GenerateProductVariantsComponent_ng_container_5_div_4_th_5_Template","GenerateProductVariantsComponent_ng_container_5_div_4_tr_15_Template","GenerateProductVariantsComponent_ng_container_5_clr_alert_1_Template","GenerateProductVariantsComponent_ng_container_5_vdr_form_field_3_Template","GenerateProductVariantsComponent_ng_container_5_div_4_Template","DEFAULT_VARIANT_CODE","GenerateProductVariantsComponent","variantsChange","stockLocations$","GetStockLocationListDocument","stockLocations","groupNameInputs","sum","generateAllCombinations","nonNullable","copyFromDefault","onFormChange","copyValuesToPristine","optionValueInputComponent","stopPropagation","formControl","correspondingFormControl","emitEvent","variantsToCreate","prop","GenerateProductVariantsComponent_div_0_Template","GenerateProductVariantsComponent_ng_container_5_Template","switchMapTo","innerObservable","resultSelector","isFunction","variant_r14","variant_r15","variant_r16","asset_r21","ProductVariantListComponent_ng_template_20_img_1_Template","ProductVariantListComponent_ng_template_20_ng_template_2_Template","variant_r17","variant_r23","ProductVariantListComponent_ng_template_29_vdr_chip_0_Template","ProductVariantListComponent_ng_template_29_vdr_chip_1_Template","variant_r27","variant_r28","stockLevel_r31","stockAllocated","ProductVariantListComponent_ng_template_38_vdr_chip_0_span_4_Template","stockLocation","ProductVariantListComponent_ng_template_38_vdr_chip_0_Template","variant_r29","field_r34","ProductVariantListComponent","hideLanguageSelect","addFilters","inputType","addSorts","ProductVariantListQueryDocument","ProductVariantListComponent_vdr_page_block_0_Template","ProductVariantListComponent_ng_template_11_Template","ProductVariantListComponent_ng_template_14_Template","ProductVariantListComponent_ng_template_17_Template","ProductVariantListComponent_ng_template_20_Template","ProductVariantListComponent_ng_template_23_Template","ProductVariantListComponent_ng_template_26_Template","ProductVariantListComponent_ng_template_29_Template","ProductVariantListComponent_ng_template_32_Template","ProductVariantListComponent_ng_template_35_Template","ProductVariantListComponent_ng_template_38_Template","ProductVariantListComponent_vdr_dt2_custom_field_column_39_Template","ProductDetailComponent_ng_template_12_button_0_Template","channel_r23","removeFromChannel","ProductDetailComponent_ng_container_21_vdr_card_1_vdr_form_item_2_ng_container_3_vdr_chip_1_Template","ctx_r22","isDefaultChannel","ProductDetailComponent_ng_container_21_vdr_card_1_vdr_form_item_2_ng_container_3_Template","_r30","assignToChannel","productChannels$","ProductDetailComponent_ng_container_21_vdr_card_1_vdr_form_item_2_Template","ProductDetailComponent_ng_container_21_vdr_card_1_Template","optionGroup_r33","ProductDetailComponent_vdr_card_23_vdr_chip_3_Template","ProductDetailComponent_vdr_card_23_a_6_Template","facetValue_r34","_r36","removeProductFacetValue","_r38","ctx_r37","selectProductFacetValue","entity_r39","_r41","ctx_r40","GET_PRODUCT_DETAIL","PRODUCT_DETAIL_FRAGMENT","ProductDetailComponent","productFacetValues$","formFacetValueIdChanges$","getFacetValues","facetValues$","DEFAULT_CHANNEL_CODE","removeProductsFromChannel","assignVariantToChannel","removeVariantFromChannel","removeVariantsFromChannel","displayFacetValueModal","productGroup","currentFacetValueIds","newProduct","getUpdatedProduct","console","updateSlugAfterSave","productFormGroup","results","firstResult","isUpdateMutation","ProductDetailComponent_button_10_Template","ProductDetailComponent_ng_template_12_Template","ProductDetailComponent_clr_toggle_wrapper_20_Template","ProductDetailComponent_ng_container_21_Template","ProductDetailComponent_vdr_card_23_Template","ProductDetailComponent_vdr_facet_value_chip_27_Template","ProductDetailComponent_button_30_Template","ProductDetailComponent_vdr_card_31_Template","ProductDetailComponent_div_42_Template","ProductDetailComponent_vdr_card_54_Template","ProductDetailComponent_div_62_Template","ProductDetailComponent_ng_template_64_Template","ProductDetailComponent_div_66_Template","tmp_16_0","deleteProductsBulkAction","DeleteProduct","deleteProducts","assignProductsToChannelBulkAction","isMultiChannel","removeProductsFromChannelBulkAction","assignFacetValuesToProductsBulkAction","product_r10","product_r11","product_r12","asset_r17","ProductListComponent_ng_template_36_img_1_Template","ProductListComponent_ng_template_36_ng_template_2_Template","product_r13","product_r18","product_r19","ProductListComponent_ng_template_45_vdr_chip_0_Template","ProductListComponent_ng_template_45_vdr_chip_1_Template","product_r20","product_r23","variantList","customField_r24","ProductListComponent","jobQueueService","pendingSearchIndexUpdates","FacetValueFormInputComponent","serializeValue","deserializeValue","getLabel","ProductListQueryDocument","rebuildSearchIndex","reindex","info","addJob","job","JobState","COMPLETED","time","Intl","NumberFormat","format","duration","indexedItemCount","deleteProduct","delay","ProductListComponent_a_8_Template","ProductListComponent_ng_template_27_Template","ProductListComponent_ng_template_30_Template","ProductListComponent_ng_template_33_Template","ProductListComponent_ng_template_36_Template","ProductListComponent_ng_template_39_Template","ProductListComponent_ng_template_42_Template","ProductListComponent_ng_template_45_Template","ProductListComponent_ng_template_48_Template","ProductListComponent_vdr_dt2_custom_field_column_49_Template","taxRate$","grossPrice$","VariantPriceDetailComponent","priceChange$","taxCategoryIdChange$","taxRates$","getTaxRatesSimple","taxRates","activeChannel$","taxCategoryId","defaultTaxZone","applicableRate","taxRate","zone","Math","round","item_r2","selectedVariantId","onSelect","ProductVariantQuickJumpComponent_ng_select_0_ng_template_3_Template","searchFn","priceIncludesTax","VariantPriceDetailComponent_div_3_Template","VariantPriceDetailComponent_div_4_Template","ProductVariantQuickJumpComponent","GetProductVariantsQuickJumpDocument","ProductVariantQuickJumpComponent_ng_select_0_Template","tmp_0_0","availableLanguages_r3","ProductVariantDetailComponent_ng_container_4_vdr_language_selector_1_Template","stockLevelsForm","pricesForm","optionGroupCode","option_r24","ProductVariantDetailComponent_form_10_vdr_card_7_vdr_chip_3_Template","ProductVariantDetailComponent_form_10_vdr_card_7_a_6_Template","facetValue_r26","_r28","selectFacetValue","entity_r31","taxCategory_r32","price_r33","toggleDeletePrice","channelDefaultCurrencyCode","ProductVariantDetailComponent_form_10_div_43_div_7_Template","channelPriceIncludesTax$","currencyCode_r42","addPriceInCurrency","ProductVariantDetailComponent_form_10_ng_container_44_div_1_button_8_Template","unusedCurrencyCodes_r39","ProductVariantDetailComponent_form_10_ng_container_44_div_1_Template","stockLevel_r46","tmp_2_0","tmp_5_0","tmp_6_0","stockLocation_r50","_r52","ctx_r51","addStockLocation","ProductVariantDetailComponent_form_10_ng_container_75_div_1_button_8_Template","unusedStockLocations_r47","ProductVariantDetailComponent_form_10_ng_container_75_div_1_Template","ProductVariantDetailComponent_form_10_clr_toggle_wrapper_6_Template","ProductVariantDetailComponent_form_10_vdr_card_7_Template","ProductVariantDetailComponent_form_10_vdr_facet_value_chip_11_Template","ProductVariantDetailComponent_form_10_button_14_Template","ProductVariantDetailComponent_form_10_vdr_page_entity_info_16_Template","ProductVariantDetailComponent_form_10_vdr_card_30_Template","_r55","ctx_r54","ProductVariantDetailComponent_form_10_option_41_Template","ProductVariantDetailComponent_form_10_div_43_Template","ProductVariantDetailComponent_form_10_ng_container_44_Template","ProductVariantDetailComponent_form_10_div_74_Template","ProductVariantDetailComponent_form_10_ng_container_75_Template","taxCategories$","unusedCurrencyCodes$","GlobalFlag","TRUE","FALSE","INHERIT","tmp_37_0","inventoryIsNotTracked","globalOutOfStockThreshold","unusedStockLocation$","ProductVariantDetailComponent","customOptionFields","useGlobalOutOfStockThreshold","outOfStockThreshold","trackInventory","getGlobalSettings","globalSettings","globalTrackInventory","result$","availableCurrencyCodes$","availableCurrencyCodes","prices","currencyCodes","usedIds","l","pricesIncludeTax","stockLevels$","deleteFormControl","stockLocationName","pick","getUpdatedVariant","ProductVariantUpdateMutationDocument","taxCategory","stockLevel","variantFormGroup","ProductVariantDetailComponent_ng_container_4_Template","ProductVariantDetailComponent_button_9_Template","ProductVariantDetailComponent_form_10_Template","assignProductVariantsToChannelBulkAction","removeProductVariantsFromChannelBulkAction","removeProductVariantsFromChannel","deleteProductVariantsBulkAction","deleteProductVariants","optionGroup_r2","featuredAsset_r13","optionGroupName","option_r14","formGroup_r6","ProductVariantsTableComponent_tr_22_ng_container_1_img_4_Template","ProductVariantsTableComponent_tr_22_ng_container_1_ng_template_5_Template","ProductVariantsTableComponent_tr_22_ng_container_1_ng_container_17_Template","ProductVariantsTableComponent_tr_22_ng_container_1_vdr_currency_input_21_Template","ProductVariantsTableComponent_tr_22_ng_container_1_vdr_currency_input_22_Template","getFeaturedAsset","channelPriceIncludesTax","ProductVariantsTableComponent_tr_22_ng_container_1_Template","formGroupMap","ProductVariantsTableComponent","buildFormGroupMap","pendingAssetChanges","controlGroup","StockLocationDetailComponent_ng_template_7_button_0_Template","entity_r10","paginationConfig","ProductVariantsTableComponent_ng_container_10_Template","ProductVariantsTableComponent_tr_22_Template","STOCK_LOCATION_DETAIL_FRAGMENT","GET_STOCK_LOCATION_DETAIL","CREATE_STOCK_LOCATION","UPDATE_STOCK_LOCATION","StockLocationDetailComponent","CreateStockLocationDocument","createStockLocation","UpdateStockLocationDocument","StockLocationDetailComponent_button_5_Template","StockLocationDetailComponent_ng_template_7_Template","StockLocationDetailComponent_vdr_card_12_Template","StockLocationDetailComponent_vdr_card_26_Template","deleteStockLocationsBulkAction","DeleteStockLocation","DeleteStockLocationsDocument","deleteStockLocations","NOT_DELETED","assignStockLocationsToChannelBulkAction","UpdateStockLocation","stockLocationIds","AssignStockLocationsToChannelDocument","assignStockLocationsToChannel","removeStockLocationsFromChannelBulkAction","RemoveStockLocationsFromChannelDocument","removeStockLocationsFromChannel","stockLocation_r7","stockLocation_r8","stockLocation_r9","stockLocation_r10","stockLocation_r11","field_r12","GET_STOCK_LOCATION_LIST","StockLocationListComponent","StockLocationListComponent_a_5_Template","StockLocationListComponent_ng_template_16_Template","StockLocationListComponent_ng_template_19_Template","StockLocationListComponent_ng_template_22_Template","StockLocationListComponent_ng_template_25_Template","StockLocationListComponent_ng_template_28_Template","StockLocationListComponent_vdr_dt2_custom_field_column_29_Template","customFieldsForm","update","UpdateProductOptionDialogComponent","updateVariantName","codeInputTouched","productOption","activeLanguage","cfCurrentTranslation","UpdateProductOptionDialogComponent_ng_template_0_Template","UpdateProductOptionDialogComponent_section_14_Template","UpdateProductOptionDialogComponent_ng_template_15_Template","CatalogModule","bulkActionRegistryService","registerBulkAction","registerPageTab","priority","tab","detailComponentWithResolver","GetProductDetailDocument","entityKey","getBreadcrumbs","GetStockLocationDetailDocument","GetProductVariantDetailDocument","CollectionDetailQueryDocument","AssetDetailQueryDocument","ROUTES","useFactory","deps","PageService","imports","SharedModule","RouterModule","forChild","PRODUCT_LIST_QUERY_PRODUCT_FRAGMENT","PRODUCT_LIST_QUERY","PRODUCT_VARIANT_DETAIL_QUERY_PRODUCT_VARIANT_FRAGMENT","PRODUCT_VARIANT_DETAIL_QUERY","PRODUCT_VARIANT_UPDATE_MUTATION","PRODUCT_VARIANT_LIST_QUERY_PRODUCT_VARIANT_FRAGMENT","PRODUCT_VARIANT_LIST_QUERY"],"sourceRoot":"webpack:///","sources":["./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/product-options-editor/product-options-editor.component.html","./src/lib/catalog/src/components/product-options-editor/product-options-editor.component.ts","./src/lib/catalog/src/components/create-product-option-group-dialog/create-product-option-group-dialog.component.html","./src/lib/catalog/src/components/create-product-option-group-dialog/create-product-option-group-dialog.component.ts","./src/lib/catalog/src/components/create-product-variant-dialog/create-product-variant-dialog.component.html","./src/lib/catalog/src/components/create-product-variant-dialog/create-product-variant-dialog.component.ts","./src/lib/catalog/src/components/option-value-input/option-value-input.component.html","./src/lib/catalog/src/components/option-value-input/option-value-input.component.ts","./src/lib/catalog/src/components/product-variants-editor/product-variants-editor.component.html","./src/lib/catalog/src/components/product-variants-editor/product-variants-editor.component.ts","./src/lib/catalog/src/providers/routing/product-variants-resolver.ts","./src/lib/catalog/src/catalog.routes.ts","./src/lib/catalog/src/components/apply-facet-dialog/apply-facet-dialog.component.html","./src/lib/catalog/src/components/apply-facet-dialog/apply-facet-dialog.component.ts","./src/lib/catalog/src/components/asset-detail/asset-detail.component.html","./src/lib/catalog/src/components/asset-detail/asset-detail.component.ts","./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.html","./src/lib/catalog/src/components/assets/assets.component.ts","./src/lib/catalog/src/components/assign-products-to-channel-dialog/assign-products-to-channel-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/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.html","./src/lib/catalog/src/components/bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.component.ts","./src/lib/catalog/src/components/collection-contents/collection-contents.component.html","./src/lib/catalog/src/components/collection-contents/collection-contents.component.ts","./src/lib/catalog/src/components/collection-data-table/collection-data-table.component.html","./src/lib/catalog/src/components/collection-data-table/collection-data-table.component.ts","./src/lib/catalog/src/components/collection-detail/collection-detail.component.html","./src/lib/catalog/src/components/collection-detail/collection-detail.component.ts","./src/lib/catalog/src/components/collection-list/collection-breadcrumb.pipe.ts","./src/lib/catalog/src/components/move-collections-dialog/move-collections-dialog.component.html","./src/lib/catalog/src/components/move-collections-dialog/move-collections-dialog.component.ts","./src/lib/catalog/src/components/collection-list/collection-list-bulk-actions.ts","./src/lib/catalog/src/components/collection-list/collection-list.component.html","./src/lib/catalog/src/components/collection-list/collection-list.component.ts","./src/lib/catalog/src/components/collection-tree/collection-tree.service.ts","./src/lib/catalog/src/components/collection-tree/collection-tree-node.component.html","./src/lib/catalog/src/components/collection-tree/collection-tree-node.component.ts","./src/lib/catalog/src/components/collection-tree/array-to-tree.ts","./src/lib/catalog/src/components/collection-tree/collection-tree.component.html","./src/lib/catalog/src/components/collection-tree/collection-tree.component.ts","./src/lib/catalog/src/components/confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component.html","./src/lib/catalog/src/components/confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component.ts","./src/lib/catalog/src/components/facet-detail/facet-detail.component.html","./src/lib/catalog/src/components/facet-detail/facet-detail.component.ts","./src/lib/catalog/src/components/facet-list/facet-list-bulk-actions.ts","./src/lib/catalog/src/components/facet-list/facet-list.component.html","./src/lib/catalog/src/components/facet-list/facet-list.component.ts","./src/lib/catalog/src/components/generate-product-variants/generate-product-variants.component.html","./src/lib/catalog/src/components/generate-product-variants/generate-product-variants.component.ts","../node_modules/rxjs/dist/esm/internal/operators/switchMapTo.js","./src/lib/catalog/src/components/product-variant-list/product-variant-list.component.html","./src/lib/catalog/src/components/product-variant-list/product-variant-list.component.ts","./src/lib/catalog/src/components/product-detail/product-detail.component.html","./src/lib/catalog/src/components/product-detail/product-detail.component.ts","./src/lib/catalog/src/components/product-list/product-list-bulk-actions.ts","./src/lib/catalog/src/components/product-list/product-list.component.html","./src/lib/catalog/src/components/product-list/product-list.component.ts","./src/lib/catalog/src/components/variant-price-detail/variant-price-detail.component.html","./src/lib/catalog/src/components/variant-price-detail/variant-price-detail.component.ts","./src/lib/catalog/src/components/product-variant-quick-jump/product-variant-quick-jump.component.html","./src/lib/catalog/src/components/product-variant-quick-jump/product-variant-quick-jump.component.ts","./src/lib/catalog/src/components/product-variant-detail/product-variant-detail.component.html","./src/lib/catalog/src/components/product-variant-detail/product-variant-detail.component.ts","./src/lib/catalog/src/components/product-variant-list/product-variant-list-bulk-actions.ts","./src/lib/catalog/src/components/product-variants-table/product-variants-table.component.html","./src/lib/catalog/src/components/product-variants-table/product-variants-table.component.ts","./src/lib/catalog/src/components/stock-location-detail/stock-location-detail.component.html","./src/lib/catalog/src/components/stock-location-detail/stock-location-detail.component.ts","./src/lib/catalog/src/components/stock-location-list/stock-location-list-bulk-actions.ts","./src/lib/catalog/src/components/stock-location-list/stock-location-list.component.html","./src/lib/catalog/src/components/stock-location-list/stock-location-list.component.ts","./src/lib/catalog/src/components/update-product-option-dialog/update-product-option-dialog.component.html","./src/lib/catalog/src/components/update-product-option-dialog/update-product-option-dialog.component.ts","./src/lib/catalog/src/catalog.module.ts","./src/lib/catalog/src/components/product-list/product-list.graphql.ts","./src/lib/catalog/src/components/product-variant-detail/product-variant-detail.graphql.ts","./src/lib/catalog/src/components/product-variant-list/product-variant-list.graphql.ts"],"sourcesContent":["/**\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 GetProductDetailQuery,\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 getTaxCategories() {\r\n return this.dataService.settings\r\n .getTaxCategories()\r\n .mapSingle(data => data.taxCategories.items)\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 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(map(() => ({ createProduct, optionGroups })));\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(\r\n createProduct,\r\n variants,\r\n options,\r\n languageCode,\r\n createVariantsConfig.stockLocationId,\r\n );\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 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 stockLocationId: string,\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 translations: [\r\n {\r\n languageCode,\r\n name,\r\n },\r\n ],\r\n stockLevels: [\r\n {\r\n stockLocationId,\r\n stockOnHand: v.stock,\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<GetProductDetailQuery['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 .getProductVariantsForProduct({}, 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<GetProductDetailQuery['product']>,\r\n languageCode: LanguageCode,\r\n ) {\r\n const variants$ = input.autoUpdate\r\n ? this.dataService.product\r\n .getProductVariantsForProduct({}, 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","<vdr-page-header>\r\n <vdr-page-title></vdr-page-title>\r\n <vdr-page-header-description>{{ 'catalog.page-description-options-editor' | translate }}</vdr-page-header-description>\r\n</vdr-page-header>\r\n<vdr-page-body>\r\n <vdr-page-block>\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=\"mr-2\">\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 </vdr-page-block>\r\n <vdr-page-block>\r\n <form class=\"form\" [formGroup]=\"detailForm\" *ngIf=\"optionGroups$ | async as optionGroups\">\r\n <div formGroupName=\"optionGroups\">\r\n <vdr-card\r\n *ngFor=\"let optionGroup of getOptionGroups(); index as i\"\r\n [formArrayName]=\"i\"\r\n [title]=\"optionGroup.value.code\"\r\n >\r\n <vdr-page-entity-info [entity]=\"optionGroup.value\"></vdr-page-entity-info>\r\n <div class=\"form-grid\">\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 <ng-container formGroupName=\"customFields\" *ngIf=\"optionGroupCustomFields.length\">\r\n <vdr-tabbed-custom-fields\r\n entityName=\"ProductOptionGroup\"\r\n [customFields]=\"optionGroupCustomFields\"\r\n [customFieldsFormGroup]=\"optionGroup.get('customFields')\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </ng-container>\r\n\r\n <vdr-data-table-2\r\n id=\"edit-options-list\"\r\n *ngIf=\"getOptions(optionGroup) as options\"\r\n [items]=\"options\"\r\n [itemsPerPage]=\"paginationSettings[optionGroup.value.id]?.itemsPerPage\"\r\n [currentPage]=\"paginationSettings[optionGroup.value.id]?.currentPage\"\r\n (pageChange)=\"paginationSettings[optionGroup.value.id].currentPage = $event\"\r\n [totalItems]=\"options.length\"\r\n >\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\r\n <ng-template let-optionControl=\"item\">\r\n {{ optionControl.value.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.created-at' | translate\" id=\"created-at\" [hiddenByDefault]=\"true\">\r\n <ng-template let-optionControl=\"item\">\r\n {{ optionControl.value.createdAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.updated-at' | translate\" id=\"updated-at\" [hiddenByDefault]=\"true\">\r\n <ng-template let-optionControl=\"item\">\r\n {{ optionControl.value.updatedAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.name' | translate\" id=\"name\" [optional]=\"false\">\r\n <ng-template let-optionControl=\"item\">\r\n <input\r\n type=\"text\"\r\n [formControl]=\"optionControl.get('name')\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.code' | translate\" id=\"code\" [optional]=\"false\">\r\n <ng-template let-optionControl=\"item\">\r\n <input type=\"text\" [formControl]=\"optionControl.get('code')\" />\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.custom-fields' | translate\" id=\"custom-fields\"\r\n [hiddenByDefault]=\"optionCustomFields.length === 0\"\r\n >\r\n <ng-template let-optionControl=\"item\">\r\n <vdr-tabbed-custom-fields\r\n entityName=\"ProductOption\"\r\n [customFields]=\"optionCustomFields\"\r\n [compact]=\"true\"\r\n [customFieldsFormGroup]=\"optionControl.get('customFields')\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n </vdr-data-table-2>\r\n </vdr-card>\r\n </div>\r\n </form>\r\n </vdr-page-block>\r\n</vdr-page-body>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';\nimport { UntypedFormArray, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n BaseDetailComponent,\n createUpdatedTranslatable,\n CustomFieldConfig,\n DataService,\n findTranslation,\n GetProductVariantOptionsQuery,\n LanguageCode,\n NotificationService,\n Permission,\n ProductOptionFragment,\n ProductOptionGroupFragment,\n ServerConfigService,\n TranslationOf,\n UpdateProductOptionGroupInput,\n UpdateProductOptionInput,\n} from '@vendure/admin-ui/core';\nimport { combineLatest, forkJoin, Observable } from 'rxjs';\nimport { map, mergeMap, take, tap } from 'rxjs/operators';\n\nimport { ProductDetailService } from '../../providers/product-detail/product-detail.service';\n\ntype ProductWithOptions = NonNullable<GetProductVariantOptionsQuery['product']>;\n\n@Component({\n selector: 'vdr-product-options-editor',\n templateUrl: './product-options-editor.component.html',\n styleUrls: ['./product-options-editor.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ProductOptionsEditorComponent extends BaseDetailComponent<ProductWithOptions> implements OnInit {\n detailForm: UntypedFormGroup;\n optionGroups$: Observable<ProductWithOptions['optionGroups']>;\n languageCode$: Observable<LanguageCode>;\n availableLanguages$: Observable<LanguageCode[]>;\n optionGroupCustomFields: CustomFieldConfig[];\n optionCustomFields: CustomFieldConfig[];\n autoUpdateVariantNames = true;\n paginationSettings: { [groupId: string]: { currentPage: number; itemsPerPage: number } } = {};\n readonly updatePermission = [Permission.UpdateCatalog, Permission.UpdateProduct];\n\n constructor(\n protected route: ActivatedRoute,\n protected router: Router,\n protected serverConfigService: ServerConfigService,\n protected dataService: DataService,\n private productDetailService: ProductDetailService,\n private formBuilder: UntypedFormBuilder,\n private changeDetector: ChangeDetectorRef,\n private notificationService: NotificationService,\n ) {\n super(route, router, serverConfigService, dataService);\n this.optionGroupCustomFields = this.getCustomFieldConfig('ProductOptionGroup');\n this.optionCustomFields = this.getCustomFieldConfig('ProductOption');\n }\n\n ngOnInit(): void {\n this.optionGroups$ = this.route.snapshot.data.entity.pipe(\n map((product: ProductWithOptions) => product.optionGroups),\n tap((optionGroups: ProductWithOptions['optionGroups']) => {\n for (const group of optionGroups) {\n this.paginationSettings[group.id] = {\n currentPage: 1,\n itemsPerPage: 10,\n };\n }\n }),\n );\n this.detailForm = new UntypedFormGroup({\n optionGroups: new UntypedFormArray([]),\n });\n super.init();\n }\n\n getOptionGroups(): UntypedFormGroup[] {\n const optionGroups = this.detailForm.get('optionGroups');\n return (optionGroups as UntypedFormArray).controls as UntypedFormGroup[];\n }\n\n getOptions(optionGroup: UntypedFormGroup): UntypedFormGroup[] {\n const options = optionGroup.get('options');\n return (options as UntypedFormArray).controls as UntypedFormGroup[];\n }\n\n save() {\n if (this.detailForm.invalid || this.detailForm.pristine) {\n return;\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const $product = this.dataService.product.getProduct(this.id).mapSingle(data => data.product!);\n combineLatest(this.entity$, this.languageCode$, $product)\n .pipe(\n take(1),\n mergeMap(([{ optionGroups }, languageCode, product]) => {\n const updateOperations: Array<Observable<any>> = [];\n for (const optionGroupForm of this.getOptionGroups()) {\n if (optionGroupForm.dirty) {\n const optionGroupEntity = optionGroups.find(\n og => og.id === optionGroupForm.value.id,\n );\n if (optionGroupEntity) {\n const input = this.getUpdatedOptionGroup(\n optionGroupEntity,\n optionGroupForm,\n languageCode,\n );\n updateOperations.push(\n this.dataService.product.updateProductOptionGroup(input),\n );\n }\n }\n\n for (const optionForm of this.getOptions(optionGroupForm)) {\n if (optionForm.dirty) {\n const optionGroup = optionGroups\n .find(og => og.id === optionGroupForm.value.id)\n ?.options.find(o => o.id === optionForm.value.id);\n if (optionGroup) {\n const input = this.getUpdatedOption(\n optionGroup,\n optionForm,\n languageCode,\n );\n updateOperations.push(\n this.productDetailService.updateProductOption(\n { ...input, autoUpdate: this.autoUpdateVariantNames },\n product,\n languageCode,\n ),\n );\n }\n }\n }\n }\n return forkJoin(updateOperations);\n }),\n )\n .subscribe(\n () => {\n this.detailForm.markAsPristine();\n this.changeDetector.markForCheck();\n this.notificationService.success(_('common.notify-update-success'), {\n entity: 'ProductOptionGroup',\n });\n },\n err => {\n this.notificationService.error(_('common.notify-update-error'), {\n entity: 'ProductOptionGroup',\n });\n },\n );\n }\n\n private getUpdatedOptionGroup(\n optionGroup: ProductOptionGroupFragment,\n optionGroupFormGroup: UntypedFormGroup,\n languageCode: LanguageCode,\n ): UpdateProductOptionGroupInput {\n const input = createUpdatedTranslatable({\n translatable: optionGroup,\n updatedFields: optionGroupFormGroup.value,\n customFieldConfig: this.optionGroupCustomFields,\n languageCode,\n defaultTranslation: {\n languageCode,\n name: optionGroup.name || '',\n },\n });\n return input;\n }\n\n private getUpdatedOption(\n option: ProductOptionFragment,\n optionFormGroup: UntypedFormGroup,\n languageCode: LanguageCode,\n ): UpdateProductOptionInput {\n const input = createUpdatedTranslatable({\n translatable: option,\n updatedFields: optionFormGroup.value,\n customFieldConfig: this.optionCustomFields,\n languageCode,\n defaultTranslation: {\n languageCode,\n name: option.name || '',\n },\n });\n return input;\n }\n\n protected setFormValues(entity: ProductWithOptions, languageCode: LanguageCode): void {\n const groupsForm = this.detailForm.get('optionGroups') as UntypedFormArray;\n for (const optionGroup of entity.optionGroups) {\n const groupTranslation = findTranslation(optionGroup, languageCode);\n\n const groupForm = this.setOptionGroupForm(optionGroup, groupsForm, groupTranslation);\n this.setCustomFieldsForm(this.optionGroupCustomFields, groupForm, optionGroup, groupTranslation);\n\n let optionsForm = groupForm.get('options') as UntypedFormArray;\n if (!optionsForm) {\n optionsForm = this.formBuilder.array([]);\n groupForm.addControl('options', optionsForm);\n }\n for (const option of optionGroup.options) {\n const optionTranslation = findTranslation(option, languageCode);\n const optionForm = this.setOptionForm(option, optionsForm, optionTranslation);\n\n this.setCustomFieldsForm(this.optionCustomFields, optionForm, option, optionTranslation);\n }\n }\n }\n\n protected setCustomFieldsForm<\n T extends ProductWithOptions['optionGroups'][0] | ProductWithOptions['optionGroups'][0]['options'][0],\n >(\n customFields: CustomFieldConfig[],\n formGroup: UntypedFormGroup,\n entity: T,\n currentTranslation?: TranslationOf<T>,\n ) {\n if (customFields.length) {\n let customValueFieldsGroup = formGroup.get(['customFields']);\n if (!customValueFieldsGroup) {\n customValueFieldsGroup = this.formBuilder.group(\n customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\n );\n formGroup.addControl('customFields', customValueFieldsGroup);\n }\n this.setCustomFieldFormValues(customFields, customValueFieldsGroup, entity, currentTranslation);\n }\n }\n\n protected setOptionGroupForm(\n entity: ProductWithOptions['optionGroups'][0],\n groupsForm: UntypedFormArray,\n currentTranslation?: TranslationOf<ProductWithOptions['optionGroups'][0]>,\n ) {\n const group = {\n id: entity.id,\n createdAt: entity.createdAt,\n updatedAt: entity.updatedAt,\n code: entity.code,\n name: currentTranslation?.name ?? '',\n };\n let groupForm = groupsForm.controls.find(control => control.value.id === entity.id) as\n | UntypedFormGroup\n | undefined;\n if (groupForm) {\n groupForm.get('id')?.setValue(group.id);\n groupForm.get('code')?.setValue(group.code);\n groupForm.get('name')?.setValue(group.name);\n groupForm.get('createdAt')?.setValue(group.createdAt);\n groupForm.get('updatedAt')?.setValue(group.updatedAt);\n } else {\n groupForm = this.formBuilder.group(group);\n groupsForm.push(groupForm);\n }\n return groupForm;\n }\n\n protected setOptionForm(\n entity: ProductWithOptions['optionGroups'][0]['options'][0],\n optionsForm: UntypedFormArray,\n currentTranslation?: TranslationOf<ProductWithOptions['optionGroups'][0]['options'][0]>,\n ) {\n const group = {\n id: entity.id,\n createdAt: entity.createdAt,\n updatedAt: entity.updatedAt,\n code: entity.code,\n name: currentTranslation?.name ?? '',\n };\n let optionForm = optionsForm.controls.find(control => control.value.id === entity.id) as\n | UntypedFormGroup\n | undefined;\n if (optionForm) {\n optionForm.get('id')?.setValue(group.id);\n optionForm.get('code')?.setValue(group.code);\n optionForm.get('name')?.setValue(group.name);\n optionForm.get('createdAt')?.setValue(group.createdAt);\n optionForm.get('updatedAt')?.setValue(group.updatedAt);\n } else {\n optionForm = this.formBuilder.group(group);\n optionsForm.push(optionForm);\n }\n return optionForm;\n }\n}\n","<ng-template vdrDialogTitle>\r\n {{ 'catalog.create-product-option-group' | translate }}\r\n</ng-template>\r\n<div class=\"form-grid\" [formGroup]=\"form\">\r\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\r\n <input id=\"name\" type=\"text\" formControlName=\"name\" (input)=\"updateCode()\" />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'common.code' | translate\"\r\n for=\"code\"\r\n >\r\n <input\r\n id=\"code\"\r\n type=\"text\"\r\n formControlName=\"code\"\r\n />\r\n </vdr-form-field>\r\n</div>\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\" [disabled]=\"form.invalid\">\r\n {{ 'common.confirm' | translate }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\nimport { FormBuilder, Validators } from '@angular/forms';\r\nimport {\r\n CreateProductOptionGroupInput,\r\n Dialog,\r\n findTranslation,\r\n GetProductVariantOptionsQuery,\r\n LanguageCode,\r\n ServerConfigService,\r\n} from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\n\r\n@Component({\r\n selector: 'vdr-create-product-option-group-dialog',\r\n templateUrl: './create-product-option-group-dialog.component.html',\r\n styleUrls: ['./create-product-option-group-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CreateProductOptionGroupDialogComponent implements Dialog<CreateProductOptionGroupInput> {\r\n resolveWith: (result?: CreateProductOptionGroupInput) => void;\r\n languageCode: LanguageCode;\r\n form = this.formBuilder.group({\r\n name: ['', Validators.required],\r\n code: ['', Validators.required],\r\n });\r\n constructor(private formBuilder: FormBuilder) {}\r\n\r\n updateCode() {\r\n const nameControl = this.form.get('name');\r\n const codeControl = this.form.get('code');\r\n if (nameControl && codeControl && codeControl.pristine) {\r\n codeControl.setValue(normalizeString(`${nameControl.value}`, '-'));\r\n }\r\n }\r\n\r\n confirm() {\r\n const { name, code } = this.form.value;\r\n if (!name || !code) {\r\n return;\r\n }\r\n this.resolveWith({\r\n code,\r\n options: [],\r\n translations: [{ languageCode: this.languageCode, name }],\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.create-product-variant' | translate }}\r\n</ng-template>\r\n<form [formGroup]=\"form\">\r\n <div formGroupName=\"options\" class=\"form-grid\">\r\n <vdr-form-field [label]=\"optionGroup.name\" *ngFor=\"let optionGroup of product.optionGroups\">\r\n <ng-select [items]=\"optionGroup.options\" [formControlName]=\"optionGroup.code\" bindLabel=\"name\"\r\n bindValue=\"id\" appendTo=\"body\">\r\n </ng-select>\r\n </vdr-form-field>\r\n <clr-alert *ngIf=\"product.optionGroups.length === 0\" clrAlertType=\"warning\" [clrAlertClosable]=\"false\"\r\n class=\"form-grid-span\">\r\n <clr-alert-item>\r\n <span class=\"alert-text\">\r\n {{ 'catalog.cannot-create-variants-without-options' | translate }}\r\n </span>\r\n </clr-alert-item>\r\n </clr-alert>\r\n </div>\r\n <div *ngIf=\"existingVariant\" class=\"mt-2\">\r\n <clr-alert clrAlertType=\"warning\" [clrAlertClosable]=\"false\" class=\"\">\r\n <clr-alert-item>\r\n <span class=\"alert-text\">\r\n {{ 'catalog.product-variant-exists' | translate }}: {{ existingVariant.name }} ({{\r\n existingVariant.sku\r\n }})\r\n </span>\r\n </clr-alert-item>\r\n </clr-alert>\r\n </div>\r\n <div class=\"form-grid mt-2\">\r\n <vdr-form-field [label]=\"'common.name' | translate\">\r\n <input type=\"text\" formControlName=\"name\" />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'catalog.sku' | translate\">\r\n <input type=\"text\" formControlName=\"sku\" />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'catalog.price' | translate\">\r\n <vdr-currency-input name=\"price\" [currencyCode]=\"currencyCode\" formControlName=\"price\" />\r\n </vdr-form-field>\r\n </div>\r\n</form>\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 [disabled]=\"form.invalid || existingVariant || product.optionGroups.length === 0\">\r\n {{ 'common.confirm' | translate }}\r\n </button>\r\n</ng-template>","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport { FormBuilder, FormControl, FormGroup, FormRecord, Validators } from '@angular/forms';\nimport {\n CreateProductVariantInput,\n CurrencyCode,\n Dialog,\n GetProductVariantOptionsQuery,\n} from '@vendure/admin-ui/core';\nimport { notNullOrUndefined } from '@vendure/common/lib/shared-utils';\nimport { combineLatest } from 'rxjs';\n\n@Component({\n selector: 'vdr-create-product-variant-dialog',\n templateUrl: './create-product-variant-dialog.component.html',\n styleUrls: ['./create-product-variant-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CreateProductVariantDialogComponent implements Dialog<CreateProductVariantInput>, OnInit {\n resolveWith: (result?: CreateProductVariantInput) => void;\n product: NonNullable<GetProductVariantOptionsQuery['product']>;\n form = this.formBuilder.group({\n name: ['', Validators.required],\n sku: ['', Validators.required],\n price: ['', Validators.required],\n options: this.formBuilder.record<string>({}),\n });\n existingVariant: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number] | undefined;\n currencyCode: CurrencyCode;\n\n constructor(private formBuilder: FormBuilder) {}\n\n ngOnInit() {\n this.currencyCode = this.product.variants[0].currencyCode;\n for (const optionGroup of this.product.optionGroups) {\n (this.form.get('options') as FormRecord).addControl(\n optionGroup.code,\n new FormControl('', Validators.required),\n );\n }\n const optionsRecord = this.form.get('options') as FormRecord;\n optionsRecord.valueChanges.subscribe(value => {\n const nameControl = this.form.get('name');\n const allNull = Object.values(value).every(v => v == null);\n if (!allNull && value && nameControl && !nameControl.dirty) {\n const name = Object.entries(value)\n .map(\n ([groupCode, optionId]) =>\n this.product.optionGroups\n .find(og => og.code === groupCode)\n ?.options.find(o => o.id === optionId)?.name,\n )\n .join(' ');\n nameControl.setValue(`${this.product.name} ${name}`);\n }\n const allSelected = Object.values(value).every(v => v != null);\n if (allSelected) {\n this.existingVariant = this.product.variants.find(v =>\n Object.entries(value).every(\n ([groupCode, optionId]) =>\n v.options.find(o => o.groupId === this.getGroupIdFromCode(groupCode))?.id ===\n optionId,\n ),\n );\n }\n });\n }\n\n confirm() {\n const { name, sku, options, price } = this.form.value;\n if (!name || !sku || !options || !price) {\n return;\n }\n\n const optionIds = Object.values(options).filter(notNullOrUndefined);\n this.resolveWith({\n productId: this.product.id,\n sku,\n price: Number(price),\n optionIds,\n translations: [\n {\n languageCode: this.product.languageCode,\n name,\n },\n ],\n });\n }\n\n cancel() {\n this.resolveWith();\n }\n\n private getGroupCodeFromId(id: string): string {\n return this.product.optionGroups.find(og => og.id === id)?.code ?? '';\n }\n\n private getGroupIdFromCode(code: string): string {\n return this.product.optionGroups.find(og => og.code === code)?.id ?? '';\n }\n}\n","<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 {\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","<vdr-page-block>\r\n <vdr-card>\r\n <div *ngFor=\"let group of optionGroups; index as i\" class=\"option-groups\">\r\n <vdr-form-field [label]=\"'catalog.option' | translate\">\r\n <input clrInput [(ngModel)]=\"group.name\" name=\"name\" [readonly]=\"!group.isNew\" />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'catalog.option-values' | translate\" class=\"flex-spacer\">\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 </vdr-form-field>\r\n <div>\r\n <button class=\"button-small mt-4\" (click)=\"removeOptionGroup(group)\">\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </div>\r\n </div>\r\n <button class=\"button mt-1\" (click)=\"addOptionGroup()\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.create-product-option-group' | translate }}\r\n </button>\r\n </vdr-card>\r\n <vdr-card [paddingX]=\"false\">\r\n <div class=\"mx-3\">\r\n <button class=\"button\" (click)=\"createNewVariant()\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.create-product-variant' | translate }}\r\n </button>\r\n </div>\r\n <vdr-data-table-2\r\n id=\"manage-product-variant-list\"\r\n [items]=\"variants$ | async\"\r\n [itemsPerPage]=\"itemsPerPage\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n >\r\n <vdr-dt2-search\r\n [searchTermControl]=\"searchTermControl\"\r\n [searchTermPlaceholder]=\"'catalog.filter-by-name' | translate\"\r\n />\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.created-at' | translate\" id=\"created-at\" [hiddenByDefault]=\"true\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.createdAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.updated-at' | translate\" id=\"updated-at\" [hiddenByDefault]=\"true\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.updatedAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'catalog.name' | translate\" id=\"name\" [optional]=\"false\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.name }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'catalog.sku' | translate\" id=\"sku\" [optional]=\"false\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.sku }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column *ngFor=\"let optionGroup of optionGroups$ | async\" [heading]=\"optionGroup.name\" [id]=\"optionGroup.code\">\r\n <ng-template let-variant=\"item\">\r\n <vdr-chip\r\n *ngIf=\"getOption(variant, optionGroup.id) as option; else selectOption\"\r\n [colorFrom]=\"optionGroup.code\"\r\n >{{ option.name }}</vdr-chip\r\n >\r\n <ng-template #selectOption>\r\n <div class=\"flex center\">\r\n <ng-select\r\n [items]=\"optionGroup.options\"\r\n bindLabel=\"name\"\r\n bindValue=\"id\"\r\n appendTo=\"body\"\r\n (change)=\"setOptionToAddToVariant(variant.id, optionGroup.id, $event?.id)\"\r\n ></ng-select>\r\n <button\r\n class=\"button-small ml-1\"\r\n [class.primary]=\"!!optionsToAddToVariant[variant.id]?.[optionGroup.id]\"\r\n (click)=\"addOptionToVariant(variant)\"\r\n [disabled]=\"!optionsToAddToVariant[variant.id]?.[optionGroup.id]\"\r\n >\r\n <clr-icon shape=\"floppy\"></clr-icon>\r\n </button>\r\n </div>\r\n </ng-template>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.price' | translate\" id=\"price\" [hiddenByDefault]=\"true\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.price | localeCurrency : variant.currencyCode }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.price-with-tax' | translate\" id=\"price-with-tax\" [hiddenByDefault]=\"true\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.priceWithTax | localeCurrency : variant.currencyCode }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.delete' | translate\" id=\"delete\" [optional]=\"false\">\r\n <ng-template let-variant=\"item\">\r\n <button class=\"button-small\" (click)=\"deleteVariant(variant)\">\r\n <clr-icon shape=\"trash is-danger\"></clr-icon>\r\n </button>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n </vdr-data-table-2>\r\n </vdr-card>\r\n</vdr-page-block>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\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 SelectionManager,\r\n} from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\nimport { unique } from '@vendure/common/lib/unique';\r\nimport { EMPTY, Observable, Subject } from 'rxjs';\r\nimport { map, startWith, switchMap } from 'rxjs/operators';\r\n\r\nimport { ProductDetailService } from '../../providers/product-detail/product-detail.service';\r\nimport { CreateProductOptionGroupDialogComponent } from '../create-product-option-group-dialog/create-product-option-group-dialog.component';\r\nimport { CreateProductVariantDialogComponent } from '../create-product-variant-dialog/create-product-variant-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 optionGroups: OptionGroupUiModel[];\r\n product: NonNullable<GetProductVariantOptionsQuery['product']>;\r\n variants$: Observable<NonNullable<GetProductVariantOptionsQuery['product']>['variants']>;\r\n optionGroups$: Observable<NonNullable<GetProductVariantOptionsQuery['product']>['optionGroups']>;\r\n totalItems$: Observable<number>;\r\n currencyCode: CurrencyCode;\r\n itemsPerPage = 100;\r\n currentPage = 1;\r\n searchTermControl = new FormControl('');\r\n selectionManager = new SelectionManager<any>({\r\n multiSelect: true,\r\n itemsAreEqual: (a, b) => a.id === b.id,\r\n additiveMode: true,\r\n });\r\n optionsToAddToVariant: {\r\n [variantId: string]: { [groupId: string]: string };\r\n } = {};\r\n private refresh$ = new Subject<void>();\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 private changeDetector: ChangeDetectorRef,\r\n ) {}\r\n\r\n ngOnInit() {\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.defaultCurrencyCode;\r\n });\r\n\r\n const product$ = this.refresh$.pipe(\r\n switchMap(() =>\r\n this.dataService.product\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n .getProductVariantsOptions(this.route.parent?.snapshot.paramMap.get('id')!)\r\n .mapSingle(data => data.product),\r\n ),\r\n startWith(this.route.snapshot.data.product),\r\n );\r\n\r\n this.variants$ = product$.pipe(\r\n switchMap(product =>\r\n this.searchTermControl.valueChanges.pipe(\r\n startWith(''),\r\n map(term =>\r\n term\r\n ? product.variants.filter(v => v.name.toLowerCase().includes(term.toLowerCase()))\r\n : product.variants,\r\n ),\r\n ),\r\n ),\r\n );\r\n this.optionGroups$ = product$.pipe(map(product => product.optionGroups));\r\n this.totalItems$ = this.variants$.pipe(map(variants => variants.length));\r\n\r\n product$.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.map(v => v.options.map(option => option.groupId)).flat();\r\n this.optionGroups = p.optionGroups.map(og => ({\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 }\r\n\r\n setItemsPerPage(itemsPerPage: number) {\r\n this.itemsPerPage = itemsPerPage;\r\n this.currentPage = 1;\r\n }\r\n\r\n setPageNumber(page: number) {\r\n this.currentPage = page;\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 addOptionGroup() {\r\n this.modalService\r\n .fromComponent(CreateProductOptionGroupDialogComponent, {\r\n locals: {\r\n languageCode: this.languageCode,\r\n },\r\n })\r\n .pipe(\r\n switchMap(result => {\r\n if (result) {\r\n return this.dataService.product.createProductOptionGroups(result).pipe(\r\n switchMap(({ createProductOptionGroup }) =>\r\n this.dataService.product.addOptionGroupToProduct({\r\n optionGroupId: createProductOptionGroup.id,\r\n productId: this.product.id,\r\n }),\r\n ),\r\n );\r\n } else {\r\n return EMPTY;\r\n }\r\n }),\r\n )\r\n .subscribe(result => {\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'ProductOptionGroup',\r\n });\r\n this.refresh$.next();\r\n this.changeDetector.markForCheck();\r\n });\r\n }\r\n\r\n removeOptionGroup(\r\n optionGroup: NonNullable<GetProductVariantOptionsQuery['product']>['optionGroups'][number],\r\n ) {\r\n const id = optionGroup.id;\r\n const usedByVariantsCount = this.product.variants.filter(v =>\r\n v.options.map(o => o.groupId).includes(id),\r\n ).length;\r\n this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-product-option-group'),\r\n body: usedByVariantsCount ? _('catalog.confirm-delete-product-option-group-body') : '',\r\n translationVars: { name: optionGroup.name, count: usedByVariantsCount },\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 force: true,\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.refresh$.next();\r\n } else if (removeOptionGroupFromProduct.__typename === 'ProductOptionInUseError') {\r\n this.notificationService.error(removeOptionGroupFromProduct.message ?? '');\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 && group.id) {\r\n this.dataService.product\r\n .addOptionToGroup({\r\n productOptionGroupId: group.id,\r\n code: normalizeString(optionName, '-'),\r\n translations: [{ name: optionName, languageCode: this.languageCode }],\r\n })\r\n .subscribe(({ createProductOption }) => {\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'ProductOption',\r\n });\r\n this.refresh$.next();\r\n });\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 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.refresh$.next();\r\n } else {\r\n this.notificationService.error(deleteProductOption.message ?? '');\r\n }\r\n });\r\n }\r\n }\r\n\r\n setOptionToAddToVariant(variantId: string, optionGroupId: string, optionId?: string) {\r\n if (!this.optionsToAddToVariant[variantId]) {\r\n this.optionsToAddToVariant[variantId] = {};\r\n }\r\n if (optionId) {\r\n this.optionsToAddToVariant[variantId][optionGroupId] = optionId;\r\n } else {\r\n delete this.optionsToAddToVariant[variantId][optionGroupId];\r\n }\r\n }\r\n\r\n addOptionToVariant(variant: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number]) {\r\n const optionIds = [\r\n ...variant.options.map(o => o.id),\r\n ...Object.values(this.optionsToAddToVariant[variant.id]),\r\n ];\r\n this.dataService.product\r\n .updateProductVariants([\r\n {\r\n id: variant.id,\r\n optionIds: unique(optionIds),\r\n },\r\n ])\r\n .subscribe(({ updateProductVariants }) => {\r\n this.refresh$.next();\r\n });\r\n }\r\n\r\n deleteVariant(variant: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number]) {\r\n this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-product-variant'),\r\n translationVars: { name: variant.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(response =>\r\n response\r\n ? this.productDetailService.deleteProductVariant(variant.id, this.product.id)\r\n : EMPTY,\r\n ),\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.refresh$.next();\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 createNewVariant() {\r\n this.modalService\r\n .fromComponent(CreateProductVariantDialogComponent, {\r\n locals: {\r\n product: this.product,\r\n },\r\n })\r\n .pipe(\r\n switchMap(result => {\r\n if (result) {\r\n return this.dataService.product.createProductVariants([result]);\r\n } else {\r\n return EMPTY;\r\n }\r\n }),\r\n )\r\n .subscribe(result => {\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'ProductVariant',\r\n });\r\n this.refresh$.next();\r\n });\r\n }\r\n\r\n getOption(\r\n variant: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number],\r\n groupId: string,\r\n ) {\r\n return variant.options.find(o => o.groupId === groupId);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { BaseEntityResolver, GetProductVariantOptionsQuery, 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 const,\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n name: '',\r\n languageCode: '' as any,\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 { inject } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, Route } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n CanDeactivateDetailGuard,\r\n createResolveData,\r\n DataService,\r\n PageComponent,\r\n PageService,\r\n} from '@vendure/admin-ui/core';\r\nimport { map } from 'rxjs/operators';\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 { ProductVariantsResolver } from './providers/routing/product-variants-resolver';\r\n\r\nexport const createRoutes = (pageService: PageService): Route[] => [\r\n {\r\n path: 'inventory',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'product-list',\r\n breadcrumb: _('breadcrumb.inventory'),\r\n },\r\n children: pageService.getPageTabRoutes('product-list'),\r\n },\r\n {\r\n path: 'inventory/:id',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'product-detail',\r\n breadcrumb: { label: _('breadcrumb.inventory'), link: ['../', 'inventory'] },\r\n },\r\n children: [\r\n {\r\n path: 'manage-variants',\r\n component: ProductVariantsEditorComponent,\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: ({ product }) => [\r\n {\r\n label: `${product.name}`,\r\n link: ['../'],\r\n },\r\n {\r\n label: _('breadcrumb.manage-variants'),\r\n link: ['manage-variants'],\r\n },\r\n ],\r\n },\r\n resolve: {\r\n product: (route: ActivatedRouteSnapshot) =>\r\n inject(DataService)\r\n .product.getProductVariantsOptions(route.parent?.params.id)\r\n .mapSingle(data => data.product),\r\n },\r\n },\r\n ...pageService.getPageTabRoutes('product-detail'),\r\n ],\r\n },\r\n {\r\n path: 'inventory/:productId/variants/:id',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'product-variant-detail',\r\n breadcrumb: { label: _('breadcrumb.inventory'), link: ['../', 'inventory'] },\r\n },\r\n children: pageService.getPageTabRoutes('product-variant-detail'),\r\n },\r\n {\r\n path: 'inventory/: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: 'inventory/stock-locations/:id',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'stock-location-detail',\r\n breadcrumb: [\r\n { label: _('breadcrumb.inventory'), link: ['../', 'inventory'] },\r\n {\r\n label: _('breadcrumb.stock-locations'),\r\n link: ['../', 'inventory', 'stock-locations'],\r\n },\r\n ],\r\n },\r\n children: pageService.getPageTabRoutes('stock-location-detail'),\r\n },\r\n {\r\n path: 'facets',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'facet-list',\r\n breadcrumb: _('breadcrumb.facets'),\r\n },\r\n children: pageService.getPageTabRoutes('facet-list'),\r\n },\r\n {\r\n path: 'facets/:id',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'facet-detail',\r\n breadcrumb: { label: _('breadcrumb.facets'), link: ['../', 'facets'] },\r\n },\r\n children: pageService.getPageTabRoutes('facet-detail'),\r\n },\r\n {\r\n path: 'collections',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'collection-list',\r\n breadcrumb: _('breadcrumb.collections'),\r\n },\r\n children: pageService.getPageTabRoutes('collection-list'),\r\n },\r\n {\r\n path: 'collections/:id',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'collection-detail',\r\n breadcrumb: { label: _('breadcrumb.collections'), link: ['../', 'collections'] },\r\n },\r\n children: pageService.getPageTabRoutes('collection-detail'),\r\n },\r\n {\r\n path: 'assets',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'asset-list',\r\n breadcrumb: _('breadcrumb.assets'),\r\n },\r\n children: pageService.getPageTabRoutes('asset-list'),\r\n },\r\n {\r\n path: 'assets/:id',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'asset-detail',\r\n breadcrumb: { label: _('breadcrumb.assets'), link: ['../', 'assets'] },\r\n },\r\n children: pageService.getPageTabRoutes('asset-detail'),\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 {\r\n label: _('breadcrumb.inventory'),\r\n link: ['../', 'inventory'],\r\n },\r\n {\r\n label: `${entity.name}`,\r\n link: ['../', 'inventory', params.id],\r\n },\r\n {\r\n label: _('breadcrumb.product-options'),\r\n link: ['options'],\r\n },\r\n ]),\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 (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 {\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","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left></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-page-block>\r\n<vdr-page-block>\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 />\r\n</vdr-page-block>\r\n","import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormControl, FormGroup, UntypedFormBuilder } from '@angular/forms';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n ASSET_FRAGMENT,\r\n AssetDetailQueryDocument,\r\n AssetDetailQueryQuery,\r\n DataService,\r\n getCustomFieldsDefaults,\r\n LanguageCode,\r\n NotificationService,\r\n TAG_FRAGMENT,\r\n TypedBaseDetailComponent,\r\n} from '@vendure/admin-ui/core';\r\nimport { gql } from 'apollo-angular';\r\n\r\nexport const ASSET_DETAIL_QUERY = gql`\r\n query AssetDetailQuery($id: ID!) {\r\n asset(id: $id) {\r\n ...Asset\r\n tags {\r\n ...Tag\r\n }\r\n }\r\n }\r\n ${ASSET_FRAGMENT}\r\n ${TAG_FRAGMENT}\r\n`;\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 TypedBaseDetailComponent<typeof AssetDetailQueryDocument, 'asset'>\r\n implements OnInit, OnDestroy\r\n{\r\n readonly customFields = this.getCustomFieldConfig('Asset');\r\n detailForm = new FormGroup({\r\n name: new FormControl(''),\r\n tags: new FormControl([] as string[]),\r\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),\r\n });\r\n\r\n constructor(\r\n private notificationService: NotificationService,\r\n protected dataService: DataService,\r\n private formBuilder: UntypedFormBuilder,\r\n ) {\r\n super();\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 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(\r\n entity: NonNullable<AssetDetailQueryQuery['asset']>,\r\n languageCode: LanguageCode,\r\n ): void {\r\n this.detailForm.get('name')?.setValue(entity.name);\r\n this.detailForm.get('tags')?.setValue(entity.tags.map(t => t.id));\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","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).refetchOnChannelChange(),\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-page-block>\r\n <div class=\"my-2\">\r\n <vdr-asset-search-input\r\n [tags]=\"allTags$ | async\"\r\n (searchTermChange)=\"searchTerm$.next($event)\"\r\n (tagsChange)=\"filterByTags$.next($event)\"\r\n >\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-asset-search-input>\r\n </div>\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</vdr-page-block>\r\n","<div *ngIf=\"!compact; else compactView\" class=\"standard-view-container\">\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 class=\"all-assets-container\">\r\n <ng-container *ngTemplateOutlet=\"assetList\"></ng-container>\r\n <div *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</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()\">\r\n <clr-icon shape=\"image\" size=\"150\"></clr-icon>\r\n </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 { 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 // eslint-disable-next-line @angular-eslint/no-output-native\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","<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?.defaultCurrencyCode }}</td>\r\n <td>\r\n <ng-template [ngIf]=\"selectedChannel\" [ngIfElse]=\"noChannelSelected\">\r\n {{ row.pricePreview | localeCurrency: selectedChannel?.defaultCurrencyCode }}\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","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { UntypedFormControl } 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 ItemOf,\r\n LogicalOperator,\r\n NotificationService,\r\n} from '@vendure/admin-ui/core';\r\nimport { combineLatest, from, lastValueFrom, Observable } from 'rxjs';\r\nimport { map, startWith } from 'rxjs/operators';\r\n\r\ntype Channel = ItemOf<GetChannelsQuery, 'channels'>;\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 UntypedFormControl(1);\r\n selectedChannelIdControl = new UntypedFormControl();\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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n this.currentChannel = channels.items.find(c => c.id === activeChannelId)!;\r\n this.availableChannels = channels.items;\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 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 // eslint-disable-next-line @typescript-eslint/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) {\r\n return (\r\n await lastValueFrom(\r\n this.dataService.product.getProductVariants({\r\n filterOperator: LogicalOperator.OR,\r\n filter: {\r\n productId: { in: this.productIds },\r\n id: { in: this.productVariantIds },\r\n },\r\n take,\r\n }).single$,\r\n )\r\n ).productVariants.items;\r\n }\r\n}\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","<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 (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 { 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 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","<div class=\"table-wrapper\">\r\n <div class=\"progress loop\" [class.visible]=\"isLoading\"></div>\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 <vdr-data-table-2\r\n id=\"collection-contents\"\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 <vdr-dt2-search\r\n [searchTermControl]=\"filterTermControl\"\r\n [searchTermPlaceholder]=\"'catalog.filter-by-name' | translate\"\r\n />\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.created-at' | translate\" id=\"created-at\" [hiddenByDefault]=\"true\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.createdAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.updated-at' | translate\" id=\"updated-at\" [hiddenByDefault]=\"true\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.updatedAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.name' | translate\" id=\"name\" [optional]=\"false\">\r\n <ng-template let-variant=\"item\">\r\n <a class=\"button-ghost\" [routerLink]=\"['/catalog/inventory', variant.productId]\"\r\n ><span>{{ variant.name }}</span\r\n ><clr-icon shape=\"arrow right\"\r\n /></a>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'catalog.sku' | translate\" id=\"sku\" [optional]=\"false\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.sku }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n </vdr-data-table-2>\r\n</div>\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 { UntypedFormControl } 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 UntypedFormControl('');\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","<vdr-data-table-filter-presets\r\n *ngIf=\"filters\"\r\n [filters]=\"filters\"\r\n [dataTableId]=\"id\"\r\n></vdr-data-table-filter-presets>\r\n<div class=\"table-wrapper\">\r\n <div class=\"bulk-actions\">\r\n <ng-content select=\"vdr-bulk-action-menu\"></ng-content>\r\n </div>\r\n <table class=\"\" [class.no-select]=\"disableSelect\">\r\n <thead [class.items-selected]=\"selectionManager?.selection.length\">\r\n <tr class=\"heading-row\">\r\n <th *ngIf=\"selectionManager\" class=\"selection-col\">\r\n <div class=\"flex\">\r\n <div class=\"drag-handle-spacer\"></div>\r\n <input\r\n type=\"checkbox\"\r\n clrCheckbox\r\n [checked]=\"selectionManager?.areAllCurrentItemsSelected()\"\r\n (change)=\"onToggleAllClick()\"\r\n />\r\n </div>\r\n </th>\r\n <th\r\n *ngFor=\"let column of visibleSortedColumns; last as isLast\"\r\n [class.expand]=\"column.expand\"\r\n >\r\n <div class=\"cell-content\" [ngClass]=\"column.align\">\r\n <vdr-ui-extension-point\r\n [locationId]=\"id\"\r\n [metadata]=\"column.id\"\r\n api=\"dataTable\"\r\n [topPx]=\"-6\"\r\n [leftPx]=\"-24\"\r\n display=\"block\"\r\n >\r\n <span>{{ column.heading }}</span>\r\n </vdr-ui-extension-point>\r\n <div *ngIf=\"column.sort as sort\" class=\"sort-toggle\">\r\n <button (click)=\"sort.toggleSortOrder()\" [class.active]=\"sort.sortOrder\">\r\n <clr-icon *ngIf=\"!sort.sortOrder\" shape=\"two-way-arrows left\"></clr-icon>\r\n <clr-icon *ngIf=\"sort.sortOrder === 'ASC'\" shape=\"arrow up\"></clr-icon>\r\n <clr-icon *ngIf=\"sort.sortOrder === 'DESC'\" shape=\"arrow down\"></clr-icon>\r\n </button>\r\n <div class=\"sort-label\" *ngIf=\"sort.sortOrder\">{{ sort.sortOrder }}</div>\r\n </div>\r\n </div>\r\n </th>\r\n <th>\r\n <div class=\"column-picker\">\r\n <vdr-data-table-colum-picker\r\n [uiLanguage]=\"uiLanguage$ | async\"\r\n [columns]=\"sortedColumns\"\r\n (reorder)=\"onColumnReorder($event)\"\r\n (resetColumns)=\"onColumnsReset()\"\r\n ></vdr-data-table-colum-picker>\r\n </div>\r\n </th>\r\n </tr>\r\n <tr *ngIf=\"searchComponent || customSearchTemplate || filters?.length\">\r\n <th\r\n [attr.colspan]=\"visibleSortedColumns.length + (selectionManager ? 2 : 1)\"\r\n class=\"filter-row\"\r\n [class.active]=\"showSearchFilterRow\"\r\n >\r\n <button\r\n class=\"button-ghost toggle-search-filter-row\"\r\n [class.active]=\"showSearchFilterRow\"\r\n (click)=\"toggleSearchFilterRow()\"\r\n [title]=\"'common.search-and-filter-list' | translate\"\r\n >\r\n <clr-icon shape=\"search\"></clr-icon>\r\n </button>\r\n <div class=\"filter-row-wrapper\" [class.hidden]=\"!showSearchFilterRow\">\r\n <ng-container *ngTemplateOutlet=\"searchComponent?.template\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customSearchTemplate\"></ng-container>\r\n <ng-container *ngIf=\"filters\">\r\n <div class=\"filters\">\r\n <vdr-data-table-filters\r\n *ngFor=\"let activeFilter of filters.activeFilters\"\r\n [filterWithValue]=\"activeFilter\"\r\n [filters]=\"filters\"\r\n class=\"mt-1\"\r\n ></vdr-data-table-filters>\r\n <vdr-data-table-filters\r\n *ngIf=\"filters.length\"\r\n [filters]=\"filters\"\r\n class=\"mt-1\"\r\n ></vdr-data-table-filters>\r\n <vdr-add-filter-preset-button\r\n [filters]=\"filters\"\r\n [dataTableId]=\"id\"\r\n ></vdr-add-filter-preset-button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody\r\n cdkDropList\r\n cdkDropListLockAxis=\"y\"\r\n (cdkDropListDropped)=\"onDrop($event)\"\r\n [cdkDropListSortPredicate]=\"sortPredicate\"\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let item of items\r\n | paginate\r\n : {\r\n itemsPerPage: itemsPerPage,\r\n currentPage: currentPage,\r\n totalItems: totalItems,\r\n id: id,\r\n };\r\n index as i;\r\n trackBy: trackByFn\r\n \"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"collectionRowTmp\"\r\n [ngTemplateOutletContext]=\"{ item: item, i: i, depth: 0 }\"\r\n ></ng-container>\r\n </ng-container>\r\n <ng-container>\r\n <tr *ngIf=\"!items?.length\">\r\n <td [attr.colspan]=\"visibleSortedColumns.length + (selectionManager ? 2 : 1)\">\r\n <vdr-empty-placeholder [emptyStateLabel]=\"emptyStateLabel\"></vdr-empty-placeholder>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n</div>\r\n<div class=\"table-footer\">\r\n <vdr-items-per-page-controls\r\n *ngIf=\"totalItems\"\r\n [itemsPerPage]=\"itemsPerPage\"\r\n (itemsPerPageChange)=\"itemsPerPageChange.emit($event)\"\r\n ></vdr-items-per-page-controls>\r\n <div *ngIf=\"totalItems\" class=\"p5 total-items-count\">\r\n {{ 'common.total-items' | translate : { currentStart, currentEnd, totalItems } }}\r\n </div>\r\n\r\n <vdr-pagination-controls\r\n *ngIf=\"totalItems\"\r\n [id]=\"id\"\r\n [currentPage]=\"currentPage\"\r\n [itemsPerPage]=\"itemsPerPage\"\r\n [totalItems]=\"totalItems\"\r\n (pageChange)=\"pageChange.emit($event)\"\r\n ></vdr-pagination-controls>\r\n</div>\r\n\r\n<ng-template #collectionRowTmp let-item=\"item\" let-depth=\"depth\">\r\n <tr #collectionRow cdkDrag [cdkDragData]=\"{ depth: depth, collection: item }\" cdkDragBoundary=\"tbody\">\r\n <td\r\n *ngIf=\"selectionManager\"\r\n [class.active]=\"activeIndex === absoluteIndex[item.id]\"\r\n class=\"selection-col\"\r\n >\r\n <div class=\"flex\">\r\n <div class=\"drag-handle\" cdkDragHandle [title]=\"'catalog.reorder-collection' | translate\">\r\n <clr-icon shape=\"drag-handle\"></clr-icon>\r\n </div>\r\n <input\r\n type=\"checkbox\"\r\n clrCheckbox\r\n [checked]=\"selectionManager?.isSelected(item)\"\r\n (click)=\"onRowClick(item, $event)\"\r\n />\r\n </div>\r\n </td>\r\n <td\r\n *ngFor=\"let column of visibleSortedColumns\"\r\n [class.active]=\"activeIndex === absoluteIndex[item.id]\"\r\n >\r\n <div class=\"cell-content\" [ngClass]=\"column.align\">\r\n <ng-container\r\n *ngIf=\"customComponents.get(column.id) as componentConfig; else defaultComponent\"\r\n >\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n componentConfig.config.component;\r\n inputs: { rowItem: item };\r\n injector: componentConfig.injector\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n <ng-template #defaultComponent>\r\n <ng-container\r\n *ngTemplateOutlet=\"column.template; context: { item: item, depth: depth }\"\r\n ></ng-container>\r\n </ng-template>\r\n </div>\r\n </td>\r\n <td [class.active]=\"activeIndex === absoluteIndex[item.id]\"><!-- column select --></td>\r\n </tr>\r\n <ng-container *ngFor=\"let subCollection of getSubcollections(item)\">\r\n <ng-container\r\n *ngTemplateOutlet=\"collectionRowTmp; context: { item: subCollection, depth: depth + 1 }\"\r\n ></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n","import { CdkDrag, CdkDragDrop, CdkDropList, DragDrop, DragRef } from '@angular/cdk/drag-drop';\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n Output,\r\n QueryList,\r\n SimpleChanges,\r\n ViewChild,\r\n ViewChildren,\r\n} from '@angular/core';\r\nimport {\r\n DataService,\r\n DataTable2Component,\r\n GetCollectionListQuery,\r\n ItemOf,\r\n LocalStorageService,\r\n} from '@vendure/admin-ui/core';\r\n\r\nexport type CollectionTableItem = ItemOf<GetCollectionListQuery, 'collections'>;\r\nexport type CollectionOrderEvent = {\r\n collectionId: string;\r\n parentId: string;\r\n index: number;\r\n};\r\n@Component({\r\n selector: 'vdr-collection-data-table',\r\n templateUrl: './collection-data-table.component.html',\r\n styleUrls: [\r\n '../../../../core/src/shared/components/data-table-2/data-table2.component.scss',\r\n './collection-data-table.component.scss',\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CollectionDataTableComponent\r\n extends DataTable2Component<CollectionTableItem>\r\n implements OnChanges, AfterViewInit\r\n{\r\n @Input() subCollections: CollectionTableItem[];\r\n @Output() changeOrder = new EventEmitter<CollectionOrderEvent>();\r\n @ViewChild(CdkDropList, { static: true }) dropList: CdkDropList<{\r\n depth: number;\r\n collection: CollectionTableItem;\r\n }>;\r\n @ViewChildren('collectionRow', { read: CdkDrag }) collectionRowList: QueryList<CdkDrag>;\r\n dragRefs: DragRef[] = [];\r\n absoluteIndex: { [id: string]: number } = {};\r\n constructor(\r\n protected changeDetectorRef: ChangeDetectorRef,\r\n protected localStorageService: LocalStorageService,\r\n protected dataService: DataService,\r\n private dragDrop: DragDrop,\r\n ) {\r\n super(changeDetectorRef, localStorageService, dataService);\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n super.ngOnChanges(changes);\r\n if (changes.subCollections || changes.items) {\r\n const allCollections: CollectionTableItem[] = [];\r\n for (const collection of this.items ?? []) {\r\n allCollections.push(collection);\r\n const subCollectionMatches = this.getSubcollections(collection);\r\n allCollections.push(...subCollectionMatches.flat());\r\n }\r\n allCollections.forEach((collection, index) => (this.absoluteIndex[collection.id] = index));\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.collectionRowList.changes.subscribe((val: QueryList<CdkDrag>) => {\r\n this.dropList.getSortedItems().forEach(item => this.dropList.removeItem(item));\r\n for (const ref of val.toArray()) {\r\n ref.dropContainer = this.dropList;\r\n ref._dragRef._withDropContainer(this.dropList._dropListRef);\r\n this.dropList.addItem(ref);\r\n }\r\n });\r\n }\r\n\r\n getSubcollections(item: CollectionTableItem) {\r\n return this.subCollections?.filter(c => c.parentId === item.id) ?? [];\r\n }\r\n\r\n sortPredicate = (index: number, item: CdkDrag<{ depth: number; collection: CollectionTableItem }>) => {\r\n const itemAtIndex = this.dropList.getSortedItems()[index];\r\n return itemAtIndex?.data.collection.parentId === item.data.collection.parentId;\r\n };\r\n\r\n onDrop(\r\n event: CdkDragDrop<{\r\n depth: number;\r\n collection: CollectionTableItem;\r\n }>,\r\n ) {\r\n const isTopLevel = event.item.data.collection.breadcrumbs.length === 2;\r\n const pageIndexOffset = isTopLevel ? (this.currentPage - 1) * this.itemsPerPage : 0;\r\n const parentId = event.item.data.collection.parentId;\r\n const parentIndex = this.items.findIndex(i => i.id === parentId);\r\n const adjustedIndex = pageIndexOffset + event.currentIndex - parentIndex - 1;\r\n this.changeOrder.emit({\r\n collectionId: event.item.data.collection.id,\r\n index: adjustedIndex,\r\n parentId: event.item.data.collection.parentId,\r\n });\r\n\r\n if (isTopLevel) {\r\n this.items = [...this.items];\r\n this.items.splice(event.previousIndex, 1);\r\n this.items.splice(event.currentIndex, 0, event.item.data.collection);\r\n } else {\r\n const parent = this.items.find(i => i.id === parentId);\r\n if (parent) {\r\n const subCollections = this.getSubcollections(parent);\r\n const adjustedPreviousIndex = pageIndexOffset + event.previousIndex - parentIndex - 1;\r\n subCollections.splice(adjustedPreviousIndex, 1);\r\n subCollections.splice(event.currentIndex, 0, event.item.data.collection);\r\n }\r\n }\r\n this.changeDetectorRef.markForCheck();\r\n }\r\n}\r\n","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left>\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 <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></vdr-ab-right\r\n >\r\n </vdr-action-bar>\r\n</vdr-page-block>\r\n<form class=\"form\" [formGroup]=\"detailForm\">\r\n <vdr-page-detail-layout>\r\n <vdr-page-detail-sidebar>\r\n <vdr-card>\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-card>\r\n <vdr-card *ngIf=\"entity$ | async as entity\">\r\n <vdr-page-entity-info [entity]=\"entity\"></vdr-page-entity-info>\r\n </vdr-card>\r\n </vdr-page-detail-sidebar>\r\n\r\n <vdr-page-block *ngIf=\"entity$ | async as entity\"\r\n ><nav role=\"navigation\">\r\n <ul class=\"collection-breadcrumbs\">\r\n <li *ngFor=\"let breadcrumb of entity.breadcrumbs; let isFirst = first; let isLast = last\">\r\n <a [routerLink]=\"['/catalog/collections']\" *ngIf=\"isFirst\">{{\r\n 'catalog.root-collection' | translate\r\n }}</a>\r\n <a\r\n [routerLink]=\"['/catalog/collections', breadcrumb.id]\"\r\n *ngIf=\"!isFirst && !isLast\"\r\n >{{ breadcrumb.name | translate }}</a\r\n >\r\n <ng-container *ngIf=\"isLast\">{{ breadcrumb.name | translate }}</ng-container>\r\n </li>\r\n </ul>\r\n </nav>\r\n </vdr-page-block>\r\n\r\n <vdr-page-block>\r\n <vdr-card>\r\n <div class=\"form-grid\">\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-form-field\r\n class=\"form-grid-span\"\r\n [label]=\"'common.description' | translate\"\r\n for=\"slug\"\r\n >\r\n <vdr-rich-text-editor\r\n formControlName=\"description\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-rich-text-editor>\r\n </vdr-form-field>\r\n </div>\r\n </vdr-card>\r\n <vdr-card\r\n formGroupName=\"customFields\"\r\n *ngIf=\"customFields.length\"\r\n [title]=\"'common.custom-fields' | translate\"\r\n >\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 </vdr-card>\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 <vdr-card [title]=\"'catalog.assets' | translate\">\r\n <vdr-assets\r\n [assets]=\"entity?.assets\"\r\n [featuredAsset]=\"entity?.featuredAsset\"\r\n [updatePermissions]=\"updatePermission\"\r\n (change)=\"assetChanges = $event\"\r\n ></vdr-assets>\r\n </vdr-card>\r\n <vdr-card [title]=\"'catalog.filters' | translate\">\r\n <vdr-form-field\r\n [label]=\"'catalog.filter-inheritance' | translate\"\r\n for=\"inheritFilters\"\r\n >\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 <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 <span>{{ 'marketing.add-condition' | translate }}</span>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\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 </vdr-card>\r\n\r\n <vdr-card [title]=\"'common.contents' | translate\" [paddingX]=\"false\">\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=\"ml-3\">\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 </div>\r\n </ng-template>\r\n </vdr-collection-contents>\r\n </vdr-card>\r\n </vdr-page-block>\r\n </vdr-page-detail-layout>\r\n</form>\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 { FormBuilder, UntypedFormArray, UntypedFormControl, Validators } from '@angular/forms';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n Asset,\r\n COLLECTION_FRAGMENT,\r\n CollectionDetailQueryDocument,\r\n CollectionFragment,\r\n ConfigurableOperation,\r\n ConfigurableOperationDefinition,\r\n ConfigurableOperationInput,\r\n CreateCollectionInput,\r\n createUpdatedTranslatable,\r\n DataService,\r\n encodeConfigArgValue,\r\n findTranslation,\r\n getConfigArgValue,\r\n getCustomFieldsDefaults,\r\n LanguageCode,\r\n LocalStorageService,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n TypedBaseDetailComponent,\r\n unicodePatternValidator,\r\n UpdateCollectionInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\nimport { gql } from 'apollo-angular';\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\nexport const COLLECTION_DETAIL_QUERY = gql`\r\n query CollectionDetailQuery($id: ID!) {\r\n collection(id: $id) {\r\n ...Collection\r\n }\r\n }\r\n ${COLLECTION_FRAGMENT}\r\n`;\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 TypedBaseDetailComponent<typeof CollectionDetailQueryDocument, 'collection'>\r\n implements OnInit, OnDestroy\r\n{\r\n customFields = this.getCustomFieldConfig('Collection');\r\n 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(getCustomFieldsDefaults(this.customFields)),\r\n });\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 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();\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 UntypedFormArray;\r\n const inheritFiltersControl = this.detailForm.get('inheritFilters') as UntypedFormControl;\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 const slugControl = this.detailForm.get(['slug']);\r\n const currentTranslation = this.entity ? findTranslation(this.entity, this.languageCode) : undefined;\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 addFilter(collectionFilter: ConfigurableOperation) {\r\n const filtersArray = this.detailForm.get('filters') as UntypedFormArray;\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 UntypedFormArray;\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 const input = this.getUpdatedCollection(\r\n {\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n languageCode: this.languageCode,\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 this.detailForm,\r\n this.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 this.dataService.collection.createCollection(input).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 UntypedFormArray;\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: typeof this.detailForm,\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 code: o.code,\r\n arguments: Object.entries(formValueOperations[i].args).map(([name, value], j) => ({\r\n name,\r\n value: encodeConfigArgValue(value),\r\n })),\r\n }));\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { GetCollectionListQuery, ItemOf } from '@vendure/admin-ui/core';\r\n\r\n/**\r\n * Removes the root collection and self breadcrumb from the collection breadcrumb list.\r\n */\r\n@Pipe({\r\n name: 'collectionBreadcrumb',\r\n})\r\nexport class CollectionBreadcrumbPipe implements PipeTransform {\r\n transform(value: ItemOf<GetCollectionListQuery, 'collections'>): unknown {\r\n return value?.breadcrumbs.slice(1, -1);\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>\r\n {{ 'catalog.move-collections' | translate }}\r\n</ng-template>\r\n<vdr-collection-data-table\r\n class=\"mt-2\"\r\n id=\"move-collection-list\"\r\n [items]=\"items$ | async\"\r\n [subCollections]=\"subCollections$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n (pageChange)=\"currentPage$.next($event)\"\r\n (itemsPerPageChange)=\"itemsPerPage$.next($event)\"\r\n>\r\n <vdr-dt2-search\r\n [searchTermControl]=\"searchTermControl\"\r\n [searchTermPlaceholder]=\"'common.search-by-name' | translate\"\r\n ></vdr-dt2-search>\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\r\n <ng-template let-collection=\"item\">\r\n {{ collection.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.name' | translate\" id=\"name\" [optional]=\"false\">\r\n <ng-template let-collection=\"item\" let-depth=\"depth\">\r\n <div [ngClass]=\"'indent-' + depth\"></div>\r\n <clr-icon\r\n class=\"child-arrow\"\r\n [class.transparent]=\"depth === 0\"\r\n shape=\"child-arrow\"\r\n *ngIf=\"!collection.children?.length && collection.parentId !== '__'\"\r\n ></clr-icon>\r\n <button\r\n class=\"icon-button folder-button\"\r\n *ngIf=\"collection.children?.length\"\r\n (click)=\"toggleExpanded(collection)\"\r\n >\r\n <clr-icon shape=\"folder\" *ngIf=\"!expandedIds.includes(collection.id)\"></clr-icon>\r\n <clr-icon shape=\"folder-open\" *ngIf=\"expandedIds.includes(collection.id)\"></clr-icon>\r\n </button>\r\n <button class=\"icon-button folder-button\" *ngIf=\"collection.parentId === '__'\" disabled>\r\n <clr-icon shape=\"folder\" class=\"is-solid\"></clr-icon>\r\n </button>\r\n <button class=\"button-ghost\" (click)=\"resolveWith(collection)\">\r\n <span>{{ 'catalog.move-collection-to' | translate : {name: collection.name} }}</span>\r\n </button>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.breadcrumb' | translate\" id=\"breadcrumb\">\r\n <ng-template let-collection=\"item\">\r\n <div class=\"breadcrumb\">\r\n <ng-container *ngIf=\"collection | collectionBreadcrumb as breadcrumbs\">\r\n <ng-container *ngIf=\"breadcrumbs.length\">\r\n <div *ngFor=\"let item of breadcrumbs\">\r\n <span class=\"separator\">/</span>{{ item.name }}\r\n </div>\r\n </ng-container>\r\n <span class=\"separator\" *ngIf=\"!breadcrumbs.length\">/</span>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.slug' | translate\" id=\"slug\">\r\n <ng-template let-collection=\"item\">\r\n {{ collection.slug }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n</vdr-collection-data-table>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { DataService, Dialog, GetCollectionListQuery, I18nService, ItemOf } from '@vendure/admin-ui/core';\nimport { BehaviorSubject, combineLatest, Observable, of, Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, map, startWith, switchMap, tap } from 'rxjs/operators';\n\n@Component({\n selector: 'vdr-move-collections-dialog',\n templateUrl: './move-collections-dialog.component.html',\n styleUrls: ['./move-collections-dialog.component.scss', '../collection-list/collection-list-common.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MoveCollectionsDialogComponent\n implements OnInit, Dialog<ItemOf<GetCollectionListQuery, 'collections'>>\n{\n resolveWith: (result?: ItemOf<GetCollectionListQuery, 'collections'>) => void;\n searchTermControl = new FormControl('');\n items$: Observable<Array<ItemOf<GetCollectionListQuery, 'collections'>>>;\n totalItems$: Observable<number>;\n currentPage$ = new BehaviorSubject(1);\n itemsPerPage$ = new BehaviorSubject(10);\n expandedIds$ = new Subject<string[]>();\n expandedIds: string[] = [];\n subCollections$: Observable<Array<ItemOf<GetCollectionListQuery, 'collections'>>>;\n\n constructor(private dataService: DataService, private i18nService: I18nService) {}\n\n ngOnInit() {\n const getCollectionsResult = this.dataService.collection.getCollections();\n\n const searchTerm$ = this.searchTermControl.valueChanges.pipe(\n debounceTime(250),\n distinctUntilChanged(),\n startWith(''),\n );\n const currentPage$ = this.currentPage$.pipe(distinctUntilChanged());\n const itemsPerPage$ = this.itemsPerPage$.pipe(distinctUntilChanged());\n combineLatest(searchTerm$, currentPage$, itemsPerPage$).subscribe(\n ([searchTerm, currentPage, itemsPerPage]) => {\n const topLevelOnly = searchTerm === '';\n getCollectionsResult.ref.refetch({\n options: {\n skip: (currentPage - 1) * itemsPerPage,\n take: itemsPerPage,\n filter: {\n name: { contains: searchTerm },\n },\n topLevelOnly,\n },\n });\n },\n );\n\n const rootCollectionId$ = this.dataService.collection\n .getCollections({\n take: 1,\n topLevelOnly: true,\n })\n .mapSingle(data => data.collections.items[0].parentId);\n\n this.items$ = combineLatest(\n getCollectionsResult.mapStream(({ collections }) => collections),\n rootCollectionId$,\n ).pipe(\n map(([collections, rootCollectionId]) => [\n ...(rootCollectionId\n ? [\n {\n id: rootCollectionId,\n name: this.i18nService.translate('catalog.root-collection'),\n slug: '',\n parentId: '__',\n position: 0,\n featuredAsset: null,\n children: [],\n breadcrumbs: [],\n isPrivate: false,\n createdAt: '',\n updatedAt: '',\n } satisfies ItemOf<GetCollectionListQuery, 'collections'>,\n ]\n : []),\n ...collections.items,\n ]),\n );\n this.totalItems$ = getCollectionsResult.mapStream(data => data.collections.totalItems);\n\n this.subCollections$ = this.expandedIds$.pipe(\n tap(val => (this.expandedIds = val)),\n switchMap(ids => {\n if (ids.length) {\n return this.dataService.collection\n .getCollections({\n take: 999,\n filter: {\n parentId: { in: ids },\n },\n })\n .mapStream(data => data.collections.items);\n } else {\n return of([]);\n }\n }),\n );\n }\n\n toggleExpanded(collection: ItemOf<GetCollectionListQuery, 'collections'>) {\n let expandedIds = this.expandedIds;\n if (!expandedIds.includes(collection.id)) {\n expandedIds.push(collection.id);\n } else {\n expandedIds = expandedIds.filter(id => id !== collection.id);\n }\n this.expandedIds$.next(expandedIds);\n }\n}\n","import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BulkAction,\r\n createBulkAssignToChannelAction,\r\n createBulkDeleteAction,\r\n createBulkRemoveFromChannelAction,\r\n DataService,\r\n GetCollectionListQuery,\r\n ItemOf,\r\n ModalService,\r\n MoveCollectionInput,\r\n NotificationService,\r\n Permission,\r\n} from '@vendure/admin-ui/core';\r\nimport { EMPTY } from 'rxjs';\r\nimport { map, switchMap } from 'rxjs/operators';\r\nimport { CollectionPartial } from '../collection-tree/collection-tree.types';\r\nimport { MoveCollectionsDialogComponent } from '../move-collections-dialog/move-collections-dialog.component';\r\n\r\nimport { CollectionListComponent } from './collection-list.component';\r\n\r\nexport const deleteCollectionsBulkAction = createBulkDeleteAction<\r\n ItemOf<GetCollectionListQuery, 'collections'>\r\n>({\r\n location: 'collection-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.DeleteCollection) ||\r\n userPermissions.includes(Permission.DeleteCatalog),\r\n getItemName: item => item.name,\r\n bulkDelete: (dataService, ids) =>\r\n dataService.collection.deleteCollections(ids).pipe(map(res => res.deleteCollections)),\r\n});\r\n\r\nexport const moveCollectionsBulkAction: BulkAction<CollectionPartial, CollectionListComponent> = {\r\n location: 'collection-list',\r\n label: _('catalog.move-collections'),\r\n icon: 'drag-handle',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateCatalog) ||\r\n userPermissions.includes(Permission.UpdateCollection),\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(MoveCollectionsDialogComponent, {\r\n size: 'xl',\r\n closable: true,\r\n })\r\n .pipe(\r\n switchMap(result => {\r\n if (result) {\r\n const inputs: MoveCollectionInput[] = selection.map(c => ({\r\n collectionId: c.id,\r\n parentId: result.id,\r\n index: 0,\r\n }));\r\n return dataService.collection.moveCollection(inputs);\r\n } else {\r\n return EMPTY;\r\n }\r\n }),\r\n )\r\n .subscribe(result => {\r\n notificationService.success(_('catalog.move-collections-success'), {\r\n count: selection.length,\r\n });\r\n clearSelection();\r\n hostComponent.refresh();\r\n });\r\n },\r\n};\r\n\r\nexport const assignCollectionsToChannelBulkAction = createBulkAssignToChannelAction<\r\n ItemOf<GetCollectionListQuery, 'collections'>\r\n>({\r\n location: 'collection-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateCatalog) ||\r\n userPermissions.includes(Permission.UpdateCollection),\r\n getItemName: item => item.name,\r\n bulkAssignToChannel: (dataService, collectionIds, channelId) =>\r\n dataService.collection\r\n .assignCollectionsToChannel({\r\n collectionIds,\r\n channelId,\r\n })\r\n .pipe(map(res => res.assignCollectionsToChannel)),\r\n});\r\n\r\nexport const removeCollectionsFromChannelBulkAction = createBulkRemoveFromChannelAction<\r\n ItemOf<GetCollectionListQuery, 'collections'>\r\n>({\r\n location: 'collection-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.DeleteCatalog) ||\r\n userPermissions.includes(Permission.DeleteCollection),\r\n getItemName: item => item.name,\r\n bulkRemoveFromChannel: (dataService, collectionIds, channelId) =>\r\n dataService.collection\r\n .removeCollectionsFromChannel({\r\n channelId: channelId,\r\n collectionIds,\r\n })\r\n .pipe(map(res => res.removeCollectionsFromChannel)),\r\n});\r\n","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left>\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 </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</vdr-page-block>\r\n<vdr-split-view [rightPanelOpen]=\"activeCollectionId$ | async\" (closeClicked)=\"closeContents()\">\r\n <ng-template vdrSplitViewLeft>\r\n <vdr-collection-data-table\r\n class=\"mt-2\"\r\n id=\"collection-list\"\r\n [items]=\"items$ | async\"\r\n [subCollections]=\"subCollections$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n [filters]=\"filters\"\r\n [activeIndex]=\"activeCollectionIndex$ | async\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n (changeOrder)=\"onRearrange($event)\"\r\n >\r\n <vdr-bulk-action-menu\r\n locationId=\"collection-list\"\r\n [hostComponent]=\"this\"\r\n [selectionManager]=\"selectionManager\"\r\n ></vdr-bulk-action-menu>\r\n <vdr-dt2-search\r\n [searchTermControl]=\"searchTermControl\"\r\n [searchTermPlaceholder]=\"'common.search-by-name' | translate\"\r\n ></vdr-dt2-search>\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\r\n <ng-template let-collection=\"item\">\r\n {{ collection.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.created-at' | translate\" id=\"created-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('createdAt')\"\r\n >\r\n <ng-template let-collection=\"item\">\r\n {{ collection.createdAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.updated-at' | translate\" id=\"updated-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('updatedAt')\"\r\n >\r\n <ng-template let-collection=\"item\">\r\n {{ collection.updatedAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.position' | translate\" id=\"position\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('position')\"\r\n >\r\n <ng-template let-collection=\"item\">\r\n {{ collection.position }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.name' | translate\" id=\"name\"\r\n [optional]=\"false\"\r\n [sort]=\"sorts.get('name')\"\r\n >\r\n <ng-template let-collection=\"item\" let-depth=\"depth\">\r\n <div [ngClass]=\"'indent-' + depth\"></div>\r\n <clr-icon\r\n class=\"child-arrow\"\r\n [class.transparent]=\"depth === 0\"\r\n shape=\"child-arrow\"\r\n *ngIf=\"!collection.children?.length\"\r\n ></clr-icon>\r\n <button\r\n class=\"icon-button folder-button\"\r\n *ngIf=\"collection.children?.length\"\r\n (click)=\"toggleExpanded(collection)\"\r\n >\r\n <clr-icon shape=\"folder\" *ngIf=\"!expandedIds.includes(collection.id)\"></clr-icon>\r\n <clr-icon shape=\"folder-open\" *ngIf=\"expandedIds.includes(collection.id)\"></clr-icon>\r\n </button>\r\n <a class=\"button-ghost\" [routerLink]=\"['./', collection.id]\"\r\n ><span>{{ collection.name }}</span>\r\n <clr-icon shape=\"arrow right\"></clr-icon>\r\n </a>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.breadcrumb' | translate\" id=\"breadcrumb\">\r\n <ng-template let-collection=\"item\">\r\n <div class=\"breadcrumb\">\r\n <ng-container *ngIf=\"collection | collectionBreadcrumb as breadcrumbs\">\r\n <ng-container *ngIf=\"breadcrumbs.length\">\r\n <div *ngFor=\"let item of breadcrumbs\">\r\n <span class=\"separator\">/</span>{{ item.name }}\r\n </div>\r\n </ng-container>\r\n <span class=\"separator\" *ngIf=\"!breadcrumbs.length\">/</span>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.slug' | translate\" id=\"slug\" [sort]=\"sorts.get('slug')\">\r\n <ng-template let-collection=\"item\">\r\n {{ collection.slug }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.visibility' | translate\" id=\"visibility\">\r\n <ng-template let-collection=\"item\">\r\n <vdr-chip *ngIf=\"collection.isPrivate\" colorType=\"warning\">{{\r\n 'common.private' | translate\r\n }}</vdr-chip>\r\n <vdr-chip *ngIf=\"!collection.isPrivate\" colorType=\"success\">{{\r\n 'common.public' | translate\r\n }}</vdr-chip>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.view-contents' | translate\" id=\"view-contents\" [optional]=\"false\">\r\n <ng-template let-collection=\"item\">\r\n <a\r\n class=\"button-small bg-weight-150\"\r\n [routerLink]=\"['./', { contents: collection.id }]\"\r\n queryParamsHandling=\"preserve\"\r\n >\r\n <span>{{ 'common.view-contents' | translate }}</span>\r\n <clr-icon shape=\"file-group\"></clr-icon>\r\n </a>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-custom-field-column\r\n *ngFor=\"let customField of customFields\"\r\n [customField]=\"customField\"\r\n [sorts]=\"sorts\"\r\n />\r\n </vdr-collection-data-table>\r\n </ng-template>\r\n <ng-template vdrSplitViewRight [splitViewTitle]=\"activeCollectionTitle$ | async\">\r\n <ng-container *ngIf=\"activeCollectionId$ | async as activeGroup\">\r\n <vdr-collection-contents [collectionId]=\"activeCollectionId$ | async\"></vdr-collection-contents>\r\n </ng-container>\r\n </ng-template>\r\n</vdr-split-view>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n DataService,\r\n GetCollectionListDocument,\r\n GetCollectionListQuery,\r\n ItemOf,\r\n LanguageCode,\r\n NotificationService,\r\n TypedBaseListComponent,\r\n} from '@vendure/admin-ui/core';\r\nimport { combineLatest, Observable, of } from 'rxjs';\r\nimport { distinctUntilChanged, map, switchMap, takeUntil } from 'rxjs/operators';\r\nimport { CollectionOrderEvent } from '../collection-data-table/collection-data-table.component';\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', './collection-list-common.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CollectionListComponent\r\n extends TypedBaseListComponent<typeof GetCollectionListDocument, 'collections'>\r\n implements OnInit\r\n{\r\n activeCollectionId$: Observable<string | null>;\r\n activeCollectionIndex$: Observable<number>;\r\n activeCollectionTitle$: Observable<string>;\r\n subCollections$: Observable<Array<ItemOf<GetCollectionListQuery, 'collections'>>>;\r\n expandedIds: string[] = [];\r\n readonly customFields = this.getCustomFieldConfig('Collection');\r\n readonly filters = this.createFilterCollection()\r\n .addIdFilter()\r\n .addDateFilters()\r\n .addFilter({\r\n name: 'slug',\r\n label: _('common.slug'),\r\n type: { kind: 'text' },\r\n filterField: 'slug',\r\n })\r\n .addFilter({\r\n name: 'visibility',\r\n type: { kind: 'boolean' },\r\n label: _('common.visibility'),\r\n toFilterInput: value => ({\r\n isPrivate: { eq: !value },\r\n }),\r\n })\r\n .addCustomFieldFilters(this.customFields)\r\n .connectToRoute(this.route);\r\n readonly sorts = this.createSortCollection()\r\n .defaultSort('position', 'ASC')\r\n .addSort({ name: 'createdAt' })\r\n .addSort({ name: 'updatedAt' })\r\n .addSort({ name: 'name' })\r\n .addSort({ name: 'slug' })\r\n .addSort({ name: 'position' })\r\n .addCustomFieldSorts(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n constructor(protected dataService: DataService, private notificationService: NotificationService) {\r\n super();\r\n super.configure({\r\n document: GetCollectionListDocument,\r\n getItems: data => data.collections,\r\n setVariables: (skip, _take) => {\r\n const topLevelOnly =\r\n this.searchTermControl.value === '' && this.filters.activeFilters.length === 0\r\n ? true\r\n : undefined;\r\n return {\r\n options: {\r\n skip,\r\n take: _take,\r\n filter: {\r\n name: { contains: this.searchTermControl.value },\r\n ...this.filters.createFilterInput(),\r\n },\r\n topLevelOnly,\r\n sort: this.sorts.createSortInput(),\r\n },\r\n };\r\n },\r\n refreshListOnChanges: [this.filters.valueChanges, this.sorts.valueChanges],\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n super.ngOnInit();\r\n this.activeCollectionId$ = this.route.paramMap.pipe(\r\n map(pm => pm.get('contents')),\r\n distinctUntilChanged(),\r\n );\r\n const expandedIds$ = this.route.queryParamMap.pipe(\r\n map(qpm => qpm.get('expanded')),\r\n distinctUntilChanged(),\r\n map(ids => (ids ? ids.split(',') : [])),\r\n );\r\n expandedIds$.pipe(takeUntil(this.destroy$)).subscribe(ids => {\r\n this.expandedIds = ids;\r\n });\r\n this.subCollections$ = combineLatest(expandedIds$, this.refresh$).pipe(\r\n switchMap(([ids]) => {\r\n if (ids.length) {\r\n return this.dataService.collection\r\n .getCollections({\r\n take: 999,\r\n filter: {\r\n parentId: { in: ids },\r\n },\r\n })\r\n .mapStream(data => data.collections.items);\r\n } else {\r\n return of([]);\r\n }\r\n }),\r\n );\r\n\r\n this.activeCollectionTitle$ = combineLatest(\r\n this.activeCollectionId$,\r\n this.items$,\r\n this.subCollections$,\r\n ).pipe(\r\n map(([id, collections, subCollections]) => {\r\n if (id) {\r\n const match = [...collections, ...subCollections].find(c => c.id === id);\r\n return match ? match.name : '';\r\n }\r\n return '';\r\n }),\r\n );\r\n this.activeCollectionIndex$ = combineLatest(\r\n this.activeCollectionId$,\r\n this.items$,\r\n this.subCollections$,\r\n ).pipe(\r\n map(([id, collections, subCollections]) => {\r\n if (id) {\r\n const allCollections: typeof collections = [];\r\n for (const collection of collections) {\r\n allCollections.push(collection);\r\n const subCollectionMatches = subCollections.filter(\r\n c => c.parentId && c.parentId === collection.id,\r\n );\r\n allCollections.push(...subCollectionMatches);\r\n }\r\n return allCollections.findIndex(c => c.id === id);\r\n }\r\n return -1;\r\n }),\r\n );\r\n }\r\n\r\n onRearrange(event: CollectionOrderEvent) {\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 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 toggleExpanded(collection: ItemOf<GetCollectionListQuery, 'collections'>) {\r\n let expandedIds = this.expandedIds;\r\n if (!expandedIds.includes(collection.id)) {\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","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","<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 { 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","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 // eslint-disable-next-line @typescript-eslint/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","<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 {\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","<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 } 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","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left>\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</vdr-page-block>\r\n<form class=\"form\" [formGroup]=\"detailForm\">\r\n <vdr-page-detail-layout>\r\n <vdr-page-detail-sidebar formGroupName=\"facet\">\r\n <vdr-card>\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-card>\r\n <vdr-card>\r\n <vdr-page-entity-info *ngIf=\"entity$ | async as entity\" [entity]=\"entity\" />\r\n </vdr-card>\r\n </vdr-page-detail-sidebar>\r\n <vdr-page-block>\r\n <vdr-card formGroupName=\"facet\">\r\n <div class=\"form-grid\">\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(entity?.code, $event.target.value)\"\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\"\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 </vdr-card>\r\n <vdr-card [title]=\"'common.custom-fields' | translate\" *ngIf=\"customFields.length\">\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 />\r\n </vdr-card>\r\n\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\r\n <vdr-card\r\n *ngIf=\"!(isNew$ | async)\"\r\n [title]=\"'catalog.facet-values' | translate\"\r\n [paddingX]=\"false\"\r\n >\r\n <table\r\n class=\"facet-values-list table\"\r\n formArrayName=\"values\"\r\n *ngIf=\"0 < getValuesFormArray().length\"\r\n >\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\r\n class=\"facet-value\"\r\n *ngFor=\"let value of values; let i = index\"\r\n [formGroup]=\"detailForm.get(['values', i])\"\r\n >\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(entity?.values[i]?.code, $event.target.value, i)\"\r\n />\r\n </td>\r\n <td class=\"align-middle\">\r\n <input type=\"text\" formControlName=\"code\" />\r\n </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(entity?.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=\"button m-3\"\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 </vdr-card>\r\n </vdr-page-block>\r\n </vdr-page-detail-layout>\r\n</form>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n UntypedFormArray,\r\n UntypedFormControl,\r\n UntypedFormGroup,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n CreateFacetInput,\r\n CreateFacetValueInput,\r\n createUpdatedTranslatable,\r\n DataService,\r\n DeletionResult,\r\n FACET_WITH_VALUES_FRAGMENT,\r\n FacetWithValuesFragment,\r\n findTranslation,\r\n getCustomFieldsDefaults,\r\n GetFacetDetailDocument,\r\n LanguageCode,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n TypedBaseDetailComponent,\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 { gql } from 'apollo-angular';\r\nimport { combineLatest, EMPTY, forkJoin, Observable } from 'rxjs';\r\nimport { map, mergeMap, switchMap, take } from 'rxjs/operators';\r\n\r\nexport const FACET_DETAIL_QUERY = gql`\r\n query GetFacetDetail($id: ID!) {\r\n facet(id: $id) {\r\n ...FacetWithValues\r\n }\r\n }\r\n ${FACET_WITH_VALUES_FRAGMENT}\r\n`;\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 TypedBaseDetailComponent<typeof GetFacetDetailDocument, 'facet'>\r\n implements OnInit, OnDestroy\r\n{\r\n readonly customFields = this.getCustomFieldConfig('Facet');\r\n readonly customValueFields = this.getCustomFieldConfig('FacetValue');\r\n 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(getCustomFieldsDefaults(this.customFields)),\r\n }),\r\n values: this.formBuilder.array<{\r\n id: string;\r\n name: string;\r\n code: string;\r\n customFields: any;\r\n }>([]),\r\n });\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 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();\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(): UntypedFormArray {\r\n return this.detailForm.get('values') as UntypedFormArray;\r\n }\r\n\r\n addFacetValue() {\r\n const valuesFormArray = this.detailForm.get('values') as UntypedFormArray | 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 customFields: this.formBuilder.group({}),\r\n });\r\n const newValue: any = { name: '', code: '' };\r\n if (this.customValueFields.length) {\r\n const customValueFieldsGroup = new UntypedFormGroup({});\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 UntypedFormControl());\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') as (typeof this.detailForm)['controls']['facet'];\r\n if (!facetForm || !facetForm.dirty) {\r\n return;\r\n }\r\n const newFacet = this.getUpdatedFacet(\r\n {\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n isPrivate: false,\r\n languageCode: this.languageCode,\r\n name: '',\r\n code: '',\r\n translations: [],\r\n values: [],\r\n },\r\n facetForm,\r\n this.languageCode,\r\n ) as CreateFacetInput;\r\n this.dataService.facet.createFacet(newFacet).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 const valuesArray = this.detailForm.get('values') as (typeof this.detailForm)['controls']['values'];\r\n combineLatest(this.entity$, this.languageCode$)\r\n .pipe(\r\n take(1),\r\n mergeMap(([facet, languageCode]) => {\r\n const facetForm = this.detailForm.get(\r\n 'facet',\r\n ) as (typeof this.detailForm)['controls']['facet'];\r\n const updateOperations: Array<Observable<any>> = [];\r\n\r\n if (facetForm && facetForm.dirty) {\r\n const newFacet = this.getUpdatedFacet(\r\n facet,\r\n facetForm,\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 if (valuesArray && valuesArray.dirty) {\r\n const createdValues = this.getCreatedFacetValues(facet, valuesArray, languageCode);\r\n if (createdValues.length) {\r\n updateOperations.push(\r\n this.dataService.facet.createFacetValues(createdValues).pipe(\r\n switchMap(\r\n () =>\r\n this.dataService.query(GetFacetDetailDocument, {\r\n id: this.id,\r\n }).single$,\r\n ),\r\n ),\r\n );\r\n }\r\n const updatedValues = this.getUpdatedFacetValues(facet, valuesArray, languageCode);\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 )\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 UntypedFormArray | 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 =>\r\n deleted\r\n ? this.dataService.query(GetFacetDetailDocument, {\r\n id: this.id,\r\n }).single$\r\n : [],\r\n ),\r\n )\r\n .subscribe(\r\n () => {\r\n const valuesFormArray = this.detailForm.get('values') as UntypedFormArray | null;\r\n if (valuesFormArray) {\r\n valuesFormArray.removeAt(index);\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 UntypedFormGroup;\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 UntypedFormArray;\r\n this.values = [...facet.values];\r\n facet.values.forEach(value => {\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 let valueControl = currentValuesFormArray.controls.find(\r\n control => control.value.id === value.id,\r\n ) as UntypedFormGroup | undefined;\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 valueControl = this.formBuilder.group(group);\r\n currentValuesFormArray.push(valueControl);\r\n }\r\n if (this.customValueFields.length) {\r\n let customValueFieldsGroup = valueControl.get(['customFields']) as\r\n | UntypedFormGroup\r\n | undefined;\r\n if (!customValueFieldsGroup) {\r\n customValueFieldsGroup = new UntypedFormGroup({});\r\n valueControl.addControl('customFields', customValueFieldsGroup);\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 UntypedFormControl(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: (typeof this.detailForm)['controls']['facet'],\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: (typeof this.detailForm)['controls']['values'],\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 code: input.code ?? '',\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: UntypedFormArray,\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 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","import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BulkAction,\r\n createBulkAssignToChannelAction,\r\n createBulkDeleteAction,\r\n createBulkRemoveFromChannelAction,\r\n currentChannelIsNotDefault,\r\n DataService,\r\n getChannelCodeFromUserStatus,\r\n GetFacetListQuery,\r\n ItemOf,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n RemoveFacetFromChannelResult,\r\n RemoveFacetsFromChannelMutation,\r\n} from '@vendure/admin-ui/core';\r\nimport { unique } from '@vendure/common/lib/unique';\r\nimport { EMPTY, of } from 'rxjs';\r\nimport { map, switchMap } from 'rxjs/operators';\r\n\r\nimport { FacetListComponent } from './facet-list.component';\r\n\r\nexport const deleteFacetsBulkAction = createBulkDeleteAction<ItemOf<GetFacetListQuery, 'facets'>>({\r\n location: 'facet-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.DeleteFacet) ||\r\n userPermissions.includes(Permission.DeleteCatalog),\r\n getItemName: item => item.name,\r\n shouldRetryItem: (response, item) => !!response.message,\r\n bulkDelete: (dataService, ids, retrying) =>\r\n dataService.facet.deleteFacets(ids, retrying).pipe(map(res => res.deleteFacets)),\r\n});\r\n\r\nexport const assignFacetsToChannelBulkAction = createBulkAssignToChannelAction<\r\n ItemOf<GetFacetListQuery, 'facets'>\r\n>({\r\n location: 'facet-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateCatalog) ||\r\n userPermissions.includes(Permission.UpdateFacet),\r\n getItemName: item => item.name,\r\n bulkAssignToChannel: (dataService, facetIds, channelId) =>\r\n dataService.facet\r\n .assignFacetsToChannel({\r\n facetIds,\r\n channelId,\r\n })\r\n .pipe(map(res => res.assignFacetsToChannel)),\r\n});\r\n\r\nexport const removeFacetsFromChannelBulkAction = createBulkRemoveFromChannelAction<\r\n ItemOf<GetFacetListQuery, 'facets'>,\r\n RemoveFacetsFromChannelMutation['removeFacetsFromChannel'][number]\r\n>({\r\n location: 'facet-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.DeleteCatalog) ||\r\n userPermissions.includes(Permission.DeleteFacet),\r\n getItemName: item => item.name,\r\n bulkRemoveFromChannel: (dataService, facetIds, channelId, retrying) =>\r\n dataService.facet\r\n .removeFacetsFromChannel({\r\n channelId: channelId,\r\n facetIds,\r\n force: retrying,\r\n })\r\n .pipe(map(res => res.removeFacetsFromChannel)),\r\n isErrorResult: result => (result.__typename === 'FacetInUseError' ? result.message : undefined),\r\n});\r\n\r\nexport const removeFacetsFromChannelBulkAction2: 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","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left>\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 </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 [routerLink]=\"['./create']\"\r\n *vdrIfPermissions=\"['CreateCatalog', 'CreateFacet']\"\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</vdr-page-block>\r\n<vdr-data-table-2\r\n class=\"mt-2\"\r\n id=\"facet-list\"\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n [filters]=\"filters\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\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-dt2-search\r\n [searchTermControl]=\"searchTermControl\"\r\n [searchTermPlaceholder]=\"'catalog.filter-by-name' | translate\"\r\n ></vdr-dt2-search>\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\" [sort]=\"sorts.get('id')\">\r\n <ng-template let-facet=\"item\">\r\n {{ facet.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.created-at' | translate\" id=\"created-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('createdAt')\"\r\n >\r\n <ng-template let-facet=\"item\">\r\n {{ facet.createdAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.updated-at' | translate\" id=\"updated-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('updatedAt')\"\r\n >\r\n <ng-template let-facet=\"item\">\r\n {{ facet.updatedAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.name' | translate\" id=\"name\" [optional]=\"false\" [sort]=\"sorts.get('name')\">\r\n <ng-template let-facet=\"item\">\r\n <a class=\"button-ghost\" [routerLink]=\"['./', facet.id]\"\r\n ><span>{{ facet.name }}</span>\r\n <clr-icon shape=\"arrow right\"></clr-icon>\r\n </a>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.code' | translate\" id=\"code\">\r\n <ng-template let-facet=\"item\">\r\n {{ facet.code }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.visibility' | translate\" id=\"visibility\">\r\n <ng-template let-facet=\"item\">\r\n <vdr-chip *ngIf=\"facet.isPrivate\" colorType=\"warning\">{{\r\n 'common.private' | translate\r\n }}</vdr-chip>\r\n <vdr-chip *ngIf=\"!facet.isPrivate\" colorType=\"success\">{{\r\n 'common.public' | translate\r\n }}</vdr-chip>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'catalog.values' | translate\" id=\"values\">\r\n <ng-template let-facet=\"item\">\r\n <div class=\"facet-values-list\">\r\n <vdr-facet-value-chip\r\n *ngFor=\"let value of facet.valueList.items | 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 <vdr-chip *ngIf=\"displayLimit[facet.id] < facet.valueList.totalItems && (displayLimit[facet.id] || 0) === facet.valueList.items.length\">\r\n ... + {{ facet.valueList.totalItems - facet.valueList.items.length }}\r\n </vdr-chip>\r\n <button\r\n class=\"button-small\"\r\n *ngIf=\"facet.valueList.items.length > initialLimit\"\r\n (click)=\"toggleDisplayLimit(facet)\"\r\n >\r\n <ng-container *ngIf=\"(displayLimit[facet.id] || 0) < facet.valueList.items.length; else collapse\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ facet.valueList.totalItems - 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 </div>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-custom-field-column *ngFor=\"let customField of customFields\" [customField]=\"customField\" [sorts]=\"sorts\" />\r\n</vdr-data-table-2>\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n DataService,\r\n FACET_WITH_VALUE_LIST_FRAGMENT,\r\n FACET_WITH_VALUES_FRAGMENT,\r\n GetFacetListDocument,\r\n GetFacetListQuery,\r\n ItemOf,\r\n LanguageCode,\r\n TypedBaseListComponent,\r\n} from '@vendure/admin-ui/core';\r\nimport { gql } from 'apollo-angular';\r\n\r\nexport const FACET_LIST_QUERY = gql`\r\n query GetFacetList($options: FacetListOptions) {\r\n facets(options: $options) {\r\n items {\r\n ...FacetWithValueList\r\n }\r\n totalItems\r\n }\r\n }\r\n ${FACET_WITH_VALUE_LIST_FRAGMENT}\r\n`;\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 TypedBaseListComponent<typeof GetFacetListDocument, 'facets'>\r\n implements OnInit\r\n{\r\n readonly initialLimit = 3;\r\n displayLimit: { [id: string]: number } = {};\r\n\r\n readonly customFields = this.getCustomFieldConfig('Facet');\r\n readonly filters = this.createFilterCollection()\r\n .addIdFilter()\r\n .addDateFilters()\r\n .addFilter({\r\n name: 'visibility',\r\n type: { kind: 'boolean' },\r\n label: _('common.visibility'),\r\n toFilterInput: value => ({\r\n isPrivate: { eq: !value },\r\n }),\r\n })\r\n .addCustomFieldFilters(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n readonly sorts = this.createSortCollection()\r\n .defaultSort('createdAt', 'DESC')\r\n .addSort({ name: 'id' })\r\n .addSort({ name: 'createdAt' })\r\n .addSort({ name: 'updatedAt' })\r\n .addSort({ name: 'name' })\r\n .addSort({ name: 'code' })\r\n .addCustomFieldSorts(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n constructor(protected dataService: DataService) {\r\n super();\r\n super.configure({\r\n document: GetFacetListDocument,\r\n getItems: data => data.facets,\r\n setVariables: (skip, take) => ({\r\n options: {\r\n skip,\r\n take,\r\n filter: {\r\n name: {\r\n contains: this.searchTermControl.value,\r\n },\r\n ...this.filters.createFilterInput(),\r\n },\r\n sort: this.sorts.createSortInput(),\r\n },\r\n }),\r\n refreshListOnChanges: [this.filters.valueChanges, this.sorts.valueChanges],\r\n });\r\n }\r\n\r\n toggleDisplayLimit(facet: ItemOf<GetFacetListQuery, 'facets'>) {\r\n if (this.displayLimit[facet.id] === facet.valueList.items.length) {\r\n this.displayLimit[facet.id] = this.initialLimit;\r\n } else {\r\n this.displayLimit[facet.id] = facet.valueList.items.length;\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","<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=\"button-small mt-2\"\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=\"button mb-2\" (click)=\"addOption()\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-option' | translate }}\r\n</button>\r\n\r\n<ng-container *ngIf=\"stockLocations$ | async as stockLocations\">\r\n <clr-alert *ngIf=\"stockLocations.length === 0\" clrAlertType=\"warning\" [clrAlertClosable]=\"false\" class=\"\">\r\n <clr-alert-item>\r\n <span class=\"alert-text\">\r\n {{ 'catalog.no-stock-locations-available-on-current-channel' | translate }}\r\n </span>\r\n </clr-alert-item>\r\n </clr-alert>\r\n\r\n <div class=\"form-grid mb-2\">\r\n <vdr-form-field *ngIf=\"stockLocations.length\" [label]=\"'catalog.add-stock-to-location' | translate\">\r\n <select [(ngModel)]=\"selectedStockLocationId\">\r\n <option *ngFor=\"let location of stockLocations\" [value]=\"location.id\">\r\n {{ location.name }}\r\n </option>\r\n </select>\r\n </vdr-form-field>\r\n </div>\r\n\r\n <div class=\"variants-preview\" *ngIf=\"0 < stockLocations.length\">\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].value.enabled === false\"\r\n [formGroup]=\"variantFormValues[variant.id]\"\r\n >\r\n <td *ngIf=\"1 < variants.length\">\r\n <input type=\"checkbox\" formControlName=\"enabled\" clrCheckbox />\r\n </td>\r\n <td *ngIf=\"1 < variants.length\">\r\n {{ variant.values.join(' ') }}\r\n </td>\r\n <td>\r\n <vdr-form-field>\r\n <input type=\"text\" formControlName=\"sku\" [placeholder]=\"'catalog.sku' | translate\" />\r\n </vdr-form-field>\r\n </td>\r\n <td>\r\n <vdr-form-field>\r\n <vdr-currency-input\r\n formControlName=\"price\"\r\n [currencyCode]=\"currencyCode\"\r\n ></vdr-currency-input>\r\n </vdr-form-field>\r\n </td>\r\n <td>\r\n <vdr-form-field>\r\n <input type=\"number\" formControlName=\"stock\" min=\"0\" step=\"1\" />\r\n </vdr-form-field>\r\n </td>\r\n </tr>\r\n </table>\r\n </div>\r\n</ng-container>\r\n","import { Component, ElementRef, EventEmitter, OnInit, Output, QueryList, ViewChildren } from '@angular/core';\r\nimport { AbstractControl, FormArray, FormBuilder, FormControl, FormGroup } from '@angular/forms';\r\nimport {\r\n CurrencyCode,\r\n DataService,\r\n GetStockLocationListDocument,\r\n GetStockLocationListQuery,\r\n ItemOf,\r\n} from '@vendure/admin-ui/core';\r\nimport { generateAllCombinations } from '@vendure/common/lib/shared-utils';\r\nimport { Observable } from 'rxjs';\r\nimport { tap } from 'rxjs/operators';\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 stockLocationId: string;\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: {\r\n [id: string]: FormGroup<{\r\n optionValues: FormControl<string[]>;\r\n enabled: FormControl<boolean>;\r\n price: FormControl<number>;\r\n sku: FormControl<string>;\r\n stock: FormControl<number>;\r\n }>;\r\n } = {};\r\n stockLocations$: Observable<Array<ItemOf<GetStockLocationListQuery, 'stockLocations'>>>;\r\n selectedStockLocationId: string | null = null;\r\n constructor(private dataService: DataService, private formBuilder: FormBuilder) {}\r\n\r\n ngOnInit() {\r\n this.dataService.settings.getActiveChannel().single$.subscribe(data => {\r\n this.currencyCode = data.activeChannel.defaultCurrencyCode;\r\n });\r\n this.stockLocations$ = this.dataService\r\n .query(GetStockLocationListDocument, {\r\n options: {\r\n take: 999,\r\n },\r\n })\r\n .refetchOnChannelChange()\r\n .mapStream(({ stockLocations }) => stockLocations.items)\r\n .pipe(\r\n tap(items => {\r\n if (items.length) {\r\n this.selectedStockLocationId = items[0].id;\r\n }\r\n }),\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, index) => {\r\n if (!this.variantFormValues[variant.id]) {\r\n const formGroup = this.formBuilder.nonNullable.group({\r\n optionValues: [variant.values],\r\n enabled: true as boolean,\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 formGroup.valueChanges.subscribe(() => this.onFormChange());\r\n if (index === 0) {\r\n formGroup.get('price')?.valueChanges.subscribe(value => {\r\n this.copyValuesToPristine('price', formGroup.get('price'));\r\n });\r\n formGroup.get('sku')?.valueChanges.subscribe(value => {\r\n this.copyValuesToPristine('sku', formGroup.get('sku'));\r\n });\r\n formGroup.get('stock')?.valueChanges.subscribe(value => {\r\n this.copyValuesToPristine('stock', formGroup.get('stock'));\r\n });\r\n }\r\n this.variantFormValues[variant.id] = formGroup;\r\n }\r\n });\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 copyValuesToPristine(field: 'price' | 'sku' | 'stock', formControl: AbstractControl | null) {\r\n if (!formControl) {\r\n return;\r\n }\r\n Object.values(this.variantFormValues).forEach(formGroup => {\r\n const correspondingFormControl = formGroup.get(field) as FormControl;\r\n if (correspondingFormControl && correspondingFormControl.pristine) {\r\n correspondingFormControl.setValue(formControl.value, { emitEvent: false });\r\n }\r\n });\r\n }\r\n\r\n onFormChange() {\r\n const variantsToCreate = this.variants\r\n .map(v => this.variantFormValues[v.id].value as CreateVariantValues)\r\n .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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n stockLocationId: this.selectedStockLocationId!,\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].get(prop)?.value as CreateVariantValues[T])\r\n : value;\r\n }\r\n}\r\n","import { switchMap } from './switchMap';\nimport { isFunction } from '../util/isFunction';\nexport function switchMapTo(innerObservable, resultSelector) {\n return isFunction(resultSelector) ? switchMap(() => innerObservable, resultSelector) : switchMap(() => innerObservable);\n}\n","<vdr-page-block *ngIf=\"!hideLanguageSelect\">\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</vdr-page-block>\r\n<vdr-data-table-2\r\n class=\"mt-2\"\r\n id=\"product-variant-list\"\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n [filters]=\"filters\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n>\r\n <vdr-bulk-action-menu\r\n locationId=\"product-variant-list\"\r\n [hostComponent]=\"this\"\r\n [selectionManager]=\"selectionManager\"\r\n />\r\n <vdr-dt2-search\r\n [searchTermControl]=\"searchTermControl\"\r\n [searchTermPlaceholder]=\"'catalog.filter-by-sku' | translate\"\r\n />\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\" [sort]=\"sorts.get('id')\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.created-at' | translate\" id=\"created-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('createdAt')\"\r\n >\r\n <ng-template let-variant=\"item\">\r\n {{ variant.createdAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.updated-at' | translate\" id=\"updated-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('updatedAt')\"\r\n >\r\n <ng-template let-variant=\"item\">\r\n {{ variant.updatedAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.image' | translate\" id=\"image\">\r\n <ng-template let-variant=\"item\">\r\n <div class=\"image-placeholder\">\r\n <img\r\n *ngIf=\"variant.featuredAsset as asset; else imagePlaceholder\"\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 </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'catalog.name' | translate\" id=\"name\" [optional]=\"false\" [sort]=\"sorts.get('name')\">\r\n <ng-template let-variant=\"item\">\r\n <a\r\n class=\"button-ghost\"\r\n [routerLink]=\"['/catalog/inventory', variant.productId, 'variants', variant.id]\"\r\n ><span>{{ variant.name }}</span\r\n ><clr-icon shape=\"arrow right\"\r\n /></a>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'catalog.sku' | translate\" id=\"sku\" [sort]=\"sorts.get('sku')\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.sku }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.enabled' | translate\" id=\"enabled\">\r\n <ng-template let-variant=\"item\">\r\n <vdr-chip *ngIf=\"variant.enabled\" colorType=\"success\">{{\r\n 'common.enabled' | translate\r\n }}</vdr-chip>\r\n <vdr-chip *ngIf=\"!variant.enabled\" colorType=\"warning\">{{\r\n 'common.disabled' | translate\r\n }}</vdr-chip>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.price' | translate\" id=\"price\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('price')\"\r\n >\r\n <ng-template let-variant=\"item\">\r\n {{ variant.price | localeCurrency : variant.currencyCode }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.price-with-tax' | translate\" id=\"price-with-tax\" [sort]=\"sorts.get('priceWithTax')\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.priceWithTax | localeCurrency : variant.currencyCode }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n\r\n <vdr-dt2-column [heading]=\"'catalog.stock-on-hand' | translate\" id=\"stock-on-hand\" [hiddenByDefault]=\"false\">\r\n <ng-template let-variant=\"item\">\r\n <vdr-chip *ngFor=\"let stockLevel of variant.stockLevels\" [title]=\"stockLevel.stockLocation?.name\">\r\n <div class=\"flex center\">\r\n <div>\r\n {{ stockLevel.stockOnHand\r\n }}<span class=\"ml-1\" *ngIf=\"stockLevel.stockAllocated\"\r\n >({{ stockLevel.stockAllocated }} allocated)</span\r\n >\r\n </div>\r\n </div>\r\n </vdr-chip>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-custom-field-column *ngFor=\"let field of customFields\" [customField]=\"field\" [sorts]=\"sorts\" />\r\n</vdr-data-table-2>\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n LogicalOperator,\r\n ProductVariantListQueryDocument,\r\n TypedBaseListComponent,\r\n} from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-product-variant-list',\r\n templateUrl: './product-variant-list.component.html',\r\n styleUrls: ['./product-variant-list.component.scss'],\r\n})\r\nexport class ProductVariantListComponent\r\n extends TypedBaseListComponent<typeof ProductVariantListQueryDocument, 'productVariants'>\r\n implements OnInit\r\n{\r\n @Input() productId?: string;\r\n @Input() hideLanguageSelect = false;\r\n readonly customFields = this.getCustomFieldConfig('ProductVariant');\r\n readonly filters = this.createFilterCollection()\r\n .addIdFilter()\r\n .addDateFilters()\r\n .addFilters([\r\n {\r\n name: 'name',\r\n type: { kind: 'text' },\r\n label: _('common.name'),\r\n filterField: 'name',\r\n },\r\n {\r\n name: 'enabled',\r\n type: { kind: 'boolean' },\r\n label: _('common.enabled'),\r\n filterField: 'enabled',\r\n },\r\n {\r\n name: 'sku',\r\n type: { kind: 'text' },\r\n label: _('catalog.sku'),\r\n filterField: 'sku',\r\n },\r\n {\r\n name: 'price',\r\n type: { kind: 'number', inputType: 'currency' },\r\n label: _('common.price'),\r\n filterField: 'price',\r\n },\r\n {\r\n name: 'priceWithTax',\r\n type: { kind: 'number', inputType: 'currency' },\r\n label: _('common.price-with-tax'),\r\n filterField: 'priceWithTax',\r\n },\r\n ])\r\n .addCustomFieldFilters(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n readonly sorts = this.createSortCollection()\r\n .addSorts([\r\n { name: 'id' },\r\n { name: 'createdAt' },\r\n { name: 'updatedAt' },\r\n { name: 'name' },\r\n { name: 'sku' },\r\n { name: 'price' },\r\n { name: 'priceWithTax' },\r\n ])\r\n .addCustomFieldSorts(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n constructor() {\r\n super();\r\n this.configure({\r\n document: ProductVariantListQueryDocument,\r\n getItems: data => data.productVariants,\r\n setVariables: (skip, take) => ({\r\n options: {\r\n skip,\r\n take,\r\n filter: {\r\n sku: {\r\n contains: this.searchTermControl.value,\r\n },\r\n ...this.filters.createFilterInput(),\r\n ...(this.productId ? { productId: { eq: this.productId } } : {}),\r\n },\r\n sort: this.sorts.createSortInput(),\r\n },\r\n }),\r\n refreshListOnChanges: [this.sorts.valueChanges, this.filters.valueChanges],\r\n });\r\n }\r\n}\r\n","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left>\r\n <div class=\"flex clr-flex-row\"></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 || createVariantsConfig.variants.length === 0\"\r\n >\r\n {{ 'common.create' | translate }}\r\n </button>\r\n <ng-template #updateButton>\r\n <button\r\n *vdrIfPermissions=\"updatePermissions\"\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</vdr-page-block>\r\n\r\n<form class=\"form\" [formGroup]=\"detailForm\">\r\n <vdr-page-detail-layout>\r\n <vdr-page-detail-sidebar>\r\n <vdr-card>\r\n <vdr-form-field [label]=\"'catalog.visibility' | translate\" for=\"visibility\">\r\n <clr-toggle-wrapper *vdrIfPermissions=\"updatePermissions\">\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n name=\"enabled\"\r\n [formControl]=\"detailForm.get(['enabled'])\"\r\n />\r\n <label>{{ 'common.enabled' | translate }}</label>\r\n </clr-toggle-wrapper>\r\n </vdr-form-field>\r\n </vdr-card>\r\n <ng-container *ngIf=\"!(isNew$ | async)\">\r\n <vdr-card *vdrIfMultichannel [title]=\"'common.channels' | translate\">\r\n <vdr-form-item *vdrIfDefaultChannelActive>\r\n <div class=\"flex channel-assignment\">\r\n <div class=\"mb-2\">\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 [channelCode]=\"channel.code\"></vdr-channel-badge>\r\n {{ channel.code | channelCodeToLabel }}\r\n </vdr-chip>\r\n </ng-container>\r\n </div>\r\n <button class=\"button-small\" (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 </vdr-card>\r\n </ng-container>\r\n <vdr-card *ngIf=\"entity?.optionGroups.length\" [title]=\"'catalog.product-options' | translate\">\r\n <div class=\"options\">\r\n <vdr-chip\r\n *ngFor=\"let optionGroup of entity?.optionGroups | sort : 'id'\"\r\n [colorFrom]=\"optionGroup.code\"\r\n [invert]=\"true\"\r\n >\r\n {{ optionGroup.name }}\r\n </vdr-chip>\r\n </div>\r\n <div>\r\n <a [routerLink]=\"['options']\" class=\"button-small mt-2\" *vdrIfPermissions=\"updatePermissions\">\r\n <clr-icon shape=\"pencil\"></clr-icon>\r\n {{ 'catalog.edit-options' | translate }}\r\n </a>\r\n </div>\r\n </vdr-card>\r\n <vdr-card [title]=\"'catalog.facets' | translate\">\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]=\"updatePermissions | hasPermission\"\r\n (remove)=\"removeProductFacetValue(facetValue.id)\"\r\n ></vdr-facet-value-chip>\r\n </div>\r\n <div>\r\n <button\r\n class=\"button-small mt-2\"\r\n *vdrIfPermissions=\"updatePermissions\"\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 </vdr-card>\r\n <vdr-card *ngIf=\"entity$ | async as entity\">\r\n <vdr-page-entity-info [entity]=\"entity\"></vdr-page-entity-info>\r\n </vdr-card>\r\n </vdr-page-detail-sidebar>\r\n\r\n <vdr-page-block>\r\n <button type=\"submit\" hidden x-data=\"prevents enter key from triggering other buttons\"></button>\r\n <vdr-card>\r\n <div class=\"form-grid\">\r\n <div>\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]=\"!(updatePermissions | hasPermission)\"\r\n (input)=\"updateSlug($event.target.value)\"\r\n />\r\n </vdr-form-field>\r\n <div *ngIf=\"(isNew$ | async) === false && detailForm.get(['name'])?.dirty\">\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>{{ 'catalog.auto-update-product-variant-name' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n </div>\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]=\"!(updatePermissions | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n class=\"form-grid-span\"\r\n [label]=\"'common.description' | translate\"\r\n for=\"slug\"\r\n [errors]=\"{ pattern: 'catalog.slug-pattern-error' | translate }\"\r\n >\r\n <vdr-rich-text-editor\r\n formControlName=\"description\"\r\n [readonly]=\"!(updatePermissions | hasPermission)\"\r\n ></vdr-rich-text-editor>\r\n </vdr-form-field>\r\n </div>\r\n </vdr-card>\r\n <vdr-card [title]=\"'common.custom-fields' | translate\" *ngIf=\"customFields.length\">\r\n <vdr-tabbed-custom-fields\r\n entityName=\"Product\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\r\n [readonly]=\"!(updatePermissions | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </vdr-card>\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 <vdr-card [title]=\"'catalog.assets' | translate\">\r\n <vdr-assets\r\n [assets]=\"assetChanges.assets || entity?.assets\"\r\n [featuredAsset]=\"assetChanges.featuredAsset || entity?.featuredAsset\"\r\n [updatePermissions]=\"updatePermissions\"\r\n (change)=\"assetChanges = $event\"\r\n ></vdr-assets>\r\n </vdr-card>\r\n\r\n <vdr-card [title]=\"'catalog.product-variants' | translate\" [paddingX]=\"isNew$ | async\">\r\n <div *ngIf=\"isNew$ | async; else variantList\">\r\n <vdr-generate-product-variants\r\n (variantsChange)=\"createVariantsConfig = $event\"\r\n ></vdr-generate-product-variants>\r\n </div>\r\n <ng-template #variantList>\r\n <vdr-product-variant-list\r\n [productId]=\"this.id\"\r\n [hideLanguageSelect]=\"true\"\r\n ></vdr-product-variant-list>\r\n </ng-template>\r\n <div class=\"mx-3\" *ngIf=\"(isNew$ | async) === false\">\r\n <a class=\"button\" [routerLink]=\"['manage-variants']\">\r\n <clr-icon shape=\"add-text\"></clr-icon>\r\n {{ 'catalog.manage-variants' | translate }}</a\r\n >\r\n </div>\r\n </vdr-card>\r\n </vdr-page-block>\r\n </vdr-page-detail-layout>\r\n</form>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormBuilder, UntypedFormGroup, 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 CreateProductInput,\r\n createUpdatedTranslatable,\r\n DataService,\r\n findTranslation,\r\n getChannelCodeFromUserStatus,\r\n getCustomFieldsDefaults,\r\n GetProductDetailDocument,\r\n GetProductDetailQuery,\r\n GetProductWithVariantsQuery,\r\n LanguageCode,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n PRODUCT_DETAIL_FRAGMENT,\r\n ProductDetailFragment,\r\n ProductVariantFragment,\r\n ServerConfigService,\r\n TypedBaseDetailComponent,\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 { unique } from '@vendure/common/lib/unique';\r\nimport { gql } from 'apollo-angular';\r\nimport { combineLatest, concat, EMPTY, from, Observable } from 'rxjs';\r\nimport {\r\n distinctUntilChanged,\r\n map,\r\n mergeMap,\r\n shareReplay,\r\n skip,\r\n switchMap,\r\n switchMapTo,\r\n take,\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\n\r\ninterface SelectedAssets {\r\n assets?: Asset[];\r\n featuredAsset?: Asset;\r\n}\r\n\r\nexport const GET_PRODUCT_DETAIL = gql`\r\n query GetProductDetail($id: ID!) {\r\n product(id: $id) {\r\n ...ProductDetail\r\n }\r\n }\r\n ${PRODUCT_DETAIL_FRAGMENT}\r\n`;\r\n\r\n@Component({\r\n selector: 'vdr-product-detail2',\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 TypedBaseDetailComponent<typeof GetProductDetailDocument, 'product'>\r\n implements OnInit, OnDestroy\r\n{\r\n readonly customFields = this.getCustomFieldConfig('Product');\r\n detailForm = 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: [[] as string[]],\r\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),\r\n });\r\n assetChanges: SelectedAssets = {};\r\n productChannels$: Observable<ProductDetailFragment['channels']>;\r\n facetValues$: Observable<ProductDetailFragment['facetValues']>;\r\n createVariantsConfig: CreateProductVariantsConfig = { groups: [], variants: [], stockLocationId: '' };\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 changeDetector: ChangeDetectorRef,\r\n ) {\r\n super();\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\r\n const productFacetValues$ = this.entity$.pipe(map(product => product.facetValues));\r\n const productGroup = this.detailForm;\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n const formFacetValueIdChanges$ = productGroup.get('facetValueIds')!.valueChanges.pipe(\r\n skip(1),\r\n distinctUntilChanged(),\r\n switchMap(ids =>\r\n this.dataService.facet\r\n .getFacetValues({ filter: { id: { in: ids } } })\r\n .mapSingle(({ facetValues }) => facetValues.items),\r\n ),\r\n shareReplay(1),\r\n );\r\n this.facetValues$ = concat(\r\n productFacetValues$.pipe(take(1)),\r\n productFacetValues$.pipe(switchMapTo(formFacetValueIdChanges$)),\r\n );\r\n this.productChannels$ = this.entity$.pipe(map(p => p.channels));\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy();\r\n }\r\n\r\n isDefaultChannel(channelCode: string): boolean {\r\n return channelCode === DEFAULT_CHANNEL_CODE;\r\n }\r\n\r\n assignToChannel() {\r\n this.productChannels$\r\n .pipe(\r\n take(1),\r\n switchMap(channels =>\r\n 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 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({ channelId, variant }: { channelId: string; variant: ProductVariantFragment }) {\r\n from(getChannelCodeFromUserStatus(this.dataService, channelId))\r\n .pipe(\r\n switchMap(({ channelCode }) =>\r\n 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 /**\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 const slugControl = this.detailForm.get('slug');\r\n const currentTranslation = this.entity ? findTranslation(this.entity, this.languageCode) : undefined;\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 selectProductFacetValue() {\r\n this.displayFacetValueModal().subscribe(facetValueIds => {\r\n if (facetValueIds) {\r\n const productGroup = this.detailForm;\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.entity$, 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.detailForm;\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 private displayFacetValueModal(): Observable<string[] | undefined> {\r\n return this.modalService\r\n .fromComponent(ApplyFacetDialogComponent, {\r\n size: 'md',\r\n closable: true,\r\n })\r\n .pipe(map(facetValues => facetValues && facetValues.map(v => v.id)));\r\n }\r\n\r\n create() {\r\n const productGroup = this.detailForm;\r\n if (!productGroup.dirty) {\r\n return;\r\n }\r\n\r\n const newProduct = this.getUpdatedProduct(\r\n {\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n enabled: true,\r\n languageCode: this.languageCode,\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 channels: [],\r\n },\r\n productGroup as UntypedFormGroup,\r\n this.languageCode,\r\n ) as CreateProductInput;\r\n this.productDetailService\r\n .createProductWithVariants(newProduct, this.createVariantsConfig, this.languageCode)\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.detailForm.markAsPristine();\r\n this.router.navigate(['../', productId], { relativeTo: this.route });\r\n },\r\n err => {\r\n // eslint-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.entity$, this.languageCode$)\r\n .pipe(\r\n take(1),\r\n mergeMap(([product, languageCode]) => {\r\n const productGroup = this.detailForm;\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 UntypedFormGroup,\r\n languageCode,\r\n ) as UpdateProductInput;\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.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 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 if (this.customFields.length) {\r\n this.setCustomFieldFormValues(\r\n this.customFields,\r\n this.detailForm.get(['customFields']),\r\n product,\r\n currentTranslation,\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<GetProductDetailQuery['product']>,\r\n productFormGroup: UntypedFormGroup,\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 * 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","import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BulkAction,\r\n createBulkRemoveFromChannelAction,\r\n DataService,\r\n DeletionResult,\r\n GetProductListQuery,\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 } from 'rxjs';\r\nimport { map, 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 } from './product-list.component';\r\n\r\nexport const deleteProductsBulkAction: BulkAction<\r\n ItemOf<GetProductListQuery, 'products'>,\r\n ProductListComponent\r\n> = {\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 ? dataService.product.deleteProducts(unique(selection.map(p => p.id))) : 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<\r\n ItemOf<GetProductListQuery, 'products'>,\r\n ProductListComponent\r\n> = {\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, clearSelection }) => {\r\n const modalService = injector.get(ModalService);\r\n modalService\r\n .fromComponent(AssignProductsToChannelDialogComponent, {\r\n size: 'lg',\r\n locals: {\r\n productIds: unique(selection.map(p => p.id)),\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 = createBulkRemoveFromChannelAction<\r\n ItemOf<GetProductListQuery, 'products'>\r\n>({\r\n location: 'product-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateCatalog) ||\r\n userPermissions.includes(Permission.UpdateProduct),\r\n getItemName: item => item.name,\r\n bulkRemoveFromChannel: (dataService, productIds, channelId) =>\r\n dataService.product\r\n .removeProductsFromChannel({\r\n channelId: channelId,\r\n productIds,\r\n })\r\n .pipe(map(res => res.removeProductsFromChannel)),\r\n});\r\n\r\nexport const assignFacetValuesToProductsBulkAction: BulkAction<\r\n ItemOf<GetProductListQuery, 'products'>,\r\n ProductListComponent\r\n> = {\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';\r\n const ids = unique(selection.map(p => p.id));\r\n return modalService\r\n .fromComponent(BulkAddFacetValuesDialogComponent, {\r\n size: 'xl',\r\n locals: {\r\n mode,\r\n ids,\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","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left>\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 </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=\"button primary mr-1\"\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-dropdown>\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 type=\"button\" vdrDropdownItem (click)=\"rebuildSearchIndex()\">\r\n <clr-icon shape=\"refresh\" class=\"\"></clr-icon>\r\n {{ 'catalog.rebuild-search-index' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </vdr-ab-right>\r\n </vdr-action-bar>\r\n</vdr-page-block>\r\n<vdr-data-table-2\r\n class=\"mt-2\"\r\n id=\"product-list\"\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n [filters]=\"filters\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\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-dt2-search\r\n [searchTermControl]=\"searchTermControl\"\r\n [searchTermPlaceholder]=\"'catalog.filter-by-name' | translate\"\r\n />\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\" [sort]=\"sorts.get('id')\">\r\n <ng-template let-product=\"item\">\r\n {{ product.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.created-at' | translate\" id=\"created-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('createdAt')\"\r\n >\r\n <ng-template let-product=\"item\">\r\n {{ product.createdAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.updated-at' | translate\" id=\"updated-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('updatedAt')\"\r\n >\r\n <ng-template let-product=\"item\">\r\n {{ product.updatedAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.image' | translate\" id=\"image\">\r\n <ng-template let-product=\"item\">\r\n <div class=\"image-placeholder\">\r\n <img\r\n *ngIf=\"product.featuredAsset as asset; else imagePlaceholder\"\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 </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'catalog.name' | translate\" id=\"name\" [optional]=\"false\" [sort]=\"sorts.get('name')\">\r\n <ng-template let-product=\"item\">\r\n <a class=\"button-ghost\" [routerLink]=\"['./', product.id]\"\r\n ><span>{{ product.name }}</span\r\n ><clr-icon shape=\"arrow right\"\r\n /></a>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.slug' | translate\" id=\"slug\" [sort]=\"sorts.get('slug')\">\r\n <ng-template let-product=\"item\">\r\n {{ product.slug }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.enabled' | translate\" id=\"enabled\">\r\n <ng-template let-product=\"item\">\r\n <vdr-chip *ngIf=\"product.enabled\" colorType=\"success\">{{\r\n 'common.enabled' | translate\r\n }}</vdr-chip>\r\n <vdr-chip *ngIf=\"!product.enabled\" colorType=\"warning\">{{\r\n 'common.disabled' | translate\r\n }}</vdr-chip>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'catalog.number-of-variants' | translate\" id=\"number-of-variants\">\r\n <ng-template let-product=\"item\">\r\n {{ 'catalog.variant-count' | translate : { count: product.variantList?.totalItems } }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-custom-field-column\r\n *ngFor=\"let customField of customFields\"\r\n [customField]=\"customField\"\r\n [sorts]=\"sorts\"\r\n />\r\n</vdr-data-table-2>\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n DataService,\r\n FacetValueFormInputComponent,\r\n JobQueueService,\r\n JobState,\r\n ModalService,\r\n NotificationService,\r\n ProductListQueryDocument,\r\n TypedBaseListComponent,\r\n} from '@vendure/admin-ui/core';\r\nimport { EMPTY, lastValueFrom } from 'rxjs';\r\nimport { delay, switchMap } from 'rxjs/operators';\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 TypedBaseListComponent<typeof ProductListQueryDocument, 'products'>\r\n implements OnInit\r\n{\r\n pendingSearchIndexUpdates = 0;\r\n readonly customFields = this.getCustomFieldConfig('Product');\r\n readonly filters = this.createFilterCollection()\r\n .addIdFilter()\r\n .addDateFilters()\r\n .addFilters([\r\n {\r\n name: 'enabled',\r\n type: { kind: 'boolean' },\r\n label: _('common.enabled'),\r\n filterField: 'enabled',\r\n },\r\n {\r\n name: 'slug',\r\n type: { kind: 'text' },\r\n label: _('common.slug'),\r\n filterField: 'slug',\r\n },\r\n ])\r\n .addFilter({\r\n name: 'facetValues',\r\n type: {\r\n kind: 'custom',\r\n component: FacetValueFormInputComponent,\r\n serializeValue: value => value.map(v => v.id).join(','),\r\n deserializeValue: value => value.split(',').map(id => ({ id })),\r\n getLabel: value => {\r\n if (value.length === 0) {\r\n return '';\r\n }\r\n if (value[0].name) {\r\n return value.map(v => v.name).join(', ');\r\n } else {\r\n return lastValueFrom(\r\n this.dataService.facet\r\n .getFacetValues({ filter: { id: { in: value.map(v => v.id) } } })\r\n .mapSingle(({ facetValues }) =>\r\n facetValues.items.map(fv => fv.name).join(', '),\r\n ),\r\n );\r\n }\r\n },\r\n },\r\n label: _('catalog.facet-values'),\r\n toFilterInput: (value: any[]) => ({\r\n facetValueId: {\r\n in: value.map(v => v.id),\r\n },\r\n }),\r\n })\r\n .addCustomFieldFilters(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n readonly sorts = this.createSortCollection()\r\n .defaultSort('createdAt', 'DESC')\r\n .addSorts([\r\n { name: 'id' },\r\n { name: 'createdAt' },\r\n { name: 'updatedAt' },\r\n { name: 'name' },\r\n { name: 'slug' },\r\n ])\r\n .addCustomFieldSorts(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n constructor(\r\n protected dataService: DataService,\r\n private modalService: ModalService,\r\n private notificationService: NotificationService,\r\n private jobQueueService: JobQueueService,\r\n ) {\r\n super();\r\n this.configure({\r\n document: ProductListQueryDocument,\r\n getItems: data => data.products,\r\n setVariables: (skip, take) => ({\r\n options: {\r\n skip,\r\n take,\r\n filter: {\r\n name: {\r\n contains: this.searchTermControl.value,\r\n },\r\n ...this.filters.createFilterInput(),\r\n },\r\n sort: this.sorts.createSortInput(),\r\n },\r\n }),\r\n refreshListOnChanges: [this.sorts.valueChanges, this.filters.valueChanges],\r\n });\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 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","<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 { 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]) => Math.round(price * ((100 + taxRate) / 100))),\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","<ng-select\r\n *ngIf=\"(variants$ | async)?.length > 1\"\r\n [items]=\"variants$ | async\"\r\n appendTo=\"body\"\r\n bindValue=\"id\"\r\n [(ngModel)]=\"selectedVariantId\"\r\n [searchFn]=\"searchFn\"\r\n [clearable]=\"false\"\r\n [placeholder]=\"'catalog.quick-jump-placeholder' | translate\"\r\n (change)=\"onSelect($event)\"\r\n>\r\n <ng-template ng-option-tmp let-item=\"item\" let-index=\"index\" let-search=\"searchTerm\">\r\n {{ item.name }} ({{ item.sku }})\r\n </ng-template>\r\n</ng-select>\r\n","import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport {\r\n DataService,\r\n GetProductVariantsQuickJumpDocument,\r\n GetProductVariantsQuickJumpQuery,\r\n} from '@vendure/admin-ui/core';\r\nimport { gql } from 'apollo-angular';\r\nimport { Observable } from 'rxjs';\r\n\r\nconst GET_PRODUCT_VARIANTS_QUICK_JUMP = gql`\r\n query GetProductVariantsQuickJump($id: ID!) {\r\n product(id: $id) {\r\n id\r\n variants {\r\n id\r\n name\r\n sku\r\n }\r\n }\r\n }\r\n`;\r\n\r\n@Component({\r\n selector: 'vdr-product-variant-quick-jump',\r\n templateUrl: './product-variant-quick-jump.component.html',\r\n styleUrls: ['./product-variant-quick-jump.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ProductVariantQuickJumpComponent implements OnInit {\r\n @Input() productId: string;\r\n selectedVariantId: string | undefined;\r\n variants$: Observable<NonNullable<GetProductVariantsQuickJumpQuery['product']>['variants']>;\r\n constructor(private dataService: DataService, private router: Router) {}\r\n\r\n ngOnInit() {\r\n this.variants$ = this.dataService\r\n .query(GetProductVariantsQuickJumpDocument, {\r\n id: this.productId,\r\n })\r\n .mapSingle(data => data.product?.variants ?? []);\r\n }\r\n\r\n searchFn = (\r\n term: string,\r\n item: NonNullable<GetProductVariantsQuickJumpQuery['product']>['variants'][number],\r\n ) =>\r\n item.name.toLowerCase().includes(term.toLowerCase()) ||\r\n item.sku.toLowerCase().includes(term.toLowerCase());\r\n\r\n onSelect(item?: NonNullable<GetProductVariantsQuickJumpQuery['product']>['variants'][number]) {\r\n if (item) {\r\n this.router\r\n .navigate(['catalog', 'inventory', this.productId, 'variants', item.id])\r\n .then(() => (this.selectedVariantId = undefined));\r\n }\r\n }\r\n}\r\n","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left [grow]=\"true\">\r\n <div class=\"flex center\">\r\n <ng-container *ngIf=\"availableLanguages$ | async as availableLanguages\">\r\n <vdr-language-selector\r\n *ngIf=\"availableLanguages.length > 1\"\r\n class=\"mr-2\"\r\n [disabled]=\"isNew$ | async\"\r\n [availableLanguageCodes]=\"availableLanguages\"\r\n [currentLanguageCode]=\"languageCode$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </ng-container>\r\n <vdr-product-variant-quick-jump [productId]=\"entity?.product.id\" />\r\n </div>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"product-variant-detail\"></vdr-action-bar-items>\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 ||\r\n stockLevelsForm.invalid ||\r\n pricesForm.invalid ||\r\n (detailForm.pristine && stockLevelsForm.pristine && pricesForm.pristine)) &&\r\n !assetsChanged()\r\n \"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n </vdr-ab-right>\r\n </vdr-action-bar>\r\n</vdr-page-block>\r\n<form class=\"form\" [formGroup]=\"detailForm\" *ngIf=\"entity$ | async as variant\">\r\n <vdr-page-detail-layout>\r\n <vdr-page-detail-sidebar\r\n ><vdr-card>\r\n <vdr-form-field [label]=\"'catalog.visibility' | translate\" for=\"visibility\">\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(['enabled'])\"\r\n />\r\n <label>{{ 'common.enabled' | translate }}</label>\r\n </clr-toggle-wrapper>\r\n </vdr-form-field>\r\n </vdr-card>\r\n <vdr-card *ngIf=\"variant.options.length\" [title]=\"'catalog.product-options' | translate\">\r\n <div class=\"options\">\r\n <vdr-chip\r\n *ngFor=\"let option of variant.options | sort : 'groupId'\"\r\n [colorFrom]=\"optionGroupCode(option.groupId)\"\r\n [invert]=\"true\"\r\n >\r\n <span>{{ optionGroupCode(option.groupId) }}:</span>\r\n {{ optionName(option) }}\r\n </vdr-chip>\r\n </div>\r\n <div>\r\n <a\r\n [routerLink]=\"['../../', 'options']\"\r\n class=\"button-small mt-2\"\r\n *vdrIfPermissions=\"updatePermissions\"\r\n >\r\n <clr-icon shape=\"pencil\"></clr-icon>\r\n {{ 'catalog.edit-options' | translate }}\r\n </a>\r\n </div>\r\n </vdr-card>\r\n <vdr-card [title]=\"'catalog.facets' | translate\">\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]=\"updatePermissions | hasPermission\"\r\n (remove)=\"removeFacetValue(facetValue.id)\"\r\n ></vdr-facet-value-chip>\r\n </div>\r\n <div>\r\n <button\r\n class=\"button-small mt-2\"\r\n *vdrIfPermissions=\"updatePermissions\"\r\n (click)=\"selectFacetValue()\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-facets' | translate }}\r\n </button>\r\n </div>\r\n </vdr-card>\r\n\r\n <vdr-card>\r\n <vdr-page-entity-info *ngIf=\"entity$ | async as entity\" [entity]=\"entity\" />\r\n </vdr-card>\r\n </vdr-page-detail-sidebar>\r\n\r\n <vdr-page-block>\r\n <button type=\"submit\" hidden x-data=\"prevents enter key from triggering other buttons\"></button>\r\n <vdr-card>\r\n <div class=\"form-grid\">\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]=\"!(['UpdateCatalog', 'UpdateProduct'] | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'catalog.sku' | translate\" for=\"sku\">\r\n <input\r\n id=\"sku\"\r\n type=\"text\"\r\n formControlName=\"sku\"\r\n [readonly]=\"!(updatePermissions | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n </div>\r\n </vdr-card>\r\n <vdr-card [title]=\"'common.custom-fields' | translate\" *ngIf=\"customFields.length\">\r\n <vdr-tabbed-custom-fields\r\n entityName=\"ProductVariant\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\r\n [readonly]=\"!(updatePermissions | hasPermission)\"\r\n />\r\n </vdr-card>\r\n <vdr-custom-detail-component-host\r\n locationId=\"product-variant-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n />\r\n <vdr-card [title]=\"'catalog.assets' | translate\">\r\n <vdr-assets\r\n [assets]=\"assetChanges.assets || variant.assets\"\r\n [featuredAsset]=\"assetChanges.featuredAsset || variant.featuredAsset\"\r\n [updatePermissions]=\"updatePermissions\"\r\n (change)=\"assetChanges = $event\"\r\n />\r\n </vdr-card>\r\n <vdr-card [title]=\"'catalog.price-and-tax' | translate\">\r\n <div class=\"form-grid\">\r\n <vdr-form-field [label]=\"'catalog.tax-category' | translate\" for=\"taxCategory\">\r\n <select name=\"taxCategory\" formControlName=\"taxCategoryId\">\r\n <option\r\n *ngFor=\"let taxCategory of taxCategories$ | async\"\r\n [value]=\"taxCategory.id\"\r\n >\r\n {{ taxCategory.name }}\r\n </option>\r\n </select>\r\n </vdr-form-field>\r\n </div>\r\n <div class=\"form-grid prices\" *ngFor=\"let price of pricesForm.controls\" [formGroup]=\"price\">\r\n <vdr-form-field\r\n [label]=\"\r\n ('catalog.price' | translate) +\r\n (1 < pricesForm.length ? ' (' + price.value.currencyCode + ')' : '')\r\n \"\r\n [tooltip]=\"\r\n 1 < pricesForm.length && price.value.currencyCode === channelDefaultCurrencyCode\r\n ? ('catalog.default-currency' | translate)\r\n : undefined\r\n \"\r\n for=\"price\"\r\n >\r\n <div class=\"price-wrapper\" [class.pending-deletion]=\"price.value.delete === true\">\r\n <vdr-currency-input\r\n name=\"price\"\r\n [currencyCode]=\"price.value.currencyCode\"\r\n [readonly]=\"\r\n !(updatePermissions | hasPermission) || price.value.delete === true\r\n \"\r\n formControlName=\"price\"\r\n />\r\n <div *ngIf=\"1 < pricesForm.controls.length\">\r\n <button\r\n class=\"button-small delete-button\"\r\n [disabled]=\"price.value.currencyCode === channelDefaultCurrencyCode\"\r\n (click)=\"toggleDeletePrice(price.get('delete'))\"\r\n >\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </vdr-form-field>\r\n <vdr-variant-price-detail\r\n [price]=\"price.value.price\"\r\n [currencyCode]=\"price.value.currencyCode\"\r\n [priceIncludesTax]=\"channelPriceIncludesTax$ | async\"\r\n [taxCategoryId]=\"detailForm.get('taxCategoryId')!.value\"\r\n />\r\n </div>\r\n <ng-container *ngIf=\"unusedCurrencyCodes$ | async as unusedCurrencyCodes\">\r\n <div *ngIf=\"unusedCurrencyCodes.length\">\r\n <vdr-dropdown>\r\n <button class=\"button mt-2\" vdrDropdownTrigger>\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-price-in-another-currency' | translate }}\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu>\r\n <button\r\n vdrDropdownItem\r\n *ngFor=\"let currencyCode of unusedCurrencyCodes\"\r\n (click)=\"addPriceInCurrency(currencyCode)\"\r\n >\r\n {{ currencyCode | localeCurrencyName }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n </ng-container>\r\n </vdr-card>\r\n <vdr-card [title]=\"'catalog.stock-levels' | translate\">\r\n <div class=\"form-grid\">\r\n <vdr-form-field\r\n for=\"track-inventory\"\r\n [label]=\"'catalog.track-inventory' | translate\"\r\n [tooltip]=\"'catalog.track-inventory-tooltip' | translate\"\r\n >\r\n <select\r\n name=\"track-inventory\"\r\n formControlName=\"trackInventory\"\r\n [disabled]=\"!(updatePermissions | hasPermission)\"\r\n >\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 </vdr-form-field>\r\n\r\n <vdr-form-item\r\n [label]=\"'catalog.out-of-stock-threshold' | translate\"\r\n [tooltip]=\"'catalog.out-of-stock-threshold-tooltip' | translate\"\r\n >\r\n <input\r\n type=\"number\"\r\n formControlName=\"outOfStockThreshold\"\r\n [readonly]=\"!(updatePermissions | hasPermission)\"\r\n [vdrDisabled]=\"\r\n detailForm.get('useGlobalOutOfStockThreshold')?.value !== false ||\r\n inventoryIsNotTracked(detailForm)\r\n \"\r\n />\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 !(updatePermissions | hasPermission) || inventoryIsNotTracked(detailForm)\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 </vdr-form-item>\r\n </div>\r\n <div\r\n class=\"form-grid stock-levels\"\r\n *ngFor=\"let stockLevel of stockLevelsForm.controls\"\r\n [formGroup]=\"stockLevel\"\r\n >\r\n <vdr-form-field\r\n [label]=\"\r\n stockLevel.get('stockLocationName')?.value +\r\n ': ' +\r\n ('catalog.stock-on-hand' | translate)\r\n \"\r\n [for]=\"'stockOnHand_' + stockLevel.get('stockLocationId')?.value\"\r\n >\r\n <input\r\n [id]=\"'stockOnHand_' + stockLevel.get('stockLocationId')?.value\"\r\n type=\"number\"\r\n formControlName=\"stockOnHand\"\r\n [readonly]=\"!(updatePermissions | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-item\r\n [label]=\"\r\n stockLevel.get('stockLocationName')?.value +\r\n ': ' +\r\n ('catalog.stock-allocated' | translate)\r\n \"\r\n >\r\n {{ stockLevel.get('stockAllocated')?.value }}\r\n </vdr-form-item>\r\n </div>\r\n <ng-container *ngIf=\"unusedStockLocation$ | async as unusedStockLocations\">\r\n <div *ngIf=\"unusedStockLocations.length\">\r\n <vdr-dropdown>\r\n <button class=\"button mt-2\" vdrDropdownTrigger>\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-stock-location' | translate }}\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu>\r\n <button\r\n vdrDropdownItem\r\n *ngFor=\"let stockLocation of unusedStockLocations\"\r\n (click)=\"addStockLocation(stockLocation)\"\r\n >\r\n <clr-icon shape=\"map-marker\"></clr-icon> {{ stockLocation.name }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n </ng-container>\r\n </vdr-card>\r\n </vdr-page-block>\r\n </vdr-page-detail-layout>\r\n</form>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormBuilder, FormControl, FormGroup, UntypedFormGroup } from '@angular/forms';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n Asset,\r\n CreateProductVariantInput,\r\n createUpdatedTranslatable,\r\n CurrencyCode,\r\n DataService,\r\n findTranslation,\r\n getCustomFieldsDefaults,\r\n GetProductVariantDetailDocument,\r\n GetProductVariantDetailQuery,\r\n GlobalFlag,\r\n ItemOf,\r\n LanguageCode,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n ProductOptionFragment,\r\n ProductVariantUpdateMutationDocument,\r\n TypedBaseDetailComponent,\r\n UpdateProductVariantInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { pick } from '@vendure/common/lib/pick';\r\nimport { unique } from '@vendure/common/lib/unique';\r\nimport { combineLatest, concat, Observable } from 'rxjs';\r\nimport {\r\n distinctUntilChanged,\r\n map,\r\n mergeMap,\r\n shareReplay,\r\n skip,\r\n switchMap,\r\n switchMapTo,\r\n take,\r\n tap,\r\n} from 'rxjs/operators';\r\nimport { ProductDetailService } from '../../providers/product-detail/product-detail.service';\r\nimport { ApplyFacetDialogComponent } from '../apply-facet-dialog/apply-facet-dialog.component';\r\n\r\ninterface SelectedAssets {\r\n assets?: Asset[];\r\n featuredAsset?: Asset;\r\n}\r\n\r\ninterface VariantFormValue {\r\n id: string;\r\n enabled: boolean;\r\n sku: string;\r\n name: string;\r\n taxCategoryId: string;\r\n stockOnHand: number;\r\n useGlobalOutOfStockThreshold: boolean;\r\n outOfStockThreshold: number;\r\n trackInventory: GlobalFlag;\r\n facetValueIds: string[][];\r\n customFields?: any;\r\n}\r\ntype T = NonNullable<GetProductVariantDetailQuery['productVariant']>;\r\ntype T1 = T['stockLevels'];\r\n@Component({\r\n selector: 'vdr-product-variant-detail',\r\n templateUrl: './product-variant-detail.component.html',\r\n styleUrls: ['./product-variant-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ProductVariantDetailComponent\r\n extends TypedBaseDetailComponent<typeof GetProductVariantDetailDocument, 'productVariant'>\r\n implements OnInit, OnDestroy\r\n{\r\n public readonly updatePermissions = [Permission.UpdateCatalog, Permission.UpdateProduct];\r\n readonly customFields = this.getCustomFieldConfig('ProductVariant');\r\n readonly customOptionFields = this.getCustomFieldConfig('ProductOption');\r\n stockLevels$: Observable<NonNullable<GetProductVariantDetailQuery['productVariant']>['stockLevels']>;\r\n detailForm = this.formBuilder.group<VariantFormValue>({\r\n id: '',\r\n enabled: false,\r\n sku: '',\r\n name: '',\r\n taxCategoryId: '',\r\n stockOnHand: 0,\r\n useGlobalOutOfStockThreshold: true,\r\n outOfStockThreshold: 0,\r\n trackInventory: GlobalFlag.TRUE,\r\n facetValueIds: [],\r\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),\r\n });\r\n stockLevelsForm = this.formBuilder.array<\r\n FormGroup<{\r\n stockLocationId: FormControl<string | null>;\r\n stockLocationName: FormControl<string | null>;\r\n stockOnHand: FormControl<number | null>;\r\n stockAllocated: FormControl<number | null>;\r\n }>\r\n >([]);\r\n pricesForm = this.formBuilder.array<\r\n FormGroup<{\r\n price: FormControl<number | null>;\r\n currencyCode: FormControl<CurrencyCode | null>;\r\n delete: FormControl<boolean | null>;\r\n }>\r\n >([]);\r\n assetChanges: SelectedAssets = {};\r\n taxCategories$: Observable<Array<ItemOf<GetProductVariantDetailQuery, 'taxCategories'>>>;\r\n unusedStockLocation$: Observable<Array<ItemOf<GetProductVariantDetailQuery, 'stockLocations'>>>;\r\n unusedCurrencyCodes$: Observable<string[]>;\r\n channelPriceIncludesTax$: Observable<boolean>;\r\n readonly GlobalFlag = GlobalFlag;\r\n globalTrackInventory: boolean;\r\n globalOutOfStockThreshold: number;\r\n facetValues$: Observable<NonNullable<GetProductVariantDetailQuery['productVariant']>['facetValues']>;\r\n channelDefaultCurrencyCode: CurrencyCode;\r\n\r\n constructor(\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 changeDetector: ChangeDetectorRef,\r\n ) {\r\n super();\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\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.taxCategories$ = this.result$.pipe(map(data => data.taxCategories.items));\r\n const availableCurrencyCodes$ = this.result$.pipe(\r\n tap(data => (this.channelDefaultCurrencyCode = data.activeChannel.defaultCurrencyCode)),\r\n map(data => data.activeChannel.availableCurrencyCodes),\r\n );\r\n this.unusedCurrencyCodes$ = combineLatest(this.pricesForm.valueChanges, availableCurrencyCodes$).pipe(\r\n map(([prices, currencyCodes]) =>\r\n currencyCodes.filter(code => !prices.map(p => p.currencyCode).includes(code)),\r\n ),\r\n );\r\n const stockLocations$ = this.result$.pipe(map(data => data.stockLocations.items));\r\n this.unusedStockLocation$ = combineLatest(this.entity$, stockLocations$).pipe(\r\n map(([entity, stockLocations]) => {\r\n const usedIds = entity.stockLevels.map(l => l.stockLocation.id);\r\n return stockLocations.filter(l => !usedIds.includes(l.id));\r\n }),\r\n );\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 this.stockLevels$ = this.entity$.pipe(map(entity => entity?.stockLevels ?? []));\r\n const facetValues$ = this.entity$.pipe(map(variant => variant.facetValues ?? []));\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n const formFacetValueIdChanges$ = this.detailForm.get('facetValueIds')!.valueChanges.pipe(\r\n skip(1),\r\n distinctUntilChanged(),\r\n switchMap(ids =>\r\n this.dataService.facet\r\n .getFacetValues({ filter: { id: { in: ids } } })\r\n .mapSingle(({ facetValues }) => facetValues.items),\r\n ),\r\n shareReplay(1),\r\n );\r\n this.facetValues$ = concat(\r\n facetValues$.pipe(take(1)),\r\n facetValues$.pipe(switchMapTo(formFacetValueIdChanges$)),\r\n );\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy();\r\n }\r\n\r\n addPriceInCurrency(currencyCode: CurrencyCode) {\r\n this.pricesForm.push(\r\n this.formBuilder.group({\r\n currencyCode,\r\n price: 0,\r\n delete: false as boolean,\r\n }),\r\n );\r\n }\r\n\r\n toggleDeletePrice(deleteFormControl: FormControl) {\r\n deleteFormControl.setValue(!deleteFormControl.value);\r\n deleteFormControl.markAsDirty();\r\n }\r\n\r\n addStockLocation(stockLocation: ItemOf<GetProductVariantDetailQuery, 'stockLocations'>) {\r\n this.stockLevelsForm.push(\r\n this.formBuilder.group({\r\n stockLocationId: stockLocation.id,\r\n stockLocationName: stockLocation.name,\r\n stockOnHand: 0,\r\n stockAllocated: 0,\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(([variant, languageCode]) => {\r\n const input = pick(\r\n this.getUpdatedVariant(\r\n variant,\r\n this.detailForm,\r\n languageCode,\r\n ) as UpdateProductVariantInput,\r\n [\r\n 'id',\r\n 'enabled',\r\n 'translations',\r\n 'sku',\r\n 'taxCategoryId',\r\n 'facetValueIds',\r\n 'featuredAssetId',\r\n 'assetIds',\r\n 'trackInventory',\r\n 'outOfStockThreshold',\r\n 'useGlobalOutOfStockThreshold',\r\n 'customFields',\r\n ],\r\n ) as UpdateProductVariantInput;\r\n if (this.stockLevelsForm.dirty) {\r\n input.stockLevels = this.stockLevelsForm.controls\r\n .filter(control => control.dirty)\r\n .map(control => ({\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n stockLocationId: control.value.stockLocationId!,\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n stockOnHand: control.value.stockOnHand!,\r\n }));\r\n }\r\n if (this.pricesForm.dirty) {\r\n input.prices = this.pricesForm.controls\r\n .filter(control => control.dirty)\r\n .map(control => ({\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n price: control.value.price!,\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n currencyCode: control.value.currencyCode!,\r\n delete: control.value.delete === true,\r\n }));\r\n }\r\n return this.dataService.mutate(ProductVariantUpdateMutationDocument, {\r\n input: [input],\r\n });\r\n }),\r\n )\r\n .subscribe(\r\n result => {\r\n this.detailForm.markAsPristine();\r\n this.stockLevelsForm.markAsPristine();\r\n this.pricesForm.markAsPristine();\r\n this.assetChanges = {};\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'ProductVariant',\r\n });\r\n this.changeDetector.markForCheck();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'ProductVariant',\r\n });\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 inventoryIsNotTracked(formGroup: UntypedFormGroup): 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 optionGroupCode(optionGroupId: string): string | undefined {\r\n const group = this.entity?.product.optionGroups.find(g => g.id === optionGroupId);\r\n return group?.code;\r\n }\r\n\r\n optionName(option: ProductOptionFragment) {\r\n const translation =\r\n option.translations.find(t => t.languageCode === this.languageCode) ?? option.translations[0];\r\n return translation.name;\r\n }\r\n\r\n removeFacetValue(facetValueId: string) {\r\n const productGroup = this.detailForm;\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 selectFacetValue() {\r\n this.displayFacetValueModal().subscribe(facetValueIds => {\r\n if (facetValueIds) {\r\n const currentFacetValueIds = this.detailForm.value.facetValueIds ?? [];\r\n this.detailForm.patchValue({\r\n facetValueIds: unique([...currentFacetValueIds, ...facetValueIds]),\r\n });\r\n this.detailForm.markAsDirty();\r\n }\r\n });\r\n }\r\n\r\n private displayFacetValueModal(): Observable<string[] | undefined> {\r\n return this.modalService\r\n .fromComponent(ApplyFacetDialogComponent, {\r\n size: 'md',\r\n closable: true,\r\n })\r\n .pipe(map(facetValues => facetValues && facetValues.map(v => v.id)));\r\n }\r\n\r\n protected setFormValues(\r\n variant: NonNullable<GetProductVariantDetailQuery['productVariant']>,\r\n languageCode: LanguageCode,\r\n ): void {\r\n const variantTranslation = findTranslation(variant, languageCode);\r\n const facetValueIds = variant.facetValues.map(fv => fv.id);\r\n this.detailForm.patchValue({\r\n id: variant.id,\r\n enabled: variant.enabled,\r\n sku: variant.sku,\r\n name: variantTranslation ? variantTranslation.name : '',\r\n taxCategoryId: variant.taxCategory.id,\r\n stockOnHand: variant.stockLevels[0]?.stockOnHand ?? 0,\r\n useGlobalOutOfStockThreshold: variant.useGlobalOutOfStockThreshold,\r\n outOfStockThreshold: variant.outOfStockThreshold,\r\n trackInventory: variant.trackInventory,\r\n facetValueIds,\r\n });\r\n this.stockLevelsForm.clear();\r\n for (const stockLevel of variant.stockLevels) {\r\n this.stockLevelsForm.push(\r\n this.formBuilder.group({\r\n stockLocationId: stockLevel.stockLocation.id,\r\n stockLocationName: stockLevel.stockLocation.name,\r\n stockOnHand: stockLevel.stockOnHand,\r\n stockAllocated: stockLevel.stockAllocated,\r\n }),\r\n );\r\n }\r\n this.pricesForm.clear();\r\n for (const price of variant.prices) {\r\n this.pricesForm.push(\r\n this.formBuilder.group({\r\n price: price.price,\r\n currencyCode: price.currencyCode,\r\n delete: false as boolean,\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('customFields'),\r\n variant,\r\n variantTranslation,\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 getUpdatedVariant(\r\n variant: NonNullable<GetProductVariantDetailQuery['productVariant']>,\r\n variantFormGroup: typeof this.detailForm,\r\n languageCode: LanguageCode,\r\n ): UpdateProductVariantInput | CreateProductVariantInput {\r\n const updatedProduct = createUpdatedTranslatable({\r\n translatable: variant,\r\n updatedFields: variantFormGroup.value,\r\n customFieldConfig: this.customFields,\r\n languageCode,\r\n defaultTranslation: {\r\n languageCode,\r\n name: variant.name || '',\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: variantFormGroup.value.facetValueIds,\r\n taxCategoryId: variantFormGroup.value.taxCategoryId,\r\n } as UpdateProductVariantInput | CreateProductVariantInput;\r\n }\r\n}\r\n","import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BulkAction,\r\n DataService,\r\n DeletionResult,\r\n GetProductVariantListQuery,\r\n ItemOf,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n createBulkRemoveFromChannelAction,\r\n isMultiChannel,\r\n} from '@vendure/admin-ui/core';\r\nimport { unique } from '@vendure/common/lib/unique';\r\nimport { EMPTY } from 'rxjs';\r\nimport { map, switchMap } from 'rxjs/operators';\r\n\r\nimport { ProductVariant } from 'package/core';\r\nimport { AssignProductsToChannelDialogComponent } from '../assign-products-to-channel-dialog/assign-products-to-channel-dialog.component';\r\nimport { ProductVariantListComponent } from './product-variant-list.component';\r\n\r\nexport const assignProductVariantsToChannelBulkAction: BulkAction<\r\n ItemOf<GetProductVariantListQuery, 'productVariants'>,\r\n ProductVariantListComponent\r\n> = {\r\n location: 'product-variant-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, clearSelection }) => {\r\n const modalService = injector.get(ModalService);\r\n modalService\r\n .fromComponent(AssignProductsToChannelDialogComponent, {\r\n size: 'lg',\r\n locals: {\r\n productVariantIds: unique(selection.map(p => p.id)),\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 removeProductVariantsFromChannelBulkAction = createBulkRemoveFromChannelAction<\r\n ItemOf<GetProductVariantListQuery, 'productVariants'>\r\n>({\r\n location: 'product-variant-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateCatalog) ||\r\n userPermissions.includes(Permission.UpdateProduct),\r\n getItemName: item => item.name,\r\n bulkRemoveFromChannel: (dataService, ids, channelId) =>\r\n dataService.product\r\n .removeVariantsFromChannel({\r\n channelId: channelId,\r\n productVariantIds: ids,\r\n })\r\n .pipe(map(res => res.removeProductVariantsFromChannel)),\r\n});\r\n\r\nexport const deleteProductVariantsBulkAction: BulkAction<ProductVariant, ProductVariantListComponent> = {\r\n location: 'product-variant-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: _('common.confirm-bulk-delete'),\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.deleteProductVariants(unique(selection.map(p => p.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.deleteProductVariants) {\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","<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 {\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 { UntypedFormArray, UntypedFormGroup } from '@angular/forms';\r\nimport { Asset, Permission, ProductDetailFragment, ProductVariantFragment } from '@vendure/admin-ui/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged, map } from 'rxjs/operators';\r\n\r\ninterface SelectedAssets {\r\n assets?: Asset[];\r\n featuredAsset?: Asset;\r\n}\r\n\r\ninterface PaginationConfig {\r\n totalItems: number;\r\n currentPage: number;\r\n itemsPerPage: number;\r\n}\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: UntypedFormArray;\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, UntypedFormGroup>();\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 UntypedFormGroup);\r\n }\r\n this.changeDetector.markForCheck();\r\n }\r\n}\r\n","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left></vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"stock-location-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 class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\r\n *vdrIfPermissions=\"'UpdateStockLocation'\"\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</vdr-page-block>\r\n\r\n<form class=\"form\" [formGroup]=\"detailForm\">\r\n <vdr-page-detail-layout>\r\n <vdr-page-detail-sidebar>\r\n <vdr-card *ngIf=\"entity$ | async as entity\">\r\n <vdr-page-entity-info [entity]=\"entity\" />\r\n </vdr-card>\r\n </vdr-page-detail-sidebar>\r\n <vdr-page-block>\r\n <vdr-card>\r\n <div class=\"form-grid\">\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]=\"!('UpdateStockLocation' | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n class=\"form-grid-span\"\r\n [label]=\"'common.description' | translate\"\r\n for=\"slug\"\r\n [errors]=\"{ pattern: 'catalog.slug-pattern-error' | translate }\"\r\n >\r\n <vdr-rich-text-editor\r\n formControlName=\"description\"\r\n [readonly]=\"!('UpdateStockLocation' | hasPermission)\"\r\n ></vdr-rich-text-editor>\r\n </vdr-form-field>\r\n </div>\r\n </vdr-card>\r\n <vdr-card\r\n formGroupName=\"customFields\"\r\n *ngIf=\"customFields.length\"\r\n [title]=\"'common.custom-fields' | translate\"\r\n >\r\n <vdr-tabbed-custom-fields\r\n entityName=\"StockLocation\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\r\n ></vdr-tabbed-custom-fields>\r\n </vdr-card>\r\n <vdr-custom-detail-component-host\r\n locationId=\"stock-location-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n </vdr-page-block>\r\n </vdr-page-detail-layout>\r\n</form>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormBuilder, Validators } from '@angular/forms';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n CreateStockLocationDocument,\r\n CreateStockLocationInput,\r\n DataService,\r\n getCustomFieldsDefaults,\r\n GetStockLocationDetailDocument,\r\n NotificationService,\r\n StockLocationDetailFragment,\r\n TypedBaseDetailComponent,\r\n UpdateStockLocationDocument,\r\n UpdateStockLocationInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { gql } from 'apollo-angular';\r\nimport { mergeMap, take } from 'rxjs/operators';\r\n\r\nconst STOCK_LOCATION_DETAIL_FRAGMENT = gql`\r\n fragment StockLocationDetail on StockLocation {\r\n id\r\n createdAt\r\n updatedAt\r\n name\r\n description\r\n }\r\n`;\r\n\r\nexport const GET_STOCK_LOCATION_DETAIL = gql`\r\n query GetStockLocationDetail($id: ID!) {\r\n stockLocation(id: $id) {\r\n ...StockLocationDetail\r\n }\r\n }\r\n ${STOCK_LOCATION_DETAIL_FRAGMENT}\r\n`;\r\n\r\nexport const CREATE_STOCK_LOCATION = gql`\r\n mutation CreateStockLocation($input: CreateStockLocationInput!) {\r\n createStockLocation(input: $input) {\r\n ...StockLocationDetail\r\n }\r\n }\r\n ${STOCK_LOCATION_DETAIL_FRAGMENT}\r\n`;\r\n\r\nexport const UPDATE_STOCK_LOCATION = gql`\r\n mutation UpdateStockLocation($input: UpdateStockLocationInput!) {\r\n updateStockLocation(input: $input) {\r\n ...StockLocationDetail\r\n }\r\n }\r\n ${STOCK_LOCATION_DETAIL_FRAGMENT}\r\n`;\r\n\r\n@Component({\r\n selector: 'vdr-stock-location-detail',\r\n templateUrl: './stock-location-detail.component.html',\r\n styleUrls: ['./stock-location-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class StockLocationDetailComponent\r\n extends TypedBaseDetailComponent<typeof GetStockLocationDetailDocument, 'stockLocation'>\r\n implements OnInit, OnDestroy\r\n{\r\n customFields = this.getCustomFieldConfig('StockLocation');\r\n detailForm = this.formBuilder.group({\r\n name: ['', Validators.required],\r\n description: [''],\r\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),\r\n });\r\n\r\n constructor(\r\n private changeDetector: ChangeDetectorRef,\r\n protected dataService: DataService,\r\n private formBuilder: FormBuilder,\r\n private notificationService: NotificationService,\r\n ) {\r\n super();\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 create() {\r\n if (!this.detailForm.dirty) {\r\n return;\r\n }\r\n const { name, description, customFields } = this.detailForm.value;\r\n if (!name) {\r\n return;\r\n }\r\n const input = {\r\n name,\r\n description,\r\n customFields,\r\n } satisfies CreateStockLocationInput;\r\n this.dataService.mutate(CreateStockLocationDocument, { input }).subscribe(\r\n data => {\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'StockLocation',\r\n });\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n this.router.navigate(['../', data.createStockLocation.id], { relativeTo: this.route });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-create-error'), {\r\n entity: 'StockLocation',\r\n });\r\n },\r\n );\r\n }\r\n\r\n save() {\r\n if (!this.detailForm.dirty) {\r\n return;\r\n }\r\n const formValue = this.detailForm.value;\r\n this.entity$\r\n .pipe(\r\n take(1),\r\n mergeMap(taxRate => {\r\n const input = {\r\n id: taxRate.id,\r\n name: formValue.name,\r\n description: formValue.description,\r\n customFields: formValue.customFields,\r\n } satisfies UpdateStockLocationInput;\r\n return this.dataService.mutate(UpdateStockLocationDocument, { input });\r\n }),\r\n )\r\n .subscribe(\r\n data => {\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'StockLocation',\r\n });\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'StockLocation',\r\n });\r\n },\r\n );\r\n }\r\n\r\n /**\r\n * Update the form values when the entity changes.\r\n */\r\n protected setFormValues(entity: StockLocationDetailFragment): void {\r\n this.detailForm.patchValue({\r\n name: entity.name,\r\n description: entity.description,\r\n });\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","import {\r\n AssignStockLocationsToChannelDocument,\r\n createBulkAssignToChannelAction,\r\n createBulkDeleteAction,\r\n createBulkRemoveFromChannelAction,\r\n DeleteStockLocationsDocument,\r\n DeletionResult,\r\n GetStockLocationListQuery,\r\n ItemOf,\r\n Permission,\r\n RemoveStockLocationsFromChannelDocument,\r\n} from '@vendure/admin-ui/core';\r\nimport { gql } from 'apollo-angular';\r\nimport { map } from 'rxjs/operators';\r\n\r\nconst DELETE_STOCK_LOCATIONS = gql`\r\n mutation DeleteStockLocations($input: [DeleteStockLocationInput!]!) {\r\n deleteStockLocations(input: $input) {\r\n result\r\n message\r\n }\r\n }\r\n`;\r\n\r\nconst ASSIGN_STOCK_LOCATIONS_TO_CHANNEL = gql`\r\n mutation AssignStockLocationsToChannel($input: AssignStockLocationsToChannelInput!) {\r\n assignStockLocationsToChannel(input: $input) {\r\n id\r\n name\r\n }\r\n }\r\n`;\r\n\r\nconst REMOVE_STOCK_LOCATIONS_FROM_CHANNEL = gql`\r\n mutation RemoveStockLocationsFromChannel($input: RemoveStockLocationsFromChannelInput!) {\r\n removeStockLocationsFromChannel(input: $input) {\r\n id\r\n name\r\n }\r\n }\r\n`;\r\n\r\nexport const deleteStockLocationsBulkAction = createBulkDeleteAction<\r\n ItemOf<GetStockLocationListQuery, 'stockLocations'>\r\n>({\r\n location: 'stock-location-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.DeleteStockLocation) ||\r\n userPermissions.includes(Permission.DeleteCatalog),\r\n getItemName: item => item.name,\r\n bulkDelete: (dataService, ids) =>\r\n dataService\r\n .mutate(DeleteStockLocationsDocument, {\r\n input: ids.map(id => ({ id })),\r\n })\r\n .pipe(map(res => res.deleteStockLocations)),\r\n shouldRetryItem: response => response.result === DeletionResult.NOT_DELETED,\r\n});\r\n\r\nexport const assignStockLocationsToChannelBulkAction = createBulkAssignToChannelAction<\r\n ItemOf<GetStockLocationListQuery, 'stockLocations'>\r\n>({\r\n location: 'stock-location-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateCatalog) ||\r\n userPermissions.includes(Permission.UpdateStockLocation),\r\n getItemName: item => item.name,\r\n bulkAssignToChannel: (dataService, stockLocationIds, channelId) =>\r\n dataService\r\n .mutate(AssignStockLocationsToChannelDocument, {\r\n input: {\r\n channelId,\r\n stockLocationIds,\r\n },\r\n })\r\n .pipe(map(res => res.assignStockLocationsToChannel)),\r\n});\r\n\r\nexport const removeStockLocationsFromChannelBulkAction = createBulkRemoveFromChannelAction<\r\n ItemOf<GetStockLocationListQuery, 'stockLocations'>\r\n>({\r\n location: 'stock-location-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.DeleteCatalog) ||\r\n userPermissions.includes(Permission.DeleteStockLocation),\r\n getItemName: item => item.name,\r\n bulkRemoveFromChannel: (dataService, stockLocationIds, channelId) =>\r\n dataService\r\n .mutate(RemoveStockLocationsFromChannelDocument, {\r\n input: {\r\n channelId,\r\n stockLocationIds,\r\n },\r\n })\r\n .pipe(map(res => res.removeStockLocationsFromChannel)),\r\n});\r\n","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left> </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"stock-location-list\"></vdr-action-bar-items>\r\n <a\r\n class=\"button primary\"\r\n *vdrIfPermissions=\"['CreateStockLocation']\"\r\n [routerLink]=\"['./', 'create']\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.create-new-stock-location' | translate }}\r\n </a>\r\n </vdr-ab-right>\r\n </vdr-action-bar>\r\n</vdr-page-block>\r\n<vdr-data-table-2\r\n class=\"mt-2\"\r\n id=\"stock-location-list\"\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n [filters]=\"filters\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n>\r\n <vdr-bulk-action-menu\r\n locationId=\"stock-location-list\"\r\n [hostComponent]=\"this\"\r\n [selectionManager]=\"selectionManager\"\r\n />\r\n <vdr-dt2-search\r\n [searchTermControl]=\"searchTermControl\"\r\n [searchTermPlaceholder]=\"'catalog.filter-by-name' | translate\"\r\n />\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\" [sort]=\"sorts.get('id')\">\r\n <ng-template let-stockLocation=\"item\">\r\n {{ stockLocation.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.created-at' | translate\" id=\"created-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('createdAt')\"\r\n >\r\n <ng-template let-stockLocation=\"item\">\r\n {{ stockLocation.createdAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.updated-at' | translate\" id=\"updated-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('updatedAt')\"\r\n >\r\n <ng-template let-stockLocation=\"item\">\r\n {{ stockLocation.updatedAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.name' | translate\" id=\"name\" [optional]=\"false\" [sort]=\"sorts.get('name')\">\r\n <ng-template let-stockLocation=\"item\">\r\n <a class=\"button-ghost\" [routerLink]=\"['./', stockLocation.id]\"\r\n ><span>{{ stockLocation.name }}</span\r\n ><clr-icon shape=\"arrow right\"\r\n /></a>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.description' | translate\" id=\"description\" [sort]=\"sorts.get('description')\">\r\n <ng-template let-stockLocation=\"item\">\r\n <div class=\"description\" [innerHTML]=\"stockLocation.description\"></div>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-custom-field-column\r\n *ngFor=\"let field of customFields\"\r\n [customField]=\"field\"\r\n [sorts]=\"sorts\" />\r\n</vdr-data-table-2>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport { GetStockLocationListDocument, TypedBaseListComponent } from '@vendure/admin-ui/core';\r\nimport { gql } from 'apollo-angular';\r\n\r\nexport const GET_STOCK_LOCATION_LIST = gql`\r\n query GetStockLocationList($options: StockLocationListOptions) {\r\n stockLocations(options: $options) {\r\n items {\r\n ...StockLocationListItem\r\n }\r\n totalItems\r\n }\r\n }\r\n fragment StockLocationListItem on StockLocation {\r\n id\r\n createdAt\r\n updatedAt\r\n name\r\n description\r\n }\r\n`;\r\n\r\n@Component({\r\n selector: 'vdr-stock-location-list',\r\n templateUrl: './stock-location-list.component.html',\r\n styleUrls: ['./stock-location-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class StockLocationListComponent\r\n extends TypedBaseListComponent<typeof GetStockLocationListDocument, 'stockLocations'>\r\n implements OnInit\r\n{\r\n readonly customFields = this.getCustomFieldConfig('StockLocation');\r\n readonly filters = this.createFilterCollection()\r\n .addIdFilter()\r\n .addDateFilters()\r\n .addFilters([\r\n {\r\n name: 'enabled',\r\n type: { kind: 'text' },\r\n label: _('common.enabled'),\r\n filterField: 'name',\r\n },\r\n {\r\n name: 'sku',\r\n type: { kind: 'text' },\r\n label: _('catalog.sku'),\r\n filterField: 'description',\r\n },\r\n ])\r\n .addCustomFieldFilters(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n readonly sorts = this.createSortCollection()\r\n .addSorts([\r\n { name: 'id' },\r\n { name: 'createdAt' },\r\n { name: 'updatedAt' },\r\n { name: 'name' },\r\n { name: 'description' },\r\n ])\r\n .addCustomFieldSorts(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n constructor() {\r\n super();\r\n this.configure({\r\n document: GetStockLocationListDocument,\r\n getItems: data => data.stockLocations,\r\n setVariables: (skip, take) => ({\r\n options: {\r\n skip,\r\n take,\r\n filter: {\r\n name: {\r\n contains: this.searchTermControl.value,\r\n },\r\n ...this.filters.createFilterInput(),\r\n },\r\n sort: this.sorts.createSortInput(),\r\n },\r\n }),\r\n refreshListOnChanges: [this.sorts.valueChanges, this.filters.valueChanges],\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, OnInit } from '@angular/core';\r\nimport { UntypedFormControl, UntypedFormGroup } from '@angular/forms';\r\nimport {\r\n CustomFieldConfig,\r\n LanguageCode,\r\n ProductVariantFragment,\r\n UpdateProductOptionInput,\r\n createUpdatedTranslatable,\r\n Dialog,\r\n} from '@vendure/admin-ui/core';\r\n\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: UntypedFormGroup;\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 UntypedFormGroup({});\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 UntypedFormControl(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","import { NgModule } from '@angular/core';\r\nimport { RouterModule, ROUTES } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n AssetDetailQueryDocument,\r\n BulkActionRegistryService,\r\n CollectionDetailQueryDocument,\r\n detailComponentWithResolver,\r\n GetFacetDetailDocument,\r\n GetProductDetailDocument,\r\n GetProductVariantDetailDocument,\r\n GetStockLocationDetailDocument,\r\n PageService,\r\n SharedModule,\r\n} from '@vendure/admin-ui/core';\r\n\r\nimport { createRoutes } 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 { 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 { CollectionDataTableComponent } from './components/collection-data-table/collection-data-table.component';\r\nimport { CollectionDetailComponent } from './components/collection-detail/collection-detail.component';\r\nimport { CollectionBreadcrumbPipe } from './components/collection-list/collection-breadcrumb.pipe';\r\nimport {\r\n assignCollectionsToChannelBulkAction,\r\n deleteCollectionsBulkAction,\r\n moveCollectionsBulkAction,\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 { CreateProductOptionGroupDialogComponent } from './components/create-product-option-group-dialog/create-product-option-group-dialog.component';\r\nimport { CreateProductVariantDialogComponent } from './components/create-product-variant-dialog/create-product-variant-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 { MoveCollectionsDialogComponent } from './components/move-collections-dialog/move-collections-dialog.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 { ProductVariantDetailComponent } from './components/product-variant-detail/product-variant-detail.component';\r\nimport { ProductVariantListComponent } from './components/product-variant-list/product-variant-list.component';\r\nimport {\r\n assignProductVariantsToChannelBulkAction,\r\n removeProductVariantsFromChannelBulkAction,\r\n deleteProductVariantsBulkAction,\r\n} from './components/product-variant-list/product-variant-list-bulk-actions';\r\nimport { ProductVariantQuickJumpComponent } from './components/product-variant-quick-jump/product-variant-quick-jump.component';\r\nimport { ProductVariantsEditorComponent } from './components/product-variants-editor/product-variants-editor.component';\r\nimport { ProductVariantsTableComponent } from './components/product-variants-table/product-variants-table.component';\r\nimport { StockLocationDetailComponent } from './components/stock-location-detail/stock-location-detail.component';\r\nimport {\r\n assignStockLocationsToChannelBulkAction,\r\n deleteStockLocationsBulkAction,\r\n removeStockLocationsFromChannelBulkAction,\r\n} from './components/stock-location-list/stock-location-list-bulk-actions';\r\nimport { StockLocationListComponent } from './components/stock-location-list/stock-location-list.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 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 CollectionDataTableComponent,\r\n CollectionBreadcrumbPipe,\r\n MoveCollectionsDialogComponent,\r\n ProductVariantListComponent,\r\n ProductDetailComponent,\r\n ProductVariantDetailComponent,\r\n CreateProductVariantDialogComponent,\r\n CreateProductOptionGroupDialogComponent,\r\n ProductVariantQuickJumpComponent,\r\n StockLocationListComponent,\r\n];\r\n\r\n@NgModule({\r\n imports: [SharedModule, RouterModule.forChild([])],\r\n exports: [...CATALOG_COMPONENTS],\r\n declarations: [...CATALOG_COMPONENTS, StockLocationDetailComponent],\r\n providers: [\r\n {\r\n provide: ROUTES,\r\n useFactory: (pageService: PageService) => createRoutes(pageService),\r\n multi: true,\r\n deps: [PageService],\r\n },\r\n ],\r\n})\r\nexport class CatalogModule {\r\n constructor(\r\n private bulkActionRegistryService: BulkActionRegistryService,\r\n private pageService: PageService,\r\n ) {\r\n bulkActionRegistryService.registerBulkAction(assignFacetValuesToProductsBulkAction);\r\n bulkActionRegistryService.registerBulkAction(assignProductsToChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(assignProductVariantsToChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(removeProductsFromChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(removeProductVariantsFromChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(deleteProductsBulkAction);\r\n bulkActionRegistryService.registerBulkAction(deleteProductVariantsBulkAction);\r\n\r\n bulkActionRegistryService.registerBulkAction(assignFacetsToChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(removeFacetsFromChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(deleteFacetsBulkAction);\r\n\r\n bulkActionRegistryService.registerBulkAction(moveCollectionsBulkAction);\r\n bulkActionRegistryService.registerBulkAction(assignCollectionsToChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(removeCollectionsFromChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(deleteCollectionsBulkAction);\r\n\r\n bulkActionRegistryService.registerBulkAction(assignStockLocationsToChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(removeStockLocationsFromChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(deleteStockLocationsBulkAction);\r\n\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'product-list',\r\n tab: _('catalog.products'),\r\n route: '',\r\n component: ProductListComponent,\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'product-detail',\r\n tab: _('catalog.product'),\r\n route: '',\r\n component: detailComponentWithResolver({\r\n component: ProductDetailComponent,\r\n query: GetProductDetailDocument,\r\n entityKey: 'product',\r\n getBreadcrumbs: entity => [\r\n {\r\n label: entity ? entity.name : _('catalog.create-new-product'),\r\n link: [entity?.id],\r\n },\r\n ],\r\n }),\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'product-list',\r\n tab: _('catalog.product-variants'),\r\n route: 'variants',\r\n component: ProductVariantListComponent,\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'stock-location-detail',\r\n tab: _('catalog.stock-location'),\r\n route: '',\r\n component: detailComponentWithResolver({\r\n component: StockLocationDetailComponent,\r\n query: GetStockLocationDetailDocument,\r\n entityKey: 'stockLocation',\r\n getBreadcrumbs: entity => [\r\n {\r\n label: entity ? entity.name : _('catalog.create-new-stock-location'),\r\n link: [entity?.id],\r\n },\r\n ],\r\n }),\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'product-list',\r\n tab: _('catalog.stock-locations'),\r\n route: 'stock-locations',\r\n component: StockLocationListComponent,\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'product-variant-detail',\r\n tab: _('catalog.product-variants'),\r\n route: '',\r\n component: detailComponentWithResolver({\r\n component: ProductVariantDetailComponent,\r\n query: GetProductVariantDetailDocument,\r\n entityKey: 'productVariant',\r\n getBreadcrumbs: entity => [\r\n {\r\n label: `${entity?.product.name}`,\r\n link: ['/catalog', 'inventory', entity?.product.id],\r\n },\r\n {\r\n label: `${entity?.name} (${entity?.sku})`,\r\n link: ['variants', entity?.id],\r\n },\r\n ],\r\n }),\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'facet-list',\r\n tab: _('catalog.facets'),\r\n route: '',\r\n component: FacetListComponent,\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'facet-detail',\r\n tab: _('catalog.facet'),\r\n route: '',\r\n component: detailComponentWithResolver({\r\n component: FacetDetailComponent,\r\n query: GetFacetDetailDocument,\r\n entityKey: 'facet',\r\n getBreadcrumbs: entity => [\r\n {\r\n label: entity ? entity.name : _('catalog.create-new-facet'),\r\n link: [entity?.id],\r\n },\r\n ],\r\n }),\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'collection-list',\r\n tab: _('catalog.collections'),\r\n route: '',\r\n component: CollectionListComponent,\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'collection-detail',\r\n tab: _('catalog.collection'),\r\n route: '',\r\n component: detailComponentWithResolver({\r\n component: CollectionDetailComponent,\r\n query: CollectionDetailQueryDocument,\r\n entityKey: 'collection',\r\n getBreadcrumbs: entity => [\r\n {\r\n label: entity ? entity.name : _('catalog.create-new-collection'),\r\n link: [entity?.id],\r\n },\r\n ],\r\n }),\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'asset-list',\r\n tab: _('catalog.assets'),\r\n route: '',\r\n component: AssetListComponent,\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'asset-detail',\r\n tab: _('catalog.asset'),\r\n route: '',\r\n component: detailComponentWithResolver({\r\n component: AssetDetailComponent,\r\n query: AssetDetailQueryDocument,\r\n entityKey: 'asset',\r\n getBreadcrumbs: entity => [\r\n {\r\n label: `${entity?.name}`,\r\n link: [entity?.id],\r\n },\r\n ],\r\n }),\r\n });\r\n }\r\n}\r\n","import { gql } from 'apollo-angular';\r\n\r\nconst PRODUCT_LIST_QUERY_PRODUCT_FRAGMENT = gql`\r\n fragment ProductListQueryProductFragment on Product {\r\n id\r\n createdAt\r\n updatedAt\r\n enabled\r\n languageCode\r\n name\r\n slug\r\n featuredAsset {\r\n id\r\n createdAt\r\n updatedAt\r\n preview\r\n focalPoint {\r\n x\r\n y\r\n }\r\n }\r\n variantList {\r\n totalItems\r\n }\r\n }\r\n`;\r\n\r\nexport const PRODUCT_LIST_QUERY = gql`\r\n query ProductListQuery($options: ProductListOptions) {\r\n products(options: $options) {\r\n items {\r\n ...ProductListQueryProductFragment\r\n }\r\n totalItems\r\n }\r\n }\r\n ${PRODUCT_LIST_QUERY_PRODUCT_FRAGMENT}\r\n`;\r\n","import { ASSET_FRAGMENT, PRODUCT_OPTION_FRAGMENT } from '@vendure/admin-ui/core';\r\nimport { gql } from 'apollo-angular';\r\n\r\nexport const PRODUCT_VARIANT_DETAIL_QUERY_PRODUCT_VARIANT_FRAGMENT = gql`\r\n fragment ProductVariantDetailQueryProductVariantFragment on ProductVariant {\r\n id\r\n createdAt\r\n updatedAt\r\n enabled\r\n languageCode\r\n name\r\n price\r\n currencyCode\r\n prices {\r\n price\r\n currencyCode\r\n }\r\n priceWithTax\r\n stockOnHand\r\n stockAllocated\r\n trackInventory\r\n outOfStockThreshold\r\n useGlobalOutOfStockThreshold\r\n taxRateApplied {\r\n id\r\n name\r\n value\r\n }\r\n taxCategory {\r\n id\r\n name\r\n }\r\n sku\r\n options {\r\n ...ProductOption\r\n }\r\n stockLevels {\r\n id\r\n createdAt\r\n updatedAt\r\n stockOnHand\r\n stockAllocated\r\n stockLocationId\r\n stockLocation {\r\n id\r\n createdAt\r\n updatedAt\r\n name\r\n }\r\n }\r\n facetValues {\r\n id\r\n code\r\n name\r\n facet {\r\n id\r\n name\r\n }\r\n }\r\n featuredAsset {\r\n ...Asset\r\n }\r\n assets {\r\n ...Asset\r\n }\r\n translations {\r\n id\r\n languageCode\r\n name\r\n }\r\n channels {\r\n id\r\n code\r\n }\r\n product {\r\n id\r\n name\r\n optionGroups {\r\n id\r\n name\r\n code\r\n translations {\r\n id\r\n languageCode\r\n name\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport const PRODUCT_VARIANT_DETAIL_QUERY = gql`\r\n query GetProductVariantDetail($id: ID!) {\r\n productVariant(id: $id) {\r\n ...ProductVariantDetailQueryProductVariantFragment\r\n }\r\n stockLocations(options: { take: 100 }) {\r\n items {\r\n id\r\n createdAt\r\n updatedAt\r\n name\r\n description\r\n }\r\n }\r\n taxCategories(options: { take: 100 }) {\r\n items {\r\n id\r\n createdAt\r\n updatedAt\r\n name\r\n isDefault\r\n }\r\n totalItems\r\n }\r\n activeChannel {\r\n id\r\n availableCurrencyCodes\r\n defaultCurrencyCode\r\n }\r\n }\r\n ${PRODUCT_VARIANT_DETAIL_QUERY_PRODUCT_VARIANT_FRAGMENT}\r\n`;\r\n\r\nexport const PRODUCT_VARIANT_UPDATE_MUTATION = gql`\r\n mutation ProductVariantUpdateMutation($input: [UpdateProductVariantInput!]!) {\r\n updateProductVariants(input: $input) {\r\n ...ProductVariantDetailQueryProductVariantFragment\r\n }\r\n }\r\n ${PRODUCT_VARIANT_DETAIL_QUERY_PRODUCT_VARIANT_FRAGMENT}\r\n`;\r\n","import { ASSET_FRAGMENT } from '@vendure/admin-ui/core';\r\nimport { gql } from 'apollo-angular';\r\n\r\nconst PRODUCT_VARIANT_LIST_QUERY_PRODUCT_VARIANT_FRAGMENT = gql`\r\n fragment ProductVariantListQueryProductVariantFragment on ProductVariant {\r\n id\r\n createdAt\r\n updatedAt\r\n productId\r\n enabled\r\n languageCode\r\n name\r\n price\r\n currencyCode\r\n priceWithTax\r\n trackInventory\r\n outOfStockThreshold\r\n stockLevels {\r\n id\r\n createdAt\r\n updatedAt\r\n stockLocationId\r\n stockOnHand\r\n stockAllocated\r\n stockLocation {\r\n id\r\n createdAt\r\n updatedAt\r\n name\r\n }\r\n }\r\n useGlobalOutOfStockThreshold\r\n sku\r\n featuredAsset {\r\n ...Asset\r\n }\r\n }\r\n\r\n ${ASSET_FRAGMENT}\r\n`;\r\n\r\nexport const PRODUCT_VARIANT_LIST_QUERY = gql`\r\n query ProductVariantListQuery($options: ProductVariantListOptions!) {\r\n productVariants(options: $options) {\r\n items {\r\n ...ProductVariantListQueryProductVariantFragment\r\n }\r\n totalItems\r\n }\r\n }\r\n ${PRODUCT_VARIANT_LIST_QUERY_PRODUCT_VARIANT_FRAGMENT}\r\n`;\r\n"],"x_google_ignoreList":[54]}
|
|
1
|
+
{"version":3,"file":"280.d7210217b250418b.js","mappings":"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","names":["replaceLast","target","search","replace","lastIndex","lastIndexOf","substr","ProductDetailService","constructor","dataService","this","getTaxCategories","settings","mapSingle","data","taxCategories","items","pipe","shareReplay","createProductWithVariants","input","createVariantsConfig","languageCode","createProduct$","product","createProduct","nonEmptyOptionGroups","groups","filter","g","values","length","createOptionGroups$","createProductOptionGroups","forkJoin","mergeMap","optionGroups","map","optionGroup","addOptionGroupToProduct","productId","id","optionGroupId","of","variants","v","optionIds","optionValues","optionName","index","option","options","find","o","name","Error","og","reduce","flat","createProductVariants","stockLocationId","c","code","normalizeString","translations","createProductOptionGroup","variantData","notNullOrUndefined","join","price","sku","stockLevels","stockOnHand","stock","updateProduct","updateOptions","autoUpdate","productInput","variantsInput","updateOperations","updateVariantsInput","getProductVariantsForProduct","productVariants","push","productOldName","findTranslation","productNewName","variant","currentVariantName","variantInput","existingVariantInput","i","variantTranslation","updateProductVariants","updateProductOption","updateProductVariantNames$","oldOptionName","newOptionName","variantsToUpdate","includes","variantName","deleteProductVariant","switchMap","result","DeletionResult","DELETED","getProduct","single$","throwError","message","i0","i1","factory","ɵfac","providedIn","_r3","ctx_r2","save","ctx_r0","detailForm","pristine","invalid","ctx_r8","optionGroupCustomFields","optionGroup_r6","get","updatePermission","optionControl_r18","value","optionControl_r19","createdAt","optionControl_r20","updatedAt","optionControl_r21","ctx_r15","optionControl_r22","ctx_r17","optionCustomFields","optionControl_r23","$event","_r25","$implicit","ctx_r24","paginationSettings","currentPage","ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_ng_template_3_Template","ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_ng_template_6_Template","ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_ng_template_9_Template","ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_ng_template_12_Template","ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_ng_template_15_Template","ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_ng_template_18_Template","options_r11","ctx_r9","itemsPerPage","ProductOptionsEditorComponent_form_22_vdr_card_2_ng_container_11_Template","ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_Template","i_r7","ctx_r5","getOptions","ProductOptionsEditorComponent_form_22_vdr_card_2_Template","ctx_r1","getOptionGroups","ProductOptionsEditorComponent","BaseDetailComponent","route","router","serverConfigService","productDetailService","formBuilder","changeDetector","notificationService","super","autoUpdateVariantNames","Permission","UpdateCatalog","UpdateProduct","getCustomFieldConfig","ngOnInit","optionGroups$","snapshot","entity","tap","group","UntypedFormGroup","UntypedFormArray","init","controls","$product","combineLatest","entity$","languageCode$","take","optionGroupForm","dirty","optionGroupEntity","getUpdatedOptionGroup","updateProductOptionGroup","optionForm","getUpdatedOption","subscribe","markAsPristine","markForCheck","success","_","err","error","optionGroupFormGroup","createUpdatedTranslatable","translatable","updatedFields","customFieldConfig","defaultTranslation","optionFormGroup","setFormValues","groupsForm","groupTranslation","groupForm","setOptionGroupForm","setCustomFieldsForm","optionsForm","array","addControl","optionTranslation","setOptionForm","customFields","formGroup","currentTranslation","customValueFieldsGroup","hash","field","setCustomFieldFormValues","control","setValue","i2","i3","i4","selectors","features","decls","vars","consts","template","rf","ctx","setLanguage","ProductOptionsEditorComponent_button_20_Template","ProductOptionsEditorComponent_form_22_Template","availableLanguages$","cancel","ctx_r4","confirm","form","CreateProductOptionGroupDialogComponent","Validators","required","updateCode","nameControl","codeControl","resolveWith","CreateProductOptionGroupDialogComponent_ng_template_0_Template","CreateProductOptionGroupDialogComponent_ng_template_8_Template","optionGroup_r5","ctx_r3","existingVariant","_r7","ctx_r6","CreateProductVariantDialogComponent","record","currencyCode","FormControl","valueChanges","Object","every","entries","groupCode","optionId","groupId","getGroupIdFromCode","Number","getGroupCodeFromId","CreateProductVariantDialogComponent_ng_template_0_Template","CreateProductVariantDialogComponent_vdr_form_field_3_Template","CreateProductVariantDialogComponent_clr_alert_4_Template","CreateProductVariantDialogComponent_div_5_Template","CreateProductVariantDialogComponent_ng_template_16_Template","option_r3","_r8","ctx_r7","removeOption","i_r5","updateOption","cancelBubble","ctx_r11","editName","isLast_r4","lastSelected","locked","groupName","editingIndex","OptionValueInputComponent_div_1_vdr_chip_1_Template","OPTION_VALUE_INPUT_VALUE_ACCESSOR","provide","NG_VALUE_ACCESSOR","useExisting","forwardRef","OptionValueInputComponent","multi","formValue","add","EventEmitter","remove","edit","disabled","isFocussed","registerOnChange","fn","onChangeFn","registerOnTouched","onTouchFn","setDisabledState","isDisabled","writeValue","obj","focus","textArea","nativeElement","event","optionValue","nameInputs","setTimeout","newName","emit","handleKey","key","addOptionValue","preventDefault","removeLastOption","handleBlur","parseInputIntoOptions","unique","split","s","trim","viewQuery","ElementRef","_r12","_r1","OptionValueInputComponent_div_1_Template","group_r10","_r14","i_r11","addOption","ctx_r16","removeOptionGroup","isNew","variant_r18","variant_r19","variant_r20","variant_r21","variant_r22","optionGroup_r23","option_r29","_r33","variant_r25","item","ctx_r31","setOptionToAddToVariant","ctx_r35","addOptionToVariant","ctx_r28","optionsToAddToVariant","ProductVariantsEditorComponent_vdr_dt2_column_33_ng_template_1_vdr_chip_0_Template","ProductVariantsEditorComponent_vdr_dt2_column_33_ng_template_1_ng_template_1_Template","getOption","_r27","ProductVariantsEditorComponent_vdr_dt2_column_33_ng_template_1_Template","variant_r40","variant_r41","priceWithTax","variant_r42","_r44","ctx_r43","deleteVariant","GeneratedVariant","config","keys","ProductVariantsEditorComponent","modalService","formValueChanged","optionsChanged","searchTermControl","selectionManager","SelectionManager","multiSelect","itemsAreEqual","a","b","additiveMode","refresh$","Subject","paramMap","getDefaultUiLanguage","getActiveChannel","activeChannel","defaultCurrencyCode","product$","getProductVariantsOptions","parent","startWith","variants$","term","toLowerCase","totalItems$","p","allUsedOptionIds","allUsedOptionGroupIds","setItemsPerPage","setPageNumber","page","onFormChanged","variantInfo","enabled","canDeactivate","addOptionGroup","fromComponent","locals","EMPTY","next","usedByVariantsCount","dialog","title","body","translationVars","count","buttons","type","label","returnValue","val","removeOptionGroupFromProduct","force","__typename","addOptionToGroup","productOptionGroupId","createProductOption","deleteProductOption","variantId","response","createNewVariant","ProductVariantsEditorComponent_div_2_Template","ProductVariantsEditorComponent_ng_template_20_Template","ProductVariantsEditorComponent_ng_template_23_Template","ProductVariantsEditorComponent_ng_template_26_Template","ProductVariantsEditorComponent_ng_template_29_Template","ProductVariantsEditorComponent_ng_template_32_Template","ProductVariantsEditorComponent_vdr_dt2_column_33_Template","ProductVariantsEditorComponent_ng_template_37_Template","ProductVariantsEditorComponent_ng_template_40_Template","ProductVariantsEditorComponent_ng_template_43_Template","ProductVariantsResolver","BaseEntityResolver","mapStream","createRoutes","pageService","path","component","PageComponent","locationId","breadcrumb","children","getPageTabRoutes","link","CanDeactivateDetailGuard","resolve","inject","DataService","params","createResolveData","productOptionsEditorBreadcrumb","selectValues","selectedValues","ApplyFacetDialogComponent","ngAfterViewInit","selector","FacetValueSelectorComponent","ApplyFacetDialogComponent_ng_template_0_Template","ApplyFacetDialogComponent_ng_template_2_Template","_r2","ASSET_DETAIL_QUERY","gql","ASSET_FRAGMENT","TAG_FRAGMENT","AssetDetailComponent","TypedBaseDetailComponent","FormGroup","tags","getCustomFieldsDefaults","ngOnDestroy","destroy","onAssetChange","markAsDirty","updateAsset","t","AssetDetailComponent_button_5_Template","_c0","AssetListComponent","BaseListComponent","searchTerm$","BehaviorSubject","undefined","filterByTags$","uploading","setQueryFn","args","getAssetList","refetchOnChannelChange","assets","skip","searchTerm","contains","sort","SortOrder","DESC","tagsOperator","LogicalOperator","AND","paginationConfig$","itemsPerPage$","currentPage$","totalItems","debounceTime","takeUntil","destroy$","refresh","allTags$","getTagList","filesSelected","files","createAssets","finalize","successCount","deleteAssets","showModalAndDelete","r","assetIds","res","items$","_c1","_r10","previewAsset","featuredAsset","selectAssets","ctx_r13","AssetsComponent_div_0_img_2_Template","AssetsComponent_div_0_div_3_Template","AssetsComponent_div_0_ng_container_5_Template","AssetsComponent_div_0_div_6_Template","updatePermissions","_r20","ctx_r19","_r22","ctx_r21","_r24","ctx_r23","AssetsComponent_ng_template_1_img_1_Template","AssetsComponent_ng_template_1_div_2_Template","AssetsComponent_ng_template_1_ng_container_3_Template","AssetsComponent_ng_template_1_button_4_Template","_r29","dropListDropped","asset_r26","ctx_r30","setAsFeatured","ctx_r32","removeAsset","index_r27","ctx_r25","isFeatured","AssetsComponent_ng_template_3_div_1_Template","compact","AssetsComponent","assetsSetter","slice","change","AssetPickerDialogComponent","size","concat","emitChangeEvent","asset","AssetPreviewDialogComponent","closable","moveItemInArray","previousContainer","container","hostVars","hostBindings","AssetsComponent_div_0_Template","AssetsComponent_ng_template_1_Template","AssetsComponent_ng_template_3_Template","AssignProductsToChannelDialogComponent_ng_template_0_ng_container_0_Template","AssignProductsToChannelDialogComponent_ng_template_0_ng_template_1_Template","isProductVariantMode","selectedChannel","row_r9","pricePreview","ctx_r10","AssignProductsToChannelDialogComponent_tr_33_ng_template_7_Template","AssignProductsToChannelDialogComponent_tr_33_ng_template_8_Template","currentChannel","_r11","ctx_r14","_r18","assign","AssignProductsToChannelDialogComponent_ng_template_35_ng_template_4_Template","AssignProductsToChannelDialogComponent_ng_template_35_ng_template_5_Template","_r15","AssignProductsToChannelDialogComponent","productVariantIds","priceFactorControl","UntypedFormControl","selectedChannelIdControl","activeChannelId$","client","userStatus","activeChannelId","allChannels$","getChannels","channels","availableChannels","ids","selectChannel","variantsPreview$","from","getTopVariants","factor","channelIds","assignVariantsToChannel","channelId","priceFactor","channel","assignProductsToChannel","productIds","_this","_asyncToGenerator","lastValueFrom","getProductVariants","filterOperator","OR","in","AssignProductsToChannelDialogComponent_ng_template_0_Template","AssignProductsToChannelDialogComponent_ng_template_29_Template","AssignProductsToChannelDialogComponent_ng_template_30_Template","AssignProductsToChannelDialogComponent_tr_33_Template","AssignProductsToChannelDialogComponent_ng_template_35_Template","currentChannelIds","GET_PRODUCTS_WITH_FACET_VALUES_BY_IDS","GET_VARIANTS_WITH_FACET_VALUES_BY_IDS","UPDATE_PRODUCTS_BULK","UPDATE_VARIANTS_BULK","item_r6","facetValue_r10","_r13","removeFacetValue","BulkAddFacetValuesDialogComponent_table_7_tr_2_div_4_Template","BulkAddFacetValuesDialogComponent_table_7_tr_2_vdr_facet_value_chip_6_Template","facetValues","BulkAddFacetValuesDialogComponent_table_7_tr_2_Template","addFacetValues","facetValuesRemoved","BulkAddFacetValuesDialogComponent","changeDetectorRef","mode","state","fetchData$","query","products","subscription","unsubscribe","facetValueId","fv","selectedFacetValueIds","sv","mutate","facetValueIds","BulkAddFacetValuesDialogComponent_ng_template_0_Template","BulkAddFacetValuesDialogComponent_table_7_Template","BulkAddFacetValuesDialogComponent_ng_template_8_Template","BulkAddFacetValuesDialogComponent_ng_template_10_Template","variant_r6","variant_r7","variant_r8","variant_r9","variant_r10","CollectionContentsComponent","previewUpdatedFilters","filterTermControl","isLoading","collectionIdChange$","parentIdChange$","filterChanges$","inheritFiltersChanges$","contentsCurrentPage$","queryParamMap","qpm","distinctUntilChanged","contentsItemsPerPage$","perPage","filterTerm$","setContentsPageNumber","asObservable","inheritFilters","collection$","parentId","filterTerm","filters","filterClause","collection","previewCollectionVariants","catchError","getCollectionContents","contents$","contentsTotalItems$","ngOnChanges","changes","collectionId","currentValue","updatedFilters","complete","setParam","setContentsItemsPerPage","navigate","relativeTo","queryParams","n","queryParamsHandling","replaceUrl","contentQueries","dirIndex","TemplateRef","CollectionContentsComponent_ng_container_3_Template","CollectionContentsComponent_ng_template_14_Template","CollectionContentsComponent_ng_template_17_Template","CollectionContentsComponent_ng_template_20_Template","CollectionContentsComponent_ng_template_23_Template","CollectionContentsComponent_ng_template_26_Template","headerTemplate","onToggleAllClick","areAllCurrentItemsSelected","sort_r16","sortOrder","_r23","ngIf","toggleSortOrder","CollectionDataTableComponent_th_8_div_5_clr_icon_2_Template","CollectionDataTableComponent_th_8_div_5_clr_icon_3_Template","CollectionDataTableComponent_th_8_div_5_clr_icon_4_Template","CollectionDataTableComponent_th_8_div_5_div_5_Template","CollectionDataTableComponent_th_8_div_5_Template","column_r13","expand","align","heading","activeFilter_r29","ctx_r27","CollectionDataTableComponent_tr_13_ng_container_8_vdr_data_table_filters_2_Template","CollectionDataTableComponent_tr_13_ng_container_8_vdr_data_table_filters_3_Template","ctx_r26","activeFilters","_r31","toggleSearchFilterRow","CollectionDataTableComponent_tr_13_ng_container_6_Template","CollectionDataTableComponent_tr_13_ng_container_7_Template","CollectionDataTableComponent_tr_13_ng_container_8_Template","showSearchFilterRow","visibleSortedColumns","searchComponent","customSearchTemplate","_r9","item_r32","i_r33","emptyStateLabel","_r35","ctx_r34","itemsPerPageChange","_c2","currentStart","currentEnd","_r37","ctx_r36","pageChange","_r46","item_r38","ctx_r44","onRowClick","ctx_r41","activeIndex","absoluteIndex","isSelected","CollectionDataTableComponent_ng_template_23_td_3_ng_container_2_ng_container_1_Template","componentConfig_r52","_c3","injector","CollectionDataTableComponent_ng_template_23_td_3_ng_template_3_ng_container_0_Template","column_r48","_c4","depth_r39","CollectionDataTableComponent_ng_template_23_td_3_ng_container_2_Template","CollectionDataTableComponent_ng_template_23_td_3_ng_template_3_Template","ctx_r42","customComponents","_r50","CollectionDataTableComponent_ng_template_23_ng_container_5_ng_container_1_Template","subCollection_r59","CollectionDataTableComponent_ng_template_23_td_2_Template","CollectionDataTableComponent_ng_template_23_td_3_Template","CollectionDataTableComponent_ng_template_23_ng_container_5_Template","_c5","getSubcollections","CollectionDataTableComponent","DataTable2Component","localStorageService","dragDrop","changeOrder","dragRefs","sortPredicate","dropList","getSortedItems","subCollections","allCollections","subCollectionMatches","forEach","collectionRowList","removeItem","ref","toArray","dropContainer","_dragRef","_withDropContainer","_dropListRef","addItem","onDrop","isTopLevel","breadcrumbs","pageIndexOffset","parentIndex","findIndex","adjustedIndex","currentIndex","splice","previousIndex","adjustedPreviousIndex","CdkDropList","CdkDrag","CollectionDataTableComponent_vdr_data_table_filter_presets_0_Template","CollectionDataTableComponent_th_7_Template","CollectionDataTableComponent_th_8_Template","onColumnReorder","onColumnsReset","CollectionDataTableComponent_tr_13_Template","CollectionDataTableComponent_ng_container_15_Template","CollectionDataTableComponent_tr_18_Template","CollectionDataTableComponent_vdr_items_per_page_controls_20_Template","CollectionDataTableComponent_div_21_Template","CollectionDataTableComponent_vdr_pagination_controls_22_Template","CollectionDataTableComponent_ng_template_23_Template","disableSelect","selection","uiLanguage$","sortedColumns","_c7","trackByFn","_r17","create","ctx_r18","assetsChanged","CollectionDetailComponent_ng_template_11_button_0_Template","entity_r21","breadcrumb_r24","CollectionDetailComponent_vdr_page_block_28_li_3_a_1_Template","CollectionDetailComponent_vdr_page_block_28_li_3_a_2_Template","CollectionDetailComponent_vdr_page_block_28_li_3_ng_container_3_Template","isFirst_r25","isLast_r26","CollectionDetailComponent_vdr_page_block_28_li_3_Template","entity_r22","removeFilter","filter_r32","ctx_r12","getFilterDefinition","filter_r37","_r39","ctx_r38","addFilter","description","CollectionDetailComponent_div_64_button_9_Template","allFilters","_r42","toggleLivePreview","count_r40","tmp_1_0","tmp_3_0","livePreview","COLLECTION_DETAIL_QUERY","COLLECTION_FRAGMENT","CollectionDetailComponent","slug","unicodePatternValidator","visible","assetChanges","UpdateCollection","filterRemoved$","getCollectionFilters","collectionFilters","filtersFormArray","inheritFiltersControl","inheritFilters$","updatedFilters$","merge","statusChanges","touched","mapOperationsToInputs","_filter","arg","arguments","parentId$","pm","f","updateSlug","nameValue","slugControl","currentSlugIsEmpty","collectionFilter","filtersArray","argsHash","output","getConfigArgValue","removeAt","markAsTouched","getUpdatedCollection","isPrivate","createCollection","category","updateCollection","contentsComponent","set","JSON","stringify","patchValue","formArray","clear","featuredAssetId","operations","formValueOperations","j","encodeConfigArgValue","CollectionDetailComponent_button_9_Template","CollectionDetailComponent_ng_template_11_Template","CollectionDetailComponent_ng_container_23_Template","CollectionDetailComponent_ng_template_24_Template","CollectionDetailComponent_vdr_card_26_Template","CollectionDetailComponent_vdr_page_block_28_Template","CollectionDetailComponent_vdr_card_46_Template","CollectionDetailComponent_ng_container_59_Template","CollectionDetailComponent_ng_template_60_Template","CollectionDetailComponent_ng_container_63_Template","CollectionDetailComponent_div_64_Template","CollectionDetailComponent_ng_template_72_Template","isNew$","_r4","CollectionBreadcrumbPipe","transform","collection_r5","depth_r7","_r16","collection_r6","toggleExpanded","MoveCollectionsDialogComponent_ng_template_14_button_2_clr_icon_1_Template","MoveCollectionsDialogComponent_ng_template_14_button_2_clr_icon_2_Template","expandedIds","pure","MoveCollectionsDialogComponent_ng_template_14_clr_icon_1_Template","MoveCollectionsDialogComponent_ng_template_14_button_2_Template","MoveCollectionsDialogComponent_ng_template_14_button_3_Template","_r19","item_r26","MoveCollectionsDialogComponent_ng_template_17_ng_container_1_ng_container_1_div_1_Template","breadcrumbs_r22","MoveCollectionsDialogComponent_ng_template_17_ng_container_1_ng_container_1_Template","MoveCollectionsDialogComponent_ng_template_17_ng_container_1_span_2_Template","MoveCollectionsDialogComponent_ng_template_17_ng_container_1_Template","collection_r20","collection_r28","MoveCollectionsDialogComponent","i18nService","expandedIds$","getCollectionsResult","getCollections","topLevelOnly","refetch","rootCollectionId$","collections","rootCollectionId","translate","position","subCollections$","MoveCollectionsDialogComponent_ng_template_0_Template","MoveCollectionsDialogComponent_ng_template_11_Template","MoveCollectionsDialogComponent_ng_template_14_Template","MoveCollectionsDialogComponent_ng_template_17_Template","MoveCollectionsDialogComponent_ng_template_20_Template","deleteCollectionsBulkAction","createBulkDeleteAction","location","requiresPermission","userPermissions","DeleteCollection","DeleteCatalog","getItemName","bulkDelete","deleteCollections","moveCollectionsBulkAction","icon","onClick","hostComponent","clearSelection","ModalService","NotificationService","inputs","moveCollection","assignCollectionsToChannelBulkAction","createBulkAssignToChannelAction","bulkAssignToChannel","collectionIds","assignCollectionsToChannel","removeCollectionsFromChannelBulkAction","createBulkRemoveFromChannelAction","bulkRemoveFromChannel","removeCollectionsFromChannel","collection_r13","collection_r14","collection_r15","collection_r16","depth_r18","_r26","collection_r17","CollectionListComponent_ng_template_11_ng_template_24_button_2_clr_icon_1_Template","CollectionListComponent_ng_template_11_ng_template_24_button_2_clr_icon_2_Template","ctx_r20","CollectionListComponent_ng_template_11_ng_template_24_clr_icon_1_Template","CollectionListComponent_ng_template_11_ng_template_24_button_2_Template","item_r34","CollectionListComponent_ng_template_11_ng_template_27_ng_container_1_ng_container_1_div_1_Template","breadcrumbs_r30","CollectionListComponent_ng_template_11_ng_template_27_ng_container_1_ng_container_1_Template","CollectionListComponent_ng_template_11_ng_template_27_ng_container_1_span_2_Template","CollectionListComponent_ng_template_11_ng_template_27_ng_container_1_Template","collection_r36","CollectionListComponent_ng_template_11_ng_template_33_vdr_chip_0_Template","CollectionListComponent_ng_template_11_ng_template_33_vdr_chip_1_Template","collection_r37","collection_r40","customField_r41","sorts","_r43","ctx_r45","onRearrange","CollectionListComponent_ng_template_11_ng_template_12_Template","CollectionListComponent_ng_template_11_ng_template_15_Template","CollectionListComponent_ng_template_11_ng_template_18_Template","CollectionListComponent_ng_template_11_ng_template_21_Template","CollectionListComponent_ng_template_11_ng_template_24_Template","CollectionListComponent_ng_template_11_ng_template_27_Template","CollectionListComponent_ng_template_11_ng_template_30_Template","CollectionListComponent_ng_template_11_ng_template_33_Template","CollectionListComponent_ng_template_11_ng_template_36_Template","CollectionListComponent_ng_template_11_vdr_dt2_custom_field_column_37_Template","activeCollectionIndex$","ctx_r46","activeCollectionId$","CollectionListComponent_ng_template_12_ng_container_0_Template","CollectionListComponent","TypedBaseListComponent","createFilterCollection","addIdFilter","addDateFilters","kind","filterField","toFilterInput","eq","addCustomFieldFilters","connectToRoute","createSortCollection","defaultSort","addSort","addCustomFieldSorts","configure","document","GetCollectionListDocument","getItems","setVariables","_take","createFilterInput","createSortInput","refreshListOnChanges","activeCollectionTitle$","match","closeContents","contents","setContentLanguage","expanded","CollectionListComponent_a_8_Template","CollectionListComponent_ng_template_11_Template","CollectionListComponent_ng_template_12_Template","contentLanguage$","CollectionTreeService","allMoveListItems","_rearrange$","_delete$","rearrange$","delete$","setCollectionTree","tree","collectionTree","resetMoveList","getMoveListItems","calculateAllMoveListItems","ancestorIdPath","has","newParentId","onMove","onDelete","visit","node","parentPath","child","Set","collection_r2","CollectionTreeNodeComponent_div_3_button_5_clr_icon_1_Template","CollectionTreeNodeComponent_div_3_button_5_clr_icon_2_Template","expandAll","item_r19","move","hasUpdatePermission$","activeCollectionId","toggleSelection","CollectionTreeNodeComponent_div_3_button_5_Template","CollectionTreeNodeComponent_div_3_ng_template_6_Template","CollectionTreeNodeComponent_div_3_vdr_chip_10_Template","CollectionTreeNodeComponent_div_3_div_19_Template","CollectionTreeNodeComponent_div_3_a_24_Template","restoredCtx","i_r3","moveUp","moveDown","CollectionTreeNodeComponent_div_3_button_39_Template","ctx_r29","delete","CollectionTreeNodeComponent_div_3_vdr_collection_tree_node_46_Template","depth","_r5","_c6","moveListItems","hasDeletePermission$","CollectionTreeNodeComponent","collectionTreeService","parentName","permissions$","permissions","perms","selectionChanges$","expandAllChange","previousValue","drop","arrayToTree","nodes","currentState","topLevelNodes","mappedArr","currentStateMap","treeToMap","nodeMap","Map","hasOwnProperty","mappedElem","CollectionTreeNodeComponent_div_3_Template","i5","i14","styles","changeDetection","CollectionTreeComponent","rearrange","deleteCollection","variant_r3","outputs","CollectionTreeComponent_vdr_collection_tree_node_0_Template","ConfirmVariantDeletionDialogComponent","ConfirmVariantDeletionDialogComponent_ng_template_0_Template","ConfirmVariantDeletionDialogComponent_li_4_Template","ConfirmVariantDeletionDialogComponent_ng_template_5_Template","FacetDetailComponent_ng_template_11_button_0_Template","entity_r14","customValueFields","i_r20","updateValueCode","FacetDetailComponent_vdr_card_42_table_2_tr_13_td_8_Template","deleteFacetValue","value_r19","FacetDetailComponent_vdr_card_42_table_2_ng_container_10_Template","FacetDetailComponent_vdr_card_42_table_2_tr_13_Template","addFacetValue","FacetDetailComponent_vdr_card_42_table_2_Template","FacetDetailComponent_vdr_card_42_button_4_Template","getValuesFormArray","FACET_DETAIL_QUERY","FACET_WITH_VALUES_FRAGMENT","FacetDetailComponent","facet","UpdateFacet","currentCode","customValueFieldIsSet","valuesFormArray","valueGroup","newValue","fieldDef","insert","facetForm","newFacet","getUpdatedFacet","createFacet","valuesArray","updateFacet","createdValues","getCreatedFacetValues","createFacetValues","GetFacetDetailDocument","updatedValues","getUpdatedFacetValues","updateFacetValues","deleted","deleteFacetValues","currentValuesFormArray","valueTranslation","valueControl","fieldValue","facetFormGroup","facetId","dirtyValues","formRow","toString","dirtyValueValues","FacetDetailComponent_button_9_Template","FacetDetailComponent_ng_template_11_Template","FacetDetailComponent_ng_container_23_Template","FacetDetailComponent_ng_template_24_Template","FacetDetailComponent_vdr_page_entity_info_27_Template","FacetDetailComponent_vdr_card_40_Template","FacetDetailComponent_vdr_card_42_Template","deleteFacetsBulkAction","DeleteFacet","shouldRetryItem","retrying","deleteFacets","assignFacetsToChannelBulkAction","facetIds","assignFacetsToChannel","removeFacetsFromChannelBulkAction","removeFacetsFromChannel","isErrorResult","removeFacetsFromChannelBulkAction2","getTranslationVars","getChannelCodeFromUserStatus","iconClass","isVisible","currentChannelIsNotDefault","res2","removedCount","errors","errorIds","result2","notRemovedCount","then","channelCode","facet_r9","facet_r10","facet_r11","facet_r12","facet_r13","FacetListComponent_ng_template_34_vdr_chip_0_Template","FacetListComponent_ng_template_34_vdr_chip_1_Template","facet_r14","value_r21","facet_r17","valueList","initialLimit","toggleDisplayLimit","FacetListComponent_ng_template_37_button_4_ng_container_1_Template","FacetListComponent_ng_template_37_button_4_ng_template_2_Template","displayLimit","FacetListComponent_ng_template_37_vdr_facet_value_chip_1_Template","FacetListComponent_ng_template_37_vdr_chip_3_Template","FacetListComponent_ng_template_37_button_4_Template","customField_r31","FACET_LIST_QUERY","FACET_WITH_VALUE_LIST_FRAGMENT","FacetListComponent","GetFacetListDocument","facets","FacetListComponent_a_8_Template","FacetListComponent_ng_template_19_Template","FacetListComponent_ng_template_22_Template","FacetListComponent_ng_template_25_Template","FacetListComponent_ng_template_28_Template","FacetListComponent_ng_template_31_Template","FacetListComponent_ng_template_34_Template","FacetListComponent_ng_template_37_Template","FacetListComponent_vdr_dt2_custom_field_column_38_Template","group_r2","_r6","handleEnter","generateVariants","location_r17","selectedStockLocationId","GenerateProductVariantsComponent_ng_container_5_vdr_form_field_3_option_3_Template","stockLocations_r12","variant_r24","GenerateProductVariantsComponent_ng_container_5_div_4_tr_15_td_1_Template","GenerateProductVariantsComponent_ng_container_5_div_4_tr_15_td_2_Template","variantFormValues","GenerateProductVariantsComponent_ng_container_5_div_4_th_4_Template","GenerateProductVariantsComponent_ng_container_5_div_4_th_5_Template","GenerateProductVariantsComponent_ng_container_5_div_4_tr_15_Template","GenerateProductVariantsComponent_ng_container_5_clr_alert_1_Template","GenerateProductVariantsComponent_ng_container_5_vdr_form_field_3_Template","GenerateProductVariantsComponent_ng_container_5_div_4_Template","DEFAULT_VARIANT_CODE","GenerateProductVariantsComponent","variantsChange","stockLocations$","GetStockLocationListDocument","stockLocations","groupNameInputs","sum","generateAllCombinations","nonNullable","copyFromDefault","onFormChange","copyValuesToPristine","optionValueInputComponent","stopPropagation","formControl","correspondingFormControl","emitEvent","variantsToCreate","prop","GenerateProductVariantsComponent_div_0_Template","GenerateProductVariantsComponent_ng_container_5_Template","switchMapTo","innerObservable","resultSelector","isFunction","variant_r14","variant_r15","variant_r16","asset_r21","ProductVariantListComponent_ng_template_20_img_1_Template","ProductVariantListComponent_ng_template_20_ng_template_2_Template","variant_r17","variant_r23","ProductVariantListComponent_ng_template_29_vdr_chip_0_Template","ProductVariantListComponent_ng_template_29_vdr_chip_1_Template","variant_r27","variant_r28","stockLevel_r31","stockAllocated","ProductVariantListComponent_ng_template_38_vdr_chip_0_span_4_Template","stockLocation","ProductVariantListComponent_ng_template_38_vdr_chip_0_Template","variant_r29","field_r34","ProductVariantListComponent","hideLanguageSelect","addFilters","inputType","addSorts","ProductVariantListQueryDocument","ProductVariantListComponent_vdr_page_block_0_Template","ProductVariantListComponent_ng_template_11_Template","ProductVariantListComponent_ng_template_14_Template","ProductVariantListComponent_ng_template_17_Template","ProductVariantListComponent_ng_template_20_Template","ProductVariantListComponent_ng_template_23_Template","ProductVariantListComponent_ng_template_26_Template","ProductVariantListComponent_ng_template_29_Template","ProductVariantListComponent_ng_template_32_Template","ProductVariantListComponent_ng_template_35_Template","ProductVariantListComponent_ng_template_38_Template","ProductVariantListComponent_vdr_dt2_custom_field_column_39_Template","ProductDetailComponent_ng_template_12_button_0_Template","channel_r23","removeFromChannel","ProductDetailComponent_ng_container_21_vdr_card_1_vdr_form_item_2_ng_container_3_vdr_chip_1_Template","ctx_r22","isDefaultChannel","ProductDetailComponent_ng_container_21_vdr_card_1_vdr_form_item_2_ng_container_3_Template","_r30","assignToChannel","productChannels$","ProductDetailComponent_ng_container_21_vdr_card_1_vdr_form_item_2_Template","ProductDetailComponent_ng_container_21_vdr_card_1_Template","optionGroup_r33","ProductDetailComponent_vdr_card_23_vdr_chip_3_Template","ProductDetailComponent_vdr_card_23_a_6_Template","facetValue_r34","_r36","removeProductFacetValue","_r38","ctx_r37","selectProductFacetValue","entity_r39","_r41","ctx_r40","GET_PRODUCT_DETAIL","PRODUCT_DETAIL_FRAGMENT","ProductDetailComponent","productFacetValues$","formFacetValueIdChanges$","getFacetValues","facetValues$","DEFAULT_CHANNEL_CODE","removeProductsFromChannel","assignVariantToChannel","removeVariantFromChannel","removeVariantsFromChannel","displayFacetValueModal","productGroup","currentFacetValueIds","newProduct","getUpdatedProduct","console","updateSlugAfterSave","productFormGroup","results","firstResult","isUpdateMutation","ProductDetailComponent_button_10_Template","ProductDetailComponent_ng_template_12_Template","ProductDetailComponent_clr_toggle_wrapper_20_Template","ProductDetailComponent_ng_container_21_Template","ProductDetailComponent_vdr_card_23_Template","ProductDetailComponent_vdr_facet_value_chip_27_Template","ProductDetailComponent_button_30_Template","ProductDetailComponent_vdr_card_31_Template","ProductDetailComponent_div_42_Template","ProductDetailComponent_vdr_card_54_Template","ProductDetailComponent_div_62_Template","ProductDetailComponent_ng_template_64_Template","ProductDetailComponent_div_66_Template","tmp_16_0","deleteProductsBulkAction","DeleteProduct","deleteProducts","assignProductsToChannelBulkAction","isMultiChannel","removeProductsFromChannelBulkAction","assignFacetValuesToProductsBulkAction","product_r10","product_r11","product_r12","asset_r17","ProductListComponent_ng_template_36_img_1_Template","ProductListComponent_ng_template_36_ng_template_2_Template","product_r13","product_r18","product_r19","ProductListComponent_ng_template_45_vdr_chip_0_Template","ProductListComponent_ng_template_45_vdr_chip_1_Template","product_r20","product_r23","variantList","customField_r24","ProductListComponent","jobQueueService","pendingSearchIndexUpdates","FacetValueFormInputComponent","serializeValue","deserializeValue","getLabel","ProductListQueryDocument","rebuildSearchIndex","reindex","info","addJob","job","JobState","COMPLETED","time","Intl","NumberFormat","format","duration","indexedItemCount","deleteProduct","delay","ProductListComponent_a_8_Template","ProductListComponent_ng_template_27_Template","ProductListComponent_ng_template_30_Template","ProductListComponent_ng_template_33_Template","ProductListComponent_ng_template_36_Template","ProductListComponent_ng_template_39_Template","ProductListComponent_ng_template_42_Template","ProductListComponent_ng_template_45_Template","ProductListComponent_ng_template_48_Template","ProductListComponent_vdr_dt2_custom_field_column_49_Template","taxRate$","grossPrice$","VariantPriceDetailComponent","priceChange$","taxCategoryIdChange$","taxRates$","getTaxRatesSimple","taxRates","activeChannel$","taxCategoryId","defaultTaxZone","applicableRate","taxRate","zone","Math","round","item_r2","selectedVariantId","onSelect","ProductVariantQuickJumpComponent_ng_select_0_ng_template_3_Template","searchFn","priceIncludesTax","VariantPriceDetailComponent_div_3_Template","VariantPriceDetailComponent_div_4_Template","ProductVariantQuickJumpComponent","GetProductVariantsQuickJumpDocument","ProductVariantQuickJumpComponent_ng_select_0_Template","tmp_0_0","availableLanguages_r3","ProductVariantDetailComponent_ng_container_4_vdr_language_selector_1_Template","stockLevelsForm","pricesForm","optionGroupCode","option_r24","ProductVariantDetailComponent_form_10_vdr_card_7_vdr_chip_3_Template","ProductVariantDetailComponent_form_10_vdr_card_7_a_6_Template","facetValue_r26","_r28","selectFacetValue","entity_r31","taxCategory_r32","price_r33","toggleDeletePrice","channelDefaultCurrencyCode","ProductVariantDetailComponent_form_10_div_43_div_7_Template","channelPriceIncludesTax$","currencyCode_r42","addPriceInCurrency","ProductVariantDetailComponent_form_10_ng_container_44_div_1_button_8_Template","unusedCurrencyCodes_r39","ProductVariantDetailComponent_form_10_ng_container_44_div_1_Template","stockLevel_r46","tmp_2_0","tmp_5_0","tmp_6_0","stockLocation_r50","_r52","ctx_r51","addStockLocation","ProductVariantDetailComponent_form_10_ng_container_75_div_1_button_8_Template","unusedStockLocations_r47","ProductVariantDetailComponent_form_10_ng_container_75_div_1_Template","ProductVariantDetailComponent_form_10_clr_toggle_wrapper_6_Template","ProductVariantDetailComponent_form_10_vdr_card_7_Template","ProductVariantDetailComponent_form_10_vdr_facet_value_chip_11_Template","ProductVariantDetailComponent_form_10_button_14_Template","ProductVariantDetailComponent_form_10_vdr_page_entity_info_16_Template","ProductVariantDetailComponent_form_10_vdr_card_30_Template","_r55","ctx_r54","ProductVariantDetailComponent_form_10_option_41_Template","ProductVariantDetailComponent_form_10_div_43_Template","ProductVariantDetailComponent_form_10_ng_container_44_Template","ProductVariantDetailComponent_form_10_div_74_Template","ProductVariantDetailComponent_form_10_ng_container_75_Template","taxCategories$","unusedCurrencyCodes$","GlobalFlag","TRUE","FALSE","INHERIT","tmp_37_0","inventoryIsNotTracked","globalOutOfStockThreshold","unusedStockLocation$","ProductVariantDetailComponent","customOptionFields","useGlobalOutOfStockThreshold","outOfStockThreshold","trackInventory","getGlobalSettings","globalSettings","globalTrackInventory","result$","availableCurrencyCodes$","availableCurrencyCodes","prices","currencyCodes","usedIds","l","pricesIncludeTax","stockLevels$","deleteFormControl","stockLocationName","pick","getUpdatedVariant","ProductVariantUpdateMutationDocument","taxCategory","stockLevel","variantFormGroup","ProductVariantDetailComponent_ng_container_4_Template","ProductVariantDetailComponent_button_9_Template","ProductVariantDetailComponent_form_10_Template","assignProductVariantsToChannelBulkAction","removeProductVariantsFromChannelBulkAction","removeProductVariantsFromChannel","deleteProductVariantsBulkAction","deleteProductVariants","optionGroup_r2","featuredAsset_r13","optionGroupName","option_r14","formGroup_r6","ProductVariantsTableComponent_tr_22_ng_container_1_img_4_Template","ProductVariantsTableComponent_tr_22_ng_container_1_ng_template_5_Template","ProductVariantsTableComponent_tr_22_ng_container_1_ng_container_17_Template","ProductVariantsTableComponent_tr_22_ng_container_1_vdr_currency_input_21_Template","ProductVariantsTableComponent_tr_22_ng_container_1_vdr_currency_input_22_Template","getFeaturedAsset","channelPriceIncludesTax","ProductVariantsTableComponent_tr_22_ng_container_1_Template","formGroupMap","ProductVariantsTableComponent","buildFormGroupMap","pendingAssetChanges","controlGroup","StockLocationDetailComponent_ng_template_7_button_0_Template","entity_r10","paginationConfig","ProductVariantsTableComponent_ng_container_10_Template","ProductVariantsTableComponent_tr_22_Template","STOCK_LOCATION_DETAIL_FRAGMENT","GET_STOCK_LOCATION_DETAIL","CREATE_STOCK_LOCATION","UPDATE_STOCK_LOCATION","StockLocationDetailComponent","CreateStockLocationDocument","createStockLocation","UpdateStockLocationDocument","StockLocationDetailComponent_button_5_Template","StockLocationDetailComponent_ng_template_7_Template","StockLocationDetailComponent_vdr_card_12_Template","StockLocationDetailComponent_vdr_card_26_Template","deleteStockLocationsBulkAction","DeleteStockLocation","DeleteStockLocationsDocument","deleteStockLocations","NOT_DELETED","assignStockLocationsToChannelBulkAction","UpdateStockLocation","stockLocationIds","AssignStockLocationsToChannelDocument","assignStockLocationsToChannel","removeStockLocationsFromChannelBulkAction","RemoveStockLocationsFromChannelDocument","removeStockLocationsFromChannel","stockLocation_r7","stockLocation_r8","stockLocation_r9","stockLocation_r10","stockLocation_r11","field_r12","GET_STOCK_LOCATION_LIST","StockLocationListComponent","StockLocationListComponent_a_5_Template","StockLocationListComponent_ng_template_16_Template","StockLocationListComponent_ng_template_19_Template","StockLocationListComponent_ng_template_22_Template","StockLocationListComponent_ng_template_25_Template","StockLocationListComponent_ng_template_28_Template","StockLocationListComponent_vdr_dt2_custom_field_column_29_Template","customFieldsForm","update","UpdateProductOptionDialogComponent","updateVariantName","codeInputTouched","productOption","activeLanguage","cfCurrentTranslation","UpdateProductOptionDialogComponent_ng_template_0_Template","UpdateProductOptionDialogComponent_section_14_Template","UpdateProductOptionDialogComponent_ng_template_15_Template","CatalogModule","bulkActionRegistryService","registerBulkAction","registerPageTab","priority","tab","detailComponentWithResolver","GetProductDetailDocument","entityKey","getBreadcrumbs","GetStockLocationDetailDocument","GetProductVariantDetailDocument","CollectionDetailQueryDocument","AssetDetailQueryDocument","ROUTES","useFactory","deps","PageService","imports","SharedModule","RouterModule","forChild","PRODUCT_LIST_QUERY_PRODUCT_FRAGMENT","PRODUCT_LIST_QUERY","PRODUCT_VARIANT_DETAIL_QUERY_PRODUCT_VARIANT_FRAGMENT","PRODUCT_VARIANT_DETAIL_QUERY","PRODUCT_VARIANT_UPDATE_MUTATION","PRODUCT_VARIANT_LIST_QUERY_PRODUCT_VARIANT_FRAGMENT","PRODUCT_VARIANT_LIST_QUERY"],"sourceRoot":"webpack:///","sources":["./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/product-options-editor/product-options-editor.component.html","./src/lib/catalog/src/components/product-options-editor/product-options-editor.component.ts","./src/lib/catalog/src/components/create-product-option-group-dialog/create-product-option-group-dialog.component.html","./src/lib/catalog/src/components/create-product-option-group-dialog/create-product-option-group-dialog.component.ts","./src/lib/catalog/src/components/create-product-variant-dialog/create-product-variant-dialog.component.html","./src/lib/catalog/src/components/create-product-variant-dialog/create-product-variant-dialog.component.ts","./src/lib/catalog/src/components/option-value-input/option-value-input.component.html","./src/lib/catalog/src/components/option-value-input/option-value-input.component.ts","./src/lib/catalog/src/components/product-variants-editor/product-variants-editor.component.html","./src/lib/catalog/src/components/product-variants-editor/product-variants-editor.component.ts","./src/lib/catalog/src/providers/routing/product-variants-resolver.ts","./src/lib/catalog/src/catalog.routes.ts","./src/lib/catalog/src/components/apply-facet-dialog/apply-facet-dialog.component.html","./src/lib/catalog/src/components/apply-facet-dialog/apply-facet-dialog.component.ts","./src/lib/catalog/src/components/asset-detail/asset-detail.component.html","./src/lib/catalog/src/components/asset-detail/asset-detail.component.ts","./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.html","./src/lib/catalog/src/components/assets/assets.component.ts","./src/lib/catalog/src/components/assign-products-to-channel-dialog/assign-products-to-channel-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/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.html","./src/lib/catalog/src/components/bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.component.ts","./src/lib/catalog/src/components/collection-contents/collection-contents.component.html","./src/lib/catalog/src/components/collection-contents/collection-contents.component.ts","./src/lib/catalog/src/components/collection-data-table/collection-data-table.component.html","./src/lib/catalog/src/components/collection-data-table/collection-data-table.component.ts","./src/lib/catalog/src/components/collection-detail/collection-detail.component.html","./src/lib/catalog/src/components/collection-detail/collection-detail.component.ts","./src/lib/catalog/src/components/collection-list/collection-breadcrumb.pipe.ts","./src/lib/catalog/src/components/move-collections-dialog/move-collections-dialog.component.html","./src/lib/catalog/src/components/move-collections-dialog/move-collections-dialog.component.ts","./src/lib/catalog/src/components/collection-list/collection-list-bulk-actions.ts","./src/lib/catalog/src/components/collection-list/collection-list.component.html","./src/lib/catalog/src/components/collection-list/collection-list.component.ts","./src/lib/catalog/src/components/collection-tree/collection-tree.service.ts","./src/lib/catalog/src/components/collection-tree/collection-tree-node.component.html","./src/lib/catalog/src/components/collection-tree/collection-tree-node.component.ts","./src/lib/catalog/src/components/collection-tree/array-to-tree.ts","./src/lib/catalog/src/components/collection-tree/collection-tree.component.html","./src/lib/catalog/src/components/collection-tree/collection-tree.component.ts","./src/lib/catalog/src/components/confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component.html","./src/lib/catalog/src/components/confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component.ts","./src/lib/catalog/src/components/facet-detail/facet-detail.component.html","./src/lib/catalog/src/components/facet-detail/facet-detail.component.ts","./src/lib/catalog/src/components/facet-list/facet-list-bulk-actions.ts","./src/lib/catalog/src/components/facet-list/facet-list.component.html","./src/lib/catalog/src/components/facet-list/facet-list.component.ts","./src/lib/catalog/src/components/generate-product-variants/generate-product-variants.component.html","./src/lib/catalog/src/components/generate-product-variants/generate-product-variants.component.ts","../node_modules/rxjs/dist/esm/internal/operators/switchMapTo.js","./src/lib/catalog/src/components/product-variant-list/product-variant-list.component.html","./src/lib/catalog/src/components/product-variant-list/product-variant-list.component.ts","./src/lib/catalog/src/components/product-detail/product-detail.component.html","./src/lib/catalog/src/components/product-detail/product-detail.component.ts","./src/lib/catalog/src/components/product-list/product-list-bulk-actions.ts","./src/lib/catalog/src/components/product-list/product-list.component.html","./src/lib/catalog/src/components/product-list/product-list.component.ts","./src/lib/catalog/src/components/variant-price-detail/variant-price-detail.component.html","./src/lib/catalog/src/components/variant-price-detail/variant-price-detail.component.ts","./src/lib/catalog/src/components/product-variant-quick-jump/product-variant-quick-jump.component.html","./src/lib/catalog/src/components/product-variant-quick-jump/product-variant-quick-jump.component.ts","./src/lib/catalog/src/components/product-variant-detail/product-variant-detail.component.html","./src/lib/catalog/src/components/product-variant-detail/product-variant-detail.component.ts","./src/lib/catalog/src/components/product-variant-list/product-variant-list-bulk-actions.ts","./src/lib/catalog/src/components/product-variants-table/product-variants-table.component.html","./src/lib/catalog/src/components/product-variants-table/product-variants-table.component.ts","./src/lib/catalog/src/components/stock-location-detail/stock-location-detail.component.html","./src/lib/catalog/src/components/stock-location-detail/stock-location-detail.component.ts","./src/lib/catalog/src/components/stock-location-list/stock-location-list-bulk-actions.ts","./src/lib/catalog/src/components/stock-location-list/stock-location-list.component.html","./src/lib/catalog/src/components/stock-location-list/stock-location-list.component.ts","./src/lib/catalog/src/components/update-product-option-dialog/update-product-option-dialog.component.html","./src/lib/catalog/src/components/update-product-option-dialog/update-product-option-dialog.component.ts","./src/lib/catalog/src/catalog.module.ts","./src/lib/catalog/src/components/product-list/product-list.graphql.ts","./src/lib/catalog/src/components/product-variant-detail/product-variant-detail.graphql.ts","./src/lib/catalog/src/components/product-variant-list/product-variant-list.graphql.ts"],"sourcesContent":["/**\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 GetProductDetailQuery,\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 getTaxCategories() {\r\n return this.dataService.settings\r\n .getTaxCategories()\r\n .mapSingle(data => data.taxCategories.items)\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 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(map(() => ({ createProduct, optionGroups })));\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(\r\n createProduct,\r\n variants,\r\n options,\r\n languageCode,\r\n createVariantsConfig.stockLocationId,\r\n );\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 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 stockLocationId: string,\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 translations: [\r\n {\r\n languageCode,\r\n name,\r\n },\r\n ],\r\n stockLevels: [\r\n {\r\n stockLocationId,\r\n stockOnHand: v.stock,\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<GetProductDetailQuery['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 .getProductVariantsForProduct({}, 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<GetProductDetailQuery['product']>,\r\n languageCode: LanguageCode,\r\n ) {\r\n const variants$ = input.autoUpdate\r\n ? this.dataService.product\r\n .getProductVariantsForProduct({}, 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","<vdr-page-header>\r\n <vdr-page-title></vdr-page-title>\r\n <vdr-page-header-description>{{ 'catalog.page-description-options-editor' | translate }}</vdr-page-header-description>\r\n</vdr-page-header>\r\n<vdr-page-body>\r\n <vdr-page-block>\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=\"mr-2\">\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 </vdr-page-block>\r\n <vdr-page-block>\r\n <form class=\"form\" [formGroup]=\"detailForm\" *ngIf=\"optionGroups$ | async as optionGroups\">\r\n <div formGroupName=\"optionGroups\">\r\n <vdr-card\r\n *ngFor=\"let optionGroup of getOptionGroups(); index as i\"\r\n [formArrayName]=\"i\"\r\n [title]=\"optionGroup.value.code\"\r\n >\r\n <vdr-page-entity-info [entity]=\"optionGroup.value\"></vdr-page-entity-info>\r\n <div class=\"form-grid\">\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 <ng-container formGroupName=\"customFields\" *ngIf=\"optionGroupCustomFields.length\">\r\n <vdr-tabbed-custom-fields\r\n entityName=\"ProductOptionGroup\"\r\n [customFields]=\"optionGroupCustomFields\"\r\n [customFieldsFormGroup]=\"optionGroup.get('customFields')\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </ng-container>\r\n\r\n <vdr-data-table-2\r\n id=\"edit-options-list\"\r\n *ngIf=\"getOptions(optionGroup) as options\"\r\n [items]=\"options\"\r\n [itemsPerPage]=\"paginationSettings[optionGroup.value.id]?.itemsPerPage\"\r\n [currentPage]=\"paginationSettings[optionGroup.value.id]?.currentPage\"\r\n (pageChange)=\"paginationSettings[optionGroup.value.id].currentPage = $event\"\r\n [totalItems]=\"options.length\"\r\n >\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\r\n <ng-template let-optionControl=\"item\">\r\n {{ optionControl.value.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.created-at' | translate\" id=\"created-at\" [hiddenByDefault]=\"true\">\r\n <ng-template let-optionControl=\"item\">\r\n {{ optionControl.value.createdAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.updated-at' | translate\" id=\"updated-at\" [hiddenByDefault]=\"true\">\r\n <ng-template let-optionControl=\"item\">\r\n {{ optionControl.value.updatedAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.name' | translate\" id=\"name\" [optional]=\"false\">\r\n <ng-template let-optionControl=\"item\">\r\n <input\r\n type=\"text\"\r\n [formControl]=\"optionControl.get('name')\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.code' | translate\" id=\"code\" [optional]=\"false\">\r\n <ng-template let-optionControl=\"item\">\r\n <input type=\"text\" [formControl]=\"optionControl.get('code')\" />\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.custom-fields' | translate\" id=\"custom-fields\"\r\n [hiddenByDefault]=\"optionCustomFields.length === 0\"\r\n >\r\n <ng-template let-optionControl=\"item\">\r\n <vdr-tabbed-custom-fields\r\n entityName=\"ProductOption\"\r\n [customFields]=\"optionCustomFields\"\r\n [compact]=\"true\"\r\n [customFieldsFormGroup]=\"optionControl.get('customFields')\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n </vdr-data-table-2>\r\n </vdr-card>\r\n </div>\r\n </form>\r\n </vdr-page-block>\r\n</vdr-page-body>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';\nimport { UntypedFormArray, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n BaseDetailComponent,\n createUpdatedTranslatable,\n CustomFieldConfig,\n DataService,\n findTranslation,\n GetProductVariantOptionsQuery,\n LanguageCode,\n NotificationService,\n Permission,\n ProductOptionFragment,\n ProductOptionGroupFragment,\n ServerConfigService,\n TranslationOf,\n UpdateProductOptionGroupInput,\n UpdateProductOptionInput,\n} from '@vendure/admin-ui/core';\nimport { combineLatest, forkJoin, Observable } from 'rxjs';\nimport { map, mergeMap, take, tap } from 'rxjs/operators';\n\nimport { ProductDetailService } from '../../providers/product-detail/product-detail.service';\n\ntype ProductWithOptions = NonNullable<GetProductVariantOptionsQuery['product']>;\n\n@Component({\n selector: 'vdr-product-options-editor',\n templateUrl: './product-options-editor.component.html',\n styleUrls: ['./product-options-editor.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ProductOptionsEditorComponent extends BaseDetailComponent<ProductWithOptions> implements OnInit {\n detailForm: UntypedFormGroup;\n optionGroups$: Observable<ProductWithOptions['optionGroups']>;\n languageCode$: Observable<LanguageCode>;\n availableLanguages$: Observable<LanguageCode[]>;\n optionGroupCustomFields: CustomFieldConfig[];\n optionCustomFields: CustomFieldConfig[];\n autoUpdateVariantNames = true;\n paginationSettings: { [groupId: string]: { currentPage: number; itemsPerPage: number } } = {};\n readonly updatePermission = [Permission.UpdateCatalog, Permission.UpdateProduct];\n\n constructor(\n protected route: ActivatedRoute,\n protected router: Router,\n protected serverConfigService: ServerConfigService,\n protected dataService: DataService,\n private productDetailService: ProductDetailService,\n private formBuilder: UntypedFormBuilder,\n private changeDetector: ChangeDetectorRef,\n private notificationService: NotificationService,\n ) {\n super(route, router, serverConfigService, dataService);\n this.optionGroupCustomFields = this.getCustomFieldConfig('ProductOptionGroup');\n this.optionCustomFields = this.getCustomFieldConfig('ProductOption');\n }\n\n ngOnInit(): void {\n this.optionGroups$ = this.route.snapshot.data.entity.pipe(\n map((product: ProductWithOptions) => product.optionGroups),\n tap((optionGroups: ProductWithOptions['optionGroups']) => {\n for (const group of optionGroups) {\n this.paginationSettings[group.id] = {\n currentPage: 1,\n itemsPerPage: 10,\n };\n }\n }),\n );\n this.detailForm = new UntypedFormGroup({\n optionGroups: new UntypedFormArray([]),\n });\n super.init();\n }\n\n getOptionGroups(): UntypedFormGroup[] {\n const optionGroups = this.detailForm.get('optionGroups');\n return (optionGroups as UntypedFormArray).controls as UntypedFormGroup[];\n }\n\n getOptions(optionGroup: UntypedFormGroup): UntypedFormGroup[] {\n const options = optionGroup.get('options');\n return (options as UntypedFormArray).controls as UntypedFormGroup[];\n }\n\n save() {\n if (this.detailForm.invalid || this.detailForm.pristine) {\n return;\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const $product = this.dataService.product.getProduct(this.id).mapSingle(data => data.product!);\n combineLatest(this.entity$, this.languageCode$, $product)\n .pipe(\n take(1),\n mergeMap(([{ optionGroups }, languageCode, product]) => {\n const updateOperations: Array<Observable<any>> = [];\n for (const optionGroupForm of this.getOptionGroups()) {\n if (optionGroupForm.dirty) {\n const optionGroupEntity = optionGroups.find(\n og => og.id === optionGroupForm.value.id,\n );\n if (optionGroupEntity) {\n const input = this.getUpdatedOptionGroup(\n optionGroupEntity,\n optionGroupForm,\n languageCode,\n );\n updateOperations.push(\n this.dataService.product.updateProductOptionGroup(input),\n );\n }\n }\n\n for (const optionForm of this.getOptions(optionGroupForm)) {\n if (optionForm.dirty) {\n const optionGroup = optionGroups\n .find(og => og.id === optionGroupForm.value.id)\n ?.options.find(o => o.id === optionForm.value.id);\n if (optionGroup) {\n const input = this.getUpdatedOption(\n optionGroup,\n optionForm,\n languageCode,\n );\n updateOperations.push(\n this.productDetailService.updateProductOption(\n { ...input, autoUpdate: this.autoUpdateVariantNames },\n product,\n languageCode,\n ),\n );\n }\n }\n }\n }\n return forkJoin(updateOperations);\n }),\n )\n .subscribe(\n () => {\n this.detailForm.markAsPristine();\n this.changeDetector.markForCheck();\n this.notificationService.success(_('common.notify-update-success'), {\n entity: 'ProductOptionGroup',\n });\n },\n err => {\n this.notificationService.error(_('common.notify-update-error'), {\n entity: 'ProductOptionGroup',\n });\n },\n );\n }\n\n private getUpdatedOptionGroup(\n optionGroup: ProductOptionGroupFragment,\n optionGroupFormGroup: UntypedFormGroup,\n languageCode: LanguageCode,\n ): UpdateProductOptionGroupInput {\n const input = createUpdatedTranslatable({\n translatable: optionGroup,\n updatedFields: optionGroupFormGroup.value,\n customFieldConfig: this.optionGroupCustomFields,\n languageCode,\n defaultTranslation: {\n languageCode,\n name: optionGroup.name || '',\n },\n });\n return input;\n }\n\n private getUpdatedOption(\n option: ProductOptionFragment,\n optionFormGroup: UntypedFormGroup,\n languageCode: LanguageCode,\n ): UpdateProductOptionInput {\n const input = createUpdatedTranslatable({\n translatable: option,\n updatedFields: optionFormGroup.value,\n customFieldConfig: this.optionCustomFields,\n languageCode,\n defaultTranslation: {\n languageCode,\n name: option.name || '',\n },\n });\n return input;\n }\n\n protected setFormValues(entity: ProductWithOptions, languageCode: LanguageCode): void {\n const groupsForm = this.detailForm.get('optionGroups') as UntypedFormArray;\n for (const optionGroup of entity.optionGroups) {\n const groupTranslation = findTranslation(optionGroup, languageCode);\n\n const groupForm = this.setOptionGroupForm(optionGroup, groupsForm, groupTranslation);\n this.setCustomFieldsForm(this.optionGroupCustomFields, groupForm, optionGroup, groupTranslation);\n\n let optionsForm = groupForm.get('options') as UntypedFormArray;\n if (!optionsForm) {\n optionsForm = this.formBuilder.array([]);\n groupForm.addControl('options', optionsForm);\n }\n for (const option of optionGroup.options) {\n const optionTranslation = findTranslation(option, languageCode);\n const optionForm = this.setOptionForm(option, optionsForm, optionTranslation);\n\n this.setCustomFieldsForm(this.optionCustomFields, optionForm, option, optionTranslation);\n }\n }\n }\n\n protected setCustomFieldsForm<\n T extends ProductWithOptions['optionGroups'][0] | ProductWithOptions['optionGroups'][0]['options'][0],\n >(\n customFields: CustomFieldConfig[],\n formGroup: UntypedFormGroup,\n entity: T,\n currentTranslation?: TranslationOf<T>,\n ) {\n if (customFields.length) {\n let customValueFieldsGroup = formGroup.get(['customFields']);\n if (!customValueFieldsGroup) {\n customValueFieldsGroup = this.formBuilder.group(\n customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\n );\n formGroup.addControl('customFields', customValueFieldsGroup);\n }\n this.setCustomFieldFormValues(customFields, customValueFieldsGroup, entity, currentTranslation);\n }\n }\n\n protected setOptionGroupForm(\n entity: ProductWithOptions['optionGroups'][0],\n groupsForm: UntypedFormArray,\n currentTranslation?: TranslationOf<ProductWithOptions['optionGroups'][0]>,\n ) {\n const group = {\n id: entity.id,\n createdAt: entity.createdAt,\n updatedAt: entity.updatedAt,\n code: entity.code,\n name: currentTranslation?.name ?? '',\n };\n let groupForm = groupsForm.controls.find(control => control.value.id === entity.id) as\n | UntypedFormGroup\n | undefined;\n if (groupForm) {\n groupForm.get('id')?.setValue(group.id);\n groupForm.get('code')?.setValue(group.code);\n groupForm.get('name')?.setValue(group.name);\n groupForm.get('createdAt')?.setValue(group.createdAt);\n groupForm.get('updatedAt')?.setValue(group.updatedAt);\n } else {\n groupForm = this.formBuilder.group(group);\n groupsForm.push(groupForm);\n }\n return groupForm;\n }\n\n protected setOptionForm(\n entity: ProductWithOptions['optionGroups'][0]['options'][0],\n optionsForm: UntypedFormArray,\n currentTranslation?: TranslationOf<ProductWithOptions['optionGroups'][0]['options'][0]>,\n ) {\n const group = {\n id: entity.id,\n createdAt: entity.createdAt,\n updatedAt: entity.updatedAt,\n code: entity.code,\n name: currentTranslation?.name ?? '',\n };\n let optionForm = optionsForm.controls.find(control => control.value.id === entity.id) as\n | UntypedFormGroup\n | undefined;\n if (optionForm) {\n optionForm.get('id')?.setValue(group.id);\n optionForm.get('code')?.setValue(group.code);\n optionForm.get('name')?.setValue(group.name);\n optionForm.get('createdAt')?.setValue(group.createdAt);\n optionForm.get('updatedAt')?.setValue(group.updatedAt);\n } else {\n optionForm = this.formBuilder.group(group);\n optionsForm.push(optionForm);\n }\n return optionForm;\n }\n}\n","<ng-template vdrDialogTitle>\r\n {{ 'catalog.create-product-option-group' | translate }}\r\n</ng-template>\r\n<div class=\"form-grid\" [formGroup]=\"form\">\r\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\r\n <input id=\"name\" type=\"text\" formControlName=\"name\" (input)=\"updateCode()\" />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'common.code' | translate\"\r\n for=\"code\"\r\n >\r\n <input\r\n id=\"code\"\r\n type=\"text\"\r\n formControlName=\"code\"\r\n />\r\n </vdr-form-field>\r\n</div>\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\" [disabled]=\"form.invalid\">\r\n {{ 'common.confirm' | translate }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\nimport { FormBuilder, Validators } from '@angular/forms';\r\nimport {\r\n CreateProductOptionGroupInput,\r\n Dialog,\r\n findTranslation,\r\n GetProductVariantOptionsQuery,\r\n LanguageCode,\r\n ServerConfigService,\r\n} from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\n\r\n@Component({\r\n selector: 'vdr-create-product-option-group-dialog',\r\n templateUrl: './create-product-option-group-dialog.component.html',\r\n styleUrls: ['./create-product-option-group-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CreateProductOptionGroupDialogComponent implements Dialog<CreateProductOptionGroupInput> {\r\n resolveWith: (result?: CreateProductOptionGroupInput) => void;\r\n languageCode: LanguageCode;\r\n form = this.formBuilder.group({\r\n name: ['', Validators.required],\r\n code: ['', Validators.required],\r\n });\r\n constructor(private formBuilder: FormBuilder) {}\r\n\r\n updateCode() {\r\n const nameControl = this.form.get('name');\r\n const codeControl = this.form.get('code');\r\n if (nameControl && codeControl && codeControl.pristine) {\r\n codeControl.setValue(normalizeString(`${nameControl.value}`, '-'));\r\n }\r\n }\r\n\r\n confirm() {\r\n const { name, code } = this.form.value;\r\n if (!name || !code) {\r\n return;\r\n }\r\n this.resolveWith({\r\n code,\r\n options: [],\r\n translations: [{ languageCode: this.languageCode, name }],\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.create-product-variant' | translate }}\r\n</ng-template>\r\n<form [formGroup]=\"form\">\r\n <div formGroupName=\"options\" class=\"form-grid\">\r\n <vdr-form-field [label]=\"optionGroup.name\" *ngFor=\"let optionGroup of product.optionGroups\">\r\n <ng-select [items]=\"optionGroup.options\" [formControlName]=\"optionGroup.code\" bindLabel=\"name\"\r\n bindValue=\"id\" appendTo=\"body\">\r\n </ng-select>\r\n </vdr-form-field>\r\n <clr-alert *ngIf=\"product.optionGroups.length === 0\" clrAlertType=\"warning\" [clrAlertClosable]=\"false\"\r\n class=\"form-grid-span\">\r\n <clr-alert-item>\r\n <span class=\"alert-text\">\r\n {{ 'catalog.cannot-create-variants-without-options' | translate }}\r\n </span>\r\n </clr-alert-item>\r\n </clr-alert>\r\n </div>\r\n <div *ngIf=\"existingVariant\" class=\"mt-2\">\r\n <clr-alert clrAlertType=\"warning\" [clrAlertClosable]=\"false\" class=\"\">\r\n <clr-alert-item>\r\n <span class=\"alert-text\">\r\n {{ 'catalog.product-variant-exists' | translate }}: {{ existingVariant.name }} ({{\r\n existingVariant.sku\r\n }})\r\n </span>\r\n </clr-alert-item>\r\n </clr-alert>\r\n </div>\r\n <div class=\"form-grid mt-2\">\r\n <vdr-form-field [label]=\"'common.name' | translate\">\r\n <input type=\"text\" formControlName=\"name\" />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'catalog.sku' | translate\">\r\n <input type=\"text\" formControlName=\"sku\" />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'catalog.price' | translate\">\r\n <vdr-currency-input name=\"price\" [currencyCode]=\"currencyCode\" formControlName=\"price\" />\r\n </vdr-form-field>\r\n </div>\r\n</form>\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 [disabled]=\"form.invalid || existingVariant || product.optionGroups.length === 0\">\r\n {{ 'common.confirm' | translate }}\r\n </button>\r\n</ng-template>","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { FormBuilder, FormControl, FormGroup, FormRecord, Validators } from '@angular/forms';\r\nimport {\r\n CreateProductVariantInput,\r\n CurrencyCode,\r\n Dialog,\r\n GetProductVariantOptionsQuery,\r\n} from '@vendure/admin-ui/core';\r\nimport { notNullOrUndefined } from '@vendure/common/lib/shared-utils';\r\nimport { combineLatest } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'vdr-create-product-variant-dialog',\r\n templateUrl: './create-product-variant-dialog.component.html',\r\n styleUrls: ['./create-product-variant-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CreateProductVariantDialogComponent implements Dialog<CreateProductVariantInput>, OnInit {\r\n resolveWith: (result?: CreateProductVariantInput) => void;\r\n product: NonNullable<GetProductVariantOptionsQuery['product']>;\r\n form = this.formBuilder.group({\r\n name: ['', Validators.required],\r\n sku: ['', Validators.required],\r\n price: ['', Validators.required],\r\n options: this.formBuilder.record<string>({}),\r\n });\r\n existingVariant: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number] | undefined;\r\n currencyCode: CurrencyCode;\r\n\r\n constructor(private formBuilder: FormBuilder) {}\r\n\r\n ngOnInit() {\r\n this.currencyCode = this.product.variants[0].currencyCode;\r\n for (const optionGroup of this.product.optionGroups) {\r\n (this.form.get('options') as FormRecord).addControl(\r\n optionGroup.code,\r\n new FormControl('', Validators.required),\r\n );\r\n }\r\n const optionsRecord = this.form.get('options') as FormRecord;\r\n optionsRecord.valueChanges.subscribe(value => {\r\n const nameControl = this.form.get('name');\r\n const allNull = Object.values(value).every(v => v == null);\r\n if (!allNull && value && nameControl && !nameControl.dirty) {\r\n const name = Object.entries(value)\r\n .map(\r\n ([groupCode, optionId]) =>\r\n this.product.optionGroups\r\n .find(og => og.code === groupCode)\r\n ?.options.find(o => o.id === optionId)?.name,\r\n )\r\n .join(' ');\r\n nameControl.setValue(`${this.product.name} ${name}`);\r\n }\r\n const allSelected = Object.values(value).every(v => v != null);\r\n if (allSelected) {\r\n this.existingVariant = this.product.variants.find(v =>\r\n Object.entries(value).every(\r\n ([groupCode, optionId]) =>\r\n v.options.find(o => o.groupId === this.getGroupIdFromCode(groupCode))?.id ===\r\n optionId,\r\n ),\r\n );\r\n }\r\n });\r\n }\r\n\r\n confirm() {\r\n const { name, sku, options, price } = this.form.value;\r\n if (!name || !sku || !options || !price) {\r\n return;\r\n }\r\n\r\n const optionIds = Object.values(options).filter(notNullOrUndefined);\r\n this.resolveWith({\r\n productId: this.product.id,\r\n sku,\r\n price: Number(price),\r\n optionIds,\r\n translations: [\r\n {\r\n languageCode: this.product.languageCode,\r\n name,\r\n },\r\n ],\r\n });\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n\r\n private getGroupCodeFromId(id: string): string {\r\n return this.product.optionGroups.find(og => og.id === id)?.code ?? '';\r\n }\r\n\r\n private getGroupIdFromCode(code: string): string {\r\n return this.product.optionGroups.find(og => og.code === code)?.id ?? '';\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 {\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","<vdr-page-block>\r\n <vdr-card>\r\n <div *ngFor=\"let group of optionGroups; index as i\" class=\"option-groups\">\r\n <vdr-form-field [label]=\"'catalog.option' | translate\">\r\n <input clrInput [(ngModel)]=\"group.name\" name=\"name\" [readonly]=\"!group.isNew\" />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'catalog.option-values' | translate\" class=\"flex-spacer\">\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 </vdr-form-field>\r\n <div>\r\n <button class=\"button-small mt-4\" (click)=\"removeOptionGroup(group)\">\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </div>\r\n </div>\r\n <button class=\"button mt-1\" (click)=\"addOptionGroup()\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.create-product-option-group' | translate }}\r\n </button>\r\n </vdr-card>\r\n <vdr-card [paddingX]=\"false\">\r\n <div class=\"mx-3\">\r\n <button class=\"button\" (click)=\"createNewVariant()\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.create-product-variant' | translate }}\r\n </button>\r\n </div>\r\n <vdr-data-table-2\r\n id=\"manage-product-variant-list\"\r\n [items]=\"variants$ | async\"\r\n [itemsPerPage]=\"itemsPerPage\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n >\r\n <vdr-dt2-search\r\n [searchTermControl]=\"searchTermControl\"\r\n [searchTermPlaceholder]=\"'catalog.filter-by-name' | translate\"\r\n />\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.created-at' | translate\" id=\"created-at\" [hiddenByDefault]=\"true\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.createdAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.updated-at' | translate\" id=\"updated-at\" [hiddenByDefault]=\"true\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.updatedAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'catalog.name' | translate\" id=\"name\" [optional]=\"false\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.name }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'catalog.sku' | translate\" id=\"sku\" [optional]=\"false\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.sku }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column *ngFor=\"let optionGroup of optionGroups$ | async\" [heading]=\"optionGroup.name\" [id]=\"optionGroup.code\">\r\n <ng-template let-variant=\"item\">\r\n <vdr-chip\r\n *ngIf=\"getOption(variant, optionGroup.id) as option; else selectOption\"\r\n [colorFrom]=\"optionGroup.code\"\r\n >{{ option.name }}</vdr-chip\r\n >\r\n <ng-template #selectOption>\r\n <div class=\"flex center\">\r\n <ng-select\r\n [items]=\"optionGroup.options\"\r\n bindLabel=\"name\"\r\n bindValue=\"id\"\r\n appendTo=\"body\"\r\n (change)=\"setOptionToAddToVariant(variant.id, optionGroup.id, $event?.id)\"\r\n ></ng-select>\r\n <button\r\n class=\"button-small ml-1\"\r\n [class.primary]=\"!!optionsToAddToVariant[variant.id]?.[optionGroup.id]\"\r\n (click)=\"addOptionToVariant(variant)\"\r\n [disabled]=\"!optionsToAddToVariant[variant.id]?.[optionGroup.id]\"\r\n >\r\n <clr-icon shape=\"floppy\"></clr-icon>\r\n </button>\r\n </div>\r\n </ng-template>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.price' | translate\" id=\"price\" [hiddenByDefault]=\"true\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.price | localeCurrency : variant.currencyCode }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.price-with-tax' | translate\" id=\"price-with-tax\" [hiddenByDefault]=\"true\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.priceWithTax | localeCurrency : variant.currencyCode }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.delete' | translate\" id=\"delete\" [optional]=\"false\">\r\n <ng-template let-variant=\"item\">\r\n <button class=\"button-small\" (click)=\"deleteVariant(variant)\">\r\n <clr-icon shape=\"trash is-danger\"></clr-icon>\r\n </button>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n </vdr-data-table-2>\r\n </vdr-card>\r\n</vdr-page-block>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\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 SelectionManager,\r\n} from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\nimport { unique } from '@vendure/common/lib/unique';\r\nimport { EMPTY, Observable, Subject } from 'rxjs';\r\nimport { map, startWith, switchMap } from 'rxjs/operators';\r\n\r\nimport { ProductDetailService } from '../../providers/product-detail/product-detail.service';\r\nimport { CreateProductOptionGroupDialogComponent } from '../create-product-option-group-dialog/create-product-option-group-dialog.component';\r\nimport { CreateProductVariantDialogComponent } from '../create-product-variant-dialog/create-product-variant-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 optionGroups: OptionGroupUiModel[];\r\n product: NonNullable<GetProductVariantOptionsQuery['product']>;\r\n variants$: Observable<NonNullable<GetProductVariantOptionsQuery['product']>['variants']>;\r\n optionGroups$: Observable<NonNullable<GetProductVariantOptionsQuery['product']>['optionGroups']>;\r\n totalItems$: Observable<number>;\r\n currencyCode: CurrencyCode;\r\n itemsPerPage = 100;\r\n currentPage = 1;\r\n searchTermControl = new FormControl('');\r\n selectionManager = new SelectionManager<any>({\r\n multiSelect: true,\r\n itemsAreEqual: (a, b) => a.id === b.id,\r\n additiveMode: true,\r\n });\r\n optionsToAddToVariant: {\r\n [variantId: string]: { [groupId: string]: string };\r\n } = {};\r\n private refresh$ = new Subject<void>();\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 private changeDetector: ChangeDetectorRef,\r\n ) {}\r\n\r\n ngOnInit() {\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.defaultCurrencyCode;\r\n });\r\n\r\n const product$ = this.refresh$.pipe(\r\n switchMap(() =>\r\n this.dataService.product\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n .getProductVariantsOptions(this.route.parent?.snapshot.paramMap.get('id')!)\r\n .mapSingle(data => data.product),\r\n ),\r\n startWith(this.route.snapshot.data.product),\r\n );\r\n\r\n this.variants$ = product$.pipe(\r\n switchMap(product =>\r\n this.searchTermControl.valueChanges.pipe(\r\n startWith(''),\r\n map(term =>\r\n term\r\n ? product.variants.filter(v => v.name.toLowerCase().includes(term.toLowerCase()))\r\n : product.variants,\r\n ),\r\n ),\r\n ),\r\n );\r\n this.optionGroups$ = product$.pipe(map(product => product.optionGroups));\r\n this.totalItems$ = this.variants$.pipe(map(variants => variants.length));\r\n\r\n product$.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.map(v => v.options.map(option => option.groupId)).flat();\r\n this.optionGroups = p.optionGroups.map(og => ({\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 }\r\n\r\n setItemsPerPage(itemsPerPage: number) {\r\n this.itemsPerPage = itemsPerPage;\r\n this.currentPage = 1;\r\n }\r\n\r\n setPageNumber(page: number) {\r\n this.currentPage = page;\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 addOptionGroup() {\r\n this.modalService\r\n .fromComponent(CreateProductOptionGroupDialogComponent, {\r\n locals: {\r\n languageCode: this.languageCode,\r\n },\r\n })\r\n .pipe(\r\n switchMap(result => {\r\n if (result) {\r\n return this.dataService.product.createProductOptionGroups(result).pipe(\r\n switchMap(({ createProductOptionGroup }) =>\r\n this.dataService.product.addOptionGroupToProduct({\r\n optionGroupId: createProductOptionGroup.id,\r\n productId: this.product.id,\r\n }),\r\n ),\r\n );\r\n } else {\r\n return EMPTY;\r\n }\r\n }),\r\n )\r\n .subscribe(result => {\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'ProductOptionGroup',\r\n });\r\n this.refresh$.next();\r\n this.changeDetector.markForCheck();\r\n });\r\n }\r\n\r\n removeOptionGroup(\r\n optionGroup: NonNullable<GetProductVariantOptionsQuery['product']>['optionGroups'][number],\r\n ) {\r\n const id = optionGroup.id;\r\n const usedByVariantsCount = this.product.variants.filter(v =>\r\n v.options.map(o => o.groupId).includes(id),\r\n ).length;\r\n this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-product-option-group'),\r\n body: usedByVariantsCount ? _('catalog.confirm-delete-product-option-group-body') : '',\r\n translationVars: { name: optionGroup.name, count: usedByVariantsCount },\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 force: true,\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.refresh$.next();\r\n } else if (removeOptionGroupFromProduct.__typename === 'ProductOptionInUseError') {\r\n this.notificationService.error(removeOptionGroupFromProduct.message ?? '');\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 && group.id) {\r\n this.dataService.product\r\n .addOptionToGroup({\r\n productOptionGroupId: group.id,\r\n code: normalizeString(optionName, '-'),\r\n translations: [{ name: optionName, languageCode: this.languageCode }],\r\n })\r\n .subscribe(({ createProductOption }) => {\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'ProductOption',\r\n });\r\n this.refresh$.next();\r\n });\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 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.refresh$.next();\r\n } else {\r\n this.notificationService.error(deleteProductOption.message ?? '');\r\n }\r\n });\r\n }\r\n }\r\n\r\n setOptionToAddToVariant(variantId: string, optionGroupId: string, optionId?: string) {\r\n if (!this.optionsToAddToVariant[variantId]) {\r\n this.optionsToAddToVariant[variantId] = {};\r\n }\r\n if (optionId) {\r\n this.optionsToAddToVariant[variantId][optionGroupId] = optionId;\r\n } else {\r\n delete this.optionsToAddToVariant[variantId][optionGroupId];\r\n }\r\n }\r\n\r\n addOptionToVariant(variant: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number]) {\r\n const optionIds = [\r\n ...variant.options.map(o => o.id),\r\n ...Object.values(this.optionsToAddToVariant[variant.id]),\r\n ];\r\n this.dataService.product\r\n .updateProductVariants([\r\n {\r\n id: variant.id,\r\n optionIds: unique(optionIds),\r\n },\r\n ])\r\n .subscribe(({ updateProductVariants }) => {\r\n this.refresh$.next();\r\n });\r\n }\r\n\r\n deleteVariant(variant: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number]) {\r\n this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-product-variant'),\r\n translationVars: { name: variant.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(response =>\r\n response\r\n ? this.productDetailService.deleteProductVariant(variant.id, this.product.id)\r\n : EMPTY,\r\n ),\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.refresh$.next();\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 createNewVariant() {\r\n this.modalService\r\n .fromComponent(CreateProductVariantDialogComponent, {\r\n locals: {\r\n product: this.product,\r\n },\r\n })\r\n .pipe(\r\n switchMap(result => {\r\n if (result) {\r\n return this.dataService.product.createProductVariants([result]);\r\n } else {\r\n return EMPTY;\r\n }\r\n }),\r\n )\r\n .subscribe(result => {\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'ProductVariant',\r\n });\r\n this.refresh$.next();\r\n });\r\n }\r\n\r\n getOption(\r\n variant: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number],\r\n groupId: string,\r\n ) {\r\n return variant.options.find(o => o.groupId === groupId);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { BaseEntityResolver, GetProductVariantOptionsQuery, 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 const,\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n name: '',\r\n languageCode: '' as any,\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 { inject } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, Route } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n CanDeactivateDetailGuard,\r\n createResolveData,\r\n DataService,\r\n PageComponent,\r\n PageService,\r\n} from '@vendure/admin-ui/core';\r\nimport { map } from 'rxjs/operators';\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 { ProductVariantsResolver } from './providers/routing/product-variants-resolver';\r\n\r\nexport const createRoutes = (pageService: PageService): Route[] => [\r\n {\r\n path: 'inventory',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'product-list',\r\n breadcrumb: _('breadcrumb.inventory'),\r\n },\r\n children: pageService.getPageTabRoutes('product-list'),\r\n },\r\n {\r\n path: 'inventory/:id',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'product-detail',\r\n breadcrumb: { label: _('breadcrumb.inventory'), link: ['../', 'inventory'] },\r\n },\r\n children: [\r\n {\r\n path: 'manage-variants',\r\n component: ProductVariantsEditorComponent,\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: ({ product }) => [\r\n {\r\n label: `${product.name}`,\r\n link: ['../'],\r\n },\r\n {\r\n label: _('breadcrumb.manage-variants'),\r\n link: ['manage-variants'],\r\n },\r\n ],\r\n },\r\n resolve: {\r\n product: (route: ActivatedRouteSnapshot) =>\r\n inject(DataService)\r\n .product.getProductVariantsOptions(route.parent?.params.id)\r\n .mapSingle(data => data.product),\r\n },\r\n },\r\n ...pageService.getPageTabRoutes('product-detail'),\r\n ],\r\n },\r\n {\r\n path: 'inventory/:productId/variants/:id',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'product-variant-detail',\r\n breadcrumb: { label: _('breadcrumb.inventory'), link: ['../', 'inventory'] },\r\n },\r\n children: pageService.getPageTabRoutes('product-variant-detail'),\r\n },\r\n {\r\n path: 'inventory/: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: 'inventory/stock-locations/:id',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'stock-location-detail',\r\n breadcrumb: [\r\n { label: _('breadcrumb.inventory'), link: ['../', 'inventory'] },\r\n {\r\n label: _('breadcrumb.stock-locations'),\r\n link: ['../', 'inventory', 'stock-locations'],\r\n },\r\n ],\r\n },\r\n children: pageService.getPageTabRoutes('stock-location-detail'),\r\n },\r\n {\r\n path: 'facets',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'facet-list',\r\n breadcrumb: _('breadcrumb.facets'),\r\n },\r\n children: pageService.getPageTabRoutes('facet-list'),\r\n },\r\n {\r\n path: 'facets/:id',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'facet-detail',\r\n breadcrumb: { label: _('breadcrumb.facets'), link: ['../', 'facets'] },\r\n },\r\n children: pageService.getPageTabRoutes('facet-detail'),\r\n },\r\n {\r\n path: 'collections',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'collection-list',\r\n breadcrumb: _('breadcrumb.collections'),\r\n },\r\n children: pageService.getPageTabRoutes('collection-list'),\r\n },\r\n {\r\n path: 'collections/:id',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'collection-detail',\r\n breadcrumb: { label: _('breadcrumb.collections'), link: ['../', 'collections'] },\r\n },\r\n children: pageService.getPageTabRoutes('collection-detail'),\r\n },\r\n {\r\n path: 'assets',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'asset-list',\r\n breadcrumb: _('breadcrumb.assets'),\r\n },\r\n children: pageService.getPageTabRoutes('asset-list'),\r\n },\r\n {\r\n path: 'assets/:id',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'asset-detail',\r\n breadcrumb: { label: _('breadcrumb.assets'), link: ['../', 'assets'] },\r\n },\r\n children: pageService.getPageTabRoutes('asset-detail'),\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 {\r\n label: _('breadcrumb.inventory'),\r\n link: ['../', 'inventory'],\r\n },\r\n {\r\n label: `${entity.name}`,\r\n link: ['../', 'inventory', params.id],\r\n },\r\n {\r\n label: _('breadcrumb.product-options'),\r\n link: ['options'],\r\n },\r\n ]),\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 (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 {\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","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left></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-page-block>\r\n<vdr-page-block>\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 />\r\n</vdr-page-block>\r\n","import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormControl, FormGroup, UntypedFormBuilder } from '@angular/forms';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n ASSET_FRAGMENT,\r\n AssetDetailQueryDocument,\r\n AssetDetailQueryQuery,\r\n DataService,\r\n getCustomFieldsDefaults,\r\n LanguageCode,\r\n NotificationService,\r\n TAG_FRAGMENT,\r\n TypedBaseDetailComponent,\r\n} from '@vendure/admin-ui/core';\r\nimport { gql } from 'apollo-angular';\r\n\r\nexport const ASSET_DETAIL_QUERY = gql`\r\n query AssetDetailQuery($id: ID!) {\r\n asset(id: $id) {\r\n ...Asset\r\n tags {\r\n ...Tag\r\n }\r\n }\r\n }\r\n ${ASSET_FRAGMENT}\r\n ${TAG_FRAGMENT}\r\n`;\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 TypedBaseDetailComponent<typeof AssetDetailQueryDocument, 'asset'>\r\n implements OnInit, OnDestroy\r\n{\r\n readonly customFields = this.getCustomFieldConfig('Asset');\r\n detailForm = new FormGroup({\r\n name: new FormControl(''),\r\n tags: new FormControl([] as string[]),\r\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),\r\n });\r\n\r\n constructor(\r\n private notificationService: NotificationService,\r\n protected dataService: DataService,\r\n private formBuilder: UntypedFormBuilder,\r\n ) {\r\n super();\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 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(\r\n entity: NonNullable<AssetDetailQueryQuery['asset']>,\r\n languageCode: LanguageCode,\r\n ): void {\r\n this.detailForm.get('name')?.setValue(entity.name);\r\n this.detailForm.get('tags')?.setValue(entity.tags.map(t => t.id));\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","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).refetchOnChannelChange(),\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-page-block>\r\n <div class=\"my-2\">\r\n <vdr-asset-search-input\r\n [tags]=\"allTags$ | async\"\r\n (searchTermChange)=\"searchTerm$.next($event)\"\r\n (tagsChange)=\"filterByTags$.next($event)\"\r\n >\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-asset-search-input>\r\n </div>\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</vdr-page-block>\r\n","<div *ngIf=\"!compact; else compactView\" class=\"standard-view-container\">\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 class=\"all-assets-container\">\r\n <ng-container *ngTemplateOutlet=\"assetList\"></ng-container>\r\n <div *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</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()\">\r\n <clr-icon shape=\"image\" size=\"150\"></clr-icon>\r\n </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 { 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 // eslint-disable-next-line @angular-eslint/no-output-native\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","<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?.defaultCurrencyCode }}</td>\r\n <td>\r\n <ng-template [ngIf]=\"selectedChannel\" [ngIfElse]=\"noChannelSelected\">\r\n {{ row.pricePreview | localeCurrency: selectedChannel?.defaultCurrencyCode }}\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","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { UntypedFormControl } 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 ItemOf,\r\n LogicalOperator,\r\n NotificationService,\r\n} from '@vendure/admin-ui/core';\r\nimport { combineLatest, from, lastValueFrom, Observable } from 'rxjs';\r\nimport { map, startWith } from 'rxjs/operators';\r\n\r\ntype Channel = ItemOf<GetChannelsQuery, 'channels'>;\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 UntypedFormControl(1);\r\n selectedChannelIdControl = new UntypedFormControl();\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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n this.currentChannel = channels.items.find(c => c.id === activeChannelId)!;\r\n this.availableChannels = channels.items;\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 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 // eslint-disable-next-line @typescript-eslint/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) {\r\n return (\r\n await lastValueFrom(\r\n this.dataService.product.getProductVariants({\r\n filterOperator: LogicalOperator.OR,\r\n filter: {\r\n productId: { in: this.productIds },\r\n id: { in: this.productVariantIds },\r\n },\r\n take,\r\n }).single$,\r\n )\r\n ).productVariants.items;\r\n }\r\n}\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","<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 (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 { 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 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","<div class=\"table-wrapper\">\r\n <div class=\"progress loop\" [class.visible]=\"isLoading\"></div>\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 <vdr-data-table-2\r\n id=\"collection-contents\"\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 <vdr-dt2-search\r\n [searchTermControl]=\"filterTermControl\"\r\n [searchTermPlaceholder]=\"'catalog.filter-by-name' | translate\"\r\n />\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.created-at' | translate\" id=\"created-at\" [hiddenByDefault]=\"true\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.createdAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.updated-at' | translate\" id=\"updated-at\" [hiddenByDefault]=\"true\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.updatedAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.name' | translate\" id=\"name\" [optional]=\"false\">\r\n <ng-template let-variant=\"item\">\r\n <a class=\"button-ghost\" [routerLink]=\"['/catalog/inventory', variant.productId]\"\r\n ><span>{{ variant.name }}</span\r\n ><clr-icon shape=\"arrow right\"\r\n /></a>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'catalog.sku' | translate\" id=\"sku\" [optional]=\"false\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.sku }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n </vdr-data-table-2>\r\n</div>\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 { UntypedFormControl } 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 UntypedFormControl('');\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","<vdr-data-table-filter-presets\r\n *ngIf=\"filters\"\r\n [filters]=\"filters\"\r\n [dataTableId]=\"id\"\r\n></vdr-data-table-filter-presets>\r\n<div class=\"table-wrapper\">\r\n <div class=\"bulk-actions\">\r\n <ng-content select=\"vdr-bulk-action-menu\"></ng-content>\r\n </div>\r\n <table class=\"\" [class.no-select]=\"disableSelect\">\r\n <thead [class.items-selected]=\"selectionManager?.selection.length\">\r\n <tr class=\"heading-row\">\r\n <th *ngIf=\"selectionManager\" class=\"selection-col\">\r\n <div class=\"flex\">\r\n <div class=\"drag-handle-spacer\"></div>\r\n <input\r\n type=\"checkbox\"\r\n clrCheckbox\r\n [checked]=\"selectionManager?.areAllCurrentItemsSelected()\"\r\n (change)=\"onToggleAllClick()\"\r\n />\r\n </div>\r\n </th>\r\n <th\r\n *ngFor=\"let column of visibleSortedColumns; last as isLast\"\r\n [class.expand]=\"column.expand\"\r\n >\r\n <div class=\"cell-content\" [ngClass]=\"column.align\">\r\n <vdr-ui-extension-point\r\n [locationId]=\"id\"\r\n [metadata]=\"column.id\"\r\n api=\"dataTable\"\r\n [topPx]=\"-6\"\r\n [leftPx]=\"-24\"\r\n display=\"block\"\r\n >\r\n <span>{{ column.heading }}</span>\r\n </vdr-ui-extension-point>\r\n <div *ngIf=\"column.sort as sort\" class=\"sort-toggle\">\r\n <button (click)=\"sort.toggleSortOrder()\" [class.active]=\"sort.sortOrder\">\r\n <clr-icon *ngIf=\"!sort.sortOrder\" shape=\"two-way-arrows left\"></clr-icon>\r\n <clr-icon *ngIf=\"sort.sortOrder === 'ASC'\" shape=\"arrow up\"></clr-icon>\r\n <clr-icon *ngIf=\"sort.sortOrder === 'DESC'\" shape=\"arrow down\"></clr-icon>\r\n </button>\r\n <div class=\"sort-label\" *ngIf=\"sort.sortOrder\">{{ sort.sortOrder }}</div>\r\n </div>\r\n </div>\r\n </th>\r\n <th>\r\n <div class=\"column-picker\">\r\n <vdr-data-table-colum-picker\r\n [uiLanguage]=\"uiLanguage$ | async\"\r\n [columns]=\"sortedColumns\"\r\n (reorder)=\"onColumnReorder($event)\"\r\n (resetColumns)=\"onColumnsReset()\"\r\n ></vdr-data-table-colum-picker>\r\n </div>\r\n </th>\r\n </tr>\r\n <tr *ngIf=\"searchComponent || customSearchTemplate || filters?.length\">\r\n <th\r\n [attr.colspan]=\"visibleSortedColumns.length + (selectionManager ? 2 : 1)\"\r\n class=\"filter-row\"\r\n [class.active]=\"showSearchFilterRow\"\r\n >\r\n <button\r\n class=\"button-ghost toggle-search-filter-row\"\r\n [class.active]=\"showSearchFilterRow\"\r\n (click)=\"toggleSearchFilterRow()\"\r\n [title]=\"'common.search-and-filter-list' | translate\"\r\n >\r\n <clr-icon shape=\"search\"></clr-icon>\r\n </button>\r\n <div class=\"filter-row-wrapper\" [class.hidden]=\"!showSearchFilterRow\">\r\n <ng-container *ngTemplateOutlet=\"searchComponent?.template\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customSearchTemplate\"></ng-container>\r\n <ng-container *ngIf=\"filters\">\r\n <div class=\"filters\">\r\n <vdr-data-table-filters\r\n *ngFor=\"let activeFilter of filters.activeFilters\"\r\n [filterWithValue]=\"activeFilter\"\r\n [filters]=\"filters\"\r\n class=\"mt-1\"\r\n ></vdr-data-table-filters>\r\n <vdr-data-table-filters\r\n *ngIf=\"filters.length\"\r\n [filters]=\"filters\"\r\n class=\"mt-1\"\r\n ></vdr-data-table-filters>\r\n <vdr-add-filter-preset-button\r\n [filters]=\"filters\"\r\n [dataTableId]=\"id\"\r\n ></vdr-add-filter-preset-button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody\r\n cdkDropList\r\n cdkDropListLockAxis=\"y\"\r\n (cdkDropListDropped)=\"onDrop($event)\"\r\n [cdkDropListSortPredicate]=\"sortPredicate\"\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let item of items\r\n | paginate\r\n : {\r\n itemsPerPage: itemsPerPage,\r\n currentPage: currentPage,\r\n totalItems: totalItems,\r\n id: id,\r\n };\r\n index as i;\r\n trackBy: trackByFn\r\n \"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"collectionRowTmp\"\r\n [ngTemplateOutletContext]=\"{ item: item, i: i, depth: 0 }\"\r\n ></ng-container>\r\n </ng-container>\r\n <ng-container>\r\n <tr *ngIf=\"!items?.length\">\r\n <td [attr.colspan]=\"visibleSortedColumns.length + (selectionManager ? 2 : 1)\">\r\n <vdr-empty-placeholder [emptyStateLabel]=\"emptyStateLabel\"></vdr-empty-placeholder>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n</div>\r\n<div class=\"table-footer\">\r\n <vdr-items-per-page-controls\r\n *ngIf=\"totalItems\"\r\n [itemsPerPage]=\"itemsPerPage\"\r\n (itemsPerPageChange)=\"itemsPerPageChange.emit($event)\"\r\n ></vdr-items-per-page-controls>\r\n <div *ngIf=\"totalItems\" class=\"p5 total-items-count\">\r\n {{ 'common.total-items' | translate : { currentStart, currentEnd, totalItems } }}\r\n </div>\r\n\r\n <vdr-pagination-controls\r\n *ngIf=\"totalItems\"\r\n [id]=\"id\"\r\n [currentPage]=\"currentPage\"\r\n [itemsPerPage]=\"itemsPerPage\"\r\n [totalItems]=\"totalItems\"\r\n (pageChange)=\"pageChange.emit($event)\"\r\n ></vdr-pagination-controls>\r\n</div>\r\n\r\n<ng-template #collectionRowTmp let-item=\"item\" let-depth=\"depth\">\r\n <tr #collectionRow cdkDrag [cdkDragData]=\"{ depth: depth, collection: item }\" cdkDragBoundary=\"tbody\">\r\n <td\r\n *ngIf=\"selectionManager\"\r\n [class.active]=\"activeIndex === absoluteIndex[item.id]\"\r\n class=\"selection-col\"\r\n >\r\n <div class=\"flex\">\r\n <div class=\"drag-handle\" cdkDragHandle [title]=\"'catalog.reorder-collection' | translate\">\r\n <clr-icon shape=\"drag-handle\"></clr-icon>\r\n </div>\r\n <input\r\n type=\"checkbox\"\r\n clrCheckbox\r\n [checked]=\"selectionManager?.isSelected(item)\"\r\n (click)=\"onRowClick(item, $event)\"\r\n />\r\n </div>\r\n </td>\r\n <td\r\n *ngFor=\"let column of visibleSortedColumns\"\r\n [class.active]=\"activeIndex === absoluteIndex[item.id]\"\r\n >\r\n <div class=\"cell-content\" [ngClass]=\"column.align\">\r\n <ng-container\r\n *ngIf=\"customComponents.get(column.id) as componentConfig; else defaultComponent\"\r\n >\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n componentConfig.config.component;\r\n inputs: { rowItem: item };\r\n injector: componentConfig.injector\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n <ng-template #defaultComponent>\r\n <ng-container\r\n *ngTemplateOutlet=\"column.template; context: { item: item, depth: depth }\"\r\n ></ng-container>\r\n </ng-template>\r\n </div>\r\n </td>\r\n <td [class.active]=\"activeIndex === absoluteIndex[item.id]\"><!-- column select --></td>\r\n </tr>\r\n <ng-container *ngFor=\"let subCollection of getSubcollections(item)\">\r\n <ng-container\r\n *ngTemplateOutlet=\"collectionRowTmp; context: { item: subCollection, depth: depth + 1 }\"\r\n ></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n","import { CdkDrag, CdkDragDrop, CdkDropList, DragDrop, DragRef } from '@angular/cdk/drag-drop';\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n Output,\r\n QueryList,\r\n SimpleChanges,\r\n ViewChild,\r\n ViewChildren,\r\n} from '@angular/core';\r\nimport {\r\n DataService,\r\n DataTable2Component,\r\n GetCollectionListQuery,\r\n ItemOf,\r\n LocalStorageService,\r\n} from '@vendure/admin-ui/core';\r\n\r\nexport type CollectionTableItem = ItemOf<GetCollectionListQuery, 'collections'>;\r\nexport type CollectionOrderEvent = {\r\n collectionId: string;\r\n parentId: string;\r\n index: number;\r\n};\r\n@Component({\r\n selector: 'vdr-collection-data-table',\r\n templateUrl: './collection-data-table.component.html',\r\n styleUrls: [\r\n '../../../../core/src/shared/components/data-table-2/data-table2.component.scss',\r\n './collection-data-table.component.scss',\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CollectionDataTableComponent\r\n extends DataTable2Component<CollectionTableItem>\r\n implements OnChanges, AfterViewInit\r\n{\r\n @Input() subCollections: CollectionTableItem[];\r\n @Output() changeOrder = new EventEmitter<CollectionOrderEvent>();\r\n @ViewChild(CdkDropList, { static: true }) dropList: CdkDropList<{\r\n depth: number;\r\n collection: CollectionTableItem;\r\n }>;\r\n @ViewChildren('collectionRow', { read: CdkDrag }) collectionRowList: QueryList<CdkDrag>;\r\n dragRefs: DragRef[] = [];\r\n absoluteIndex: { [id: string]: number } = {};\r\n constructor(\r\n protected changeDetectorRef: ChangeDetectorRef,\r\n protected localStorageService: LocalStorageService,\r\n protected dataService: DataService,\r\n private dragDrop: DragDrop,\r\n ) {\r\n super(changeDetectorRef, localStorageService, dataService);\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n super.ngOnChanges(changes);\r\n if (changes.subCollections || changes.items) {\r\n const allCollections: CollectionTableItem[] = [];\r\n for (const collection of this.items ?? []) {\r\n allCollections.push(collection);\r\n const subCollectionMatches = this.getSubcollections(collection);\r\n allCollections.push(...subCollectionMatches.flat());\r\n }\r\n allCollections.forEach((collection, index) => (this.absoluteIndex[collection.id] = index));\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.collectionRowList.changes.subscribe((val: QueryList<CdkDrag>) => {\r\n this.dropList.getSortedItems().forEach(item => this.dropList.removeItem(item));\r\n for (const ref of val.toArray()) {\r\n ref.dropContainer = this.dropList;\r\n ref._dragRef._withDropContainer(this.dropList._dropListRef);\r\n this.dropList.addItem(ref);\r\n }\r\n });\r\n }\r\n\r\n getSubcollections(item: CollectionTableItem) {\r\n return this.subCollections?.filter(c => c.parentId === item.id) ?? [];\r\n }\r\n\r\n sortPredicate = (index: number, item: CdkDrag<{ depth: number; collection: CollectionTableItem }>) => {\r\n const itemAtIndex = this.dropList.getSortedItems()[index];\r\n return itemAtIndex?.data.collection.parentId === item.data.collection.parentId;\r\n };\r\n\r\n onDrop(\r\n event: CdkDragDrop<{\r\n depth: number;\r\n collection: CollectionTableItem;\r\n }>,\r\n ) {\r\n const isTopLevel = event.item.data.collection.breadcrumbs.length === 2;\r\n const pageIndexOffset = isTopLevel ? (this.currentPage - 1) * this.itemsPerPage : 0;\r\n const parentId = event.item.data.collection.parentId;\r\n const parentIndex = this.items.findIndex(i => i.id === parentId);\r\n const adjustedIndex = pageIndexOffset + event.currentIndex - parentIndex - 1;\r\n this.changeOrder.emit({\r\n collectionId: event.item.data.collection.id,\r\n index: adjustedIndex,\r\n parentId: event.item.data.collection.parentId,\r\n });\r\n\r\n if (isTopLevel) {\r\n this.items = [...this.items];\r\n this.items.splice(event.previousIndex, 1);\r\n this.items.splice(event.currentIndex, 0, event.item.data.collection);\r\n } else {\r\n const parent = this.items.find(i => i.id === parentId);\r\n if (parent) {\r\n const subCollections = this.getSubcollections(parent);\r\n const adjustedPreviousIndex = pageIndexOffset + event.previousIndex - parentIndex - 1;\r\n subCollections.splice(adjustedPreviousIndex, 1);\r\n subCollections.splice(event.currentIndex, 0, event.item.data.collection);\r\n }\r\n }\r\n this.changeDetectorRef.markForCheck();\r\n }\r\n}\r\n","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left>\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 <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></vdr-ab-right\r\n >\r\n </vdr-action-bar>\r\n</vdr-page-block>\r\n<form class=\"form\" [formGroup]=\"detailForm\">\r\n <vdr-page-detail-layout>\r\n <vdr-page-detail-sidebar>\r\n <vdr-card>\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-card>\r\n <vdr-card *ngIf=\"entity$ | async as entity\">\r\n <vdr-page-entity-info [entity]=\"entity\"></vdr-page-entity-info>\r\n </vdr-card>\r\n </vdr-page-detail-sidebar>\r\n\r\n <vdr-page-block *ngIf=\"entity$ | async as entity\"\r\n ><nav role=\"navigation\">\r\n <ul class=\"collection-breadcrumbs\">\r\n <li *ngFor=\"let breadcrumb of entity.breadcrumbs; let isFirst = first; let isLast = last\">\r\n <a [routerLink]=\"['/catalog/collections']\" *ngIf=\"isFirst\">{{\r\n 'catalog.root-collection' | translate\r\n }}</a>\r\n <a\r\n [routerLink]=\"['/catalog/collections', breadcrumb.id]\"\r\n *ngIf=\"!isFirst && !isLast\"\r\n >{{ breadcrumb.name | translate }}</a\r\n >\r\n <ng-container *ngIf=\"isLast\">{{ breadcrumb.name | translate }}</ng-container>\r\n </li>\r\n </ul>\r\n </nav>\r\n </vdr-page-block>\r\n\r\n <vdr-page-block>\r\n <vdr-card>\r\n <div class=\"form-grid\">\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-form-field\r\n class=\"form-grid-span\"\r\n [label]=\"'common.description' | translate\"\r\n for=\"slug\"\r\n >\r\n <vdr-rich-text-editor\r\n formControlName=\"description\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-rich-text-editor>\r\n </vdr-form-field>\r\n </div>\r\n </vdr-card>\r\n <vdr-card\r\n formGroupName=\"customFields\"\r\n *ngIf=\"customFields.length\"\r\n [title]=\"'common.custom-fields' | translate\"\r\n >\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 </vdr-card>\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 <vdr-card [title]=\"'catalog.assets' | translate\">\r\n <vdr-assets\r\n [assets]=\"entity?.assets\"\r\n [featuredAsset]=\"entity?.featuredAsset\"\r\n [updatePermissions]=\"updatePermission\"\r\n (change)=\"assetChanges = $event\"\r\n ></vdr-assets>\r\n </vdr-card>\r\n <vdr-card [title]=\"'catalog.filters' | translate\">\r\n <vdr-form-field\r\n [label]=\"'catalog.filter-inheritance' | translate\"\r\n for=\"inheritFilters\"\r\n >\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 <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 <span>{{ 'marketing.add-condition' | translate }}</span>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\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 </vdr-card>\r\n\r\n <vdr-card [title]=\"'common.contents' | translate\" [paddingX]=\"false\">\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=\"ml-3\">\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 </div>\r\n </ng-template>\r\n </vdr-collection-contents>\r\n </vdr-card>\r\n </vdr-page-block>\r\n </vdr-page-detail-layout>\r\n</form>\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 { FormBuilder, UntypedFormArray, UntypedFormControl, Validators } from '@angular/forms';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n Asset,\r\n COLLECTION_FRAGMENT,\r\n CollectionDetailQueryDocument,\r\n CollectionFragment,\r\n ConfigurableOperation,\r\n ConfigurableOperationDefinition,\r\n ConfigurableOperationInput,\r\n CreateCollectionInput,\r\n createUpdatedTranslatable,\r\n DataService,\r\n encodeConfigArgValue,\r\n findTranslation,\r\n getConfigArgValue,\r\n getCustomFieldsDefaults,\r\n LanguageCode,\r\n LocalStorageService,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n TypedBaseDetailComponent,\r\n unicodePatternValidator,\r\n UpdateCollectionInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\nimport { gql } from 'apollo-angular';\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\nexport const COLLECTION_DETAIL_QUERY = gql`\r\n query CollectionDetailQuery($id: ID!) {\r\n collection(id: $id) {\r\n ...Collection\r\n }\r\n }\r\n ${COLLECTION_FRAGMENT}\r\n`;\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 TypedBaseDetailComponent<typeof CollectionDetailQueryDocument, 'collection'>\r\n implements OnInit, OnDestroy\r\n{\r\n customFields = this.getCustomFieldConfig('Collection');\r\n 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(getCustomFieldsDefaults(this.customFields)),\r\n });\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 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();\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 UntypedFormArray;\r\n const inheritFiltersControl = this.detailForm.get('inheritFilters') as UntypedFormControl;\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 const slugControl = this.detailForm.get(['slug']);\r\n const currentTranslation = this.entity ? findTranslation(this.entity, this.languageCode) : undefined;\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 addFilter(collectionFilter: ConfigurableOperation) {\r\n const filtersArray = this.detailForm.get('filters') as UntypedFormArray;\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 UntypedFormArray;\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 const input = this.getUpdatedCollection(\r\n {\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n languageCode: this.languageCode,\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 this.detailForm,\r\n this.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 this.dataService.collection.createCollection(input).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 UntypedFormArray;\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: typeof this.detailForm,\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 code: o.code,\r\n arguments: Object.entries(formValueOperations[i].args).map(([name, value], j) => ({\r\n name,\r\n value: encodeConfigArgValue(value),\r\n })),\r\n }));\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { GetCollectionListQuery, ItemOf } from '@vendure/admin-ui/core';\r\n\r\n/**\r\n * Removes the root collection and self breadcrumb from the collection breadcrumb list.\r\n */\r\n@Pipe({\r\n name: 'collectionBreadcrumb',\r\n})\r\nexport class CollectionBreadcrumbPipe implements PipeTransform {\r\n transform(value: ItemOf<GetCollectionListQuery, 'collections'>): unknown {\r\n return value?.breadcrumbs.slice(1, -1);\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>\r\n {{ 'catalog.move-collections' | translate }}\r\n</ng-template>\r\n<vdr-collection-data-table\r\n class=\"mt-2\"\r\n id=\"move-collection-list\"\r\n [items]=\"items$ | async\"\r\n [subCollections]=\"subCollections$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n (pageChange)=\"currentPage$.next($event)\"\r\n (itemsPerPageChange)=\"itemsPerPage$.next($event)\"\r\n>\r\n <vdr-dt2-search\r\n [searchTermControl]=\"searchTermControl\"\r\n [searchTermPlaceholder]=\"'common.search-by-name' | translate\"\r\n ></vdr-dt2-search>\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\r\n <ng-template let-collection=\"item\">\r\n {{ collection.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.name' | translate\" id=\"name\" [optional]=\"false\">\r\n <ng-template let-collection=\"item\" let-depth=\"depth\">\r\n <div [ngClass]=\"'indent-' + depth\"></div>\r\n <clr-icon\r\n class=\"child-arrow\"\r\n [class.transparent]=\"depth === 0\"\r\n shape=\"child-arrow\"\r\n *ngIf=\"!collection.children?.length && collection.parentId !== '__'\"\r\n ></clr-icon>\r\n <button\r\n class=\"icon-button folder-button\"\r\n *ngIf=\"collection.children?.length\"\r\n (click)=\"toggleExpanded(collection)\"\r\n >\r\n <clr-icon shape=\"folder\" *ngIf=\"!expandedIds.includes(collection.id)\"></clr-icon>\r\n <clr-icon shape=\"folder-open\" *ngIf=\"expandedIds.includes(collection.id)\"></clr-icon>\r\n </button>\r\n <button class=\"icon-button folder-button\" *ngIf=\"collection.parentId === '__'\" disabled>\r\n <clr-icon shape=\"folder\" class=\"is-solid\"></clr-icon>\r\n </button>\r\n <button class=\"button-ghost\" (click)=\"resolveWith(collection)\">\r\n <span>{{ 'catalog.move-collection-to' | translate : {name: collection.name} }}</span>\r\n </button>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.breadcrumb' | translate\" id=\"breadcrumb\">\r\n <ng-template let-collection=\"item\">\r\n <div class=\"breadcrumb\">\r\n <ng-container *ngIf=\"collection | collectionBreadcrumb as breadcrumbs\">\r\n <ng-container *ngIf=\"breadcrumbs.length\">\r\n <div *ngFor=\"let item of breadcrumbs\">\r\n <span class=\"separator\">/</span>{{ item.name }}\r\n </div>\r\n </ng-container>\r\n <span class=\"separator\" *ngIf=\"!breadcrumbs.length\">/</span>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.slug' | translate\" id=\"slug\">\r\n <ng-template let-collection=\"item\">\r\n {{ collection.slug }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n</vdr-collection-data-table>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { DataService, Dialog, GetCollectionListQuery, I18nService, ItemOf } from '@vendure/admin-ui/core';\nimport { BehaviorSubject, combineLatest, Observable, of, Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, map, startWith, switchMap, tap } from 'rxjs/operators';\n\n@Component({\n selector: 'vdr-move-collections-dialog',\n templateUrl: './move-collections-dialog.component.html',\n styleUrls: ['./move-collections-dialog.component.scss', '../collection-list/collection-list-common.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MoveCollectionsDialogComponent\n implements OnInit, Dialog<ItemOf<GetCollectionListQuery, 'collections'>>\n{\n resolveWith: (result?: ItemOf<GetCollectionListQuery, 'collections'>) => void;\n searchTermControl = new FormControl('');\n items$: Observable<Array<ItemOf<GetCollectionListQuery, 'collections'>>>;\n totalItems$: Observable<number>;\n currentPage$ = new BehaviorSubject(1);\n itemsPerPage$ = new BehaviorSubject(10);\n expandedIds$ = new Subject<string[]>();\n expandedIds: string[] = [];\n subCollections$: Observable<Array<ItemOf<GetCollectionListQuery, 'collections'>>>;\n\n constructor(private dataService: DataService, private i18nService: I18nService) {}\n\n ngOnInit() {\n const getCollectionsResult = this.dataService.collection.getCollections();\n\n const searchTerm$ = this.searchTermControl.valueChanges.pipe(\n debounceTime(250),\n distinctUntilChanged(),\n startWith(''),\n );\n const currentPage$ = this.currentPage$.pipe(distinctUntilChanged());\n const itemsPerPage$ = this.itemsPerPage$.pipe(distinctUntilChanged());\n combineLatest(searchTerm$, currentPage$, itemsPerPage$).subscribe(\n ([searchTerm, currentPage, itemsPerPage]) => {\n const topLevelOnly = searchTerm === '';\n getCollectionsResult.ref.refetch({\n options: {\n skip: (currentPage - 1) * itemsPerPage,\n take: itemsPerPage,\n filter: {\n name: { contains: searchTerm },\n },\n topLevelOnly,\n },\n });\n },\n );\n\n const rootCollectionId$ = this.dataService.collection\n .getCollections({\n take: 1,\n topLevelOnly: true,\n })\n .mapSingle(data => data.collections.items[0].parentId);\n\n this.items$ = combineLatest(\n getCollectionsResult.mapStream(({ collections }) => collections),\n rootCollectionId$,\n ).pipe(\n map(([collections, rootCollectionId]) => [\n ...(rootCollectionId\n ? [\n {\n id: rootCollectionId,\n name: this.i18nService.translate('catalog.root-collection'),\n slug: '',\n parentId: '__',\n position: 0,\n featuredAsset: null,\n children: [],\n breadcrumbs: [],\n isPrivate: false,\n createdAt: '',\n updatedAt: '',\n } satisfies ItemOf<GetCollectionListQuery, 'collections'>,\n ]\n : []),\n ...collections.items,\n ]),\n );\n this.totalItems$ = getCollectionsResult.mapStream(data => data.collections.totalItems);\n\n this.subCollections$ = this.expandedIds$.pipe(\n tap(val => (this.expandedIds = val)),\n switchMap(ids => {\n if (ids.length) {\n return this.dataService.collection\n .getCollections({\n take: 999,\n filter: {\n parentId: { in: ids },\n },\n })\n .mapStream(data => data.collections.items);\n } else {\n return of([]);\n }\n }),\n );\n }\n\n toggleExpanded(collection: ItemOf<GetCollectionListQuery, 'collections'>) {\n let expandedIds = this.expandedIds;\n if (!expandedIds.includes(collection.id)) {\n expandedIds.push(collection.id);\n } else {\n expandedIds = expandedIds.filter(id => id !== collection.id);\n }\n this.expandedIds$.next(expandedIds);\n }\n}\n","import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BulkAction,\r\n createBulkAssignToChannelAction,\r\n createBulkDeleteAction,\r\n createBulkRemoveFromChannelAction,\r\n DataService,\r\n GetCollectionListQuery,\r\n ItemOf,\r\n ModalService,\r\n MoveCollectionInput,\r\n NotificationService,\r\n Permission,\r\n} from '@vendure/admin-ui/core';\r\nimport { EMPTY } from 'rxjs';\r\nimport { map, switchMap } from 'rxjs/operators';\r\nimport { CollectionPartial } from '../collection-tree/collection-tree.types';\r\nimport { MoveCollectionsDialogComponent } from '../move-collections-dialog/move-collections-dialog.component';\r\n\r\nimport { CollectionListComponent } from './collection-list.component';\r\n\r\nexport const deleteCollectionsBulkAction = createBulkDeleteAction<\r\n ItemOf<GetCollectionListQuery, 'collections'>\r\n>({\r\n location: 'collection-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.DeleteCollection) ||\r\n userPermissions.includes(Permission.DeleteCatalog),\r\n getItemName: item => item.name,\r\n bulkDelete: (dataService, ids) =>\r\n dataService.collection.deleteCollections(ids).pipe(map(res => res.deleteCollections)),\r\n});\r\n\r\nexport const moveCollectionsBulkAction: BulkAction<CollectionPartial, CollectionListComponent> = {\r\n location: 'collection-list',\r\n label: _('catalog.move-collections'),\r\n icon: 'drag-handle',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateCatalog) ||\r\n userPermissions.includes(Permission.UpdateCollection),\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(MoveCollectionsDialogComponent, {\r\n size: 'xl',\r\n closable: true,\r\n })\r\n .pipe(\r\n switchMap(result => {\r\n if (result) {\r\n const inputs: MoveCollectionInput[] = selection.map(c => ({\r\n collectionId: c.id,\r\n parentId: result.id,\r\n index: 0,\r\n }));\r\n return dataService.collection.moveCollection(inputs);\r\n } else {\r\n return EMPTY;\r\n }\r\n }),\r\n )\r\n .subscribe(result => {\r\n notificationService.success(_('catalog.move-collections-success'), {\r\n count: selection.length,\r\n });\r\n clearSelection();\r\n hostComponent.refresh();\r\n });\r\n },\r\n};\r\n\r\nexport const assignCollectionsToChannelBulkAction = createBulkAssignToChannelAction<\r\n ItemOf<GetCollectionListQuery, 'collections'>\r\n>({\r\n location: 'collection-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateCatalog) ||\r\n userPermissions.includes(Permission.UpdateCollection),\r\n getItemName: item => item.name,\r\n bulkAssignToChannel: (dataService, collectionIds, channelId) =>\r\n dataService.collection\r\n .assignCollectionsToChannel({\r\n collectionIds,\r\n channelId,\r\n })\r\n .pipe(map(res => res.assignCollectionsToChannel)),\r\n});\r\n\r\nexport const removeCollectionsFromChannelBulkAction = createBulkRemoveFromChannelAction<\r\n ItemOf<GetCollectionListQuery, 'collections'>\r\n>({\r\n location: 'collection-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.DeleteCatalog) ||\r\n userPermissions.includes(Permission.DeleteCollection),\r\n getItemName: item => item.name,\r\n bulkRemoveFromChannel: (dataService, collectionIds, channelId) =>\r\n dataService.collection\r\n .removeCollectionsFromChannel({\r\n channelId: channelId,\r\n collectionIds,\r\n })\r\n .pipe(map(res => res.removeCollectionsFromChannel)),\r\n});\r\n","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left>\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 </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</vdr-page-block>\r\n<vdr-split-view [rightPanelOpen]=\"activeCollectionId$ | async\" (closeClicked)=\"closeContents()\">\r\n <ng-template vdrSplitViewLeft>\r\n <vdr-collection-data-table\r\n class=\"mt-2\"\r\n id=\"collection-list\"\r\n [items]=\"items$ | async\"\r\n [subCollections]=\"subCollections$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n [filters]=\"filters\"\r\n [activeIndex]=\"activeCollectionIndex$ | async\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n (changeOrder)=\"onRearrange($event)\"\r\n >\r\n <vdr-bulk-action-menu\r\n locationId=\"collection-list\"\r\n [hostComponent]=\"this\"\r\n [selectionManager]=\"selectionManager\"\r\n ></vdr-bulk-action-menu>\r\n <vdr-dt2-search\r\n [searchTermControl]=\"searchTermControl\"\r\n [searchTermPlaceholder]=\"'common.search-by-name' | translate\"\r\n ></vdr-dt2-search>\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\r\n <ng-template let-collection=\"item\">\r\n {{ collection.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.created-at' | translate\" id=\"created-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('createdAt')\"\r\n >\r\n <ng-template let-collection=\"item\">\r\n {{ collection.createdAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.updated-at' | translate\" id=\"updated-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('updatedAt')\"\r\n >\r\n <ng-template let-collection=\"item\">\r\n {{ collection.updatedAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.position' | translate\" id=\"position\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('position')\"\r\n >\r\n <ng-template let-collection=\"item\">\r\n {{ collection.position }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.name' | translate\" id=\"name\"\r\n [optional]=\"false\"\r\n [sort]=\"sorts.get('name')\"\r\n >\r\n <ng-template let-collection=\"item\" let-depth=\"depth\">\r\n <div [ngClass]=\"'indent-' + depth\"></div>\r\n <clr-icon\r\n class=\"child-arrow\"\r\n [class.transparent]=\"depth === 0\"\r\n shape=\"child-arrow\"\r\n *ngIf=\"!collection.children?.length\"\r\n ></clr-icon>\r\n <button\r\n class=\"icon-button folder-button\"\r\n *ngIf=\"collection.children?.length\"\r\n (click)=\"toggleExpanded(collection)\"\r\n >\r\n <clr-icon shape=\"folder\" *ngIf=\"!expandedIds.includes(collection.id)\"></clr-icon>\r\n <clr-icon shape=\"folder-open\" *ngIf=\"expandedIds.includes(collection.id)\"></clr-icon>\r\n </button>\r\n <a class=\"button-ghost\" [routerLink]=\"['./', collection.id]\"\r\n ><span>{{ collection.name }}</span>\r\n <clr-icon shape=\"arrow right\"></clr-icon>\r\n </a>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.breadcrumb' | translate\" id=\"breadcrumb\">\r\n <ng-template let-collection=\"item\">\r\n <div class=\"breadcrumb\">\r\n <ng-container *ngIf=\"collection | collectionBreadcrumb as breadcrumbs\">\r\n <ng-container *ngIf=\"breadcrumbs.length\">\r\n <div *ngFor=\"let item of breadcrumbs\">\r\n <span class=\"separator\">/</span>{{ item.name }}\r\n </div>\r\n </ng-container>\r\n <span class=\"separator\" *ngIf=\"!breadcrumbs.length\">/</span>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.slug' | translate\" id=\"slug\" [sort]=\"sorts.get('slug')\">\r\n <ng-template let-collection=\"item\">\r\n {{ collection.slug }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.visibility' | translate\" id=\"visibility\">\r\n <ng-template let-collection=\"item\">\r\n <vdr-chip *ngIf=\"collection.isPrivate\" colorType=\"warning\">{{\r\n 'common.private' | translate\r\n }}</vdr-chip>\r\n <vdr-chip *ngIf=\"!collection.isPrivate\" colorType=\"success\">{{\r\n 'common.public' | translate\r\n }}</vdr-chip>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.view-contents' | translate\" id=\"view-contents\" [optional]=\"false\">\r\n <ng-template let-collection=\"item\">\r\n <a\r\n class=\"button-small bg-weight-150\"\r\n [routerLink]=\"['./', { contents: collection.id }]\"\r\n queryParamsHandling=\"preserve\"\r\n >\r\n <span>{{ 'common.view-contents' | translate }}</span>\r\n <clr-icon shape=\"file-group\"></clr-icon>\r\n </a>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-custom-field-column\r\n *ngFor=\"let customField of customFields\"\r\n [customField]=\"customField\"\r\n [sorts]=\"sorts\"\r\n />\r\n </vdr-collection-data-table>\r\n </ng-template>\r\n <ng-template vdrSplitViewRight [splitViewTitle]=\"activeCollectionTitle$ | async\">\r\n <ng-container *ngIf=\"activeCollectionId$ | async as activeGroup\">\r\n <vdr-collection-contents [collectionId]=\"activeCollectionId$ | async\"></vdr-collection-contents>\r\n </ng-container>\r\n </ng-template>\r\n</vdr-split-view>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n DataService,\r\n GetCollectionListDocument,\r\n GetCollectionListQuery,\r\n ItemOf,\r\n LanguageCode,\r\n NotificationService,\r\n TypedBaseListComponent,\r\n} from '@vendure/admin-ui/core';\r\nimport { combineLatest, Observable, of } from 'rxjs';\r\nimport { distinctUntilChanged, map, switchMap, takeUntil } from 'rxjs/operators';\r\nimport { CollectionOrderEvent } from '../collection-data-table/collection-data-table.component';\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', './collection-list-common.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CollectionListComponent\r\n extends TypedBaseListComponent<typeof GetCollectionListDocument, 'collections'>\r\n implements OnInit\r\n{\r\n activeCollectionId$: Observable<string | null>;\r\n activeCollectionIndex$: Observable<number>;\r\n activeCollectionTitle$: Observable<string>;\r\n subCollections$: Observable<Array<ItemOf<GetCollectionListQuery, 'collections'>>>;\r\n expandedIds: string[] = [];\r\n readonly customFields = this.getCustomFieldConfig('Collection');\r\n readonly filters = this.createFilterCollection()\r\n .addIdFilter()\r\n .addDateFilters()\r\n .addFilter({\r\n name: 'slug',\r\n label: _('common.slug'),\r\n type: { kind: 'text' },\r\n filterField: 'slug',\r\n })\r\n .addFilter({\r\n name: 'visibility',\r\n type: { kind: 'boolean' },\r\n label: _('common.visibility'),\r\n toFilterInput: value => ({\r\n isPrivate: { eq: !value },\r\n }),\r\n })\r\n .addCustomFieldFilters(this.customFields)\r\n .connectToRoute(this.route);\r\n readonly sorts = this.createSortCollection()\r\n .defaultSort('position', 'ASC')\r\n .addSort({ name: 'createdAt' })\r\n .addSort({ name: 'updatedAt' })\r\n .addSort({ name: 'name' })\r\n .addSort({ name: 'slug' })\r\n .addSort({ name: 'position' })\r\n .addCustomFieldSorts(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n constructor(protected dataService: DataService, private notificationService: NotificationService) {\r\n super();\r\n super.configure({\r\n document: GetCollectionListDocument,\r\n getItems: data => data.collections,\r\n setVariables: (skip, _take) => {\r\n const topLevelOnly =\r\n this.searchTermControl.value === '' && this.filters.activeFilters.length === 0\r\n ? true\r\n : undefined;\r\n return {\r\n options: {\r\n skip,\r\n take: _take,\r\n filter: {\r\n name: { contains: this.searchTermControl.value },\r\n ...this.filters.createFilterInput(),\r\n },\r\n topLevelOnly,\r\n sort: this.sorts.createSortInput(),\r\n },\r\n };\r\n },\r\n refreshListOnChanges: [this.filters.valueChanges, this.sorts.valueChanges],\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n super.ngOnInit();\r\n this.activeCollectionId$ = this.route.paramMap.pipe(\r\n map(pm => pm.get('contents')),\r\n distinctUntilChanged(),\r\n );\r\n const expandedIds$ = this.route.queryParamMap.pipe(\r\n map(qpm => qpm.get('expanded')),\r\n distinctUntilChanged(),\r\n map(ids => (ids ? ids.split(',') : [])),\r\n );\r\n expandedIds$.pipe(takeUntil(this.destroy$)).subscribe(ids => {\r\n this.expandedIds = ids;\r\n });\r\n this.subCollections$ = combineLatest(expandedIds$, this.refresh$).pipe(\r\n switchMap(([ids]) => {\r\n if (ids.length) {\r\n return this.dataService.collection\r\n .getCollections({\r\n take: 999,\r\n filter: {\r\n parentId: { in: ids },\r\n },\r\n })\r\n .mapStream(data => data.collections.items);\r\n } else {\r\n return of([]);\r\n }\r\n }),\r\n );\r\n\r\n this.activeCollectionTitle$ = combineLatest(\r\n this.activeCollectionId$,\r\n this.items$,\r\n this.subCollections$,\r\n ).pipe(\r\n map(([id, collections, subCollections]) => {\r\n if (id) {\r\n const match = [...collections, ...subCollections].find(c => c.id === id);\r\n return match ? match.name : '';\r\n }\r\n return '';\r\n }),\r\n );\r\n this.activeCollectionIndex$ = combineLatest(\r\n this.activeCollectionId$,\r\n this.items$,\r\n this.subCollections$,\r\n ).pipe(\r\n map(([id, collections, subCollections]) => {\r\n if (id) {\r\n const allCollections: typeof collections = [];\r\n for (const collection of collections) {\r\n allCollections.push(collection);\r\n const subCollectionMatches = subCollections.filter(\r\n c => c.parentId && c.parentId === collection.id,\r\n );\r\n allCollections.push(...subCollectionMatches);\r\n }\r\n return allCollections.findIndex(c => c.id === id);\r\n }\r\n return -1;\r\n }),\r\n );\r\n }\r\n\r\n onRearrange(event: CollectionOrderEvent) {\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 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 toggleExpanded(collection: ItemOf<GetCollectionListQuery, 'collections'>) {\r\n let expandedIds = this.expandedIds;\r\n if (!expandedIds.includes(collection.id)) {\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","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","<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 { 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","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 // eslint-disable-next-line @typescript-eslint/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","<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 {\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","<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 } 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","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left>\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</vdr-page-block>\r\n<form class=\"form\" [formGroup]=\"detailForm\">\r\n <vdr-page-detail-layout>\r\n <vdr-page-detail-sidebar formGroupName=\"facet\">\r\n <vdr-card>\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-card>\r\n <vdr-card>\r\n <vdr-page-entity-info *ngIf=\"entity$ | async as entity\" [entity]=\"entity\" />\r\n </vdr-card>\r\n </vdr-page-detail-sidebar>\r\n <vdr-page-block>\r\n <vdr-card formGroupName=\"facet\">\r\n <div class=\"form-grid\">\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(entity?.code, $event.target.value)\"\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\"\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 </vdr-card>\r\n <vdr-card [title]=\"'common.custom-fields' | translate\" *ngIf=\"customFields.length\">\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 />\r\n </vdr-card>\r\n\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\r\n <vdr-card\r\n *ngIf=\"!(isNew$ | async)\"\r\n [title]=\"'catalog.facet-values' | translate\"\r\n [paddingX]=\"false\"\r\n >\r\n <table\r\n class=\"facet-values-list table\"\r\n formArrayName=\"values\"\r\n *ngIf=\"0 < getValuesFormArray().length\"\r\n >\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\r\n class=\"facet-value\"\r\n *ngFor=\"let value of values; let i = index\"\r\n [formGroup]=\"detailForm.get(['values', i])\"\r\n >\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(entity?.values[i]?.code, $event.target.value, i)\"\r\n />\r\n </td>\r\n <td class=\"align-middle\">\r\n <input type=\"text\" formControlName=\"code\" />\r\n </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(entity?.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=\"button m-3\"\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 </vdr-card>\r\n </vdr-page-block>\r\n </vdr-page-detail-layout>\r\n</form>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n UntypedFormArray,\r\n UntypedFormControl,\r\n UntypedFormGroup,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n CreateFacetInput,\r\n CreateFacetValueInput,\r\n createUpdatedTranslatable,\r\n DataService,\r\n DeletionResult,\r\n FACET_WITH_VALUES_FRAGMENT,\r\n FacetWithValuesFragment,\r\n findTranslation,\r\n getCustomFieldsDefaults,\r\n GetFacetDetailDocument,\r\n LanguageCode,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n TypedBaseDetailComponent,\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 { gql } from 'apollo-angular';\r\nimport { combineLatest, EMPTY, forkJoin, Observable } from 'rxjs';\r\nimport { map, mergeMap, switchMap, take } from 'rxjs/operators';\r\n\r\nexport const FACET_DETAIL_QUERY = gql`\r\n query GetFacetDetail($id: ID!) {\r\n facet(id: $id) {\r\n ...FacetWithValues\r\n }\r\n }\r\n ${FACET_WITH_VALUES_FRAGMENT}\r\n`;\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 TypedBaseDetailComponent<typeof GetFacetDetailDocument, 'facet'>\r\n implements OnInit, OnDestroy\r\n{\r\n readonly customFields = this.getCustomFieldConfig('Facet');\r\n readonly customValueFields = this.getCustomFieldConfig('FacetValue');\r\n 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(getCustomFieldsDefaults(this.customFields)),\r\n }),\r\n values: this.formBuilder.array<{\r\n id: string;\r\n name: string;\r\n code: string;\r\n customFields: any;\r\n }>([]),\r\n });\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 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();\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(): UntypedFormArray {\r\n return this.detailForm.get('values') as UntypedFormArray;\r\n }\r\n\r\n addFacetValue() {\r\n const valuesFormArray = this.detailForm.get('values') as UntypedFormArray | 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 customFields: this.formBuilder.group({}),\r\n });\r\n const newValue: any = { name: '', code: '' };\r\n if (this.customValueFields.length) {\r\n const customValueFieldsGroup = new UntypedFormGroup({});\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 UntypedFormControl());\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') as (typeof this.detailForm)['controls']['facet'];\r\n if (!facetForm || !facetForm.dirty) {\r\n return;\r\n }\r\n const newFacet = this.getUpdatedFacet(\r\n {\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n isPrivate: false,\r\n languageCode: this.languageCode,\r\n name: '',\r\n code: '',\r\n translations: [],\r\n values: [],\r\n },\r\n facetForm,\r\n this.languageCode,\r\n ) as CreateFacetInput;\r\n this.dataService.facet.createFacet(newFacet).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 const valuesArray = this.detailForm.get('values') as (typeof this.detailForm)['controls']['values'];\r\n combineLatest(this.entity$, this.languageCode$)\r\n .pipe(\r\n take(1),\r\n mergeMap(([facet, languageCode]) => {\r\n const facetForm = this.detailForm.get(\r\n 'facet',\r\n ) as (typeof this.detailForm)['controls']['facet'];\r\n const updateOperations: Array<Observable<any>> = [];\r\n\r\n if (facetForm && facetForm.dirty) {\r\n const newFacet = this.getUpdatedFacet(\r\n facet,\r\n facetForm,\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 if (valuesArray && valuesArray.dirty) {\r\n const createdValues = this.getCreatedFacetValues(facet, valuesArray, languageCode);\r\n if (createdValues.length) {\r\n updateOperations.push(\r\n this.dataService.facet.createFacetValues(createdValues).pipe(\r\n switchMap(\r\n () =>\r\n this.dataService.query(GetFacetDetailDocument, {\r\n id: this.id,\r\n }).single$,\r\n ),\r\n ),\r\n );\r\n }\r\n const updatedValues = this.getUpdatedFacetValues(facet, valuesArray, languageCode);\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 )\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 UntypedFormArray | 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 =>\r\n deleted\r\n ? this.dataService.query(GetFacetDetailDocument, {\r\n id: this.id,\r\n }).single$\r\n : [],\r\n ),\r\n )\r\n .subscribe(\r\n () => {\r\n const valuesFormArray = this.detailForm.get('values') as UntypedFormArray | null;\r\n if (valuesFormArray) {\r\n valuesFormArray.removeAt(index);\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 UntypedFormGroup;\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 UntypedFormArray;\r\n this.values = [...facet.values];\r\n facet.values.forEach(value => {\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 let valueControl = currentValuesFormArray.controls.find(\r\n control => control.value.id === value.id,\r\n ) as UntypedFormGroup | undefined;\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 valueControl = this.formBuilder.group(group);\r\n currentValuesFormArray.push(valueControl);\r\n }\r\n if (this.customValueFields.length) {\r\n let customValueFieldsGroup = valueControl.get(['customFields']) as\r\n | UntypedFormGroup\r\n | undefined;\r\n if (!customValueFieldsGroup) {\r\n customValueFieldsGroup = new UntypedFormGroup({});\r\n valueControl.addControl('customFields', customValueFieldsGroup);\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 UntypedFormControl(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: (typeof this.detailForm)['controls']['facet'],\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: (typeof this.detailForm)['controls']['values'],\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 code: input.code ?? '',\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: UntypedFormArray,\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 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","import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BulkAction,\r\n createBulkAssignToChannelAction,\r\n createBulkDeleteAction,\r\n createBulkRemoveFromChannelAction,\r\n currentChannelIsNotDefault,\r\n DataService,\r\n getChannelCodeFromUserStatus,\r\n GetFacetListQuery,\r\n ItemOf,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n RemoveFacetFromChannelResult,\r\n RemoveFacetsFromChannelMutation,\r\n} from '@vendure/admin-ui/core';\r\nimport { unique } from '@vendure/common/lib/unique';\r\nimport { EMPTY, of } from 'rxjs';\r\nimport { map, switchMap } from 'rxjs/operators';\r\n\r\nimport { FacetListComponent } from './facet-list.component';\r\n\r\nexport const deleteFacetsBulkAction = createBulkDeleteAction<ItemOf<GetFacetListQuery, 'facets'>>({\r\n location: 'facet-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.DeleteFacet) ||\r\n userPermissions.includes(Permission.DeleteCatalog),\r\n getItemName: item => item.name,\r\n shouldRetryItem: (response, item) => !!response.message,\r\n bulkDelete: (dataService, ids, retrying) =>\r\n dataService.facet.deleteFacets(ids, retrying).pipe(map(res => res.deleteFacets)),\r\n});\r\n\r\nexport const assignFacetsToChannelBulkAction = createBulkAssignToChannelAction<\r\n ItemOf<GetFacetListQuery, 'facets'>\r\n>({\r\n location: 'facet-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateCatalog) ||\r\n userPermissions.includes(Permission.UpdateFacet),\r\n getItemName: item => item.name,\r\n bulkAssignToChannel: (dataService, facetIds, channelId) =>\r\n dataService.facet\r\n .assignFacetsToChannel({\r\n facetIds,\r\n channelId,\r\n })\r\n .pipe(map(res => res.assignFacetsToChannel)),\r\n});\r\n\r\nexport const removeFacetsFromChannelBulkAction = createBulkRemoveFromChannelAction<\r\n ItemOf<GetFacetListQuery, 'facets'>,\r\n RemoveFacetsFromChannelMutation['removeFacetsFromChannel'][number]\r\n>({\r\n location: 'facet-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.DeleteCatalog) ||\r\n userPermissions.includes(Permission.DeleteFacet),\r\n getItemName: item => item.name,\r\n bulkRemoveFromChannel: (dataService, facetIds, channelId, retrying) =>\r\n dataService.facet\r\n .removeFacetsFromChannel({\r\n channelId: channelId,\r\n facetIds,\r\n force: retrying,\r\n })\r\n .pipe(map(res => res.removeFacetsFromChannel)),\r\n isErrorResult: result => (result.__typename === 'FacetInUseError' ? result.message : undefined),\r\n});\r\n\r\nexport const removeFacetsFromChannelBulkAction2: 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","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left>\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 </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 [routerLink]=\"['./create']\"\r\n *vdrIfPermissions=\"['CreateCatalog', 'CreateFacet']\"\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</vdr-page-block>\r\n<vdr-data-table-2\r\n class=\"mt-2\"\r\n id=\"facet-list\"\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n [filters]=\"filters\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\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-dt2-search\r\n [searchTermControl]=\"searchTermControl\"\r\n [searchTermPlaceholder]=\"'catalog.filter-by-name' | translate\"\r\n ></vdr-dt2-search>\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\" [sort]=\"sorts.get('id')\">\r\n <ng-template let-facet=\"item\">\r\n {{ facet.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.created-at' | translate\" id=\"created-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('createdAt')\"\r\n >\r\n <ng-template let-facet=\"item\">\r\n {{ facet.createdAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.updated-at' | translate\" id=\"updated-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('updatedAt')\"\r\n >\r\n <ng-template let-facet=\"item\">\r\n {{ facet.updatedAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.name' | translate\" id=\"name\" [optional]=\"false\" [sort]=\"sorts.get('name')\">\r\n <ng-template let-facet=\"item\">\r\n <a class=\"button-ghost\" [routerLink]=\"['./', facet.id]\"\r\n ><span>{{ facet.name }}</span>\r\n <clr-icon shape=\"arrow right\"></clr-icon>\r\n </a>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.code' | translate\" id=\"code\">\r\n <ng-template let-facet=\"item\">\r\n {{ facet.code }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.visibility' | translate\" id=\"visibility\">\r\n <ng-template let-facet=\"item\">\r\n <vdr-chip *ngIf=\"facet.isPrivate\" colorType=\"warning\">{{\r\n 'common.private' | translate\r\n }}</vdr-chip>\r\n <vdr-chip *ngIf=\"!facet.isPrivate\" colorType=\"success\">{{\r\n 'common.public' | translate\r\n }}</vdr-chip>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'catalog.values' | translate\" id=\"values\">\r\n <ng-template let-facet=\"item\">\r\n <div class=\"facet-values-list\">\r\n <vdr-facet-value-chip\r\n *ngFor=\"let value of facet.valueList.items | 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 <vdr-chip *ngIf=\"displayLimit[facet.id] < facet.valueList.totalItems && (displayLimit[facet.id] || 0) === facet.valueList.items.length\">\r\n ... + {{ facet.valueList.totalItems - facet.valueList.items.length }}\r\n </vdr-chip>\r\n <button\r\n class=\"button-small\"\r\n *ngIf=\"facet.valueList.items.length > initialLimit\"\r\n (click)=\"toggleDisplayLimit(facet)\"\r\n >\r\n <ng-container *ngIf=\"(displayLimit[facet.id] || 0) < facet.valueList.items.length; else collapse\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ facet.valueList.totalItems - 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 </div>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-custom-field-column *ngFor=\"let customField of customFields\" [customField]=\"customField\" [sorts]=\"sorts\" />\r\n</vdr-data-table-2>\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n DataService,\r\n FACET_WITH_VALUE_LIST_FRAGMENT,\r\n FACET_WITH_VALUES_FRAGMENT,\r\n GetFacetListDocument,\r\n GetFacetListQuery,\r\n ItemOf,\r\n LanguageCode,\r\n TypedBaseListComponent,\r\n} from '@vendure/admin-ui/core';\r\nimport { gql } from 'apollo-angular';\r\n\r\nexport const FACET_LIST_QUERY = gql`\r\n query GetFacetList($options: FacetListOptions) {\r\n facets(options: $options) {\r\n items {\r\n ...FacetWithValueList\r\n }\r\n totalItems\r\n }\r\n }\r\n ${FACET_WITH_VALUE_LIST_FRAGMENT}\r\n`;\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 TypedBaseListComponent<typeof GetFacetListDocument, 'facets'>\r\n implements OnInit\r\n{\r\n readonly initialLimit = 3;\r\n displayLimit: { [id: string]: number } = {};\r\n\r\n readonly customFields = this.getCustomFieldConfig('Facet');\r\n readonly filters = this.createFilterCollection()\r\n .addIdFilter()\r\n .addDateFilters()\r\n .addFilter({\r\n name: 'visibility',\r\n type: { kind: 'boolean' },\r\n label: _('common.visibility'),\r\n toFilterInput: value => ({\r\n isPrivate: { eq: !value },\r\n }),\r\n })\r\n .addCustomFieldFilters(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n readonly sorts = this.createSortCollection()\r\n .defaultSort('createdAt', 'DESC')\r\n .addSort({ name: 'id' })\r\n .addSort({ name: 'createdAt' })\r\n .addSort({ name: 'updatedAt' })\r\n .addSort({ name: 'name' })\r\n .addSort({ name: 'code' })\r\n .addCustomFieldSorts(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n constructor(protected dataService: DataService) {\r\n super();\r\n super.configure({\r\n document: GetFacetListDocument,\r\n getItems: data => data.facets,\r\n setVariables: (skip, take) => ({\r\n options: {\r\n skip,\r\n take,\r\n filter: {\r\n name: {\r\n contains: this.searchTermControl.value,\r\n },\r\n ...this.filters.createFilterInput(),\r\n },\r\n sort: this.sorts.createSortInput(),\r\n },\r\n }),\r\n refreshListOnChanges: [this.filters.valueChanges, this.sorts.valueChanges],\r\n });\r\n }\r\n\r\n toggleDisplayLimit(facet: ItemOf<GetFacetListQuery, 'facets'>) {\r\n if (this.displayLimit[facet.id] === facet.valueList.items.length) {\r\n this.displayLimit[facet.id] = this.initialLimit;\r\n } else {\r\n this.displayLimit[facet.id] = facet.valueList.items.length;\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","<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=\"button-small mt-2\"\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=\"button mb-2\" (click)=\"addOption()\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-option' | translate }}\r\n</button>\r\n\r\n<ng-container *ngIf=\"stockLocations$ | async as stockLocations\">\r\n <clr-alert *ngIf=\"stockLocations.length === 0\" clrAlertType=\"warning\" [clrAlertClosable]=\"false\" class=\"\">\r\n <clr-alert-item>\r\n <span class=\"alert-text\">\r\n {{ 'catalog.no-stock-locations-available-on-current-channel' | translate }}\r\n </span>\r\n </clr-alert-item>\r\n </clr-alert>\r\n\r\n <div class=\"form-grid mb-2\">\r\n <vdr-form-field *ngIf=\"stockLocations.length\" [label]=\"'catalog.add-stock-to-location' | translate\">\r\n <select [(ngModel)]=\"selectedStockLocationId\">\r\n <option *ngFor=\"let location of stockLocations\" [value]=\"location.id\">\r\n {{ location.name }}\r\n </option>\r\n </select>\r\n </vdr-form-field>\r\n </div>\r\n\r\n <div class=\"variants-preview\" *ngIf=\"0 < stockLocations.length\">\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].value.enabled === false\"\r\n [formGroup]=\"variantFormValues[variant.id]\"\r\n >\r\n <td *ngIf=\"1 < variants.length\">\r\n <input type=\"checkbox\" formControlName=\"enabled\" clrCheckbox />\r\n </td>\r\n <td *ngIf=\"1 < variants.length\">\r\n {{ variant.values.join(' ') }}\r\n </td>\r\n <td>\r\n <vdr-form-field>\r\n <input type=\"text\" formControlName=\"sku\" [placeholder]=\"'catalog.sku' | translate\" />\r\n </vdr-form-field>\r\n </td>\r\n <td>\r\n <vdr-form-field>\r\n <vdr-currency-input\r\n formControlName=\"price\"\r\n [currencyCode]=\"currencyCode\"\r\n ></vdr-currency-input>\r\n </vdr-form-field>\r\n </td>\r\n <td>\r\n <vdr-form-field>\r\n <input type=\"number\" formControlName=\"stock\" min=\"0\" step=\"1\" />\r\n </vdr-form-field>\r\n </td>\r\n </tr>\r\n </table>\r\n </div>\r\n</ng-container>\r\n","import { Component, ElementRef, EventEmitter, OnInit, Output, QueryList, ViewChildren } from '@angular/core';\r\nimport { AbstractControl, FormArray, FormBuilder, FormControl, FormGroup } from '@angular/forms';\r\nimport {\r\n CurrencyCode,\r\n DataService,\r\n GetStockLocationListDocument,\r\n GetStockLocationListQuery,\r\n ItemOf,\r\n} from '@vendure/admin-ui/core';\r\nimport { generateAllCombinations } from '@vendure/common/lib/shared-utils';\r\nimport { Observable } from 'rxjs';\r\nimport { tap } from 'rxjs/operators';\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 stockLocationId: string;\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: {\r\n [id: string]: FormGroup<{\r\n optionValues: FormControl<string[]>;\r\n enabled: FormControl<boolean>;\r\n price: FormControl<number>;\r\n sku: FormControl<string>;\r\n stock: FormControl<number>;\r\n }>;\r\n } = {};\r\n stockLocations$: Observable<Array<ItemOf<GetStockLocationListQuery, 'stockLocations'>>>;\r\n selectedStockLocationId: string | null = null;\r\n constructor(private dataService: DataService, private formBuilder: FormBuilder) {}\r\n\r\n ngOnInit() {\r\n this.dataService.settings.getActiveChannel().single$.subscribe(data => {\r\n this.currencyCode = data.activeChannel.defaultCurrencyCode;\r\n });\r\n this.stockLocations$ = this.dataService\r\n .query(GetStockLocationListDocument, {\r\n options: {\r\n take: 999,\r\n },\r\n })\r\n .refetchOnChannelChange()\r\n .mapStream(({ stockLocations }) => stockLocations.items)\r\n .pipe(\r\n tap(items => {\r\n if (items.length) {\r\n this.selectedStockLocationId = items[0].id;\r\n }\r\n }),\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, index) => {\r\n if (!this.variantFormValues[variant.id]) {\r\n const formGroup = this.formBuilder.nonNullable.group({\r\n optionValues: [variant.values],\r\n enabled: true as boolean,\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 formGroup.valueChanges.subscribe(() => this.onFormChange());\r\n if (index === 0) {\r\n formGroup.get('price')?.valueChanges.subscribe(value => {\r\n this.copyValuesToPristine('price', formGroup.get('price'));\r\n });\r\n formGroup.get('sku')?.valueChanges.subscribe(value => {\r\n this.copyValuesToPristine('sku', formGroup.get('sku'));\r\n });\r\n formGroup.get('stock')?.valueChanges.subscribe(value => {\r\n this.copyValuesToPristine('stock', formGroup.get('stock'));\r\n });\r\n }\r\n this.variantFormValues[variant.id] = formGroup;\r\n }\r\n });\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 copyValuesToPristine(field: 'price' | 'sku' | 'stock', formControl: AbstractControl | null) {\r\n if (!formControl) {\r\n return;\r\n }\r\n Object.values(this.variantFormValues).forEach(formGroup => {\r\n const correspondingFormControl = formGroup.get(field) as FormControl;\r\n if (correspondingFormControl && correspondingFormControl.pristine) {\r\n correspondingFormControl.setValue(formControl.value, { emitEvent: false });\r\n }\r\n });\r\n }\r\n\r\n onFormChange() {\r\n const variantsToCreate = this.variants\r\n .map(v => this.variantFormValues[v.id].value as CreateVariantValues)\r\n .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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n stockLocationId: this.selectedStockLocationId!,\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].get(prop)?.value as CreateVariantValues[T])\r\n : value;\r\n }\r\n}\r\n","import { switchMap } from './switchMap';\nimport { isFunction } from '../util/isFunction';\nexport function switchMapTo(innerObservable, resultSelector) {\n return isFunction(resultSelector) ? switchMap(() => innerObservable, resultSelector) : switchMap(() => innerObservable);\n}\n","<vdr-page-block *ngIf=\"!hideLanguageSelect\">\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</vdr-page-block>\r\n<vdr-data-table-2\r\n class=\"mt-2\"\r\n id=\"product-variant-list\"\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n [filters]=\"filters\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n>\r\n <vdr-bulk-action-menu\r\n locationId=\"product-variant-list\"\r\n [hostComponent]=\"this\"\r\n [selectionManager]=\"selectionManager\"\r\n />\r\n <vdr-dt2-search\r\n [searchTermControl]=\"searchTermControl\"\r\n [searchTermPlaceholder]=\"'catalog.filter-by-sku' | translate\"\r\n />\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\" [sort]=\"sorts.get('id')\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.created-at' | translate\" id=\"created-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('createdAt')\"\r\n >\r\n <ng-template let-variant=\"item\">\r\n {{ variant.createdAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.updated-at' | translate\" id=\"updated-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('updatedAt')\"\r\n >\r\n <ng-template let-variant=\"item\">\r\n {{ variant.updatedAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.image' | translate\" id=\"image\">\r\n <ng-template let-variant=\"item\">\r\n <div class=\"image-placeholder\">\r\n <img\r\n *ngIf=\"variant.featuredAsset as asset; else imagePlaceholder\"\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 </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'catalog.name' | translate\" id=\"name\" [optional]=\"false\" [sort]=\"sorts.get('name')\">\r\n <ng-template let-variant=\"item\">\r\n <a\r\n class=\"button-ghost\"\r\n [routerLink]=\"['/catalog/inventory', variant.productId, 'variants', variant.id]\"\r\n ><span>{{ variant.name }}</span\r\n ><clr-icon shape=\"arrow right\"\r\n /></a>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'catalog.sku' | translate\" id=\"sku\" [sort]=\"sorts.get('sku')\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.sku }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.enabled' | translate\" id=\"enabled\">\r\n <ng-template let-variant=\"item\">\r\n <vdr-chip *ngIf=\"variant.enabled\" colorType=\"success\">{{\r\n 'common.enabled' | translate\r\n }}</vdr-chip>\r\n <vdr-chip *ngIf=\"!variant.enabled\" colorType=\"warning\">{{\r\n 'common.disabled' | translate\r\n }}</vdr-chip>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.price' | translate\" id=\"price\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('price')\"\r\n >\r\n <ng-template let-variant=\"item\">\r\n {{ variant.price | localeCurrency : variant.currencyCode }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.price-with-tax' | translate\" id=\"price-with-tax\" [sort]=\"sorts.get('priceWithTax')\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.priceWithTax | localeCurrency : variant.currencyCode }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n\r\n <vdr-dt2-column [heading]=\"'catalog.stock-on-hand' | translate\" id=\"stock-on-hand\" [hiddenByDefault]=\"false\">\r\n <ng-template let-variant=\"item\">\r\n <vdr-chip *ngFor=\"let stockLevel of variant.stockLevels\" [title]=\"stockLevel.stockLocation?.name\">\r\n <div class=\"flex center\">\r\n <div>\r\n {{ stockLevel.stockOnHand\r\n }}<span class=\"ml-1\" *ngIf=\"stockLevel.stockAllocated\"\r\n >({{ stockLevel.stockAllocated }} allocated)</span\r\n >\r\n </div>\r\n </div>\r\n </vdr-chip>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-custom-field-column *ngFor=\"let field of customFields\" [customField]=\"field\" [sorts]=\"sorts\" />\r\n</vdr-data-table-2>\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n LogicalOperator,\r\n ProductVariantListQueryDocument,\r\n TypedBaseListComponent,\r\n} from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-product-variant-list',\r\n templateUrl: './product-variant-list.component.html',\r\n styleUrls: ['./product-variant-list.component.scss'],\r\n})\r\nexport class ProductVariantListComponent\r\n extends TypedBaseListComponent<typeof ProductVariantListQueryDocument, 'productVariants'>\r\n implements OnInit\r\n{\r\n @Input() productId?: string;\r\n @Input() hideLanguageSelect = false;\r\n readonly customFields = this.getCustomFieldConfig('ProductVariant');\r\n readonly filters = this.createFilterCollection()\r\n .addIdFilter()\r\n .addDateFilters()\r\n .addFilters([\r\n {\r\n name: 'name',\r\n type: { kind: 'text' },\r\n label: _('common.name'),\r\n filterField: 'name',\r\n },\r\n {\r\n name: 'enabled',\r\n type: { kind: 'boolean' },\r\n label: _('common.enabled'),\r\n filterField: 'enabled',\r\n },\r\n {\r\n name: 'sku',\r\n type: { kind: 'text' },\r\n label: _('catalog.sku'),\r\n filterField: 'sku',\r\n },\r\n {\r\n name: 'price',\r\n type: { kind: 'number', inputType: 'currency' },\r\n label: _('common.price'),\r\n filterField: 'price',\r\n },\r\n {\r\n name: 'priceWithTax',\r\n type: { kind: 'number', inputType: 'currency' },\r\n label: _('common.price-with-tax'),\r\n filterField: 'priceWithTax',\r\n },\r\n ])\r\n .addCustomFieldFilters(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n readonly sorts = this.createSortCollection()\r\n .addSorts([\r\n { name: 'id' },\r\n { name: 'createdAt' },\r\n { name: 'updatedAt' },\r\n { name: 'name' },\r\n { name: 'sku' },\r\n { name: 'price' },\r\n { name: 'priceWithTax' },\r\n ])\r\n .addCustomFieldSorts(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n constructor() {\r\n super();\r\n this.configure({\r\n document: ProductVariantListQueryDocument,\r\n getItems: data => data.productVariants,\r\n setVariables: (skip, take) => ({\r\n options: {\r\n skip,\r\n take,\r\n filter: {\r\n sku: {\r\n contains: this.searchTermControl.value,\r\n },\r\n ...this.filters.createFilterInput(),\r\n ...(this.productId ? { productId: { eq: this.productId } } : {}),\r\n },\r\n sort: this.sorts.createSortInput(),\r\n },\r\n }),\r\n refreshListOnChanges: [this.sorts.valueChanges, this.filters.valueChanges],\r\n });\r\n }\r\n}\r\n","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left>\r\n <div class=\"flex clr-flex-row\"></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 || createVariantsConfig.variants.length === 0\"\r\n >\r\n {{ 'common.create' | translate }}\r\n </button>\r\n <ng-template #updateButton>\r\n <button\r\n *vdrIfPermissions=\"updatePermissions\"\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</vdr-page-block>\r\n\r\n<form class=\"form\" [formGroup]=\"detailForm\">\r\n <vdr-page-detail-layout>\r\n <vdr-page-detail-sidebar>\r\n <vdr-card>\r\n <vdr-form-field [label]=\"'catalog.visibility' | translate\" for=\"visibility\">\r\n <clr-toggle-wrapper *vdrIfPermissions=\"updatePermissions\">\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n name=\"enabled\"\r\n [formControl]=\"detailForm.get(['enabled'])\"\r\n />\r\n <label>{{ 'common.enabled' | translate }}</label>\r\n </clr-toggle-wrapper>\r\n </vdr-form-field>\r\n </vdr-card>\r\n <ng-container *ngIf=\"!(isNew$ | async)\">\r\n <vdr-card *vdrIfMultichannel [title]=\"'common.channels' | translate\">\r\n <vdr-form-item *vdrIfDefaultChannelActive>\r\n <div class=\"flex channel-assignment\">\r\n <div class=\"mb-2\">\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 [channelCode]=\"channel.code\"></vdr-channel-badge>\r\n {{ channel.code | channelCodeToLabel }}\r\n </vdr-chip>\r\n </ng-container>\r\n </div>\r\n <button class=\"button-small\" (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 </vdr-card>\r\n </ng-container>\r\n <vdr-card *ngIf=\"entity?.optionGroups.length\" [title]=\"'catalog.product-options' | translate\">\r\n <div class=\"options\">\r\n <vdr-chip\r\n *ngFor=\"let optionGroup of entity?.optionGroups | sort : 'id'\"\r\n [colorFrom]=\"optionGroup.code\"\r\n [invert]=\"true\"\r\n >\r\n {{ optionGroup.name }}\r\n </vdr-chip>\r\n </div>\r\n <div>\r\n <a [routerLink]=\"['options']\" class=\"button-small mt-2\" *vdrIfPermissions=\"updatePermissions\">\r\n <clr-icon shape=\"pencil\"></clr-icon>\r\n {{ 'catalog.edit-options' | translate }}\r\n </a>\r\n </div>\r\n </vdr-card>\r\n <vdr-card [title]=\"'catalog.facets' | translate\">\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]=\"updatePermissions | hasPermission\"\r\n (remove)=\"removeProductFacetValue(facetValue.id)\"\r\n ></vdr-facet-value-chip>\r\n </div>\r\n <div>\r\n <button\r\n class=\"button-small mt-2\"\r\n *vdrIfPermissions=\"updatePermissions\"\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 </vdr-card>\r\n <vdr-card *ngIf=\"entity$ | async as entity\">\r\n <vdr-page-entity-info [entity]=\"entity\"></vdr-page-entity-info>\r\n </vdr-card>\r\n </vdr-page-detail-sidebar>\r\n\r\n <vdr-page-block>\r\n <button type=\"submit\" hidden x-data=\"prevents enter key from triggering other buttons\"></button>\r\n <vdr-card>\r\n <div class=\"form-grid\">\r\n <div>\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]=\"!(updatePermissions | hasPermission)\"\r\n (input)=\"updateSlug($event.target.value)\"\r\n />\r\n </vdr-form-field>\r\n <div *ngIf=\"(isNew$ | async) === false && detailForm.get(['name'])?.dirty\">\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>{{ 'catalog.auto-update-product-variant-name' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n </div>\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]=\"!(updatePermissions | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n class=\"form-grid-span\"\r\n [label]=\"'common.description' | translate\"\r\n for=\"slug\"\r\n [errors]=\"{ pattern: 'catalog.slug-pattern-error' | translate }\"\r\n >\r\n <vdr-rich-text-editor\r\n formControlName=\"description\"\r\n [readonly]=\"!(updatePermissions | hasPermission)\"\r\n ></vdr-rich-text-editor>\r\n </vdr-form-field>\r\n </div>\r\n </vdr-card>\r\n <vdr-card [title]=\"'common.custom-fields' | translate\" *ngIf=\"customFields.length\">\r\n <vdr-tabbed-custom-fields\r\n entityName=\"Product\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\r\n [readonly]=\"!(updatePermissions | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </vdr-card>\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 <vdr-card [title]=\"'catalog.assets' | translate\">\r\n <vdr-assets\r\n [assets]=\"assetChanges.assets || entity?.assets\"\r\n [featuredAsset]=\"assetChanges.featuredAsset || entity?.featuredAsset\"\r\n [updatePermissions]=\"updatePermissions\"\r\n (change)=\"assetChanges = $event\"\r\n ></vdr-assets>\r\n </vdr-card>\r\n\r\n <vdr-card [title]=\"'catalog.product-variants' | translate\" [paddingX]=\"isNew$ | async\">\r\n <div *ngIf=\"isNew$ | async; else variantList\">\r\n <vdr-generate-product-variants\r\n (variantsChange)=\"createVariantsConfig = $event\"\r\n ></vdr-generate-product-variants>\r\n </div>\r\n <ng-template #variantList>\r\n <vdr-product-variant-list\r\n [productId]=\"this.id\"\r\n [hideLanguageSelect]=\"true\"\r\n ></vdr-product-variant-list>\r\n </ng-template>\r\n <div class=\"mx-3\" *ngIf=\"(isNew$ | async) === false\">\r\n <a class=\"button\" [routerLink]=\"['manage-variants']\">\r\n <clr-icon shape=\"add-text\"></clr-icon>\r\n {{ 'catalog.manage-variants' | translate }}</a\r\n >\r\n </div>\r\n </vdr-card>\r\n </vdr-page-block>\r\n </vdr-page-detail-layout>\r\n</form>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormBuilder, UntypedFormGroup, 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 CreateProductInput,\r\n createUpdatedTranslatable,\r\n DataService,\r\n findTranslation,\r\n getChannelCodeFromUserStatus,\r\n getCustomFieldsDefaults,\r\n GetProductDetailDocument,\r\n GetProductDetailQuery,\r\n GetProductWithVariantsQuery,\r\n LanguageCode,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n PRODUCT_DETAIL_FRAGMENT,\r\n ProductDetailFragment,\r\n ProductVariantFragment,\r\n ServerConfigService,\r\n TypedBaseDetailComponent,\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 { unique } from '@vendure/common/lib/unique';\r\nimport { gql } from 'apollo-angular';\r\nimport { combineLatest, concat, EMPTY, from, Observable } from 'rxjs';\r\nimport {\r\n distinctUntilChanged,\r\n map,\r\n mergeMap,\r\n shareReplay,\r\n skip,\r\n switchMap,\r\n switchMapTo,\r\n take,\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\n\r\ninterface SelectedAssets {\r\n assets?: Asset[];\r\n featuredAsset?: Asset;\r\n}\r\n\r\nexport const GET_PRODUCT_DETAIL = gql`\r\n query GetProductDetail($id: ID!) {\r\n product(id: $id) {\r\n ...ProductDetail\r\n }\r\n }\r\n ${PRODUCT_DETAIL_FRAGMENT}\r\n`;\r\n\r\n@Component({\r\n selector: 'vdr-product-detail2',\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 TypedBaseDetailComponent<typeof GetProductDetailDocument, 'product'>\r\n implements OnInit, OnDestroy\r\n{\r\n readonly customFields = this.getCustomFieldConfig('Product');\r\n detailForm = 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: [[] as string[]],\r\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),\r\n });\r\n assetChanges: SelectedAssets = {};\r\n productChannels$: Observable<ProductDetailFragment['channels']>;\r\n facetValues$: Observable<ProductDetailFragment['facetValues']>;\r\n createVariantsConfig: CreateProductVariantsConfig = { groups: [], variants: [], stockLocationId: '' };\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 changeDetector: ChangeDetectorRef,\r\n ) {\r\n super();\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\r\n const productFacetValues$ = this.entity$.pipe(map(product => product.facetValues));\r\n const productGroup = this.detailForm;\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n const formFacetValueIdChanges$ = productGroup.get('facetValueIds')!.valueChanges.pipe(\r\n skip(1),\r\n distinctUntilChanged(),\r\n switchMap(ids =>\r\n this.dataService.facet\r\n .getFacetValues({ filter: { id: { in: ids } } })\r\n .mapSingle(({ facetValues }) => facetValues.items),\r\n ),\r\n shareReplay(1),\r\n );\r\n this.facetValues$ = concat(\r\n productFacetValues$.pipe(take(1)),\r\n productFacetValues$.pipe(switchMapTo(formFacetValueIdChanges$)),\r\n );\r\n this.productChannels$ = this.entity$.pipe(map(p => p.channels));\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy();\r\n }\r\n\r\n isDefaultChannel(channelCode: string): boolean {\r\n return channelCode === DEFAULT_CHANNEL_CODE;\r\n }\r\n\r\n assignToChannel() {\r\n this.productChannels$\r\n .pipe(\r\n take(1),\r\n switchMap(channels =>\r\n 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 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({ channelId, variant }: { channelId: string; variant: ProductVariantFragment }) {\r\n from(getChannelCodeFromUserStatus(this.dataService, channelId))\r\n .pipe(\r\n switchMap(({ channelCode }) =>\r\n 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 /**\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 const slugControl = this.detailForm.get('slug');\r\n const currentTranslation = this.entity ? findTranslation(this.entity, this.languageCode) : undefined;\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 selectProductFacetValue() {\r\n this.displayFacetValueModal().subscribe(facetValueIds => {\r\n if (facetValueIds) {\r\n const productGroup = this.detailForm;\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.entity$, 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.detailForm;\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 private displayFacetValueModal(): Observable<string[] | undefined> {\r\n return this.modalService\r\n .fromComponent(ApplyFacetDialogComponent, {\r\n size: 'md',\r\n closable: true,\r\n })\r\n .pipe(map(facetValues => facetValues && facetValues.map(v => v.id)));\r\n }\r\n\r\n create() {\r\n const productGroup = this.detailForm;\r\n if (!productGroup.dirty) {\r\n return;\r\n }\r\n\r\n const newProduct = this.getUpdatedProduct(\r\n {\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n enabled: true,\r\n languageCode: this.languageCode,\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 channels: [],\r\n },\r\n productGroup as UntypedFormGroup,\r\n this.languageCode,\r\n ) as CreateProductInput;\r\n this.productDetailService\r\n .createProductWithVariants(newProduct, this.createVariantsConfig, this.languageCode)\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.detailForm.markAsPristine();\r\n this.router.navigate(['../', productId], { relativeTo: this.route });\r\n },\r\n err => {\r\n // eslint-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.entity$, this.languageCode$)\r\n .pipe(\r\n take(1),\r\n mergeMap(([product, languageCode]) => {\r\n const productGroup = this.detailForm;\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 UntypedFormGroup,\r\n languageCode,\r\n ) as UpdateProductInput;\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.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 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 if (this.customFields.length) {\r\n this.setCustomFieldFormValues(\r\n this.customFields,\r\n this.detailForm.get(['customFields']),\r\n product,\r\n currentTranslation,\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<GetProductDetailQuery['product']>,\r\n productFormGroup: UntypedFormGroup,\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 * 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","import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BulkAction,\r\n createBulkRemoveFromChannelAction,\r\n DataService,\r\n DeletionResult,\r\n GetProductListQuery,\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 } from 'rxjs';\r\nimport { map, 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 } from './product-list.component';\r\n\r\nexport const deleteProductsBulkAction: BulkAction<\r\n ItemOf<GetProductListQuery, 'products'>,\r\n ProductListComponent\r\n> = {\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 ? dataService.product.deleteProducts(unique(selection.map(p => p.id))) : 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<\r\n ItemOf<GetProductListQuery, 'products'>,\r\n ProductListComponent\r\n> = {\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, clearSelection }) => {\r\n const modalService = injector.get(ModalService);\r\n modalService\r\n .fromComponent(AssignProductsToChannelDialogComponent, {\r\n size: 'lg',\r\n locals: {\r\n productIds: unique(selection.map(p => p.id)),\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 = createBulkRemoveFromChannelAction<\r\n ItemOf<GetProductListQuery, 'products'>\r\n>({\r\n location: 'product-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateCatalog) ||\r\n userPermissions.includes(Permission.UpdateProduct),\r\n getItemName: item => item.name,\r\n bulkRemoveFromChannel: (dataService, productIds, channelId) =>\r\n dataService.product\r\n .removeProductsFromChannel({\r\n channelId: channelId,\r\n productIds,\r\n })\r\n .pipe(map(res => res.removeProductsFromChannel)),\r\n});\r\n\r\nexport const assignFacetValuesToProductsBulkAction: BulkAction<\r\n ItemOf<GetProductListQuery, 'products'>,\r\n ProductListComponent\r\n> = {\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';\r\n const ids = unique(selection.map(p => p.id));\r\n return modalService\r\n .fromComponent(BulkAddFacetValuesDialogComponent, {\r\n size: 'xl',\r\n locals: {\r\n mode,\r\n ids,\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","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left>\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 </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=\"button primary mr-1\"\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-dropdown>\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 type=\"button\" vdrDropdownItem (click)=\"rebuildSearchIndex()\">\r\n <clr-icon shape=\"refresh\" class=\"\"></clr-icon>\r\n {{ 'catalog.rebuild-search-index' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </vdr-ab-right>\r\n </vdr-action-bar>\r\n</vdr-page-block>\r\n<vdr-data-table-2\r\n class=\"mt-2\"\r\n id=\"product-list\"\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n [filters]=\"filters\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\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-dt2-search\r\n [searchTermControl]=\"searchTermControl\"\r\n [searchTermPlaceholder]=\"'catalog.filter-by-name' | translate\"\r\n />\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\" [sort]=\"sorts.get('id')\">\r\n <ng-template let-product=\"item\">\r\n {{ product.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.created-at' | translate\" id=\"created-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('createdAt')\"\r\n >\r\n <ng-template let-product=\"item\">\r\n {{ product.createdAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.updated-at' | translate\" id=\"updated-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('updatedAt')\"\r\n >\r\n <ng-template let-product=\"item\">\r\n {{ product.updatedAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.image' | translate\" id=\"image\">\r\n <ng-template let-product=\"item\">\r\n <div class=\"image-placeholder\">\r\n <img\r\n *ngIf=\"product.featuredAsset as asset; else imagePlaceholder\"\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 </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'catalog.name' | translate\" id=\"name\" [optional]=\"false\" [sort]=\"sorts.get('name')\">\r\n <ng-template let-product=\"item\">\r\n <a class=\"button-ghost\" [routerLink]=\"['./', product.id]\"\r\n ><span>{{ product.name }}</span\r\n ><clr-icon shape=\"arrow right\"\r\n /></a>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.slug' | translate\" id=\"slug\" [sort]=\"sorts.get('slug')\">\r\n <ng-template let-product=\"item\">\r\n {{ product.slug }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.enabled' | translate\" id=\"enabled\">\r\n <ng-template let-product=\"item\">\r\n <vdr-chip *ngIf=\"product.enabled\" colorType=\"success\">{{\r\n 'common.enabled' | translate\r\n }}</vdr-chip>\r\n <vdr-chip *ngIf=\"!product.enabled\" colorType=\"warning\">{{\r\n 'common.disabled' | translate\r\n }}</vdr-chip>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'catalog.number-of-variants' | translate\" id=\"number-of-variants\">\r\n <ng-template let-product=\"item\">\r\n {{ 'catalog.variant-count' | translate : { count: product.variantList?.totalItems } }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-custom-field-column\r\n *ngFor=\"let customField of customFields\"\r\n [customField]=\"customField\"\r\n [sorts]=\"sorts\"\r\n />\r\n</vdr-data-table-2>\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n DataService,\r\n FacetValueFormInputComponent,\r\n JobQueueService,\r\n JobState,\r\n ModalService,\r\n NotificationService,\r\n ProductListQueryDocument,\r\n TypedBaseListComponent,\r\n} from '@vendure/admin-ui/core';\r\nimport { EMPTY, lastValueFrom } from 'rxjs';\r\nimport { delay, switchMap } from 'rxjs/operators';\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 TypedBaseListComponent<typeof ProductListQueryDocument, 'products'>\r\n implements OnInit\r\n{\r\n pendingSearchIndexUpdates = 0;\r\n readonly customFields = this.getCustomFieldConfig('Product');\r\n readonly filters = this.createFilterCollection()\r\n .addIdFilter()\r\n .addDateFilters()\r\n .addFilters([\r\n {\r\n name: 'enabled',\r\n type: { kind: 'boolean' },\r\n label: _('common.enabled'),\r\n filterField: 'enabled',\r\n },\r\n {\r\n name: 'slug',\r\n type: { kind: 'text' },\r\n label: _('common.slug'),\r\n filterField: 'slug',\r\n },\r\n ])\r\n .addFilter({\r\n name: 'facetValues',\r\n type: {\r\n kind: 'custom',\r\n component: FacetValueFormInputComponent,\r\n serializeValue: value => value.map(v => v.id).join(','),\r\n deserializeValue: value => value.split(',').map(id => ({ id })),\r\n getLabel: value => {\r\n if (value.length === 0) {\r\n return '';\r\n }\r\n if (value[0].name) {\r\n return value.map(v => v.name).join(', ');\r\n } else {\r\n return lastValueFrom(\r\n this.dataService.facet\r\n .getFacetValues({ filter: { id: { in: value.map(v => v.id) } } })\r\n .mapSingle(({ facetValues }) =>\r\n facetValues.items.map(fv => fv.name).join(', '),\r\n ),\r\n );\r\n }\r\n },\r\n },\r\n label: _('catalog.facet-values'),\r\n toFilterInput: (value: any[]) => ({\r\n facetValueId: {\r\n in: value.map(v => v.id),\r\n },\r\n }),\r\n })\r\n .addCustomFieldFilters(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n readonly sorts = this.createSortCollection()\r\n .defaultSort('createdAt', 'DESC')\r\n .addSorts([\r\n { name: 'id' },\r\n { name: 'createdAt' },\r\n { name: 'updatedAt' },\r\n { name: 'name' },\r\n { name: 'slug' },\r\n ])\r\n .addCustomFieldSorts(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n constructor(\r\n protected dataService: DataService,\r\n private modalService: ModalService,\r\n private notificationService: NotificationService,\r\n private jobQueueService: JobQueueService,\r\n ) {\r\n super();\r\n this.configure({\r\n document: ProductListQueryDocument,\r\n getItems: data => data.products,\r\n setVariables: (skip, take) => ({\r\n options: {\r\n skip,\r\n take,\r\n filter: {\r\n name: {\r\n contains: this.searchTermControl.value,\r\n },\r\n ...this.filters.createFilterInput(),\r\n },\r\n sort: this.sorts.createSortInput(),\r\n },\r\n }),\r\n refreshListOnChanges: [this.sorts.valueChanges, this.filters.valueChanges],\r\n });\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 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","<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 { 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]) => Math.round(price * ((100 + taxRate) / 100))),\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","<ng-select\r\n *ngIf=\"(variants$ | async)?.length > 1\"\r\n [items]=\"variants$ | async\"\r\n appendTo=\"body\"\r\n bindValue=\"id\"\r\n [(ngModel)]=\"selectedVariantId\"\r\n [searchFn]=\"searchFn\"\r\n [clearable]=\"false\"\r\n [placeholder]=\"'catalog.quick-jump-placeholder' | translate\"\r\n (change)=\"onSelect($event)\"\r\n>\r\n <ng-template ng-option-tmp let-item=\"item\" let-index=\"index\" let-search=\"searchTerm\">\r\n {{ item.name }} ({{ item.sku }})\r\n </ng-template>\r\n</ng-select>\r\n","import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport {\r\n DataService,\r\n GetProductVariantsQuickJumpDocument,\r\n GetProductVariantsQuickJumpQuery,\r\n} from '@vendure/admin-ui/core';\r\nimport { gql } from 'apollo-angular';\r\nimport { Observable } from 'rxjs';\r\n\r\nconst GET_PRODUCT_VARIANTS_QUICK_JUMP = gql`\r\n query GetProductVariantsQuickJump($id: ID!) {\r\n product(id: $id) {\r\n id\r\n variants {\r\n id\r\n name\r\n sku\r\n }\r\n }\r\n }\r\n`;\r\n\r\n@Component({\r\n selector: 'vdr-product-variant-quick-jump',\r\n templateUrl: './product-variant-quick-jump.component.html',\r\n styleUrls: ['./product-variant-quick-jump.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ProductVariantQuickJumpComponent implements OnInit {\r\n @Input() productId: string;\r\n selectedVariantId: string | undefined;\r\n variants$: Observable<NonNullable<GetProductVariantsQuickJumpQuery['product']>['variants']>;\r\n constructor(private dataService: DataService, private router: Router) {}\r\n\r\n ngOnInit() {\r\n this.variants$ = this.dataService\r\n .query(GetProductVariantsQuickJumpDocument, {\r\n id: this.productId,\r\n })\r\n .mapSingle(data => data.product?.variants ?? []);\r\n }\r\n\r\n searchFn = (\r\n term: string,\r\n item: NonNullable<GetProductVariantsQuickJumpQuery['product']>['variants'][number],\r\n ) =>\r\n item.name.toLowerCase().includes(term.toLowerCase()) ||\r\n item.sku.toLowerCase().includes(term.toLowerCase());\r\n\r\n onSelect(item?: NonNullable<GetProductVariantsQuickJumpQuery['product']>['variants'][number]) {\r\n if (item) {\r\n this.router\r\n .navigate(['catalog', 'inventory', this.productId, 'variants', item.id])\r\n .then(() => (this.selectedVariantId = undefined));\r\n }\r\n }\r\n}\r\n","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left [grow]=\"true\">\r\n <div class=\"flex center\">\r\n <ng-container *ngIf=\"availableLanguages$ | async as availableLanguages\">\r\n <vdr-language-selector\r\n *ngIf=\"availableLanguages.length > 1\"\r\n class=\"mr-2\"\r\n [disabled]=\"isNew$ | async\"\r\n [availableLanguageCodes]=\"availableLanguages\"\r\n [currentLanguageCode]=\"languageCode$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </ng-container>\r\n <vdr-product-variant-quick-jump [productId]=\"entity?.product.id\" />\r\n </div>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"product-variant-detail\"></vdr-action-bar-items>\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 ||\r\n stockLevelsForm.invalid ||\r\n pricesForm.invalid ||\r\n (detailForm.pristine && stockLevelsForm.pristine && pricesForm.pristine)) &&\r\n !assetsChanged()\r\n \"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n </vdr-ab-right>\r\n </vdr-action-bar>\r\n</vdr-page-block>\r\n<form class=\"form\" [formGroup]=\"detailForm\" *ngIf=\"entity$ | async as variant\">\r\n <vdr-page-detail-layout>\r\n <vdr-page-detail-sidebar\r\n ><vdr-card>\r\n <vdr-form-field [label]=\"'catalog.visibility' | translate\" for=\"visibility\">\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(['enabled'])\"\r\n />\r\n <label>{{ 'common.enabled' | translate }}</label>\r\n </clr-toggle-wrapper>\r\n </vdr-form-field>\r\n </vdr-card>\r\n <vdr-card *ngIf=\"variant.options.length\" [title]=\"'catalog.product-options' | translate\">\r\n <div class=\"options\">\r\n <vdr-chip\r\n *ngFor=\"let option of variant.options | sort : 'groupId'\"\r\n [colorFrom]=\"optionGroupCode(option.groupId)\"\r\n [invert]=\"true\"\r\n >\r\n <span>{{ optionGroupCode(option.groupId) }}:</span>\r\n {{ optionName(option) }}\r\n </vdr-chip>\r\n </div>\r\n <div>\r\n <a\r\n [routerLink]=\"['../../', 'options']\"\r\n class=\"button-small mt-2\"\r\n *vdrIfPermissions=\"updatePermissions\"\r\n >\r\n <clr-icon shape=\"pencil\"></clr-icon>\r\n {{ 'catalog.edit-options' | translate }}\r\n </a>\r\n </div>\r\n </vdr-card>\r\n <vdr-card [title]=\"'catalog.facets' | translate\">\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]=\"updatePermissions | hasPermission\"\r\n (remove)=\"removeFacetValue(facetValue.id)\"\r\n ></vdr-facet-value-chip>\r\n </div>\r\n <div>\r\n <button\r\n class=\"button-small mt-2\"\r\n *vdrIfPermissions=\"updatePermissions\"\r\n (click)=\"selectFacetValue()\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-facets' | translate }}\r\n </button>\r\n </div>\r\n </vdr-card>\r\n\r\n <vdr-card>\r\n <vdr-page-entity-info *ngIf=\"entity$ | async as entity\" [entity]=\"entity\" />\r\n </vdr-card>\r\n </vdr-page-detail-sidebar>\r\n\r\n <vdr-page-block>\r\n <button type=\"submit\" hidden x-data=\"prevents enter key from triggering other buttons\"></button>\r\n <vdr-card>\r\n <div class=\"form-grid\">\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]=\"!(['UpdateCatalog', 'UpdateProduct'] | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'catalog.sku' | translate\" for=\"sku\">\r\n <input\r\n id=\"sku\"\r\n type=\"text\"\r\n formControlName=\"sku\"\r\n [readonly]=\"!(updatePermissions | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n </div>\r\n </vdr-card>\r\n <vdr-card [title]=\"'common.custom-fields' | translate\" *ngIf=\"customFields.length\">\r\n <vdr-tabbed-custom-fields\r\n entityName=\"ProductVariant\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\r\n [readonly]=\"!(updatePermissions | hasPermission)\"\r\n />\r\n </vdr-card>\r\n <vdr-custom-detail-component-host\r\n locationId=\"product-variant-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n />\r\n <vdr-card [title]=\"'catalog.assets' | translate\">\r\n <vdr-assets\r\n [assets]=\"assetChanges.assets || variant.assets\"\r\n [featuredAsset]=\"assetChanges.featuredAsset || variant.featuredAsset\"\r\n [updatePermissions]=\"updatePermissions\"\r\n (change)=\"assetChanges = $event\"\r\n />\r\n </vdr-card>\r\n <vdr-card [title]=\"'catalog.price-and-tax' | translate\">\r\n <div class=\"form-grid\">\r\n <vdr-form-field [label]=\"'catalog.tax-category' | translate\" for=\"taxCategory\">\r\n <select name=\"taxCategory\" formControlName=\"taxCategoryId\">\r\n <option\r\n *ngFor=\"let taxCategory of taxCategories$ | async\"\r\n [value]=\"taxCategory.id\"\r\n >\r\n {{ taxCategory.name }}\r\n </option>\r\n </select>\r\n </vdr-form-field>\r\n </div>\r\n <div class=\"form-grid prices\" *ngFor=\"let price of pricesForm.controls\" [formGroup]=\"price\">\r\n <vdr-form-field\r\n [label]=\"\r\n ('catalog.price' | translate) +\r\n (1 < pricesForm.length ? ' (' + price.value.currencyCode + ')' : '')\r\n \"\r\n [tooltip]=\"\r\n 1 < pricesForm.length && price.value.currencyCode === channelDefaultCurrencyCode\r\n ? ('catalog.default-currency' | translate)\r\n : undefined\r\n \"\r\n for=\"price\"\r\n >\r\n <div class=\"price-wrapper\" [class.pending-deletion]=\"price.value.delete === true\">\r\n <vdr-currency-input\r\n name=\"price\"\r\n [currencyCode]=\"price.value.currencyCode\"\r\n [readonly]=\"\r\n !(updatePermissions | hasPermission) || price.value.delete === true\r\n \"\r\n formControlName=\"price\"\r\n />\r\n <div *ngIf=\"1 < pricesForm.controls.length\">\r\n <button\r\n class=\"button-small delete-button\"\r\n [disabled]=\"price.value.currencyCode === channelDefaultCurrencyCode\"\r\n (click)=\"toggleDeletePrice(price.get('delete'))\"\r\n >\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </vdr-form-field>\r\n <vdr-variant-price-detail\r\n [price]=\"price.value.price\"\r\n [currencyCode]=\"price.value.currencyCode\"\r\n [priceIncludesTax]=\"channelPriceIncludesTax$ | async\"\r\n [taxCategoryId]=\"detailForm.get('taxCategoryId')!.value\"\r\n />\r\n </div>\r\n <ng-container *ngIf=\"unusedCurrencyCodes$ | async as unusedCurrencyCodes\">\r\n <div *ngIf=\"unusedCurrencyCodes.length\">\r\n <vdr-dropdown>\r\n <button class=\"button mt-2\" vdrDropdownTrigger>\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-price-in-another-currency' | translate }}\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu>\r\n <button\r\n vdrDropdownItem\r\n *ngFor=\"let currencyCode of unusedCurrencyCodes\"\r\n (click)=\"addPriceInCurrency(currencyCode)\"\r\n >\r\n {{ currencyCode | localeCurrencyName }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n </ng-container>\r\n </vdr-card>\r\n <vdr-card [title]=\"'catalog.stock-levels' | translate\">\r\n <div class=\"form-grid\">\r\n <vdr-form-field\r\n for=\"track-inventory\"\r\n [label]=\"'catalog.track-inventory' | translate\"\r\n [tooltip]=\"'catalog.track-inventory-tooltip' | translate\"\r\n >\r\n <select\r\n name=\"track-inventory\"\r\n formControlName=\"trackInventory\"\r\n [disabled]=\"!(updatePermissions | hasPermission)\"\r\n >\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 </vdr-form-field>\r\n\r\n <vdr-form-item\r\n [label]=\"'catalog.out-of-stock-threshold' | translate\"\r\n [tooltip]=\"'catalog.out-of-stock-threshold-tooltip' | translate\"\r\n >\r\n <input\r\n type=\"number\"\r\n formControlName=\"outOfStockThreshold\"\r\n [readonly]=\"!(updatePermissions | hasPermission)\"\r\n [vdrDisabled]=\"\r\n detailForm.get('useGlobalOutOfStockThreshold')?.value !== false ||\r\n inventoryIsNotTracked(detailForm)\r\n \"\r\n />\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 !(updatePermissions | hasPermission) || inventoryIsNotTracked(detailForm)\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 </vdr-form-item>\r\n </div>\r\n <div\r\n class=\"form-grid stock-levels\"\r\n *ngFor=\"let stockLevel of stockLevelsForm.controls\"\r\n [formGroup]=\"stockLevel\"\r\n >\r\n <vdr-form-field\r\n [label]=\"\r\n stockLevel.get('stockLocationName')?.value +\r\n ': ' +\r\n ('catalog.stock-on-hand' | translate)\r\n \"\r\n [for]=\"'stockOnHand_' + stockLevel.get('stockLocationId')?.value\"\r\n >\r\n <input\r\n [id]=\"'stockOnHand_' + stockLevel.get('stockLocationId')?.value\"\r\n type=\"number\"\r\n formControlName=\"stockOnHand\"\r\n [readonly]=\"!(updatePermissions | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-item\r\n [label]=\"\r\n stockLevel.get('stockLocationName')?.value +\r\n ': ' +\r\n ('catalog.stock-allocated' | translate)\r\n \"\r\n >\r\n {{ stockLevel.get('stockAllocated')?.value }}\r\n </vdr-form-item>\r\n </div>\r\n <ng-container *ngIf=\"unusedStockLocation$ | async as unusedStockLocations\">\r\n <div *ngIf=\"unusedStockLocations.length\">\r\n <vdr-dropdown>\r\n <button class=\"button mt-2\" vdrDropdownTrigger>\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-stock-location' | translate }}\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu>\r\n <button\r\n vdrDropdownItem\r\n *ngFor=\"let stockLocation of unusedStockLocations\"\r\n (click)=\"addStockLocation(stockLocation)\"\r\n >\r\n <clr-icon shape=\"map-marker\"></clr-icon> {{ stockLocation.name }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n </ng-container>\r\n </vdr-card>\r\n </vdr-page-block>\r\n </vdr-page-detail-layout>\r\n</form>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormBuilder, FormControl, FormGroup, UntypedFormGroup } from '@angular/forms';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n Asset,\r\n CreateProductVariantInput,\r\n createUpdatedTranslatable,\r\n CurrencyCode,\r\n DataService,\r\n findTranslation,\r\n getCustomFieldsDefaults,\r\n GetProductVariantDetailDocument,\r\n GetProductVariantDetailQuery,\r\n GlobalFlag,\r\n ItemOf,\r\n LanguageCode,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n ProductOptionFragment,\r\n ProductVariantUpdateMutationDocument,\r\n TypedBaseDetailComponent,\r\n UpdateProductVariantInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { pick } from '@vendure/common/lib/pick';\r\nimport { unique } from '@vendure/common/lib/unique';\r\nimport { combineLatest, concat, Observable } from 'rxjs';\r\nimport {\r\n distinctUntilChanged,\r\n map,\r\n mergeMap,\r\n shareReplay,\r\n skip,\r\n switchMap,\r\n switchMapTo,\r\n take,\r\n tap,\r\n} from 'rxjs/operators';\r\nimport { ProductDetailService } from '../../providers/product-detail/product-detail.service';\r\nimport { ApplyFacetDialogComponent } from '../apply-facet-dialog/apply-facet-dialog.component';\r\n\r\ninterface SelectedAssets {\r\n assets?: Asset[];\r\n featuredAsset?: Asset;\r\n}\r\n\r\ninterface VariantFormValue {\r\n id: string;\r\n enabled: boolean;\r\n sku: string;\r\n name: string;\r\n taxCategoryId: string;\r\n stockOnHand: number;\r\n useGlobalOutOfStockThreshold: boolean;\r\n outOfStockThreshold: number;\r\n trackInventory: GlobalFlag;\r\n facetValueIds: string[][];\r\n customFields?: any;\r\n}\r\ntype T = NonNullable<GetProductVariantDetailQuery['productVariant']>;\r\ntype T1 = T['stockLevels'];\r\n@Component({\r\n selector: 'vdr-product-variant-detail',\r\n templateUrl: './product-variant-detail.component.html',\r\n styleUrls: ['./product-variant-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ProductVariantDetailComponent\r\n extends TypedBaseDetailComponent<typeof GetProductVariantDetailDocument, 'productVariant'>\r\n implements OnInit, OnDestroy\r\n{\r\n public readonly updatePermissions = [Permission.UpdateCatalog, Permission.UpdateProduct];\r\n readonly customFields = this.getCustomFieldConfig('ProductVariant');\r\n readonly customOptionFields = this.getCustomFieldConfig('ProductOption');\r\n stockLevels$: Observable<NonNullable<GetProductVariantDetailQuery['productVariant']>['stockLevels']>;\r\n detailForm = this.formBuilder.group<VariantFormValue>({\r\n id: '',\r\n enabled: false,\r\n sku: '',\r\n name: '',\r\n taxCategoryId: '',\r\n stockOnHand: 0,\r\n useGlobalOutOfStockThreshold: true,\r\n outOfStockThreshold: 0,\r\n trackInventory: GlobalFlag.TRUE,\r\n facetValueIds: [],\r\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),\r\n });\r\n stockLevelsForm = this.formBuilder.array<\r\n FormGroup<{\r\n stockLocationId: FormControl<string | null>;\r\n stockLocationName: FormControl<string | null>;\r\n stockOnHand: FormControl<number | null>;\r\n stockAllocated: FormControl<number | null>;\r\n }>\r\n >([]);\r\n pricesForm = this.formBuilder.array<\r\n FormGroup<{\r\n price: FormControl<number | null>;\r\n currencyCode: FormControl<CurrencyCode | null>;\r\n delete: FormControl<boolean | null>;\r\n }>\r\n >([]);\r\n assetChanges: SelectedAssets = {};\r\n taxCategories$: Observable<Array<ItemOf<GetProductVariantDetailQuery, 'taxCategories'>>>;\r\n unusedStockLocation$: Observable<Array<ItemOf<GetProductVariantDetailQuery, 'stockLocations'>>>;\r\n unusedCurrencyCodes$: Observable<string[]>;\r\n channelPriceIncludesTax$: Observable<boolean>;\r\n readonly GlobalFlag = GlobalFlag;\r\n globalTrackInventory: boolean;\r\n globalOutOfStockThreshold: number;\r\n facetValues$: Observable<NonNullable<GetProductVariantDetailQuery['productVariant']>['facetValues']>;\r\n channelDefaultCurrencyCode: CurrencyCode;\r\n\r\n constructor(\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 changeDetector: ChangeDetectorRef,\r\n ) {\r\n super();\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\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.taxCategories$ = this.result$.pipe(map(data => data.taxCategories.items));\r\n const availableCurrencyCodes$ = this.result$.pipe(\r\n tap(data => (this.channelDefaultCurrencyCode = data.activeChannel.defaultCurrencyCode)),\r\n map(data => data.activeChannel.availableCurrencyCodes),\r\n );\r\n this.unusedCurrencyCodes$ = combineLatest(this.pricesForm.valueChanges, availableCurrencyCodes$).pipe(\r\n map(([prices, currencyCodes]) =>\r\n currencyCodes.filter(code => !prices.map(p => p.currencyCode).includes(code)),\r\n ),\r\n );\r\n const stockLocations$ = this.result$.pipe(map(data => data.stockLocations.items));\r\n this.unusedStockLocation$ = combineLatest(this.entity$, stockLocations$).pipe(\r\n map(([entity, stockLocations]) => {\r\n const usedIds = entity.stockLevels.map(l => l.stockLocation.id);\r\n return stockLocations.filter(l => !usedIds.includes(l.id));\r\n }),\r\n );\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 this.stockLevels$ = this.entity$.pipe(map(entity => entity?.stockLevels ?? []));\r\n const facetValues$ = this.entity$.pipe(map(variant => variant.facetValues ?? []));\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n const formFacetValueIdChanges$ = this.detailForm.get('facetValueIds')!.valueChanges.pipe(\r\n skip(1),\r\n distinctUntilChanged(),\r\n switchMap(ids =>\r\n this.dataService.facet\r\n .getFacetValues({ filter: { id: { in: ids } } })\r\n .mapSingle(({ facetValues }) => facetValues.items),\r\n ),\r\n shareReplay(1),\r\n );\r\n this.facetValues$ = concat(\r\n facetValues$.pipe(take(1)),\r\n facetValues$.pipe(switchMapTo(formFacetValueIdChanges$)),\r\n );\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy();\r\n }\r\n\r\n addPriceInCurrency(currencyCode: CurrencyCode) {\r\n this.pricesForm.push(\r\n this.formBuilder.group({\r\n currencyCode,\r\n price: 0,\r\n delete: false as boolean,\r\n }),\r\n );\r\n }\r\n\r\n toggleDeletePrice(deleteFormControl: FormControl) {\r\n deleteFormControl.setValue(!deleteFormControl.value);\r\n deleteFormControl.markAsDirty();\r\n }\r\n\r\n addStockLocation(stockLocation: ItemOf<GetProductVariantDetailQuery, 'stockLocations'>) {\r\n this.stockLevelsForm.push(\r\n this.formBuilder.group({\r\n stockLocationId: stockLocation.id,\r\n stockLocationName: stockLocation.name,\r\n stockOnHand: 0,\r\n stockAllocated: 0,\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(([variant, languageCode]) => {\r\n const input = pick(\r\n this.getUpdatedVariant(\r\n variant,\r\n this.detailForm,\r\n languageCode,\r\n ) as UpdateProductVariantInput,\r\n [\r\n 'id',\r\n 'enabled',\r\n 'translations',\r\n 'sku',\r\n 'taxCategoryId',\r\n 'facetValueIds',\r\n 'featuredAssetId',\r\n 'assetIds',\r\n 'trackInventory',\r\n 'outOfStockThreshold',\r\n 'useGlobalOutOfStockThreshold',\r\n 'customFields',\r\n ],\r\n ) as UpdateProductVariantInput;\r\n if (this.stockLevelsForm.dirty) {\r\n input.stockLevels = this.stockLevelsForm.controls\r\n .filter(control => control.dirty)\r\n .map(control => ({\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n stockLocationId: control.value.stockLocationId!,\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n stockOnHand: control.value.stockOnHand!,\r\n }));\r\n }\r\n if (this.pricesForm.dirty) {\r\n input.prices = this.pricesForm.controls\r\n .filter(control => control.dirty)\r\n .map(control => ({\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n price: control.value.price!,\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n currencyCode: control.value.currencyCode!,\r\n delete: control.value.delete === true,\r\n }));\r\n }\r\n return this.dataService.mutate(ProductVariantUpdateMutationDocument, {\r\n input: [input],\r\n });\r\n }),\r\n )\r\n .subscribe(\r\n result => {\r\n this.detailForm.markAsPristine();\r\n this.stockLevelsForm.markAsPristine();\r\n this.pricesForm.markAsPristine();\r\n this.assetChanges = {};\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'ProductVariant',\r\n });\r\n this.changeDetector.markForCheck();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'ProductVariant',\r\n });\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 inventoryIsNotTracked(formGroup: UntypedFormGroup): 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 optionGroupCode(optionGroupId: string): string | undefined {\r\n const group = this.entity?.product.optionGroups.find(g => g.id === optionGroupId);\r\n return group?.code;\r\n }\r\n\r\n optionName(option: ProductOptionFragment) {\r\n const translation =\r\n option.translations.find(t => t.languageCode === this.languageCode) ?? option.translations[0];\r\n return translation.name;\r\n }\r\n\r\n removeFacetValue(facetValueId: string) {\r\n const productGroup = this.detailForm;\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 selectFacetValue() {\r\n this.displayFacetValueModal().subscribe(facetValueIds => {\r\n if (facetValueIds) {\r\n const currentFacetValueIds = this.detailForm.value.facetValueIds ?? [];\r\n this.detailForm.patchValue({\r\n facetValueIds: unique([...currentFacetValueIds, ...facetValueIds]),\r\n });\r\n this.detailForm.markAsDirty();\r\n }\r\n });\r\n }\r\n\r\n private displayFacetValueModal(): Observable<string[] | undefined> {\r\n return this.modalService\r\n .fromComponent(ApplyFacetDialogComponent, {\r\n size: 'md',\r\n closable: true,\r\n })\r\n .pipe(map(facetValues => facetValues && facetValues.map(v => v.id)));\r\n }\r\n\r\n protected setFormValues(\r\n variant: NonNullable<GetProductVariantDetailQuery['productVariant']>,\r\n languageCode: LanguageCode,\r\n ): void {\r\n const variantTranslation = findTranslation(variant, languageCode);\r\n const facetValueIds = variant.facetValues.map(fv => fv.id);\r\n this.detailForm.patchValue({\r\n id: variant.id,\r\n enabled: variant.enabled,\r\n sku: variant.sku,\r\n name: variantTranslation ? variantTranslation.name : '',\r\n taxCategoryId: variant.taxCategory.id,\r\n stockOnHand: variant.stockLevels[0]?.stockOnHand ?? 0,\r\n useGlobalOutOfStockThreshold: variant.useGlobalOutOfStockThreshold,\r\n outOfStockThreshold: variant.outOfStockThreshold,\r\n trackInventory: variant.trackInventory,\r\n facetValueIds,\r\n });\r\n this.stockLevelsForm.clear();\r\n for (const stockLevel of variant.stockLevels) {\r\n this.stockLevelsForm.push(\r\n this.formBuilder.group({\r\n stockLocationId: stockLevel.stockLocation.id,\r\n stockLocationName: stockLevel.stockLocation.name,\r\n stockOnHand: stockLevel.stockOnHand,\r\n stockAllocated: stockLevel.stockAllocated,\r\n }),\r\n );\r\n }\r\n this.pricesForm.clear();\r\n for (const price of variant.prices) {\r\n this.pricesForm.push(\r\n this.formBuilder.group({\r\n price: price.price,\r\n currencyCode: price.currencyCode,\r\n delete: false as boolean,\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('customFields'),\r\n variant,\r\n variantTranslation,\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 getUpdatedVariant(\r\n variant: NonNullable<GetProductVariantDetailQuery['productVariant']>,\r\n variantFormGroup: typeof this.detailForm,\r\n languageCode: LanguageCode,\r\n ): UpdateProductVariantInput | CreateProductVariantInput {\r\n const updatedProduct = createUpdatedTranslatable({\r\n translatable: variant,\r\n updatedFields: variantFormGroup.value,\r\n customFieldConfig: this.customFields,\r\n languageCode,\r\n defaultTranslation: {\r\n languageCode,\r\n name: variant.name || '',\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: variantFormGroup.value.facetValueIds,\r\n taxCategoryId: variantFormGroup.value.taxCategoryId,\r\n } as UpdateProductVariantInput | CreateProductVariantInput;\r\n }\r\n}\r\n","import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BulkAction,\r\n DataService,\r\n DeletionResult,\r\n GetProductVariantListQuery,\r\n ItemOf,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n createBulkRemoveFromChannelAction,\r\n isMultiChannel,\r\n} from '@vendure/admin-ui/core';\r\nimport { unique } from '@vendure/common/lib/unique';\r\nimport { EMPTY } from 'rxjs';\r\nimport { map, switchMap } from 'rxjs/operators';\r\n\r\nimport { ProductVariant } from 'package/core';\r\nimport { AssignProductsToChannelDialogComponent } from '../assign-products-to-channel-dialog/assign-products-to-channel-dialog.component';\r\nimport { ProductVariantListComponent } from './product-variant-list.component';\r\n\r\nexport const assignProductVariantsToChannelBulkAction: BulkAction<\r\n ItemOf<GetProductVariantListQuery, 'productVariants'>,\r\n ProductVariantListComponent\r\n> = {\r\n location: 'product-variant-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, clearSelection }) => {\r\n const modalService = injector.get(ModalService);\r\n modalService\r\n .fromComponent(AssignProductsToChannelDialogComponent, {\r\n size: 'lg',\r\n locals: {\r\n productVariantIds: unique(selection.map(p => p.id)),\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 removeProductVariantsFromChannelBulkAction = createBulkRemoveFromChannelAction<\r\n ItemOf<GetProductVariantListQuery, 'productVariants'>\r\n>({\r\n location: 'product-variant-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateCatalog) ||\r\n userPermissions.includes(Permission.UpdateProduct),\r\n getItemName: item => item.name,\r\n bulkRemoveFromChannel: (dataService, ids, channelId) =>\r\n dataService.product\r\n .removeVariantsFromChannel({\r\n channelId: channelId,\r\n productVariantIds: ids,\r\n })\r\n .pipe(map(res => res.removeProductVariantsFromChannel)),\r\n});\r\n\r\nexport const deleteProductVariantsBulkAction: BulkAction<ProductVariant, ProductVariantListComponent> = {\r\n location: 'product-variant-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: _('common.confirm-bulk-delete'),\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.deleteProductVariants(unique(selection.map(p => p.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.deleteProductVariants) {\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","<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 {\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 { UntypedFormArray, UntypedFormGroup } from '@angular/forms';\r\nimport { Asset, Permission, ProductDetailFragment, ProductVariantFragment } from '@vendure/admin-ui/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged, map } from 'rxjs/operators';\r\n\r\ninterface SelectedAssets {\r\n assets?: Asset[];\r\n featuredAsset?: Asset;\r\n}\r\n\r\ninterface PaginationConfig {\r\n totalItems: number;\r\n currentPage: number;\r\n itemsPerPage: number;\r\n}\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: UntypedFormArray;\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, UntypedFormGroup>();\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 UntypedFormGroup);\r\n }\r\n this.changeDetector.markForCheck();\r\n }\r\n}\r\n","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left></vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"stock-location-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 class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\r\n *vdrIfPermissions=\"'UpdateStockLocation'\"\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</vdr-page-block>\r\n\r\n<form class=\"form\" [formGroup]=\"detailForm\">\r\n <vdr-page-detail-layout>\r\n <vdr-page-detail-sidebar>\r\n <vdr-card *ngIf=\"entity$ | async as entity\">\r\n <vdr-page-entity-info [entity]=\"entity\" />\r\n </vdr-card>\r\n </vdr-page-detail-sidebar>\r\n <vdr-page-block>\r\n <vdr-card>\r\n <div class=\"form-grid\">\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]=\"!('UpdateStockLocation' | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n class=\"form-grid-span\"\r\n [label]=\"'common.description' | translate\"\r\n for=\"slug\"\r\n [errors]=\"{ pattern: 'catalog.slug-pattern-error' | translate }\"\r\n >\r\n <vdr-rich-text-editor\r\n formControlName=\"description\"\r\n [readonly]=\"!('UpdateStockLocation' | hasPermission)\"\r\n ></vdr-rich-text-editor>\r\n </vdr-form-field>\r\n </div>\r\n </vdr-card>\r\n <vdr-card\r\n formGroupName=\"customFields\"\r\n *ngIf=\"customFields.length\"\r\n [title]=\"'common.custom-fields' | translate\"\r\n >\r\n <vdr-tabbed-custom-fields\r\n entityName=\"StockLocation\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\r\n ></vdr-tabbed-custom-fields>\r\n </vdr-card>\r\n <vdr-custom-detail-component-host\r\n locationId=\"stock-location-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n </vdr-page-block>\r\n </vdr-page-detail-layout>\r\n</form>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormBuilder, Validators } from '@angular/forms';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n CreateStockLocationDocument,\r\n CreateStockLocationInput,\r\n DataService,\r\n getCustomFieldsDefaults,\r\n GetStockLocationDetailDocument,\r\n NotificationService,\r\n StockLocationDetailFragment,\r\n TypedBaseDetailComponent,\r\n UpdateStockLocationDocument,\r\n UpdateStockLocationInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { gql } from 'apollo-angular';\r\nimport { mergeMap, take } from 'rxjs/operators';\r\n\r\nconst STOCK_LOCATION_DETAIL_FRAGMENT = gql`\r\n fragment StockLocationDetail on StockLocation {\r\n id\r\n createdAt\r\n updatedAt\r\n name\r\n description\r\n }\r\n`;\r\n\r\nexport const GET_STOCK_LOCATION_DETAIL = gql`\r\n query GetStockLocationDetail($id: ID!) {\r\n stockLocation(id: $id) {\r\n ...StockLocationDetail\r\n }\r\n }\r\n ${STOCK_LOCATION_DETAIL_FRAGMENT}\r\n`;\r\n\r\nexport const CREATE_STOCK_LOCATION = gql`\r\n mutation CreateStockLocation($input: CreateStockLocationInput!) {\r\n createStockLocation(input: $input) {\r\n ...StockLocationDetail\r\n }\r\n }\r\n ${STOCK_LOCATION_DETAIL_FRAGMENT}\r\n`;\r\n\r\nexport const UPDATE_STOCK_LOCATION = gql`\r\n mutation UpdateStockLocation($input: UpdateStockLocationInput!) {\r\n updateStockLocation(input: $input) {\r\n ...StockLocationDetail\r\n }\r\n }\r\n ${STOCK_LOCATION_DETAIL_FRAGMENT}\r\n`;\r\n\r\n@Component({\r\n selector: 'vdr-stock-location-detail',\r\n templateUrl: './stock-location-detail.component.html',\r\n styleUrls: ['./stock-location-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class StockLocationDetailComponent\r\n extends TypedBaseDetailComponent<typeof GetStockLocationDetailDocument, 'stockLocation'>\r\n implements OnInit, OnDestroy\r\n{\r\n customFields = this.getCustomFieldConfig('StockLocation');\r\n detailForm = this.formBuilder.group({\r\n name: ['', Validators.required],\r\n description: [''],\r\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),\r\n });\r\n\r\n constructor(\r\n private changeDetector: ChangeDetectorRef,\r\n protected dataService: DataService,\r\n private formBuilder: FormBuilder,\r\n private notificationService: NotificationService,\r\n ) {\r\n super();\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 create() {\r\n if (!this.detailForm.dirty) {\r\n return;\r\n }\r\n const { name, description, customFields } = this.detailForm.value;\r\n if (!name) {\r\n return;\r\n }\r\n const input = {\r\n name,\r\n description,\r\n customFields,\r\n } satisfies CreateStockLocationInput;\r\n this.dataService.mutate(CreateStockLocationDocument, { input }).subscribe(\r\n data => {\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'StockLocation',\r\n });\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n this.router.navigate(['../', data.createStockLocation.id], { relativeTo: this.route });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-create-error'), {\r\n entity: 'StockLocation',\r\n });\r\n },\r\n );\r\n }\r\n\r\n save() {\r\n if (!this.detailForm.dirty) {\r\n return;\r\n }\r\n const formValue = this.detailForm.value;\r\n this.entity$\r\n .pipe(\r\n take(1),\r\n mergeMap(taxRate => {\r\n const input = {\r\n id: taxRate.id,\r\n name: formValue.name,\r\n description: formValue.description,\r\n customFields: formValue.customFields,\r\n } satisfies UpdateStockLocationInput;\r\n return this.dataService.mutate(UpdateStockLocationDocument, { input });\r\n }),\r\n )\r\n .subscribe(\r\n data => {\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'StockLocation',\r\n });\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'StockLocation',\r\n });\r\n },\r\n );\r\n }\r\n\r\n /**\r\n * Update the form values when the entity changes.\r\n */\r\n protected setFormValues(entity: StockLocationDetailFragment): void {\r\n this.detailForm.patchValue({\r\n name: entity.name,\r\n description: entity.description,\r\n });\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","import {\r\n AssignStockLocationsToChannelDocument,\r\n createBulkAssignToChannelAction,\r\n createBulkDeleteAction,\r\n createBulkRemoveFromChannelAction,\r\n DeleteStockLocationsDocument,\r\n DeletionResult,\r\n GetStockLocationListQuery,\r\n ItemOf,\r\n Permission,\r\n RemoveStockLocationsFromChannelDocument,\r\n} from '@vendure/admin-ui/core';\r\nimport { gql } from 'apollo-angular';\r\nimport { map } from 'rxjs/operators';\r\n\r\nconst DELETE_STOCK_LOCATIONS = gql`\r\n mutation DeleteStockLocations($input: [DeleteStockLocationInput!]!) {\r\n deleteStockLocations(input: $input) {\r\n result\r\n message\r\n }\r\n }\r\n`;\r\n\r\nconst ASSIGN_STOCK_LOCATIONS_TO_CHANNEL = gql`\r\n mutation AssignStockLocationsToChannel($input: AssignStockLocationsToChannelInput!) {\r\n assignStockLocationsToChannel(input: $input) {\r\n id\r\n name\r\n }\r\n }\r\n`;\r\n\r\nconst REMOVE_STOCK_LOCATIONS_FROM_CHANNEL = gql`\r\n mutation RemoveStockLocationsFromChannel($input: RemoveStockLocationsFromChannelInput!) {\r\n removeStockLocationsFromChannel(input: $input) {\r\n id\r\n name\r\n }\r\n }\r\n`;\r\n\r\nexport const deleteStockLocationsBulkAction = createBulkDeleteAction<\r\n ItemOf<GetStockLocationListQuery, 'stockLocations'>\r\n>({\r\n location: 'stock-location-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.DeleteStockLocation) ||\r\n userPermissions.includes(Permission.DeleteCatalog),\r\n getItemName: item => item.name,\r\n bulkDelete: (dataService, ids) =>\r\n dataService\r\n .mutate(DeleteStockLocationsDocument, {\r\n input: ids.map(id => ({ id })),\r\n })\r\n .pipe(map(res => res.deleteStockLocations)),\r\n shouldRetryItem: response => response.result === DeletionResult.NOT_DELETED,\r\n});\r\n\r\nexport const assignStockLocationsToChannelBulkAction = createBulkAssignToChannelAction<\r\n ItemOf<GetStockLocationListQuery, 'stockLocations'>\r\n>({\r\n location: 'stock-location-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateCatalog) ||\r\n userPermissions.includes(Permission.UpdateStockLocation),\r\n getItemName: item => item.name,\r\n bulkAssignToChannel: (dataService, stockLocationIds, channelId) =>\r\n dataService\r\n .mutate(AssignStockLocationsToChannelDocument, {\r\n input: {\r\n channelId,\r\n stockLocationIds,\r\n },\r\n })\r\n .pipe(map(res => res.assignStockLocationsToChannel)),\r\n});\r\n\r\nexport const removeStockLocationsFromChannelBulkAction = createBulkRemoveFromChannelAction<\r\n ItemOf<GetStockLocationListQuery, 'stockLocations'>\r\n>({\r\n location: 'stock-location-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.DeleteCatalog) ||\r\n userPermissions.includes(Permission.DeleteStockLocation),\r\n getItemName: item => item.name,\r\n bulkRemoveFromChannel: (dataService, stockLocationIds, channelId) =>\r\n dataService\r\n .mutate(RemoveStockLocationsFromChannelDocument, {\r\n input: {\r\n channelId,\r\n stockLocationIds,\r\n },\r\n })\r\n .pipe(map(res => res.removeStockLocationsFromChannel)),\r\n});\r\n","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left> </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"stock-location-list\"></vdr-action-bar-items>\r\n <a\r\n class=\"button primary\"\r\n *vdrIfPermissions=\"['CreateStockLocation']\"\r\n [routerLink]=\"['./', 'create']\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.create-new-stock-location' | translate }}\r\n </a>\r\n </vdr-ab-right>\r\n </vdr-action-bar>\r\n</vdr-page-block>\r\n<vdr-data-table-2\r\n class=\"mt-2\"\r\n id=\"stock-location-list\"\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n [filters]=\"filters\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n>\r\n <vdr-bulk-action-menu\r\n locationId=\"stock-location-list\"\r\n [hostComponent]=\"this\"\r\n [selectionManager]=\"selectionManager\"\r\n />\r\n <vdr-dt2-search\r\n [searchTermControl]=\"searchTermControl\"\r\n [searchTermPlaceholder]=\"'catalog.filter-by-name' | translate\"\r\n />\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\" [sort]=\"sorts.get('id')\">\r\n <ng-template let-stockLocation=\"item\">\r\n {{ stockLocation.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.created-at' | translate\" id=\"created-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('createdAt')\"\r\n >\r\n <ng-template let-stockLocation=\"item\">\r\n {{ stockLocation.createdAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.updated-at' | translate\" id=\"updated-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('updatedAt')\"\r\n >\r\n <ng-template let-stockLocation=\"item\">\r\n {{ stockLocation.updatedAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.name' | translate\" id=\"name\" [optional]=\"false\" [sort]=\"sorts.get('name')\">\r\n <ng-template let-stockLocation=\"item\">\r\n <a class=\"button-ghost\" [routerLink]=\"['./', stockLocation.id]\"\r\n ><span>{{ stockLocation.name }}</span\r\n ><clr-icon shape=\"arrow right\"\r\n /></a>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.description' | translate\" id=\"description\" [sort]=\"sorts.get('description')\">\r\n <ng-template let-stockLocation=\"item\">\r\n <div class=\"description\" [innerHTML]=\"stockLocation.description\"></div>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-custom-field-column\r\n *ngFor=\"let field of customFields\"\r\n [customField]=\"field\"\r\n [sorts]=\"sorts\" />\r\n</vdr-data-table-2>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport { GetStockLocationListDocument, TypedBaseListComponent } from '@vendure/admin-ui/core';\r\nimport { gql } from 'apollo-angular';\r\n\r\nexport const GET_STOCK_LOCATION_LIST = gql`\r\n query GetStockLocationList($options: StockLocationListOptions) {\r\n stockLocations(options: $options) {\r\n items {\r\n ...StockLocationListItem\r\n }\r\n totalItems\r\n }\r\n }\r\n fragment StockLocationListItem on StockLocation {\r\n id\r\n createdAt\r\n updatedAt\r\n name\r\n description\r\n }\r\n`;\r\n\r\n@Component({\r\n selector: 'vdr-stock-location-list',\r\n templateUrl: './stock-location-list.component.html',\r\n styleUrls: ['./stock-location-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class StockLocationListComponent\r\n extends TypedBaseListComponent<typeof GetStockLocationListDocument, 'stockLocations'>\r\n implements OnInit\r\n{\r\n readonly customFields = this.getCustomFieldConfig('StockLocation');\r\n readonly filters = this.createFilterCollection()\r\n .addIdFilter()\r\n .addDateFilters()\r\n .addFilters([\r\n {\r\n name: 'enabled',\r\n type: { kind: 'text' },\r\n label: _('common.enabled'),\r\n filterField: 'name',\r\n },\r\n {\r\n name: 'sku',\r\n type: { kind: 'text' },\r\n label: _('catalog.sku'),\r\n filterField: 'description',\r\n },\r\n ])\r\n .addCustomFieldFilters(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n readonly sorts = this.createSortCollection()\r\n .addSorts([\r\n { name: 'id' },\r\n { name: 'createdAt' },\r\n { name: 'updatedAt' },\r\n { name: 'name' },\r\n { name: 'description' },\r\n ])\r\n .addCustomFieldSorts(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n constructor() {\r\n super();\r\n this.configure({\r\n document: GetStockLocationListDocument,\r\n getItems: data => data.stockLocations,\r\n setVariables: (skip, take) => ({\r\n options: {\r\n skip,\r\n take,\r\n filter: {\r\n name: {\r\n contains: this.searchTermControl.value,\r\n },\r\n ...this.filters.createFilterInput(),\r\n },\r\n sort: this.sorts.createSortInput(),\r\n },\r\n }),\r\n refreshListOnChanges: [this.sorts.valueChanges, this.filters.valueChanges],\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, OnInit } from '@angular/core';\r\nimport { UntypedFormControl, UntypedFormGroup } from '@angular/forms';\r\nimport {\r\n CustomFieldConfig,\r\n LanguageCode,\r\n ProductVariantFragment,\r\n UpdateProductOptionInput,\r\n createUpdatedTranslatable,\r\n Dialog,\r\n} from '@vendure/admin-ui/core';\r\n\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: UntypedFormGroup;\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 UntypedFormGroup({});\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 UntypedFormControl(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","import { NgModule } from '@angular/core';\r\nimport { RouterModule, ROUTES } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n AssetDetailQueryDocument,\r\n BulkActionRegistryService,\r\n CollectionDetailQueryDocument,\r\n detailComponentWithResolver,\r\n GetFacetDetailDocument,\r\n GetProductDetailDocument,\r\n GetProductVariantDetailDocument,\r\n GetStockLocationDetailDocument,\r\n PageService,\r\n SharedModule,\r\n} from '@vendure/admin-ui/core';\r\n\r\nimport { createRoutes } 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 { 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 { CollectionDataTableComponent } from './components/collection-data-table/collection-data-table.component';\r\nimport { CollectionDetailComponent } from './components/collection-detail/collection-detail.component';\r\nimport { CollectionBreadcrumbPipe } from './components/collection-list/collection-breadcrumb.pipe';\r\nimport {\r\n assignCollectionsToChannelBulkAction,\r\n deleteCollectionsBulkAction,\r\n moveCollectionsBulkAction,\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 { CreateProductOptionGroupDialogComponent } from './components/create-product-option-group-dialog/create-product-option-group-dialog.component';\r\nimport { CreateProductVariantDialogComponent } from './components/create-product-variant-dialog/create-product-variant-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 { MoveCollectionsDialogComponent } from './components/move-collections-dialog/move-collections-dialog.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 { ProductVariantDetailComponent } from './components/product-variant-detail/product-variant-detail.component';\r\nimport { ProductVariantListComponent } from './components/product-variant-list/product-variant-list.component';\r\nimport {\r\n assignProductVariantsToChannelBulkAction,\r\n removeProductVariantsFromChannelBulkAction,\r\n deleteProductVariantsBulkAction,\r\n} from './components/product-variant-list/product-variant-list-bulk-actions';\r\nimport { ProductVariantQuickJumpComponent } from './components/product-variant-quick-jump/product-variant-quick-jump.component';\r\nimport { ProductVariantsEditorComponent } from './components/product-variants-editor/product-variants-editor.component';\r\nimport { ProductVariantsTableComponent } from './components/product-variants-table/product-variants-table.component';\r\nimport { StockLocationDetailComponent } from './components/stock-location-detail/stock-location-detail.component';\r\nimport {\r\n assignStockLocationsToChannelBulkAction,\r\n deleteStockLocationsBulkAction,\r\n removeStockLocationsFromChannelBulkAction,\r\n} from './components/stock-location-list/stock-location-list-bulk-actions';\r\nimport { StockLocationListComponent } from './components/stock-location-list/stock-location-list.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 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 CollectionDataTableComponent,\r\n CollectionBreadcrumbPipe,\r\n MoveCollectionsDialogComponent,\r\n ProductVariantListComponent,\r\n ProductDetailComponent,\r\n ProductVariantDetailComponent,\r\n CreateProductVariantDialogComponent,\r\n CreateProductOptionGroupDialogComponent,\r\n ProductVariantQuickJumpComponent,\r\n StockLocationListComponent,\r\n];\r\n\r\n@NgModule({\r\n imports: [SharedModule, RouterModule.forChild([])],\r\n exports: [...CATALOG_COMPONENTS],\r\n declarations: [...CATALOG_COMPONENTS, StockLocationDetailComponent],\r\n providers: [\r\n {\r\n provide: ROUTES,\r\n useFactory: (pageService: PageService) => createRoutes(pageService),\r\n multi: true,\r\n deps: [PageService],\r\n },\r\n ],\r\n})\r\nexport class CatalogModule {\r\n constructor(\r\n private bulkActionRegistryService: BulkActionRegistryService,\r\n private pageService: PageService,\r\n ) {\r\n bulkActionRegistryService.registerBulkAction(assignFacetValuesToProductsBulkAction);\r\n bulkActionRegistryService.registerBulkAction(assignProductsToChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(assignProductVariantsToChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(removeProductsFromChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(removeProductVariantsFromChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(deleteProductsBulkAction);\r\n bulkActionRegistryService.registerBulkAction(deleteProductVariantsBulkAction);\r\n\r\n bulkActionRegistryService.registerBulkAction(assignFacetsToChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(removeFacetsFromChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(deleteFacetsBulkAction);\r\n\r\n bulkActionRegistryService.registerBulkAction(moveCollectionsBulkAction);\r\n bulkActionRegistryService.registerBulkAction(assignCollectionsToChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(removeCollectionsFromChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(deleteCollectionsBulkAction);\r\n\r\n bulkActionRegistryService.registerBulkAction(assignStockLocationsToChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(removeStockLocationsFromChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(deleteStockLocationsBulkAction);\r\n\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'product-list',\r\n tab: _('catalog.products'),\r\n route: '',\r\n component: ProductListComponent,\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'product-detail',\r\n tab: _('catalog.product'),\r\n route: '',\r\n component: detailComponentWithResolver({\r\n component: ProductDetailComponent,\r\n query: GetProductDetailDocument,\r\n entityKey: 'product',\r\n getBreadcrumbs: entity => [\r\n {\r\n label: entity ? entity.name : _('catalog.create-new-product'),\r\n link: [entity?.id],\r\n },\r\n ],\r\n }),\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'product-list',\r\n tab: _('catalog.product-variants'),\r\n route: 'variants',\r\n component: ProductVariantListComponent,\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'stock-location-detail',\r\n tab: _('catalog.stock-location'),\r\n route: '',\r\n component: detailComponentWithResolver({\r\n component: StockLocationDetailComponent,\r\n query: GetStockLocationDetailDocument,\r\n entityKey: 'stockLocation',\r\n getBreadcrumbs: entity => [\r\n {\r\n label: entity ? entity.name : _('catalog.create-new-stock-location'),\r\n link: [entity?.id],\r\n },\r\n ],\r\n }),\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'product-list',\r\n tab: _('catalog.stock-locations'),\r\n route: 'stock-locations',\r\n component: StockLocationListComponent,\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'product-variant-detail',\r\n tab: _('catalog.product-variants'),\r\n route: '',\r\n component: detailComponentWithResolver({\r\n component: ProductVariantDetailComponent,\r\n query: GetProductVariantDetailDocument,\r\n entityKey: 'productVariant',\r\n getBreadcrumbs: entity => [\r\n {\r\n label: `${entity?.product.name}`,\r\n link: ['/catalog', 'inventory', entity?.product.id],\r\n },\r\n {\r\n label: `${entity?.name} (${entity?.sku})`,\r\n link: ['variants', entity?.id],\r\n },\r\n ],\r\n }),\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'facet-list',\r\n tab: _('catalog.facets'),\r\n route: '',\r\n component: FacetListComponent,\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'facet-detail',\r\n tab: _('catalog.facet'),\r\n route: '',\r\n component: detailComponentWithResolver({\r\n component: FacetDetailComponent,\r\n query: GetFacetDetailDocument,\r\n entityKey: 'facet',\r\n getBreadcrumbs: entity => [\r\n {\r\n label: entity ? entity.name : _('catalog.create-new-facet'),\r\n link: [entity?.id],\r\n },\r\n ],\r\n }),\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'collection-list',\r\n tab: _('catalog.collections'),\r\n route: '',\r\n component: CollectionListComponent,\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'collection-detail',\r\n tab: _('catalog.collection'),\r\n route: '',\r\n component: detailComponentWithResolver({\r\n component: CollectionDetailComponent,\r\n query: CollectionDetailQueryDocument,\r\n entityKey: 'collection',\r\n getBreadcrumbs: entity => [\r\n {\r\n label: entity ? entity.name : _('catalog.create-new-collection'),\r\n link: [entity?.id],\r\n },\r\n ],\r\n }),\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'asset-list',\r\n tab: _('catalog.assets'),\r\n route: '',\r\n component: AssetListComponent,\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'asset-detail',\r\n tab: _('catalog.asset'),\r\n route: '',\r\n component: detailComponentWithResolver({\r\n component: AssetDetailComponent,\r\n query: AssetDetailQueryDocument,\r\n entityKey: 'asset',\r\n getBreadcrumbs: entity => [\r\n {\r\n label: `${entity?.name}`,\r\n link: [entity?.id],\r\n },\r\n ],\r\n }),\r\n });\r\n }\r\n}\r\n","import { gql } from 'apollo-angular';\r\n\r\nconst PRODUCT_LIST_QUERY_PRODUCT_FRAGMENT = gql`\r\n fragment ProductListQueryProductFragment on Product {\r\n id\r\n createdAt\r\n updatedAt\r\n enabled\r\n languageCode\r\n name\r\n slug\r\n featuredAsset {\r\n id\r\n createdAt\r\n updatedAt\r\n preview\r\n focalPoint {\r\n x\r\n y\r\n }\r\n }\r\n variantList {\r\n totalItems\r\n }\r\n }\r\n`;\r\n\r\nexport const PRODUCT_LIST_QUERY = gql`\r\n query ProductListQuery($options: ProductListOptions) {\r\n products(options: $options) {\r\n items {\r\n ...ProductListQueryProductFragment\r\n }\r\n totalItems\r\n }\r\n }\r\n ${PRODUCT_LIST_QUERY_PRODUCT_FRAGMENT}\r\n`;\r\n","import { ASSET_FRAGMENT, PRODUCT_OPTION_FRAGMENT } from '@vendure/admin-ui/core';\r\nimport { gql } from 'apollo-angular';\r\n\r\nexport const PRODUCT_VARIANT_DETAIL_QUERY_PRODUCT_VARIANT_FRAGMENT = gql`\r\n fragment ProductVariantDetailQueryProductVariantFragment on ProductVariant {\r\n id\r\n createdAt\r\n updatedAt\r\n enabled\r\n languageCode\r\n name\r\n price\r\n currencyCode\r\n prices {\r\n price\r\n currencyCode\r\n }\r\n priceWithTax\r\n stockOnHand\r\n stockAllocated\r\n trackInventory\r\n outOfStockThreshold\r\n useGlobalOutOfStockThreshold\r\n taxRateApplied {\r\n id\r\n name\r\n value\r\n }\r\n taxCategory {\r\n id\r\n name\r\n }\r\n sku\r\n options {\r\n ...ProductOption\r\n }\r\n stockLevels {\r\n id\r\n createdAt\r\n updatedAt\r\n stockOnHand\r\n stockAllocated\r\n stockLocationId\r\n stockLocation {\r\n id\r\n createdAt\r\n updatedAt\r\n name\r\n }\r\n }\r\n facetValues {\r\n id\r\n code\r\n name\r\n facet {\r\n id\r\n name\r\n }\r\n }\r\n featuredAsset {\r\n ...Asset\r\n }\r\n assets {\r\n ...Asset\r\n }\r\n translations {\r\n id\r\n languageCode\r\n name\r\n }\r\n channels {\r\n id\r\n code\r\n }\r\n product {\r\n id\r\n name\r\n optionGroups {\r\n id\r\n name\r\n code\r\n translations {\r\n id\r\n languageCode\r\n name\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport const PRODUCT_VARIANT_DETAIL_QUERY = gql`\r\n query GetProductVariantDetail($id: ID!) {\r\n productVariant(id: $id) {\r\n ...ProductVariantDetailQueryProductVariantFragment\r\n }\r\n stockLocations(options: { take: 100 }) {\r\n items {\r\n id\r\n createdAt\r\n updatedAt\r\n name\r\n description\r\n }\r\n }\r\n taxCategories(options: { take: 100 }) {\r\n items {\r\n id\r\n createdAt\r\n updatedAt\r\n name\r\n isDefault\r\n }\r\n totalItems\r\n }\r\n activeChannel {\r\n id\r\n availableCurrencyCodes\r\n defaultCurrencyCode\r\n }\r\n }\r\n ${PRODUCT_VARIANT_DETAIL_QUERY_PRODUCT_VARIANT_FRAGMENT}\r\n`;\r\n\r\nexport const PRODUCT_VARIANT_UPDATE_MUTATION = gql`\r\n mutation ProductVariantUpdateMutation($input: [UpdateProductVariantInput!]!) {\r\n updateProductVariants(input: $input) {\r\n ...ProductVariantDetailQueryProductVariantFragment\r\n }\r\n }\r\n ${PRODUCT_VARIANT_DETAIL_QUERY_PRODUCT_VARIANT_FRAGMENT}\r\n`;\r\n","import { ASSET_FRAGMENT } from '@vendure/admin-ui/core';\r\nimport { gql } from 'apollo-angular';\r\n\r\nconst PRODUCT_VARIANT_LIST_QUERY_PRODUCT_VARIANT_FRAGMENT = gql`\r\n fragment ProductVariantListQueryProductVariantFragment on ProductVariant {\r\n id\r\n createdAt\r\n updatedAt\r\n productId\r\n enabled\r\n languageCode\r\n name\r\n price\r\n currencyCode\r\n priceWithTax\r\n trackInventory\r\n outOfStockThreshold\r\n stockLevels {\r\n id\r\n createdAt\r\n updatedAt\r\n stockLocationId\r\n stockOnHand\r\n stockAllocated\r\n stockLocation {\r\n id\r\n createdAt\r\n updatedAt\r\n name\r\n }\r\n }\r\n useGlobalOutOfStockThreshold\r\n sku\r\n featuredAsset {\r\n ...Asset\r\n }\r\n }\r\n\r\n ${ASSET_FRAGMENT}\r\n`;\r\n\r\nexport const PRODUCT_VARIANT_LIST_QUERY = gql`\r\n query ProductVariantListQuery($options: ProductVariantListOptions!) {\r\n productVariants(options: $options) {\r\n items {\r\n ...ProductVariantListQueryProductVariantFragment\r\n }\r\n totalItems\r\n }\r\n }\r\n ${PRODUCT_VARIANT_LIST_QUERY_PRODUCT_VARIANT_FRAGMENT}\r\n`;\r\n"],"x_google_ignoreList":[54]}
|