{"version":3,"file":"app.js","mappings":"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","sources":["webpack://VirtoCommerce.Catalog/./Scripts/catalog.js","webpack://VirtoCommerce.Catalog/./Scripts/catalogBulkActionsModule.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/action-change-category.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/action-edit-properties.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/action-list.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/advanced-search-results.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/advanced-search.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/aggregation-properties-details.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/aggregation-properties-list.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/bill-of-materials-list.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/bulk-action-progress.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/bulk-action-registrar.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/catalog-add.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/catalog-detail.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/catalog-languages.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/catalogs-list.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/catalogs-select.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/categories-items-add.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/categories-items-list.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/category-detail.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/categoryDescription-detail.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/categoryDescriptions-list.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/editorialReview-detail.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/editorialReviews-list.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/filter-detail.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/hello-world.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/image-detail.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/images-add.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/images.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/item-asset-add.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/item-asset-detail.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/item-asset-list.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/item-association-detail.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/item-associations-list.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/item-detail.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/item-dimensions.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/item-property-detail.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/item-variation-list.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/property-attributes.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/property-detail.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/property-dictionary-details.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/property-dictionary-list.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/property-list.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/property-selector.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/property-type-list.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/property-type.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/property-validationRules.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/step-edit-properties.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/step-select-properties.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/video-add.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/video-detail.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/video-list.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/virtual-catalog-detail.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/common/catalog-items-select.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/export/catalog-export.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/export/exporter-list.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/import/catalog-import.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/import/importers-list.js","webpack://VirtoCommerce.Catalog/./Scripts/blades/links-list/links-list.js","webpack://VirtoCommerce.Catalog/./Scripts/directives/dictionaryValue.js","webpack://VirtoCommerce.Catalog/./Scripts/directives/itemSearch.js","webpack://VirtoCommerce.Catalog/./Scripts/directives/itemSearchCriteria.js","webpack://VirtoCommerce.Catalog/./Scripts/directives/property2.js","webpack://VirtoCommerce.Catalog/./Scripts/directives/propertyMessages.js","webpack://VirtoCommerce.Catalog/./Scripts/filters/thumbnail.js","webpack://VirtoCommerce.Catalog/./Scripts/filters/trustUrl.js","webpack://VirtoCommerce.Catalog/./Scripts/resources/aggregationProperties.js","webpack://VirtoCommerce.Catalog/./Scripts/resources/associations.js","webpack://VirtoCommerce.Catalog/./Scripts/resources/catalogs.js","webpack://VirtoCommerce.Catalog/./Scripts/resources/categories.js","webpack://VirtoCommerce.Catalog/./Scripts/resources/import.js","webpack://VirtoCommerce.Catalog/./Scripts/resources/items.js","webpack://VirtoCommerce.Catalog/./Scripts/resources/listEntries.js","webpack://VirtoCommerce.Catalog/./Scripts/resources/propDictItems.js","webpack://VirtoCommerce.Catalog/./Scripts/resources/properties.js","webpack://VirtoCommerce.Catalog/./Scripts/resources/propertyValidators.js","webpack://VirtoCommerce.Catalog/./Scripts/resources/search.js","webpack://VirtoCommerce.Catalog/./Scripts/resources/valueTypes.js","webpack://VirtoCommerce.Catalog/./Scripts/resources/videos.js","webpack://VirtoCommerce.Catalog/./Scripts/resources/virto-commerce.catalog-bulk-actions-module-api.js","webpack://VirtoCommerce.Catalog/./Scripts/selectors/catalog-selector.js","webpack://VirtoCommerce.Catalog/./Scripts/selectors/category-selector.js","webpack://VirtoCommerce.Catalog/./Scripts/widgets/aggregationPropertiesWidget.js","webpack://VirtoCommerce.Catalog/./Scripts/widgets/billOfMaterialsWidget.js","webpack://VirtoCommerce.Catalog/./Scripts/widgets/catalogEntryImageWidget.js","webpack://VirtoCommerce.Catalog/./Scripts/widgets/catalogLanguagesWidget.js","webpack://VirtoCommerce.Catalog/./Scripts/widgets/catalogPropertyWidget.js","webpack://VirtoCommerce.Catalog/./Scripts/widgets/categoryDescriptionWidget.js","webpack://VirtoCommerce.Catalog/./Scripts/widgets/categoryPropertyWidget.js","webpack://VirtoCommerce.Catalog/./Scripts/widgets/dashboard.js","webpack://VirtoCommerce.Catalog/./Scripts/widgets/editorialReviewWidget.js","webpack://VirtoCommerce.Catalog/./Scripts/widgets/itemAssetWidget.js","webpack://VirtoCommerce.Catalog/./Scripts/widgets/itemAssociationsWidget.js","webpack://VirtoCommerce.Catalog/./Scripts/widgets/itemDimensionWidget.js","webpack://VirtoCommerce.Catalog/./Scripts/widgets/itemPropertyWidget.js","webpack://VirtoCommerce.Catalog/./Scripts/widgets/itemVariationWidget.js","webpack://VirtoCommerce.Catalog/./Scripts/widgets/linksWidget.js","webpack://VirtoCommerce.Catalog/./Scripts/widgets/videoWidget.js","webpack://VirtoCommerce.Catalog/./Scripts/wizards/newAssociation/association-wizard.js","webpack://VirtoCommerce.Catalog/./Scripts/wizards/newCategory/category-wizard.js","webpack://VirtoCommerce.Catalog/./Scripts/wizards/newProduct/new-product-wizard.js"],"sourcesContent":["//Call this to register our module to main application\r\nvar catalogsModuleName = \"virtoCommerce.catalogModule\";\r\n\r\nif (AppDependencies != undefined) {\r\n AppDependencies.push(catalogsModuleName);\r\n}\r\n\r\nangular.module(catalogsModuleName, ['ui.grid.validate', 'ui.grid.infiniteScroll'])\r\n .config(['$stateProvider', function ($stateProvider) {\r\n $stateProvider\r\n .state('workspace.catalog', {\r\n url: '/catalog',\r\n templateUrl: '$(Platform)/Scripts/common/templates/home.tpl.html',\r\n controller: [\r\n '$scope', 'platformWebApp.bladeNavigationService', function ($scope, bladeNavigationService) {\r\n\r\n var blade = {\r\n id: 'categories',\r\n title: 'catalog.blades.catalogs-list.title',\r\n breadcrumbs: [],\r\n subtitle: 'catalog.blades.catalogs-list.subtitle',\r\n controller: 'virtoCommerce.catalogModule.catalogsListController',\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/catalogs-list.tpl.html',\r\n isClosingDisabled: true\r\n };\r\n bladeNavigationService.showBlade(blade);\r\n $scope.moduleName = 'vc-catalog';\r\n }\r\n ]\r\n });\r\n }])\r\n\r\n // define search filters to be accessible platform-wide\r\n .factory('virtoCommerce.catalogModule.predefinedSearchFilters', ['$localStorage', function ($localStorage) {\r\n $localStorage.catalogSearchFilters = $localStorage.catalogSearchFilters || [];\r\n\r\n return {\r\n register: function (currentFiltersUpdateTime, currentFiltersStorageKey, newFilters) {\r\n _.each(newFilters, function (newFilter) {\r\n var found = _.find($localStorage.catalogSearchFilters, function (x) {\r\n return x.id === newFilter.id;\r\n });\r\n if (found) {\r\n if (!found.lastUpdateTime || found.lastUpdateTime < currentFiltersUpdateTime) {\r\n angular.copy(newFilter, found);\r\n }\r\n } else if (!$localStorage[currentFiltersStorageKey] || $localStorage[currentFiltersStorageKey] < currentFiltersUpdateTime) {\r\n $localStorage.catalogSearchFilters.splice(0, 0, newFilter);\r\n }\r\n });\r\n\r\n $localStorage[currentFiltersStorageKey] = currentFiltersUpdateTime;\r\n }\r\n };\r\n }])\r\n\r\n .factory('virtoCommerce.catalogModule.itemTypesResolverService', function () {\r\n return {\r\n objects: [],\r\n registerType: function (itemTypeDefinition) {\r\n this.objects.push(itemTypeDefinition);\r\n },\r\n resolve: function (type) {\r\n return _.findWhere(this.objects, { productType: type });\r\n }\r\n };\r\n })\r\n\r\n .factory('virtoCommerce.catalogModule.catalogImagesFolderPathHelper', [function () {\r\n return {\r\n getImagesFolderPath: function (catalogId, code) {\r\n var catalogShortName = catalogId.length > 5 ? catalogId.substring(0, 5) : catalogId;\r\n return catalogShortName + '/' + code;\r\n }\r\n };\r\n }])\r\n\r\n .run(\r\n ['platformWebApp.mainMenuService', 'platformWebApp.widgetService', '$state', 'platformWebApp.bladeNavigationService', 'virtoCommerce.catalogModule.catalogExportService', 'platformWebApp.permissionScopeResolver', 'virtoCommerce.catalogModule.catalogs', 'virtoCommerce.catalogModule.predefinedSearchFilters', 'platformWebApp.metaFormsService', 'virtoCommerce.catalogModule.itemTypesResolverService', '$http', '$compile', 'virtoCommerce.exportModule.genericViewerItemService', 'platformWebApp.toolbarService', 'platformWebApp.breadcrumbHistoryService',\r\n function (mainMenuService, widgetService, $state, bladeNavigationService, catalogExportService, scopeResolver, catalogs, predefinedSearchFilters, metaFormsService, itemTypesResolverService, $http, $compile, genericViewerItemService, toolbarService, breadcrumbHistoryService) {\r\n\r\n //Register module in main menu\r\n var menuItem = {\r\n path: 'browse/catalog',\r\n icon: 'fa fa-folder',\r\n title: 'catalog.main-menu-title',\r\n priority: 20,\r\n action: function () { $state.go('workspace.catalog'); },\r\n permission: 'catalog:access'\r\n };\r\n mainMenuService.addMenuItem(menuItem);\r\n\r\n // register back-button\r\n toolbarService.register(breadcrumbHistoryService.getBackButtonInstance(), 'virtoCommerce.catalogModule.categoriesItemsListController');\r\n toolbarService.register(breadcrumbHistoryService.getBackButtonInstance(), 'virtoCommerce.catalogModule.catalogItemSelectController');\r\n\r\n //Register image widget\r\n var entryImageWidget = {\r\n controller: 'virtoCommerce.catalogModule.catalogEntryImageWidgetController',\r\n size: [2, 2],\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/widgets/catalogEntryImageWidget.tpl.html'\r\n };\r\n widgetService.registerWidget(entryImageWidget, 'itemDetail');\r\n\r\n //Register video widget\r\n var itemVideoWidget = {\r\n controller: 'virtoCommerce.catalogModule.videoWidgetController',\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/widgets/videoWidget.tpl.html'\r\n };\r\n widgetService.registerWidget(itemVideoWidget, 'itemDetail');\r\n\r\n //Register item property widget\r\n var itemPropertyWidget = {\r\n controller: 'virtoCommerce.catalogModule.itemPropertyWidgetController',\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/widgets/itemPropertyWidget.tpl.html'\r\n };\r\n widgetService.registerWidget(itemPropertyWidget, 'itemDetail');\r\n\r\n //Register item associations widget\r\n var itemAssociationsWidget = {\r\n controller: 'virtoCommerce.catalogModule.itemAssociationsWidgetController',\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/widgets/itemAssociationsWidget.tpl.html'\r\n };\r\n widgetService.registerWidget(itemAssociationsWidget, 'itemDetail');\r\n\r\n //Register item seo widget\r\n var itemSeoWidget = {\r\n controller: 'virtoCommerce.coreModule.seo.seoWidgetController',\r\n template: 'Modules/$(VirtoCommerce.Core)/Scripts/SEO/widgets/seoWidget.tpl.html',\r\n objectType: 'CatalogProduct',\r\n getDefaultContainerId: function (blade) { return undefined; },\r\n getLanguages: function (blade) { return _.pluck(blade.catalog.languages, 'languageCode'); }\r\n };\r\n widgetService.registerWidget(itemSeoWidget, 'itemDetail');\r\n\r\n //Register dimensions widget\r\n var dimensionsWidget = {\r\n controller: 'virtoCommerce.catalogModule.itemDimensionWidgetController',\r\n isVisible: function (blade) { return blade.productType === 'Physical' || blade.productType === 'BillOfMaterials'; },\r\n size: [2, 1],\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/widgets/itemDimensionWidget.tpl.html'\r\n };\r\n widgetService.registerWidget(dimensionsWidget, 'itemDetail');\r\n\r\n //Register item editorialReview widget\r\n var editorialReviewWidget = {\r\n controller: 'virtoCommerce.catalogModule.editorialReviewWidgetController',\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/widgets/editorialReviewWidget.tpl.html'\r\n };\r\n widgetService.registerWidget(editorialReviewWidget, 'itemDetail');\r\n\r\n //Register variation widget\r\n var variationWidget = {\r\n controller: 'virtoCommerce.catalogModule.itemVariationWidgetController',\r\n isVisible: function (blade) { return blade.id !== 'variationDetail'; },\r\n size: [1, 1],\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/widgets/itemVariationWidget.tpl.html'\r\n };\r\n widgetService.registerWidget(variationWidget, 'itemDetail');\r\n\r\n //Register asset widget\r\n var itemAssetWidget = {\r\n controller: 'virtoCommerce.catalogModule.itemAssetWidgetController',\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/widgets/itemAssetWidget.tpl.html'\r\n };\r\n widgetService.registerWidget(itemAssetWidget, 'itemDetail');\r\n\r\n //Register Bill of materials widget\r\n var billOfMaterialsWidget = {\r\n controller: 'virtoCommerce.catalogModule.billOfMaterialsWidgetController',\r\n isVisible: function (blade) { return blade.productType === 'BillOfMaterials'; },\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/widgets/billOfMaterialsWidget.tpl.html'\r\n };\r\n widgetService.registerWidget(billOfMaterialsWidget, 'itemDetail');\r\n\r\n //Register widgets to categoryDetail\r\n widgetService.registerWidget(entryImageWidget, 'categoryDetail');\r\n\r\n var categoryPropertyWidget = {\r\n controller: 'virtoCommerce.catalogModule.categoryPropertyWidgetController',\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/widgets/categoryPropertyWidget.tpl.html'\r\n };\r\n widgetService.registerWidget(categoryPropertyWidget, 'categoryDetail');\r\n\r\n //Register category seo widget\r\n var categorySeoWidget = {\r\n controller: 'virtoCommerce.coreModule.seo.seoWidgetController',\r\n template: 'Modules/$(VirtoCommerce.Core)/Scripts/SEO/widgets/seoWidget.tpl.html',\r\n objectType: 'Category',\r\n getDefaultContainerId: function (blade) { return undefined; },\r\n getLanguages: function (blade) { return _.pluck(blade.catalog.languages, 'languageCode'); }\r\n };\r\n widgetService.registerWidget(categorySeoWidget, 'categoryDetail');\r\n\r\n //Register category description widget\r\n var categoryDescriptionWidget = {\r\n controller: 'virtoCommerce.catalogModule.categoryDescriptionWidgetController',\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/widgets/categoryDescriptionWidget.tpl.html'\r\n };\r\n widgetService.registerWidget(categoryDescriptionWidget, 'categoryDetail');\r\n\r\n //Register catalog widgets\r\n var catalogLanguagesWidget = {\r\n controller: 'virtoCommerce.catalogModule.catalogLanguagesWidgetController',\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/widgets/catalogLanguagesWidget.tpl.html'\r\n };\r\n widgetService.registerWidget(catalogLanguagesWidget, 'catalogDetail');\r\n\r\n var catalogPropertyWidget = {\r\n isVisible: function (blade) { return !blade.isNew; },\r\n controller: 'virtoCommerce.catalogModule.catalogPropertyWidgetController',\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/widgets/catalogPropertyWidget.tpl.html'\r\n };\r\n widgetService.registerWidget(catalogPropertyWidget, 'catalogDetail');\r\n\r\n //Register links widgets\r\n var categoryLinksWidget = {\r\n controller: 'virtoCommerce.catalogModule.linksWidgetController',\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/widgets/linksWidget.tpl.html'\r\n };\r\n widgetService.registerWidget(categoryLinksWidget, 'categoryDetail');\r\n\r\n var itemsLinksWidget = {\r\n controller: 'virtoCommerce.catalogModule.linksWidgetController',\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/widgets/linksWidget.tpl.html'\r\n };\r\n widgetService.registerWidget(itemsLinksWidget, 'itemDetail');\r\n\r\n //Security scopes\r\n //Register permission scopes templates used for scope bounded definition in role management ui\r\n\r\n var catalogSelectScope = {\r\n type: 'SelectedCatalogScope',\r\n title: 'catalog.permissions.catalog-scope.title',\r\n selectFn: function (blade, callback) {\r\n var newBlade = {\r\n id: 'catalog-pick',\r\n title: this.title,\r\n subtitle: 'catalog.permissions.catalog-scope.blade.subtitle',\r\n currentEntity: this,\r\n onChangesConfirmedFn: callback,\r\n dataService: catalogs,\r\n controller: 'platformWebApp.security.scopeValuePickFromSimpleListController',\r\n template: '$(Platform)/Scripts/app/security/blades/common/scope-value-pick-from-simple-list.tpl.html'\r\n };\r\n bladeNavigationService.showBlade(newBlade, blade);\r\n }\r\n };\r\n scopeResolver.register(catalogSelectScope);\r\n\r\n var categorySelectScope = {\r\n type: 'CatalogSelectedCategoryScope',\r\n title: 'catalog.permissions.category-scope.title',\r\n selectFn: function (blade, callback) {\r\n var selectedListItems = _.map(this.assignedScopes, function (x) { return { id: x.scope, name: x.label }; });\r\n var options = {\r\n showCheckingMultiple: false,\r\n allowCheckingItem: false,\r\n allowCheckingCategory: true,\r\n selectedItemIds: _.map(this.assignedScopes, function (x) { return x.scope; }),\r\n checkItemFn: function (listItem, isSelected) {\r\n if (isSelected) {\r\n if (_.all(selectedListItems, function (x) { return x.id !== listItem.id; })) {\r\n selectedListItems.push(listItem);\r\n }\r\n }\r\n else {\r\n selectedListItems = _.reject(selectedListItems, function (x) { return x.id === listItem.id; });\r\n }\r\n }\r\n };\r\n var scopeOriginal = this.scopeOriginal;\r\n var newBlade = {\r\n id: \"CatalogItemsSelect\",\r\n title: \"catalog.blades.catalog-items-select.title\",\r\n controller: 'virtoCommerce.catalogModule.catalogItemSelectController',\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/common/catalog-items-select.tpl.html',\r\n options: options,\r\n breadcrumbs: [],\r\n toolbarCommands: [\r\n {\r\n name: \"platform.commands.confirm\",\r\n icon: 'fas fa-plus',\r\n executeMethod: function (blade) {\r\n var scopes = _.map(selectedListItems, function (x) {\r\n return angular.extend({ scope: x.id, label: x.name }, scopeOriginal);\r\n });\r\n callback(scopes);\r\n bladeNavigationService.closeBlade(blade);\r\n\r\n },\r\n canExecuteMethod: function () {\r\n return selectedListItems.length > 0;\r\n }\r\n }]\r\n };\r\n bladeNavigationService.showBlade(newBlade, blade);\r\n }\r\n };\r\n scopeResolver.register(categorySelectScope);\r\n\r\n\r\n // register WIDGETS\r\n var indexWidget = {\r\n controller: 'virtoCommerce.searchModule.indexWidgetController',\r\n // size: [3, 1],\r\n template: 'Modules/$(VirtoCommerce.Search)/Scripts/widgets/index-widget.tpl.html'\r\n };\r\n\r\n // integration: index in product details\r\n var widgetToRegister = angular.extend({}, indexWidget, { documentType: 'Product' });\r\n widgetService.registerWidget(widgetToRegister, 'itemDetail');\r\n // integration: index in CATEGORY details\r\n widgetToRegister = angular.extend({}, indexWidget, { documentType: 'Category' });\r\n widgetService.registerWidget(widgetToRegister, 'categoryDetail');\r\n\r\n // Aggregation properties in store details\r\n widgetService.registerWidget({\r\n controller: 'virtoCommerce.catalogModule.aggregationPropertiesWidgetController',\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/widgets/aggregationPropertiesWidget.tpl.html'\r\n }, 'storeDetail');\r\n\r\n // predefine search filters for catalog search\r\n predefinedSearchFilters.register(1477584000000, 'catalogSearchFiltersDate', [\r\n { name: 'catalog.blades.categories-items-list.labels.filter-new' },\r\n { keyword: '', searchInVariations: true, id: 5, name: 'catalog.blades.categories-items-list.labels.filter-display-variations' },\r\n { keyword: 'is:hidden', id: 4, name: 'catalog.blades.categories-items-list.labels.filter-notActive' },\r\n { keyword: 'price_usd:[100 TO 200]', id: 3, name: 'catalog.blades.categories-items-list.labels.filter-priceRange' },\r\n { keyword: 'is:priced', id: 2, name: 'catalog.blades.categories-items-list.labels.filter-withPrice' },\r\n { keyword: 'is:unpriced', id: 1, name: 'catalog.blades.categories-items-list.labels.filter-priceless' }\r\n ]);\r\n\r\n // register item types\r\n itemTypesResolverService.registerType({\r\n itemType: 'catalog.blades.categories-items-add.menu.physical-product.title',\r\n description: 'catalog.blades.categories-items-add.menu.physical-product.description',\r\n productType: 'Physical',\r\n icon: 'fas fa-box'\r\n });\r\n itemTypesResolverService.registerType({\r\n itemType: 'catalog.blades.categories-items-add.menu.digital-product.title',\r\n description: 'catalog.blades.categories-items-add.menu.digital-product.description',\r\n productType: 'Digital',\r\n icon: 'fas fa-file-download'\r\n });\r\n itemTypesResolverService.registerType({\r\n itemType: 'catalog.blades.categories-items-add.menu.bill-of-materials-product.title',\r\n description: 'catalog.blades.categories-items-add.menu.bill-of-materials-product.description',\r\n productType: 'BillOfMaterials',\r\n icon: 'far fa-list-alt'\r\n });\r\n\r\n //meta-form used for all catalog, category and item fields input.\r\n metaFormsService.registerMetaFields(\"catalogDetail\", [{\r\n name: 'name',\r\n title: \"catalog.blades.catalog-detail.labels.catalog-name\",\r\n placeholder: \"catalog.blades.catalog-detail.placeholders.enter-name\",\r\n colSpan: 2,\r\n isRequired: true,\r\n valueType: \"ShortText\"\r\n }]);\r\n\r\n // category detail meta-fields\r\n metaFormsService.registerMetaFields(\"categoryDetail\", [{\r\n name: 'isActive',\r\n title: \"catalog.blades.category-detail.labels.is-active\",\r\n colSpan: 2,\r\n valueType: \"Boolean\"\r\n },\r\n {\r\n name: 'name',\r\n title: \"catalog.blades.category-detail.labels.name\",\r\n placeholder: \"catalog.blades.category-detail.placeholders.name\",\r\n colSpan: 2,\r\n isRequired: true,\r\n valueType: \"ShortText\"\r\n },\r\n {\r\n title: \"catalog.blades.category-detail.labels.code\",\r\n templateUrl: \"code.html\"\r\n },\r\n {\r\n colSpan: 1,\r\n spanAllColumns: true,\r\n templateUrl: \"taxType.html\"\r\n },\r\n {\r\n name: 'priority',\r\n title: \"catalog.blades.category-detail.labels.priority\",\r\n placeholder: \"catalog.blades.category-detail.placeholders.priority\",\r\n colSpan: 2,\r\n valueType: \"Integer\"\r\n }]);\r\n\r\n // Item detail blade has 3 metaforms: productDetail, productDetail1 and productDetail2\r\n metaFormsService.registerMetaFields(\"productDetail\", [{\r\n title: \"catalog.blades.item-detail.labels.name\",\r\n colSpan: 6,\r\n templateUrl: \"name.html\"\r\n }]);\r\n\r\n metaFormsService.registerMetaFields(\"productDetail1\", [{\r\n name: 'id',\r\n title: \"catalog.blades.item-detail.labels.id\",\r\n colSpan: 3,\r\n isReadOnly: true,\r\n valueType: \"ShortText\"\r\n },\r\n {\r\n name: 'outerId',\r\n title: \"catalog.blades.item-detail.labels.outer-id\",\r\n colSpan: 3,\r\n placeholder: \" \",\r\n isReadOnly: true,\r\n valueType: \"ShortText\"\r\n }, {\r\n title: \"catalog.blades.item-detail.labels.sku\",\r\n colSpan: 3,\r\n templateUrl: \"sku.html\"\r\n },\r\n {\r\n name: '_priority',\r\n title: \"catalog.blades.item-detail.labels.priority\",\r\n placeholder: \"catalog.blades.item-detail.placeholders.priority\",\r\n colSpan: 3,\r\n valueType: \"Integer\"\r\n },\r\n {\r\n title: \"catalog.blades.item-detail.labels.gtin\",\r\n colSpan: 6,\r\n templateUrl: \"gtin.html\"\r\n }]);\r\n\r\n metaFormsService.registerMetaFields(\"productDetail2\", [{\r\n title: \"catalog.blades.item-detail.labels.start-date\",\r\n colSpan: 3,\r\n templateUrl: \"startDate.html\"\r\n },\r\n {\r\n title: \"catalog.blades.item-detail.labels.end-date\",\r\n colSpan: 3,\r\n templateUrl: \"endDate.html\"\r\n },\r\n {\r\n name: 'isBuyable',\r\n title: \"catalog.blades.item-detail.labels.can-be-purchased\",\r\n colSpan: 2,\r\n valueType: \"Boolean\"\r\n },\r\n {\r\n name: 'isActive',\r\n title: \"catalog.blades.item-detail.labels.store-visible\",\r\n colSpan: 2,\r\n valueType: \"Boolean\"\r\n },\r\n {\r\n name: 'trackInventory',\r\n title: \"catalog.blades.item-detail.labels.track-inventory\",\r\n isVisibleFn: blade => blade.item.productType !== 'Digital',\r\n colSpan: 2,\r\n valueType: \"Boolean\"\r\n },\r\n {\r\n name: 'hasUserAgreement',\r\n title: \"catalog.blades.item-detail.labels.has-user-agreement\",\r\n isVisibleFn: blade => blade.item.productType === 'Digital',\r\n colSpan: 2,\r\n valueType: \"Boolean\"\r\n },\r\n {\r\n name: 'minQuantity',\r\n title: \"catalog.blades.item-detail.labels.min-quantity\",\r\n isVisibleFn: blade => blade.item.productType !== 'Digital',\r\n colSpan: 3,\r\n valueType: \"Integer\"\r\n },\r\n {\r\n name: 'maxQuantity',\r\n title: \"catalog.blades.item-detail.labels.max-quantity\",\r\n isVisibleFn: blade => blade.item.productType !== 'Digital',\r\n colSpan: 3,\r\n valueType: \"Integer\"\r\n },\r\n {\r\n colSpan: 2,\r\n title: \"catalog.blades.item-detail.labels.download-type\",\r\n isVisibleFn: blade => blade.item.productType === 'Digital',\r\n templateUrl: \"downloadType.html\"\r\n },\r\n {\r\n name: 'maxNumberOfDownload',\r\n title: \"catalog.blades.item-detail.labels.max-downloads\",\r\n isVisibleFn: blade => blade.item.productType === 'Digital',\r\n colSpan: 2,\r\n valueType: \"Integer\"\r\n },\r\n {\r\n name: 'downloadExpiration',\r\n title: \"catalog.blades.item-detail.labels.expiration-date\",\r\n placeholder: \"catalog.blades.item-detail.placeholders.expiration-date\",\r\n isVisibleFn: blade => blade.item.productType === 'Digital',\r\n colSpan: 2,\r\n valueType: \"DateTime\"\r\n },\r\n {\r\n colSpan: 3,\r\n spanAllColumns: true,\r\n templateUrl: \"vendor.html\"\r\n },\r\n {\r\n colSpan: 3,\r\n spanAllColumns: true,\r\n templateUrl: \"taxType.html\"\r\n }]);\r\n\r\n metaFormsService.registerMetaFields('VirtoCommerce.CatalogModule.Core.Model.Export.ExportableProduct' + 'ExportFilter', [\r\n {\r\n name: 'catalogSelector',\r\n title: \"catalog.selectors.titles.catalogs\",\r\n templateUrl: 'Modules/$(VirtoCommerce.Catalog)/Scripts/selectors/catalog-selector.tpl.html'\r\n },\r\n {\r\n name: 'categorySelector',\r\n title: \"catalog.selectors.titles.categories\",\r\n templateUrl: 'Modules/$(VirtoCommerce.Catalog)/Scripts/selectors/category-selector.tpl.html'\r\n },\r\n {\r\n name: 'searchInVariations',\r\n title: \"catalog.selectors.titles.search-in-variations\",\r\n valueType: \"Boolean\"\r\n },\r\n {\r\n name: 'searchInChildren',\r\n title: \"catalog.selectors.titles.search-in-children\",\r\n valueType: \"Boolean\"\r\n }\r\n ]);\r\n\r\n metaFormsService.registerMetaFields('VirtoCommerce.CatalogModule.Core.Model.Export.ExportableCatalogFull' + 'ExportFilter', [\r\n {\r\n name: 'catalogSelector',\r\n title: \"catalog.selectors.titles.catalogs\",\r\n templateUrl: 'Modules/$(VirtoCommerce.Catalog)/Scripts/selectors/catalog-selector.tpl.html'\r\n }\r\n ]);\r\n\r\n genericViewerItemService.registerViewer('CatalogProduct', function (item) {\r\n var itemCopy = angular.copy(item);\r\n\r\n return {\r\n id: \"itemmDetail\",\r\n itemId: itemCopy.id,\r\n productType: itemCopy.productType,\r\n title: itemCopy.name,\r\n controller: 'virtoCommerce.catalogModule.itemDetailController',\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/item-detail.tpl.html'\r\n };\r\n });\r\n\r\n $http.get('Modules/$(VirtoCommerce.Catalog)/Scripts/directives/itemSearch.tpl.html').then(function (response) {\r\n // compile the response, which will put stuff into the cache\r\n $compile(response.data);\r\n });\r\n\r\n catalogExportService.register({\r\n name: 'Generic Export',\r\n description: 'Export products filtered by catalogs or categories to JSON or CSV',\r\n icon: 'fa-fw fa fa-database',\r\n controller: 'virtoCommerce.exportModule.exportSettingsController',\r\n template: 'Modules/$(VirtoCommerce.Export)/Scripts/blades/export-settings.tpl.html',\r\n id: 'catalogGenericExport',\r\n title: 'catalog.blades.exporter.productTitle',\r\n subtitle: 'catalog.blades.exporter.productSubtitle',\r\n onInitialize: function (newBlade) {\r\n var exportDataRequest = {\r\n exportTypeName: 'VirtoCommerce.CatalogModule.Core.Model.Export.ExportableProduct',\r\n dataQuery: {\r\n exportTypeName: 'ProductExportDataQuery',\r\n categoryIds: _.pluck(newBlade.selectedCategories, 'id'),\r\n objectIds: _.pluck(newBlade.selectedProducts, 'id'),\r\n catalogIds: [newBlade.catalog.id],\r\n searchInChildren: true,\r\n isAllSelected: true\r\n }\r\n };\r\n newBlade.exportDataRequest = exportDataRequest;\r\n newBlade.totalItemsCount = (newBlade.selectedProducts || []).length;\r\n }\r\n });\r\n }]);\r\n","// Call this to register your module to main application\nvar moduleName = \"virtoCommerce.catalogBulkActionsModule\";\n\nif (AppDependencies !== undefined) {\n AppDependencies.push(moduleName);\n}\n\nangular.module(moduleName, [])\n .config(['$stateProvider', '$urlRouterProvider',\n function ($stateProvider, $urlRouterProvider) {\n $stateProvider\n .state('workspace.virtoCommerceCatalogBulkActionsModuleState', {\n url: '/virtoCommerce.catalogBulkActionsModule',\n templateUrl: '$(Platform)/Scripts/common/templates/home.tpl.html',\n controller: [\n '$scope', 'platformWebApp.bladeNavigationService', function ($scope, bladeNavigationService) {\n var newBlade = {\n id: 'blade1',\n controller: 'virtoCommerce.catalogBulkActionsModule.helloWorldController',\n template: 'Modules/$(virtoCommerce.catalog)/Scripts/blades/hello-world.html',\n isClosingDisabled: true\n };\n bladeNavigationService.showBlade(newBlade);\n }\n ]\n });\n }\n ])\n .run([\n '$rootScope',\n 'platformWebApp.mainMenuService',\n 'platformWebApp.widgetService',\n '$state', 'platformWebApp.toolbarService',\n 'platformWebApp.bladeUtils',\n 'virtoCommerce.catalogModule.catalogBulkActionService',\n 'platformWebApp.bladeNavigationService',\n function ($rootScope,\n mainMenuService,\n widgetService,\n $state,\n toolbarService,\n bladeUtils,\n catalogBulkActionService,\n bladeNavigationService) {\n\n function isItemsChecked(blade) {\n var gridApi = blade.$scope.gridApi;\n return gridApi && _.any(gridApi.selection.getSelectedRows());\n }\n\n //Register module in main menu\n //var menuItem = {\n // path: 'browse/virtoCommerce.catalogBulkActionsModule',\n // icon: 'fa fa-cube',\n // title: 'VirtoCommerce.CatalogBulkActionsModule',\n // priority: 100,\n // action: function () { $state.go('workspace.virtoCommerceCatalogBulkActionsModuleState'); },\n // permission: 'virtoCommerce.catalogBulkActionsModule.WebPermission'\n //};\n //mainMenuService.addMenuItem(menuItem);\n\n catalogBulkActionService.register({\n name: 'CategoryChangeBulkAction',\n controller: 'virtoCommerce.catalogModule.changeCategoryActionStepsController',\n template: 'Modules/$(virtoCommerce.catalog)/Scripts/blades/action-change-category.tpl.html'\n });\n\n catalogBulkActionService.register({\n name: 'PropertiesUpdateBulkAction',\n controller: 'virtoCommerce.catalogModule.editPropertiesActionController',\n template: 'Modules/$(virtoCommerce.catalog)/Scripts/blades/action-edit-properties.tpl.html'\n });\n\n\n toolbarService.register({\n name: \"Bulk Actions\", icon: 'fa fa-cubes',\n executeMethod: function (blade) {\n var gridApi = blade.$scope.gridApi;\n var filter = blade.filter;\n\n var newBlade = {\n id: 'catalogBulkActions',\n title: 'catalogBulkActions.blades.exporter-list.title',\n subtitle: 'catalogBulkActions.blades.exporter-list.subtitle',\n catalog: blade.catalog,\n controller: 'virtoCommerce.catalogModule.actionListController',\n template: 'Modules/$(virtoCommerce.catalog)/Scripts/blades/action-list.tpl.html',\n selectedProducts: _.filter(gridApi.selection.getSelectedRows(), function (x) { return x.type === 'product' }),\n selectedCategories: _.filter(gridApi.selection.getSelectedRows(), function (x) { return x.type === 'category' }),\n dataQuery: {}\n };\n\n if (gridApi.selection.getSelectAllState()) {\n var searchData = {\n searchCriteria: {\n catalogId: blade.catalogId,\n categoryId: blade.categoryId,\n keyword: filter.keyword ? filter.keyword : undefined,\n searchInVariations: filter.searchInVariations ? filter.searchInVariations : false,\n responseGroup: 'withCategories, withProducts',\n //sort: uiGridHelper.getSortExpression($scope),\n //skip: ($scope.pageSettings.currentPage - 1) * $scope.pageSettings.itemsPerPageCount,\n //take: $scope.pageSettings.itemsPerPageCount,\n skip: undefined,\n take: undefined\n }\n };\n angular.extend(newBlade.dataQuery, searchData);\n }\n else {\n var data = {\n listEntries: gridApi.selection.getSelectedRows()\n };\n\n angular.extend(newBlade.dataQuery, data);\n }\n \n bladeNavigationService.showBlade(newBlade);\n\n },\n canExecuteMethod: isItemsChecked,\n index: 20\n }, 'virtoCommerce.catalogModule.categoriesItemsListController');\n }\n]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.changeCategoryActionStepsController', ['$scope', '$translate', 'platformWebApp.bladeNavigationService', '$localStorage', function ($scope, $translate, bladeNavigationService, $localStorage) {\n var blade = $scope.blade;\n blade.canStartProcess = false;\n blade.isLoading = true;\n blade.selectedCategory = null;\n function initializeBlade() {\n blade.isLoading = false;\n }\n\n blade.actionDataContext = angular.extend({\n categoryId: null,\n catalogId: null\n }, blade.actionDataContext);\n\n $scope.startAction = function () {\n\n var progressBlade = {\n id: 'actionProgress',\n title: 'virtoCommerce.catalogBulkActionsModule.blades.action-progress.title',\n controller: 'virtoCommerce.catalogModule.bulkActionProgressController',\n template: 'Modules/$(virtoCommerce.catalog)/Scripts/blades/bulk-action-progress.tpl.html',\n actionDataContext: blade.actionDataContext,\n onCompleted: function () {\n blade.isProcessing = false;\n }\n };\n bladeNavigationService.showBlade(progressBlade, blade);\n };\n\n $scope.selectCategory = function () {\n var selection = [blade.actionDataContext.categoryId];\n var options = {\n showCheckingMultiple: false,\n allowCheckingCategory: true,\n allowCheckingItem: false,\n selectedItemIds: selection,\n checkItemFn: function (listItem, isSelected) {\n if (isSelected) {\n if (!_.find(selection, function (x) { return x === listItem.id; })) {\n selection.push(listItem.id);\n blade.selectedCategory = listItem;\n blade.actionDataContext.categoryId = listItem.id;\n blade.actionDataContext.catalogId = listItem.catalogId;\n }\n }\n else {\n selection = _.reject(selection, function (x) { return x === listItem.id; });\n }\n }\n };\n var newBlade = {\n id: \"CatalogItemsSelect\",\n controller: 'virtoCommerce.catalogModule.catalogItemSelectController',\n template: 'Modules/$(virtoCommerce.catalog)/Scripts/blades/common/catalog-items-select.tpl.html',\n title: 'catalog.selectors.blades.titles.select-categories',\n options: options,\n breadcrumbs: [],\n toolbarCommands: [\n {\n name: \"platform.commands.confirm\", icon: 'fa fa-check',\n executeMethod: function (pickingBlade) {\n blade.canStartProcess = true;\n bladeNavigationService.closeBlade(pickingBlade);\n },\n canExecuteMethod: function () {\n return _.any(selection);\n }\n },\n {\n name: \"platform.commands.reset\", icon: 'fa fa-undo',\n executeMethod: function (pickingBlade) {\n selection = [];\n blade.categoryId = \"\";\n $scope.selectedCount = 0;\n bladeNavigationService.closeBlade(pickingBlade);\n },\n canExecuteMethod: function () {\n return _.any(selection);\n }\n }]\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n $scope.validateActionParameters = function () {\n return true;\n };\n\n $scope.blade.headIcon = 'fa fa-upload';\n initializeBlade();\n }]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.editPropertiesActionController', [\n '$scope',\n '$translate',\n 'platformWebApp.bladeNavigationService',\n '$localStorage',\n 'virtoCommerce.catalogBulkActionsModule.webApi',\n function (\n $scope,\n $translate,\n bladeNavigationService,\n $localStorage,\n webApi)\n {\n var blade = $scope.blade;\n blade.canStartProcess = false;\n blade.isLoading = true;\n blade.isPropertiesSelected = false;\n blade.properties = [];\n blade.includedProperties = [];\n blade.propertySelected = 0;\n\n blade.actionDataContext = angular.extend({\n editedProperties : {}\n }, blade.actionDataContext);\n\n function initializeBlade() {\n webApi.getActionData(blade.actionDataContext,\n function(data) {\n blade.properties = data.properties;\n blade.propertyTotal = data.properties.length;\n _.each(blade.properties,\n function (prop) {\n if (!prop.id &&\n (prop.name === 'Vendor' ||\n prop.name === 'TaxType' ||\n prop.name === 'MeasureUnit' ||\n prop.name === 'PackageType' ||\n prop.name === 'WeightUnit')) {\n prop.UseDefaultUIForEdit = false;\n } else {\n prop.UseDefaultUIForEdit = true;\n }\n prop.values = [];\n if (prop.ownerName === 'Native properties') {\n prop.group = 'Native product properties';\n } else {\n prop.group = 'Extended properties';\n }\n \n });\n blade.isLoading = false;\n });\n }\n\n $scope.startAction = function () {\n\n var progressBlade = {\n id: 'actionProgress',\n title: 'virtoCommerce.catalogBulkActionsModule.blades.action-progress.title',\n controller: 'virtoCommerce.catalogModule.bulkActionProgressController',\n template: 'Modules/$(virtoCommerce.catalog)/Scripts/blades/bulk-action-progress.tpl.html',\n actionDataContext: blade.actionDataContext,\n onCompleted: function () {\n blade.isProcessing = false;\n }\n };\n\n bladeNavigationService.showBlade(progressBlade, blade);\n };\n\n $scope.selectProperties = function () {\n var newBlade = {\n id: 'propertiesSelector',\n controller: 'virtoCommerce.catalogModule.propertiesSelectorController',\n template: 'Modules/$(virtoCommerce.catalog)/Scripts/blades/step-select-properties.tpl.html',\n properties: blade.properties,\n includedProperties : blade.includedProperties,\n onSelected: function (includedProperties) {\n blade.includedProperties = includedProperties;\n blade.propertySelected = includedProperties.length;\n blade.isPropertiesSelected = true;\n $scope.editProperties();\n }\n };\n\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n $scope.editProperties = function () {\n var newBlade = {\n id: 'propertiesEditor',\n controller: 'virtoCommerce.catalogModule.editPropertiesActionStepController',\n template: 'Modules/$(virtoCommerce.catalog)/Scripts/blades/step-edit-properties.tpl.html',\n properties: blade.includedProperties,\n propGroups: [{ title: 'catalog.properties.product', type: 'Product' }, { title: 'catalog.properties.variation', type: 'Variation' }],\n onSelected: function (editedProperties) {\n blade.canStartProcess = true;\n blade.actionDataContext.properties = editedProperties;\n }\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n $scope.validateActionParameters = function () {\n return true;\n };\n\n $scope.blade.headIcon = 'fa fa-upload';\n\n initializeBlade();\n }]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.actionListController', [\n '$scope',\n 'platformWebApp.bladeNavigationService',\n 'virtoCommerce.catalogModule.catalogBulkActionService',\n 'virtoCommerce.catalogBulkActionsModule.webApi',\n function (\n $scope,\n bladeNavigationService,\n bulkActionServiceRegistrar,\n webApi) {\n var blade = $scope.blade;\n $scope.selectedNodeId = null;\n\n function initializeBlade() {\n webApi.getActions(function (data) {\n if (data) {\n blade.actions = _.each(data, function (action) { blade.initializeAction(action); });\n }\n });\n\n blade.isLoading = false;\n };\n\n $scope.openBlade = function(data) {\n var newBlade = {};\n angular.copy(data, newBlade);\n\n var registrationInfo = bulkActionServiceRegistrar.getByName(data.name);\n if (!registrationInfo) {\n bladeNavigationService.setError('Can\\'t find controller for action ' + data.name, blade);\n } else {\n newBlade.controller = registrationInfo.controller;\n newBlade.template = registrationInfo.template;\n\n bladeNavigationService.showBlade(newBlade, blade);\n }\n };\n\n $scope.blade.headIcon = 'fa fa-upload';\n $scope.blade.title = \"Bulk action list\";\n $scope.blade.subtitle = \"Select action for bulk operation\";\n\n\n blade.initializeAction = function(action) {\n action.title = 'virtoCommerce.catalogBulkActionsModule.actions.types.' + action.name + '.title';\n action.subtitle = 'virtoCommerce.catalogBulkActionsModule.actions.types.' + action.name + '.subtitle';\n action.id = action.name;\n action.icon = 'fa fa-cogs';\n action.actionDataContext = {\n actionName: action.name,\n contextTypeName: action.contextTypeName,\n dataQuery: blade.dataQuery\n };\n };\n\n initializeBlade();\n }]);\n","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.advancedSearchResultsController', ['$rootScope', '$scope', '$filter', 'virtoCommerce.catalogModule.categories', 'virtoCommerce.catalogModule.items', 'virtoCommerce.catalogModule.listEntries', 'platformWebApp.bladeNavigationService', 'platformWebApp.dialogService', function ($rootScope, $scope, $filter, categories, items, listEntries, bladeNavigationService, dialogService) {\n\n $scope.blade.refresh = function () {\n $scope.blade.isLoading = true;\n var skip = ($scope.pageSettings.currentPage - 1) * $scope.pageSettings.itemsPerPageCount;\n listEntries.listitemssearch(\n {\n catalogId: $scope.blade.catalogId,\n categoryId: $scope.blade.categoryId,\n // propertyValues: .... ,\n responseGroup: 'withProducts',\n skip: skip,\n take: $scope.pageSettings.itemsPerPageCount\n },\n\t\tfunction (data, headers) {\n\t\t $scope.blade.isLoading = false;\n\t\t $scope.pageSettings.totalItems = data.totalCount;\n\t\t $scope.items = data.listEntries;\n\t\t}, function (error) {\n\t\t bladeNavigationService.setError('Error ' + error.status, $scope.blade);\n\t\t});\n }\n\n function isItemsChecked() {\n return $scope.items && _.any($scope.items, function (x) { return x.selected; });\n }\n\n\n $scope.selectItem = function (listItem) {\n $scope.selectedItem = listItem;\n };\n\n $scope.blade.toolbarCommands = [\n {\n name: \"platform.commands.refresh\", icon: 'fa fa-refresh',\n executeMethod: blade.refresh,\n canExecuteMethod: function () {\n return true;\n }\n }\n ];\n\n //No need to call this because page 'pageSettings.currentPage' is watched!!! It would trigger subsequent duplicated req...\n //$scope.blade.refresh();\n}]);","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.advancedSearchController', ['$scope', '$filter', 'virtoCommerce.catalogModule.listEntries', 'platformWebApp.bladeNavigationService', function ($scope, $filter, listEntries, bladeNavigationService) {\n var propertyValues = undefined;\n $scope.filter = { searchKeyword: undefined };\n\n $scope.blade.refresh = function () {\n $scope.blade.isLoading = true;\n\n //Set filters\n prepareFilter();\n\n var searchResult = listEntries.listitemssearch({ categoryId: $scope.filter.categoryId, catalogId: $scope.filter.catalogId, keyword: $scope.filter.searchKeyword, propertyValues: $scope.filter.propValues, responseGroup: 'withCatalogs, withCategories, withProperties', skip: 0, take: 0 }, function () {\n $scope.blade.isLoading = false;\n\n // adding root element\n var rootNode = {\n children: searchResult.treeNodes\n };\n $scope.tree = [rootNode];\n\n //populate property filter panel\n $scope.propertyValueGroups = preparePropertyValueGroups(propertyValues, searchResult.propertyValues);\n propertyValues = searchResult.propertyValues;\n $scope.checkedPropValues = getAllCheckedPropValues(propertyValues);\n },\n function (error) { bladeNavigationService.setError('Error ' + error.status, $scope.blade); });\n };\n\n $scope.refreshItems = function () {\n //Set filters\n prepareFilter();\n \n var newBlade = {\n id: \"searchResults\",\n title: 'catalog.blades.advanced-search-results.title',\n subtitle: '',\n filter: $scope.filter,\n controller: 'virtoCommerce.catalogModule.advancedSearchResultsController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/advanced-search-results.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, $scope.blade);\n };\n\n $scope.uncheckAllProp = function () {\n angular.forEach($scope.checkedPropValues, function (checkedPropValue) {\n checkedPropValue.isChecked = false;\n });\n $scope.updateSelectedPropValues();\n $scope.refreshItems();\n };\n\n $scope.updateSelectedPropValues = function () {\n $scope.checkedPropValues = getAllCheckedPropValues(propertyValues);\n };\n \n function prepareFilter() {\n //Set filters\n //if (selectedNode != null) {\n // $scope.filter.categoryPath = selectedNode.path;\n // if (selectedNode.type == \"catalog\") {\n // $scope.filter.categoryId = undefined;\n // $scope.filter.catalogId = selectedNode.id;\n // } else {\n // $scope.filter.categoryId = selectedNode.id;\n // $scope.filter.catalogId = selectedNode.catalogId;\n // }\n //}\n //$scope.filter.propValues = getAllCheckedPropValues(propertyValues);\n };\n\n function getAllCheckedPropValues(propValues) {\n var retVal = [];\n angular.forEach(propValues, function (propValue) {\n if (propValue.isChecked) {\n retVal.push(propValue);\n };\n });\n return retVal;\n };\n\n function preparePropertyValueGroups(oldPropertyValues, newPropValues) {\n var retVal = {};\n var checkedPropValues = getAllCheckedPropValues(oldPropertyValues);\n angular.forEach(newPropValues, function (propValue) {\n if (angular.isUndefined(retVal[propValue.propertyName])) {\n retVal[propValue.propertyName] = { propValues: [], showAll: false };\n };\n retVal[propValue.propertyName].propValues.push(propValue);\n propValue.isChecked = $filter('filter')(checkedPropValues, function (value) { return value.propertyName == propValue.propertyName && value.value == propValue.value; }).length > 0;\n });\n return retVal;\n };\n\n // actions on load\n $scope.blade.refresh();\n $scope.refreshItems();\n}]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.aggregationPropertyDetailsController', ['$scope', 'platformWebApp.bladeNavigationService', 'virtoCommerce.catalogModule.aggregationProperties', function ($scope, bladeNavigationService, aggregationProperties) {\n var blade = $scope.blade;\n blade.updatePermission = 'store:update';\n blade.headIcon = 'fa fa-gear';\n\n var attributeType = \"Attribute\";\n var rangeType = \"Range\";\n var priceRangeType = \"PriceRange\";\n blade.propertyTypes = [attributeType, rangeType];\n\n function initializeBlade() {\n $scope.isValid = true;\n blade.originalProperty = blade.property;\n blade.property = angular.copy(blade.property);\n\n if (blade.property.values == null)\n blade.property.values = [];\n blade.values = [];\n\n aggregationProperties.getValues({ storeId: blade.storeId, propertyName: blade.originalProperty.name }, function (results) {\n blade.values = results;\n \n blade.isLoading = false;\n }, function (error) {\n bladeNavigationService.setError('Error: ' + error.status, blade);\n });\n\n blade.isLoading = false;\n }\n\n blade.isRange = function () {\n return blade.property.type !== attributeType;\n };\n\n blade.canChangeType = function () {\n return blade.property.type !== priceRangeType;\n };\n\n blade.canChangeSize = function () {\n return !blade.isRange();\n };\n\n blade.getValues = function (search) {\n var result;\n\n if (blade.isRange()) {\n result = [0, +(Math.max(...blade.property.values) | 0) + 100];\n if (search && !isNaN(search) && angular.isNumber(+search)) {\n result.unshift(search);\n }\n } else {\n result = blade.values;\n }\n\n return result;\n };\n\n blade.hasPredefinedValues = function () {\n return blade.isRange() || (!!blade.values && blade.values.length > 0);\n }\n\n function isDirty() {\n return !angular.equals(blade.property, blade.originalProperty) && blade.hasUpdatePermission();\n }\n\n blade.onClose = function (closeCallback) {\n bladeNavigationService.showConfirmationIfNeeded(isDirty(), true, blade, $scope.saveChanges, closeCallback, \"Save changes\", \"The property settings have been modified. Do you want to save changes?\");\n };\n\n $scope.saveChanges = function () {\n blade.property.valuesCount = blade.property.values.length;\n angular.copy(blade.property, blade.originalProperty);\n $scope.bladeClose();\n };\n\n initializeBlade();\n }]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.aggregationPropertiesController', ['$scope', 'platformWebApp.dialogService', 'platformWebApp.bladeNavigationService', 'virtoCommerce.catalogModule.aggregationProperties', function ($scope, dialogService, bladeNavigationService, aggregationProperties) {\n var blade = $scope.blade;\n blade.updatePermission = 'store:update';\n\n function initializeBlade() {\n aggregationProperties.getProperties({ storeId: blade.storeId }, function (results) {\n blade.currentEntities = angular.copy(results);\n blade.origEntity = results;\n\n blade.selectedEntities = _.where(blade.currentEntities, { isSelected: true });\n blade.origSelected = angular.copy(blade.selectedEntities);\n\n blade.isLoading = false;\n }, function (error) {\n bladeNavigationService.setError('Error ' + error.status, blade);\n });\n }\n\n blade.edit = function (node) {\n var newBlade = {\n id: \"aggregationPropertyDetails\",\n controller: 'virtoCommerce.catalogModule.aggregationPropertyDetailsController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/aggregation-properties-details.tpl.html',\n title: node.name,\n storeId: blade.storeId,\n property: node\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n blade.select = function (node) {\n node.isSelected = true;\n blade.selectedEntities.push(node);\n };\n\n blade.unselect = function (node) {\n node.isSelected = false;\n blade.selectedEntities.splice(blade.selectedEntities.indexOf(node), 1);\n };\n\n function isDirty() {\n return !angular.equals(blade.selectedEntities, blade.origSelected) && blade.hasUpdatePermission();\n }\n \n blade.onClose = function (closeCallback) {\n bladeNavigationService.showConfirmationIfNeeded(isDirty(), true, blade, $scope.saveChanges, closeCallback, \"Save changes\", \"The properties selection has been modified. Do you want to confirm changes?\");\n };\n\n $scope.saveChanges = function () {\n blade.isLoading = true;\n\n aggregationProperties.setProperties({ storeId: blade.storeId }, blade.selectedEntities, function (data) {\n angular.copy(blade.currentEntities, blade.origEntity);\n angular.copy(blade.selectedEntities, blade.origSelected);\n // $scope.bladeClose();\n blade.isLoading = false;\n blade.parentBlade.refresh();\n }, function (error) {\n bladeNavigationService.setError('Error: ' + error.status, blade);\n });\n };\n\n blade.toolbarCommands = [\n {\n name: \"Save\", icon: 'fas fa-save',\n executeMethod: $scope.saveChanges,\n canExecuteMethod: isDirty\n },\n {\n name: \"Reset\", icon: 'fa fa-undo',\n executeMethod: function () {\n angular.copy(blade.origEntity, blade.currentEntities);\n blade.selectedEntities = _.where(blade.currentEntities, { isSelected: true });\n angular.copy(blade.selectedEntities, blade.origSelected);\n },\n canExecuteMethod: isDirty\n // permission: 'catalog:update'\n }\n ];\n\n $scope.sortableOptions = {\n axis: 'y',\n cursor: \"move\"\n };\n\n blade.headIcon = 'fa fa-gear';\n initializeBlade();\n}]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.billOfMaterialsListController',\n ['$scope', '$timeout',\n 'platformWebApp.bladeNavigationService', 'platformWebApp.uiGridHelper', 'platformWebApp.bladeUtils', 'platformWebApp.dialogService',\n 'virtoCommerce.catalogModule.items', 'virtoCommerce.catalogModule.categories', 'virtoCommerce.catalogModule.associations',\n function ($scope, $timeout, bladeNavigationService, uiGridHelper, bladeUtils, dialogService, items, categories, associations) {\n $scope.uiGridConstants = uiGridHelper.uiGridConstants;\n $scope.hasMore = true;\n\n var selectedNode = null;\n var blade = $scope.blade;\n\n blade.headIcon = 'far fa-list-alt';\n blade.title = 'catalog.blades.bill-of-materials-list.title';\n blade.subtitle = 'catalog.blades.bill-of-materials-list.subtitle';\n blade.cupImage = 'Modules/$(VirtoCommerce.Catalog)/Content/images/cup.svg';\n\n blade.associationType = \"BillOfMaterials\";\n blade.associatedObjectType = 'product';\n blade.currentEntities = [];\n blade.filter = {};\n\n blade.filter.criteriaChanged = function () {\n blade.refresh();\n };\n\n blade.refresh = function () {\n if ($scope.pageSettings.currentPage > 1) {\n $scope.pageSettings.currentPage = 1;\n }\n\n startPaging();\n };\n\n function startPaging() {\n blade.isLoading = true;\n\n associations.search(getSearchCriteria(), function (data) {\n blade.isLoading = false;\n\n populateAssociationsData(data.results);\n blade.currentEntities = data.results;\n\n $scope.pageSettings.totalItems = data.totalCount;\n $scope.hasMore = data.results.length === $scope.pageSettings.itemsPerPageCount;\n\n if (selectedNode) {\n //re-select the node in the new list\n selectedNode = _.findWhere(data.results, { id: selectedNode.id });\n }\n });\n\n if ($scope.gridApi) {\n blade.currentEntities = [];\n $scope.gridApi.infiniteScroll.resetScroll(true, true);\n $scope.gridApi.infiniteScroll.dataLoaded();\n }\n }\n\n function loadMore() {\n if ($scope.hasMore) {\n blade.isLoading = true;\n\n ++$scope.pageSettings.currentPage;\n $scope.gridApi.infiniteScroll.saveScrollPercentage();\n\n associations.search(getSearchCriteria(), function (data) {\n blade.isLoading = false;\n\n populateAssociationsData(data.results);\n blade.currentEntities = blade.currentEntities.concat(data.results);\n\n $scope.pageSettings.totalItems = data.totalCount;\n $scope.hasMore = data.results.length === $scope.pageSettings.itemsPerPageCount;\n $scope.gridApi.infiniteScroll.dataLoaded();\n });\n }\n }\n\n function getSearchCriteria() {\n return {\n keyword: blade.filter.keyword,\n skip: ($scope.pageSettings.currentPage - 1) * $scope.pageSettings.itemsPerPageCount,\n take: $scope.pageSettings.itemsPerPageCount,\n objectIds: [blade.item.id],\n group: blade.associationType\n };\n }\n\n function populateAssociationsData(productAssociations) {\n if (!_.some(productAssociations)) {\n return;\n }\n\n blade.isLoading = true;\n\n var itemIds = _.pluck(productAssociations, 'associatedObjectId');\n items.plenty({ respGroup: 'WithImages' }, itemIds, function (products) {\n var uniqueCategoriesIds = _.uniq(_.pluck(products, 'categoryId'));\n\n categories.plenty({ respGroup: 'Info' }, uniqueCategoriesIds, function (categoriesResult) {\n addAssociationProperties(productAssociations, products, categoriesResult);\n\n blade.isLoading = false;\n });\n });\n }\n\n function addAssociationProperties(productAssociations, products, productCategories) {\n _.each(productAssociations, function (x) {\n x.$$quantity = x.quantity;\n x.associatedObjectType = blade.associatedObjectType;\n\n var item = _.find(products, function (d) { return d.id === x.associatedObjectId; });\n if (item) {\n x.$$productName = item.name;\n\n x.$$categoryId = item.categoryId;\n x.$$category = _.find(productCategories, function (c) { return c.id === x.$$categoryId; });\n\n if (item.images && item.images.length) {\n x.$$imageUrl = item.images[0].url;\n }\n\n if (x.associatedObjectType === 'product') {\n x.$$productType = item.productType;\n }\n }\n });\n }\n\n $scope.openProduct = function (listItem) {\n $scope.selectedNodeId = listItem.associatedObjectId;\n\n var newBlade = {\n id: 'billOfMaterialsDetail',\n itemId: listItem.associatedObjectId,\n productType: listItem.$$productType,\n catalog: blade.catalog,\n controller: 'virtoCommerce.catalogModule.itemDetailController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/item-detail.tpl.html'\n };\n\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n $scope.isValidQuantity = function (listItem) {\n return listItem.quantity && listItem.quantity > 0;\n }\n\n $scope.updateQuantity = function (listItem) {\n if (listItem.$$quantity !== listItem.quantity && $scope.isValidQuantity(listItem)) {\n blade.isLoading = true;\n\n associations.update([listItem], function () {\n listItem.$$quantity = listItem.quantity;\n\n blade.isLoading = false;\n });\n }\n }\n\n $scope.deleteList = function (list) {\n bladeNavigationService.closeChildrenBlades(blade,\n function () {\n var dialog = {\n id: \"confirmDeleteBomAssociaitonItem\",\n title: \"catalog.dialogs.bill-or-materials-associations-delete.title\",\n message: \"catalog.dialogs.bill-or-materials-associations-delete.message\",\n callback: function (remove) {\n if (remove) {\n bladeNavigationService.closeChildrenBlades(blade, function () {\n blade.isLoading = true;\n\n var itemIds = _.pluck(list, 'id');\n associations.delete({ ids: itemIds }, function () {\n if (blade.itemsDeleted) {\n blade.itemsDeleted(itemIds)\n }\n\n blade.refresh();\n });\n });\n }\n }\n };\n dialogService.showConfirmationDialog(dialog);\n });\n };\n\n $scope.openAddItemBlade = function () {\n var selection = [];\n\n var options = {\n allowCheckingCategory: false,\n selectedItemIds: [],\n excludeProductType: 'BillOfMaterials',\n checkItemFn: function (listItem, isSelected) {\n if (isSelected) {\n if (!_.find(selection, function (x) { return x.id == listItem.id; })) {\n selection.push(listItem);\n }\n }\n else {\n selection = _.reject(selection, function (x) { return x.id == listItem.id; });\n }\n }\n };\n\n var newBlade = {\n id: \"CatalogItemsSelect\",\n controller: 'virtoCommerce.catalogModule.catalogItemSelectController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/common/catalog-items-select.tpl.html',\n options: options,\n breadcrumbs: [],\n toolbarCommands: [\n {\n name: \"platform.commands.confirm\", icon: 'fa fa-check',\n executeMethod: function (selectBlade) {\n blade.isLoading = true;\n bladeNavigationService.closeBlade(selectBlade);\n\n // search for associated products\n var selectedProductIds = _.pluck(selection, 'id');\n var searchCriteria = {\n take: selectedProductIds.length,\n objectIds: [blade.item.id],\n group: blade.associationType,\n associatedObjectIds: selectedProductIds\n };\n\n associations.search(searchCriteria, function (data) {\n // filter out already associated products, if any\n if (data.totalCount) {\n selectedProductIds = _.filter(selectedProductIds, function (productId) {\n return !_.some(data.results, function (association) {\n return productId === association.associatedObjectId;\n });\n });\n }\n\n // save only unique product associations\n if (selectedProductIds.length) {\n var newAssociations = _.map(selectedProductIds, function (id) {\n return {\n associatedObjectId: id,\n associatedObjectName: \"test\",\n associatedObjectType: blade.associatedObjectType,\n itemId: blade.item.id,\n quantity: 1,\n type: blade.associationType\n }\n });\n\n blade.isLoading = true;\n associations.update(newAssociations, function () {\n if (blade.itemsAdded) {\n blade.itemsAdded(newAssociations)\n }\n\n blade.refresh();\n });\n }\n\n blade.isLoading = false;\n });\n },\n canExecuteMethod: function () {\n return _.any(selection);\n }\n }]\n };\n\n bladeNavigationService.showBlade(newBlade, blade);\n }\n\n blade.toolbarCommands = [\n {\n name: \"platform.commands.add\", icon: 'fas fa-plus',\n executeMethod: function () {\n $scope.openAddItemBlade();\n },\n canExecuteMethod: function () {\n return true;\n }\n },\n {\n name: \"platform.commands.delete\", icon: 'fas fa-trash-alt',\n executeMethod: function () {\n $scope.deleteList($scope.gridApi.selection.getSelectedRows());\n },\n canExecuteMethod: function () {\n return $scope.gridApi && _.any($scope.gridApi.selection.getSelectedRows());\n }\n }\n ];\n\n // ui-grid\n $scope.setGridOptions = function (gridOptions) {\n bladeUtils.initializePagination($scope, true);\n $scope.pageSettings.itemsPerPageCount = 20;\n\n uiGridHelper.initialize($scope, gridOptions, function (gridApi) {\n $scope.gridApi = gridApi;\n\n uiGridHelper.bindRefreshOnSortChanged($scope);\n $scope.gridApi.infiniteScroll.on.needLoadMoreData($scope, loadMore);\n });\n\n // need to call refresh after digest cycle as we do not \"$watch\" for $scope.pageSettings.currentPage\n $timeout(function () {\n blade.refresh();\n });\n };\n }]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.bulkActionProgressController', [\n '$scope',\n 'platformWebApp.bladeNavigationService',\n 'virtoCommerce.catalogBulkActionsModule.webApi',\n function (\n $scope,\n bladeNavigationService,\n webApi)\n {\n var blade = $scope.blade;\n blade.isLoading = true;\n $scope.blade.headIcon = 'fa fa-upload';\n\n function initializeBlade() {\n blade.isLoading = false;\n webApi.runBulkAction(blade.actionDataContext,\n function (data) {\n blade.notification = data;\n });\n }\n\n $scope.$on(\"new-notification-event\", function (event, notification) {\n if (blade.notification && notification.id === blade.notification.id) {\n angular.copy(notification, blade.notification);\n if (notification.errorCount > 0) {\n bladeNavigationService.setError('Action error', blade);\n }\n\n if (blade.notification.finished) {\n if (blade.onCompleted) {\n blade.onCompleted();\n }\n }\n }\n });\n\n var commandCancel = {\n name: 'platform.commands.cancel',\n icon: 'fa fa-times',\n canExecuteMethod: function () {\n return blade.notification && !blade.notification.finished;\n },\n executeMethod: function () {\n webApi.cancel({ jobId: blade.notification.jobId }, function (data) {\n });\n }\n };\n\n blade.toolbarCommands = [commandCancel];\n initializeBlade();\n }]);\n","angular.module('virtoCommerce.catalogModule')\n .factory('virtoCommerce.catalogModule.catalogBulkActionService', function () {\n var registrationList = [];\n var retVal = {\n getByName: function (name) {\n return _.find(registrationList, function (info) { return info.name === name});\n },\n register: function (registrationInfo) {\n\n var index = _.findIndex(registrationList,\n function (info) { return info.name === registrationInfo.name; });\n if (index >= 0) {\n registrationList[index] = registrationInfo;\n }\n else \n {\n registrationList.push(registrationInfo);\n }\n }\n };\n return retVal;\n });\n","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.catalogAddController', ['$scope', 'platformWebApp.bladeNavigationService', 'virtoCommerce.catalogModule.catalogs', function ($scope, bladeNavigationService, catalogs) {\n\n $scope.addCatalog = function () {\n catalogs.newCatalog({}, function (data) {\n var newBlade = {\n id: 'catalogEdit',\n isNew: true,\n currentEntity: data,\n title: 'catalog.blades.catalog-detail.title-new',\n subtitle: 'catalog.blades.catalog-detail.subtitle-new',\n controller: 'virtoCommerce.catalogModule.catalogDetailController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/catalog-detail.tpl.html'\n };\n\n bladeNavigationService.showBlade(newBlade, $scope.blade.parentBlade);\n },\n function (error) { bladeNavigationService.setError('Error ' + error.status, $scope.blade); });\n };\n\n $scope.addVirtualCatalog = function () {\n catalogs.newVirtualCatalog({}, function (data) {\n var newBlade = {\n id: 'catalogEdit',\n isNew: true,\n currentEntity: data,\n title: 'catalog.blades.catalog-detail.title-new-virtual',\n subtitle: 'catalog.blades.catalog-detail.subtitle-virtual',\n controller: 'virtoCommerce.catalogModule.virtualCatalogDetailController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/catalog-detail.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, $scope.blade.parentBlade);\n },\n function (error) { bladeNavigationService.setError('Error ' + error.status, $scope.blade); });\n };\n \n $scope.blade.isLoading = false;\n}]);\n","angular.module('virtoCommerce.catalogModule')\r\n .controller('virtoCommerce.catalogModule.catalogDetailController', ['$scope', 'platformWebApp.bladeNavigationService', 'virtoCommerce.catalogModule.catalogs', 'platformWebApp.metaFormsService', function ($scope, bladeNavigationService, catalogs, metaFormsService) {\r\n var blade = $scope.blade;\r\n blade.updatePermission = 'catalog:update';\r\n\r\n blade.metaFields = metaFormsService.getMetaFields(\"catalogDetail\");\r\n\r\n blade.refresh = function (parentRefresh) {\r\n if (blade.isNew) {\r\n initializeBlade(blade.currentEntity);\r\n } else {\r\n catalogs.get({ id: blade.currentEntityId }, function (data) {\r\n initializeBlade(data);\r\n\r\n if (blade.childrenBlades) {\r\n _.each(blade.childrenBlades, function (x) {\r\n if (x.refresh) {\r\n x.refresh(blade.currentEntity);\r\n }\r\n });\r\n }\r\n\r\n if (parentRefresh) {\r\n blade.parentBlade.refresh();\r\n }\r\n },\r\n function (error) { bladeNavigationService.setError('Error ' + error.status, blade); });\r\n }\r\n }\r\n\r\n function initializeBlade(data) {\r\n if (!blade.isNew) {\r\n blade.title = data.name;\r\n }\r\n\r\n blade.currentEntity = angular.copy(data);\r\n blade.origEntity = data;\r\n blade.isLoading = false;\r\n blade.securityScopes = data.securityScopes;\r\n };\r\n\r\n function isDirty() {\r\n return !angular.equals(blade.currentEntity, blade.origEntity) && blade.hasUpdatePermission();\r\n }\r\n\r\n function canSave() {\r\n return isDirty() && formScope && formScope.$valid;\r\n }\r\n\r\n var formScope;\r\n $scope.setForm = function (form) { formScope = form; }\r\n\r\n $scope.cancelChanges = function () {\r\n angular.copy(blade.origEntity, blade.currentEntity);\r\n $scope.bladeClose();\r\n };\r\n $scope.saveChanges = function () {\r\n blade.isLoading = true;\r\n\r\n if (blade.isNew) {\r\n catalogs.save({}, blade.currentEntity, function (data) {\r\n blade.isNew = undefined;\r\n blade.currentEntityId = data.id;\r\n initializeBlade(data);\r\n initializeToolbar();\r\n $scope.gridsterOpts.maxRows = 3; // force re-initializing the widgets\r\n blade.refresh(true);\r\n }, function (error) {\r\n bladeNavigationService.setError('Error ' + error.status, blade);\r\n });\r\n }\r\n else {\r\n catalogs.update({}, blade.currentEntity, function () {\r\n blade.refresh(true);\r\n }, function (error) {\r\n bladeNavigationService.setError('Error ' + error.status, blade);\r\n });\r\n }\r\n };\r\n\r\n blade.onClose = function (closeCallback) {\r\n bladeNavigationService.showConfirmationIfNeeded(isDirty(), canSave(), blade, $scope.saveChanges, closeCallback, \"catalog.dialogs.catalog-save.title\", \"catalog.dialogs.catalog-save.message\");\r\n };\r\n\r\n function initializeToolbar() {\r\n if (!blade.isNew) {\r\n blade.toolbarCommands = [\r\n {\r\n name: \"platform.commands.save\", icon: 'fas fa-save',\r\n executeMethod: function () {\r\n $scope.saveChanges();\r\n },\r\n canExecuteMethod: canSave,\r\n permission: blade.updatePermission\r\n },\r\n {\r\n name: \"platform.commands.reset\", icon: 'fa fa-undo',\r\n executeMethod: function () {\r\n angular.copy(blade.origEntity, blade.currentEntity);\r\n },\r\n canExecuteMethod: isDirty,\r\n permission: blade.updatePermission\r\n }\r\n ];\r\n }\r\n }\r\n\r\n $scope.gridsterOpts = { columns: 3 };\r\n\r\n initializeToolbar();\r\n blade.refresh(false);\r\n }]);\r\n","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.catalogLanguagesController', ['$scope', 'platformWebApp.settings', 'platformWebApp.bladeNavigationService', function ($scope, settings, bladeNavigationService) {\n var blade = $scope.blade;\n blade.updatePermission = 'catalog:update';\n var promise = settings.getValues({ id: 'VirtoCommerce.Core.General.Languages' }).$promise;\n $scope.languages = [];\n\n function initializeBlade(data) {\n blade.data = data;\n\n promise.then(function (promiseData) {\n $scope.languages = promiseData;\n\n var defaultValue = _.find(promiseData, function (x) { return x.toLowerCase() === data.defaultLanguage.languageCode.toLowerCase(); });\n var languages = _.pluck(data.languages, 'languageCode');\n\n var newModel = {\n defaultValue: defaultValue,\n selectedValues: _.without(languages, defaultValue)\n };\n\n blade.origEntity = newModel;\n blade.currentEntity = angular.copy(newModel);\n blade.isLoading = false;\n });\n }\n\n blade.onClose = function (closeCallback) {\n bladeNavigationService.showConfirmationIfNeeded(isDirty(), true, blade, $scope.saveChanges, closeCallback, \"catalog.dialogs.language-save.title\", \"catalog.dialogs.language-save.message\");\n };\n\n function isDirty() {\n return !angular.equals(blade.currentEntity, blade.origEntity) && blade.hasUpdatePermission();\n };\n\n $scope.cancelChanges = function () {\n blade.currentEntity = blade.origEntity;\n $scope.bladeClose();\n }\n\n $scope.saveChanges = function () {\n if (!blade.hasUpdatePermission()) return;\n\n var selectedValues = _.map(blade.currentEntity.selectedValues, function (x) { return { languageCode: x }; });\n var defaultValue = _.find(selectedValues, function (x) { return x.languageCode.toLowerCase() === blade.currentEntity.defaultValue.toLowerCase(); });\n if (defaultValue) {\n defaultValue.isDefault = true;\n } else {\n defaultValue = {\n languageCode: blade.currentEntity.defaultValue,\n isDefault: true\n };\n selectedValues.push(defaultValue);\n }\n\n blade.data.defaultLanguage = defaultValue;\n blade.data.languages = selectedValues;\n\n angular.copy(blade.currentEntity, blade.origEntity);\n $scope.bladeClose();\n };\n\n blade.headIcon = 'fa fa-language';\n\n $scope.openDictionarySettingManagement = function () {\n var newBlade = {\n id: 'settingDetailChild',\n isApiSave: true,\n currentEntityId: 'VirtoCommerce.Core.General.Languages',\n parentRefresh: function (data) { $scope.languages = data; },\n controller: 'platformWebApp.settingDictionaryController',\n template: '$(Platform)/Scripts/app/settings/blades/setting-dictionary.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n $scope.$watch('blade.parentBlade.currentEntity', initializeBlade);\n\n // on load: \n // $scope.$watch('blade.parentBlade.currentEntity' gets fired\n}]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.catalogsListController', ['$scope', 'virtoCommerce.catalogModule.catalogs', 'platformWebApp.bladeNavigationService', 'platformWebApp.dialogService', 'platformWebApp.authService', 'platformWebApp.uiGridHelper', 'platformWebApp.bladeUtils', '$timeout', 'platformWebApp.settings',\n function ($scope, catalogs, bladeNavigationService, dialogService, authService, uiGridHelper, bladeUtils, $timeout, settings) {\n $scope.uiGridConstants = uiGridHelper.uiGridConstants;\n var blade = $scope.blade;\n $scope.hasMore = true;\n blade.currentEntities = [];\n var selectedNode = null;\n\n blade.isCopyIdMenuVisible = false;\n settings.getValues({ id: 'Catalog.AllowToCopyID' }, function (data) {\n if (data && data.length > 0) {\n blade.isCopyIdMenuVisible = data[0];\n }\n });\n\n blade.refresh = function () {\n blade.isLoading = true;\n\n if ($scope.pageSettings.currentPage !== 1)\n $scope.pageSettings.currentPage = 1;\n\n catalogs.search(getSearchCriteria(), function (data) {\n blade.isLoading = false;\n $scope.pageSettings.totalItems = data.totalCount;\n blade.currentEntities = data.results;\n $scope.hasMore = data.results.length === $scope.pageSettings.itemsPerPageCount;\n\n if (selectedNode) {\n //select the node in the new list\n selectedNode = _.findWhere(data.results, { id: selectedNode.id });\n }\n });\n if ($scope.gridApi) {\n blade.currentEntities = [];\n $scope.gridApi.infiniteScroll.resetScroll(true, true);\n $scope.gridApi.infiniteScroll.dataLoaded();\n }\n };\n\n function showMore() {\n if ($scope.hasMore) {\n ++$scope.pageSettings.currentPage;\n $scope.gridApi.infiniteScroll.saveScrollPercentage();\n blade.isLoading = true;\n\n catalogs.search(getSearchCriteria(), function (data) {\n blade.isLoading = false;\n $scope.pageSettings.totalItems = data.totalCount;\n blade.currentEntities = blade.currentEntities.concat(data.results);\n $scope.hasMore = data.results.length === $scope.pageSettings.itemsPerPageCount;\n $scope.gridApi.infiniteScroll.dataLoaded();\n });\n }\n }\n\n function getSearchCriteria() {\n return {\n sort: uiGridHelper.getSortExpression($scope),\n skip: ($scope.pageSettings.currentPage - 1) * $scope.pageSettings.itemsPerPageCount,\n take: $scope.pageSettings.itemsPerPageCount\n };\n }\n\n $scope.selectNode = function (node) {\n selectedNode = node;\n $scope.selectedNodeId = selectedNode.id;\n\n openItemsBlade(node);\n\n // setting current catalog to be globally available \n bladeNavigationService.catalogsSelectedCatalog = selectedNode;\n bladeNavigationService.catalogsSelectedCategoryId = undefined;\n };\n\n function openItemsBlade(node) {\n var newBlade = {\n id: 'itemsList1',\n level: 1,\n breadcrumbs: blade.breadcrumbs,\n title: 'catalog.blades.categories-items-list.title',\n controller: 'virtoCommerce.catalogModule.categoriesItemsListController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/categories-items-list.tpl.html'\n };\n\n if (node.id)\n angular.extend(newBlade,\n {\n subtitle: 'catalog.blades.categories-items-list.subtitle',\n subtitleValues: { name: node.name },\n catalogId: node.id,\n catalog: node,\n securityScopes: node.securityScopes\n });\n else\n angular.extend(newBlade,\n {\n filterKeyword: filter.keyword,\n subtitle: 'catalog.blades.categories-items-list.subtitle-search',\n subtitleValues: { keyword: filter.keyword }\n });\n\n bladeNavigationService.showBlade(newBlade, blade);\n }\n\n $scope.copyItemID = function (data) {\n navigator.clipboard.writeText(data.id).then().catch(e => console.error(e));\n };\n\n $scope.editCatalog = function (catalog) {\n if (catalog.isVirtual) {\n showVirtualCatalogBlade(catalog.id, null, catalog.name);\n } else {\n showCatalogBlade(catalog.id, null, catalog.name);\n }\n };\n\n $scope.deleteCatalog = function (node) {\n var dialog = {\n id: \"confirmDelete\",\n name: node.name,\n callback: function (remove) {\n if (remove) {\n bladeNavigationService.closeChildrenBlades(blade,\n function () {\n selectedNode = undefined;\n $scope.selectedNodeId = undefined;\n blade.isLoading = true;\n catalogs.delete({ id: node.id },\n blade.refresh,\n function (error) {\n bladeNavigationService.setError('Error ' + error.status, blade);\n }\n );\n });\n }\n }\n };\n dialogService.showDialog(dialog,\n 'Modules/$(VirtoCommerce.Catalog)/Scripts/dialogs/deleteCatalog-dialog.tpl.html',\n 'platformWebApp.confirmDialogController');\n };\n\n function showCatalogBlade(id, data, title) {\n var newBlade = {\n currentEntityId: id,\n currentEntity: data,\n title: title,\n id: 'catalogEdit',\n subtitle: 'catalog.blades.catalog-detail.subtitle',\n controller: 'virtoCommerce.catalogModule.catalogDetailController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/catalog-detail.tpl.html',\n };\n\n bladeNavigationService.showBlade(newBlade, blade);\n }\n\n function showVirtualCatalogBlade(id, data, title) {\n var newBlade = {\n currentEntityId: id,\n currentEntity: data,\n title: title,\n subtitle: 'catalog.blades.catalog-detail.subtitle-virtual',\n id: 'catalogEdit',\n controller: 'virtoCommerce.catalogModule.virtualCatalogDetailController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/catalog-detail.tpl.html',\n };\n\n bladeNavigationService.showBlade(newBlade, blade);\n }\n\n blade.toolbarCommands = [\n {\n name: \"platform.commands.refresh\",\n icon: 'fa fa-refresh',\n executeMethod: blade.refresh,\n canExecuteMethod: function () {\n return true;\n }\n }\n ];\n\n if (authService.checkPermission('catalog:create')) {\n blade.toolbarCommands.splice(1,\n 0,\n {\n name: \"platform.commands.add\",\n icon: 'fas fa-plus',\n executeMethod: function () {\n selectedNode = undefined;\n $scope.selectedNodeId = undefined;\n\n var newBlade = {\n id: 'listItemChild',\n title: 'catalog.blades.catalog-add.title',\n subtitle: 'catalog.blades.catalog-add.subtitle',\n controller: 'virtoCommerce.catalogModule.catalogAddController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/catalog-add.tpl.html'\n };\n\n bladeNavigationService.showBlade(newBlade, blade);\n },\n canExecuteMethod: function () {\n return true;\n }\n });\n }\n\n // simple and advanced filtering\n var filter = blade.filter = { keyword: null };\n\n filter.criteriaChanged = function () {\n if (filter.keyword) {\n openItemsBlade({});\n } else\n bladeNavigationService.closeChildrenBlades(blade);\n\n selectedNode = null;\n $scope.selectedNodeId = null;\n bladeNavigationService.catalogsSelectedCatalog = undefined;\n bladeNavigationService.catalogsSelectedCategoryId = undefined;\n };\n\n $scope.setGridOptions = function (gridOptions) {\n bladeUtils.initializePagination($scope, true);\n $scope.pageSettings.itemsPerPageCount = 20;\n\n uiGridHelper.initialize($scope, gridOptions, function (gridApi) {\n //update gridApi for current grid\n $scope.gridApi = gridApi;\n\n uiGridHelper.bindRefreshOnSortChanged($scope);\n $scope.gridApi.infiniteScroll.on.needLoadMoreData($scope, showMore);\n\n });\n\n // need to call refresh after digest cycle as we do not \"$watch\" for $scope.pageSettings.currentPage\n $timeout(function () {\n blade.refresh();\n });\n };\n\n // actions on load\n // blade.refresh();\n }\n ]);\n","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.catalogsSelectController', ['$scope', 'virtoCommerce.catalogModule.catalogs', 'platformWebApp.bladeNavigationService', function ($scope, catalogs, bladeNavigationService) {\n var blade = $scope.blade;\n\n blade.refresh = function () {\n blade.isLoading = true;\n //ToDo: Apply Infinite scrolling\n catalogs.search({take: 1000}, function (data) {\n if (blade.doShowAllCatalogs) {\n $scope.objects = data.results;\n } else {\n $scope.objects = _.where(data.results, { isVirtual: false });\n }\n\n blade.isLoading = false;\n },\n function (error) { bladeNavigationService.setError('Error ' + error.status, blade); });\n };\n\n $scope.selectNode = function (selectedNode) {\n $scope.bladeClose(function () {\n blade.parentBlade.onAfterCatalogSelected(selectedNode);\n });\n };\n\n // actions on load\n blade.refresh();\n}]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.categoriesItemsAddController', ['$scope', 'platformWebApp.bladeNavigationService', 'virtoCommerce.catalogModule.categories', 'virtoCommerce.catalogModule.items', 'virtoCommerce.catalogModule.itemTypesResolverService', function ($scope, bladeNavigationService, categories, items, itemTypesResolverService) {\n var blade = $scope.blade;\n var pb = blade.parentBlade;\n\n $scope.availableTypes = itemTypesResolverService.objects;\n\n $scope.addCategory = function () {\n categories.newCategory({ catalogId: pb.catalogId, parentCategoryId: pb.categoryId },\n function (data) {\n $scope.bladeClose(function () {\n var newBlade = {\n id: \"newCategoryWizard\",\n currentEntity: data,\n title: \"catalog.wizards.category.title\",\n subtitle: 'catalog.wizards.category.subtitle',\n controller: 'virtoCommerce.catalogModule.newCategoryWizardController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/wizards/newCategory/category-wizard.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, pb);\n\n });\n },\n function (error) { bladeNavigationService.setError('Error ' + error.status, $scope.blade); });\n };\n\n $scope.addLinkedCategory = function () {\n $scope.bladeClose(function () {\n var newBlade = {\n id: 'selectCatalog',\n title: 'catalog.blades.catalogs-select.title',\n subtitle: 'catalog.blades.catalogs-select.subtitle',\n controller: 'virtoCommerce.catalogModule.catalogsSelectController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/catalogs-select.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, pb);\n });\n };\n\n $scope.addProduct = function (productType) {\n if (!angular.isDefined(pb.categoryId)) {\n items.newItemInCatalog({ catalogId: pb.catalogId }, function (data) {\n data.productType = productType;\n setTrackInventory(data);\n $scope.bladeClose(function () {\n showNewItemWizard(data);\n });\n },\n function (error) { bladeNavigationService.setError('Error ' + error.status, $scope.blade); });\n }\n else {\n items.newItemInCategory({ catalogId: pb.catalogId, categoryId: pb.categoryId }, function (data) {\n data.productType = productType;\n setTrackInventory(data);\n $scope.bladeClose(function () {\n showNewItemWizard(data);\n });\n },\n function (error) { bladeNavigationService.setError('Error ' + error.status, $scope.blade); });\n }\n };\n\n function showNewItemWizard(data) {\n // take product and variation properties only\n data.properties = _.filter(data.properties, function (x) { return x.type === 'Product' || x.type === 'Variation'; });\n\n var newBlade = {\n id: 'listItemDetail',\n item: data,\n catalog: blade.catalog,\n title: \"catalog.wizards.new-product.title\",\n subtitle: 'catalog.wizards.new-product.subtitle',\n controller: 'virtoCommerce.catalogModule.newProductWizardController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/wizards/newProduct/new-product-wizard.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, pb);\n };\n\n function setTrackInventory(product) {\n if (product.productType === 'Digital'\n || product.productType === 'BillOfMaterials') {\n product.trackInventory = false;\n }\n }\n\n blade.isLoading = false;\n }]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.categoriesItemsListController', [\n '$sessionStorage', '$localStorage', '$timeout', '$scope', 'virtoCommerce.catalogModule.categories', 'virtoCommerce.catalogModule.items', 'virtoCommerce.catalogModule.listEntries', 'platformWebApp.bladeUtils', 'platformWebApp.dialogService', 'platformWebApp.authService', 'platformWebApp.uiGridHelper', 'virtoCommerce.catalogModule.catalogs', 'platformWebApp.settings',\n function ($sessionStorage, $localStorage, $timeout, $scope, categories, items, listEntries, bladeUtils, dialogService, authService, uiGridHelper, catalogs, settings) {\n $scope.uiGridConstants = uiGridHelper.uiGridConstants;\n $scope.hasMore = true;\n $scope.items = [];\n\n var blade = $scope.blade;\n var bladeNavigationService = bladeUtils.bladeNavigationService;\n if (blade.catalogId)\n blade.catalog = catalogs.get({ id: blade.catalogId });\n\n blade.isCopyIdMenuVisible = false;\n settings.getValues({ id: 'Catalog.AllowToCopyID' }, function (data) {\n if (data && data.length > 0) {\n blade.isCopyIdMenuVisible = data[0];\n }\n });\n\n blade.refresh = function () {\n\n blade.isLoading = true;\n\n if ($scope.pageSettings.currentPage !== 1)\n $scope.pageSettings.currentPage = 1;\n\n var searchCriteria = getSearchCriteria();\n\n listEntries.listitemssearch(\n searchCriteria,\n function (data) {\n transformByFilters(data.listEntries);\n blade.isLoading = false;\n $scope.pageSettings.totalItems = data.totalCount;\n $scope.items = data.listEntries;\n $scope.hasMore = data.listEntries.length === $scope.pageSettings.itemsPerPageCount;\n\n //Set navigation breadcrumbs\n setBreadcrumbs();\n });\n\n //reset state grid\n resetStateGrid();\n }\n\n\n function showMore() {\n if ($scope.hasMore) {\n\n ++$scope.pageSettings.currentPage;\n $scope.gridApi.infiniteScroll.saveScrollPercentage();\n blade.isLoading = true;\n\n var searchCriteria = getSearchCriteria();\n\n listEntries.listitemssearch(\n searchCriteria,\n function (data) {\n transformByFilters(data.listEntries);\n blade.isLoading = false;\n $scope.pageSettings.totalItems = data.totalCount;\n $scope.items = $scope.items.concat(data.listEntries);\n $scope.hasMore = data.listEntries.length === $scope.pageSettings.itemsPerPageCount;\n $scope.gridApi.infiniteScroll.dataLoaded();\n\n $timeout(function () {\n // wait for grid to ingest data changes\n if ($scope.gridApi.selection.getSelectAllState()) {\n $scope.gridApi.selection.selectAllRows();\n }\n });\n\n });\n }\n }\n\n // Search Criteria\n function getSearchCriteria() {\n var searchCriteria = {\n catalogId: blade.catalogId,\n categoryId: blade.categoryId,\n keyword: filter.keyword ? filter.keyword : undefined,\n searchInVariations: filter.searchInVariations ? filter.searchInVariations : false,\n responseGroup: 'withCategories, withProducts',\n sort: uiGridHelper.getSortExpression($scope),\n skip: ($scope.pageSettings.currentPage - 1) * $scope.pageSettings.itemsPerPageCount,\n take: $scope.pageSettings.itemsPerPageCount\n };\n return searchCriteria;\n }\n\n //Breadcrumbs\n function setBreadcrumbs() {\n //Clone array (angular.copy leave a same reference)\n blade.breadcrumbs = blade.breadcrumbs.slice(0);\n\n if (!blade.catalogId) return;\n\n //catalog breadcrumb by default\n var breadCrumb = {\n blade: blade\n };\n\n //if category need change to category breadcrumb\n if (angular.isDefined(blade.category)) {\n\n breadCrumb.id = blade.categoryId;\n breadCrumb.name = blade.category.name;\n } else {\n breadCrumb.id = blade.catalogId;\n blade.catalog.$promise.then((data) => {\n breadCrumb.name = data.name;\n });\n }\n\n //prevent duplicate items\n if (!_.some(blade.breadcrumbs, function (x) { return x.id === breadCrumb.id })) {\n blade.breadcrumbs.push(breadCrumb);\n }\n\n breadCrumb.navigate = function () {\n bladeNavigationService.closeBlade(blade,\n function () {\n blade.disableOpenAnimation = true;\n bladeNavigationService.showBlade(blade, blade.parentBlade);\n });\n };\n }\n\n //reset state grid (header checkbox, scroll)\n function resetStateGrid() {\n if ($scope.gridApi) {\n $scope.items = [];\n $scope.gridApi.selection.clearSelectedRows();\n $scope.gridApi.infiniteScroll.resetScroll(true, true);\n $scope.gridApi.infiniteScroll.dataLoaded();\n }\n }\n\n $scope.copyItemID = function (data) {\n navigator.clipboard.writeText(data.id).then().catch(e => console.error(e));\n };\n\n $scope.edit = function (listItem) {\n if (listItem.type === 'category') {\n blade.setSelectedItem(listItem);\n blade.showCategoryBlade(listItem);\n } else\n $scope.selectItem(null, listItem);\n };\n\n blade.showCategoryBlade = function (listItem) {\n var newBlade = {\n id: \"listCategoryDetail\",\n currentEntityId: listItem.id,\n catalog: blade.catalog,\n title: listItem.name,\n subtitle: 'catalog.blades.category-detail.subtitle',\n controller: 'virtoCommerce.catalogModule.categoryDetailController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/category-detail.tpl.html',\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n $scope.cut = function (data) {\n cutList([data]);\n }\n\n function cutList(selection) {\n $sessionStorage.catalogClipboardContent = selection;\n }\n\n $scope.delete = function (data) {\n deleteList([data]);\n };\n\n function isItemsChecked() {\n return $scope.gridApi && _.any($scope.gridApi.selection.getSelectedRows());\n }\n\n function deleteList(selection) {\n var listEntryLinks = [];\n var categoryIds = [];\n var itemIds = [];\n angular.forEach(selection, function (listItem) {\n var deletingLink = false;\n\n if (listItem.type === 'category') {\n if (blade.catalog && blade.catalog.isVirtual\n && _.some(listItem.links, function (x) {\n return x.categoryId === blade.categoryId\n || !x.categoryId && !blade.categoryId;\n })) {\n deletingLink = true;\n } else {\n categoryIds.push(listItem.id);\n }\n } else {\n if (blade.catalog && blade.catalog.isVirtual) {\n deletingLink = true;\n } else {\n itemIds.push(listItem.id);\n }\n }\n\n if (deletingLink)\n listEntryLinks.push({\n listEntryId: listItem.id,\n listEntryType: listItem.type,\n catalogId: blade.catalogId,\n categoryId: blade.categoryId,\n });\n });\n\n var listCategoryLinkCount = _.where(listEntryLinks, { listEntryType: 'category' }).length;\n let idsToDelete = categoryIds.concat(itemIds);\n var dialog = {\n id: \"confirmDeleteItem\",\n categoryCount: categoryIds.length,\n itemCount: itemIds.length,\n listCategoryLinkCount: listCategoryLinkCount,\n listItemLinkCount: listEntryLinks.length - listCategoryLinkCount,\n callback: function (remove) {\n if (remove) {\n bladeNavigationService.closeChildrenBlades(blade);\n blade.isLoading = true;\n\n if (listEntryLinks.length > 0) {\n listEntries.deletelinks(listEntryLinks, () => {\n blade.refresh();\n\n if (blade.mode === 'mappingSource') {\n blade.parentBlade.refresh();\n }\n }\n );\n }\n\n if (idsToDelete.length > 0) {\n listEntries.delete({ objectIds: idsToDelete }, () => blade.refresh());\n }\n }\n }\n }\n dialogService.showDialog(dialog, 'Modules/$(VirtoCommerce.Catalog)/Scripts/dialogs/deleteCategoryItem-dialog.tpl.html', 'platformWebApp.confirmDialogController');\n }\n\n function mapChecked() {\n bladeNavigationService.closeChildrenBlades(blade);\n\n blade.isLoading = true;\n\n if ($scope.gridApi && $scope.gridApi.selection.getSelectAllState()) {\n listEntries.bulkcreatelinks(\n {\n SearchCriteria: getSearchCriteria(),\n CatalogId: blade.parentBlade.catalogId,\n CategoryId: blade.parentBlade.categoryId\n },\n function () {\n blade.refresh();\n blade.parentBlade.refresh();\n },\n function (error) {\n bladeNavigationService.setError('Error ' + error.status, blade);\n }\n );\n } else {\n var selection = $scope.gridApi.selection.getSelectedRows();\n var listEntryLinks = [];\n angular.forEach(selection, function (listItem) {\n listEntryLinks.push({\n listEntryId: listItem.id,\n listEntryType: listItem.type,\n catalogId: blade.parentBlade.catalogId,\n categoryId: blade.parentBlade.categoryId,\n });\n });\n\n listEntries.createlinks(listEntryLinks, function () {\n blade.refresh();\n blade.parentBlade.refresh();\n },\n function (error) { bladeNavigationService.setError('Error ' + error.status, blade); });\n }\n }\n\n blade.setSelectedItem = function (listItem) {\n $scope.selectedNodeId = listItem.id;\n };\n\n $scope.selectItem = function (e, listItem) {\n blade.setSelectedItem(listItem);\n var newBlade;\n if (listItem.type === 'category') {\n var openNewBlade = e.ctrlKey || filter.keyword;\n newBlade = {\n id: 'itemsList' + (blade.level + (openNewBlade ? 1 : 0)),\n level: blade.level + (openNewBlade ? 1 : 0),\n mode: blade.mode,\n isBrowsingLinkedCategory: blade.isBrowsingLinkedCategory || $scope.hasLinks(listItem),\n breadcrumbs: blade.breadcrumbs,\n title: 'catalog.blades.categories-items-list.title',\n subtitle: 'catalog.blades.categories-items-list.subtitle',\n subtitleValues: listItem.name !== null ? { name: listItem.name } : '',\n catalogId: blade.catalogId || listItem.catalogId,\n categoryId: listItem.id,\n category: listItem,\n catalog: blade.catalog,\n disableOpenAnimation: true,\n controller: 'virtoCommerce.catalogModule.categoriesItemsListController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/categories-items-list.tpl.html'\n };\n\n if (openNewBlade) {\n bladeNavigationService.showBlade(newBlade, blade);\n } else {\n bladeNavigationService.closeBlade(blade, function () {\n bladeNavigationService.showBlade(newBlade, blade.parentBlade);\n });\n }\n } else {\n newBlade = {\n id: \"listItemDetail\" + blade.mode,\n itemId: listItem.id,\n productType: listItem.productType,\n title: listItem.name,\n catalog: blade.catalog,\n controller: 'virtoCommerce.catalogModule.itemDetailController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/item-detail.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n\n // setting current categoryId to be globally available\n bladeNavigationService.catalogsSelectedCategoryId = blade.categoryId;\n }\n };\n\n\n $scope.hasLinks = function (listEntry) {\n return blade.catalog && blade.catalog.isVirtual &&\n _.any(listEntry.links, function (l) {\n return l.catalogId === blade.catalogId && (!blade.categoryId || l.categoryId === blade.categoryId);\n });\n }\n\n blade.toolbarCommands = [\n {\n name: \"platform.commands.refresh\",\n icon: 'fa fa-refresh',\n executeMethod: blade.refresh,\n canExecuteMethod: function () {\n return true;\n }\n },\n {\n name: \"platform.commands.delete\",\n icon: 'fas fa-trash-alt',\n executeMethod: function () { deleteList($scope.gridApi.selection.getSelectedRows()); },\n canExecuteMethod: isItemsChecked,\n permission: 'catalog:delete'\n },\n {\n name: \"platform.commands.import\",\n icon: 'fa fa-download',\n executeMethod: function () {\n var newBlade = {\n id: 'catalogImport',\n title: 'catalog.blades.importers-list.title',\n subtitle: 'catalog.blades.importers-list.subtitle',\n catalog: blade.catalog,\n controller: 'virtoCommerce.catalogModule.importerListController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/import/importers-list.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n },\n canExecuteMethod: function () { return blade.catalogId; },\n permission: 'catalog:import'\n },\n {\n name: \"platform.commands.export\",\n icon: 'fa fa-upload',\n executeMethod: function () {\n var newBlade = {\n id: 'catalogExport',\n title: 'catalog.blades.exporter-list.title',\n subtitle: 'catalog.blades.exporter-list.subtitle',\n catalog: blade.catalog,\n controller: 'virtoCommerce.catalogModule.exporterListController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/export/exporter-list.tpl.html',\n selectedProducts: _.filter($scope.gridApi.selection.getSelectedRows(), function (x) { return x.type === 'product' }),\n selectedCategories: _.filter($scope.gridApi.selection.getSelectedRows(), function (x) { return x.type === 'category' }),\n isAllSelected: $scope.gridApi.selection.getSelectAllState()\n };\n bladeNavigationService.showBlade(newBlade, blade);\n },\n canExecuteMethod: function () { return $scope.items.length && blade.catalogId; },\n permission: 'catalog:export'\n },\n {\n name: \"platform.commands.cut\",\n icon: 'fas fa-cut',\n executeMethod: function () {\n cutList($scope.gridApi.selection.getSelectedRows());\n },\n canExecuteMethod: isItemsChecked,\n permission: 'catalog:create'\n },\n {\n name: \"platform.commands.paste\",\n icon: 'fas fa-paste',\n executeMethod: function () {\n blade.isLoading = true;\n listEntries.move({\n catalog: blade.catalogId,\n category: blade.categoryId,\n listEntries: $sessionStorage.catalogClipboardContent\n }, function () {\n delete $sessionStorage.catalogClipboardContent;\n blade.refresh();\n }, function (error) {\n bladeNavigationService.setError('Error ' + error.status, blade);\n });\n },\n canExecuteMethod: function () {\n return $sessionStorage.catalogClipboardContent && blade.catalog && !blade.catalog.isVirtual;\n },\n permission: 'catalog:create'\n }\n ];\n\n if (blade.isBrowsingLinkedCategory) {\n blade.toolbarCommands.splice(1, 5);\n }\n\n if (angular.isDefined(blade.mode)) {\n // mappingSource\n if (blade.mode === 'mappingSource') {\n var mapCommand = {\n name: \"catalog.commands.map\",\n icon: 'fas fa-link',\n executeMethod: function () {\n mapChecked();\n },\n canExecuteMethod: isItemsChecked\n }\n blade.toolbarCommands.splice(1, 5, mapCommand);\n }\n } else if (!blade.isBrowsingLinkedCategory && authService.checkPermission('catalog:create')) {\n blade.toolbarCommands.splice(1, 0, {\n name: \"platform.commands.add\",\n icon: 'fas fa-plus',\n executeMethod: function () {\n var newBlade = {\n id: 'listItemChild',\n catalog: blade.catalog,\n title: 'catalog.blades.categories-items-add.title',\n subtitle: 'catalog.blades.categories-items-add.subtitle',\n controller: 'virtoCommerce.catalogModule.categoriesItemsAddController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/categories-items-add.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n },\n canExecuteMethod: function () { return blade.catalogId; }\n });\n }\n\n blade.onAfterCatalogSelected = function (selectedNode) {\n var newBlade = {\n id: 'itemsList' + (blade.level + 1),\n level: blade.level + 1,\n mode: 'mappingSource',\n breadcrumbs: [],\n title: 'catalog.blades.categories-items-list.title-mapping',\n subtitle: 'catalog.blades.categories-items-list.subtitle-mapping',\n catalogId: selectedNode.id,\n catalog: selectedNode,\n disableOpenAnimation: true,\n controller: 'virtoCommerce.catalogModule.categoriesItemsListController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/categories-items-list.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n\n // simple and advanced filtering\n var filter = blade.filter = { keyword: blade.filterKeyword };\n\n filter.criteriaChanged = function () {\n $scope.appliedKeyword = filter.keyword;\n filter.appliedKeyword = filter.keyword;\n if (!blade.catalogId && !filter.keyword) {\n $scope.bladeClose();\n } else if ($scope.pageSettings.currentPage > 1) {\n $scope.pageSettings.currentPage = 1;\n } else {\n blade.refresh();\n }\n };\n\n function transformByFilters(data) {\n _.each(data, function (x) {\n x.$path = _.any(x.path) ? x.path.join(\" \\\\ \") : '\\\\';\n });\n }\n\n // ui-grid\n $scope.setGridOptions = function (gridOptions) {\n\n //disable watched\n bladeUtils.initializePagination($scope, true);\n //choose the optimal amount that ensures the appearance of the scroll\n $scope.pageSettings.itemsPerPageCount = 50;\n\n uiGridHelper.initialize($scope, gridOptions, function (gridApi) {\n //update gridApi for current grid\n $scope.gridApi = gridApi;\n\n uiGridHelper.bindRefreshOnSortChanged($scope);\n $scope.gridApi.infiniteScroll.on.needLoadMoreData($scope, showMore);\n });\n };\n\n //No need to call this because page 'pageSettings.currentPage' is watched!!! It would trigger subsequent duplicated req...\n //blade.refresh();\n }]);\n","angular.module('virtoCommerce.catalogModule')\r\n .controller('virtoCommerce.catalogModule.categoryDetailController', ['$scope', 'platformWebApp.bladeNavigationService', 'platformWebApp.settings', 'virtoCommerce.catalogModule.categories', 'virtoCommerce.catalogModule.catalogs', 'platformWebApp.metaFormsService', function ($scope, bladeNavigationService, settings, categories, catalogs, metaFormsService) {\r\n var blade = $scope.blade;\r\n blade.updatePermission = 'catalog:update';\r\n\r\n blade.metaFields = metaFormsService.getMetaFields(\"categoryDetail\");\r\n\r\n blade.refresh = function (parentRefresh) {\r\n return categories.get({ id: blade.currentEntityId }, function (data) {\r\n\r\n if (!blade.catalog) {\r\n blade.catalog = catalogs.get({ id: data.catalogId });\r\n }\r\n\r\n initializeBlade(data);\r\n\r\n if (blade.childrenBlades) {\r\n _.each(blade.childrenBlades, function (x) {\r\n if (x.refresh) {\r\n x.refresh(blade.currentEntity);\r\n }\r\n });\r\n }\r\n\r\n if (parentRefresh) {\r\n blade.parentBlade.refresh();\r\n }\r\n },\r\n function (error) { bladeNavigationService.setError('Error ' + error.status, blade); });\r\n };\r\n\r\n function initializeBlade(data) {\r\n blade.currentEntity = angular.copy(data);\r\n blade.origEntity = data;\r\n blade.title = data.name;\r\n blade.isLoading = false;\r\n blade.securityScopes = data.securityScopes;\r\n };\r\n\r\n blade.codeValidator = function (value) {\r\n var pattern = /[$+;=%{}[\\]|@~!^*&()?'<>,]/;\r\n return !pattern.test(value);\r\n };\r\n\r\n function isDirty() {\r\n return !angular.equals(blade.currentEntity, blade.origEntity) && blade.hasUpdatePermission();\r\n };\r\n\r\n function canSave() {\r\n return isDirty() && blade.formScope && blade.formScope.$valid;\r\n }\r\n\r\n function saveChanges() {\r\n blade.isLoading = true;\r\n categories.update({}, blade.currentEntity, function (data, headers) {\r\n blade.refresh(true);\r\n },\r\n function (error) { bladeNavigationService.setError('Error ' + error.status, blade); });\r\n };\r\n\r\n blade.onClose = function (closeCallback) {\r\n bladeNavigationService.showConfirmationIfNeeded(isDirty(), canSave(), blade, saveChanges, closeCallback, \"catalog.dialogs.category-save.title\", \"catalog.dialogs.category-save.message\");\r\n };\r\n\r\n blade.formScope = null;\r\n $scope.setForm = function (form) { blade.formScope = form; }\r\n\r\n blade.toolbarCommands = [\r\n {\r\n name: \"platform.commands.save\", icon: 'fas fa-save',\r\n executeMethod: saveChanges,\r\n canExecuteMethod: canSave,\r\n permission: blade.updatePermission\r\n },\r\n {\r\n name: \"platform.commands.reset\", icon: 'fa fa-undo',\r\n executeMethod: function () {\r\n angular.copy(blade.origEntity, blade.currentEntity);\r\n },\r\n canExecuteMethod: isDirty,\r\n permission: blade.updatePermission\r\n }\r\n ];\r\n\r\n blade.openDictionarySettingManagement = function () {\r\n var newBlade = {\r\n id: 'settingDetailChild',\r\n isApiSave: true,\r\n currentEntityId: 'VirtoCommerce.Core.General.TaxTypes',\r\n parentRefresh: function (data) { blade.taxTypes = data; },\r\n controller: 'platformWebApp.settingDictionaryController',\r\n template: '$(Platform)/Scripts/app/settings/blades/setting-dictionary.tpl.html'\r\n };\r\n bladeNavigationService.showBlade(newBlade, blade);\r\n };\r\n\r\n blade.refresh();\r\n blade.taxTypes = settings.getValues({ id: 'VirtoCommerce.Core.General.TaxTypes' });\r\n }]);\r\n","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.categoryDescriptionDetailController', ['$scope', 'platformWebApp.bladeNavigationService', 'FileUploader', 'platformWebApp.settings', '$timeout',\n function ($scope, bladeNavigationService, FileUploader, settings, $timeout) {\n var blade = $scope.blade;\n\n function initilize() {\n if (!blade.category.descriptions) {\n blade.category.descriptions = [];\n }\n if (!blade.currentEntity) {\n blade.currentEntity = {\n languageCode: blade.catalog.defaultLanguage.languageCode\n };\n }\n\n blade.origEntity = blade.currentEntity;\n blade.currentEntity = angular.copy(blade.currentEntity);\n\n $timeout(function () {\n $scope.$broadcast('resetContent', { body: blade.currentEntity.content });\n blade.isLoading = false;\n });\n }\n\n $scope.isValid = true;\n\n $scope.saveChanges = function () {\n var existDescription = _.find(blade.category.descriptions, function (x) { return x == blade.origEntity; });\n if (!existDescription) {\n blade.category.descriptions.push(blade.origEntity);\n }\n angular.copy(blade.currentEntity, blade.origEntity);\n $scope.bladeClose();\n };\n\n blade.headIcon = 'fa fa-comments';\n blade.title = 'catalog.blades.categoryDescription-detail.title';\n blade.subtitle = 'catalog.blades.categoryDescription-detail.subtitle';\n blade.editAsMarkdown = true;\n blade.hasAssetCreatePermission = bladeNavigationService.checkPermission('platform:asset:create');\n\n if (blade.hasAssetCreatePermission) {\n $scope.fileUploader = new FileUploader({\n url: 'api/assets?folderUrl=catalog/' + blade.category.code,\n headers: { Accept: 'application/json' },\n autoUpload: true,\n removeAfterUpload: true,\n onBeforeUploadItem: function (fileItem) {\n blade.isLoading = true;\n },\n onSuccessItem: function (fileItem, response) {\n $scope.$broadcast('filesUploaded', { items: response });\n },\n onErrorItem: function (fileItem, response, status) {\n bladeNavigationService.setError(fileItem._file.name + ' failed: ' + (response.message ? response.message : status), blade);\n },\n onCompleteAll: function () {\n blade.isLoading = false;\n }\n });\n }\n\n settings.getValues({ id: 'Catalog.CategoryDescriptionTypes' }, function (data) {\n $scope.types = data;\n if (!blade.currentEntity.descriptionType) {\n blade.currentEntity.descriptionType = $scope.types[0];\n }\n });\n\n $scope.openDictionarySettingManagement = function () {\n var newBlade = {\n id: 'settingDetailChild',\n isApiSave: true,\n currentEntityId: 'Catalog.CategoryDescriptionTypes',\n parentRefresh: function (data) { $scope.types = data; },\n controller: 'platformWebApp.settingDictionaryController',\n template: '$(Platform)/Scripts/app/settings/blades/setting-dictionary.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n var formScope;\n $scope.setForm = function (form) { formScope = form; }\n\n blade.toolbarCommands = [\n {\n name: \"platform.commands.save\", icon: 'fas fa-save',\n executeMethod: saveChanges,\n canExecuteMethod: canSave\n },\n {\n name: \"platform.commands.reset\", icon: 'fa fa-undo',\n executeMethod: function () {\n angular.copy(blade.origEntity, blade.currentEntity);\n $scope.$broadcast('resetContent', { body: blade.currentEntity.content });\n },\n canExecuteMethod: isDirty\n }\n ];\n\n function saveChanges() {\n var existDescription = _.find(blade.category.descriptions, function (x) { return x === blade.origEntity; });\n if (!existDescription) {\n blade.category.descriptions.push(blade.origEntity);\n }\n angular.copy(blade.currentEntity, blade.origEntity);\n }\n\n function isDirty() {\n return !angular.equals(blade.currentEntity, blade.origEntity);\n }\n\n function canSave() {\n return isDirty() && formScope && formScope.$valid;\n }\n\n blade.onClose = function (closeCallback) {\n bladeNavigationService.showConfirmationIfNeeded(isDirty(), canSave(), blade, saveChanges, closeCallback, \"catalog.dialogs.review-save.title\", \"catalog.dialogs.review-save.message\");\n };\n\n initilize();\n }]);\n","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.categoryDescriptionsListController', ['$timeout', '$scope', 'platformWebApp.bladeNavigationService', 'platformWebApp.uiGridHelper', 'platformWebApp.dialogService', function ($timeout, $scope, bladeNavigationService, uiGridHelper, dialogService) {\n var blade = $scope.blade;\n\n $scope.selectedNodeId = null; // need to initialize to null\n blade.isLoading = false;\n blade.refresh = function (category) {\n initialize(category);\n };\n\n function initialize(category) {\n blade.headIcon = 'fa fa-comments';\n blade.category = category;\n blade.title = blade.category.name;\n blade.subtitle = 'catalog.blades.categoryDescriptions-list.subtitle';\n blade.selectNode = $scope.openBlade;\n }\n\n $scope.openBlade = function (node) {\n if (node) {\n $scope.selectedNodeId = node.id;\n }\n var newBlade = {\n id: 'categoryDescription',\n currentEntity: node,\n category: blade.category,\n catalog: blade.catalog,\n languages: blade.catalog.languages,\n controller: 'virtoCommerce.catalogModule.categoryDescriptionDetailController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/categoryDescription-detail.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, $scope.blade);\n } \n \n\n $scope.delete = function (data) {\n deleteList([data]);\n };\n\n function deleteList(selection) {\n var dialog = {\n id: \"confirmDelete\",\n title: \"catalog.dialogs.review-delete.title\",\n message: \"catalog.dialogs.review-delete.message\",\n callback: function (remove) {\n if (remove) {\n bladeNavigationService.closeChildrenBlades(blade, function () {\n _.each(selection, function (x) {\n blade.category.descriptions.splice(blade.category.descriptions.indexOf(x), 1);\n });\n });\n }\n }\n };\n dialogService.showConfirmationDialog(dialog);\n }\n\n blade.toolbarCommands = [\n {\n name: \"platform.commands.add\", icon: 'fas fa-plus',\n executeMethod: function () {\n $scope.openBlade();\n },\n canExecuteMethod: function () {\n return true;\n }\n },\n {\n name: \"platform.commands.delete\", icon: 'fas fa-trash-alt',\n executeMethod: function () { deleteList($scope.gridApi.selection.getSelectedRows()); },\n canExecuteMethod: function () {\n return $scope.gridApi && _.any($scope.gridApi.selection.getSelectedRows());\n }\n }\n\n ];\n\n // ui-grid\n $scope.setGridOptions = function (gridOptions) {\n uiGridHelper.initialize($scope, gridOptions);\n };\n\n // open blade for new description\n if (!_.some(blade.category.descriptions)) {\n $timeout($scope.openBlade, 60, false);\n }\n\n initialize(blade.category);\n}]);\n","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.editorialReviewDetailController', ['$scope', 'platformWebApp.bladeNavigationService', 'FileUploader', 'platformWebApp.settings', '$timeout',\n function ($scope, bladeNavigationService, FileUploader, settings, $timeout) {\n var blade = $scope.blade;\n\n function initilize() {\n if (!blade.item.reviews) {\n blade.item.reviews = [];\n }\n if (!blade.currentEntity) {\n blade.currentEntity = {\n languageCode: blade.catalog.defaultLanguage.languageCode\n };\n }\n\n blade.origEntity = blade.currentEntity;\n blade.currentEntity = angular.copy(blade.currentEntity);\n\n $timeout(function () {\n $scope.$broadcast('resetContent', { body: blade.currentEntity.content });\n blade.isLoading = false;\n });\n }\n\n $scope.isValid = true;\n\n $scope.saveChanges = function () {\n var existReview = _.find(blade.item.reviews, function (x) { return x == blade.origEntity; });\n if (!existReview) {\n blade.item.reviews.push(blade.origEntity);\n };\n angular.copy(blade.currentEntity, blade.origEntity);\n $scope.bladeClose();\n };\n\n blade.headIcon = 'fa fa-comments';\n blade.title = 'catalog.blades.editorialReview-detail.title';\n blade.subtitle = 'catalog.blades.editorialReview-detail.subtitle';\n blade.editAsMarkdown = true;\n blade.hasAssetCreatePermission = bladeNavigationService.checkPermission('platform:asset:create');\n\n if (blade.hasAssetCreatePermission) {\n $scope.fileUploader = new FileUploader({\n url: 'api/assets?folderUrl=catalog/' + blade.item.code,\n headers: { Accept: 'application/json' },\n autoUpload: true,\n removeAfterUpload: true,\n onBeforeUploadItem: function (fileItem) {\n blade.isLoading = true;\n },\n onSuccessItem: function (fileItem, response) {\n $scope.$broadcast('filesUploaded', { items: response });\n },\n onErrorItem: function (fileItem, response, status) {\n bladeNavigationService.setError(fileItem._file.name + ' failed: ' + (response.message ? response.message : status), blade);\n },\n onCompleteAll: function () {\n blade.isLoading = false;\n }\n });\n }\n\n settings.getValues({ id: 'Catalog.EditorialReviewTypes' }, function (data) {\n $scope.types = data;\n if (!blade.currentEntity.reviewType) {\n blade.currentEntity.reviewType = $scope.types[0];\n }\n });\n\n $scope.openDictionarySettingManagement = function () {\n var newBlade = {\n id: 'settingDetailChild',\n isApiSave: true,\n currentEntityId: 'Catalog.EditorialReviewTypes',\n parentRefresh: function (data) { $scope.types = data; },\n controller: 'platformWebApp.settingDictionaryController',\n template: '$(Platform)/Scripts/app/settings/blades/setting-dictionary.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n var formScope;\n $scope.setForm = function (form) { formScope = form; }\n\n blade.toolbarCommands = [\n {\n name: \"platform.commands.save\", icon: 'fas fa-save',\n executeMethod: saveChanges,\n canExecuteMethod: canSave\n },\n {\n name: \"platform.commands.reset\", icon: 'fa fa-undo',\n executeMethod: function () {\n angular.copy(blade.origEntity, blade.currentEntity);\n $scope.$broadcast('resetContent', { body: blade.currentEntity.content });\n },\n canExecuteMethod: isDirty\n }\n ];\n\n function saveChanges() {\n var existReview = _.find(blade.item.reviews, function (x) { return x === blade.origEntity; });\n if (!existReview) {\n blade.item.reviews.push(blade.origEntity);\n };\n\n angular.copy(blade.currentEntity, blade.origEntity);\n }\n\n function isDirty() {\n return !angular.equals(blade.currentEntity, blade.origEntity);\n };\n\n function canSave() {\n return isDirty() && formScope && formScope.$valid;\n }\n\n blade.onClose = function (closeCallback) {\n bladeNavigationService.showConfirmationIfNeeded(isDirty(), canSave(), blade, saveChanges, closeCallback, \"catalog.dialogs.review-save.title\", \"catalog.dialogs.review-save.message\");\n };\n\n initilize();\n }]);\n","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.editorialReviewsListController', ['$timeout', '$scope', 'platformWebApp.bladeNavigationService', 'platformWebApp.uiGridHelper', 'platformWebApp.dialogService', function ($timeout, $scope, bladeNavigationService, uiGridHelper, dialogService) {\n var blade = $scope.blade;\n\n $scope.selectedNodeId = null; // need to initialize to null\n blade.isLoading = false;\n blade.refresh = function (item) {\n initialize(item); \t\n };\n\n function initialize(item) {\n blade.headIcon = 'fa fa-comments';\n blade.item = item;\n blade.title = blade.item.name;\n blade.subtitle = 'catalog.blades.editorialReviews-list.subtitle';\n blade.selectNode = $scope.openBlade;\n };\n\n $scope.openBlade = function (node) {\n if (node) {\n $scope.selectedNodeId = node.id;\n }\n var newBlade = {\n id: 'editorialReview',\n currentEntity: node,\n item: blade.item,\n catalog: blade.catalog,\n languages: blade.catalog.languages,\n controller: 'virtoCommerce.catalogModule.editorialReviewDetailController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/editorialReview-detail.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, $scope.blade);\n } \n \n\n $scope.delete = function (data) {\n deleteList([data]);\n };\n\n function deleteList(selection) {\n var dialog = {\n id: \"confirmDelete\",\n title: \"catalog.dialogs.review-delete.title\",\n message: \"catalog.dialogs.review-delete.message\",\n callback: function (remove) {\n if (remove) {\n bladeNavigationService.closeChildrenBlades(blade, function () {\n _.each(selection, function (x) {\n blade.item.reviews.splice(blade.item.reviews.indexOf(x), 1);\n });\n });\n }\n }\n };\n dialogService.showConfirmationDialog(dialog);\n }\n\n blade.toolbarCommands = [\n {\n name: \"platform.commands.add\", icon: 'fas fa-plus',\n executeMethod: function () {\n $scope.openBlade();\n },\n canExecuteMethod: function () {\n return true;\n }\n },\n {\n name: \"platform.commands.delete\", icon: 'fas fa-trash-alt',\n executeMethod: function () { deleteList($scope.gridApi.selection.getSelectedRows()); },\n canExecuteMethod: function () {\n return $scope.gridApi && _.any($scope.gridApi.selection.getSelectedRows());\n }\n }\n\n ];\n\n // ui-grid\n $scope.setGridOptions = function (gridOptions) {\n uiGridHelper.initialize($scope, gridOptions);\n };\n\n // open blade for new review \n if (!_.some(blade.item.reviews)) {\n $timeout($scope.openBlade, 60, false);\n }\n\n initialize(blade.item);\n}]);\n","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.filterDetailController', ['$scope', '$localStorage', '$translate',\n function ($scope, $localStorage, $translate) {\n var blade = $scope.blade;\n\n $scope.saveChanges = function () {\n blade.currentEntity.lastUpdateTime = new Date().getTime();\n angular.copy(blade.currentEntity, blade.origEntity);\n if (blade.isNew) {\n $localStorage.catalogSearchFilters.splice(0, 0, blade.origEntity);\n $localStorage.catalogSearchFilterId = blade.origEntity.id;\n blade.parentBlade.filter.current = blade.origEntity;\n blade.isNew = false;\n }\n\n initializeBlade(blade.origEntity);\n blade.parentBlade.filter.change(true);\n };\n\n function initializeBlade(data) {\n blade.currentEntity = angular.copy(data);\n blade.origEntity = data;\n blade.isLoading = false;\n\n blade.title = blade.isNew ? 'catalog.blades.filter-detail.new-title' : data.name;\n blade.subtitle = blade.isNew ? 'catalog.blades.filter-detail.new-subtitle' : 'catalog.blades.filter-detail.subtitle';\n }\n\n var formScope;\n $scope.setForm = function (form) { formScope = form; };\n\n function isDirty() {\n return !angular.equals(blade.currentEntity, blade.origEntity);\n }\n\n blade.headIcon = 'fa fa-filter';\n\n blade.toolbarCommands = [\n {\n name: \"core.commands.apply-filter\", icon: 'fa fa-filter',\n executeMethod: function () {\n $scope.saveChanges();\n },\n canExecuteMethod: function () {\n return formScope && formScope.$valid;\n }\n },\n {\n name: \"platform.commands.reset\", icon: 'fa fa-undo',\n executeMethod: function () {\n angular.copy(blade.origEntity, blade.currentEntity);\n },\n canExecuteMethod: isDirty\n },\n {\n name: \"platform.commands.delete\", icon: 'fas fa-trash-alt',\n executeMethod: deleteEntry,\n canExecuteMethod: function () {\n return !blade.isNew;\n }\n }];\n\n\n function deleteEntry() {\n blade.parentBlade.filter.current = null;\n $localStorage.catalogSearchFilters.splice($localStorage.catalogSearchFilters.indexOf(blade.origEntity), 1);\n delete $localStorage.catalogSearchFilterId;\n blade.parentBlade.filter.change();\n }\n\n // actions on load \n if (blade.isNew) {\n $translate('catalog.blades.categories-items-list.labels.unnamed-filter').then(function (result) {\n initializeBlade({ id: new Date().getTime(), name: result });\n });\n } else {\n initializeBlade(blade.data);\n }\n }]);\n","angular.module('virtoCommerce.catalogBulkActionsModule')\n .controller('virtoCommerce.catalogBulkActionsModule.helloWorldController', ['$scope', 'virtoCommerce.catalogBulkActionsModule.webApi', function ($scope, api) {\n var blade = $scope.blade;\n blade.title = 'VirtoCommerce.CatalogBulkActionsModule';\n\n blade.refresh = function () {\n api.get(function (data) {\n blade.title = 'virtoCommerce.catalogBulkActionsModule.blades.hello-world.title';\n blade.data = data.result;\n blade.isLoading = false;\n });\n };\n\n blade.refresh();\n }]);\n","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.imageDetailsController',\n ['$scope', '$filter', '$translate', 'platformWebApp.bladeNavigationService', 'platformWebApp.assets.api', 'platformWebApp.settings',\n function ($scope, $filter, $translate, bladeNavigationService, assets, settings) {\n var blade = $scope.blade;\n\n blade.currentEntity = angular.copy(blade.origEntity);\n blade.title = blade.currentEntity.name;\n\n blade.isLoading = false;\n $scope.isValid = true;\n\n var promise = settings.getValues({ id: 'VirtoCommerce.Core.General.Languages' }).$promise;\n $scope.languages = [];\n\n function initialize() {\n promise.then(function(promiseData) {\n $scope.languages = promiseData;\n });\n $scope.imageTypes = settings.getValues({ id: 'Catalog.ImageCategories' });\n };\n\n var formScope;\n $scope.setForm = function(form) {\n formScope = form;\n }\n\n $scope.$watch(\"blade.currentEntity\", function (newValue, oldValue) {\n if (newValue !== oldValue) {\n $scope.isValid = formScope && formScope.$valid;\n }\n }, true);\n\n $scope.openDictionarySettingManagement = function () {\n var newBlade = {\n id: 'settingDetailChild',\n isApiSave: true,\n currentEntityId: 'Catalog.ImageCategories',\n parentRefresh: function (data) { $scope.imageTypes = data; },\n controller: 'platformWebApp.settingDictionaryController',\n template: '$(Platform)/Scripts/app/settings/blades/setting-dictionary.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n $scope.saveChanges = function () {\n angular.copy(blade.currentEntity, blade.origEntity);\n $scope.bladeClose();\n }\n\n initialize();\n }]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.imagesAddController',\n ['$scope', '$filter', '$translate', 'FileUploader', 'platformWebApp.dialogService',\n 'platformWebApp.bladeNavigationService', 'platformWebApp.authService',\n 'platformWebApp.assets.api', 'platformWebApp.settings',\n function ($scope, $filter, $translate, FileUploader, dialogService, bladeNavigationService, authService, assets, settings) {\n var blade = $scope.blade;\n\n blade.hasAssetCreatePermission = bladeNavigationService.checkPermission('platform:asset:create');\n\n blade.headIcon = 'fa fa-image';\n\n $scope.isValid = true;\n\n blade.isLoading = false;\n\n blade.useExternalUrl = false;\n\n blade.refresh = function (item) {\n initialize(item);\n }\n\n var promise = settings.getValues({ id: 'VirtoCommerce.Core.General.Languages' }).$promise;\n\n $scope.languages = [];\n function initialize(item) {\n promise.then(function (promiseData) {\n $scope.languages = promiseData;\n });\n\n blade.item = item;\n blade.title = 'catalog.blades.image-upload.title';\n $scope.imageTypes = settings.getValues({ id: 'Catalog.ImageCategories' });\n\n if (!$scope.uploader && blade.hasAssetCreatePermission) {\n\n // create the uploader \n var uploader = $scope.uploader = new FileUploader({\n scope: $scope,\n headers: { Accept: 'application/json' },\n autoUpload: true,\n removeAfterUpload: true\n });\n\n uploader.url = getImageUrl(blade.folderPath, blade.imageType).relative;\n\n uploader.onSuccessItem = function (fileItem, images, status, headers) {\n angular.forEach(images, function (image) {\n //ADD uploaded image\n image.isImage = true;\n image.group = blade.imageType;\n blade.currentEntities.push(image);\n });\n };\n\n uploader.onAfterAddingAll = function (addedItems) {\n bladeNavigationService.setError(null, blade);\n };\n\n uploader.onErrorItem = function (element, response, status, headers) {\n bladeNavigationService.setError(element._file.name + ' failed: ' + (response.message ? response.message : status), blade);\n };\n }\n blade.currentEntities = [];\n }\n\n $scope.addImageFromUrlHandler = function () {\n if (blade.useExternalUrl) {\n $scope.addImageDirectlyFromUrl();\n } else {\n $scope.addImageFromUrl();\n }\n };\n\n $scope.addImageFromUrl = function () {\n if (blade.newExternalImageUrl) {\n assets.uploadFromUrl({ folderUrl: getImageUrl(blade.folderPath, blade.imageType).folderUrl, url: blade.newExternalImageUrl }, function (data) {\n _.each(data, function (x) {\n x.isImage = true;\n x.group = blade.imageType;\n blade.currentEntities.push(x);\n });\n blade.newExternalImageUrl = undefined;\n });\n }\n };\n\n $scope.addImageDirectlyFromUrl = function () {\n if (blade.newExternalImageUrl) {\n var image = {\n isImage: true,\n group: blade.imageType,\n url: blade.newExternalImageUrl,\n name: blade.newExternalImageUrl.split('/').pop(),\n relativeUrl: blade.newExternalImageUrl\n };\n blade.currentEntities.push(image);\n blade.newExternalImageUrl = undefined;\n }\n };\n\n $scope.saveChanges = function () {\n if (blade.onSelect) {\n _.each(blade.currentEntities, function (entity) {\n entity.languageCode = blade.selectedLanguageCode;\n });\n blade.onSelect(blade.currentEntities);\n }\n\n $scope.bladeClose();\n };\n\n $scope.toggleImageSelect = function (e, image) {\n if (e.ctrlKey == 1) {\n image.$selected = !image.$selected;\n } else {\n if (image.$selected) {\n image.$selected = false;\n } else {\n image.$selected = true;\n }\n }\n }\n\n $scope.copyUrl = function (data) {\n $translate('catalog.blades.images.labels.copy-url-prompt').then(function (promptMessage) {\n window.prompt(promptMessage, data.url);\n });\n }\n\n $scope.openDictionarySettingManagement = function () {\n var newBlade = {\n id: 'settingDetailChild',\n isApiSave: true,\n currentEntityId: 'Catalog.ImageCategories',\n parentRefresh: function (data) { $scope.imageTypes = data; },\n controller: 'platformWebApp.settingDictionaryController',\n template: '$(Platform)/Scripts/app/settings/blades/setting-dictionary.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n $scope.changeImageCategory = function ($item, $model) {\n $scope.uploader.url = getImageUrl(blade.folderPath, blade.imageType).relative;\n };\n\n function getImageUrl(path, imageType) {\n\n var folderUrl = 'catalog/' + (path + (imageType ? '/' + imageType : ''));\n\n return { folderUrl: folderUrl, relative: 'api/assets?folderUrl=' + folderUrl };\n }\n\n initialize(blade.item);\n\n }]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.imagesController',\n [\n '$scope', '$translate', 'platformWebApp.dialogService',\n 'platformWebApp.bladeNavigationService', 'platformWebApp.authService',\n 'platformWebApp.settings', 'platformWebApp.bladeUtils', 'platformWebApp.uiGridHelper', '$timeout',\n function($scope, $translate, dialogService, bladeNavigationService, authService, settings, bladeUtils, uiGridHelper, $timeout) {\n var blade = $scope.blade;\n blade.headIcon = 'fa fa-image';\n var languages = blade.parentBlade.catalog.languages;\n\n blade.hasAssetCreatePermission = bladeNavigationService.checkPermission('platform:asset:create');\n\n blade.isLoading = false;\n\n blade.refresh = function(item) {\n initialize(item);\n };\n\n blade.isCopyIdMenuVisible = false;\n settings.getValues({ id: 'Catalog.AllowToCopyID' }, function (data) {\n if (data && data.length > 0) {\n blade.isCopyIdMenuVisible = data[0];\n }\n });\n\n function initialize(item) {\n blade.item = item;\n blade.title = item.name;\n blade.subtitle = 'catalog.widgets.itemImage.blade-subtitle';\n $scope.imageTypes = settings.getValues({ id: 'Catalog.ImageCategories' });\n\n blade.currentEntities = item.images ? angular.copy(item.images) : [];\n }\n\n $scope.saveChanges = function() {\n blade.item.images = blade.currentEntities;\n $scope.bladeClose();\n };\n\n $scope.toggleImageSelect = function(e, image) {\n if (e.ctrlKey === 1) {\n image.$selected = !image.$selected;\n } else {\n if (image.$selected) {\n image.$selected = false;\n } else {\n image.$selected = true;\n }\n }\n };\n\n $scope.removeItem = function(image) {\n var idx = blade.currentEntities.indexOf(image);\n if (idx >= 0) {\n blade.currentEntities.splice(idx, 1);\n }\n };\n\n $scope.copyItemID = function (data) {\n navigator.clipboard.writeText(data.id).then().catch(e => console.error(e));\n };\n\n $scope.copyUrl = function(data) {\n $translate('catalog.blades.images.labels.copy-url-prompt')\n .then(function(promptMessage) {\n window.prompt(promptMessage, data.url);\n });\n };\n\n $scope.downloadUrl = function(image) {\n window.open(image.url, '_blank');\n };\n\n $scope.removeAction = function(selectedImages) {\n if (selectedImages === undefined) {\n selectedImages = $scope.gridApi.selection.getSelectedRows();\n }\n\n angular.forEach(selectedImages,\n function(image) {\n var idx = blade.currentEntities.indexOf(image);\n if (idx >= 0) {\n blade.currentEntities.splice(idx, 1);\n }\n });\n };\n\n $scope.edit = function(entity) {\n var newBlade = {\n id: 'imageDetailChild',\n origEntity: entity,\n controller: 'virtoCommerce.catalogModule.imageDetailsController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/image-detail.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n blade.toolbarCommands = [\n {\n name: 'platform.commands.remove',\n icon: 'fas fa-trash-alt',\n executeMethod: function() { $scope.removeAction(); },\n canExecuteMethod: function() {\n var retVal = false;\n if (blade.currentEntities && $scope.gridApi) {\n retVal = $scope.gridApi.selection.getSelectedRows()\n .length >\n 0;\n }\n return retVal;\n }\n },\n {\n name: 'catalog.commands.gallery',\n icon: 'fas fa-image',\n executeMethod: function() {\n var dialog = {\n images: blade.currentEntities,\n currentImage: blade.currentEntities[0]\n };\n dialogService.showGalleryDialog(dialog);\n },\n canExecuteMethod: function() {\n return blade.currentEntities && _.any(blade.currentEntities);\n }\n },\n {\n name: \"Add\",\n icon: 'fas fa-plus',\n executeMethod: function() {\n var newBlade = {\n languages: languages,\n item: blade.item,\n folderPath: blade.folderPath,\n onSelect: linkAssets,\n controller: 'virtoCommerce.catalogModule.imagesAddController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/images-add.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n },\n canExecuteMethod: function() { return true; }\n },\n {\n name: \"Link\",\n icon: 'fas fa-link',\n executeMethod: function() {\n var newBlade = {\n title: 'catalog.blades.images-select.title',\n //folder: \"catalog\",\n onSelect: linkAssets,\n controller: 'virtoCommerce.assetsModule.assetSelectController'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n },\n canExecuteMethod: function() { return authService.checkPermission('platform:asset:read'); }\n }\n ];\n\n function linkAssets(assets) {\n var max = 0;\n if (blade.currentEntities.length) {\n var maxEntity = _.max(blade.currentEntities, function(entity) { return entity.sortOrder; });\n max = maxEntity.sortOrder;\n }\n _.each(assets,\n function(asset) {\n if (asset.isImage) {\n max++;\n var image = angular.copy(asset);\n image.sortOrder = max;\n if (!image.group) {\n image.group = \"images\";\n }\n\n blade.currentEntities.push(image);\n }\n },\n max);\n }\n\n $scope.openDictionarySettingManagement = function() {\n var newBlade = {\n id: 'settingDetailChild',\n isApiSave: true,\n currentEntityId: 'Catalog.ImageCategories',\n parentRefresh: function(data) { $scope.imageTypes = data; },\n controller: 'platformWebApp.settingDictionaryController',\n template: '$(Platform)/Scripts/app/settings/blades/setting-dictionary.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n function getEntityGridIndex(searchEntity, gridApi) {\n var index = -1;\n if (gridApi) {\n _.each(gridApi.grid.renderContainers.body.visibleRowCache,\n function(row, idx) {\n if (_.isEqual(row.entity, searchEntity)) {\n index = idx;\n return;\n }\n });\n }\n return index;\n }\n\n var priorityChanged = function(data) {\n var newIndex = getEntityGridIndex(data.rowEntity, data.gridApi);\n if (newIndex !== data.index) {\n data.gridApi.cellNav.scrollToFocus(data.rowEntity, data.colDef);\n }\n };\n blade.selectedImages = [];\n $scope.setGridOptions = function(gridOptions) {\n gridOptions.enableCellEditOnFocus = false;\n uiGridHelper.initialize($scope,\n gridOptions,\n function(gridApi) {\n gridApi.edit.on.afterCellEdit($scope,\n function(rowEntity, colDef) {\n var index = getEntityGridIndex(rowEntity, gridApi);\n var data = {\n rowEntity: rowEntity,\n colDef: colDef,\n index: index,\n gridApi: gridApi\n };\n $timeout(priorityChanged, 100, true, data);\n });\n });\n };\n\n $scope.priorityValid = function(entity) {\n return !_.isUndefined(entity.sortOrder) && entity.sortOrder >= 0;\n };\n\n $scope.isValid = true;\n\n $scope.$watch(\"blade.currentEntities\",\n function(data) {\n var result = _.all(blade.currentEntities, $scope.priorityValid);\n return $scope.isValid = result;\n },\n true);\n\n bladeUtils.initializePagination($scope, true);\n\n initialize(blade.item);\n\n }\n ])\n .run(\n [\n 'platformWebApp.ui-grid.extension', 'uiGridValidateService', function(gridOptionExtension, uiGridValidateService) {\n uiGridValidateService.setValidator('minPriorityValidator',\n function() {\n return function(oldValue, newValue, rowEntity, colDef) {\n return newValue >= 0;\n };\n },\n function() { return 'Priority value should be equal or more than zero'; });\n }\n ]);\n","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.itemAssetAddController', ['$scope', '$translate', 'platformWebApp.bladeNavigationService', '$filter', 'FileUploader', function ($scope, $translate, bladeNavigationService, $filter, FileUploader) {\n var blade = $scope.blade;\n\n blade.isLoading = false; \n\n blade.refresh = function (item) {\n \tinitialize(item);\n }\n\n $scope.isValid = true;\n\n $scope.saveChanges = function () {\n if(blade.onSelect)\n blade.onSelect(blade.currentEntities);\n\n \t$scope.bladeClose();\n };\n\n function initialize(item) {\n \tblade.item = item;\n if (!$scope.uploader && blade.hasUpdatePermission()) {\n // create the uploader\n var uploader = $scope.uploader = new FileUploader({\n scope: $scope,\n headers: { Accept: 'application/json' },\n method: 'POST',\n autoUpload: true,\n removeAfterUpload: true\n });\n\n \tuploader.url = 'api/assets?folderUrl=catalog/' + item.code;\n\n uploader.onSuccessItem = function (fileItem, assets, status, headers) {\n angular.forEach(assets, function (asset) { \n asset.itemId = blade.item.id;\n if (fileItem.file) {\n asset.size = fileItem.file.size;\n } \n //ADD uploaded asset to the item\n blade.currentEntities.push(asset);\n });\n };\n\n uploader.onAfterAddingAll = function (addedItems) {\n bladeNavigationService.setError(null, blade);\n };\n\n uploader.onErrorItem = function (item, response, status, headers) {\n bladeNavigationService.setError(item._file.name + ' failed: ' + (response.message ? response.message : status), blade);\n };\n }\n blade.currentEntities = [];\n };\n\n $scope.toggleAssetSelect = function (e, asset) {\n if (e.ctrlKey == 1) {\n asset.selected = !asset.selected;\n } else {\n if (asset.selected) {\n asset.selected = false;\n } else {\n asset.selected = true;\n }\n }\n }\n\n $scope.removeAction = function (asset) {\n \tvar idx = blade.currentEntities.indexOf(asset);\n if (idx >= 0) {\n \tblade.currentEntities.splice(idx, 1);\n }\n };\n\n $scope.copyUrl = function (data) {\n $translate('catalog.blades.item-asset-detail.labels.copy-url-prompt').then(function (promptMessage) {\n window.prompt(promptMessage, data.url);\n });\n }\n\n blade.headIcon = 'fa fa-plus';\n blade.toolbarCommands = [];\n\n initialize(blade.item);\n\n}]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.itemAssetsDetailController',\n ['$scope', '$filter', '$translate', 'platformWebApp.bladeNavigationService', 'platformWebApp.assets.api', 'platformWebApp.settings', 'virtoCommerce.catalogModule.catalogs',\n function ($scope, $filter, $translate, bladeNavigationService, assets, settings, catalogs) {\n var blade = $scope.blade;\n\n blade.currentEntity = angular.copy(blade.origEntity);\n blade.title = blade.currentEntity.name;\n\n blade.isLoading = false;\n $scope.isValid = true;\n\n $scope.languages = [];\n\n function initialize() {\n catalogs.get({ id: blade.currentEntity.catalogId }, function (catalog) {\n $scope.languages = _.pluck(catalog.languages, 'languageCode');\n });\n $scope.imageTypes = settings.getValues({ id: 'Catalog.ImageCategories' });\n };\n\n var formScope;\n $scope.setForm = function(form) {\n formScope = form;\n }\n\n $scope.$watch(\"blade.currentEntity\", function (newValue, oldValue) {\n if (newValue !== oldValue) {\n $scope.isValid = formScope && formScope.$valid;\n }\n }, true);\n\n $scope.openDictionarySettingManagement = function () {\n var newBlade = {\n id: 'settingDetailChild',\n isApiSave: true,\n currentEntityId: 'Catalog.ImageCategories',\n parentRefresh: function (data) { $scope.imageTypes = data; },\n controller: 'platformWebApp.settingDictionaryController',\n template: '$(Platform)/Scripts/app/settings/blades/setting-dictionary.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n $scope.saveChanges = function () {\n angular.copy(blade.currentEntity, blade.origEntity);\n $scope.bladeClose();\n }\n\n initialize();\n }]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.itemAssetController', ['$scope', '$translate', 'platformWebApp.bladeNavigationService', '$filter', 'platformWebApp.uiGridHelper', '$timeout', 'platformWebApp.settings', function ($scope, $translate, bladeNavigationService, $filter, uiGridHelper, $timeout, settings) {\n var blade = $scope.blade;\n blade.headIcon = 'fa fa-chain';\n\n blade.isCopyIdMenuVisible = false;\n settings.getValues({ id: 'Catalog.AllowToCopyID' }, function (data) {\n if (data && data.length > 0) {\n blade.isCopyIdMenuVisible = data[0];\n }\n });\n\n blade.toolbarCommands = [\n {\n name: 'platform.commands.remove',\n icon: 'fas fa-trash-alt',\n executeMethod: function () { $scope.removeAction(); },\n canExecuteMethod: function () {\n var retVal = false;\n if (blade.currentEntities && $scope.gridApi) {\n retVal = $scope.gridApi.selection.getSelectedRows().length > 0;\n }\n return retVal;\n }\n },\n {\n name: \"Add\",\n icon: 'fas fa-plus',\n executeMethod: function () {\n var newBlade = {\n title: \"catalog.blades.asset-upload.title\",\n item: blade.item,\n onSelect: linkAssets,\n controller: 'virtoCommerce.catalogModule.itemAssetAddController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/item-asset-add.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n },\n canExecuteMethod: function () { return true; }\n },\n {\n name: \"Link\",\n icon: 'fas fa-link',\n executeMethod: function () {\n var newBlade = {\n title: 'catalog.blades.asset-select.title',\n //folder: \"catalog\",\n onSelect: linkAssets,\n controller: 'virtoCommerce.assetsModule.assetSelectController'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n },\n canExecuteMethod: function () { return true; }\n }];\n\n function linkAssets(assets) {\n _.each(assets, function (asset) {\n var converted = angular.copy(asset);\n converted.mimeType = asset.contentType;\n blade.currentEntities.push(converted);\n });\n }\n\n blade.isLoading = false;\n\n blade.refresh = function (item) {\n initialize(item);\n }\n\n $scope.isValid = true;\n\n $scope.copyItemID = function (data) {\n navigator.clipboard.writeText(data.id).then().catch(e => console.error(e));\n };\n\n $scope.saveChanges = function () {\n blade.item.assets = blade.currentEntities;\n $scope.bladeClose();\n };\n\n function initialize(item) {\n blade.item = item;\n\n blade.title = item.name;\n blade.subtitle = 'catalog.widgets.itemAsset.blade-subtitle';\n\n blade.currentEntities = item.assets ? angular.copy(item.assets) : [];\n }\n\n $scope.toggleAssetSelect = function (e, asset) {\n if (e.ctrlKey === 1) {\n asset.selected = !asset.selected;\n } else {\n if (asset.selected) {\n asset.selected = false;\n } else {\n asset.selected = true;\n }\n }\n }\n\n $scope.removeAction = function (asset) {\n var idx = blade.currentEntities.indexOf(asset);\n if (idx >= 0) {\n blade.currentEntities.splice(idx, 1);\n }\n };\n\n $scope.copyUrl = function (data) {\n $translate('catalog.blades.item-asset-list.labels.copy-url-prompt').then(function (promptMessage) {\n window.prompt(promptMessage, data.url);\n });\n }\n\n\n function getEntityGridIndex(searchEntity, gridApi) {\n var index = -1;\n if (gridApi) {\n _.each(gridApi.grid.renderContainers.body.visibleRowCache, (row, idx) => {\n if (_.isEqual(row.entity, searchEntity)) {\n index = idx;\n return;\n }\n });\n }\n return index;\n }\n\n var priorityChanged = function(data) {\n var newIndex = getEntityGridIndex(data.rowEntity, data.gridApi);\n if (newIndex !== data.index) {\n data.gridApi.cellNav.scrollToFocus(data.rowEntity, data.colDef);\n }\n };\n\n $scope.edit = function (entity) {\n if (!entity.catalogId) entity.catalogId = blade.item.catalogId;\n var newBlade = {\n id: 'itemDetailChild',\n origEntity: entity,\n controller: 'virtoCommerce.catalogModule.itemAssetsDetailController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/item-asset-detail.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n $scope.setGridOptions = function (gridOptions) {\n gridOptions.enableCellEditOnFocus = false;\n uiGridHelper.initialize($scope, gridOptions,\n function (gridApi) {\n gridApi.edit.on.afterCellEdit($scope, function (rowEntity, colDef) {\n var index = getEntityGridIndex(rowEntity, gridApi);\n var data = {\n rowEntity: rowEntity,\n colDef: colDef,\n index: index,\n gridApi: gridApi\n };\n $timeout(priorityChanged, 100, true, data);\n });\n });\n };\n\n\n $scope.removeItem = function (image) {\n var idx = blade.currentEntities.indexOf(image);\n if (idx >= 0) {\n blade.currentEntities.splice(idx, 1);\n }\n };\n\n\n $scope.downloadUrl = function (image) {\n window.open(image.url, '_blank');\n }\n\n $scope.removeAction = function (selectedImages) {\n if (selectedImages == undefined) {\n selectedImages = $scope.gridApi.selection.getSelectedRows();\n }\n\n angular.forEach(selectedImages, function (image) {\n var idx = blade.currentEntities.indexOf(image);\n if (idx >= 0) {\n blade.currentEntities.splice(idx, 1);\n }\n });\n };\n\n initialize(blade.item);\n\n }]).run(\n ['platformWebApp.ui-grid.extension', 'uiGridValidateService', function (gridOptionExtension, uiGridValidateService) {\n uiGridValidateService.setValidator('minPriorityValidator',\n () => (oldValue, newValue) => newValue >= 0,\n () => 'Priority value should be equal or more than zero');\n }]);\n","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.itemAssociationDetailController', ['$scope', 'platformWebApp.dialogService', 'platformWebApp.bladeNavigationService', 'platformWebApp.settings',\n function ($scope, dialogService, bladeNavigationService, settings) {\n var blade = $scope.blade;\n\n $scope.isValid = false;\n\n $scope.$watch(\"blade.currentEntity\", function () {\n $scope.isValid = $scope.formScope && $scope.formScope.$valid;\n }, true);\n\n function initialize(item) {\n $scope.associationGroups = settings.getValues({ id: 'Catalog.AssociationGroups' }, function (data) {\n if (data && data.length > 0) {\n blade.groupName = data[0];\n }\n });\n\n blade.currentEntity = angular.copy(item);\n blade.isLoading = false;\n };\n\n blade.toolbarCommands = [\n {\n name: \"catalog.commands.open-item\",\n icon: 'fa fa-edit',\n executeMethod: function () { openCurrentItem(); },\n canExecuteMethod: function () { return true; }\n }\n ];\n\n function openCurrentItem() {\n var newBlade = {\n id: 'associationDetail',\n itemId: blade.currentEntity.associatedObjectId,\n catalog: blade.catalog,\n currentEntityId: blade.currentEntity.associatedObjectId\n };\n if (blade.currentEntity.associatedObjectType === 'product') {\n newBlade.controller = 'virtoCommerce.catalogModule.itemDetailController';\n newBlade.template = 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/item-detail.tpl.html';\n }\n else if (blade.currentEntity.associatedObjectType === 'category') {\n newBlade.controller = 'virtoCommerce.catalogModule.categoryDetailController';\n newBlade.template = 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/category-detail.tpl.html';\n }\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n $scope.openDictionarySettingManagement = function () {\n var newBlade = {\n id: 'settingDetailChild',\n isApiSave: true,\n currentEntityId: 'Catalog.AssociationGroups',\n parentRefresh: function (data) { $scope.associationGroups = data; },\n controller: 'platformWebApp.settingDictionaryController',\n template: '$(Platform)/Scripts/app/settings/blades/setting-dictionary.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n $scope.setForm = function (form) { $scope.formScope = form; };\n\n $scope.saveChanges = function () {\n angular.copy(blade.currentEntity, blade.origEntity);\n if (_.any(blade.currentEntity.tags)) {\n blade.origEntity.tags = _.map(blade.currentEntity.tags, function (x) {\n return x.value;\n });\n }\n $scope.bladeClose();\n };\n\n initialize(blade.origEntity);\n }]);","angular.module('virtoCommerce.catalogModule')\r\n .controller('virtoCommerce.catalogModule.itemAssociationsListController', ['$scope', 'platformWebApp.bladeNavigationService', 'uiGridConstants', 'platformWebApp.uiGridHelper', 'virtoCommerce.catalogModule.catalogs', 'virtoCommerce.catalogModule.items', 'virtoCommerce.catalogModule.categories', function ($scope, bladeNavigationService, uiGridConstants, uiGridHelper, catalogs, items, categories) {\r\n $scope.uiGridConstants = uiGridConstants;\r\n var allCatalogIds = [];\r\n var blade = $scope.blade;\r\n blade.subtitle = 'catalog.widgets.itemAssociations.blade-subtitle';\r\n\r\n blade.isLoading = false;\r\n blade.refresh = function (item) {\r\n initialize(item);\r\n };\r\n\r\n function initialize(item) {\r\n blade.title = item.name;\r\n blade.item = item;\r\n populateProductCatalogs(item.associations);\r\n }\r\n\r\n function populateProductCatalogs(associations) {\r\n if (!_.some(associations)) {\r\n return;\r\n }\r\n\r\n blade.isLoading = true;\r\n\r\n allCatalogIds = [];\r\n processProductsAssociations(associations)\r\n .then(processCategoryAssociations(associations))\r\n .then(findCatalogs);\r\n }\r\n\r\n function processProductsAssociations(associations) {\r\n var productAssociations = _.filter(associations, function (association) { return association.associatedObjectType === 'product' });\r\n var itemIds = _.pluck(productAssociations, 'associatedObjectId');\r\n return items.plenty({ respGroup: 'ItemSmall' }, itemIds, function (data) {\r\n addAssociationProperties(productAssociations, data);\r\n }).$promise;\r\n }\r\n\r\n function processCategoryAssociations(associations) {\r\n var categoryAssociations = _.filter(associations, function (association) { return association.associatedObjectType !== 'product' });\r\n var categoryIds = _.pluck(categoryAssociations, 'associatedObjectId');\r\n return categories.plenty({ respGroup: 'Info' }, categoryIds, function (data) {\r\n addAssociationProperties(categoryAssociations, data);\r\n }).$promise;\r\n }\r\n\r\n function findCatalogs() {\r\n var uniqueCatalogIds = _.uniq(allCatalogIds);\r\n return catalogs.search({\r\n skip: 0,\r\n take: uniqueCatalogIds.length,\r\n catalogIds: uniqueCatalogIds\r\n }, function (data) {\r\n _.each(blade.item.associations, function (association) {\r\n association.$$catalog = _.find(data.results, function (x) { return x.id === association.$$catalogId; });\r\n });\r\n blade.isLoading = false;\r\n }).$promise;\r\n }\r\n\r\n function addAssociationProperties(associations, data) {\r\n _.each(associations, function (x) {\r\n var item = _.find(data, function (d) { return d.id === x.associatedObjectId; });\r\n if (item) {\r\n x.$$catalogId = item.catalogId;\r\n\r\n if (x.associatedObjectType === 'product') {\r\n x.$$productType = item.productType;\r\n }\r\n }\r\n });\r\n allCatalogIds.push.apply(allCatalogIds, _.pluck(associations, '$$catalogId'));\r\n }\r\n\r\n $scope.selectNode = function (listItem) {\r\n $scope.selectedNodeId = listItem.associatedObjectId;\r\n var newBlade = {\r\n id: 'associationDetail',\r\n itemId: listItem.associatedObjectId,\r\n catalog: blade.catalog,\r\n controller: 'virtoCommerce.catalogModule.itemDetailController',\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/item-detail.tpl.html'\r\n };\r\n if (listItem.associatedObjectType === 'category') {\r\n newBlade.currentEntityId = listItem.associatedObjectId;\r\n newBlade.controller = 'virtoCommerce.catalogModule.categoryDetailController';\r\n newBlade.template = 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/category-detail.tpl.html';\r\n }\r\n if (listItem.associatedObjectType === 'product') {\r\n newBlade.productType = listItem.$$productType;\r\n }\r\n\r\n bladeNavigationService.showBlade(newBlade, blade);\r\n };\r\n\r\n $scope.deleteList = function (list) {\r\n bladeNavigationService.closeChildrenBlades(blade,\r\n function () {\r\n var undeletedEntries = _.difference(blade.item.associations, list);\r\n blade.item.associations = undeletedEntries;\r\n });\r\n };\r\n\r\n $scope.edit = function (listItem) {\r\n var newBlade = {\r\n id: 'associationEditDetail',\r\n title: listItem.associatedObjectName,\r\n subtitle: 'catalog.blades.item-association-detail.subtitle',\r\n origEntity: listItem,\r\n catalog: blade.catalog,\r\n controller: 'virtoCommerce.catalogModule.itemAssociationDetailController',\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/item-association-detail.tpl.html'\r\n };\r\n bladeNavigationService.showBlade(newBlade, blade);\r\n };\r\n\r\n function openAddEntityWizard() {\r\n var newBlade = {\r\n id: \"associationWizard\",\r\n catalog: blade.catalog,\r\n item: blade.item,\r\n onSaveChanges: function () {\r\n populateProductCatalogs(blade.item.associations);\r\n },\r\n controller: 'virtoCommerce.catalogModule.associationWizardController',\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/wizards/newAssociation/association-wizard.tpl.html'\r\n };\r\n bladeNavigationService.showBlade(newBlade, blade);\r\n }\r\n\r\n blade.toolbarCommands = [\r\n {\r\n name: \"platform.commands.add\", icon: 'fas fa-plus',\r\n executeMethod: function () {\r\n openAddEntityWizard();\r\n },\r\n canExecuteMethod: function () {\r\n return true;\r\n }\r\n },\r\n {\r\n name: \"platform.commands.delete\", icon: 'fas fa-trash-alt',\r\n executeMethod: function () {\r\n $scope.deleteList($scope.gridApi.selection.getSelectedRows());\r\n },\r\n canExecuteMethod: function () {\r\n return $scope.gridApi && _.any($scope.gridApi.selection.getSelectedRows());\r\n }\r\n }\r\n ];\r\n\r\n // ui-grid\r\n $scope.setGridOptions = function (gridOptions) {\r\n uiGridHelper.initialize($scope, gridOptions, function (gridApi) {\r\n //update gridApi for current grid\r\n $scope.gridApi = gridApi;\r\n\r\n gridApi.draggableRows.on.rowFinishDrag($scope, function () {\r\n for (var i = 0; i < blade.item.associations.length; i++) {\r\n blade.item.associations[i].priority = i + 1;\r\n }\r\n });\r\n });\r\n };\r\n\r\n initialize(blade.item);\r\n }]);\r\n","angular.module('virtoCommerce.catalogModule')\r\n .controller('virtoCommerce.catalogModule.itemDetailController', ['$rootScope', '$scope', '$translate', 'platformWebApp.bladeNavigationService', 'platformWebApp.settings', 'virtoCommerce.catalogModule.items', 'virtoCommerce.customerModule.members', 'virtoCommerce.catalogModule.catalogs', 'platformWebApp.metaFormsService', 'virtoCommerce.catalogModule.categories', function ($rootScope, $scope, $translate, bladeNavigationService, settings, items, members, catalogs, metaFormsService, categories) {\r\n var blade = $scope.blade;\r\n blade.updatePermission = 'catalog:update';\r\n blade.currentEntityId = blade.itemId;\r\n\r\n blade.metaFields = metaFormsService.getMetaFields(\"productDetail\");\r\n blade.metaFields1 = metaFormsService.getMetaFields(\"productDetail1\");\r\n blade.metaFields2 = metaFormsService.getMetaFields(\"productDetail2\");\r\n\r\n blade.refresh = function (parentRefresh) {\r\n blade.isLoading = true;\r\n //2015 = Full ~& Variations do not load product variations\r\n return items.get({ id: blade.itemId, respGroup: 2015 }, function (data) {\r\n if (!blade.catalog) {\r\n catalogs.get({ id: data.catalogId }, function (catalogResult) {\r\n blade.catalog = catalogResult;\r\n fillItem(data, parentRefresh);\r\n });\r\n } else {\r\n fillItem(data, parentRefresh);\r\n }\r\n },\r\n function (error) { bladeNavigationService.setError('Error ' + error.status, blade); });\r\n }\r\n\r\n function fillItem(data, parentRefresh) {\r\n blade.itemId = data.id;\r\n blade.title = data.code;\r\n blade.securityScopes = data.securityScopes;\r\n if (!data.productType) {\r\n data.productType = 'Physical';\r\n }\r\n\r\n blade.subtitle = 'catalog.blades.item-detail.subtitle';\r\n blade.subtitleValues = { productTypeName: $translate.instant('catalog.product-types.' + data.productType) };\r\n\r\n var linkWithPriority = getLinkWithPriority(data);\r\n data._priority = (linkWithPriority ? linkWithPriority.priority : data.priority) || 0;\r\n\r\n blade.item = angular.copy(data);\r\n blade.currentEntity = blade.item;\r\n blade.origItem = data;\r\n blade.isLoading = false;\r\n\r\n if (parentRefresh && blade.parentBlade.refresh) {\r\n blade.parentBlade.refresh();\r\n }\r\n if (blade.childrenBlades) {\r\n _.each(blade.childrenBlades, function (x) {\r\n if (x.refresh) {\r\n x.refresh(blade.item);\r\n }\r\n });\r\n }\r\n }\r\n\r\n blade.codeValidator = function (value) {\r\n var pattern = /[$+;=%{}[\\]|@~!^*&()?'<>,]/;\r\n return !pattern.test(value);\r\n };\r\n\r\n\r\n function isDirty() {\r\n return !angular.equals(blade.item, blade.origItem) && blade.hasUpdatePermission();\r\n }\r\n\r\n function canSave() {\r\n return isDirty() && blade.formScope && blade.formScope.$valid;\r\n }\r\n\r\n function saveChanges() {\r\n blade.isLoading = true;\r\n\r\n var linkWithPriority = getLinkWithPriority(blade.item);\r\n if (linkWithPriority) {\r\n linkWithPriority.priority = blade.item._priority;\r\n } else {\r\n blade.item.priority = blade.item._priority;\r\n }\r\n\r\n items.update({}, blade.item, function () {\r\n blade.refresh(true);\r\n });\r\n }\r\n\r\n blade.onClose = function (closeCallback) {\r\n bladeNavigationService.showConfirmationIfNeeded(isDirty(), canSave(), blade, saveChanges, closeCallback, \"catalog.dialogs.item-save.title\", \"catalog.dialogs.item-save.message\");\r\n };\r\n\r\n function getLinkWithPriority(data) {\r\n var retVal;\r\n if (bladeNavigationService.catalogsSelectedCatalog && bladeNavigationService.catalogsSelectedCatalog.isVirtual) {\r\n retVal = _.find(data.links, function (l) {\r\n return l.catalogId === bladeNavigationService.catalogsSelectedCatalog.id &&\r\n (!bladeNavigationService.catalogsSelectedCategoryId || l.categoryId === bladeNavigationService.catalogsSelectedCategoryId);\r\n });\r\n }\r\n return retVal;\r\n }\r\n\r\n blade.formScope = null;\r\n $scope.setForm = function (form) { blade.formScope = form; }\r\n\r\n blade.headIcon = blade.productType === 'Digital' ? 'fa fa-file-zip-o' : 'fa fa-dropbox';\r\n\r\n blade.toolbarCommands = [\r\n {\r\n name: \"platform.commands.save\", icon: 'fas fa-save',\r\n executeMethod: saveChanges,\r\n canExecuteMethod: canSave,\r\n permission: blade.updatePermission\r\n },\r\n {\r\n name: \"platform.commands.reset\", icon: 'fa fa-undo',\r\n executeMethod: function () {\r\n angular.copy(blade.origItem, blade.item);\r\n },\r\n canExecuteMethod: isDirty,\r\n permission: blade.updatePermission\r\n },\r\n {\r\n name: \"platform.commands.clone\", icon: 'fas fa-clone',\r\n executeMethod: function () {\r\n blade.isLoading = true;\r\n items.cloneItem({ itemId: blade.itemId }, function (data) {\r\n var newBlade = {\r\n id: blade.id,\r\n item: data,\r\n catalog: blade.catalog,\r\n title: \"catalog.wizards.new-product.title\",\r\n subtitle: 'catalog.wizards.new-product.subtitle',\r\n controller: 'virtoCommerce.catalogModule.newProductWizardController',\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/wizards/newProduct/new-product-wizard.tpl.html'\r\n };\r\n bladeNavigationService.showBlade(newBlade, blade.parentBlade);\r\n },\r\n function (error) { bladeNavigationService.setError('Error ' + error.status, blade); });\r\n\r\n },\r\n canExecuteMethod: function () { return !isDirty(); },\r\n permission: 'catalog:create'\r\n }\r\n ];\r\n\r\n // datepicker\r\n blade.datepickers = {};\r\n blade.open = function ($event, which) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n blade.datepickers[which] = true;\r\n };\r\n\r\n blade.fetchVendors = function (criteria) {\r\n return members.search(criteria);\r\n }\r\n\r\n blade.openVendorsManagement = function () {\r\n var newBlade = {\r\n id: 'vendorList',\r\n currentEntity: { id: null },\r\n controller: 'virtoCommerce.customerModule.memberListController',\r\n template: 'Modules/$(VirtoCommerce.Customer)/Scripts/blades/member-list.tpl.html'\r\n };\r\n bladeNavigationService.showBlade(newBlade, blade);\r\n };\r\n\r\n blade.openDictionarySettingManagement = function (setting) {\r\n var newBlade = {\r\n id: 'settingDetailChild',\r\n isApiSave: true,\r\n controller: 'platformWebApp.settingDictionaryController',\r\n template: '$(Platform)/Scripts/app/settings/blades/setting-dictionary.tpl.html'\r\n };\r\n switch (setting) {\r\n case 'TaxTypes':\r\n _.extend(newBlade, {\r\n currentEntityId: 'VirtoCommerce.Core.General.TaxTypes',\r\n parentRefresh: function (data) { blade.taxTypes = data; }\r\n });\r\n break;\r\n }\r\n\r\n bladeNavigationService.showBlade(newBlade, blade);\r\n };\r\n\r\n $scope.$on(\"refresh-entity-by-id\", function (event, id) {\r\n if (blade.currentEntityId === id) {\r\n blade.refresh();\r\n }\r\n });\r\n\r\n blade.associationsAdded = function (associations) {\r\n blade.currentEntity.associations = blade.currentEntity.associations.concat(associations);\r\n blade.origItem.associations = blade.origItem.associations.concat(associations);\r\n }\r\n\r\n blade.associationsDeleted = function (associationIds) {\r\n var predicate = (association) => { return _.contains(associationIds, association.id) };\r\n blade.currentEntity.associations = _.reject(blade.currentEntity.associations, predicate);\r\n blade.origItem.associations = _.reject(blade.origItem.associations, predicate);\r\n }\r\n\r\n blade.taxTypes = settings.getValues({ id: 'VirtoCommerce.Core.General.TaxTypes' });\r\n\r\n blade.refresh(false);\r\n }]);\r\n","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.itemDimensionController', ['$scope', 'platformWebApp.bladeNavigationService', 'platformWebApp.settings', 'virtoCommerce.catalogModule.items', 'virtoCommerce.customerModule.members', 'virtoCommerce.coreModule.packageType.packageTypeUtils', function ($scope, bladeNavigationService, settings, items, members, packageTypeUtils) {\n var blade = $scope.blade;\n blade.title = 'catalog.blades.item-dimensions.title';\n blade.subtitle = 'catalog.blades.item-dimensions.subtitle';\n blade.isLoading = false;\n $scope.isValid = false;\n\n var formScope;\n $scope.setForm = function (form) {\n formScope = form;\n }\n\n $scope.$watch(\"blade.currentEntity\", function () {\n $scope.isValid = formScope && formScope.$valid;\n }, true);\n\n blade.refresh = function (item) {\n if (item) {\n initialize(item);\n }\t\n };\n function initalize(item) {\n $scope.packageTypeUtils = packageTypeUtils;\n $scope.packageTypes = packageTypeUtils.getPackageTypes();\n\n blade.item = item;\n\n blade.currentEntity = {\n weightUnit : item.weightUnit,\n packageType : item.packageType,\n weight : item.weight,\n measureUnit : item.measureUnit,\n height : item.height,\n width : item.width,\n length: item.length,\n usePackageType: item.packageType && !(item.measureUnit && item.height && item.width && item.length)\n };\n\n $scope.weightUnits = settings.getValues({ id: 'VirtoCommerce.Core.General.WeightUnits' });\n $scope.measureUnits = settings.getValues({ id: 'VirtoCommerce.Core.General.MeasureUnits' }); \n };\n\n $scope.saveChanges = function () {\n angular.extend(blade.item, blade.currentEntity);\n if (blade.item.usePackageType) {\n delete blade.item.measureUnit;\n delete blade.item.height;\n delete blade.item.width;\n delete blade.item.length;\n }\n $scope.bladeClose();\n };\n \n $scope.openDictionarySettingManagement = function (setting) {\n var newBlade = {\n id: 'settingDetailChild',\n isApiSave: true,\n controller: 'platformWebApp.settingDictionaryController',\n template: '$(Platform)/Scripts/app/settings/blades/setting-dictionary.tpl.html'\n };\n switch (setting) {\n case 'WeightUnits':\n _.extend(newBlade, {\n currentEntityId: 'VirtoCommerce.Core.General.WeightUnits',\n parentRefresh: function (data) { $scope.weightUnits = data; }\n });\n break;\n case 'MeasureUnits':\n _.extend(newBlade, {\n currentEntityId: 'VirtoCommerce.Core.General.MeasureUnits',\n parentRefresh: function (data) { $scope.measureUnits = data; }\n });\n break;\n }\n\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n $scope.$watch('blade.currentEntity.packageType', function (packageTypeId) {\n if (!packageTypeId) {\n blade.currentEntity.usePackageType = false;\n }\n });\n\n $scope.$watch('blade.currentEntity.usePackageType', function (usePackageTypeValue) {\n if (!usePackageTypeValue) {\n if (!blade.currentEntity.measureUnit) {\n var packageType = _.find($scope.packageTypes, function (x) { return x.id == blade.currentEntity.packageType; });\n if (packageType) {\n blade.currentEntity.measureUnit = packageType.measureUnit;\n }\n }\n }\n });\n\n initalize(blade.item);\n}]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.itemPropertyDetailController', ['$scope', '$q', 'virtoCommerce.catalogModule.properties', 'platformWebApp.bladeNavigationService', 'platformWebApp.dialogService', 'virtoCommerce.catalogModule.valueTypes', 'virtoCommerce.catalogModule.propertyValidators', function ($scope, $q, properties, bladeNavigationService, dialogService, valueTypes, propertyValidators) {\n var blade = $scope.blade;\n blade.availableValueTypes = valueTypes.get();\n $scope.isValid = false;\n\n blade.title = \"catalog.blades.item-property-detail.title\";\n blade.subtitle = \"catalog.blades.item-property-detail.subtitle\";\n\n $scope.$watch(\"blade.currentEntity\", function () {\n $scope.isValid = $scope.formScope && $scope.formScope.$valid;\n }, true);\n\n function initialize(data) {\n if (data.valueType === 'Number' && data.dictionaryValues) {\n _.forEach(data.dictionaryValues, function (entry) {\n entry.value = parseFloat(entry.value);\n });\n }\n blade.currentEntity = angular.copy(data);\n blade.isLoading = false;\n }\n\n $scope.doValidateNameAsync = value => {\n // common property name errors validation\n if (value && !propertyValidators.isNameValid(value)) {\n $scope.errorData = {\n errorMessage: 'property-naming-error'\n }\n return $q.reject();\n }\n\n return properties.validateName({\n name: value,\n originalName: blade.origEntity.name,\n productId: blade.productId\n }).$promise.then(result => {\n if (result.isValid) {\n $scope.errorData = null;\n return $q.resolve();\n } else {\n $scope.errorData = result.errors[0];\n return $q.reject();\n }\n });\n };\n\n $scope.openBlade = newBladeData => {\n var newBlade = angular.extend({\n id: \"duplicateVariationDetail\",\n title: newBladeData.code,\n catalog: blade.catalog,\n controller: 'virtoCommerce.catalogModule.itemDetailController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/item-detail.tpl.html'\n }, newBladeData);\n\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n $scope.saveChanges = function () {\n angular.copy(blade.currentEntity, blade.origEntity);\n if (blade.isNew && blade.properties) {\n blade.properties.push(blade.origEntity);\n }\n $scope.bladeClose();\n };\n\n function removeProperty(prop) {\n var dialog = {\n id: \"confirmDelete\",\n title: \"platform.dialogs.delete.title\",\n message: 'catalog.dialogs.item-property-delete.message',\n messageValues: { name: prop.name },\n callback: function (remove) {\n if (remove) {\n var idx = blade.properties.indexOf(blade.origEntity);\n blade.properties.splice(idx, 1);\n $scope.bladeClose();\n }\n }\n }\n dialogService.showConfirmationDialog(dialog);\n }\n\n $scope.setForm = function (form) { $scope.formScope = form; };\n\n if (!blade.isNew) {\n blade.headIcon = 'fa fa-gear';\n blade.toolbarCommands = [\n {\n name: \"platform.commands.delete\", icon: 'fas fa-trash-alt',\n executeMethod: function () {\n removeProperty(blade.origEntity);\n },\n canExecuteMethod: function () { return true; }\n }\n ];\n }\n // actions on load \n initialize(blade.origEntity);\n }]);\n","angular.module('virtoCommerce.catalogModule').controller('virtoCommerce.catalogModule.itemVariationListController', ['$scope', 'platformWebApp.bladeNavigationService', 'platformWebApp.dialogService', 'virtoCommerce.catalogModule.items', 'filterFilter', 'uiGridConstants', 'platformWebApp.uiGridHelper', 'virtoCommerce.catalogModule.search', 'platformWebApp.bladeUtils', function ($scope, bladeNavigationService, dialogService, items, filterFilter, uiGridConstants, uiGridHelper, search, bladeUtils) {\n $scope.uiGridConstants = uiGridConstants;\n var blade = $scope.blade;\n blade.title = blade.item.name;\n blade.subtitle = 'catalog.widgets.itemVariation.blade-subtitle';\n\n\n blade.refresh = function (pageNumber) {\n\n if (!pageNumber) {\n blade.parentBlade.refresh();\n return;\n }\n\n blade.isLoading = true;\n var searchCriteria = {\n mainProductId: blade.item.id,\n responseGroup: 'withProducts',\n objectType: 'CatalogProduct',\n sort: uiGridHelper.getSortExpression($scope),\n skip: ($scope.pageSettings.currentPage - 1) * $scope.pageSettings.itemsPerPageCount,\n take: $scope.pageSettings.itemsPerPageCount,\n withHidden: true,\n searchInChildren: true\n };\n\n search.searchProducts(\n searchCriteria,\n function (data) {\n blade.isLoading = false;\n $scope.pageSettings.totalItems = data.totalCount;\n blade.variations = data.results;\n $scope.hasMore = data.results.length === $scope.pageSettings.itemsPerPageCount;\n });\n };\n\n\n blade.setSelectedItem = function (listItem) {\n $scope.selectedNodeId = listItem.id;\n };\n\n $scope.selectVariation = function (listItem) {\n blade.setSelectedItem(listItem);\n var newBlade = {\n id: 'variationDetail',\n itemId: listItem.id,\n productType: listItem.productType,\n title: listItem.code,\n catalog: blade.catalog,\n subtitle: 'catalog.blades.item-detail.subtitle-variation',\n controller: 'virtoCommerce.catalogModule.itemDetailController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/item-detail.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n $scope.deleteList = function (list) {\n bladeNavigationService.closeChildrenBlades(blade, function () {\n var dialog = {\n id: \"confirmDeleteItem\",\n title: \"catalog.dialogs.variation-delete.title\",\n message: \"catalog.dialogs.variation-delete.message\",\n callback: function (remove) {\n if (remove) {\n var ids = _.pluck(list, 'id');\n items.remove({ ids: ids }, blade.parentBlade.refresh, function (error) { bladeNavigationService.setError('Error ' + error.status, blade); });\n }\n }\n }\n dialogService.showConfirmationDialog(dialog);\n });\n };\n\n\n blade.headIcon = 'fa fa-dropbox';\n\n if (blade.toolbarCommandsAndEvents && blade.toolbarCommandsAndEvents.toolbarCommands) {\n blade.toolbarCommands = blade.toolbarCommandsAndEvents.toolbarCommands;\n } else\n blade.toolbarCommands = [\n {\n name: \"platform.commands.refresh\", icon: 'fa fa-refresh',\n executeMethod: function () {\n blade.parentBlade.refresh()\n },\n canExecuteMethod: function () { return true; }\n },\n {\n name: \"platform.commands.add\", icon: 'fas fa-plus',\n executeMethod: function () {\n items.newVariation({ itemId: blade.item.id }, function (data) {\n // take variation properties only\n data.properties = _.where(data.properties, { type: 'Variation' });\n data.productType = blade.item.productType;\n\n if (data.productType === 'Digital'\n || data.productType === 'BillOfMaterials') {\n data.trackInventory = false;\n }\n\n var newBlade = {\n id: 'variationDetail',\n item: data,\n catalog: blade.catalog,\n title: \"catalog.wizards.new-variation.title\",\n subtitle: 'catalog.wizards.new-variation.subtitle',\n controller: 'virtoCommerce.catalogModule.newProductWizardController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/wizards/newProduct/new-variation-wizard.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n },\n function (error) { bladeNavigationService.setError('Error ' + error.status, blade); });\n },\n canExecuteMethod: function () { return true; },\n permission: 'catalog:create'\n },\n {\n name: \"platform.commands.delete\", icon: 'fas fa-trash-alt',\n executeMethod: function () {\n $scope.deleteList($scope.gridApi.selection.getSelectedRows());\n },\n canExecuteMethod: function () {\n return $scope.gridApi && _.any($scope.gridApi.selection.getSelectedRows());\n },\n permission: 'catalog:delete'\n }\n ];\n\n // simple and advanced filtering\n var filter = $scope.filter = {};\n\n filter.criteriaChanged = function () {\n if ($scope.pageSettings.currentPage > 1) {\n $scope.pageSettings.currentPage = 1;\n } else {\n blade.refresh();\n }\n };\n\n // ui-grid\n $scope.setGridOptions = function (gridOptions) {\n uiGridHelper.initialize($scope, gridOptions, function (gridApi) {\n gridApi.grid.registerRowsProcessor($scope.singleFilter, 90);\n uiGridHelper.bindRefreshOnSortChanged($scope);\n });\n bladeUtils.initializePagination($scope);\n };\n\n $scope.singleFilter = function (renderableRows) {\n var visibleCount = 0;\n renderableRows.forEach(function (row) {\n row.visible = _.any(filterFilter([row.entity], blade.searchText));\n if (row.visible) visibleCount++;\n });\n\n $scope.filteredEntitiesCount = visibleCount;\n return renderableRows;\n };\n\n}]);\n","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.propertyAttributesController', ['$scope', '$filter', 'platformWebApp.dialogService', function ($scope, $filter, dialogService) {\n var pb = $scope.blade.parentBlade;\n $scope.pb = pb;\n\n var formScope;\n\n $scope.attributeNameValidator = function (value) {\n return _.all(pb.currentEntity.attributes, function (item) { return item.name !== value; });\n }\n\n $scope.setForm = function (form) {\n formScope = form;\n }\n\n $scope.add = function () {\n if (formScope.$valid) {\n pb.currentEntity.attributes.push($scope.newValue);\n resetNewValue();\n formScope.$setPristine();\n }\n };\n\n $scope.delete = function (index) {\n pb.currentEntity.attributes.splice(index, 1);\n $scope.selectedItem = undefined;\n };\n\n $scope.selectItem = function (listItem) {\n $scope.selectedItem = listItem;\n };\n\n $scope.blade.headIcon = 'fa fa-gear';\n\n $scope.blade.toolbarCommands = [\n {\n name: \"platform.commands.delete\", icon: 'fas fa-trash-alt',\n executeMethod: function () {\n deleteChecked();\n },\n canExecuteMethod: function () {\n return isItemsChecked();\n }\n }\n ];\n\n $scope.checkAll = function (selected) {\n angular.forEach(pb.currentEntity.attributes, function (item) {\n item.selected = selected;\n });\n };\n\n function resetNewValue() {\n $scope.newValue = { name: null, value: null };\n }\n\n function isItemsChecked() {\n return _.any(pb.currentEntity.attributes, function (x) { return x.selected; });\n }\n\n function deleteChecked() {\n var dialog = {\n id: \"confirmDeleteItem\",\n title: \"catalog.dialogs.attribut-delete.title\",\n message: \"catalog.dialogs.attribut-delete.message\",\n callback: function (remove) {\n if (remove) {\n var selection = $filter('filter')(pb.currentEntity.attributes, { selected: true }, true);\n angular.forEach(selection, function (listItem) {\n $scope.delete(pb.currentEntity.attributes.indexOf(listItem));\n });\n }\n }\n }\n dialogService.showConfirmationDialog(dialog);\n }\n\n // on load\n resetNewValue();\n $scope.blade.isLoading = false;\n}]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.propertyDetailController', ['$scope', '$q', 'virtoCommerce.catalogModule.properties', 'platformWebApp.bladeNavigationService', 'platformWebApp.dialogService', 'virtoCommerce.catalogModule.valueTypes', 'virtoCommerce.catalogModule.propertyValidators', function ($scope, $q, properties, bladeNavigationService, dialogService, valueTypes, propertyValidators) {\n var blade = $scope.blade;\n blade.updatePermission = 'catalog:update';\n blade.origEntity = {};\n $scope.currentChild = undefined;\n blade.title = \"catalog.blades.property-detail.title\";\n blade.subtitle = \"catalog.blades.property-detail.subtitle\";\n blade.availableValueTypes = valueTypes.get();\n\n blade.hasMultivalue = true;\n blade.hasDictionary = true;\n blade.hasMultilanguage = true;\n\n blade.availablePropertyTypes = blade.catalogId ? ['Product', 'Variation', 'Category', 'Catalog'] : ['Product', 'Variation', 'Category'];\n\n $scope.$watch('blade.currentEntity.valueType', function (newValue, oldValue) {\n blade.hasMultivalue = true;\n blade.hasDictionary = true;\n blade.hasMultilanguage = true;\n switch (newValue) {\n case 'DateTime':\n case 'Boolean':\n blade.hasMultivalue = blade.currentEntity.multivalue = false;\n blade.hasDictionary = blade.currentEntity.dictionary = false;\n blade.hasMultilanguage = blade.currentEntity.multilanguage = false;\n break;\n case 'Integer':\n case 'GeoPoint':\n case 'Number':\n blade.hasDictionary = blade.currentEntity.dictionary = false;\n blade.hasMultilanguage = blade.currentEntity.multilanguage = false;\n break;\n case 'LongText':\n blade.hasDictionary = blade.currentEntity.dictionary = false;\n break;\n }\n });\n\n $scope.doValidateNameAsync = value => {\n // common property name errors validation\n if (value && !propertyValidators.isNameValid(value)) {\n $scope.errorData = {\n errorMessage: 'property-naming-error'\n }\n return $q.reject();\n }\n\n // validation for category properties\n // skips backend property name validation for current entity edit when the old name equals new name\n if (!blade.origEntity.isNew && value === blade.origEntity.name) {\n $scope.errorData = null;\n return $q.resolve();\n }\n\n return properties.validateCategoryPropertyName({\n propertyName: value,\n propertyType: blade.origEntity.type,\n categoryId: blade.origEntity.categoryId,\n catalogId: blade.origEntity.catalogId\n }).$promise.then(result => {\n if (result.isValid) {\n $scope.errorData = null;\n return $q.resolve();\n } else {\n $scope.errorData = result.errors[0];\n return $q.reject();\n }\n });\n };\n\n blade.refresh = function (parentRefresh) {\n if (blade.currentEntityId) {\n properties.get({ propertyId: blade.currentEntityId }, function (data) {\n initializeBlade(data);\n if (parentRefresh) {\n blade.parentBlade.refresh();\n }\n },\n function (error) { bladeNavigationService.setError('Error ' + error.status, blade); });\n } else if (blade.categoryId) {\n properties.newCategoryProperty({ categoryId: blade.categoryId }, function (data) {\n initializeBlade(data);\n },\n function (error) { bladeNavigationService.setError('Error ' + error.status, blade); });\n }\n else if (blade.catalogId) {\n properties.newCatalogProperty({ catalogId: blade.catalogId }, function (data) {\n initializeBlade(data);\n },\n function (error) { bladeNavigationService.setError('Error ' + error.status, blade); });\n }\n };\n\n $scope.openChild = function (childType) {\n var newBlade = { id: \"propertyChild\" };\n newBlade.property = blade.currentEntity;\n newBlade.languages = blade.languages;\n newBlade.defaultLanguage = blade.defaultLanguage;\n switch (childType) {\n case 'attr':\n newBlade.title = 'catalog.blades.property-attributes.title';\n newBlade.titleValues =\n { name: blade.origEntity.name ? blade.origEntity.name : blade.currentEntity.name };\n newBlade.subtitle = 'catalog.blades.property-attributes.subtitle';\n newBlade.controller = 'virtoCommerce.catalogModule.propertyAttributesController';\n newBlade.template = 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/property-attributes.tpl.html';\n break;\n case 'rules':\n newBlade.title = 'catalog.blades.property-validationRule.title';\n newBlade.titleValues =\n { name: blade.origEntity.name ? blade.origEntity.name : blade.currentEntity.name };\n newBlade.subtitle = 'catalog.blades.property-validationRule.subtitle';\n newBlade.controller = 'virtoCommerce.catalogModule.propertyValidationRulesController';\n newBlade.template = 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/property-validationRules.tpl.html';\n break;\n case 'dict':\n newBlade.title = 'catalog.blades.property-dictionary.title';\n newBlade.titleValues =\n { name: blade.origEntity.name ? blade.origEntity.name : blade.currentEntity.name };\n newBlade.subtitle = 'catalog.blades.property-dictionary.subtitle';\n newBlade.controller = 'virtoCommerce.catalogModule.propertyDictionaryListController';\n newBlade.template = 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/property-dictionary-list.tpl.html';\n break;\n }\n bladeNavigationService.showBlade(newBlade, blade);\n $scope.currentChild = childType;\n };\n\n function initializeBlade(data) {\n properties.values({ propertyId: data.id }, function (response) {\n data.dictionaryValues = response;\n if (data.valueType === 'Number' && data.dictionaryValues) {\n _.forEach(data.dictionaryValues, function (entry) {\n entry.value = parseFloat(entry.value);\n });\n }\n\n if (blade.propertyType) {\n data.type = blade.propertyType;\n }\n blade.currentEntity = angular.copy(data);\n blade.origEntity = data;\n blade.isLoading = false;\n });\n }\n\n function lockSave() {\n $scope.duplicatedName = angular.copy(blade.currentEntity.name);\n }\n\n function isSaveLocked() {\n var result = blade.currentEntity && $scope.duplicatedName === blade.currentEntity.name;\n\n return result;\n }\n\n function isDirty() {\n return !angular.equals(blade.currentEntity, blade.origEntity) && blade.hasUpdatePermission();\n }\n\n function canSave() {\n return (blade.origEntity.isNew || isDirty()) && formScope && formScope.$valid && !isSaveLocked();\n }\n \n function saveChanges() {\n blade.isLoading = true;\n\n $scope.doValidateNameAsync(blade.currentEntity.name).then(() => {\n bladeNavigationService.closeChildrenBlades(blade);\n\n delete blade.currentEntity.validationRule; // clear read-only property\n if (blade.currentEntity.valueType !== \"ShortText\" && blade.currentEntity.valueType !== \"LongText\") {\n delete blade.currentEntity.validationRules;\n }\n\n properties.update(blade.currentEntity, function (data, headers) {\n blade.currentEntityId = data.id;\n blade.refresh(true);\n });\n }, () => {\n lockSave();\n blade.isLoading = false;\n });\n }\n\n function removeProperty(prop) {\n var dialog = {\n id: \"confirmDelete\",\n messageValues: { name: prop.name },\n callback: function (doDeleteValues) {\n blade.isLoading = true;\n\n properties.remove({ id: prop.id, doDeleteValues: doDeleteValues }, function () {\n $scope.bladeClose();\n blade.parentBlade.refresh();\n });\n }\n };\n dialogService.showDialog(dialog, 'Modules/$(VirtoCommerce.Catalog)/Scripts/dialogs/deleteProperty-dialog.tpl.html', 'platformWebApp.confirmDialogController');\n }\n\n blade.onClose = function (closeCallback) {\n bladeNavigationService.showConfirmationIfNeeded(isDirty(), canSave(), blade, saveChanges, closeCallback, \"catalog.dialogs.property-save.title\", \"catalog.dialogs.property-save.message\");\n };\n\n var formScope;\n $scope.setForm = function (form) { formScope = form; }\n\n blade.headIcon = 'fa fa-gear';\n\n blade.toolbarCommands = [\n {\n name: \"platform.commands.save\", icon: 'fas fa-save',\n executeMethod: saveChanges,\n canExecuteMethod: canSave\n },\n {\n name: \"platform.commands.reset\", icon: 'fa fa-undo',\n executeMethod: function () {\n angular.copy(blade.origEntity, blade.currentEntity);\n },\n canExecuteMethod: isDirty\n },\n {\n name: \"platform.commands.delete\", icon: 'fas fa-trash-alt',\n executeMethod: function () {\n removeProperty(blade.origEntity);\n },\n canExecuteMethod: function () {\n return blade.origEntity.isManageable && !blade.origEntity.isNew;\n }\n }\n ];\n\n // actions on load \n blade.refresh();\n }]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.propertyDictionaryDetailsController',\n ['$scope', 'platformWebApp.dialogService', 'platformWebApp.bladeNavigationService', 'virtoCommerce.catalogModule.propDictItems', function ($scope, dialogService, bladeNavigationService, propDictItems) {\n var blade = $scope.blade;\n blade.headIcon = 'fa fa-book';\n\n $scope.isValid = true;\n $scope.blade.isLoading = false;\n $scope.validationRules = blade.property.validationRule;\n\n\n $scope.setForm = function (form) { blade.formScope = form; }\n\n blade.toolbarCommands = [\n {\n name: \"platform.commands.save\", icon: 'fas fa-save',\n executeMethod: saveChanges,\n canExecuteMethod: canSave\n }\n ];\n function initializeBlade() {\n blade.currentEntity = angular.copy(blade.dictionaryItem);\n blade.origEntity = blade.dictionaryItem;\n blade.isLoading = false;\n };\n\n function isDirty() {\n return !angular.equals(blade.currentEntity, blade.origEntity) && blade.hasUpdatePermission();\n }\n\n function canSave() {\n return isDirty() && blade.formScope && blade.formScope.$valid;\n }\n \n blade.onClose = function (closeCallback) {\n bladeNavigationService.showConfirmationIfNeeded(isDirty(), $scope.isValid, blade, $scope.saveChanges, closeCallback, \"catalog.dialogs.property-save.title\", \"catalog.dialogs.property-save.message\");\n };\n\n function saveChanges () {\n blade.currentEntity.localizedValues = [];\n blade.languages.forEach(function (lang) {\n let dictValue = {};\n dictValue.languageCode = blade.property.multilanguage ? lang : undefined;\n dictValue.value = blade.currentEntity[lang];\n blade.currentEntity.localizedValues.push(dictValue);\n });\n propDictItems.save([blade.currentEntity], function (response) {\n // call parent onSave\n blade.onSaveChanges();\n angular.copy(blade.currentEntity, blade.origEntity);\n });\n };\n initializeBlade();\n }]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.propertyDictionaryListController', ['$scope', '$filter', 'platformWebApp.dialogService', 'platformWebApp.settings', 'platformWebApp.bladeNavigationService', 'platformWebApp.uiGridHelper', 'virtoCommerce.catalogModule.propDictItems', 'platformWebApp.bladeUtils', function ($scope, $filter, dialogService, settings, bladeNavigationService, uiGridHelper, propDictItems, bladeUtils) {\n var blade = $scope.blade;\n $scope.blade.isLoading = false;\n blade.headIcon = 'fa fa-book';\n $scope.currentEntities = [];\n\n $scope.uiGridConstants = uiGridHelper.uiGridConstants;\n\n // simple and advanced filtering\n var filter = blade.filter = $scope.filter = {};\n\n filter.criteriaChanged = function () {\n if ($scope.pageSettings.currentPage > 1) {\n $scope.pageSettings.currentPage = 1;\n } else {\n blade.refresh();\n }\n };\n\n blade.toolbarCommands = [\n {\n name: \"platform.commands.add\", icon: 'fas fa-plus',\n executeMethod: function () {\n $scope.selectNode({ values: [], isNew: true, propertyId : blade.property.id })\n },\n canExecuteMethod: function () {\n return true;\n }\n },\n {\n name: \"platform.commands.delete\", icon: 'fas fa-trash-alt',\n executeMethod: function () {\n $scope.deleteList($scope.gridApi.selection.getSelectedRows());\n },\n canExecuteMethod: function () {\n return $scope.gridApi && _.any($scope.gridApi.selection.getSelectedRows());\n },\n }\n\n ];\n\n blade.refresh = function () {\n blade.languages = blade.property.multilanguage ? blade.languages : [];\n var criteria = {\n searchPhrase: filter.keyword,\n propertyIds: [blade.property.id],\n sort: uiGridHelper.getSortExpression($scope),\n skip: ($scope.pageSettings.currentPage - 1) * $scope.pageSettings.itemsPerPageCount,\n take: $scope.pageSettings.itemsPerPageCount\n };\n \n propDictItems.search(criteria, function (result) {\n $scope.pageSettings.totalItems = result.totalCount;\n $scope.currentEntities = result.results;\n $scope.currentEntities.forEach(function (dictItem) {\n blade.languages.forEach(function (lang) {\n var dictValue = _.find(dictItem.localizedValues, function (x) { return x.languageCode === lang || (!x.languageCode && lang === blade.defaultLanguage) });\n dictItem[lang] = dictValue ? dictValue.value : undefined;\n });\n });\n });\n };\n\n \n // ui-grid\n $scope.setGridOptions = function (gridOptions) {\n uiGridHelper.initialize($scope, gridOptions, function (gridApi) {\n if (gridApi && gridApi.core) {\n uiGridHelper.bindRefreshOnSortChanged($scope);\n }\n });\n bladeUtils.initializePagination($scope);\n };\n\n $scope.deleteList = function (selection) {\n var dialog = {\n id: \"confirmDeletePropertyValue\",\n title: \"catalog.dialogs.dictionary-values-delete.title\",\n message: \"catalog.dialogs.dictionary-values-delete.message\",\n callback: function (remove) {\n if (remove) {\n bladeNavigationService.closeChildrenBlades(blade, function () {\n var dictItemsIds = _.pluck(selection, 'id');\n propDictItems.remove({ ids: dictItemsIds }, function (data) {\n blade.refresh();\n });\n });\n }\n }\n };\n dialogService.showDialog(dialog, 'Modules/$(VirtoCommerce.Catalog)/Scripts/dialogs/deletePropertyDictionaryItem-dialog.tpl.html', 'platformWebApp.confirmDialogController');\n };\n\n $scope.deleteDictItem = function (selectedDictItem) {\n $scope.deleteList([selectedDictItem]);\n }\n\n\n $scope.selectNode = function (selectedDictItem) {\n\n if (selectedDictItem.alias) {\n $scope.selectedNodeId = selectedDictItem.alias;\n }\n var newBlade = {\n id: 'propertyDictionaryDetails',\n title: 'catalog.blades.property-dictionary.labels.dictionary-edit',\n controller: 'virtoCommerce.catalogModule.propertyDictionaryDetailsController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/property-dictionary-details.tpl.html',\n dictionaryItem: selectedDictItem,\n property: blade.property,\n languages: blade.languages,\n defaultLanguage: blade.defaultLanguage,\n\n onSaveChanges: function (dictItem) { \n blade.refresh();\n },\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n \n //blade.refresh();\n\n }]);\n","angular.module('virtoCommerce.catalogModule')\r\n .controller('virtoCommerce.catalogModule.propertyListController', ['$scope', 'virtoCommerce.catalogModule.properties', 'platformWebApp.bladeNavigationService', 'virtoCommerce.catalogModule.propDictItems', '$localStorage', 'platformWebApp.authService', function ($scope, properties, bladeNavigationService, propDictItems, $localStorage, authService) {\r\n var blade = $scope.blade;\r\n $scope.isValid = false;\r\n blade.refresh = function (entity) {\r\n if (entity) {\r\n initialize(entity);\r\n }\r\n else {\r\n blade.parentBlade.refresh();\r\n }\r\n };\r\n\r\n blade.propertiesVisible = true;\r\n blade.propertyVisibleCommand = {\r\n name: 'catalog.blades.property-list.labels.hide-empty-values', icon: 'fas fa-eye-slash',\r\n executeMethod: function () {\r\n $scope.switchPropertiesVisibility();\r\n },\r\n canExecuteMethod: function () {\r\n return true;\r\n }\r\n };\r\n\r\n function initialize(entity) {\r\n blade.title = entity.name;\r\n blade.subtitle = 'catalog.blades.property-list.subtitle';\r\n blade.currentEntity = entity;\r\n blade.currentEntities = angular.copy(entity.properties);\r\n blade.propertiesForExclude = _.map(blade.currentEntities, (x) => { return { name: x.name } });\r\n blade.filteredProperties = [];\r\n blade.emptyProperties = [];\r\n //Apply stored filters\r\n if ($localStorage.propertyFilter) {\r\n applyFilter($localStorage.propertyFilter[authService.userName]);\r\n }\r\n\r\n if (!blade.originalEntity) {\r\n blade.originalEntity = {\r\n properties: blade.currentEntity.properties\r\n }\r\n }\r\n }\r\n\r\n $scope.isPropertyChanged = function (property) {\r\n if (property) {\r\n var oldItem = _.find(blade.originalEntity.properties, function (x) { return x.name === property.name; });\r\n if (oldItem) {\r\n var propValues = property.values.filter(x => x.value)\r\n .sort((x, y) => $scope.comparePropValues(x,y));\r\n\r\n var oldValues = oldItem.values.filter(x => x.value)\r\n .sort((x, y) => $scope.comparePropValues(x,y));\r\n\r\n return !angular.equals(propValues, oldValues);\r\n }\r\n else {\r\n return property.values.length > 0;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n $scope.comparePropValues = function (x, y) {\r\n if (!x.valueId) {\r\n if (x.value.localeCompare !== undefined) {\r\n return x.value.localeCompare(y.value);\r\n }\r\n if (x.value === y.value) {\r\n return 0;\r\n }\r\n return x.value < y.value ? -1 : 1\r\n }\r\n\r\n return x.valueId.localeCompare(y.valueId);\r\n }\r\n\r\n $scope.isPropertyVisible = function (property) {\r\n if (blade.filteredProperties && blade.filteredProperties.length > 0) {\r\n return blade.filteredProperties.includes(property.name.toLowerCase());\r\n }\r\n return true;\r\n }\r\n\r\n $scope.isPropertyHasValues = function (property) {\r\n return !blade.emptyProperties.includes(property);\r\n }\r\n\r\n function applyFilter(filteredProperties) {\r\n if (filteredProperties && filteredProperties.length > 0) {\r\n blade.filteredProperties = filteredProperties.map(function (x) { return x.toLowerCase(); });\r\n }\r\n }\r\n\r\n $scope.resetFilter = function () {\r\n saveFilter([]);\r\n blade.filteredProperties = [];\r\n };\r\n\r\n $scope.saveChanges = function () {\r\n blade.currentEntity.properties = blade.currentEntities;\r\n $scope.bladeClose();\r\n };\r\n\r\n $scope.getPropertyDisplayName = function (prop) {\r\n return _.first(_.map(_.filter(prop.displayNames, function (x) { return x && x.languageCode.startsWith(blade.defaultLanguage); }), function (x) { return x.name; }));\r\n };\r\n\r\n $scope.editProperty = function (prop) {\r\n if (prop.isManageable) {\r\n var newBlade = {\r\n id: 'editCategoryProperty',\r\n currentEntityId: prop ? prop.id : undefined,\r\n categoryId: blade.categoryId,\r\n catalogId: blade.catalogId,\r\n defaultLanguage: blade.defaultLanguage,\r\n languages: blade.languages,\r\n controller: 'virtoCommerce.catalogModule.propertyDetailController',\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/property-detail.tpl.html'\r\n };\r\n bladeNavigationService.showBlade(newBlade, blade);\r\n } else {\r\n editUnmanageable({\r\n title: 'catalog.blades.item-property-detail.title',\r\n origEntity: prop\r\n });\r\n }\r\n };\r\n\r\n function editUnmanageable(bladeData) {\r\n var newBlade = {\r\n id: 'editItemProperty' + blade.currentEntity.id,\r\n properties: blade.currentEntities,\r\n productId: blade.currentEntity.id,\r\n catalog: blade.catalog,\r\n controller: 'virtoCommerce.catalogModule.itemPropertyDetailController',\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/item-property-detail.tpl.html'\r\n };\r\n angular.extend(newBlade, bladeData);\r\n\r\n bladeNavigationService.showBlade(newBlade, blade);\r\n }\r\n\r\n $scope.getPropValues = function (propId, keyword, countToSkip, countToTake) {\r\n return propDictItems.search({\r\n propertyIds: [propId],\r\n searchPhrase: keyword,\r\n skip: countToSkip,\r\n take: countToTake\r\n }).$promise.then(function (result) {\r\n return result;\r\n });\r\n };\r\n\r\n var formScope;\r\n $scope.setForm = function (form) {\r\n formScope = form;\r\n }\r\n\r\n var isValid = () => {\r\n var isFormValid = formScope && formScope.$valid;\r\n var isAnyChanges = blade.currentEntities.length !== blade.originalEntity.properties.length ||\r\n blade.currentEntities.some(x => $scope.isPropertyChanged(x));\r\n\r\n $scope.isValid = isFormValid && isAnyChanges;\r\n };\r\n\r\n $scope.$watch(\"blade.currentEntities\", isValid, true);\r\n $scope.$watch(\"blade.currentEntity\", isValid, true);\r\n\r\n blade.headIcon = 'fa fa-gear';\r\n\r\n function setAddPropertyButtonNameKey() {\r\n if (blade.currentEntity.hasOwnProperty('productType')) {\r\n return blade.currentEntity.mainProductId ? 'catalog.commands.add-variation-property' : 'catalog.commands.add-product-property';\r\n }\r\n return 'catalog.commands.add-property';\r\n }\r\n blade.addPropertyButtonNameKey = setAddPropertyButtonNameKey();\r\n blade.toolbarCommands = [\r\n {\r\n name: blade.addPropertyButtonNameKey,\r\n icon: 'fas fa-plus',\r\n executeMethod: function () {\r\n if (blade.entityType == \"product\") {\r\n editUnmanageable({\r\n isNew: true,\r\n title: 'catalog.blades.item-property-detail.title-new',\r\n origEntity: {\r\n type: \"Product\",\r\n valueType: \"ShortText\",\r\n values: []\r\n }\r\n });\r\n } else {\r\n var newBlade = {\r\n id: 'propertyTypesList',\r\n currentEntityId: undefined,\r\n categoryId: blade.categoryId,\r\n catalogId: blade.catalogId,\r\n defaultLanguage: blade.defaultLanguage,\r\n languages: blade.languages,\r\n controller: 'virtoCommerce.catalogModule.propertyTypeListController',\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/property-type-list.tpl.html'\r\n };\r\n bladeNavigationService.showBlade(newBlade, blade);\r\n }\r\n },\r\n canExecuteMethod: function () {\r\n return true;\r\n }\r\n },\r\n {\r\n name: \"catalog.blades.property-list.labels.add-filter\", icon: 'fa fa-filter',\r\n executeMethod: function () {\r\n $scope.editPropertyFilter();\r\n },\r\n canExecuteMethod: function () {\r\n return true;\r\n }\r\n },\r\n {\r\n name: \"catalog.blades.property-list.labels.reset-filter\", icon: 'fa fa-undo',\r\n executeMethod: function () {\r\n $scope.resetFilter();\r\n },\r\n canExecuteMethod: function () {\r\n return blade.filteredProperties.length > 0;\r\n }\r\n },\r\n blade.propertyVisibleCommand\r\n ];\r\n\r\n $scope.editPropertyFilter = function () {\r\n var newBlade = {\r\n id: \"propertySelector\",\r\n entityType: \"product\",\r\n properties: blade.currentEntities,\r\n selectedProperties: blade.filteredProperties,\r\n controller: 'virtoCommerce.catalogModule.propertySelectorController',\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/property-selector.tpl.html',\r\n onSelected: function (filteredProperties) {\r\n var filteredPropertiesNames = filteredProperties.map(function (x) { return x.name; });\r\n saveFilter(filteredPropertiesNames);\r\n applyFilter(filteredPropertiesNames);\r\n }\r\n };\r\n bladeNavigationService.showBlade(newBlade, blade);\r\n };\r\n\r\n $scope.switchPropertiesVisibility = function () {\r\n blade.propertiesVisible = !blade.propertiesVisible;\r\n\r\n if (blade.propertiesVisible) {\r\n blade.propertyVisibleCommand.name = 'catalog.blades.property-list.labels.hide-empty-values';\r\n blade.propertyVisibleCommand.icon = 'fas fa-eye-slash';\r\n\r\n showEmptyProperties();\r\n }\r\n else {\r\n blade.propertyVisibleCommand.name = 'catalog.blades.property-list.labels.show-empty-values';\r\n blade.propertyVisibleCommand.icon = 'fas fa-eye';\r\n\r\n hideEmptyProperties();\r\n }\r\n };\r\n\r\n function hideEmptyProperties() {\r\n var propertiesByType = _.filter(blade.currentEntities, function (property) {\r\n if (blade.entityType.toLowerCase() === 'product' && property.type.toLowerCase() === 'variation') {\r\n return true;\r\n }\r\n\r\n return property.type.toLowerCase() === blade.entityType.toLowerCase();\r\n });\r\n\r\n // control visibility of multilanguage properties separately\r\n _.each(propertiesByType, function (property) {\r\n if (property.multilanguage) {\r\n property.$$hiddenLanguages = [];\r\n _.each(blade.languages, function (language) {\r\n var languageFound = _.some(property.values, function (propertyValue) {\r\n return propertyValue.value && propertyValue.value !== '' && propertyValue.languageCode === language;\r\n });\r\n\r\n if (!languageFound) {\r\n property.$$hiddenLanguages.push(language);\r\n }\r\n });\r\n }\r\n })\r\n\r\n _.each(propertiesByType, function (property) {\r\n // required properties and switchers can’t be hidden\r\n if (!property.required &&\r\n property.valueType !== 'Boolean' &&\r\n allPropertiesEmpty(property.values)\r\n ) {\r\n blade.emptyProperties.push(property)\r\n }\r\n });\r\n }\r\n\r\n function allPropertiesEmpty(propertyValues) {\r\n var result = _.all(propertyValues, function (value) {\r\n return !value.value || value.value === '';\r\n });\r\n return result;\r\n }\r\n\r\n function showEmptyProperties() {\r\n _.each(blade.currentEntities, function (property) {\r\n if (property.$$hiddenLanguages) {\r\n property.$$hiddenLanguages = null;\r\n }\r\n });\r\n\r\n blade.emptyProperties = [];\r\n }\r\n\r\n //save filters to localStorage\r\n function saveFilter(filteredPropertiesNames) {\r\n var filter = {};\r\n filter[authService.userName] = filteredPropertiesNames;\r\n if ($localStorage.propertyFilter) {\r\n angular.extend($localStorage.propertyFilter, filter);\r\n } else {\r\n $localStorage.propertyFilter = filter;\r\n }\r\n }\r\n\r\n blade.isLoading = false;\r\n initialize(blade.currentEntity);\r\n }]);\r\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.propertySelectorController', ['$scope', 'platformWebApp.bladeNavigationService', function ($scope, bladeNavigationService) {\n var blade = $scope.blade;\n blade.existingFilteredProperties = [];\n blade.isLoading = true;\n const maxPreviewFiltersCount = 10;\n\n function initializeBlade() {\n blade.title = 'catalog.blades.property-selector.title';\n blade.headIcon = 'fa fa-folder';\n\n var allProperties = angular.copy(blade.properties);\n\n allProperties = _.sortBy(allProperties, 'group', 'name');\n\n blade.existingFilteredProperties = _.first(blade.selectedProperties, maxPreviewFiltersCount);\n if (blade.existingFilteredProperties.length >= maxPreviewFiltersCount) {\n blade.existingFilteredProperties.push('...');\n }\n\n var selectedProperties = _.sortBy(_.filter(allProperties,\n function (property) { return blade.selectedProperties.includes(property.name.toLowerCase()); }), 'name');\n\n\n blade.allEntities = _.groupBy(allProperties, 'group');\n blade.selectedEntities = _.groupBy(selectedProperties, 'group');\n\n blade.isLoading = false;\n \n }\n\n $scope.selectAllInGroup = function (groupKey) {\n blade.selectedEntities[groupKey] = blade.allEntities[groupKey];\n }\n\n $scope.clearAllInGroup = function (groupKey) {\n blade.selectedEntities[groupKey] = [];\n }\n\n $scope.sortSelected = function (groupKey) {\n blade.selectedEntities[groupKey] = _.sortBy(blade.selectedEntities[groupKey], 'name');\n }\n\n $scope.cancelChanges = function () {\n bladeNavigationService.closeBlade(blade);\n }\n\n $scope.isValid = function () {\n return _.some(blade.selectedEntities, function (item) { return item.length; })\n || $scope.hasChangedProperties(blade.properties);\n }\n\n $scope.hasChangedProperties = function (properties) {\n return _.filter(properties,\n function (prop) {\n return prop.isChanged;\n }).length > 0;\n };\n\n $scope.saveChanges = function () {\n var includedProperties = _.flatten(_.map(blade.selectedEntities, _.values));\n\n if (blade.onSelected) {\n blade.onSelected(includedProperties);\n bladeNavigationService.closeBlade(blade);\n }\n };\n\n initializeBlade();\n\n }]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.propertyTypeListController', ['$scope', 'platformWebApp.bladeNavigationService',\n function ($scope, bladeNavigationService) {\n var blade = $scope.blade;\n blade.title = \"catalog.blades.property-type-list.title\";\n blade.subtitle = \"catalog.blades.property-type-list.subtitle\";\n\n blade.selectedType = null;\n\n blade.refresh = function () {\n blade.parentBlade.refresh();\n };\n\n blade.createProperty = function (propertyType) {\n blade.selectedType = propertyType;\n\n var newBlade = {\n id: 'editCategoryProperty',\n currentEntityId: undefined,\n categoryId: blade.categoryId,\n catalogId: blade.catalogId,\n defaultLanguage: blade.defaultLanguage,\n languages: blade.languages,\n propertyType: propertyType,\n controller: 'virtoCommerce.catalogModule.propertyDetailController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/property-detail.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n }\n\n blade.toolbarCommands = [\n {\n name: \"platform.commands.cancel\",\n icon: 'fas fa-ban',\n executeMethod: function () {\n bladeNavigationService.closeBlade(blade);\n },\n canExecuteMethod: function () {\n return true;\n }\n }\n ];\n\n function initialize() {\n blade.availablePropertyTypes = [{\n typeName: \"Category\",\n icon: \"fas fa-folder\"\n },\n {\n typeName: \"Product\",\n icon: \"fas fa-sliders-h\"\n },\n {\n typeName: \"Variation\",\n icon: \"fas fa-box-open\"\n }]\n\n if (blade.catalogId) {\n blade.availablePropertyTypes.unshift({\n typeName: \"Catalog\",\n icon: \"fas fa-archive\"\n });\n }\n\n blade.isLoading = false;\n }\n\n initialize();\n }]);\n","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.propertyTypeController', ['$scope', function ($scope) {\n $scope.selectOption = function (option) {\n $scope.blade.parentBlade.currentEntity.type = option; \n $scope.bladeClose();\n };\n\n $scope.blade.headIcon = 'fa fa-gear';\n $scope.blade.isLoading = false;\n}]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.propertyValidationRulesController', ['$scope', function ($scope) {\n var blade = $scope.blade;\n var rule = _.first(blade.parentBlade.currentEntity.validationRules) || {};\n\n blade.propertyValidationRule = {\n id: rule.id,\n required: blade.parentBlade.currentEntity.required,\n isLimited: rule.charCountMin != null || rule.charCountMax != null,\n isSpecificPattern: rule.regExp != null,\n charCountMin: rule.charCountMin,\n charCountMax: rule.charCountMax,\n selectedLimit: 'between',\n characterLimit: ['between', 'at-least', 'not-more-than'],\n validationPatterns: [\n {\n name: 'custom',\n pattern: \"\"\n },\n {\n name: \"email\",\n pattern: \"^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$\"\n },\n {\n name: \"url\",\n pattern: \"https?:\\\\/\\\\/(www\\\\.)?[-a-zA-Z0-9@:%._\\\\+~#=]{2,256}\\\\.[a-z]{2,6}\\\\b([-a-zA-Z0-9@:%_\\\\+.~#?&//=]*)\"\n },\n {\n name: \"date\",\n pattern: \"(0[1-9]|[12][0-9]|3[01])[ \\.-](0[1-9]|1[012])[ \\.-](19|20|)\\d\\d\"\n }\n ],\n selectedPattern: { name: 'custom', pattern: rule.regExp },\n pattern: rule.regExp\n };\n\n if (rule.charCountMin && !rule.charCountMax)\n blade.propertyValidationRule.selectedLimit = 'at-least';\n else if (!rule.charCountMin && rule.charCountMax)\n blade.propertyValidationRule.selectedLimit = 'not-more-than';\n else if (rule.charCountMin && rule.charCountMax)\n blade.propertyValidationRule.selectedLimit = 'between';\n\n blade.isLoading = false;\n\n $scope.saveChanges = function () {\n blade.parentBlade.currentEntity.required = blade.propertyValidationRule.required;\n blade.parentBlade.currentEntity.validationRules = [{\n id: blade.propertyValidationRule.id,\n charCountMin: blade.propertyValidationRule.isLimited && blade.propertyValidationRule.selectedLimit !== 'not-more-than' ? blade.propertyValidationRule.charCountMin : null,\n charCountMax: blade.propertyValidationRule.isLimited && blade.propertyValidationRule.selectedLimit !== 'at-least' ? blade.propertyValidationRule.charCountMax : null,\n regExp: blade.propertyValidationRule.isSpecificPattern ? blade.propertyValidationRule.selectedPattern.pattern : null\n }];\n blade.parentBlade.currentEntity.validationRule = blade.parentBlade.currentEntity.validationRules[0];\n $scope.bladeClose();\n };\n\n var formScope;\n $scope.setForm = function (form) {\n formScope = form;\n };\n $scope.$watch('blade.propertyValidationRule', function () {\n $scope.isValid = formScope && formScope.$valid;\n }, true);\n\n }]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.editPropertiesActionStepController', ['$scope', 'virtoCommerce.catalogModule.properties', 'platformWebApp.bladeNavigationService', 'virtoCommerce.catalogModule.propDictItems', 'virtoCommerce.customerModule.members', 'platformWebApp.settings', 'virtoCommerce.coreModule.packageType.packageTypeUtils', function ($scope, properties, bladeNavigationService, propDictItems, members, settings, packageTypeUtils) {\n var blade = $scope.blade;\n $scope.isValid = true;\n blade.refresh = function () {\n blade.parentBlade.refresh();\n };\n\n function initialize() {\n \n blade.subtitle = 'catalog.blades.property-list.subtitle';\n\n blade.currentEntities = angular.copy(blade.properties);\n _.each(blade.currentEntities,\n function(prop) {\n if (prop.required) {\n $scope.isValid = false;\n }\n });\n\n initVendors();\n blade.taxTypes = settings.getValues({ id: 'VirtoCommerce.Core.General.TaxTypes' });\n blade.weightUnits = settings.getValues({ id: 'VirtoCommerce.Core.General.WeightUnits' });\n blade.measureUnits = settings.getValues({ id: 'VirtoCommerce.Core.General.MeasureUnits' });\n blade.packageTypes = packageTypeUtils.getPackageTypes();\n };\n\n $scope.saveChanges = function () {\n if (blade.onSelected) {\n blade.onSelected(blade.currentEntities);\n }\n $scope.bladeClose();\n };\n\n $scope.getPropertyDisplayName = function (prop) {\n return _.first(_.map(_.filter(prop.displayNames, function (x) { return x && x.languageCode.startsWith(blade.defaultLanguage); }), function (x) { return x.name; }));\n };\n\n $scope.getPropValues = function (propId, keyword, countToSkip, countToTake) {\n return propDictItems.search({\n propertyIds: [propId],\n searchPhrase: keyword,\n skip: countToSkip,\n take: countToTake\n }).$promise.then(function (result) {\n return result;\n });\n };\n\n var formScope;\n $scope.setForm = function (form) {\n formScope = form;\n }\n\n $scope.$watch(\"blade.currentEntities\", function () {\n $scope.isValid = formScope ? formScope.$valid : $scope.isValid;\n }, true);\n\n //Property with own UI \n $scope.$watch('blade.vendor', function(newValues) {\n $scope.isValid = formScope ? formScope.$valid : $scope.isValid;\n if (blade.currentEntities) {\n var vendor = _.find(blade.vendors, function(item) { return item.id === newValues });\n var vendorProp = _.find(blade.currentEntities, function(prop) { return prop.name === 'Vendor' });\n if (vendorProp && vendor) {\n vendorProp.values = [{ valueId: vendor.id, value: vendor.name }];\n }\n }\n });\n\n $scope.$watch('blade.taxType', function (newValues) {\n $scope.isValid = formScope ? formScope.$valid : $scope.isValid;\n $scope.updatePropertyValue('TaxType', newValues);\n });\n\n $scope.$watch('blade.weightUnit', function (newValues) {\n $scope.isValid = formScope ? formScope.$valid : $scope.isValid;\n $scope.updatePropertyValue('WeightUnit', newValues);\n });\n\n $scope.$watch('blade.packageType', function (newValues) {\n $scope.isValid = formScope ? formScope.$valid : $scope.isValid;\n $scope.updatePropertyValue('PackageType', newValues);\n });\n\n $scope.$watch('blade.measureUnit', function (newValues) {\n $scope.isValid = formScope ? formScope.$valid : $scope.isValid;\n $scope.updatePropertyValue('MeasureUnit', newValues);\n });\n\n $scope.updatePropertyValue = function(propName, newValue) {\n if (blade.currentEntities) {\n var prop = _.find(blade.currentEntities, function (prop) { return prop.name === propName && !prop.id; });\n if (prop) {\n prop.values = [{ value: newValue }];\n }\n }\n };\n\n\n blade.headIcon = 'fa fa-gear';\n blade.toolbarCommands = blade.toolbarCommands || [];\n blade.isLoading = false;\n initialize();\n\n function initVendors() {\n members.search({ memberType: 'Vendor', sort: 'name:asc', take: 1000 }, function (data) {\n blade.vendors = data.results;\n });\n }\n }]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.propertiesSelectorController', ['$scope', 'platformWebApp.bladeNavigationService', function ($scope, bladeNavigationService) {\n var blade = $scope.blade;\n\n blade.isLoading = true;\n\n function initializeBlade() {\n blade.title = 'Select properties for edit';\n blade.headIcon = 'fa fa-folder';\n\n var allProperties = angular.copy(blade.properties);\n allProperties = _.sortBy(allProperties, 'group', 'name');\n var selectedProperties = angular.copy(blade.includedProperties);\n selectedProperties = _.sortBy(selectedProperties, 'name');\n blade.allEntities = _.groupBy(allProperties, 'group');\n blade.selectedEntities = _.groupBy(selectedProperties, 'group');\n blade.isLoading = false;\n }\n\n $scope.selectAllInGroup = function (groupKey) {\n blade.selectedEntities[groupKey] = blade.allEntities[groupKey];\n }\n\n $scope.clearAllInGroup = function (groupKey) {\n blade.selectedEntities[groupKey] = [];\n }\n\n $scope.sortSelected = function (groupKey) {\n blade.selectedEntities[groupKey] = _.sortBy(blade.selectedEntities[groupKey], 'name');\n }\n\n $scope.cancelChanges = function () {\n bladeNavigationService.closeBlade(blade);\n }\n\n $scope.isValid = function () {\n return _.some(blade.selectedEntities, function (item) { return item.length; });\n }\n\n $scope.saveChanges = function () {\n var includedProperties = _.flatten(_.map(blade.selectedEntities, _.values));\n if (blade.onSelected) {\n blade.onSelected(includedProperties);\n bladeNavigationService.closeBlade(blade);\n }\n };\n\n initializeBlade();\n\n }]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.videoAddController',\n ['$scope', '$resource', 'platformWebApp.bladeNavigationService', 'virtoCommerce.catalogModule.videos',\n function ($scope, $resource, bladeNavigationService, videos) {\n var blade = $scope.blade;\n var parentBlade = blade.parentBlade;\n\n blade.headIcon = 'fab fa-youtube';\n blade.title = 'catalog.blades.video-add.title';\n blade.subtitle = 'catalog.blades.video-add.subtitle';\n\n blade.refresh = function () {\n blade.isLoading = false;\n };\n\n var currentForm;\n $scope.setForm = function (form) {\n currentForm = form;\n };\n\n function canCreate() {\n return currentForm && currentForm.$valid;\n }\n\n function createVideo() {\n blade.isLoading = true;\n videos.create({\n contentUrl: blade.currentEntity.contentUrl,\n languageCode: blade.defaultLanguage.languageCode,\n ownerId: blade.owner.id,\n ownerType: blade.ownerType\n },\n function (data) {\n blade.isLoading = false;\n $scope.bladeClose(function () {\n var newBlade = {\n id: 'videoDetail',\n isNew: true,\n currentEntity: data,\n controller: 'virtoCommerce.catalogModule.videoDetailController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/video-detail.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, parentBlade);\n });\n },\n function (error) {\n blade.isLoading = false;\n if (!error.statusText && error.data)\n error.statusText = error.data.message;\n bladeNavigationService.setError(error, blade);\n });\n }\n\n blade.toolbarCommands = [\n {\n name: 'catalog.blades.video-add.create',\n icon: 'fas fa-check',\n executeMethod: function () {\n createVideo();\n },\n canExecuteMethod: function () {\n return canCreate();\n }\n }\n ];\n\n blade.refresh();\n }]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.videoDetailController',\n ['$scope', 'platformWebApp.bladeNavigationService', 'platformWebApp.dialogService', 'platformWebApp.settings', 'virtoCommerce.catalogModule.videos',\n function ($scope, bladeNavigationService, dialogService, settings, videos) {\n var blade = $scope.blade;\n var parentBlade = blade.parentBlade;\n blade.updatePermission = 'catalog:update';\n blade.headIcon = 'fab fa-youtube';\n blade.title = 'catalog.blades.video-detail.title';\n blade.subtitle = 'catalog.blades.video-detail.subtitle';\n\n $scope.languages = [];\n var languagesPromise = settings.getValues({ id: 'VirtoCommerce.Core.General.Languages' }).$promise;\n\n blade.refresh = function (parentRefresh) {\n blade.isLoading = true;\n\n languagesPromise.then(function (data) {\n $scope.languages = data;\n });\n\n initialize(blade.currentEntity);\n if (parentRefresh && blade.parentBlade) {\n blade.parentBlade.refresh(parentRefresh);\n }\n };\n\n function initialize(item) {\n blade.currentEntity = angular.copy(item);\n blade.origEntity = item;\n blade.isLoading = false;\n }\n\n // datepicker\n blade.datepickers = {};\n blade.open = function ($event, which) {\n $event.preventDefault();\n $event.stopPropagation();\n blade.datepickers[which] = true;\n };\n\n function saveChanges() {\n blade.isLoading = true;\n var promise = saveOrUpdate();\n promise.catch(function (error) {\n bladeNavigationService.setError(error, blade);\n }).finally(function () {\n blade.isLoading = false;\n });\n }\n\n function saveOrUpdate() {\n return videos.save([blade.currentEntity], function (data) {\n blade.isNew = false;\n blade.currentEntityId = data[0].id;\n blade.currentEntity.Id = blade.currentEntityId;\n blade.refresh(true);\n }).$promise;\n }\n\n function deleteEntry() {\n var dialog = {\n id: \"confirmDelete\",\n title: \"catalog.dialogs.video-delete.title\",\n message: \"catalog.dialogs.video-delete.message\",\n callback: function (remove) {\n if (remove) {\n blade.isLoading = true;\n videos.remove({ ids: [blade.currentEntityId] }, function () {\n bladeNavigationService.closeBlade(blade, function () {\n if (parentBlade)\n parentBlade.refresh(true);\n });\n });\n }\n }\n };\n dialogService.showConfirmationDialog(dialog);\n }\n\n var currentForm;\n $scope.setForm = function (form) {\n currentForm = form;\n };\n\n $scope.saveChanges = function () {\n bladeNavigationService.setError(null, blade);\n saveChanges();\n };\n\n function isDirty() {\n return (blade.isNew || !angular.equals(blade.currentEntity, blade.origEntity)) && blade.hasUpdatePermission();\n }\n\n function canSave() {\n return isDirty() && currentForm && currentForm.$valid;\n }\n\n blade.onClose = function (closeCallback) {\n bladeNavigationService.showConfirmationIfNeeded(isDirty(), canSave(), blade, $scope.saveChanges, closeCallback, \"catalog.dialogs.video-save.title\", \"catalog.dialogs.video-save.message\");\n };\n\n blade.toolbarCommands = [\n {\n name: \"platform.commands.save\",\n icon: 'fa fa-save',\n permission: blade.updatePermission,\n executeMethod: function () {\n saveChanges();\n },\n canExecuteMethod: function () {\n return canSave();\n }\n },\n {\n name: \"platform.commands.reset\",\n icon: 'fa fa-undo',\n executeMethod: function () {\n angular.copy(blade.origEntity, blade.currentEntity);\n },\n canExecuteMethod: isDirty\n },\n {\n name: \"platform.commands.delete\",\n icon: 'fa fa-trash-o',\n permission: blade.updatePermission,\n executeMethod: deleteEntry,\n canExecuteMethod: function () {\n return !blade.isNew;\n }\n }\n ];\n\n blade.refresh();\n }]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.videoListController',\n ['$scope', '$translate', '$timeout', 'platformWebApp.bladeNavigationService', 'platformWebApp.bladeUtils', 'platformWebApp.dialogService', 'platformWebApp.uiGridHelper', 'virtoCommerce.catalogModule.videos', 'platformWebApp.settings',\n function ($scope, $translate, $timeout, bladeNavigationService, bladeUtils, dialogService, uiGridHelper, videos, settings) {\n var blade = $scope.blade;\n blade.updatePermission = 'catalog:update';\n blade.headIcon = 'fab fa-youtube';\n blade.title = 'catalog.blades.video-list.title';\n blade.subtitle = 'catalog.blades.video-list.subtitle';\n\n blade.getSearchCriteria = function () {\n return angular.extend(filter, {\n searchPhrase: filter.keyword ? filter.keyword : undefined,\n sort: uiGridHelper.getSortExpression($scope),\n skip: ($scope.pageSettings.currentPage - 1) * $scope.pageSettings.itemsPerPageCount,\n take: $scope.pageSettings.itemsPerPageCount\n });\n };\n\n blade.isCopyIdMenuVisible = false;\n settings.getValues({ id: 'Catalog.AllowToCopyID' }, function (data) {\n if (data && data.length > 0) {\n blade.isCopyIdMenuVisible = data[0];\n }\n });\n\n blade.refresh = function () {\n blade.isLoading = true;\n videos.options(null,\n function (data) {\n blade.videoOptions = data;\n },\n function (error) {\n bladeNavigationService.setError(error, blade);\n });\n videos.search(blade.getSearchCriteria(),\n function (data) {\n blade.isLoading = false;\n $scope.pageSettings.totalItems = data.totalCount;\n blade.currentEntities = data.results;\n },\n function (error) {\n bladeNavigationService.setError(error, blade);\n });\n };\n\n // simple and advanced filtering\n var filter = $scope.filter = blade.filter || {\n ownerIds: [blade.owner.id],\n ownerType: blade.ownerType\n };\n\n filter.criteriaChanged = function () {\n if ($scope.pageSettings.currentPage > 1) {\n $scope.pageSettings.currentPage = 1;\n } else {\n blade.refresh();\n }\n };\n\n $scope.toggleImageSelect = function(e, item) {\n if (e.ctrlKey === 1) {\n item.$selected = !item.$selected;\n } else {\n if (item.$selected) {\n item.$selected = false;\n } else {\n item.$selected = true;\n }\n }\n };\n\n $scope.copyItemID = function (data) {\n navigator.clipboard.writeText(data.id).then().catch(e => console.error(e));\n };\n\n $scope.edit = function(item) {\n var newBlade = {\n id: 'videoDetail',\n currentEntityId: item.id,\n currentEntity: item,\n controller: 'virtoCommerce.catalogModule.videoDetailController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/video-detail.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n blade.selectNode = function(item) {\n $scope.selectedNodeId = item.id;\n }\n\n $scope.delete = function (item) {\n deleteList([item], true);\n };\n\n function deleteList (selection, single) {\n var dialog = {\n id: \"confirmDelete\",\n title: single ? \"catalog.dialogs.video-delete.title\" : \"catalog.dialogs.video-list-delete.title\",\n message: single ? \"catalog.dialogs.video-delete.message\" : \"catalog.dialogs.video-list-delete.message\",\n callback: function (remove) {\n if (remove) {\n blade.isLoading = true;\n videos.remove({ ids: selection.map(item => item.id) },\n function () {\n blade.refresh();\n },\n function (error) {\n bladeNavigationService.setError(error, blade);\n });\n }\n }\n };\n dialogService.showConfirmationDialog(dialog);\n }\n\n function addVideo() {\n var newBlade = {\n id: 'videoAdd',\n owner: blade.owner,\n ownerType: blade.ownerType,\n videoOptions: blade.videoOptions,\n defaultLanguage: blade.catalog.defaultLanguage,\n controller: 'virtoCommerce.catalogModule.videoAddController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/video-add.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n }\n\n blade.toolbarCommands = [\n {\n name: \"platform.commands.refresh\", icon: 'fa fa-refresh',\n executeMethod: blade.refresh,\n canExecuteMethod: function () {\n return true;\n }\n },\n {\n name: \"platform.commands.add\",\n icon: 'fa fa-plus',\n permission: blade.updatePermission,\n executeMethod: function() {\n addVideo();\n },\n canExecuteMethod: function () {\n return blade.owner && blade.ownerType;\n }\n },\n {\n name: \"platform.commands.delete\",\n icon: 'fa fa-trash-o',\n permission: blade.updatePermission,\n executeMethod: function() { deleteList($scope.gridApi.selection.getSelectedRows()); },\n canExecuteMethod: function() {\n return blade.currentEntities && $scope.gridApi && _.any($scope.gridApi.selection.getSelectedRows());\n }\n },\n ];\n\n var priorityChanged = function(data) {\n blade.isLoading = true;\n videos.save([data.rowEntity],\n function (resp) {\n blade.refresh();\n },\n function (error) {\n bladeNavigationService.setError(error, blade);\n });\n };\n\n // ui-grid\n $scope.setGridOptions = function (gridOptions) {\n uiGridHelper.initialize($scope, gridOptions, function (gridApi) {\n gridApi.edit.on.afterCellEdit($scope,\n function(rowEntity, colDef, newValue, oldValue) {\n if (newValue !== oldValue) {\n var data = {\n rowEntity: rowEntity,\n colDef: colDef,\n gridApi: gridApi\n };\n $timeout(priorityChanged, 100, true, data);\n }\n });\n uiGridHelper.bindRefreshOnSortChanged($scope);\n });\n bladeUtils.initializePagination($scope);\n };\n\n $scope.priorityValid = function(entity) {\n return !_.isUndefined(entity.sortOrder) && entity.sortOrder >= 0;\n };\n\n $scope.isValid = true;\n\n $scope.$watch(\"blade.currentEntities\",\n function(data) {\n var result = _.all(blade.currentEntities, $scope.priorityValid);\n return $scope.isValid = result;\n },\n true);\n }])\n .run(['platformWebApp.ui-grid.extension', 'uiGridValidateService', function(uiGridExtension, uiGridValidateService) {\n uiGridValidateService.setValidator('minPriorityValidator',\n () => (oldValue, newValue) => newValue >= 0,\n () => 'Priority value should be equal or more than zero');\n }\n ]);\n","angular.module('virtoCommerce.catalogModule')\r\n .controller('virtoCommerce.catalogModule.virtualCatalogDetailController', ['$scope', 'platformWebApp.bladeNavigationService', 'virtoCommerce.catalogModule.catalogs', 'platformWebApp.metaFormsService', function ($scope, bladeNavigationService, catalogs, metaFormsService) {\r\n var blade = $scope.blade;\r\n blade.updatePermission = 'catalog:update';\r\n\r\n blade.metaFields = metaFormsService.getMetaFields(\"catalogDetail\");\r\n\r\n blade.refresh = function (parentRefresh) {\r\n if (blade.isNew) {\r\n initializeBlade(blade.currentEntity);\r\n } else {\r\n catalogs.get({ id: blade.currentEntityId }, function (data) {\r\n initializeBlade(data);\r\n\r\n if (blade.childrenBlades) {\r\n _.each(blade.childrenBlades, function (x) {\r\n if (x.refresh) {\r\n x.refresh(blade.currentEntity);\r\n }\r\n });\r\n }\r\n\r\n if (parentRefresh) {\r\n blade.parentBlade.refresh();\r\n }\r\n });\r\n }\r\n };\r\n\r\n function initializeBlade(data) {\r\n if (!blade.isNew) {\r\n blade.title = data.name;\r\n }\r\n\r\n blade.currentEntity = angular.copy(data);\r\n blade.origEntity = data;\r\n blade.isLoading = false;\r\n blade.securityScopes = data.securityScopes;\r\n }\r\n\r\n function isDirty() {\r\n return !angular.equals(blade.currentEntity, blade.origEntity) && blade.hasUpdatePermission();\r\n }\r\n\r\n function canSave() {\r\n return isDirty() && formScope && formScope.$valid;\r\n }\r\n\r\n var formScope;\r\n $scope.setForm = function (form) { formScope = form; }\r\n\r\n $scope.cancelChanges = function () {\r\n angular.copy(blade.origEntity, blade.currentEntity);\r\n $scope.bladeClose();\r\n };\r\n $scope.saveChanges = function () {\r\n blade.isLoading = true;\r\n\r\n if (blade.isNew) {\r\n catalogs.save({}, blade.currentEntity, function (data) {\r\n blade.isNew = undefined;\r\n blade.currentEntityId = data.id;\r\n initializeBlade(data);\r\n initializeToolbar();\r\n blade.refresh(true);\r\n }, function (error) {\r\n bladeNavigationService.setError('Error ' + error.status, blade);\r\n });\r\n }\r\n else {\r\n catalogs.update({}, blade.currentEntity, function (data) {\r\n blade.refresh(true);\r\n }, function (error) {\r\n bladeNavigationService.setError('Error ' + error.status, blade);\r\n });\r\n }\r\n };\r\n\r\n blade.onClose = function (closeCallback) {\r\n bladeNavigationService.showConfirmationIfNeeded(isDirty(), canSave(), blade, $scope.saveChanges, closeCallback, \"catalog.dialogs.virtual-catalog-save.title\", \"catalog.dialogs.virtual-catalog-save.message\");\r\n };\r\n\r\n function initializeToolbar() {\r\n if (!blade.isNew) {\r\n blade.toolbarCommands = [\r\n {\r\n name: \"platform.commands.save\", icon: 'fas fa-save',\r\n executeMethod: function () {\r\n $scope.saveChanges();\r\n },\r\n canExecuteMethod: canSave,\r\n permission: blade.updatePermission\r\n },\r\n {\r\n name: \"platform.commands.reset\", icon: 'fa fa-undo',\r\n executeMethod: function () {\r\n angular.copy(blade.origEntity, blade.currentEntity);\r\n },\r\n canExecuteMethod: isDirty,\r\n permission: blade.updatePermission\r\n }\r\n ];\r\n }\r\n }\r\n\r\n initializeToolbar();\r\n blade.refresh(false);\r\n }]);\r\n","angular.module('virtoCommerce.catalogModule')\r\n .controller('virtoCommerce.catalogModule.catalogItemSelectController', ['$scope', 'virtoCommerce.catalogModule.catalogs', 'virtoCommerce.catalogModule.listEntries', 'platformWebApp.bladeUtils', 'uiGridConstants', 'platformWebApp.uiGridHelper', 'platformWebApp.ui-grid.extension', '$timeout',\r\n function ($scope, catalogs, listEntries, bladeUtils, uiGridConstants, uiGridHelper, gridOptionExtension, $timeout) {\r\n var blade = $scope.blade;\r\n var bladeNavigationService = bladeUtils.bladeNavigationService;\r\n\r\n if (!blade.title) {\r\n blade.title = \"Select Catalog items...\";\r\n }\r\n\r\n $scope.options = angular.extend({\r\n showCheckingMultiple: true,\r\n allowCheckingItem: true,\r\n allowCheckingCategory: false,\r\n withProducts: true,\r\n selectedItemIds: [],\r\n gridColumns: []\r\n }, blade.options);\r\n\r\n blade.refresh = function () {\r\n blade.isLoading = true;\r\n filter.searchedKeyword = filter.keyword;\r\n\r\n if (!$scope.isCatalogSelectMode()) {\r\n listEntries.listitemssearch(\r\n angular.extend({\r\n catalogId: blade.catalogId,\r\n categoryId: blade.categoryId,\r\n keyword: filter.keyword,\r\n searchInVariations : filter.searchInVariations ? filter.searchInVariations : false,\r\n responseGroup: $scope.options.withProducts ? 'withCategories, withProducts' : 'withCategories',\r\n objectTypes: $scope.options.withProducts ? undefined : ['Category'],\r\n excludeProductType: $scope.options.excludeProductType,\r\n sort: uiGridHelper.getSortExpression($scope),\r\n skip: ($scope.pageSettings.currentPage - 1) * $scope.pageSettings.itemsPerPageCount,\r\n take: $scope.pageSettings.itemsPerPageCount\r\n }, blade.searchCriteria),\r\n function (data, headers) {\r\n blade.isLoading = false;\r\n $scope.pageSettings.totalItems = data.totalCount;\r\n $scope.items = data.listEntries;\r\n if ($scope.options.onItemsLoaded) {\r\n $scope.options.onItemsLoaded(data.listEntries);\r\n }\r\n\r\n //Set navigation breadcrumbs\r\n setBreadcrumbs();\r\n\r\n });\r\n }\r\n else {\r\n //ToDo: Apply Infinite scrolling\r\n catalogs.search({take: 1000}, function (data) {\r\n blade.isLoading = false;\r\n\r\n if ($scope.options.isVirtual === undefined) {\r\n $scope.items = data.results;\r\n } else {\r\n $scope.items = _.where(data.results, { isVirtual: $scope.options.isVirtual });\r\n }\r\n\r\n $scope.pageSettings.totalItems = $scope.items.length;\r\n\r\n if ($scope.options.onCatalogsLoaded) {\r\n $scope.options.onCatalogsLoaded($scope.items);\r\n }\r\n\r\n //Set navigation breadcrumbs\r\n setBreadcrumbs();\r\n });\r\n }\r\n };\r\n\r\n //Breadcrumbs\r\n function setBreadcrumbs() {\r\n //Clone array (angular.copy leave a same reference)\r\n blade.breadcrumbs = blade.breadcrumbs.slice(0);\r\n\r\n //catalog breadcrumb by default\r\n var breadCrumb = {\r\n id: blade.catalogId ? blade.catalogId : \"All\",\r\n name: blade.catalog ? blade.catalog.name : \"catalog.blades.catalog-items-select.bread-crumb-top\",\r\n blade: $scope.blade\r\n };\r\n\r\n //if category need change to category breadcrumb\r\n if (blade.category) {\r\n\r\n breadCrumb.id = blade.categoryId;\r\n breadCrumb.name = blade.category.name;\r\n }\r\n\r\n //prevent duplicate items\r\n if (!_.some(blade.breadcrumbs, function (x) { return x.id === breadCrumb.id })) {\r\n blade.breadcrumbs.push(breadCrumb);\r\n }\r\n\r\n breadCrumb.navigate = function (breadcrumb) {\r\n bladeNavigationService.closeBlade($scope.blade,\r\n function () {\r\n if (breadcrumb.id === \"All\") {\r\n blade.catalogId = null;\r\n blade.filter.keyword = null;\r\n }\r\n bladeNavigationService.showBlade($scope.blade, blade.parentBlade);\r\n });\r\n };\r\n }\r\n\r\n $scope.isCatalogSelectMode = function () {\r\n return !blade.catalogId && !filter.searchedKeyword;\r\n };\r\n\r\n $scope.selectItem = function (e, listItem) {\r\n //if ($scope.selectedNodeId == listItem.id)\r\n // return;\r\n\r\n $scope.selectedNodeId = listItem.id;\r\n //call callback function\r\n if ($scope.options.selectItemFn) {\r\n $scope.options.selectItemFn(listItem);\r\n }\r\n \r\n var newBlade = {\r\n id: blade.id,\r\n breadcrumbs: blade.breadcrumbs,\r\n catalogId: blade.catalogId,\r\n catalog: blade.catalog,\r\n controller: blade.controller,\r\n template: blade.template,\r\n options: $scope.options,\r\n searchCriteria: blade.searchCriteria,\r\n toolbarCommands: blade.toolbarCommands\r\n };\r\n\r\n if ($scope.isCatalogSelectMode()) {\r\n newBlade.catalogId = listItem.id;\r\n newBlade.catalog = listItem;\r\n\r\n // switch template option\r\n if ($scope.options.getBladeForCategories) {\r\n var customCategoriesBlade = $scope.options.getBladeForCategories(listItem, newBlade);\r\n if (customCategoriesBlade) {\r\n newBlade = customCategoriesBlade;\r\n }\r\n }\r\n\r\n bladeNavigationService.closeBlade(blade, function () {\r\n bladeNavigationService.showBlade(newBlade, blade.parentBlade);\r\n });\r\n\r\n // setting current catalog to be globally available \r\n bladeNavigationService.catalogsSelectedCatalog = listItem;\r\n bladeNavigationService.catalogsSelectedCategoryId = undefined;\r\n }\r\n else if (listItem.type === 'category') {\r\n newBlade.categoryId = listItem.id;\r\n newBlade.category = listItem;\r\n\r\n bladeNavigationService.closeBlade(blade, function () {\r\n bladeNavigationService.showBlade(newBlade, blade.parentBlade);\r\n });\r\n }\r\n else {\r\n //default blade for product details\r\n newBlade = {\r\n id: \"listItemDetail\",\r\n itemId: listItem.id,\r\n productType: listItem.productType,\r\n title: listItem.name,\r\n catalog: blade.catalog,\r\n variationsToolbarCommandsAndEvents: { toolbarCommands: blade.toolbarCommands, externalRegisterApiCallback: externalRegisterApiCallback },\r\n controller: 'virtoCommerce.catalogModule.itemDetailController',\r\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/item-detail.tpl.html'\r\n };\r\n\r\n //extension point allows to use custom views for product details\r\n if ($scope.options.fnGetBladeForItem) {\r\n var customBlade = $scope.options.fnGetBladeForItem(listItem);\r\n if (customBlade) {\r\n newBlade = customBlade;\r\n }\r\n }\r\n \r\n bladeNavigationService.showBlade(newBlade, blade);\r\n\r\n // setting current categoryId to be globally available\r\n bladeNavigationService.catalogsSelectedCategoryId = blade.categoryId;\r\n }\r\n };\r\n\r\n // simple and advanced filtering\r\n\r\n var filter = blade.filter = blade.filter || { keyword: '' };\r\n\r\n filter.criteriaChanged = function () {\r\n if ($scope.pageSettings.currentPage > 1) {\r\n $scope.pageSettings.currentPage = 1;\r\n } else {\r\n blade.refresh();\r\n }\r\n };\r\n\r\n $scope.setGridOptions = function (gridId, gridOptions) {\r\n gridOptions.isRowSelectable = angular.isFunction($scope.options.isItemSelectable)\r\n ? function(row) {\r\n return $scope.options.isItemSelectable(row.entity);\r\n }\r\n : function(row) {\r\n return $scope.options.allowCheckingItem && row.entity.type !== 'category' ||\r\n $scope.options.allowCheckingCategory && row.entity.type === 'category';\r\n };\r\n\r\n gridOptions.columnDefs = gridOptions.columnDefs.concat($scope.options.gridColumns);\r\n gridOptionExtension.tryExtendGridOptions(gridId, gridOptions);\r\n uiGridHelper.initialize($scope, gridOptions, externalRegisterApiCallback);\r\n bladeUtils.initializePagination($scope);\r\n };\r\n\r\n function externalRegisterApiCallback(gridApi) {\r\n //update gridApi for current grid\r\n $scope.gridApi = gridApi;\r\n\r\n gridApi.grid.registerDataChangeCallback(function (grid) {\r\n //check already selected rows\r\n $timeout(function () {\r\n _.each($scope.items, function (x) {\r\n if (_.some($scope.options.selectedItemIds, function (y) { return y === x.id; })) {\r\n gridApi.selection.selectRow(x);\r\n }\r\n });\r\n });\r\n }, [uiGridConstants.dataChange.ROW]);\r\n\r\n gridApi.selection.on.rowSelectionChanged($scope, function (row) {\r\n if ($scope.options.checkItemFn) {\r\n $scope.options.checkItemFn(row.entity, row.isSelected);\r\n }\r\n if (row.isSelected) {\r\n if (!_.contains($scope.options.selectedItemIds, row.entity.id)) {\r\n $scope.options.selectedItemIds.push(row.entity.id);\r\n }\r\n }\r\n else {\r\n $scope.options.selectedItemIds = _.without($scope.options.selectedItemIds, row.entity.id);\r\n }\r\n });\r\n\r\n uiGridHelper.bindRefreshOnSortChanged($scope);\r\n }\r\n}]);\r\n","angular.module('virtoCommerce.catalogModule')\n .factory('virtoCommerce.catalogModule.catalogExportService', function () {\n var retVal = {\n registrationsList: [],\n register: function (registration) {\n this.registrationsList.push(registration);\n }\n };\n return retVal;\n });","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.exporterListController', ['$scope', 'platformWebApp.bladeNavigationService', 'virtoCommerce.catalogModule.catalogExportService', function ($scope, bladeNavigationService, catalogExportService) {\n var blade = $scope.blade;\n\n $scope.selectedNodeId = null;\n\n\tfunction initializeBlade() {\n\t $scope.registrationsList = catalogExportService.registrationsList;\n\t\tblade.isLoading = false;\n\t};\n\n\t$scope.openBlade = function(data) {\n var newBlade = {};\n angular.copy(data, newBlade);\n\n newBlade.selectedCategories = blade.selectedCategories;\n newBlade.selectedProducts = blade.selectedProducts;\n newBlade.catalog = blade.catalog;\n\n if (angular.isFunction(data.onInitialize)) {\n data.onInitialize(newBlade);\n }\n\n bladeNavigationService.showBlade(newBlade, blade.parentBlade);\n }\n\n $scope.blade.headIcon = 'fa fa-upload';\n\n\tinitializeBlade();\n}]);\n","angular.module('virtoCommerce.catalogModule')\n .factory('virtoCommerce.catalogModule.catalogImportService', function () {\n var retVal = {\n registrationsList: [],\n register: function (registration) {\n this.registrationsList.push(registration);\n }\n };\n return retVal;\n });","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.importerListController', ['$scope', 'platformWebApp.bladeNavigationService', 'virtoCommerce.catalogModule.catalogImportService', function ($scope, bladeNavigationService, catalogImportService) {\n var blade = $scope.blade;\n\n\t$scope.selectedNodeId = null;\n\n\tfunction initializeBlade() {\n\t\t$scope.registrationsList = catalogImportService.registrationsList;\n\t\tblade.isLoading = false;\n\t};\n\n\t$scope.openBlade = function (data) {\n\t\tvar newBlade = {};\n\t\tangular.copy(data, newBlade);\n\t\tnewBlade.catalog = blade.catalog;\n\n\t\tbladeNavigationService.showBlade(newBlade, blade.parentBlade);\n\t}\n\n\t$scope.blade.headIcon = 'fa fa-download';\n\n\tinitializeBlade();\n}]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.linksListController',\n ['$scope', '$timeout', 'platformWebApp.bladeNavigationService', 'platformWebApp.dialogService', 'platformWebApp.bladeUtils', 'platformWebApp.uiGridHelper', 'virtoCommerce.catalogModule.listEntries',\n function ($scope, $timeout, bladeNavigationService, dialogService, bladeUtils, uiGridHelper, listEntries) {\n var blade = $scope.blade;\n\n blade.updatePermission = 'catalog:update';\n blade.headIcon = 'fas fa-link';\n blade.title = 'catalog.blades.links-list.title';\n blade.linkImage = 'Modules/$(VirtoCommerce.Catalog)/Content/images/link.svg';\n\n $scope.links = [];\n $scope.hasMore = true;\n\n blade.refresh = function () {\n blade.isLoading = true;\n\n if ($scope.pageSettings.currentPage !== 1)\n $scope.pageSettings.currentPage = 1;\n\n var searchCriteria = blade.getSearchCriteria();\n\n listEntries.searchlinks(searchCriteria, function (data) {\n setEntryPath(data.results);\n\n blade.isLoading = false;\n\n $scope.pageSettings.totalItems = data.totalCount;\n $scope.hasMore = data.results.length === $scope.pageSettings.itemsPerPageCount;\n $scope.links = data.results;\n });\n\n resetStateGrid();\n };\n\n function resetStateGrid() {\n if ($scope.gridApi) {\n $scope.links = [];\n $scope.gridApi.selection.clearSelectedRows();\n $scope.gridApi.infiniteScroll.resetScroll(true, true);\n $scope.gridApi.infiniteScroll.dataLoaded();\n }\n }\n\n function showMore() {\n if ($scope.hasMore) {\n ++$scope.pageSettings.currentPage;\n $scope.gridApi.infiniteScroll.saveScrollPercentage();\n blade.isLoading = true;\n\n var searchCriteria = blade.getSearchCriteria();\n\n listEntries.searchlinks(\n searchCriteria,\n function (data) {\n setEntryPath(data.results);\n\n blade.isLoading = false;\n\n $scope.pageSettings.totalItems = data.totalCount;\n $scope.hasMore = data.results.length === $scope.pageSettings.itemsPerPageCount;\n $scope.links = $scope.links.concat(data.results);\n\n $scope.gridApi.infiniteScroll.dataLoaded();\n\n $timeout(function () {\n if ($scope.gridApi.selection.getSelectAllState()) {\n $scope.gridApi.selection.selectAllRows();\n }\n });\n });\n }\n }\n\n var filter = $scope.filter = blade.filter || {\n objectIds: [blade.currentEntity.id],\n objectType: blade.type\n };\n\n filter.criteriaChanged = function () {\n if ($scope.pageSettings.currentPage > 1) {\n $scope.pageSettings.currentPage = 1;\n } else {\n blade.refresh();\n }\n };\n\n blade.getSearchCriteria = function () {\n return angular.extend(filter, {\n skip: ($scope.pageSettings.currentPage - 1) * $scope.pageSettings.itemsPerPageCount,\n take: $scope.pageSettings.itemsPerPageCount\n });\n };\n\n blade.toolbarCommands = [\n {\n name: \"platform.commands.add\",\n icon: 'fa fa-plus',\n permission: blade.updatePermission,\n executeMethod: function () {\n $scope.openAddLinksBlade();\n },\n canExecuteMethod: function () {\n return true;\n }\n },\n {\n name: \"platform.commands.delete\",\n icon: 'fa fa-trash-o',\n permission: blade.updatePermission,\n executeMethod: function () {\n deleteList($scope.gridApi.selection.getSelectedRows());\n },\n canExecuteMethod: function () {\n return $scope.gridApi && _.any($scope.gridApi.selection.getSelectedRows());\n }\n },\n ];\n\n function deleteList(selection) {\n var dialog = {\n id: \"confirmDelete\",\n title: \"catalog.dialogs.links-delete.title\",\n message: \"catalog.dialogs.links-delete.message\",\n callback: function (remove) {\n if (remove) {\n blade.isLoading = true;\n\n var links = _.map(selection, function (x) {\n return {\n listEntryId: blade.currentEntity.id,\n catalogId: x.catalogId,\n categoryId: x.categoryId\n };\n });\n\n listEntries.deletelinks(links,\n function () {\n blade.refresh();\n },\n function (error) {\n bladeNavigationService.setError(error, blade);\n });\n }\n }\n };\n\n dialogService.showConfirmationDialog(dialog);\n }\n\n function setEntryPath(data) {\n _.each(data, function (x) {\n var names = [];\n\n if (x.category) {\n var outline = _.first(x.category.outlines);\n if (outline) {\n names = _.pluck(outline.items, 'name');\n\n }\n }\n\n x.$$path = _.any(names) ? '\\/' + names.join(\"\\/\") : '\\/';\n });\n }\n\n $scope.openAddLinksBlade = function () {\n var selection = [];\n\n var options = {\n selectedItemIds: [],\n allowCheckingCategory: true,\n // do not display products\n withProducts: false,\n // display only virtual catalogs (only works for catalogs)\n isVirtual: true,\n // switch to select 'categories' template\n getBladeForCategories: function (listItem, categoriesBlade) {\n categoriesBlade.template = 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/links-list/categories-items-select-links.tpl.html';\n return categoriesBlade;\n },\n checkItemFn: function (listItem, isSelected) {\n if (isSelected) {\n if (!_.find(selection, function (x) { return x.id == listItem.id; })) {\n selection.push(listItem);\n }\n }\n else {\n selection = _.reject(selection, function (x) { return x.id == listItem.id; });\n }\n },\n // don't select items with 'marked' true or item with links (most likely virtual category link)\n isItemSelectable: function (item) {\n var isLinkToSameCategory = blade.type === \"Category\" ? item.id === blade.currentEntity.id : false; //prevent self-linking for categories\n return (!item.links || !item.links.length) && !item.marked && !isLinkToSameCategory;\n },\n // find linked categories to place 'Marked' mark\n onItemsLoaded: function (loadedCategories) {\n if (!loadedCategories.length)\n return;\n\n var loadedCategoriesIds = _.pluck(loadedCategories, 'id');\n\n var searchCriteria = {\n objectIds: [blade.currentEntity.id],\n objectType: blade.type,\n categoryIds: loadedCategoriesIds,\n take: loadedCategories.length\n };\n\n listEntries.searchlinks(searchCriteria, function (categoryLinks) {\n _.each(loadedCategories, function (loadedCategory) {\n loadedCategory.marked = !!_.find(categoryLinks.results, function (categoryLinkResult) {\n return categoryLinkResult.categoryId === loadedCategory.id;\n });\n });\n });\n },\n // find linked categories to place 'Marked' mark\n onCatalogsLoaded: function (loadedCatalogs) {\n if (!loadedCatalogs.length)\n return;\n\n var loadedCatalogIds = _.pluck(loadedCatalogs, 'id');\n\n var searchCriteria = {\n objectIds: [blade.currentEntity.id],\n objectType: blade.type,\n catalogIds: loadedCatalogIds,\n take: loadedCatalogs.length\n };\n\n listEntries.searchlinks(searchCriteria, function (catalogLinkData) {\n _.each(loadedCatalogs, function (loadedCatalog) {\n loadedCatalog.marked = !!_.find(catalogLinkData.results, function (catalogLinkResult) {\n return catalogLinkResult.catalogId === loadedCatalog.id;\n });\n });\n });\n }\n };\n\n var newBlade = {\n id: \"CatalogItemsSelect\",\n controller: 'virtoCommerce.catalogModule.catalogItemSelectController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/links-list/catalog-items-select-links.tpl.html',\n options: options,\n breadcrumbs: [],\n toolbarCommands: [\n {\n name: \"platform.commands.confirm\", icon: 'fa fa-check',\n executeMethod: function (selectBlade) {\n blade.isLoading = true;\n bladeNavigationService.closeBlade(selectBlade);\n\n var listEntryLinks = [];\n angular.forEach(selection, function (listItem) {\n var link = {\n listEntryId: blade.currentEntity.id,\n listEntryType: blade.type\n };\n\n if (listItem.type === 'category') {\n link.categoryId = listItem.id;\n link.catalogId = listItem.catalogId;\n }\n else {\n link.catalogId = listItem.id;\n }\n\n listEntryLinks.push(link);\n });\n\n listEntries.createlinks(listEntryLinks, function () {\n blade.refresh();\n },\n function (error) { bladeNavigationService.setError('Error ' + error.status, blade); });\n },\n canExecuteMethod: function () {\n return _.any(selection);\n }\n },\n {\n name: \"platform.commands.refresh\", icon: 'fa fa-refresh',\n executeMethod: function (selectBlade) {\n if (selectBlade.refresh) {\n selectBlade.refresh();\n }\n },\n canExecuteMethod: function () {\n return true;\n }\n }\n ]\n };\n\n bladeNavigationService.showBlade(newBlade, blade);\n }\n\n // ui-grid\n $scope.setGridOptions = function (gridOptions) {\n bladeUtils.initializePagination($scope, true);\n $scope.pageSettings.itemsPerPageCount = 50;\n\n uiGridHelper.initialize($scope, gridOptions, function (gridApi) {\n $scope.gridApi = gridApi;\n\n uiGridHelper.bindRefreshOnSortChanged($scope);\n $scope.gridApi.infiniteScroll.on.needLoadMoreData($scope, showMore);\n gridApi.grid.options.enableGridMenu = false;\n });\n\n $timeout(function () {\n blade.refresh();\n });\n };\n }]);\n","angular.module('virtoCommerce.catalogModule')\n .directive('vaDictionaryValue', function () {\n return {\n restrict: 'E',\n templateUrl: 'Modules/$(VirtoCommerce.Catalog)/Scripts/directives/dictionaryValue.tpl.html',\n require: ['^form', 'ngModel'],\n scope: {\n ngModel: \"=\",\n name: \"=\",\n form: \"=\",\n validationRules: \"=\",\n required: \"@\"\n },\n replace: true,\n transclude: true\n }\n });\n","angular.module('virtoCommerce.catalogModule').directive('vcItemSearch', ['$localStorage', 'platformWebApp.bladeNavigationService', 'virtoCommerce.catalogModule.predefinedSearchFilters', function ($localStorage, bladeNavigationService, predefinedSearchFilters) {\n return {\n restrict: 'E',\n templateUrl: function (elem, attrs) {\n return attrs.templateUrl || 'Modules/$(VirtoCommerce.Catalog)/Scripts/directives/itemSearch.tpl.html'\n },\n scope: {\n blade: '='\n },\n link: function ($scope) {\n var blade = $scope.blade;\n $scope.$localStorage = $localStorage;\n var filter = $scope.filter = blade.filter;\n\n if ($localStorage.catalogSearchFilterId && !filter.keyword && filter.keyword !== null) {\n filter.current = _.findWhere($localStorage.catalogSearchFilters, { id: $localStorage.catalogSearchFilterId });\n filter.keyword = filter.current ? filter.current.keyword : '';\n filter.searchInVariations = filter.current ? filter.current.searchInVariations : false;\n }\n\n filter.change = function (isDetailBladeOpen) {\n $localStorage.catalogSearchFilterId = filter.current ? filter.current.id : null;\n if (filter.current && !filter.current.id) {\n filter.current = null;\n showFilterDetailBlade({ isNew: true });\n } else {\n if (!isDetailBladeOpen)\n bladeNavigationService.closeBlade({ id: 'filterDetail' });\n filter.keyword = filter.current ? filter.current.keyword : '';\n filter.searchInVariations = filter.current ? filter.current.searchInVariations : false;\n filter.criteriaChanged();\n }\n };\n\n filter.edit = function ($event, entry) {\n filter.current = entry;\n showFilterDetailBlade({ data: entry });\n };\n\n function showFilterDetailBlade(bladeData) {\n var newBlade = {\n id: 'filterDetail',\n controller: 'virtoCommerce.catalogModule.filterDetailController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/filter-detail.tpl.html',\n };\n angular.extend(newBlade, bladeData);\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n filter.criteriaChanged();\n }\n }\n }]);\n","angular.module('virtoCommerce.catalogModule').\n directive('vcItemSearchCriteria', ['$localStorage', 'platformWebApp.bladeNavigationService', 'virtoCommerce.catalogModule.predefinedSearchFilters',\n function ($localStorage, bladeNavigationService, predefinedSearchFilters) {\n return {\n restrict: 'E',\n templateUrl: function (elem, attrs) {\n return attrs.templateUrl || 'Modules/$(VirtoCommerce.Catalog)/Scripts/directives/itemSearchCriteria.tpl.html'\n },\n scope: {\n blade: '='\n },\n link: function ($scope) {\n var blade = $scope.blade;\n var filter = $scope.filter = blade.filter;\n }\n }\n}]);\n","angular.module('virtoCommerce.catalogModule').directive('vaProperty2', ['$compile', '$filter', '$parse', '$templateCache', '$http', function ($compile, $filter, $parse, $templateCache, $http) {\n\n return {\n restrict: 'E',\n require: ['^form', 'ngModel'],\n replace: true,\n transclude: true,\n templateUrl: 'Modules/$(VirtoCommerce.Catalog)/Scripts/directives/property2.tpl.html',\n scope: {\n languages: \"=\",\n hiddenLanguages: \"=\",\n defaultLanguage: \"=\",\n getPropValues: \"&\",\n pageSize: \"@?\"\n },\n link: function (scope, element, attr, ctrls, linker) {\n var ngModelController = ctrls[1];\n\n scope.currentEntity = ngModelController.$modelValue;\n\n scope.context = {};\n scope.context.currentPropValues = [];\n scope.context.allDictionaryValues = [];\n scope.context.langValuesMap = {};\n scope.context.form = ctrls[0];\n\n scope.pageSize = angular.isDefined(scope.pageSize) ? scope.pageSize : 50;\n\n scope.$watch('context.langValuesMap', function (newValue, oldValue) {\n if (newValue != oldValue && !scope.currentEntity.dictionary) {\n scope.context.currentPropValues = [];\n angular.forEach(scope.context.langValuesMap, function (langGroup, languageCode) {\n angular.forEach(langGroup.currentPropValues, function (propValue) {\n propValue.languageCode = languageCode;\n scope.context.currentPropValues.push(propValue);\n });\n });\n }\n }, true);\n\n scope.$watch('context.currentPropValues', function (newValues) {\n //reflect only real changes\n var currentValues = angular.copy(scope.currentEntity.values);\n\n if (scope.currentEntity.dictionary) {\n currentValues = _.uniq(_.map(currentValues, function (x) {\n return {\n id: x.id,\n alias: x.alias,\n valueId: x.valueId,\n value: x.alias\n };\n }), function (x) { return x.valueId; });\n }\n\n if (newValues) {\n newValues = newValues.filter(x=>x);\n }\n\n if (isValuesDifferent(newValues, currentValues)) {\n scope.currentEntity.values = angular.copy(newValues);\n\n //reset inherited status to force property value override\n _.each(scope.currentEntity.values, function (x) { if (x) { x.isInherited = false;}; });\n\n ngModelController.$setViewValue(scope.currentEntity);\n }\n }, true);\n\n\n ngModelController.$render = function () {\n scope.currentEntity = ngModelController.$modelValue;\n\n scope.context.currentPropValues = angular.copy(scope.currentEntity.values);\n //For dictionary multilingual properties need to left only distinct dictionary items\n if (scope.currentEntity.dictionary) {\n scope.context.currentPropValues = _.uniq(_.map(scope.context.currentPropValues, function (x) {\n return {\n id: x.id,\n alias: x.alias,\n valueId: x.valueId,\n value: x.alias,\n selected: true\n };\n }), function (x) { return x.valueId; });\n\n }\n if (needAddEmptyValue(scope.currentEntity, scope.context.currentPropValues)) {\n scope.context.currentPropValues.push({ value: null });\n }\n\n initLanguagesValuesMap();\n\n chageValueTemplate(scope.currentEntity.valueType);\n };\n\n function isValuesDifferent(newValues, currentValues) {\n var nonNullNewValues = newValues.filter(x => x.value);\n var nonNullCurrentValues = currentValues.filter(x => x.value);\n \n var elementCountIsDifferent = nonNullNewValues.length !== nonNullCurrentValues.length;\n\n var elementsNotEqual = _.any(nonNullNewValues, function (newValue) {\n return _.all(nonNullCurrentValues, function (currentValue) {\n return !(newValue && currentValue.value === newValue.value && currentValue.languageCode === newValue.languageCode);\n });\n });\n \n return (elementCountIsDifferent || elementsNotEqual) &&\n (_.any(nonNullCurrentValues) || _.any(nonNullNewValues));\n };\n\n function needAddEmptyValue(property, values) {\n return !property.multivalue && !property.dictionary && values.length == 0;\n };\n\n\n function initLanguagesValuesMap() {\n if (scope.currentEntity.multilanguage && !scope.currentEntity.dictionary) {\n //Group values by language \n angular.forEach(scope.languages, function (language) {\n //Currently select values\n var currentPropValues = _.where(scope.context.currentPropValues, { languageCode: language });\n // provide default value if value wasn't found in specified language.\n if (!_.any(currentPropValues) && _.any(scope.context.currentPropValues)) {\n currentPropValues = angular.copy(_.filter(scope.context.currentPropValues, function (x) { return !x.languageCode }));\n _.each(currentPropValues, function (x) {\n x.id = null;\n x.languageCode = language;\n });\n }\n //need add empty value for single value type\n if (needAddEmptyValue(scope.currentEntity, currentPropValues)) {\n currentPropValues.push({ value: null, languageCode: language });\n }\n //All possible dict values\n var allValues = _.where(scope.context.allDictionaryValues, { languageCode: language });\n\n var langValuesGroup = {\n allValues: allValues,\n currentPropValues: currentPropValues\n };\n scope.context.langValuesMap[language] = langValuesGroup;\n });\n }\n };\n\n scope.isLanguageVisible = function (language) {\n if (scope.hiddenLanguages) {\n if (_.contains(scope.hiddenLanguages, language)) {\n return false;\n }\n }\n\n return true;\n }\n\n scope.loadDictionaryValues = function ($select) {\n $select.page = 0;\n return scope.loadNextDictionaryValues($select);\n };\n\n scope.loadNextDictionaryValues = function ($select) {\n var countToSkip = $select.page * scope.pageSize;\n var countToTake = scope.pageSize;\n\n return scope.getPropValues()(scope.currentEntity.id, $select.search, countToSkip, countToTake).then(function (result) {\n if (!$select.page) scope.context.allDictionaryValues = []; \n populateDictionaryValues(result.results);\n $select.page++;\n\n // If there are more items to display, let's prepare to handle these items.\n if (scope.context.allDictionaryValues.length < result.totalCount) {\n // Reset scrolling for the when-scrolled directive, so it could trigger this method for next page.\n scope.$broadcast('scrollCompleted');\n }\n\n return result;\n });\n }\n\n function populateDictionaryValues(dictItems) {\n angular.forEach(dictItems, function (dictItem) {\n var dictValue = _.find(scope.context.currentPropValues, function (x) {\n return x && (x.valueId == dictItem.id);\n });\n if (!dictValue) {\n dictValue = {\n alias: dictItem.alias,\n valueId: dictItem.id,\n value: dictItem.alias\n };\n }\n scope.context.allDictionaryValues.push(dictValue);\n });\n }\n\n function getTemplateName(property) {\n var result = property.valueType;\n\n if (property.dictionary) {\n result += '-dictionary';\n }\n if (property.multivalue) {\n result += '-multivalue';\n }\n if (property.multilanguage) {\n result += '-multilang';\n }\n result += '.html';\n return result;\n };\n\n function chageValueTemplate(valueType) {\n var templateName = getTemplateName(scope.currentEntity);\n\n\n //load input template and display\n $http.get(templateName, { cache: $templateCache }).then(function (results) {\n //Need to add ngForm to isolate form validation into sub form\n //var innerContainer = \"
\";\n\n //We must destroy scope of elements we are removing from DOM to avoid angular firing events\n var el = element.find('#valuePlaceHolder #innerContainer');\n if (el.length > 0) {\n el.scope().$destroy();\n }\n var container = element.find('#valuePlaceHolder');\n var result = container.html(results.data.trim());\n\n //Create new scope, otherwise we would destroy our directive scope\n var newScope = scope.$new();\n $compile(result)(newScope);\n });\n };\n\n /* Datepicker */\n scope.datepickers = {\n DateTime: false\n }\n scope.open = function ($event, which) {\n $event.preventDefault();\n $event.stopPropagation();\n\n scope.datepickers[which] = true;\n };\n\n scope.dateOptions = {\n datepickerMode: 'day'\n };\n\n linker(function (clone) {\n element.append(clone);\n });\n\n function setValid(name) {\n var form = scope.context.form;\n form[name].$setValidity('minlength', true);\n form[name].$setValidity('maxlength', true);\n form[name].$setValidity('pattern', true);\n }\n\n scope.tagsDeleted = function (tag, name, required) {\n var form = scope.context.form;\n var values = scope.context.currentPropValues;\n if (required && values.length === 0) {\n form[name].$setValidity('required', false);\n }\n\n setValid(name);\n };\n\n scope.tagsAdded = function (tag, name) {\n var form = scope.context.form;\n if (tag.value) {\n form[name].$setValidity('required', true);\n }\n\n setValid(name);\n };\n\n scope.addederror = function (tag, name, minValue, maxValue, pattern) {\n var form = scope.context.form;\n if (minValue && tag.value.length < minValue) {\n form[name].$setValidity('minlength', false);\n }\n\n if (maxValue && tag.value.length > maxValue) {\n form[name].$setValidity('maxlength', false);\n }\n\n if (pattern) {\n var re = new RegExp(pattern);\n if (!re.test(tag.value)) {\n form[name].$setValidity('pattern', false);\n }\n }\n };\n }\n }\n}]);\n","angular.module('virtoCommerce.catalogModule')\n.directive('vaPropertyMessages', function () {\n return {\n restrict: 'E',\n templateUrl: 'Modules/$(VirtoCommerce.Catalog)/Scripts/directives/propertyMessages.tpl.html',\n scope: false\n }\n});","angular.module('virtoCommerce.catalogModule')\n .filter('thumbnail', function () {\n return function (imageUrl, prefix) {\n imageUrl = imageUrl.replace(/(\\.[\\w\\d_-]+)$/i, prefix + '$1');\n return imageUrl; \n };\n });\n","angular.module('virtoCommerce.catalogModule')\n .filter('trustUrl', ['$sce', function ($sce) {\n return function(url) {\n return $sce.trustAsResourceUrl(url);\n };\n }]);\n","angular.module('virtoCommerce.catalogModule')\n.factory('virtoCommerce.catalogModule.aggregationProperties', ['$resource', function ($resource) {\n return $resource('', {}, {\n getProperties: { url: 'api/catalog/aggregationproperties/:storeId/properties', isArray: true },\n setProperties: { url: 'api/catalog/aggregationproperties/:storeId/properties', method: 'PUT' },\n getValues: { url: 'api/catalog/aggregationproperties/:storeId/properties/:propertyName/values', isArray: true }\n });\n}]);\n","angular.module('virtoCommerce.catalogModule')\n .factory('virtoCommerce.catalogModule.associations', ['$resource', function ($resource) {\n return $resource('api/catalog/products/associations/:productId', null, {\n get: { method: 'GET', isArray: true },\n update: { method: 'POST', url: 'api/catalog/products/associations' },\n delete: { method: 'DELETE', url: 'api/catalog/products/associations' },\n search: { method: 'POST', url: 'api/catalog/products/associations/search' }\n });\n }]);\n","angular.module('virtoCommerce.catalogModule')\n.factory('virtoCommerce.catalogModule.catalogs', ['$resource', function ($resource) {\n\n return $resource('api/catalog/catalogs/:id', { id: '@Id' }, {\n get: { method: 'GET' },\n getCatalogs: { method: 'GET', isArray: true },\n search: { method: 'POST', url: 'api/catalog/catalogs/search'},\n newCatalog: { method: 'GET', url: 'api/catalog/catalogs/getnew' },\n newVirtualCatalog: { method: 'GET', url: 'api/catalog/catalogs/getnewvirtual' },\n update: { method: 'PUT' },\n //getCatalogLanguages: { method: 'GET', url: 'api/catalog/catalogs/:id/languages', isArray: true },\n //updateCatalogLanguages: { method: 'POST', url: 'api/catalog/catalogs/:catalogId/languages' },\n });\n}]);\n\n","angular.module('virtoCommerce.catalogModule')\n.factory('virtoCommerce.catalogModule.categories', ['$resource', function ($resource) {\n\n return $resource('api/catalog/categories/:id', { categoryId: '@Id' }, {\n newCategory: { method: 'GET', url: 'api/catalog/:catalogId/categories/newcategory', params: { catalogId: '@catalogId' } },\n update: { method: 'POST', url: 'api/catalog/categories/' },\n remove: { method: 'DELETE', url: 'api/catalog/categories' },\n plenty: { method: 'POST', url: 'api/catalog/categories/plenty', isArray: true },\n getByIds: { method: 'GET', url: 'api/catalog/categories', params: { ids: '@ids' }, isArray: true }\n });\n\n}]);\n\n","angular.module('virtoCommerce.catalogModule')\n.factory('virtoCommerce.catalogModule.import', ['$resource', function ($resource) {\n\n\treturn $resource('api/catalog/import', {}, {\n\t\tgetMappingConfiguration: { method: 'GET', url: 'api/catalog/import/mappingconfiguration', isArray: false },\n\t\trun: { method: 'POST', url: 'api/catalog/import', isArray: false }\n\t});\n\n}]);\n\n","angular.module('virtoCommerce.catalogModule')\n.factory('virtoCommerce.catalogModule.items', ['$resource', function ($resource) {\n return $resource('api/catalog/products/:id', null, {\n remove: { method: 'DELETE', url: 'api/catalog/products' },\n newItemInCatalog: { method: 'GET', url: 'api/catalog/:catalogId/products/getnew' },\n newItemInCategory: { method: 'GET', url: 'api/catalog/:catalogId/categories/:categoryId/products/getnew' },\n newVariation: { method: 'GET', url: 'api/catalog/products/:itemId/getnewvariation' },\n cloneItem: { method: 'GET', url: 'api/catalog/products/:itemId/clone' },\n update: { method: 'POST' },\n plenty: { method: 'POST', url: 'api/catalog/products/plenty', isArray: true },\n getByIds: { method: 'GET', url: 'api/catalog/products/', params: { ids: '@ids' }, isArray: true }\n });\n}]);\n","angular.module('virtoCommerce.catalogModule')\n.factory('virtoCommerce.catalogModule.listEntries', ['$resource', function ($resource) {\n return $resource('api/catalog/listentries', {},\n {\n listitemssearch: { method: 'POST', url: 'api/catalog/listentries' },\n createlinks: { method: 'POST', url: 'api/catalog/listentrylinks' },\n bulkcreatelinks: { method: 'POST', url: 'api/catalog/listentrylinks/bulkcreate' },\n searchlinks: { method: 'POST', url: 'api/catalog/listentrylinks/search' },\n deletelinks: { method: 'POST', url: 'api/catalog/listentrylinks/delete' },\n move: { method: 'POST', url: 'api/catalog/listentries/move' },\n delete: { method: 'POST', url: 'api/catalog/listentries/delete' }\n });\n}]);\n\n","angular.module('virtoCommerce.catalogModule')\n.factory('virtoCommerce.catalogModule.propDictItems', ['$resource', function ($resource) {\n return $resource('api/catalog/dictionaryitems', {}, {\t\t\n save: { method: 'POST', url: 'api/catalog/dictionaryitems' },\n search: { method: 'POST', url: 'api/catalog/dictionaryitems/search' },\n remove: { method: 'DELETE', url: 'api/catalog/dictionaryitems' }\n });\n\n}]);\n","angular.module('virtoCommerce.catalogModule')\r\n.factory('virtoCommerce.catalogModule.properties', ['$resource', function ($resource) {\r\n\r\n return $resource('api/catalog/properties/:id', { id: '@id' }, {\r\n newCategoryProperty: { method: 'GET', url: 'api/catalog/categories/:categoryId/properties/getnew' },\r\n newCatalogProperty: { method: 'GET', url: 'api/catalog/:catalogId/properties/getnew' },\r\n get: { method: 'GET', url: 'api/catalog/properties/:propertyId' },\r\n update: { method: 'POST', url: 'api/catalog/properties' },\r\n validateName: { method: 'POST', url: 'api/catalog/properties/validate-name' },\r\n validateCategoryPropertyName: { method: 'POST', url: 'api/catalog/properties/validate-property-name' },\r\n values: { url: 'api/catalog/properties/:propertyId/values', isArray: true },\r\n remove: { method: 'DELETE', url: 'api/catalog/properties' }\r\n });\r\n\r\n}]);\r\n","angular.module('virtoCommerce.catalogModule')\n .factory('virtoCommerce.catalogModule.propertyValidators', function () {\n var namePattern = /^\\b[0-9a-z]+(_[0-9a-z]+)*\\b$/i;\n var maxLenght = 128;\n\n function isNameValid(value) {\n return value.length <= maxLenght && namePattern.test(value);\n }\n\n return {\n isNameValid: isNameValid\n };\n });\n","angular.module('virtoCommerce.catalogModule')\n .factory('virtoCommerce.catalogModule.search', ['$resource', function ($resource) {\n return $resource('api/catalog/listentries', null, {\n searchProducts: { method: 'POST' },\n });\n }]);\n","angular.module('virtoCommerce.catalogModule')\n .factory('virtoCommerce.catalogModule.valueTypes', function () {\n return {\n get: function() {\n return [\n {\n valueType: \"ShortText\",\n title: \"platform.properties.short-text.title\",\n description: \"platform.properties.short-text.description\"\n },\n {\n valueType: \"LongText\",\n title: \"platform.properties.long-text.title\",\n description: \"platform.properties.long-text.description\"\n },\n {\n valueType: \"Number\",\n title: \"platform.properties.decimal.title\",\n description: \"platform.properties.decimal.description\"\n },\n {\n valueType: \"DateTime\",\n title: \"platform.properties.date-time.title\",\n description: \"platform.properties.date-time.description\"\n },\n {\n valueType: \"Boolean\",\n title: \"platform.properties.boolean.title\",\n description: \"platform.properties.boolean.description\"\n },\n {\n valueType: \"Integer\",\n title: \"platform.properties.integer.title\",\n description: \"platform.properties.integer.description\"\n },\n {\n valueType: \"GeoPoint\",\n title: \"catalog.properties.geoPoint.title\",\n description: \"catalog.properties.geoPoint.description\"\n }\n ];\n }\n };\n });\n","angular.module('virtoCommerce.catalogModule')\n .factory('virtoCommerce.catalogModule.videos', ['$resource', function ($resource) {\n return $resource('api/catalog/videos', {}, {\n options: { method: 'GET', url: 'api/catalog/videos/options' },\n create: { method: 'POST', url: 'api/catalog/videos/create' },\n search: { method: 'POST', url: 'api/catalog/videos/search' },\n save: { method: 'POST', isArray: true },\n remove: { method: 'DELETE', isArray: true }\n });\n }]);\n","angular.module('virtoCommerce.catalogBulkActionsModule')\n .factory('virtoCommerce.catalogBulkActionsModule.webApi', ['$resource', function ($resource) {\n var baseUrl = 'api/bulk/actions';\n return $resource('', null, {\n getActions: { method: 'GET', isArray: true, url: baseUrl },\n getActionData: { method: 'POST', url: baseUrl + '/data' },\n runBulkAction: { method: 'POST', url: baseUrl },\n cancel: { method: 'DELETE', url: baseUrl }\n });\n}]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.catalogSelectorController', ['$scope', 'virtoCommerce.catalogModule.catalogs', function ($scope, catalogs) {\n //ToDo: Apply Infinite scrolling\n catalogs.search({ take: 1000 }, function (data) {\n $scope.catalogs = angular.copy(data.results);\n });\n }]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.categorySelectorController', ['$scope', 'platformWebApp.bladeNavigationService', function ($scope, bladeNavigationService) {\n var blade = $scope.blade;\n\n $scope.selectedCount = (blade.currentEntity.categoryIds || []).length;\n\n $scope.$watch('blade.currentEntity.categoryIds', function () {\n $scope.selectedCount = (blade.currentEntity.categoryIds || []).length;\n });\n\n $scope.selectCategory = function () {\n var selection = blade.currentEntity.categoryIds || [];\n var options = {\n allowCheckingCategory: true,\n allowCheckingItem: false,\n selectedItemIds: selection,\n checkItemFn: function (listItem, isSelected) {\n if (isSelected) {\n if (!_.find(selection, function (x) { return x === listItem.id; })) {\n selection.push(listItem.id);\n }\n }\n else {\n selection = _.reject(selection, function (x) { return x === listItem.id; });\n }\n }\n };\n var newBlade = {\n id: \"CatalogItemsSelect\",\n controller: 'virtoCommerce.catalogModule.catalogItemSelectController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/common/catalog-items-select.tpl.html',\n title: 'catalog.selectors.blades.titles.select-categories',\n options: options,\n breadcrumbs: [],\n toolbarCommands: [\n {\n name: \"platform.commands.confirm\", icon: 'fa fa-check',\n executeMethod: function (pickingBlade) {\n blade.currentEntity.categoryIds = _.union(blade.currentEntity.categoryIds, selection);\n $scope.selectedCount = blade.currentEntity.categoryIds.length;\n bladeNavigationService.closeBlade(pickingBlade);\n },\n canExecuteMethod: function () {\n return _.any(selection);\n }\n },\n {\n name: \"platform.commands.reset\", icon: 'fa fa-undo',\n executeMethod: function (pickingBlade) {\n selection = [];\n blade.currentEntity.categoryIds = [];\n $scope.selectedCount = blade.currentEntity.categoryIds.length;\n bladeNavigationService.closeBlade(pickingBlade);\n },\n canExecuteMethod: function () {\n return _.any(selection);\n }\n }]\n };\n bladeNavigationService.showBlade(newBlade, blade);\n }\n }]);\n","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.aggregationPropertiesWidgetController', ['$scope', 'platformWebApp.bladeNavigationService', function ($scope, bladeNavigationService) {\n var blade = $scope.blade;\n\n $scope.openBlade = function () {\n var newBlade = {\n id: \"storeFilteringProperties\",\n storeId: blade.currentEntity.id,\n title: 'Filtering properties',\n controller: 'virtoCommerce.catalogModule.aggregationPropertiesController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/aggregation-properties-list.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n}]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.billOfMaterialsWidgetController', ['$scope', 'platformWebApp.bladeNavigationService', function ($scope, bladeNavigationService) {\n var blade = $scope.blade;\n\n $scope.openBlade = function () {\n var newBlade = {\n id: \"billOfMaterialsList\",\n item: blade.item,\n itemsAdded: blade.associationsAdded,\n itemsDeleted: blade.associationsDeleted,\n controller: 'virtoCommerce.catalogModule.billOfMaterialsListController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/bill-of-materials-list.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n}]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.catalogEntryImageWidgetController',\n ['$scope', 'virtoCommerce.catalogModule.items', 'virtoCommerce.catalogModule.categories', 'platformWebApp.bladeNavigationService', 'virtoCommerce.catalogModule.catalogImagesFolderPathHelper',\n function ($scope, items, categories, bladeNavigationService, catalogImgHelper) {\n\n $scope.openBlade = function () {\n var blade = {\n id: \"itemImage\",\n item: $scope.blade.currentEntity,\n folderPath: catalogImgHelper.getImagesFolderPath($scope.blade.currentEntity.catalogId, $scope.blade.currentEntity.code),\n controller: 'virtoCommerce.catalogModule.imagesController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/images.tpl.html'\n };\n bladeNavigationService.showBlade(blade, $scope.blade);\n };\n\n function setCurrentEntities(images) {\n if (images) {\n $scope.currentEntities = images;\n }\n }\n $scope.$watch('blade.item.images', setCurrentEntities);\n $scope.$watch('blade.currentEntity.images', setCurrentEntities);\n }]);\n","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.catalogLanguagesWidgetController', ['$scope', 'platformWebApp.bladeNavigationService', function ($scope, bladeNavigationService) {\n var blade = $scope.blade;\n\n $scope.openBlade = function () {\n var newBlade = {\n id: \"catalogChildBlade\",\n title: blade.title,\n subtitle: 'catalog.widgets.catalogLanguages.blade-subtitle',\n controller: 'virtoCommerce.catalogModule.catalogLanguagesController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/catalog-languages.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n}]);","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.catalogPropertyWidgetController', ['$scope', 'platformWebApp.bladeNavigationService', function ($scope, bladeNavigationService) {\n\tvar blade = $scope.blade;\n\n\t$scope.openCatalogPropertyBlade = function () {\n\t\tvar newBlade = {\n\t\t\tid: \"catalogPropertyDetail\",\n currentEntity: blade.currentEntity,\n originalEntity: blade.origEntity,\n\t\t\tlanguages: _.pluck(blade.currentEntity.languages, 'languageCode'),\n\t\t\tdefaultLanguage: blade.currentEntity.defaultLanguage.languageCode,\n\t\t\tentityType: \"catalog\",\n\t\t\tcatalogId: blade.currentEntity.id,\n\t\t\tpropGroups: [{ title: 'catalog.properties.catalog', type: 'Catalog' }, { title: 'catalog.properties.category', type: 'Category' }, { title: 'catalog.properties.product', type: 'Product' }, { title: 'catalog.properties.variation', type: 'Variation' }],\n\t\t\tcontroller: 'virtoCommerce.catalogModule.propertyListController',\n\t\t\ttemplate: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/property-list.tpl.html'\n\t\t};\n\t\tbladeNavigationService.showBlade(newBlade, blade);\n\t};\n}]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.categoryDescriptionWidgetController', ['$scope', 'platformWebApp.bladeNavigationService', function ($scope, bladeNavigationService) {\n $scope.currentBlade = $scope.widget.blade;\n\n $scope.openBlade = function () {\n var blade = {\n id: \"categoryDescriptionsList\",\n category: $scope.currentBlade.currentEntity,\n catalog: $scope.currentBlade.catalog,\n controller: 'virtoCommerce.catalogModule.categoryDescriptionsListController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/categoryDescriptions-list.tpl.html'\n };\n\n bladeNavigationService.showBlade(blade, $scope.currentBlade);\n };\n\n}]);\n","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.categoryPropertyWidgetController', ['$scope', 'platformWebApp.bladeNavigationService', function ($scope, bladeNavigationService) {\n var blade = $scope.blade;\n $scope.propertiesCount = '...';\n\n $scope.$watch('blade.currentEntity', function (product) {\n if (product)\n $scope.propertiesCount = _.filter(product.properties, function (x) { return x.type == 'Category' || x.type == 'Product' || x.type == 'Variation'; }).length;\n });\n\n $scope.openPropertiesBlade = function () {\n var newBlade = {\n id: \"categoryPropertyDetail\",\n categoryId: blade.currentEntity.id,\n entityType: \"category\",\n currentEntity: blade.currentEntity,\n originalEntity: blade.origEntity,\n languages: _.pluck(blade.catalog.languages, 'languageCode'),\n defaultLanguage: blade.catalog.defaultLanguage.languageCode,\n propGroups: [{ title: 'catalog.properties.category', type: 'Category' }, { title: 'catalog.properties.product', type: 'Product' }, { title: 'catalog.properties.variation', type: 'Variation' }],\n controller: 'virtoCommerce.catalogModule.propertyListController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/property-list.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n}]);\n","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.dashboard.catalogsWidgetController', ['$scope', '$state', 'virtoCommerce.catalogModule.catalogs', function ($scope, $state, catalogs) {\n $scope.data = { count: '', descr: 'Catalogs' };\n\n $scope.widgetAction = function () {\n $state.go('workspace.catalog');\n };\n\n catalogs.search({take:0}, function (data) {\n $scope.data.count = data.totalCount;\n },\n function (error) { });\n}])\n.controller('virtoCommerce.catalogModule.dashboard.productsWidgetController', ['$scope', '$state', 'virtoCommerce.catalogModule.listEntries', function ($scope, $state, listEntries) {\n $scope.data = { count: '', descr: 'Products' };\n\n $scope.widgetAction = function () {\n $state.go('workspace.catalog');\n };\n\n listEntries.listitemssearch({ take: 0 }, function (data) {\n $scope.data.count = data.totalCount;\n },\n function (error) { });\n}])\n;\n","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.editorialReviewWidgetController', ['$scope', 'platformWebApp.bladeNavigationService', function ($scope, bladeNavigationService) {\n $scope.currentBlade = $scope.widget.blade;\n\n $scope.openBlade = function () {\n var blade = {\n id: \"editorialReviewsList\",\n item: $scope.currentBlade.item,\n catalog: $scope.currentBlade.catalog,\n controller: 'virtoCommerce.catalogModule.editorialReviewsListController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/editorialReviews-list.tpl.html'\n };\n\n bladeNavigationService.showBlade(blade, $scope.currentBlade);\n };\n\n}]);\n","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.itemAssetWidgetController', ['$scope', 'platformWebApp.bladeNavigationService', function ($scope, bladeNavigationService) {\n\n var blade = $scope.widget.blade;\n\n $scope.openBlade = function () {\n var newBlade = {\n id: \"itemAsset\",\n item: blade.currentEntity,\n controller: 'virtoCommerce.catalogModule.itemAssetController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/item-asset-list.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n}]);\n","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.itemAssociationsWidgetController', ['$scope', 'platformWebApp.bladeNavigationService', function ($scope, bladeNavigationService) {\n var blade = $scope.blade;\n\n $scope.openBlade = function () {\n \tif (blade.item.associations) {\n \t\tvar newBlade = {\n \t\t\tid: \"associationsList\",\n \t\t\titem : blade.item, \n \t\t\tcontroller: 'virtoCommerce.catalogModule.itemAssociationsListController',\n \t\t\ttemplate: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/item-associations-list.tpl.html'\n \t\t};\n \t}\n \tbladeNavigationService.showBlade(newBlade, blade);\n }; \n}]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.itemDimensionWidgetController', ['$scope', 'virtoCommerce.catalogModule.items', 'platformWebApp.bladeNavigationService', 'virtoCommerce.coreModule.packageType.packageTypeApi', function ($scope, items, bladeNavigationService, packageTypeApi) {\n\n $scope.openBlade = function () {\n var blade = {\n id: \"itemDimension\",\n item: $scope.blade.item, \n controller: 'virtoCommerce.catalogModule.itemDimensionController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/item-dimensions.tpl.html'\n };\n bladeNavigationService.showBlade(blade, $scope.blade);\n };\n\n $scope.$watch('blade.item.packageType', function (packageTypeId) {\n if (packageTypeId) {\n packageTypeApi.query({}, function (results) {\n $scope.blade.packageType = _.find(results, function (x) { return x.id == packageTypeId; });\n });\n }\n else {\n delete $scope.blade.packageType;\n }\n }); \n\n}]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.itemPropertyWidgetController', ['$scope', 'platformWebApp.bladeNavigationService', function ($scope, bladeNavigationService) {\n var blade = $scope.blade;\n $scope.propertiesCount = '...';\n\n $scope.$watch('blade.item', function (product) {\n if (product)\n $scope.propertiesCount = _.filter(product.properties, function (x) { return x.type == 'Product' || x.type == 'Variation'; }).length;\n });\n\n $scope.openItemPropertyBlade = function () {\n var newBlade = {\n id: \"itemProperty\" + blade.currentEntity.id,\n productId: blade.currentEntity.id,\n entityType: \"product\",\n catalog: blade.catalog,\n currentEntity: blade.currentEntity,\n originalEntity: blade.origItem,\n languages: _.pluck(blade.catalog.languages, 'languageCode'),\n defaultLanguage: blade.catalog.defaultLanguage.languageCode,\n propGroups: [{ title: 'catalog.properties.product', type: 'Product' }, { title: 'catalog.properties.variation', type: 'Variation' }],\n controller: 'virtoCommerce.catalogModule.propertyListController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/property-list.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n }]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.itemVariationWidgetController', ['$scope', 'platformWebApp.bladeNavigationService', 'virtoCommerce.catalogModule.search', function ($scope, bladeNavigationService, search) {\n var blade = $scope.blade;\n\n function refresh() {\n $scope.variartionCount = '...';\n\n var searchCriteria = {\n mainProductId: blade.currentEntityId,\n objectType: \"CatalogProduct\",\n responseGroup: \"withProducts\",\n take: 0,\n withHidden: true,\n searchInChildren: true\n };\n search.searchProducts(searchCriteria, function (data) {\n $scope.variartionCount = data.totalCount;\n });\n }\n\n $scope.openVariationListBlade = function () {\n var newBlade = {\n id: \"itemVariationList\",\n item: blade.item,\n catalog: blade.catalog,\n originalEntity: blade.origItem,\n toolbarCommandsAndEvents: blade.variationsToolbarCommandsAndEvents,\n controller: 'virtoCommerce.catalogModule.itemVariationListController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/item-variation-list.tpl.html',\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n $scope.$watch(\"widget.blade.currentEntity\", function (pricelist) {\n refresh();\n });\n\n refresh();\n }]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.linksWidgetController', ['$scope', 'platformWebApp.bladeNavigationService', 'virtoCommerce.catalogModule.listEntries',\n function ($scope, bladeNavigationService, listEntries) {\n var blade = $scope.blade;\n var type = blade.productType ? 'CatalogProduct' : 'Category';\n\n function refresh() {\n $scope.linksCount = '...';\n\n var searchCriteria = {\n objectIds: [blade.currentEntityId],\n objectType: type,\n take: 0\n };\n\n listEntries.searchlinks(searchCriteria, function (data) {\n $scope.linksCount = data.totalCount;\n });\n }\n\n $scope.openLinksBlade = function () {\n var newBlade = {\n id: 'linksListBlade',\n currentEntity: blade.currentEntity,\n type: type,\n controller: 'virtoCommerce.catalogModule.linksListController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/links-list/links-list.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n refresh();\n }]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.videoWidgetController', ['$scope', 'platformWebApp.bladeNavigationService',\n function ($scope, bladeNavigationService) {\n var blade = $scope.blade;\n\n $scope.openBlade = function () {\n var newBlade = {\n id: \"videosList\",\n owner: blade.currentEntity,\n ownerType: 'Product',\n catalog: blade.catalog,\n controller: 'virtoCommerce.catalogModule.videoListController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/video-list.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n }]);\n","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.associationWizardController', ['$scope', 'platformWebApp.bladeNavigationService', 'platformWebApp.settings', 'virtoCommerce.catalogModule.items', function ($scope, bladeNavigationService, settings, items) {\n var blade = $scope.blade;\n blade.title = \"catalog.wizards.association.title\";\n blade.isLoading = false;\n\n $scope.selectedCount = function (type) {\n return _.where(blade.selection, { type: type }).length;\n };\n\n function initialize(item) {\n $scope.associationGroups = settings.getValues({ id: 'Catalog.AssociationGroups' }, function (data) {\n if (data && data.length > 0) {\n blade.groupName = data[0];\n }\n });\n blade.selection = _.map(blade.item.associations, function (x) {\n return { id: x.associatedObjectId, type: x.associatedObjectType, association: x }\n });\n };\n $scope.isValid = false;\n $scope.$watch(\"blade.selection\", function () {\n $scope.isValid = blade.groupName && blade.selection.length > 0;\n }, true);\n\n\n $scope.saveChanges = function () {\n blade.item.associations = _.map(blade.selection, function (x) {\n var retVal = x.association;\n if (!retVal) {\n retVal = {\n type: blade.groupName,\n associatedObjectType: x.type,\n associatedObjectId: x.id,\n associatedObjectName: x.name,\n associatedObjectImg: x.imageUrl,\n quantity: blade.quantity\n };\n if (_.any(blade.tags)) {\n retVal.tags = _.map(blade.tags, function (x) {\n return x.value;\n });\n }\n }\n return retVal;\n });\n if (angular.isFunction(blade.onSaveChanges)) {\n blade.onSaveChanges(); \n }\n $scope.bladeClose();\n };\n\n\n $scope.openBlade = function () {\n var selection = [];\n var options = {\n allowCheckingCategory: true,\n selectedItemIds: [],\n checkItemFn: function (listItem, isSelected) {\n if (isSelected) {\n if (!_.find(selection, function (x) { return x.id == listItem.id; })) {\n selection.push(listItem);\n }\n }\n else {\n selection = _.reject(selection, function (x) { return x.id == listItem.id; });\n }\n }\n };\n var newBlade = {\n id: \"CatalogItemsSelect\",\n title: \"catalog.blades.catalog-items-select.title-association\",\n subtitle: 'catalog.blades.catalog-items-select.subtitle-association',\n controller: 'virtoCommerce.catalogModule.catalogItemSelectController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/common/catalog-items-select.tpl.html',\n options: options,\n breadcrumbs: [],\n toolbarCommands: [\n {\n name: \"platform.commands.confirm\", icon: 'fa fa-check',\n executeMethod: function (pickingBlade) {\n blade.selection = _.uniq(_.union(blade.selection, selection), function (x) {\n return [x.type, x.id, x.association ? x.association.type : blade.groupName].join();\n });\n bladeNavigationService.closeBlade(pickingBlade);\n },\n canExecuteMethod: function () {\n return _.any(selection);\n }\n }]\n };\n bladeNavigationService.showBlade(newBlade, blade);\n }\n\n\n $scope.openDictionarySettingManagement = function () {\n var newBlade = {\n id: 'settingDetailChild',\n isApiSave: true,\n currentEntityId: 'Catalog.AssociationGroups',\n parentRefresh: function (data) { $scope.associationGroups = data; },\n controller: 'platformWebApp.settingDictionaryController',\n template: '$(Platform)/Scripts/app/settings/blades/setting-dictionary.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n initialize(blade.item);\n\n}]);","angular.module('virtoCommerce.catalogModule')\n.controller('virtoCommerce.catalogModule.newCategoryWizardController', ['$scope', 'platformWebApp.bladeNavigationService', 'platformWebApp.dialogService', 'virtoCommerce.catalogModule.categories', function ($scope, bladeNavigationService, dialogService, categories) {\n var blade = $scope.blade;\n\n $scope.create = function () {\n blade.isLoading = true;\n\n blade.currentEntity.$update(null, function (data) {\n $scope.bladeClose(function () {\n var categoryListBlade = blade.parentBlade;\n categoryListBlade.setSelectedItem(data);\n categoryListBlade.showCategoryBlade(data);\n categoryListBlade.refresh();\n });\n },\n function (error) { bladeNavigationService.setError('Error ' + error.status, blade); });\n }\n\n $scope.openBlade = function (type) {\n blade.onClose(function () {\n var newBlade = null;\n switch (type) {\n case 'properties':\n newBlade = {\n id: \"categoryPropertyDetail\",\n entityType: \"product\",\n currentEntity: blade.currentEntity,\n propGroups: [{ title: 'catalog.properties.category', type: 'Category' }, { title: 'catalog.properties.product', type: 'Product' }, { title: 'catalog.properties.variation', type: 'Variation' }],\n controller: 'virtoCommerce.catalogModule.propertyListController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/property-list.tpl.html'\n };\n break;\n case 'seo':\n newBlade = {\n id: \"seo\",\n controller: 'virtoCommerce.coreModule.seo.storeListController',\n template: 'Modules/$(VirtoCommerce.Core)/Scripts/SEO/blades/seo-detail.tpl.html'\n };\n break;\n }\n\n if (newBlade != null) {\n bladeNavigationService.showBlade(newBlade, blade);\n }\n });\n }\n\n $scope.codeValidator = function (value) {\n var pattern = /[$+;=%{}[\\]|@~!^*&()?'<>,]/;\n return !pattern.test(value);\n };\n\n $scope.setForm = function (form) {\n $scope.formScope = form;\n }\n \n blade.isLoading = false;\n}]);\n","angular.module('virtoCommerce.catalogModule')\n .controller('virtoCommerce.catalogModule.newProductWizardController', ['$scope', 'platformWebApp.bladeNavigationService', '$http', 'virtoCommerce.storeModule.stores', 'virtoCommerce.catalogModule.catalogImagesFolderPathHelper', 'virtoCommerce.catalogModule.itemTypesResolverService', function ($scope, bladeNavigationService, $http, stores, catalogImgHelper, itemTypesResolverService) {\n var blade = $scope.blade;\n\n if (blade.item.productType) {\n var productType = itemTypesResolverService.resolve(blade.item.productType);\n if (productType) {\n blade.headIcon = productType.icon;\n }\n }\n\n var initialName = blade.item.name ? blade.item.name : '';\n var lastGeneratedName = initialName;\n var storesPromise = stores.query().$promise;\n\n $scope.createItem = function () {\n blade.isLoading = true;\n\n blade.item.$update(null,\n function (dbItem) {\n blade.parentBlade.setSelectedItem(dbItem);\n blade.parentBlade.refresh();\n\n var newBlade = {\n id: blade.id,\n itemId: dbItem.id,\n catalog: blade.catalog,\n productType: dbItem.productType,\n title: dbItem.name,\n controller: 'virtoCommerce.catalogModule.itemDetailController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/item-detail.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade.parentBlade);\n },\n function (error) { bladeNavigationService.setError('Error ' + error.status, $scope.blade); });\n };\n\n $scope.openBlade = function (type) {\n var newBlade = null;\n switch (type) {\n case 'properties':\n newBlade = {\n id: \"newProductProperties\",\n entityType: \"product\",\n item: blade.item,\n catalog: blade.catalog,\n currentEntity: blade.item,\n languages: _.pluck(blade.catalog.languages, 'languageCode'),\n defaultLanguage: blade.catalog.defaultLanguage.languageCode,\n propGroups: [{ title: 'catalog.properties.product', type: 'Product' }, { title: 'catalog.properties.variation', type: 'Variation' }],\n controller: 'virtoCommerce.catalogModule.propertyListController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/property-list.tpl.html'\n };\n break;\n case 'images':\n newBlade = {\n id: \"newProductImages\",\n item: blade.item,\n folderPath: catalogImgHelper.getImagesFolderPath($scope.blade.item.catalogId, $scope.blade.item.code),\n catalog: blade.catalog,\n controller: 'virtoCommerce.catalogModule.imagesController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/images.tpl.html'\n };\n break;\n case 'seo':\n initializeSEO(blade.item, function (seoInfo) {\n storesPromise.then(function (promiseData) {\n newBlade = {\n id: 'seoDetails',\n data: seoInfo,\n isNew: !_.any(blade.item.seoInfos),\n seoContainerObject: blade.item,\n stores: promiseData,\n catalog: blade.catalog,\n languages: _.pluck(blade.catalog.languages, 'languageCode'),\n updatePermission: 'catalog:create',\n controller: 'virtoCommerce.coreModule.seo.seoDetailController',\n template: 'Modules/$(VirtoCommerce.Core)/Scripts/SEO/blades/seo-detail.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n });\n });\n break;\n case 'review':\n newBlade = {\n id: \"newProductEditorialReviewsList\",\n item: blade.item,\n catalog: blade.catalog,\n controller: 'virtoCommerce.catalogModule.editorialReviewsListController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/editorialReviews-list.tpl.html'\n };\n break;\n }\n\n if (newBlade != null) {\n bladeNavigationService.showBlade(newBlade, blade);\n }\n }\n\n $scope.codeValidator = function (value) {\n var pattern = /[$+;=%{}[\\]|@~!^*&()?'<>,]/;\n return !pattern.test(value);\n };\n\n $scope.setForm = function (form) {\n $scope.formScope = form;\n }\n\n $scope.getUnfilledProperties = function () {\n return _.filter(blade.item.properties, function (p) {\n return p && _.any(p.values) && p.values[0].value;\n });\n }\n\n function initializeSEO(item, callback) {\n if (_.any(item.seoInfos)) {\n callback(item.seoInfos[0]);\n } else {\n var retVal = { isActive: true };\n var stringForSlug = item.name;\n _.each(item.properties, function (prop) {\n _.each(prop.values, function (val) {\n stringForSlug += ' ' + val.value;\n });\n });\n\n if (stringForSlug) {\n $http.get('api/catalog/getslug?text=' + stringForSlug)\n .then(function (results) {\n retVal.semanticUrl = results.data;\n callback(retVal);\n });\n } else\n callback(retVal);\n }\n }\n\n $scope.$watch('blade.item.properties', function (currentEntities) {\n // auto-generate item.name from property values if user didn't change it\n if ((lastGeneratedName == blade.item.name || (!lastGeneratedName && !blade.item.name))\n && _.any(blade.childrenBlades, function (x) { return x.controller === 'virtoCommerce.catalogModule.newProductWizardPropertiesController'; })) {\n lastGeneratedName = initialName;\n _.each(currentEntities, function (x) {\n if (_.any(x.values, function (val) { return val.value; })) {\n var currVal = _.find(x.values, function (val) { return val.value; });\n if (currVal) {\n lastGeneratedName += (lastGeneratedName ? ', ' : '') + currVal.value;\n }\n }\n });\n blade.item.name = lastGeneratedName;\n }\n });\n\n\n blade.isLoading = false;\n }]);\n"],"names":["catalogsModuleName","moduleName","undefined","AppDependencies","push","angular","module","config","$stateProvider","state","url","templateUrl","controller","$scope","bladeNavigationService","showBlade","id","title","breadcrumbs","subtitle","template","isClosingDisabled","factory","$localStorage","catalogSearchFilters","register","currentFiltersUpdateTime","currentFiltersStorageKey","newFilters","_","each","newFilter","found","find","x","lastUpdateTime","copy","splice","objects","registerType","itemTypeDefinition","this","resolve","type","findWhere","productType","getImagesFolderPath","catalogId","code","length","substring","run","mainMenuService","widgetService","$state","catalogExportService","scopeResolver","catalogs","predefinedSearchFilters","metaFormsService","itemTypesResolverService","$http","$compile","genericViewerItemService","toolbarService","breadcrumbHistoryService","menuItem","path","icon","priority","action","go","permission","addMenuItem","getBackButtonInstance","entryImageWidget","size","registerWidget","itemSeoWidget","objectType","getDefaultContainerId","blade","getLanguages","pluck","catalog","languages","isVisible","categorySeoWidget","isNew","catalogSelectScope","selectFn","callback","newBlade","currentEntity","onChangesConfirmedFn","dataService","categorySelectScope","selectedListItems","map","assignedScopes","scope","name","label","options","showCheckingMultiple","allowCheckingItem","allowCheckingCategory","selectedItemIds","checkItemFn","listItem","isSelected","all","reject","scopeOriginal","toolbarCommands","executeMethod","scopes","extend","closeBlade","canExecuteMethod","indexWidget","widgetToRegister","documentType","keyword","searchInVariations","itemType","description","registerMetaFields","placeholder","colSpan","isRequired","valueType","spanAllColumns","isReadOnly","isVisibleFn","item","registerViewer","itemCopy","itemId","get","then","response","data","onInitialize","exportDataRequest","exportTypeName","dataQuery","categoryIds","selectedCategories","objectIds","selectedProducts","catalogIds","searchInChildren","isAllSelected","totalItemsCount","$urlRouterProvider","$rootScope","bladeUtils","catalogBulkActionService","gridApi","filter","selection","getSelectedRows","getSelectAllState","searchData","searchCriteria","categoryId","responseGroup","skip","take","listEntries","any","index","$translate","canStartProcess","isLoading","selectedCategory","actionDataContext","startAction","progressBlade","onCompleted","isProcessing","selectCategory","pickingBlade","selectedCount","validateActionParameters","headIcon","webApi","isPropertiesSelected","properties","includedProperties","propertySelected","editedProperties","selectProperties","onSelected","editProperties","propGroups","getActionData","propertyTotal","prop","UseDefaultUIForEdit","values","ownerName","group","bulkActionServiceRegistrar","selectedNodeId","openBlade","registrationInfo","getByName","setError","initializeAction","actionName","contextTypeName","getActions","actions","$filter","categories","items","dialogService","refresh","pageSettings","currentPage","itemsPerPageCount","listitemssearch","headers","totalItems","totalCount","error","status","selectItem","selectedItem","propertyValues","getAllCheckedPropValues","propValues","retVal","forEach","propValue","isChecked","searchKeyword","searchResult","oldPropertyValues","newPropValues","checkedPropValues","rootNode","children","treeNodes","tree","propertyValueGroups","isUndefined","propertyName","showAll","value","refreshItems","uncheckAllProp","checkedPropValue","updateSelectedPropValues","aggregationProperties","updatePermission","attributeType","propertyTypes","isRange","property","canChangeType","canChangeSize","getValues","search","result","Math","max","isNaN","isNumber","unshift","hasPredefinedValues","onClose","closeCallback","showConfirmationIfNeeded","equals","originalProperty","hasUpdatePermission","saveChanges","valuesCount","bladeClose","isValid","storeId","results","isDirty","selectedEntities","origSelected","edit","node","select","unselect","indexOf","setProperties","currentEntities","origEntity","parentBlade","where","sortableOptions","axis","cursor","getProperties","$timeout","uiGridHelper","associations","uiGridConstants","hasMore","selectedNode","loadMore","infiniteScroll","saveScrollPercentage","getSearchCriteria","populateAssociationsData","concat","dataLoaded","associationType","productAssociations","some","itemIds","plenty","respGroup","products","uniqueCategoriesIds","uniq","categoriesResult","productCategories","$$quantity","quantity","associatedObjectType","d","associatedObjectId","$$productName","$$categoryId","$$category","c","images","$$imageUrl","$$productType","addAssociationProperties","cupImage","criteriaChanged","resetScroll","openProduct","isValidQuantity","updateQuantity","update","deleteList","list","closeChildrenBlades","dialog","message","remove","delete","ids","itemsDeleted","showConfirmationDialog","openAddItemBlade","excludeProductType","selectBlade","selectedProductIds","associatedObjectIds","productId","association","newAssociations","associatedObjectName","itemsAdded","setGridOptions","gridOptions","initializePagination","initialize","bindRefreshOnSortChanged","on","needLoadMoreData","$on","event","notification","errorCount","finished","commandCancel","cancel","jobId","runBulkAction","registrationList","info","findIndex","addCatalog","newCatalog","addVirtualCatalog","newVirtualCatalog","formScope","initializeBlade","securityScopes","canSave","$valid","initializeToolbar","metaFields","getMetaFields","parentRefresh","currentEntityId","childrenBlades","setForm","form","cancelChanges","save","gridsterOpts","maxRows","columns","settings","promise","$promise","selectedValues","languageCode","defaultValue","toLowerCase","isDefault","defaultLanguage","openDictionarySettingManagement","isApiSave","$watch","promiseData","newModel","without","authService","showMore","sort","getSortExpression","openItemsBlade","level","subtitleValues","filterKeyword","isCopyIdMenuVisible","selectNode","catalogsSelectedCatalog","catalogsSelectedCategoryId","copyItemID","navigator","clipboard","writeText","catch","e","console","editCatalog","isVirtual","showCatalogBlade","deleteCatalog","showDialog","checkPermission","doShowAllCatalogs","onAfterCatalogSelected","pb","showNewItemWizard","setTrackInventory","product","trackInventory","availableTypes","addCategory","newCategory","parentCategoryId","addLinkedCategory","addProduct","isDefined","newItemInCategory","newItemInCatalog","$sessionStorage","transformByFilters","selectAllRows","cutList","catalogClipboardContent","isItemsChecked","listEntryLinks","deletingLink","links","listEntryId","listEntryType","listCategoryLinkCount","idsToDelete","categoryCount","itemCount","listItemLinkCount","deletelinks","mode","slice","breadCrumb","category","navigate","disableOpenAnimation","setBreadcrumbs","clearSelectedRows","setSelectedItem","showCategoryBlade","cut","openNewBlade","ctrlKey","isBrowsingLinkedCategory","hasLinks","listEntry","l","move","mapCommand","bulkcreatelinks","SearchCriteria","CatalogId","CategoryId","createlinks","mapChecked","$path","join","appliedKeyword","codeValidator","test","taxTypes","FileUploader","descriptions","editAsMarkdown","hasAssetCreatePermission","fileUploader","Accept","autoUpload","removeAfterUpload","onBeforeUploadItem","fileItem","onSuccessItem","$broadcast","onErrorItem","_file","onCompleteAll","types","descriptionType","body","content","reviews","reviewType","Date","getTime","catalogSearchFilterId","current","change","api","assets","newValue","oldValue","imageTypes","useExternalUrl","uploader","getImageUrl","folderPath","imageType","relative","image","isImage","onAfterAddingAll","addedItems","element","folderUrl","addImageFromUrlHandler","addImageDirectlyFromUrl","addImageFromUrl","newExternalImageUrl","uploadFromUrl","split","pop","relativeUrl","onSelect","entity","selectedLanguageCode","toggleImageSelect","$selected","copyUrl","promptMessage","window","prompt","changeImageCategory","$item","$model","linkAssets","maxEntity","sortOrder","asset","getEntityGridIndex","searchEntity","grid","renderContainers","visibleRowCache","row","idx","isEqual","removeItem","downloadUrl","open","removeAction","selectedImages","currentImage","showGalleryDialog","priorityChanged","rowEntity","cellNav","scrollToFocus","colDef","enableCellEditOnFocus","afterCellEdit","priorityValid","gridOptionExtension","uiGridValidateService","setValidator","method","file","toggleAssetSelect","selected","converted","mimeType","contentType","associationGroups","tags","groupName","allCatalogIds","populateProductCatalogs","processProductsAssociations","categoryAssociations","processCategoryAssociations","findCatalogs","uniqueCatalogIds","$$catalog","$$catalogId","apply","undeletedEntries","difference","onSaveChanges","draggableRows","rowFinishDrag","i","members","fillItem","productTypeName","instant","linkWithPriority","getLinkWithPriority","_priority","origItem","metaFields1","metaFields2","catalogResult","cloneItem","datepickers","$event","which","preventDefault","stopPropagation","fetchVendors","criteria","openVendorsManagement","setting","associationsAdded","associationsDeleted","associationIds","predicate","contains","packageTypeUtils","usePackageType","measureUnit","height","width","weightUnits","measureUnits","packageTypeId","usePackageTypeValue","packageType","packageTypes","getPackageTypes","weightUnit","weight","$q","valueTypes","propertyValidators","availableValueTypes","doValidateNameAsync","isNameValid","errorData","errorMessage","validateName","originalName","errors","newBladeData","messageValues","dictionaryValues","entry","parseFloat","filterFilter","pageNumber","mainProductId","withHidden","searchProducts","variations","selectVariation","toolbarCommandsAndEvents","newVariation","registerRowsProcessor","singleFilter","renderableRows","visibleCount","visible","searchText","filteredEntitiesCount","resetNewValue","attributeNameValidator","attributes","add","$setPristine","checkAll","propertyId","propertyType","duplicatedName","validationRule","validationRules","currentChild","hasMultivalue","hasDictionary","hasMultilanguage","availablePropertyTypes","multivalue","dictionary","multilanguage","validateCategoryPropertyName","newCategoryProperty","newCatalogProperty","openChild","childType","titleValues","doDeleteValues","isManageable","propDictItems","localizedValues","lang","dictValue","dictionaryItem","searchPhrase","propertyIds","dictItem","core","dictItemsIds","deleteDictItem","selectedDictItem","alias","propertiesForExclude","filteredProperties","emptyProperties","propertyFilter","applyFilter","userName","originalEntity","editUnmanageable","bladeData","propertiesVisible","propertyVisibleCommand","switchPropertiesVisibility","isPropertyChanged","oldItem","y","comparePropValues","oldValues","valueId","localeCompare","isPropertyVisible","includes","isPropertyHasValues","resetFilter","saveFilter","getPropertyDisplayName","first","displayNames","startsWith","editProperty","getPropValues","propId","countToSkip","countToTake","isFormValid","isAnyChanges","filteredPropertiesNames","addPropertyButtonNameKey","hasOwnProperty","entityType","editPropertyFilter","selectedProperties","propertiesByType","$$hiddenLanguages","language","propertyValue","required","existingFilteredProperties","selectAllInGroup","groupKey","allEntities","clearAllInGroup","sortSelected","sortBy","hasChangedProperties","isChanged","flatten","allProperties","groupBy","selectedType","createProperty","typeName","selectOption","option","rule","propertyValidationRule","isLimited","charCountMin","charCountMax","isSpecificPattern","regExp","selectedLimit","characterLimit","validationPatterns","pattern","selectedPattern","newValues","vendor","vendors","vendorProp","updatePropertyValue","propName","memberType","$resource","videos","currentForm","create","contentUrl","ownerId","owner","ownerType","statusText","languagesPromise","Id","finally","videoOptions","ownerIds","single","resp","uiGridExtension","breadcrumb","withProducts","gridColumns","searchedKeyword","isCatalogSelectMode","onCatalogsLoaded","objectTypes","onItemsLoaded","selectItemFn","getBladeForCategories","customCategoriesBlade","variationsToolbarCommandsAndEvents","externalRegisterApiCallback","fnGetBladeForItem","customBlade","registerDataChangeCallback","selectRow","dataChange","ROW","rowSelectionChanged","gridId","isRowSelectable","isFunction","isItemSelectable","columnDefs","tryExtendGridOptions","registrationsList","registration","catalogImportService","searchlinks","setEntryPath","linkImage","names","outline","outlines","$$path","openAddLinksBlade","categoriesBlade","isLinkToSameCategory","marked","loadedCategories","loadedCategoriesIds","categoryLinks","loadedCategory","categoryLinkResult","loadedCatalogs","loadedCatalogIds","catalogLinkData","loadedCatalog","catalogLinkResult","link","enableGridMenu","directive","restrict","require","ngModel","replace","transclude","elem","attrs","showFilterDetailBlade","isDetailBladeOpen","$parse","$templateCache","hiddenLanguages","pageSize","attr","ctrls","linker","ngModelController","needAddEmptyValue","setValid","context","$setValidity","$modelValue","currentPropValues","allDictionaryValues","langValuesMap","langGroup","currentValues","nonNullNewValues","nonNullCurrentValues","elementCountIsDifferent","elementsNotEqual","currentValue","isValuesDifferent","isInherited","$setViewValue","$render","templateName","langValuesGroup","allValues","cache","el","$destroy","html","trim","newScope","$new","isLanguageVisible","loadDictionaryValues","$select","page","loadNextDictionaryValues","dictItems","DateTime","dateOptions","datepickerMode","clone","append","tagsDeleted","tag","tagsAdded","addederror","minValue","maxValue","RegExp","imageUrl","prefix","$sce","trustAsResourceUrl","isArray","getCatalogs","params","getByIds","getMappingConfiguration","namePattern","baseUrl","union","catalogImgHelper","setCurrentEntities","openCatalogPropertyBlade","currentBlade","widget","propertiesCount","openPropertiesBlade","count","descr","widgetAction","packageTypeApi","query","openItemPropertyBlade","variartionCount","openVariationListBlade","pricelist","openLinksBlade","linksCount","associatedObjectImg","$update","categoryListBlade","stores","initialName","lastGeneratedName","storesPromise","createItem","dbItem","seoInfos","isActive","stringForSlug","val","semanticUrl","initializeSEO","seoInfo","seoContainerObject","getUnfilledProperties","p","currVal"],"sourceRoot":""}