{"version":3,"file":"app.js","mappings":"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","sources":["webpack://VirtoCommerce.Marketing/./Scripts/marketing.js","webpack://VirtoCommerce.Marketing/./Scripts/common/marketing-main.js","webpack://VirtoCommerce.Marketing/./Scripts/dynamicContent/blades/dynamicContent-list.js","webpack://VirtoCommerce.Marketing/./Scripts/dynamicContent/blades/items/add.js","webpack://VirtoCommerce.Marketing/./Scripts/dynamicContent/blades/items/item-detail.js","webpack://VirtoCommerce.Marketing/./Scripts/dynamicContent/blades/items/itemFolder-detail.js","webpack://VirtoCommerce.Marketing/./Scripts/dynamicContent/blades/items/list.js","webpack://VirtoCommerce.Marketing/./Scripts/dynamicContent/blades/placeholders/add.js","webpack://VirtoCommerce.Marketing/./Scripts/dynamicContent/blades/placeholders/folder-details.js","webpack://VirtoCommerce.Marketing/./Scripts/dynamicContent/blades/placeholders/list.js","webpack://VirtoCommerce.Marketing/./Scripts/dynamicContent/blades/placeholders/placeholder-details.js","webpack://VirtoCommerce.Marketing/./Scripts/dynamicContent/blades/publishing/add-content-items.js","webpack://VirtoCommerce.Marketing/./Scripts/dynamicContent/blades/publishing/add-placeholders.js","webpack://VirtoCommerce.Marketing/./Scripts/dynamicContent/blades/publishing/list.js","webpack://VirtoCommerce.Marketing/./Scripts/dynamicContent/blades/publishing/publication-detail.js","webpack://VirtoCommerce.Marketing/./Scripts/dynamicContent/resources/dynamicContents.js","webpack://VirtoCommerce.Marketing/./Scripts/promotion/blades/catalog-entry-list.js","webpack://VirtoCommerce.Marketing/./Scripts/promotion/blades/coupon-detail.js","webpack://VirtoCommerce.Marketing/./Scripts/promotion/blades/coupon-import-processing.js","webpack://VirtoCommerce.Marketing/./Scripts/promotion/blades/coupon-import.js","webpack://VirtoCommerce.Marketing/./Scripts/promotion/blades/coupon-list.js","webpack://VirtoCommerce.Marketing/./Scripts/promotion/blades/filter-detail.js","webpack://VirtoCommerce.Marketing/./Scripts/promotion/blades/promotion-detail.js","webpack://VirtoCommerce.Marketing/./Scripts/promotion/blades/promotion-expressions.js","webpack://VirtoCommerce.Marketing/./Scripts/promotion/blades/promotion-list.js","webpack://VirtoCommerce.Marketing/./Scripts/promotion/resources/promotions.js","webpack://VirtoCommerce.Marketing/./Scripts/promotion/widgets/couponsWidget.js","webpack://VirtoCommerce.Marketing/./Scripts/promotion/widgets/dashboard.js"],"sourcesContent":["//Call this to register our module to main application\nvar moduleName = \"virtoCommerce.marketingModule\";\n\nif (AppDependencies != undefined) {\n AppDependencies.push(moduleName);\n}\n\nangular.module(moduleName, [])\n .config(\n ['$stateProvider', function ($stateProvider) {\n $stateProvider\n .state('workspace.marketing', {\n url: '/marketing',\n templateUrl: '$(Platform)/Scripts/common/templates/home.tpl.html',\n controller: [\n '$scope', 'platformWebApp.bladeNavigationService', function ($scope, bladeNavigationService) {\n var blade = {\n id: 'marketing',\n title: 'marketing.blades.marketing-main.title',\n controller: 'virtoCommerce.marketingModule.marketingMainController',\n template: 'Modules/$(VirtoCommerce.Marketing)/Scripts/common/marketing-main.tpl.html',\n isClosingDisabled: true\n };\n bladeNavigationService.showBlade(blade);\n }\n ]\n });\n }])\n\n\n .factory('virtoCommerce.marketingModule.marketingMenuItemService', function () {\n return {\n items: [],\n register: function (item) {\n this.items.push(item);\n }\n };\n })\n\n .run(['$http', '$compile', 'platformWebApp.mainMenuService', 'platformWebApp.widgetService', 'platformWebApp.toolbarService', 'platformWebApp.breadcrumbHistoryService', '$state', 'platformWebApp.authService', 'virtoCommerce.storeModule.stores', 'platformWebApp.permissionScopeResolver', 'platformWebApp.bladeNavigationService', 'virtoCommerce.coreModule.common.dynamicExpressionService', 'virtoCommerce.marketingModule.marketingMenuItemService'\n , function ($http, $compile, mainMenuService, widgetService, toolbarService, breadcrumbHistoryService, $state, authService, stores, permissionScopeResolver, bladeNavigationService, dynamicExpressionService, marketingMenuItemService) {\n //Register module in main menu\n var menuItem = {\n path: 'browse/marketing',\n icon: 'fa fa-flag',\n title: 'marketing.main-menu-title',\n priority: 40,\n action: function () { $state.go('workspace.marketing'); },\n permission: 'marketing:access'\n };\n mainMenuService.addMenuItem(menuItem);\n\n // Register marketing main blade items\n marketingMenuItemService.register({ id: '1', name: 'Promotions', entityName: 'promotion', icon: 'fa-area-chart' });\n marketingMenuItemService.register({ id: '2', name: 'Dynamic content', entityName: 'dynamicContent', icon: 'fa-calendar-o' });\n\n // register back-button\n toolbarService.register(breadcrumbHistoryService.getBackButtonInstance(), 'virtoCommerce.marketingModule.itemsDynamicContentListController');\n toolbarService.register(breadcrumbHistoryService.getBackButtonInstance(), 'virtoCommerce.marketingModule.placeholdersDynamicContentListController');\n toolbarService.register(breadcrumbHistoryService.getBackButtonInstance(), 'virtoCommerce.marketingModule.addPublishingContentItemsStepController');\n toolbarService.register(breadcrumbHistoryService.getBackButtonInstance(), 'virtoCommerce.marketingModule.addPublishingPlaceholdersStepController');\n\n widgetService.registerWidget({\n controller: 'virtoCommerce.marketingModule.couponsWidgetController',\n template: 'Modules/$(VirtoCommerce.Marketing)/Scripts/promotion/widgets/couponsWidget.tpl.html'\n }, 'promotionDetail');\n\n //Register permission scopes templates used for scope bounded definition in role management ui\n var marketingStoreScope = {\n type: 'MarketingStoreSelectedScope',\n title: 'Only for promotions in selected stores',\n selectFn: function (blade, callback) {\n var newBlade = {\n id: 'store-pick',\n title: this.title,\n subtitle: 'Select stores',\n currentEntity: this,\n onChangesConfirmedFn: callback,\n dataService: stores,\n controller: 'platformWebApp.security.scopeValuePickFromSimpleListController',\n template: '$(Platform)/Scripts/app/security/blades/common/scope-value-pick-from-simple-list.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n }\n };\n permissionScopeResolver.register(marketingStoreScope);\n\n //Register dashboard widgets\n //widgetService.registerWidget({\n // isVisible: function (blade) { return authService.checkPermission('marketing:read'); },\n // controller: 'virtoCommerce.marketingModule.dashboard.promotionsWidgetController',\n // template: 'tile-count.html'\n //}, 'mainDashboard');\n\n dynamicExpressionService.registerExpression({\n id: 'ConditionHasNoSalePrice',\n displayName: 'Apply only to full price items and not sales items'\n });\n\n var catalogGroupName = \"Catalog\";\n dynamicExpressionService.registerExpression({\n groupName: catalogGroupName,\n id: 'DynamicContentConditionCategoryIs',\n templateURL: 'expression-ConditionCategoryIs.html',\n displayName: 'Specific category'\n });\n dynamicExpressionService.registerExpression({\n groupName: catalogGroupName,\n id: 'DynamicContentConditionProductIs',\n templateURL: 'expression-ConditionEntryIs.html',\n displayName: 'Specific product'\n });\n\n $http.get('Modules/$(VirtoCommerce.Marketing)/Scripts/dynamicConditions/templates.html').then(function (response) {\n // compile the response, which will put stuff into the cache\n $compile(response.data);\n });\n }]);\n","angular.module('virtoCommerce.marketingModule')\n .controller('virtoCommerce.marketingModule.marketingMainController', ['$scope', 'platformWebApp.bladeNavigationService', 'virtoCommerce.marketingModule.marketingMenuItemService', function ($scope, bladeNavigationService, marketingMenuItemService) {\n $scope.selectedNodeId = null;\n\n function initializeBlade() {\n var entities = _.sortBy(marketingMenuItemService.items, 'id');\n $scope.blade.currentEntities = entities;\n $scope.blade.isLoading = false;\n\n $scope.blade.openBlade(entities[0]);\n }\n\n $scope.blade.openBlade = function(data) {\n $scope.selectedNodeId = data.id;\n\n var newBlade = {\n id: 'marketingMainListChildren',\n title: data.name,\n subtitle: 'Marketing service',\n controller: data.controller || 'virtoCommerce.marketingModule.' + data.entityName + 'ListController',\n template: data.template || 'Modules/$(VirtoCommerce.Marketing)/Scripts/' + data.entityName + '/blades/' + data.entityName + '-list.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, $scope.blade);\n };\n\n $scope.blade.headIcon = 'fa fa-flag';\n\n initializeBlade();\n}]);\n","angular.module('virtoCommerce.marketingModule')\n.controller('virtoCommerce.marketingModule.dynamicContentListController', ['$scope', 'platformWebApp.bladeNavigationService', function ($scope, bladeNavigationService) {\n var blade = $scope.blade;\n\n $scope.selectedNodeId = null;\n\n function initializeBlade() {\n var entities = [\n { id: 'DC_1', name: 'marketing.blades.items.list.title', subname: 'marketing.blades.items.list.subtitle', title: 'marketing.blades.dynamicContent-list.menu.items.title', description: 'marketing.blades.dynamicContent-list.menu.items.description', icon: 'fa-inbox', entityName: 'items' },\n { id: 'DC_2', name: 'marketing.blades.placeholders.list.title', subname: 'marketing.blades.placeholders.list.subtitle', title: 'marketing.blades.dynamicContent-list.menu.placeholders.title', description: 'marketing.blades.dynamicContent-list.menu.placeholders.description', icon: 'fa-location-arrow', entityName: 'placeholders' },\n { id: 'DC_3', name: 'marketing.blades.publishing.list.title', subname: 'marketing.blades.publishing.list.subtitle', title: 'marketing.blades.dynamicContent-list.menu.publishing.title', description: 'marketing.blades.dynamicContent-list.menu.publishing.description', icon: 'fa-paperclip', entityName: 'publishing' }];\n blade.currentEntities = entities;\n blade.isLoading = false;\n };\n\n blade.openBlade = function (data) {\n $scope.selectedNodeId = data.id;\n\n var newBlade = {\n id: 'dynamicContentList',\n title: data.name,\n subtitle: data.subname,\n controller: 'virtoCommerce.marketingModule.' + data.entityName + 'DynamicContentListController',\n template: 'Modules/$(VirtoCommerce.Marketing)/Scripts/dynamicContent/blades/' + data.entityName + '/list.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n }\n\n $scope.blade.headIcon = 'fa fa-calendar-o';\n\n initializeBlade();\n}]);\n","angular.module('virtoCommerce.marketingModule')\n.controller('virtoCommerce.marketingModule.addContentItemsElementController', ['$scope', 'platformWebApp.bladeNavigationService', 'virtoCommerce.catalogModule.categories', 'virtoCommerce.catalogModule.items', 'platformWebApp.dynamicProperties.api', function ($scope, bladeNavigationService, categories, items, dynamicProperties) {\n\tvar blade = $scope.blade;\n\t$scope.pageSettings = {};\n $scope.pageSettings.totalItems = 0;\n $scope.pageSettings.currentPage = 1;\n $scope.pageSettings.numPages = 5;\n $scope.pageSettings.itemsPerPageCount = 999;\n\n\tblade.addFolder = function () {\n\t\tvar data = { name: '', description: '', parentFolderId: blade.chosenFolder, items: [], childrenFolders: [] };\n\t\tblade.addNewFolder(data);\n\t};\n\n\tblade.addContentItem = function () {\n\t\tvar start = $scope.pageSettings.currentPage * $scope.pageSettings.itemsPerPageCount - $scope.pageSettings.itemsPerPageCount;\n\t\tdynamicProperties.query({ id: 'VirtoCommerce.MarketingModule.Core.Model.DynamicContentItem' }, function (data) {\n\t angular.forEach(data, function (item){\n\t \titem.values = [];\n\t \titem.displayNames = [];\n\t });\n\t var contentItem = { name: '', description: '', folderId: blade.chosenFolder, dynamicProperties: data };\n\t blade.addNewContentItem(contentItem);\n\t });\n\t};\n\n\t$scope.blade.isLoading = false;\n}]);\n","angular.module('virtoCommerce.marketingModule')\n .controller('virtoCommerce.marketingModule.itemDetailController', ['$scope', 'virtoCommerce.marketingModule.dynamicContent.contentItems', 'platformWebApp.bladeNavigationService', 'platformWebApp.dialogService', 'platformWebApp.dynamicProperties.dictionaryItemsApi', 'platformWebApp.settings', 'platformWebApp.dynamicProperties.api',\n function ($scope, dynamicContentItemsApi, bladeNavigationService, dialogService, dictionaryItemsApi, settings, dynamicPropertiesApi) {\n var blade = $scope.blade;\n blade.updatePermission = 'marketing:update';\n\n blade.refresh = function () {\n if (!blade.isNew) {\n dynamicContentItemsApi.get({ id: blade.entity.id }, function (response) {\n dynamicPropertiesApi.search({\n objectType: blade.entity.objectType,\n take: 10000 // It is for getting all object dynamic properties\n }, function (dynamicPropertiesResponse) {\n var rawDynamicProperties = dynamicPropertiesResponse.results;\n _.each(rawDynamicProperties, function (prop) {\n prop.values = [];\n var filteredProperty = _.find(response.dynamicProperties, function (o) { return o.id === prop.id; });\n if (filteredProperty) {\n prop.values = filteredProperty.values;\n }\n })\n response.dynamicProperties = rawDynamicProperties;\n blade.entity = response;\n blade.currentEntity = response;\n blade.initialize();\n });\n });\n } else {\n blade.initialize();\n }\n };\n\n blade.IsChanged = function () {\n // Changes check method ensures the fact of different presentation way of dynamic properties:\n // In the whole object and dynamic properties thru va-generic-value-input template directive\n // First check objects for full equivalence\n let equals = angular.equals(blade.origEntity, blade.currentEntity);\n if (equals)\n return false;\n else if (blade.origEntity.name !== blade.currentEntity.name || blade.origEntity.description !== blade.currentEntity.description)\n return true;\n // This validation logic is only needed for dynamic properties\n else {\n // Check possibility they are really equivalent but have a different representation of dynamic property value\n equals = angular.equals(_.omit(blade.origEntity, ['dynamicProperties']), _.omit(blade.currentEntity, ['dynamicProperties']));\n if (!blade.origEntity.dynamicProperties ||\n !blade.currentEntity.dynamicProperties ||\n !blade.origEntity.dynamicProperties.length ||\n !blade.currentEntity.dynamicProperties.length)\n return equals;\n\n for (var originalEntityDynamicProperty of blade.origEntity.dynamicProperties) {\n let currentEntityDynamicProperty = blade.currentEntity.dynamicProperties.find(x => x.name == originalEntityDynamicProperty.name);\n\n if (originalEntityDynamicProperty.isDictionary) {\n // dictionaries comparison\n // Case when both orig and current values are empty,\n // dictionary field clearing (press 'Backspace') after selection is reason to currentEntityDynamicProperty undefined value.\n let currDictionaryValuesIds = currentEntityDynamicProperty.values.filter(x => x.value != undefined).map(x => x.value.id);\n // 'Every' func require length check\n equals = originalEntityDynamicProperty.values.length\n ? originalEntityDynamicProperty.values.every(x => currDictionaryValuesIds.includes(x.valueId))\n : !currDictionaryValuesIds.length;\n }\n else if (originalEntityDynamicProperty.isArray) {\n // arrays comparison\n // Check arrays equality (adding an element after the same element deletation)\n let originalValues = originalEntityDynamicProperty.values.map(x => x.value);\n let currentValues = currentEntityDynamicProperty.values.map(x => x.value);\n equals = originalEntityDynamicProperty.values.length == currentEntityDynamicProperty.values.length && originalValues.every(x => currentValues.includes(x));\n } else {\n // simple types\n currentEntityDynamicProperty.values = originalEntityDynamicProperty.values.length == 0\n ? currentEntityDynamicProperty.values.filter(x => x.value != '')\n : currentEntityDynamicProperty.values;\n equals = angular.equals(originalEntityDynamicProperty.values, currentEntityDynamicProperty.values);\n }\n if (!equals)\n break;\n }\n return !equals;\n }\n };\n\n blade.initialize = function () {\n blade.toolbarCommands = [];\n\n if (!blade.isNew) {\n blade.toolbarCommands = [\n {\n name: \"platform.commands.save\", icon: 'fas fa-save',\n executeMethod: function () {\n blade.saveChanges();\n },\n canExecuteMethod: function () {\n return blade.IsChanged() && $scope.formScope.$valid;\n },\n permission: blade.updatePermission\n },\n {\n name: \"platform.commands.reset\", icon: 'fa fa-undo',\n executeMethod: function () {\n angular.copy(blade.origEntity, blade.currentEntity);\n },\n canExecuteMethod: function () {\n return blade.IsChanged();\n },\n permission: blade.updatePermission\n },\n {\n name: \"platform.commands.delete\", icon: 'fas fa-trash-alt',\n executeMethod: function () {\n var dialog = {\n id: \"confirmDeleteContentItem\",\n title: \"marketing.dialogs.content-item-delete.title\",\n message: \"marketing.dialogs.content-item-delete.message\",\n callback: function (remove) {\n if (remove) {\n blade.isLoading = true;\n dynamicContentItemsApi.delete({ ids: [blade.currentEntity.id] }, function () {\n blade.parentBlade.initializeBlade();\n bladeNavigationService.closeBlade(blade);\n });\n }\n }\n };\n\n dialogService.showConfirmationDialog(dialog);\n },\n canExecuteMethod: function () {\n return true;\n },\n permission: blade.updatePermission\n }\n ];\n }\n\n blade.toolbarCommands.push(\n {\n name: \"marketing.commands.manage-type-properties\", icon: 'fa fa-edit',\n executeMethod: function () {\n var newBlade = {\n id: 'dynamicPropertyList',\n objectType: blade.currentEntity.objectType,\n controller: 'platformWebApp.dynamicPropertyListController',\n template: '$(Platform)/Scripts/app/dynamicProperties/blades/dynamicProperty-list.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n },\n canExecuteMethod: function () {\n return angular.isDefined(blade.currentEntity.objectType);\n }\n });\n\n blade.origEntity = blade.entity;\n blade.currentEntity = angular.copy(blade.origEntity);\n blade.isLoading = false;\n };\n\n blade.saveChanges = function () {\n blade.isLoading = true;\n\n if (blade.isNew) {\n dynamicContentItemsApi.save(blade.currentEntity, function (data) {\n blade.parentBlade.initializeBlade();\n bladeNavigationService.closeBlade(blade);\n });\n }\n else {\n dynamicContentItemsApi.update(blade.currentEntity, function (data) {\n blade.parentBlade.initializeBlade();\n blade.origEntity = angular.copy(blade.currentEntity);\n blade.isLoading = false;\n });\n }\n };\n\n $scope.editDictionary = function (property) {\n var newBlade = {\n id: \"propertyDictionary\",\n isApiSave: true,\n currentEntity: property,\n controller: 'platformWebApp.propertyDictionaryController',\n template: '$(Platform)/Scripts/app/dynamicProperties/blades/property-dictionary.tpl.html',\n onChangesConfirmedFn: function () {\n blade.currentEntity.dynamicProperties = angular.copy(blade.currentEntity.dynamicProperties);\n }\n };\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n $scope.getDictionaryValues = function (property, callback) {\n dictionaryItemsApi.query({ id: property.objectType, propertyId: property.id }, callback);\n };\n\n $scope.setForm = function (form) { $scope.formScope = form; };\n\n blade.headIcon = 'fa fa-inbox';\n\n settings.getValues({ id: 'VirtoCommerce.Core.General.Languages' }, function (data) {\n $scope.languages = data;\n });\n\n blade.refresh();\n }]);\n","angular.module('virtoCommerce.marketingModule')\n.controller('virtoCommerce.marketingModule.itemFolderDetailController', ['$scope', 'virtoCommerce.marketingModule.dynamicContent.folders', 'platformWebApp.bladeNavigationService', 'platformWebApp.dialogService', function ($scope, marketing_dynamicContents_res_folders, bladeNavigationService, dialogService) {\n var blade = $scope.blade;\n blade.updatePermission = 'marketing:update';\n \n blade.saveChanges = function () {\n blade.isLoading = true;\n\n if (blade.isNew) {\n marketing_dynamicContents_res_folders.save(blade.currentEntity, function (data) {\n blade.parentBlade.initializeBlade();\n bladeNavigationService.closeBlade(blade);\n blade.isLoading = false;\n });\n }\n else {\n marketing_dynamicContents_res_folders.update(blade.currentEntity, function () {\n blade.parentBlade.initializeBlade();\n blade.origEntity = angular.copy(blade.currentEntity);\n blade.isLoading = false;\n });\n }\n };\n\n blade.headIcon = 'fa fa-inbox';\n\n if (!blade.isNew) {\n blade.toolbarCommands = [\n {\n name: \"platform.commands.save\", icon: 'fas fa-save',\n executeMethod: blade.saveChanges,\n canExecuteMethod: function () {\n return !angular.equals(blade.origEntity, blade.currentEntity) && !$scope.formScope.$invalid;\n },\n permission: blade.updatePermission\n },\n {\n name: \"platform.commands.reset\", icon: 'fa fa-undo',\n executeMethod: function () {\n angular.copy(blade.origEntity, blade.currentEntity);\n },\n canExecuteMethod: function () {\n return !angular.equals(blade.origEntity, blade.currentEntity);\n },\n permission: blade.updatePermission\n },\n {\n name: \"platform.commands.delete\", icon: 'fas fa-trash-alt',\n executeMethod: function () {\n var dialog = {\n id: \"confirmDeleteContentItem\",\n title: \"marketing.dialogs.content-folder-delete.title\",\n message: \"marketing.dialogs.content-folder-delete.message\",\n callback: function (remove) {\n if (remove) {\n blade.isLoading = true;\n marketing_dynamicContents_res_folders.delete({ ids: [blade.currentEntity.id] }, function () {\n bladeNavigationService.closeBlade(blade);\n\n var pathSteps = blade.currentEntity.outline.split(';');\n var id = pathSteps[pathSteps.length - 2];\n blade.parentBlade.chosenFolder = id;\n blade.parentBlade.initializeBlade();\n });\n }\n }\n };\n dialogService.showConfirmationDialog(dialog);\n },\n canExecuteMethod: function () { return true; },\n permission: blade.updatePermission\n }\n ];\n }\n\n $scope.setForm = function (form) { $scope.formScope = form; };\n \n blade.origEntity = blade.entity;\n blade.currentEntity = angular.copy(blade.origEntity);\n blade.isLoading = false;\n}]);\n","angular.module('virtoCommerce.marketingModule')\n.controller('virtoCommerce.marketingModule.itemsDynamicContentListController', ['$scope', 'platformWebApp.bladeUtils', 'platformWebApp.uiGridHelper', 'platformWebApp.dialogService', 'virtoCommerce.marketingModule.dynamicContent.folders', 'virtoCommerce.marketingModule.dynamicContent.contentItems',\nfunction ($scope, bladeUtils, uiGridHelper, dialogService, dynamicContentFoldersApi, dynamicContentItemsApi) {\n var bladeNavigationService = bladeUtils.bladeNavigationService;\n var blade = $scope.blade;\n blade.headIcon = 'fa fa-inbox';\n blade.chosenFolderId = 'ContentItem';\n blade.currentEntity = {};\n\n blade.initializeBlade = function () {\n blade.refresh();\n };\n\n blade.addNew = function () {\n bladeNavigationService.closeChildrenBlades(blade, function () {\n $scope.selectedNodeId = null;\n\n var newBlade = {\n id: 'listItemChild',\n title: 'marketing.blades.items.add.title',\n subtitle: 'marketing.blades.items.add.subtitle',\n chosenFolder: blade.chosenFolderId,\n addNewContentItem: addNewContentItem,\n addNewFolder: addNewFolder,\n controller: 'virtoCommerce.marketingModule.addContentItemsElementController',\n template: 'Modules/$(VirtoCommerce.Marketing)/Scripts/dynamicContent/blades/items/add.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n });\n };\n\n function addNewContentItem(data) {\n var newBlade = {\n id: 'listItemChild',\n title: 'marketing.blades.items.content-item-details.title-new',\n subtitle: 'marketing.blades.items.content-item-details.subtitle-new',\n entity: data,\n isNew: true,\n controller: 'virtoCommerce.marketingModule.itemDetailController',\n template: 'Modules/$(VirtoCommerce.Marketing)/Scripts/dynamicContent/blades/items/item-detail.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n }\n\n function addNewFolder(data) {\n var newBlade = {\n id: 'listItemChild',\n title: 'marketing.blades.items.folder-details.title-new',\n subtitle: 'marketing.blades.items.folder-details.subtitle-new',\n entity: data,\n isNew: true,\n controller: 'virtoCommerce.marketingModule.itemFolderDetailController',\n template: 'Modules/$(VirtoCommerce.Marketing)/Scripts/dynamicContent/blades/items/itemFolder-detail.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n }\n\n blade.refresh = function () {\n blade.isLoading = true;\n dynamicContentItemsApi.search({\n skip: ($scope.pageSettings.currentPage - 1) * $scope.pageSettings.itemsPerPageCount,\n take: $scope.pageSettings.itemsPerPageCount,\n keyword: blade.searchKeyword,\n folderId: blade.chosenFolderId,\n sort: uiGridHelper.getSortExpression($scope),\n responseGroup: '18'\n }, function (data) {\n _.each(data.results, function (entry) {\n entry.isFolder = entry.objectType === 'DynamicContentFolder';\n });\n\n $scope.listEntries = data.results;\n $scope.pageSettings.totalItems = data.totalCount;\n setBreadcrumbs();\n blade.isLoading = false;\n });\n }\n\n blade.toolbarCommands = [\n {\n name: 'platform.commands.refresh', icon: 'fa fa-refresh',\n executeMethod: blade.refresh,\n canExecuteMethod: function () { return true; }\n }, {\n name: 'platform.commands.add', icon: 'fas fa-plus',\n executeMethod: blade.addNew,\n canExecuteMethod: function () { return true; }\n }, {\n name: 'platform.commands.delete', icon: 'fa fa-trash',\n executeMethod: function () {\n $scope.deleteItems($scope.gridApi.selection.getSelectedRows());\n },\n canExecuteMethod: function () {\n return $scope.gridApi && _.any($scope.gridApi.selection.getSelectedRows());\n }\n }];\n\n function setBreadcrumbs() {\n if (blade.breadcrumbs) {\n var breadcrumb = _.find(blade.breadcrumbs, function (b) { return b.id === blade.currentEntity.id; });\n if (!breadcrumb) {\n breadcrumb = generateBreadcrumb(blade.currentEntity);\n blade.breadcrumbs.push(breadcrumb);\n } else {\n var position = blade.breadcrumbs.indexOf(breadcrumb);\n blade.breadcrumbs = blade.breadcrumbs.slice(0, position + 1);\n }\n } else {\n blade.breadcrumbs = [generateBreadcrumb({ id: 'ContentItem', name: 'marketing.blades.items.list.bread-crumb-top', isFolder: true })];\n }\n }\n\n function generateBreadcrumb(node) {\n return {\n id: node.id,\n name: node.name,\n navigate: function () {\n $scope.selectNode(node);\n }\n };\n }\n\n var filter = $scope.filter = {};\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.clearKeyword = function () {\n blade.searchKeyword = null;\n blade.refresh();\n };\n\n $scope.selectNode = function (node) {\n bladeNavigationService.closeChildrenBlades(blade, function () {\n if (node.id && node.isFolder) {\n blade.currentEntity = node;\n blade.chosenFolderId = node.id;\n blade.refresh();\n } else {\n $scope.openDetailsBlade(node);\n }\n });\n };\n\n $scope.openDetailsBlade = function (node) {\n $scope.selectedNodeId = node.id;\n\n var newBlade = {\n id: 'listItemChild',\n entity: node,\n isNew: false\n };\n if (node.isFolder) {\n newBlade.title = 'marketing.blades.items.folder-details.title';\n newBlade.subtitle = 'marketing.blades.items.folder-details.subtitle';\n newBlade.controller = 'virtoCommerce.marketingModule.itemFolderDetailController';\n newBlade.template = 'Modules/$(VirtoCommerce.Marketing)/Scripts/dynamicContent/blades/items/itemFolder-detail.tpl.html';\n } else {\n newBlade.title = 'marketing.blades.items.content-item-details.title';\n newBlade.subtitle = 'marketing.blades.items.content-item-details.subtitle';\n newBlade.controller = 'virtoCommerce.marketingModule.itemDetailController';\n newBlade.template = 'Modules/$(VirtoCommerce.Marketing)/Scripts/dynamicContent/blades/items/item-detail.tpl.html';\n }\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n $scope.deleteItems = function (items) {\n bladeNavigationService.closeChildrenBlades(blade, function () {\n var dialog = {\n id: \"confirmDeleteContentItemsFolder\",\n title: \"marketing.dialogs.content-item-folder-delete.title\",\n message: \"marketing.dialogs.content-item-folder-delete.message\",\n callback: function (remove) {\n if (remove) {\n blade.isLoading = true;\n var folderItems = _.filter(items, function (i) { return i.isFolder; });\n if (folderItems.length) {\n dynamicContentFoldersApi.delete({\n ids: _.pluck(folderItems, 'id')\n }, blade.refresh);\n }\n var contentItems = _.filter(items, function (i) { return !i.isFolder; });\n if (contentItems.length) {\n dynamicContentItemsApi.delete({\n ids: _.pluck(contentItems, 'id')\n }, blade.refresh);\n }\n }\n }\n };\n dialogService.showConfirmationDialog(dialog);\n });\n };\n\n // ui-grid\n $scope.setGridOptions = function (gridOptions) {\n $scope.gridOptions = gridOptions;\n\n gridOptions.onRegisterApi = function (gridApi) {\n gridApi.core.on.sortChanged($scope, function () {\n if (!blade.isLoading) blade.refresh();\n });\n };\n\n bladeUtils.initializePagination($scope);\n };\n}]);\n","angular.module('virtoCommerce.marketingModule')\n.controller('virtoCommerce.marketingModule.addPlaceholderElementController', ['$scope', 'platformWebApp.bladeNavigationService', 'virtoCommerce.catalogModule.categories', 'virtoCommerce.catalogModule.items', function ($scope, bladeNavigationService, categories, items) {\n\tvar blade = $scope.blade;\n\n\tblade.addFolder = function () {\n\t\tvar data = { outline: '', name: '', description: '', parentFolderId: blade.chosenFolder};\n\t\tblade.addNewFolder(data);\n\t};\n\n\tblade.addPlaceholder = function () {\n\t var data = { name: '', description: '', imageUrl: 'Modules/$(VirtoCommerce.Marketing)/Content/images/noimage.png', folderId: blade.chosenFolder };\n\t\tblade.addNewPlaceholder(data);\n\t};\n\n\t$scope.blade.isLoading = false;\n}]);\n","angular.module('virtoCommerce.marketingModule')\n.controller('virtoCommerce.marketingModule.addFolderPlaceholderController', ['$scope', 'virtoCommerce.marketingModule.dynamicContent.folders', 'platformWebApp.bladeNavigationService', 'platformWebApp.dialogService', function ($scope, marketing_dynamicContents_res_folders, bladeNavigationService, dialogService) {\n var blade = $scope.blade;\n blade.updatePermission = 'marketing:update';\n\n blade.initialize = function () {\n blade.origEntity = blade.entity;\n blade.currentEntity = angular.copy(blade.origEntity);\n blade.isLoading = false;\n };\n\n blade.saveChanges = function () {\n if (blade.isNew) {\n marketing_dynamicContents_res_folders.save({}, blade.currentEntity, function () {\n blade.parentBlade.initialize();\n bladeNavigationService.closeBlade(blade);\n });\n }\n else {\n marketing_dynamicContents_res_folders.update({}, blade.currentEntity, function () {\n blade.origEntity = angular.copy(blade.currentEntity);\n blade.parentBlade.initialize();\n });\n }\n };\n\n if (!blade.isNew) {\n blade.toolbarCommands = [\n {\n name: \"platform.commands.save\", icon: 'fas fa-save',\n executeMethod: function () {\n blade.saveChanges();\n },\n canExecuteMethod: function () {\n return !angular.equals(blade.origEntity, blade.currentEntity) && !$scope.formScope.$invalid;\n },\n permission: blade.updatePermission\n },\n {\n name: \"platform.commands.reset\", icon: 'fa fa-undo',\n executeMethod: function () {\n angular.copy(blade.origEntity, blade.currentEntity);\n },\n canExecuteMethod: function () {\n return !angular.equals(blade.origEntity, blade.currentEntity);\n },\n permission: blade.updatePermission\n },\n {\n name: \"platform.commands.delete\", icon: 'fas fa-trash-alt',\n executeMethod: function () {\n var dialog = {\n id: \"confirmDeleteContentPlaceholdersFolder\",\n title: \"marketing.dialogs.placeholders-folder-delete.title\",\n message: \"marketing.dialogs.placeholders-folder-delete.message\",\n callback: function (remove) {\n if (remove) {\n blade.isLoading = true;\n marketing_dynamicContents_res_folders.delete({ ids: [blade.currentEntity.id] }, function () {\n var pathSteps = blade.currentEntity.outline.split(';');\n var id = pathSteps[pathSteps.length - 2];\n blade.parentBlade.chosenFolder = id;\n blade.parentBlade.initialize();\n\n bladeNavigationService.closeBlade(blade);\n });\n }\n }\n };\n dialogService.showConfirmationDialog(dialog);\n },\n canExecuteMethod: function () {\n return true;\n },\n permission: blade.updatePermission\n }\n ];\n }\n\n $scope.setForm = function (form) { $scope.formScope = form; };\n\n blade.headIcon = 'fa fa-location-arrow';\n\n blade.initialize();\n}]);\n","angular.module('virtoCommerce.marketingModule')\n.controller('virtoCommerce.marketingModule.placeholdersDynamicContentListController', ['$scope', 'platformWebApp.bladeUtils', 'platformWebApp.uiGridHelper', 'platformWebApp.dialogService', 'virtoCommerce.marketingModule.dynamicContent.folders', 'virtoCommerce.marketingModule.dynamicContent.contentPlaces',\nfunction ($scope, bladeUtils, uiGridHelper, dialogService, dynamicContentFoldersApi, contentPlacesApi) {\n var bladeNavigationService = bladeUtils.bladeNavigationService;\n var blade = $scope.blade;\n blade.headIcon = 'fa fa-location-arrow';\n blade.chosenFolderId = 'ContentPlace';\n blade.currentEntity = {};\n\n blade.initialize = function () {\n blade.refresh();\n };\n\n blade.addNew = function () {\n bladeNavigationService.closeChildrenBlades(blade, function () {\n $scope.selectedNodeId = null;\n\n var newBlade = {\n id: 'listItemChild',\n title: 'marketing.blades.placeholders.add.title',\n subtitle: 'marketing.blades.placeholders.add.subtitle',\n chosenFolder: blade.chosenFolderId,\n addNewFolder: addNewFolder,\n addNewPlaceholder: addNewPlaceholder,\n controller: 'virtoCommerce.marketingModule.addPlaceholderElementController',\n template: 'Modules/$(VirtoCommerce.Marketing)/Scripts/dynamicContent/blades/placeholders/add.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n });\n };\n\n function addNewFolder(data) {\n bladeNavigationService.closeChildrenBlades(blade, function () {\n var newBlade = {\n id: 'listItemChild',\n title: 'marketing.blades.placeholders.folder-details.title-new',\n subtitle: 'marketing.blades.placeholders.folder-details.subtitle-new',\n entity: data,\n isNew: true,\n controller: 'virtoCommerce.marketingModule.addFolderPlaceholderController',\n template: 'Modules/$(VirtoCommerce.Marketing)/Scripts/dynamicContent/blades/placeholders/folder-details.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n });\n }\n\n function addNewPlaceholder(data) {\n bladeNavigationService.closeChildrenBlades(blade, function () {\n var newBlade = {\n id: 'listItemChild',\n title: 'marketing.blades.placeholders.placeholder-details.title-new',\n subtitle: 'marketing.blades.placeholders.placeholder-details.subtitle-new',\n entity: data,\n isNew: true,\n controller: 'virtoCommerce.marketingModule.placeholderDetailController',\n template: 'Modules/$(VirtoCommerce.Marketing)/Scripts/dynamicContent/blades/placeholders/placeholder-details.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n });\n }\n\n blade.refresh = function () {\n blade.isLoading = true;\n contentPlacesApi.search({\n skip: ($scope.pageSettings.currentPage - 1) * $scope.pageSettings.itemsPerPageCount,\n take: $scope.pageSettings.itemsPerPageCount,\n keyword: blade.searchKeyword,\n folderId: blade.chosenFolderId,\n sort: uiGridHelper.getSortExpression($scope),\n responseGroup: '20'\n }, function (data) {\n _.each(data.results, function (entry) {\n entry.isFolder = entry.objectType === 'DynamicContentFolder';\n });\n\n $scope.listEntries = data.results;\n $scope.pageSettings.totalItems = data.totalCount;\n setBreadcrumbs();\n blade.isLoading = false;\n });\n };\n\n blade.toolbarCommands = [{\n name: 'platform.commands.refresh', icon: 'fa fa-refresh',\n executeMethod: blade.refresh,\n canExecuteMethod: function () { return true; }\n }, {\n name: 'platform.commands.add', icon: 'fas fa-plus',\n executeMethod: blade.addNew,\n canExecuteMethod: function () { return true; }\n }, {\n name: 'platform.commands.delete', icon: 'fa fa-trash',\n executeMethod: function () {\n $scope.deleteItems($scope.gridApi.selection.getSelectedRows());\n },\n canExecuteMethod: function () {\n return $scope.gridApi && _.any($scope.gridApi.selection.getSelectedRows());\n }\n }];\n\n function setBreadcrumbs() {\n if (blade.breadcrumbs) {\n var breadcrumb = _.find(blade.breadcrumbs, function (b) { return b.id === blade.currentEntity.id; });\n if (!breadcrumb) {\n breadcrumb = generateBreadcrumb(blade.currentEntity);\n blade.breadcrumbs.push(breadcrumb);\n } else {\n var position = blade.breadcrumbs.indexOf(breadcrumb);\n blade.breadcrumbs = blade.breadcrumbs.slice(0, position + 1);\n }\n } else {\n blade.breadcrumbs = [generateBreadcrumb({ id: 'ContentPlace', name: 'marketing.blades.placeholders.list.bread-crumb-top', isFolder: true })];\n }\n }\n\n function generateBreadcrumb(node) {\n return {\n id: node.id,\n name: node.name,\n navigate: function () {\n $scope.selectNode(node);\n }\n };\n }\n\n var filter = $scope.filter = {};\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.clearKeyword = function () {\n blade.searchKeyword = null;\n blade.refresh();\n };\n\n $scope.selectNode = function (node) {\n bladeNavigationService.closeChildrenBlades(blade, function () {\n if (node.id && node.isFolder) {\n blade.currentEntity = node;\n blade.chosenFolderId = node.id;\n blade.refresh();\n } else {\n $scope.openDetailsBlade(node);\n }\n });\n };\n\n $scope.openDetailsBlade = function (node) {\n $scope.selectedNodeId = node.id;\n\n var newBlade = {\n id: 'listItemChild',\n entity: node,\n isNew: false\n };\n if (node.isFolder) {\n newBlade.title = 'marketing.blades.placeholders.folder-details.title-new';\n newBlade.subtitle = 'marketing.blades.placeholders.folder-details.subtitle-new';\n newBlade.controller = 'virtoCommerce.marketingModule.addFolderPlaceholderController';\n newBlade.template = 'Modules/$(VirtoCommerce.Marketing)/Scripts/dynamicContent/blades/placeholders/folder-details.tpl.html';\n } else {\n newBlade.title = 'marketing.blades.placeholders.placeholder-details.title';\n newBlade.subtitle = 'marketing.blades.placeholders.placeholder-details.subtitle';\n newBlade.controller = 'virtoCommerce.marketingModule.placeholderDetailController';\n newBlade.template = 'Modules/$(VirtoCommerce.Marketing)/Scripts/dynamicContent/blades/placeholders/placeholder-details.tpl.html';\n }\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n $scope.deleteItems = function (items) {\n bladeNavigationService.closeChildrenBlades(blade, function () {\n var dialog = {\n id: \"confirmDeleteContentPlaceholdersFolder\",\n title: \"marketing.dialogs.placeholders-folder-delete.title\",\n message: \"marketing.dialogs.placeholders-folder-delete.message\",\n callback: function (remove) {\n if (remove) {\n blade.isLoading = true;\n var folderItems = _.filter(items, function (i) { return i.isFolder; });\n if (folderItems.length) {\n dynamicContentFoldersApi.delete({\n ids: _.pluck(folderItems, 'id')\n }, blade.refresh);\n }\n var placeholderItems = _.filter(items, function (i) { return !i.isFolder; });\n if (placeholderItems.length) {\n contentPlacesApi.delete({\n ids: _.pluck(placeholderItems, 'id')\n }, blade.refresh);\n }\n }\n }\n };\n dialogService.showConfirmationDialog(dialog);\n });\n };\n\n $scope.setGridOptions = function (gridOptions) {\n $scope.gridOptions = gridOptions;\n\n gridOptions.onRegisterApi = function (gridApi) {\n gridApi.core.on.sortChanged($scope, function () {\n if (!blade.isLoading) blade.refresh();\n });\n };\n\n bladeUtils.initializePagination($scope);\n };\n}]);\n","angular.module('virtoCommerce.marketingModule')\n.controller('virtoCommerce.marketingModule.placeholderDetailController', ['$scope', 'virtoCommerce.marketingModule.dynamicContent.contentPlaces', 'platformWebApp.bladeNavigationService', 'FileUploader', 'platformWebApp.dialogService', function ($scope, contentPlacesApi, bladeNavigationService, FileUploader, dialogService) {\n var blade = $scope.blade;\n blade.updatePermission = 'marketing:update';\n\n blade.origEntity = blade.entity;\n blade.currentEntity = angular.copy(blade.origEntity);\n\n blade.initialize = function () {\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 url: 'api/assets?folderUrl=placeholders-images',\n autoUpload: true,\n removeAfterUpload: true\n });\n\n uploader.onSuccessItem = function (fileItem, images, status, headers) {\n blade.currentEntity.imageUrl = images[0].url;\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\n if (!blade.isNew) {\n $scope.blade.toolbarCommands = [\n {\n name: \"platform.commands.save\", icon: 'fas fa-save',\n executeMethod: blade.saveChanges,\n canExecuteMethod: function () {\n return !angular.equals(blade.origEntity, blade.currentEntity) && !$scope.formScope.$invalid;\n },\n permission: blade.updatePermission\n },\n {\n name: \"platform.commands.reset\", icon: 'fa fa-undo',\n executeMethod: function () {\n angular.copy(blade.origEntity, blade.currentEntity);\n },\n canExecuteMethod: function () {\n return !angular.equals(blade.origEntity, blade.currentEntity);\n },\n permission: blade.updatePermission\n },\n {\n name: \"platform.commands.delete\", icon: 'fas fa-trash-alt',\n executeMethod: function () {\n var dialog = {\n id: \"confirmDeleteContentPlaceholder\",\n title: \"marketing.dialogs.content-placeholder-delete.title\",\n message: \"marketing.dialogs.content-placeholder-delete.message\",\n callback: function (remove) {\n if (remove) {\n blade.isLoading = true;\n contentPlacesApi.delete({ ids: [blade.currentEntity.id] }, function () {\n blade.parentBlade.initialize();\n bladeNavigationService.closeBlade(blade);\n });\n }\n }\n };\n dialogService.showConfirmationDialog(dialog);\n },\n canExecuteMethod: function () { return true; },\n permission: blade.updatePermission\n }\n ];\n }\n\n blade.isLoading = false;\n }\n\n blade.saveChanges = function () {\n blade.isLoading = true;\n\n if (blade.isNew) {\n contentPlacesApi.save({}, blade.currentEntity, function (data) {\n blade.parentBlade.initialize();\n bladeNavigationService.closeBlade(blade);\n });\n }\n else {\n contentPlacesApi.update({}, blade.currentEntity, function (data) {\n blade.parentBlade.initialize();\n blade.origEntity = angular.copy(blade.currentEntity);\n blade.isLoading = false;\n });\n }\n };\n\n $scope.setForm = function (form) { $scope.formScope = form; };\n\n $scope.blade.headIcon = 'fa fa-location-arrow';\n\n blade.initialize();\n}]);\n","angular.module('virtoCommerce.marketingModule')\n.controller('virtoCommerce.marketingModule.addPublishingContentItemsStepController', ['$scope', 'virtoCommerce.marketingModule.dynamicContent.contentItems', 'platformWebApp.bladeNavigationService', 'platformWebApp.bladeUtils', 'platformWebApp.uiGridHelper', function ($scope, dynamicContentItemsApi, bladeNavigationService, bladeUtils, uiGridHelper) {\n var blade = $scope.blade;\n blade.chosenFolder = 'ContentItem';\n blade.currentEntity = {};\n\n blade.refresh = function () {\n blade.isLoading = true;\n dynamicContentItemsApi.search({\n skip: ($scope.pageSettings.currentPage - 1) * $scope.pageSettings.itemsPerPageCount,\n take: $scope.pageSettings.itemsPerPageCount,\n folderId: blade.chosenFolder,\n sort: uiGridHelper.getSortExpression($scope),\n responseGroup: '18'\n }, function (data) {\n _.each(data.results, function (entry) {\n entry.isFolder = entry.objectType === 'DynamicContentFolder';\n });\n\n blade.currentEntity.listEntries = data.results;\n $scope.pageSettings.totalItems = data.totalCount;\n setBreadcrumbs();\n blade.isLoading = false;\n });\n };\n\n blade.publication.contentItems.forEach(function (el) {\n dynamicContentItemsApi.get({ id: el.id }, function (data) {\n var orEl = _.find(blade.parentBlade.origEntity.contentItems, function (contentItem) { return contentItem.id === el.id });\n if (!angular.isUndefined(orEl)) {\n orEl.path = data.path;\n orEl.outline = data.outline;\n orEl.dynamicProperties = data.dynamicProperties;\n orEl.objectType = data.objectType;\n }\n el.path = data.path;\n el.outline = data.outline;\n el.dynamicProperties = data.dynamicProperties;\n el.objectType = data.objectType;\n });\n });\n\n blade.deleteAllContentItems = function () {\n blade.publication.contentItems = [];\n $scope.gridApi.grid.queueGridRefresh();\n };\n\n blade.deleteContentItem = function (data) {\n blade.publication.contentItems = _.filter(blade.publication.contentItems, function (place) { return !angular.equals(data.id, place.id); });\n $scope.gridApi.grid.queueGridRefresh();\n };\n\n blade.selectNode = function (node) {\n if (node.isFolder) {\n browseFolder(node);\n } else {\n blade.publication.contentItems.push(node);\n $scope.gridApi.grid.queueGridRefresh();\n }\n };\n\n function browseFolder(node) {\n if (!blade.chosenFolder || !angular.equals(blade.chosenFolder, node.id)) {\n blade.chosenFolder = node.id;\n blade.currentEntity = node;\n blade.refresh();\n }\n }\n\n function setBreadcrumbs() {\n if (blade.breadcrumbs) {\n var breadcrumbs;\n var index = _.findLastIndex(blade.breadcrumbs, { id: blade.chosenFolder });\n if (index > -1) {\n //Clone array (angular.copy leaves the same reference)\n breadcrumbs = blade.breadcrumbs.slice(0, index + 1);\n }\n else {\n breadcrumbs = blade.breadcrumbs.slice(0);\n breadcrumbs.push(generateBreadcrumb(blade.currentEntity));\n }\n blade.breadcrumbs = breadcrumbs;\n } else {\n blade.breadcrumbs = [(generateBreadcrumb({ id: 'ContentItem', name: 'marketing.blades.publishing.add-content-items.bread-crumb-top' }))];\n }\n }\n\n function generateBreadcrumb(node) {\n return {\n id: node.id,\n name: node.name,\n navigate: function () { browseFolder(node); }\n };\n }\n\n // ui-grid\n $scope.setGridOptions = function (gridOptions) {\n $scope.gridOptions = gridOptions;\n\n gridOptions.onRegisterApi = function (gridApi) {\n gridApi.grid.registerRowsProcessor(function (renderableRows) {\n var visibleCount = 0;\n renderableRows.forEach(function (row) {\n row.visible = row.entity.isFolder || _.all(blade.publication.contentItems, function (ci) { return ci.id !== row.entity.id; });\n if (row.visible) visibleCount++;\n });\n\n $scope.filteredEntitiesCount = visibleCount;\n return renderableRows;\n }, 90);\n\n gridApi.core.on.sortChanged($scope, function () {\n if (!blade.isLoading) blade.refresh();\n });\n };\n\n bladeUtils.initializePagination($scope);\n };\n}]);\n","angular.module('virtoCommerce.marketingModule')\n.controller('virtoCommerce.marketingModule.addPublishingPlaceholdersStepController', ['$scope', 'virtoCommerce.marketingModule.dynamicContent.contentPlaces', 'platformWebApp.bladeNavigationService', 'platformWebApp.bladeUtils', 'platformWebApp.uiGridHelper', function ($scope, contentPlacesApi, bladeNavigationService, bladeUtils, uiGridHelper) {\n var blade = $scope.blade;\n blade.chosenFolder = 'ContentPlace';\n blade.currentEntity = {};\n\n blade.refresh = function () {\n blade.isLoading = true;\n contentPlacesApi.search({\n folderId: blade.chosenFolder,\n skip: ($scope.pageSettings.currentPage - 1) * $scope.pageSettings.itemsPerPageCount,\n take: $scope.pageSettings.itemsPerPageCount,\n sort: uiGridHelper.getSortExpression($scope),\n responseGroup: '20'\n }, function (data) {\n _.each(data.results, function (entry) {\n entry.isFolder = entry.objectType === 'DynamicContentFolder';\n });\n\n blade.currentEntity.listEntries = data.results;\n $scope.pageSettings.totalItems = data.totalCount;\n setBreadcrumbs();\n blade.isLoading = false;\n });\n };\n\n _.each(blade.publication.contentPlaces, function (el) {\n contentPlacesApi.get({ id: el.id }, function (data) {\n var orEl = _.find(blade.parentBlade.origEntity.contentPlaces, function (contentPlace) { return contentPlace.id === el.id });\n if (!angular.isUndefined(orEl)) {\n orEl.path = data.path;\n orEl.outline = data.outline;\n }\n el.path = data.path;\n el.outline = data.outline;\n });\n });\n\n blade.deleteAllPlaceholder = function () {\n blade.publication.contentPlaces = [];\n $scope.gridApi.grid.queueGridRefresh();\n };\n\n blade.deletePlaceholder = function (data) {\n blade.publication.contentPlaces = _.filter(blade.publication.contentPlaces, function (place) { return !angular.equals(data.id, place.id); });\n $scope.gridApi.grid.queueGridRefresh();\n };\n\n blade.selectNode = function (node) {\n if (node.isFolder) {\n browseFolder(node);\n } else {\n blade.publication.contentPlaces.push(node);\n $scope.gridApi.grid.queueGridRefresh();\n }\n };\n\n function browseFolder(node) {\n if (!blade.chosenFolder || !angular.equals(blade.chosenFolder, node.id)) {\n blade.chosenFolder = node.id;\n blade.currentEntity = node;\n blade.refresh();\n } else {\n blade.chosenFolder = node.parentFolderId;\n blade.currentEntity = undefined;\n }\n }\n\n function setBreadcrumbs() {\n if (blade.breadcrumbs) {\n var breadcrumbs;\n var index = _.findLastIndex(blade.breadcrumbs, { id: blade.chosenFolder });\n if (index > -1) {\n //Clone array (angular.copy leaves the same reference)\n breadcrumbs = blade.breadcrumbs.slice(0, index + 1);\n }\n else {\n breadcrumbs = blade.breadcrumbs.slice(0);\n breadcrumbs.push(generateBreadcrumb(blade.currentEntity));\n }\n blade.breadcrumbs = breadcrumbs;\n } else {\n blade.breadcrumbs = [(generateBreadcrumb({ id: 'ContentPlace', name: 'marketing.blades.publishing.add-placeholders.bread-crumb-top' }))];\n }\n }\n\n function generateBreadcrumb(node) {\n return {\n id: node.id,\n name: node.name,\n navigate: function () { browseFolder(node); }\n };\n }\n\n // ui-grid\n $scope.setGridOptions = function (gridOptions) {\n $scope.gridOptions = gridOptions;\n\n gridOptions.onRegisterApi = function (gridApi) {\n gridApi.grid.registerRowsProcessor(function (renderableRows) {\n var visibleCount = 0;\n renderableRows.forEach(function (row) {\n row.visible = row.entity.isFolder || _.all(blade.publication.contentPlaces, function (ci) { return ci.id !== row.entity.id; });\n if (row.visible) visibleCount++;\n });\n\n $scope.filteredEntitiesCount = visibleCount;\n return renderableRows;\n }, 90);\n\n gridApi.core.on.sortChanged($scope, function () {\n if (!blade.isLoading) blade.refresh();\n });\n };\n\n bladeUtils.initializePagination($scope);\n };\n}]);\n","angular.module('virtoCommerce.marketingModule')\n.controller('virtoCommerce.marketingModule.publishingDynamicContentListController', ['$scope', 'platformWebApp.bladeUtils', 'platformWebApp.uiGridHelper', 'platformWebApp.dialogService', 'virtoCommerce.marketingModule.dynamicContent.contentPublications',\nfunction ($scope, bladeUtils, uiGridHelper, dialogService, dynamicContentPublicationsApi) {\n var bladeNavigationService = bladeUtils.bladeNavigationService;\n var blade = $scope.blade;\n blade.headIcon = 'fa fa-paperclip';\n blade.isLoading = false;\n\n blade.initialize = function () {\n blade.refresh();\n };\n\n blade.removePublishings = function (selectedRows) {\n bladeNavigationService.closeChildrenBlades(blade, function () {\n var dialog = {\n id: 'confirmDeletePublishings',\n title: 'marketing.dialogs.publication-delete.title',\n message: 'marketing.dialogs.publication-delete.message',\n callback: function (confirm) {\n if (confirm) {\n var publishingIds = _.pluck(selectedRows, 'id');\n dynamicContentPublicationsApi.remove({ ids: publishingIds }, blade.refresh);\n }\n }\n };\n dialogService.showConfirmationDialog(dialog);\n });\n };\n\n blade.refresh = function () {\n blade.isLoading = true;\n dynamicContentPublicationsApi.search({\n skip: ($scope.pageSettings.currentPage - 1) * $scope.pageSettings.itemsPerPageCount,\n take: $scope.pageSettings.itemsPerPageCount,\n sort: uiGridHelper.getSortExpression($scope),\n responseGroup: '8',\n keyword: blade.searchKeyword\n }, function (data) {\n $scope.listEntries = data.results;\n $scope.pageSettings.totalItems = data.totalCount;\n blade.isLoading = false;\n });\n };\n\n blade.toolbarCommands = [{\n name: 'platform.commands.refresh', icon: 'fa fa-refresh',\n canExecuteMethod: function () { return true; },\n executeMethod: blade.refresh\n }, {\n name: 'platform.commands.add', icon: 'fas fa-plus',\n canExecuteMethod: function () { return true; },\n executeMethod: function () { $scope.selectNode({}, true); }\n }, {\n name: 'platform.commands.delete', icon: 'fa fa-trash',\n canExecuteMethod: isItemsChecked,\n executeMethod: function () {\n return blade.removePublishings($scope.gridApi.selection.getSelectedRows());\n }\n }];\n\n function isItemsChecked() {\n return $scope.gridApi && _.any($scope.gridApi.selection.getSelectedRows());\n }\n\n $scope.clearKeyword = function () {\n blade.searchKeyword = null;\n blade.refresh();\n };\n\n $scope.selectNode = function (node, isNew) {\n $scope.selectedNodeId = node.id;\n\n var newBlade = {\n isNew: isNew,\n controller: 'virtoCommerce.marketingModule.publicationDetailController',\n template: 'Modules/$(VirtoCommerce.Marketing)/Scripts/dynamicContent/blades/publishing/publication-detail.tpl.html'\n };\n\n if (isNew) {\n angular.extend(newBlade, {\n id: 'add_publishing_element',\n title: 'marketing.blades.publishing.publishing-main-step.title-new',\n subtitle: 'marketing.blades.publishing.publishing-main-step.subtitle-new'\n });\n } else {\n angular.extend(newBlade, {\n id: 'edit_publishing_element',\n title: 'marketing.blades.publishing.publishing-main-step.title',\n subtitle: 'marketing.blades.publishing.publishing-main-step.subtitle',\n currentEntity: node\n });\n }\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n $scope.deleteItems = function (items) {\n var dialog = {\n id: \"confirmDeleteContentPublications\",\n title: \"marketing.dialogs.content-item-folder-delete.title\",\n message: \"marketing.dialogs.content-item-folder-delete.message\",\n callback: function (remove) {\n if (remove) {\n dynamicContentPublicationsApi.remove({\n ids: _.pluck(items, 'id')\n }, function () {\n blade.refresh();\n });\n }\n }\n }\n dialogService.showConfirmationDialog(dialog);\n }\n\n $scope.setGridOptions = function (gridOptions) {\n $scope.gridOptions = gridOptions;\n\n gridOptions.onRegisterApi = function (gridApi) {\n gridApi.core.on.sortChanged($scope, function () {\n if (!blade.isLoading) blade.refresh();\n });\n };\n\n bladeUtils.initializePagination($scope);\n };\n}]);\n","angular.module('virtoCommerce.marketingModule')\n.controller('virtoCommerce.marketingModule.publicationDetailController', ['$scope', 'virtoCommerce.marketingModule.dynamicContent.contentPublications', 'platformWebApp.bladeNavigationService', 'virtoCommerce.coreModule.common.dynamicExpressionService', 'virtoCommerce.storeModule.stores', 'platformWebApp.dialogService', function ($scope, contentPublications, bladeNavigationService, dynamicExpressionService, stores, dialogService) {\n var blade = $scope.blade;\n blade.updatePermission = 'marketing:update';\n\n blade.initializeBlade = function () {\n if (!blade.isNew) {\n contentPublications.get({ id: blade.currentEntity.id }, function (data) {\n initializeBlade(data);\n\n blade.toolbarCommands = [\n {\n name: \"platform.commands.save\", icon: 'fas fa-save',\n executeMethod: function () {\n blade.saveChanges();\n },\n canExecuteMethod: function () {\n return blade.checkDifferense();\n },\n permission: blade.updatePermission\n },\n {\n name: \"platform.commands.reset\", icon: 'fa fa-undo',\n executeMethod: function () {\n angular.copy(blade.origEntity, blade.currentEntity);\n },\n canExecuteMethod: function () {\n return blade.checkDifferense();\n },\n permission: blade.updatePermission\n },\n {\n name: \"platform.commands.delete\", icon: 'fas fa-trash-alt',\n executeMethod: function () {\n var dialog = {\n id: \"confirmDeleteContentItem\",\n title: \"marketing.dialogs.publication-delete.title\",\n message: \"marketing.dialogs.publication-delete.message\",\n callback: function (remove) {\n if (remove) {\n blade.isLoading = true;\n contentPublications.delete({ ids: [blade.currentEntity.id] }, function () {\n blade.parentBlade.initialize();\n bladeNavigationService.closeBlade(blade);\n });\n }\n }\n };\n dialogService.showConfirmationDialog(dialog);\n },\n canExecuteMethod: function () { return true; },\n permission: blade.updatePermission\n }\n ];\n });\n }\n else {\n contentPublications.getNew(initializeBlade);\n }\n }\n\n function initializeBlade(data) {\n if (data.dynamicExpression) {\n _.each(data.dynamicExpression.children, extendElementBlock);\n groupAvailableChildren(data.dynamicExpression.children[0]);\n }\n\n blade.currentEntity = data;\n blade.origEntity = angular.copy(blade.currentEntity);\n blade.isLoading = false;\n $scope.$watch('blade.currentEntity', blade.autogenerateName, true);\n }\n\n blade.addPlaceholders = function () {\n bladeNavigationService.closeChildrenBlades(blade, function () {\n blade.selectedNodeId = 'addPlaceholders';\n var newBlade = {\n id: 'publishing_add_placeholders',\n title: 'marketing.blades.publishing.add-placeholders.title',\n subtitle: 'marketing.blades.publishing.add-placeholders.subtitle',\n publication: blade.currentEntity,\n controller: 'virtoCommerce.marketingModule.addPublishingPlaceholdersStepController',\n template: 'Modules/$(VirtoCommerce.Marketing)/Scripts/dynamicContent/blades/publishing/add-placeholders.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n });\n }\n\n blade.addContentItems = function () {\n bladeNavigationService.closeChildrenBlades(blade, function () {\n blade.selectedNodeId = 'addContentItems';\n var newBlade = {\n id: 'publishing_add_content_items',\n title: 'marketing.blades.publishing.add-content-items.title',\n subtitle: 'marketing.blades.publishing.add-content-items.subtitle',\n publication: blade.currentEntity,\n controller: 'virtoCommerce.marketingModule.addPublishingContentItemsStepController',\n template: 'Modules/$(VirtoCommerce.Marketing)/Scripts/dynamicContent/blades/publishing/add-content-items.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n });\n }\n\n blade.saveChanges = function () {\n bladeNavigationService.closeChildrenBlades(blade, function () {\n blade.isLoading = true;\n if (blade.currentEntity.dynamicExpression) {\n blade.currentEntity.dynamicExpression.availableChildren = undefined;\n _.each(blade.currentEntity.dynamicExpression.children, stripOffUiInformation);\n }\n\n if (blade.isNew) {\n contentPublications.save({}, blade.currentEntity, function (data) {\n blade.currentEntity = data;\n blade.origEntity = angular.copy(data);\n\n blade.isNew = false;\n blade.initializeBlade();\n blade.parentBlade.initialize();\n });\n }\n else {\n contentPublications.update({}, blade.currentEntity, function (data) {\n blade.currentEntity = data;\n blade.origEntity = angular.copy(data);\n\n blade.isNew = false;\n blade.initializeBlade();\n blade.parentBlade.initialize();\n }, function (error) {\n bladeNavigationService.setError(error.statusText, blade);\n });\n }\n });\n }\n\n blade.availableSave = function () {\n return !$scope.formScope.$invalid &&\n blade.currentEntity.contentItems.length > 0 &&\n blade.currentEntity.contentPlaces.length > 0;\n };\n \n blade.checkDifferense = function () {\n var retVal = !$scope.formScope.$invalid &&\n blade.currentEntity.contentItems.length > 0 &&\n blade.currentEntity.contentPlaces.length > 0;\n\n if (retVal) {\n retVal = !angular.equals(blade.currentEntity, blade.origEntity);\n\n if (!retVal) {\n var ciIdse = blade.currentEntity.contentItems.map(function (v) {\n return v.id;\n });\n\n var ciIdsoe = blade.origEntity.contentItems.map(function (v) {\n return v.id;\n });\n\n retVal = _.intersection(ciIdse, ciIdsoe).length < Math.max(ciIdse.length, ciIdsoe.length);\n }\n\n if (!retVal) {\n var cpIdse = blade.currentEntity.contentPlaces.map(function (v) {\n return v.id;\n });\n\n var cpIdsoe = blade.origEntity.contentPlaces.map(function (v) {\n return v.id;\n });\n\n retVal = _.intersection(cpIdse, cpIdsoe).length < Math.max(cpIdse.length, cpIdsoe.length);\n }\n }\n\n return retVal;\n };\n\n $scope.setForm = function (form) { $scope.formScope = form; };\n\n // datepicker\n $scope.datepickers = {\n endDate: false,\n startDate: false,\n }\n $scope.today = new Date();\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 'year-format': \"'yyyy'\",\n 'starting-day': 1\n };\n\n $scope.formats = ['shortDate', 'dd-MMMM-yyyy', 'yyyy/MM/dd'];\n $scope.format = $scope.formats[0];\n\n blade.headIcon = 'fa fa-paperclip';\n\n // Dynamic ExpressionBlock\n function extendElementBlock(expressionBlock) {\n var retVal = dynamicExpressionService.expressions[expressionBlock.id];\n if (!retVal) {\n retVal = { displayName: 'unknown element: ' + expressionBlock.id };\n }\n\n _.extend(expressionBlock, retVal);\n\n if (!expressionBlock.children) {\n expressionBlock.children = [];\n }\n\n _.each(expressionBlock.children, extendElementBlock);\n _.each(expressionBlock.availableChildren, extendElementBlock);\n return expressionBlock;\n }\n\n function groupAvailableChildren(expressionBlock) {\n results = _.groupBy(expressionBlock.availableChildren, 'groupName');\n expressionBlock.availableChildren = _.map(results, function (items, key) { return { displayName: key, subitems: items }; });\n }\n\n function stripOffUiInformation(expressionElement) {\n expressionElement.availableChildren = undefined;\n expressionElement.displayName = undefined;\n expressionElement.getValidationError = undefined;\n expressionElement.groupName = undefined;\n expressionElement.newChildLabel = undefined;\n expressionElement.templateURL = undefined;\n\n _.each(expressionElement.children, stripOffUiInformation);\n };\n\n String.prototype.trimLeft = function (charlist) {\n if (charlist === undefined)\n charlist = \"\\s\";\n\n return this.replace(new RegExp(\"^[\" + charlist + \"]+\"), \"\");\n };\n String.prototype.trimRight = function (charlist) {\n if (charlist === undefined)\n charlist = \"\\s\";\n\n return this.replace(new RegExp(\"[\" + charlist + \"]+$\"), \"\");\n };\n\n blade.focusNameInput = false;\n blade.autogenerateName = function () {\n if (!blade.focusNameInput) {\n\n\n var placeholderPublicationNamePart = '';\n var contentItemPublicationNamePart = '';\n\n if (!angular.isUndefined(blade.currentEntity)) {\n if (!angular.isUndefined(blade.currentEntity.contentPlaces) && blade.currentEntity.contentPlaces.length == 1) {\n placeholderPublicationNamePart = blade.currentEntity.contentPlaces[0].name;\n }\n\n if (!angular.isUndefined(blade.currentEntity.contentItems) && blade.currentEntity.contentItems.length == 1) {\n contentItemPublicationNamePart = blade.currentEntity.contentItems[0].name;\n }\n }\n\n var newName = (placeholderPublicationNamePart + '_' + contentItemPublicationNamePart).trimLeft('_').trimRight('_');\n\n //Here we disable replacing of entered text\n if (!angular.isUndefined(blade.currentEntity.name) && blade.currentEntity.name === '') {\n if (!angular.isUndefined(blade.currentEntity.name) && blade.currentEntity.name !== null && blade.currentEntity.name !== '' && newName !== '_') {\n if (blade.currentEntity.name.indexOf(placeholderPublicationNamePart) >= 0 || blade.currentEntity.name.indexOf(contentItemPublicationNamePart) >= 0) {\n blade.currentEntity.name = newName;\n }\n }\n else if (newName !== '_') {\n blade.currentEntity.name = newName;\n }\n }\n }\n }\n\n blade.initializeBlade();\n $scope.stores = stores.query();\n}]);\n","angular.module('virtoCommerce.marketingModule')\n .factory('virtoCommerce.marketingModule.dynamicContent.contentItems', ['$resource', function ($resource) {\n return $resource('api/marketing/contentitems/:id', null, {\n search: { method: 'POST', url: 'api/marketing/contentitems/listentries/search' },\n create: { method: 'POST' },\n update: { method: 'PUT' }\n });\n }])\n .factory('virtoCommerce.marketingModule.dynamicContent.contentPlaces', ['$resource', function ($resource) {\n return $resource('api/marketing/contentplaces/:id', null, {\n search: { method: 'POST', url: 'api/marketing/contentplaces/listentries/search' },\n update: { method: 'PUT' }\n });\n }])\n .factory('virtoCommerce.marketingModule.dynamicContent.contentPublications', ['$resource', function ($resource) {\n return $resource('api/marketing/contentpublications/:id', null, {\n search: { method: 'POST', url: 'api/marketing/contentpublications/search' },\n getNew: { url: 'api/marketing/contentpublications/new' },\n update: { method: 'PUT' }\n });\n }])\n\t.factory('virtoCommerce.marketingModule.dynamicContent.folders', ['$resource', function ($resource) {\n\t return $resource('api/marketing/contentfolders/:id', null, {\n\t get: { method: 'GET' },\n\t update: { method: 'PUT' }\n\t });\n\t}]);\n","angular.module('virtoCommerce.marketingModule')\n .controller('virtoCommerce.marketingModule.catalogEntriesController', ['$scope', 'virtoCommerce.catalogModule.items', 'platformWebApp.ui-grid.extension', 'platformWebApp.bladeUtils', 'platformWebApp.uiGridHelper', 'platformWebApp.bladeNavigationService',\n function ($scope, items, gridOptionExtension, bladeUtils, uiGridHelper, bladeNavigationService) {\n var blade = $scope.blade;\n\n $scope.isValid = function () {\n return !angular.equals(this.blade.productIds, this.blade.promotion.productIds);\n };\n\n $scope.saveChanges = function () {\n this.blade.promotion.productIds = this.blade.productIds;\n this.blade.promotion.productNames = _.pluck(selectedListEntries, 'name');\n this.blade.promotion.productCodes = _.pluck(selectedListEntries, 'code');\n $scope.bladeClose();\n };\n\n $scope.setGridOptions = function (gridId, gridOptions) {\n gridOptionExtension.tryExtendGridOptions(gridId, gridOptions);\n initialize();\n uiGridHelper.initialize($scope, gridOptions, externalRegisterApiCallback);\n bladeUtils.initializePagination($scope);\n };\n\n blade.refresh = function () {\n initialize();\n };\n\n $scope.cancelChanges = function () {\n $scope.bladeClose();\n };\n\n var isFirstRun = true;\n var selectedListEntries = [];\n\n function initialize() {\n blade.isLoading = true;\n if (!blade.promotion.productIds) {\n blade.promotion.productIds = [];\n }\n\n if (isFirstRun) {\n isFirstRun = false;\n blade.productIds = angular.copy(blade.promotion.productIds);\n\n if (!(blade.promotion.productIds && blade.promotion.productIds.length)) {\n openCatalogBlade();\n return;\n }\n }\n\n items.query({ ids: blade.productIds, respGroup: 'ItemInfo' }, function (data) {\n blade.$scope.gridApi.grid.options.data = data;\n selectedListEntries = angular.copy(data);\n blade.isLoading = false;\n });\n }\n\n function externalRegisterApiCallback(gridApi) {\n $scope.gridApi = gridApi;\n $scope.$parent.blade.refresh();\n uiGridHelper.bindRefreshOnSortChanged($scope);\n }\n\n function openCatalogBlade() {\n var catalogBlade = {\n id: \"CatalogEntrySelect\",\n title: \"marketing.blades.catalog-items-select.title-product\",\n controller: 'virtoCommerce.catalogModule.catalogItemSelectController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/common/catalog-items-select.tpl.html',\n breadcrumbs: [],\n toolbarCommands: [\n {\n name: \"platform.commands.pick-selected\", icon: 'fas fa-plus',\n executeMethod: function () {\n blade.$scope.gridApi.grid.options.data = _.map(selectedListEntries, function (entry) {\n if (entry.imageUrl) {\n entry.imgSrc = entry.imageUrl;\n }\n return entry;\n });\n var selectedIds = _.pluck(selectedListEntries, 'id');\n blade.productIds = _.uniq(_.union(selectedIds, blade.productIds), false);\n bladeNavigationService.closeBlade(catalogBlade);\n },\n canExecuteMethod: function () {\n return selectedListEntries.length > 0;\n }\n }]\n };\n\n catalogBlade.options = {\n selectedItemIds: [],\n showCheckingMultiple: false,\n checkItemFn: function (listItem, isSelected) {\n if (listItem.type == 'category') {\n blade.error = 'Must select Product';\n listItem.selected = undefined;\n } else {\n if (isSelected) {\n if (_.all(selectedListEntries, function (x) { return x.id != listItem.id; })) {\n selectedListEntries.push(listItem);\n }\n }\n else {\n selectedListEntries = _.reject(selectedListEntries, function (x) { return x.id == listItem.id; });\n }\n blade.error = undefined;\n }\n }\n };\n\n bladeNavigationService.showBlade(catalogBlade, blade);\n }\n\n $scope.blade.toolbarCommands = [\n {\n name: \"platform.commands.refresh\", icon: 'fa fa-refresh',\n executeMethod: function (blade) {\n blade.refresh();\n },\n canExecuteMethod: function () { return true; }\n },\n {\n name: \"platform.commands.add\", icon: 'fas fa-plus',\n executeMethod: function () {\n openCatalogBlade();\n },\n canExecuteMethod: function () {\n return true;\n }\n },\n {\n name: \"platform.commands.delete\", icon: 'fas fa-trash-alt',\n executeMethod: function () {\n var selectedRows = $scope.gridApi.selection.getSelectedRows();\n var toRemoveArray = _.pluck(selectedRows, 'id');\n\n blade.productIds = _.difference(blade.productIds, toRemoveArray);\n blade.refresh();\n },\n canExecuteMethod: function () {\n if (blade.childrenBlades.length > 0) {\n return false;\n }\n if (blade.$scope.gridApi) {\n return blade.$scope.gridApi.grid.api.selection.getSelectedRows().length > 0;\n }\n return false;\n }\n }\n ];\n }]);\n","angular.module('virtoCommerce.marketingModule')\n.controller('virtoCommerce.marketingModule.couponDetailController', ['$scope', 'platformWebApp.bladeNavigationService', 'virtoCommerce.marketingModule.promotions', function ($scope, bladeNavigationService, promotionsApi) {\n var blade = $scope.blade;\n blade.isLoading = false;\n\n blade.refresh = function (parentRefresh) {\n if (!blade.isNew) {\n promotionsApi.getCoupon({\n id: blade.currentEntity.id\n }, function (response) {\n blade.currentEntity = response;\n blade.parentBlade.refresh();\n }, function (error) {\n bladeNavigationService.setError('Error ' + error.status, blade);\n });\n }\n }\n\n function isDirty() {\n return !angular.equals(blade.currentEntity, blade.originalEntity);\n }\n\n $scope.setForm = function (form) {\n $scope.formCoupon = form;\n }\n\n $scope.datepickers = {\n expirationDate: false\n }\n\n $scope.openCalendar = function ($event, calendar) {\n $event.preventDefault();\n $event.stopPropagation();\n $scope.datepickers[calendar] = true;\n }\n\n $scope.format = 'shortDate';\n\n $scope.isValid = function () {\n return isDirty()\n && $scope.formCoupon\n && $scope.formCoupon.$valid;\n };\n\n $scope.saveChanges = function () {\n blade.isLoading = true;\n promotionsApi.saveCoupon([\n blade.currentEntity\n ], function (response) {\n blade.isLoading = false;\n blade.parentBlade.refresh();\n bladeNavigationService.closeBlade(blade);\n }, function (error) {\n bladeNavigationService.setError('Error ' + error.status, blade);\n });\n }\n\n blade.toolbarCommands = [{\n name: \"platform.commands.save\",\n icon: 'fas fa-save',\n executeMethod: $scope.saveChanges,\n canExecuteMethod: $scope.isValid\n }];\n}]);\n","angular.module('virtoCommerce.marketingModule')\n.controller('virtoCommerce.marketingModule.couponImportProcessingController', ['$rootScope', '$scope', function ($rootScope, $scope) {\n var blade = $scope.blade;\n blade.isLoading = false;\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.finished) {\n $rootScope.$broadcast('coupon-import-finished');\n }\n }\n });\n}]);","angular.module('virtoCommerce.marketingModule')\n.controller('virtoCommerce.marketingModule.couponImportController', ['$scope', 'platformWebApp.bladeNavigationService', 'FileUploader', 'virtoCommerce.marketingModule.promotions', function ($scope, bladeNavigationService, FileUploader, promotionsApi) {\n var blade = $scope.blade;\n blade.headIcon = 'fa fa-download';\n blade.isLoading = false;\n\n if (!$scope.uploader) {\n var uploader = $scope.uploader = new FileUploader({\n scope: $scope,\n headers: { Accept: 'application/json' },\n url: 'api/assets?folderUrl=tmp',\n method: 'POST',\n autoUpload: true,\n removeAfterUpload: true\n });\n uploader.filters.push({\n name: 'csvFilter',\n fn: function (i, options) {\n var type = '|' + i.type.slice(i.type.lastIndexOf('/') + 1) + '|';\n return '|csv|vnd.ms-excel|'.indexOf(type) !== -1;\n }\n });\n uploader.onBeforeUploadItem = function (fileItem) {\n blade.isLoading = true;\n };\n uploader.onSuccessItem = function (fileItem, asset, status, headers) {\n blade.isLoading = false;\n blade.canImport = true;\n blade.csvFileUrl = asset[0].relativeUrl;\n }\n uploader.onAfterAddingAll = function (addedItems) {\n bladeNavigationService.setError(null, blade);\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\n $scope.setForm = function (form) {\n $scope.formScope = form;\n };\n\n $scope.columnDelimiters = [{\n name: 'marketing.blades.coupons-import.labels.space',\n value: ' '\n }, {\n name: 'marketing.blades.coupons-import.labels.comma',\n value: ','\n }, {\n name: 'marketing.blades.coupons-import.labels.semicolon',\n value: ';'\n }, {\n name: 'marketing.blades.coupons-import.labels.tab',\n value: '\\t'\n }];\n\n $scope.datepickers = {\n expirationDate: false\n };\n\n $scope.open = function ($event, which) {\n $event.preventDefault();\n $event.stopPropagation();\n $scope.datepickers[which] = true;\n };\n\n $scope.startImport = function () {\n var request = {\n fileUrl: blade.csvFileUrl,\n delimiter: blade.columnDelimiter,\n promotionId: blade.promotionId,\n expirationDate: blade.expirationDate\n };\n promotionsApi.importCoupons(request, function (response) {\n var newBlade = {\n id: 'importProgress',\n title: 'marketing.blades.coupons-import-processing.title',\n promotionId: blade.promotionId,\n notification: response,\n controller: 'virtoCommerce.marketingModule.couponImportProcessingController',\n template: 'Modules/$(VirtoCommerce.Marketing)/Scripts/promotion/blades/coupon-import-processing.tpl.html'\n };\n $scope.$on(\"new-notification-event\", function (event, notification) {\n if (notification && notification.id == newBlade.notification.id) {\n blade.canImport = notification.finished != null;\n }\n });\n blade.canImport = false;\n bladeNavigationService.showBlade(newBlade, blade);\n }, function (error) {\n bladeNavigationService.setError('Error ' + error.status, blade);\n });\n }\n}]);\n","angular.module('virtoCommerce.marketingModule')\n.controller('virtoCommerce.marketingModule.couponListController', ['$scope', '$localStorage', 'platformWebApp.dialogService', 'platformWebApp.bladeUtils', 'platformWebApp.uiGridHelper', 'virtoCommerce.marketingModule.promotions',\nfunction ($scope, $localStorage, dialogService, bladeUtils, uiGridHelper, promotionsApi) {\n var blade = $scope.blade;\n var bladeNavigationService = bladeUtils.bladeNavigationService;\n blade.headIcon = 'fa fa-ticket';\n blade.isLoading = false;\n\n blade.refresh = function () {\n blade.isLoading = true;\n var criteria = {\n promotionId: blade.promotionId,\n sort: uiGridHelper.getSortExpression($scope),\n code: filter.keyword,\n skip: ($scope.pageSettings.currentPage - 1) * $scope.pageSettings.itemsPerPageCount,\n take: $scope.pageSettings.itemsPerPageCount\n };\n if (filter.current) {\n angular.extend(criteria, filter.current);\n }\n\n promotionsApi.searchCoupons(criteria, function (response) {\n blade.isLoading = false;\n blade.currentEntities = response.results;\n blade.parentBlade.couponCount();\n $scope.pageSettings.totalItems = response.totalCount;\n });\n\n }\n\n $scope.$on('coupon-import-finished', function (event) {\n blade.refresh();\n });\n\n blade.toolbarCommands = [{\n name: 'marketing.blades.coupons.toolbar.add',\n icon: 'fas fa-plus',\n canExecuteMethod: function () {\n return true;\n },\n executeMethod: showAddCouponBlade\n }, {\n name: 'marketing.blades.coupons.toolbar.import',\n icon: 'fa fa-download',\n canExecuteMethod: function () {\n return true;\n },\n executeMethod: showCouponImportBlade\n }, {\n name: 'marketing.blades.coupons.toolbar.refresh',\n icon: 'fa fa-refresh',\n canExecuteMethod: function () {\n return true;\n },\n executeMethod: blade.refresh\n }, {\n name: 'marketing.blades.coupons.toolbar.delete',\n icon: 'fas fa-trash-alt',\n canExecuteMethod: function () {\n return $scope.gridApi && _.any($scope.gridApi.selection.getSelectedRows());\n },\n executeMethod: function () {\n removeCoupons(false);\n }\n }];\n\n var filter = blade.filter = $scope.filter = {};\n $scope.$localStorage = $localStorage;\n if (!$localStorage.couponSearchFilters) {\n $localStorage.couponSearchFilters = [{ name: 'marketing.blades.promotion-list.new-filter' }];\n }\n if ($localStorage.couponSearchFilterId) {\n filter.current = _.findWhere($localStorage.couponSearchFilters, { id: $localStorage.couponSearchFilterId });\n }\n filter.change = function () {\n $localStorage.couponSearchFilterId = filter.current ? filter.current.id : null;\n if (filter.current && !filter.current.id) {\n filter.current = null;\n showFilterDetailBlade({ isNew: true });\n } else {\n bladeNavigationService.closeBlade({ id: 'filterDetail' });\n filter.criteriaChanged();\n }\n };\n filter.edit = function () {\n if (filter.current) {\n showFilterDetailBlade({ data: filter.current });\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.selectNode = function (node) {\n var newBlade = {\n id: 'couponDetail',\n originalEntity: angular.copy(node),\n currentEntity: angular.copy(node),\n title: 'Coupon \"' + node.code + '\"',\n controller: 'virtoCommerce.marketingModule.couponDetailController',\n template: 'Modules/$(VirtoCommerce.Marketing)/Scripts/promotion/blades/coupon-detail.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n selectedEntity = node;\n };\n\n $scope.setGridOptions = function (gridOptions) {\n uiGridHelper.initialize($scope, gridOptions, function (gridApi) {\n uiGridHelper.bindRefreshOnSortChanged($scope);\n });\n\n bladeUtils.initializePagination($scope);\n };\n\n function showAddCouponBlade() {\n var newBlade = {\n id: 'couponImport',\n title: 'marketing.blades.coupon-detail.new-title',\n promotionId: blade.promotionId,\n currentEntity: {\n promotionId: blade.promotionId,\n isNew: true\n },\n controller: 'virtoCommerce.marketingModule.couponDetailController',\n template: 'Modules/$(VirtoCommerce.Marketing)/Scripts/promotion/blades/coupon-detail.tpl.html'\n }\n bladeNavigationService.showBlade(newBlade, blade);\n }\n\n function showCouponImportBlade() {\n var newBlade = {\n id: 'couponImport',\n title: 'marketing.blades.coupons-import.title',\n promotionId: blade.promotionId,\n controller: 'virtoCommerce.marketingModule.couponImportController',\n template: 'Modules/$(VirtoCommerce.Marketing)/Scripts/promotion/blades/coupon-import.tpl.html'\n }\n bladeNavigationService.showBlade(newBlade, blade);\n }\n\n function removeCoupons(removeAll, promotionId) {\n var dialog = {\n id: \"confirmDeleteItem\",\n title: \"marketing.dialogs.coupon-delete.title\",\n message: removeAll ? \"marketing.dialogs.coupon-delete.message-all\": \"marketing.dialogs.coupon-delete.message\",\n callback: function (remove) {\n if (remove) {\n bladeNavigationService.closeChildrenBlades(blade, function () {\n blade.isLoading = true;\n if (removeAll && promotionId) {\n promotionsApi.clearCoupons({ promotionId: promotionId }, function () {\n blade.refresh();\n blade.parentBlade.refresh();\n });\n } else if (!removeAll) {\n var itemIds = _.pluck($scope.gridApi.selection.getSelectedRows(), 'id');\n promotionsApi.deleteCoupons({ ids: itemIds, all: removeAll }, function () {\n blade.refresh();\n blade.parentBlade.refresh();\n });\n }\n });\n }\n }\n };\n dialogService.showConfirmationDialog(dialog);\n }\n\n function showFilterDetailBlade(bladeData) {\n var newBlade = {\n id: 'filterDetail',\n controller: 'virtoCommerce.marketingModule.filterDetailController',\n template: 'Modules/$(VirtoCommerce.Marketing)/Scripts/promotion/blades/filter-detail.tpl.html'\n };\n angular.extend(newBlade, bladeData);\n bladeNavigationService.showBlade(newBlade, blade);\n }\n}]);\n","angular.module('virtoCommerce.marketingModule')\n.controller('virtoCommerce.marketingModule.filterDetailController', ['$scope', '$localStorage', '$translate', 'virtoCommerce.storeModule.stores',\n function ($scope, $localStorage, $translate, stores) {\n var blade = $scope.blade;\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 ? 'marketing.blades.filter-detail.new-title' : data.name;\n blade.subtitle = blade.isNew ? 'marketing.blades.filter-detail.new-subtitle' : 'marketing.blades.filter-detail.subtitle';\n }\n\n blade.metaFields = [\n {\n name: 'onlyActive',\n title: \"marketing.blades.filter-detail.labels.active\",\n valueType: \"Boolean\"\n }, {\n name: 'store',\n title: \"marketing.blades.promotion-detail.labels.store\",\n templateUrl: 'storeSelector.html'\n //}, {\n // name: 'startDate',\n // title: \"marketing.blades.promotion-detail.labels.start-date\",\n // valueType: \"DateTime\"\n //}, {\n // name: 'endDate',\n // title: \"marketing.blades.promotion-detail.labels.expiration-date\",\n // valueType: \"DateTime\"\n }\n ];\n\n $scope.saveChanges = function () {\n angular.copy(blade.currentEntity, blade.origEntity);\n if (blade.isNew) {\n $localStorage.promotionSearchFilters.push(blade.origEntity);\n $localStorage.promotionSearchFilterId = blade.origEntity.id;\n blade.parentBlade.filter.current = blade.origEntity;\n blade.isNew = false;\n }\n\n initializeBlade(blade.origEntity);\n blade.parentBlade.filter.criteriaChanged();\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.promotionSearchFilters.splice($localStorage.promotionSearchFilters.indexOf(blade.origEntity), 1);\n delete $localStorage.promotionSearchFilterId;\n blade.parentBlade.refresh();\n $scope.bladeClose();\n }\n\n blade.stores = stores.query();\n\n // actions on load\n if (blade.isNew) {\n $translate('marketing.blades.filter-detail.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.marketingModule')\n .controller('virtoCommerce.marketingModule.promotionDetailController', ['$scope', 'platformWebApp.bladeNavigationService', 'virtoCommerce.marketingModule.promotions', 'virtoCommerce.storeModule.stores', 'virtoCommerce.coreModule.common.dynamicExpressionService', 'virtoCommerce.catalogModule.categories', 'virtoCommerce.catalogModule.items', '$q', 'platformWebApp.settings', 'platformWebApp.metaFormsService', 'virtoCommerce.shippingModule.shippingMethods', 'virtoCommerce.paymentModule.paymentMethods', function ($scope, bladeNavigationService, marketing_res_promotions, stores, dynamicExpressionService, categories, items, $q, settings, metaFormsService, shippingMethods, paymentMethods) {\n var blade = $scope.blade;\n blade.updatePermission = 'marketing:update';\n\n blade.metaFields = metaFormsService.getMetaFields(\"promotionDetail\");\n\n blade.expressionTreeTemplateUrl = dynamicExpressionService.expressionTreeTemplateUrl;\n\n blade.showPriority = false;\n settings.get({ id: 'Marketing.Promotion.CombinePolicy' }, function (data) {\n blade.showPriority = data.value === 'CombineStackable';\n });\n blade.refresh = function (parentRefresh) {\n\n var shippingMethodsPromise = !blade.shippingMethods\n ? shippingMethods.getAllRegistered(function (methods) {\n blade.shippingMethods = _.uniq(methods, method => method.code);\n // VP-5647: Need to fill `method.id` for proper work of methods selectors UI template from core module (e.g. expression-RewardShippingGetOfAbsShippingMethod.html)\n _.each(blade.shippingMethods, function (method) {\n method.id = method.id ? method.id : method.code;\n });\n })\n .$promise\n : $q.when();\n\n var paymentMethodsPromise = !blade.paymentMethods\n ? paymentMethods.getAllRegistered(function (methods) {\n blade.paymentMethods = _.uniq(methods, method => method.code);\n // VP-5647: Need to fill `method.id` for proper work of methods selectors UI template from core module (e.g. expression-RewardShippingGetOfAbsShippingMethod.html)\n _.each(blade.paymentMethods, function (method) {\n method.id = method.id ? method.id : method.code;\n });\n })\n .$promise\n : $q.when();\n\n // VP-5647: Wait for payment/shipment method loading before requesting stores and initialize dynamic tree\n $q.all(shippingMethodsPromise, paymentMethodsPromise).then(() => {\n if (blade.isNew) {\n if (blade.isCloning) {\n blade.data.id = null;\n blade.data.name = null;\n initializeBlade(blade.data);\n } else {\n marketing_res_promotions.getNew(initializeBlade);\n }\n } else {\n marketing_res_promotions.get({ id: blade.currentEntity.id, code: (blade.currentEntityCode === undefined) ? '' : blade.currentEntityCode }, function (data) {\n initializeBlade(data);\n if (parentRefresh) {\n blade.parentBlade.refresh();\n }\n });\n }\n });\n };\n\n function initializeBlade(data) {\n if (!blade.isNew) {\n blade.title = data.name;\n }\n\n // transform simple string to complex object. Simple string isn't editable.\n data.coupons = _.map(data.coupons, function (x) { return { text: x }; });\n\n blade.expressionPromises = [];\n if (data.dynamicExpression) {\n _.each(data.dynamicExpression.children, extendElementBlock);\n }\n\n $q.all(blade.expressionPromises).then(function (allData) {\n blade.currentEntity = angular.copy(data);\n blade.origEntity = data;\n }).finally(function () {\n blade.isLoading = false;\n });\n }\n\n function isDirty() {\n return !angular.equals(blade.currentEntity, blade.origEntity) && blade.hasUpdatePermission();\n }\n\n $scope.cancelChanges = function () {\n //angular.copy(blade.origEntity, blade.currentEntity);\n $scope.bladeClose();\n };\n\n $scope.saveChanges = function () {\n bladeNavigationService.setError(null, blade);\n blade.isLoading = true;\n\n blade.currentEntity.coupons = _.pluck(blade.currentEntity.coupons, 'text');\n\n if (blade.currentEntity.dynamicExpression) {\n _.each(blade.currentEntity.dynamicExpression.children, stripOffUiInformation);\n }\n\n if (blade.isNew) {\n marketing_res_promotions.save({}, blade.currentEntity, function (data) {\n blade.isNew = undefined;\n blade.currentEntity = data;\n initializeToolbar();\n blade.refresh(true);\n });\n } else {\n marketing_res_promotions.update({}, blade.currentEntity, function (data) {\n blade.refresh(true);\n });\n }\n };\n\n $scope.setForm = function (form) { $scope.formScope = form; };\n\n $scope.isValid = function () {\n return isDirty()\n && $scope.formScope\n && $scope.formScope.$valid;\n //&& (!blade.currentEntity.dynamicExpression;\n // || (blade.currentEntity.dynamicExpression.children[0].children.length > 0\n // && blade.currentEntity.dynamicExpression.children[3].children.length > 0));\n };\n\n blade.onClose = function (closeCallback) {\n bladeNavigationService.showConfirmationIfNeeded(isDirty() && !blade.isNew, $scope.isValid(), blade, $scope.saveChanges, closeCallback, \"marketing.dialogs.promotion-save.title\", \"marketing.dialogs.promotion-save.message\");\n };\n\n blade.headIcon = 'fa fa-area-chart';\n\n function initializeToolbar() {\n if (!blade.isNew) {\n blade.toolbarCommands = [\n {\n name: \"platform.commands.save\",\n icon: 'fas fa-save',\n executeMethod: $scope.saveChanges,\n canExecuteMethod: $scope.isValid,\n permission: blade.updatePermission\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 permission: blade.updatePermission\n },\n {\n name: \"platform.commands.clone\", icon: 'fas fa-clone',\n executeMethod: function () {\n var newBlade = {\n id: 'promotionClone',\n title: 'marketing.blades.promotion-detail.title-new',\n isNew: true,\n isCloning: true,\n data: blade.currentEntity,\n controller: 'virtoCommerce.marketingModule.promotionDetailController',\n template: 'Modules/$(VirtoCommerce.Marketing)/Scripts/promotion/blades/promotion-detail.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade.parentBlade);\n },\n canExecuteMethod: function () { return !isDirty(); },\n permission: 'marketing:create'\n }\n ];\n }\n }\n\n // datepicker\n $scope.datepickers = {\n str: false,\n end: false\n };\n\n $scope.open = function ($event, which) {\n $event.preventDefault();\n $event.stopPropagation();\n\n $scope.datepickers[which] = true;\n };\n\n // Dynamic ExpressionBlock\n function extendElementBlock(expressionBlock) {\n var retVal = dynamicExpressionService.expressions[expressionBlock.id];\n if (!retVal) {\n retVal = { displayName: 'unknown element: ' + expressionBlock.id };\n }\n\n _.extend(expressionBlock, retVal);\n\n if (!expressionBlock.children) {\n expressionBlock.children = [];\n }\n _.each(expressionBlock.excludingCategoryIds, function (id) {\n // load each category to display its name in UI\n var excludingItem = { id: 'ExcludingCategoryCondition', categoryId: id };\n expressionBlock.children.push(excludingItem);\n var promise = categories.query({ ids: [id], respGroup: 'Info' }, function (data) {\n if (_.any(data))\n excludingItem.categoryName = data[0].name;\n }).$promise;\n blade.expressionPromises.push(promise);\n });\n\n _.each(expressionBlock.excludingProductIds, function (id) {\n // load each product to display its name and code in UI\n var excludingItem = { id: 'ExcludingProductCondition', productId: id };\n expressionBlock.children.push(excludingItem); // categoryName\n var promise = items.query({ ids: [id], respGroup: 'ItemInfo' }, function (data) {\n if (_.any(data)) {\n excludingItem.productName = data[0].name;\n excludingItem.productCode = data[0].code;\n }\n }).$promise;\n blade.expressionPromises.push(promise);\n });\n\n _.each(expressionBlock.children, extendElementBlock);\n _.each(expressionBlock.availableChildren, extendElementBlock);\n }\n\n function stripOffUiInformation(expressionElement) {\n expressionElement.availableChildren = undefined;\n expressionElement.displayName = undefined;\n expressionElement.getValidationError = undefined;\n expressionElement.newChildLabel = undefined;\n expressionElement.templateURL = undefined;\n\n var selectedCategories = _.where(expressionElement.children, { id: 'ExcludingCategoryCondition' });\n expressionElement.excludingCategoryIds = _.pluck(selectedCategories, 'categoryId');\n expressionElement.children = _.difference(expressionElement.children, selectedCategories);\n\n var selectedProducts = _.where(expressionElement.children, { id: 'ExcludingProductCondition' });\n expressionElement.excludingProductIds = _.pluck(selectedProducts, 'productId');\n expressionElement.children = _.difference(expressionElement.children, selectedProducts);\n\n _.each(expressionElement.children, stripOffUiInformation);\n }\n\n\n //$scope.$watch('blade.currentEntity.endDate',\n // function (newValue, oldValue, scope) {\n // if (newValue != undefined && (newValue instanceof Date)) {\n // debugger;\n // //var date = angular.copy(blade.currentEntity.endDate)\n // //date = moment(date).add({ hours: 23, minutes: 59, seconds: 59 }).toDate();\n // //newValue = moment(newValue).add({ hours: 23, minutes: 57, seconds: 59 }).toDate();\n // newValue.setHours(23, 59, 59);\n\n // }\n // }\n //);\n\n initializeToolbar();\n\n /// TODO: refactor to new va-marketing-stores-selector directive.\n // PageSize amount must be enough to show scrollbar in dropdown list container.\n // If scrollbar doesn't appear auto loading won't work.\n $scope.pageSize = 25;\n $scope.stores = [];\n var lastSearchPhrase = '';\n var totalCount = 0;\n\n $scope.fetchStores = function ($select) {\n $q.all([loadPromotionStores(), $scope.fetchNextStores($select)]);\n };\n\n function loadPromotionStores() {\n if (_.any(blade.currentEntity.storeIds) && !_.any($scope.stores)) {\n return stores.search({\n storeIds: blade.currentEntity.storeIds,\n take: blade.currentEntity.storeIds.length,\n responseGroup: 'none'\n }, (data) => {\n joinStores(data.results);\n }).$promise;\n }\n\n return $q.resolve();\n }\n\n $scope.fetchNextStores = ($select) => {\n $select.page = $select.page || 0;\n\n if (lastSearchPhrase !== $select.search) {\n lastSearchPhrase = $select.search;\n $select.page = 0;\n }\n\n if ($select.page === 0 || totalCount > $scope.stores.length) {\n return stores.search(\n {\n searchPhrase: $select.search,\n take: $scope.pageSize,\n skip: $select.page * $scope.pageSize,\n responseGroup: 'none'\n }, (data) => {\n joinStores(data.results);\n $select.page++;\n\n if ($select.page * $scope.pageSize < data.totalCount) {\n $scope.$broadcast('scrollCompleted');\n }\n\n totalCount = Math.max(totalCount, data.totalCount);\n }).$promise;\n }\n\n return $q.resolve();\n };\n\n function joinStores(newItems) {\n newItems = _.reject(newItems, x => _.any($scope.stores, y => y.id === x.id));\n\n _.each(newItems, function (store) {\n // VP-5647: Left for backward compatibility, as virtoCommerce.dynamicExpressions.shippingMethodRewardController in Core module expects these properties to be filled in the store\n store.shippingMethods = blade.shippingMethods || [];\n store.paymentMethods = blade.paymentMethods || [];\n });\n\n $scope.stores = $scope.stores.concat(newItems);\n }\n\n blade.refresh(false);\n\n $scope.exclusivityTypes = [{ name: 'marketing.blades.promotion-detail.labels.combined-with-others', value: false }, { name: 'marketing.blades.promotion-detail.labels.exclusive', value: true }];\n }]);\n","angular.module('virtoCommerce.marketingModule')\n.controller('virtoCommerce.marketingModule.promotionConditionCurrencyIsController', ['$scope', 'virtoCommerce.coreModule.currency.currencyUtils', function ($scope, currencyUtils) {\n $scope.currencyUtils = currencyUtils;\n}])\n\n .controller('virtoCommerce.marketingModule.promotionExpressionsController', ['$scope', 'virtoCommerce.catalogModule.items', 'platformWebApp.authService', 'platformWebApp.bladeNavigationService', function ($scope, items, authService, bladeNavigationService) {\n\n $scope.openItemSelectWizard = function (parentElement, isMultiSelect) {\n if (!authService.checkPermission('marketing:update')) {\n return;\n }\n\n if (isMultiSelect) {\n var newBlade = {\n id: \"CatalogEntries\",\n title: \"marketing.blades.catalog-entries.title-product\",\n controller: 'virtoCommerce.marketingModule.catalogEntriesController',\n template: 'Modules/$(VirtoCommerce.Marketing)/Scripts/promotion/blades/catalog-entry-list.tpl.html',\n breadcrumbs: [],\n promotion: parentElement\n };\n bladeNavigationService.showBlade(newBlade, $scope.blade);\n return;\n }\n\n if (parentElement.productId) {\n let itemDetailBlade = {\n id: \"listItemDetail\",\n itemId: parentElement.productId,\n title: parentElement.productName,\n controller: 'virtoCommerce.catalogModule.itemDetailController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/item-detail.tpl.html'\n };\n bladeNavigationService.showBlade(itemDetailBlade, $scope.blade);\n return;\n }\n \n var selectedListEntries = [];\n var catalogBlade = {\n id: \"CatalogEntrySelect\",\n title: \"marketing.blades.catalog-items-select.title-product\",\n controller: 'virtoCommerce.catalogModule.catalogItemSelectController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/common/catalog-items-select.tpl.html',\n breadcrumbs: [],\n toolbarCommands: [\n {\n name: \"platform.commands.pick-selected\", icon: 'fas fa-plus',\n executeMethod: function (blade) {\n parentElement.productId = selectedListEntries[0].id;\n parentElement.productName = selectedListEntries[0].name;\n parentElement.productCode = selectedListEntries[0].code;\n bladeNavigationService.closeBlade(blade);\n },\n canExecuteMethod: function () {\n return selectedListEntries.length == 1;\n }\n }]\n };\n\n catalogBlade.options = {\n showCheckingMultiple: false,\n checkItemFn: function (listItem, isSelected) {\n if (listItem.type == 'category') {\n catalogBlade.error = 'Must select Product';\n listItem.selected = undefined;\n } else {\n if (isSelected) {\n if (_.all(selectedListEntries, function (x) { return x.id != listItem.id; })) {\n selectedListEntries.push(listItem);\n }\n }\n else {\n selectedListEntries = _.reject(selectedListEntries, function (x) { return x.id == listItem.id; });\n }\n catalogBlade.error = undefined;\n }\n }\n };\n\n bladeNavigationService.showBlade(catalogBlade, $scope.blade);\n };\n\n $scope.openCategorySelectWizard = function (parentElement) {\n if (!authService.checkPermission('marketing:update')) {\n return;\n }\n\n var selectedListEntries = [];\n var newBlade = {\n id: \"CatalogCategorySelect\",\n title: \"marketing.blades.catalog-items-select.title-category\",\n controller: 'virtoCommerce.catalogModule.catalogItemSelectController',\n template: 'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/common/catalog-items-select.tpl.html',\n breadcrumbs: [],\n toolbarCommands: [\n {\n name: \"platform.commands.pick-selected\", icon: 'fas fa-plus',\n executeMethod: function (blade) {\n parentElement.categoryId = selectedListEntries[0].id;\n parentElement.categoryName = selectedListEntries[0].name;\n bladeNavigationService.closeBlade(blade);\n },\n canExecuteMethod: function () {\n return selectedListEntries.length == 1;\n }\n }]\n };\n\n newBlade.options = {\n showCheckingMultiple: false,\n allowCheckingItem: false,\n allowCheckingCategory: true,\n checkItemFn: function (listItem, isSelected) {\n if (listItem.type != 'category') {\n newBlade.error = 'Must select Category';\n listItem.selected = undefined;\n } else {\n if (isSelected) {\n if (_.all(selectedListEntries, function (x) { return x.id != listItem.id; })) {\n selectedListEntries.push(listItem);\n }\n }\n else {\n selectedListEntries = _.reject(selectedListEntries, function (x) { return x.id == listItem.id; });\n }\n newBlade.error = undefined;\n }\n }\n };\n\n bladeNavigationService.showBlade(newBlade, $scope.blade);\n };\n}]);\n","angular.module('virtoCommerce.marketingModule')\n.controller('virtoCommerce.marketingModule.promotionListController', ['$scope', '$localStorage', 'virtoCommerce.marketingModule.promotions', 'platformWebApp.dialogService', 'platformWebApp.bladeUtils', 'platformWebApp.uiGridHelper',\n function ($scope, $localStorage, promotions, dialogService, bladeUtils, uiGridHelper) {\n var blade = $scope.blade;\n var bladeNavigationService = bladeUtils.bladeNavigationService;\n\n blade.refresh = function () {\n blade.isLoading = true;\n\n var criteria = {\n responseGroup: 'none',\n keyword: filter.keyword,\n sort: uiGridHelper.getSortExpression($scope),\n skip: ($scope.pageSettings.currentPage - 1) * $scope.pageSettings.itemsPerPageCount,\n take: $scope.pageSettings.itemsPerPageCount\n };\n if (filter.current) {\n angular.extend(criteria, filter.current);\n }\n\n promotions.search(criteria, function (data) {\n blade.isLoading = false;\n\n $scope.pageSettings.totalItems = data.totalCount;\n blade.currentEntities = data.results;\n });\n };\n\n $scope.selectNode = function (node) {\n $scope.selectedNodeId = node.id;\n\n var newBlade = {\n id: 'listItemChild',\n currentEntity: node,\n title: node.name,\n subtitle: blade.subtitle,\n controller: 'virtoCommerce.marketingModule.promotionDetailController',\n template: 'Modules/$(VirtoCommerce.Marketing)/Scripts/promotion/blades/promotion-detail.tpl.html'\n };\n\n bladeNavigationService.showBlade(newBlade, blade);\n };\n\n $scope.deleteList = function (list) {\n var dialog = {\n id: \"confirmDeleteItem\",\n title: \"marketing.dialogs.promotions-delete.title\",\n message: \"marketing.dialogs.promotions-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 promotions.remove({ ids: itemIds }, function () {\n blade.refresh();\n });\n });\n }\n }\n };\n dialogService.showConfirmationDialog(dialog);\n };\n\n blade.headIcon = 'fa fa-area-chart';\n\n blade.toolbarCommands = [\n {\n name: \"platform.commands.refresh\", icon: 'fa fa-refresh',\n executeMethod: blade.refresh,\n canExecuteMethod: function () { return true; }\n },\n {\n name: \"platform.commands.add\", icon: 'fas fa-plus',\n executeMethod: function () {\n bladeNavigationService.closeChildrenBlades(blade, function () {\n var newBlade = {\n id: 'listItemChild',\n title: 'marketing.blades.promotion-detail.title-new',\n subtitle: blade.subtitle,\n isNew: true,\n currentEntity: {},\n controller: 'virtoCommerce.marketingModule.promotionDetailController',\n template: 'Modules/$(VirtoCommerce.Marketing)/Scripts/promotion/blades/promotion-detail.tpl.html'\n };\n bladeNavigationService.showBlade(newBlade, blade);\n });\n },\n canExecuteMethod: function () { return true; },\n permission: 'marketing: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: 'marketing:delete'\n }\n ];\n\n // simple and advanced filtering\n var filter = blade.filter = $scope.filter = {};\n $scope.$localStorage = $localStorage;\n if (!$localStorage.promotionSearchFilters) {\n $localStorage.promotionSearchFilters = [{ name: 'marketing.blades.promotion-list.new-filter' }];\n }\n if ($localStorage.promotionSearchFilterId) {\n filter.current = _.findWhere($localStorage.promotionSearchFilters, { id: $localStorage.promotionSearchFilterId });\n }\n\n filter.change = function () {\n $localStorage.promotionSearchFilterId = filter.current ? filter.current.id : null;\n if (filter.current && !filter.current.id) {\n filter.current = null;\n showFilterDetailBlade({ isNew: true });\n } else {\n bladeNavigationService.closeBlade({ id: 'filterDetail' });\n filter.criteriaChanged();\n }\n };\n\n filter.edit = function () {\n if (filter.current) {\n showFilterDetailBlade({ data: filter.current });\n }\n };\n\n function showFilterDetailBlade(bladeData) {\n var newBlade = {\n id: 'filterDetail',\n controller: 'virtoCommerce.marketingModule.filterDetailController',\n template: 'Modules/$(VirtoCommerce.Marketing)/Scripts/promotion/blades/filter-detail.tpl.html'\n };\n angular.extend(newBlade, bladeData);\n bladeNavigationService.showBlade(newBlade, blade);\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 // ui-grid\n $scope.setGridOptions = function (gridOptions) {\n uiGridHelper.initialize($scope, gridOptions, function (gridApi) {\n uiGridHelper.bindRefreshOnSortChanged($scope);\n });\n\n bladeUtils.initializePagination($scope);\n };\n\n // actions on load\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.marketingModule')\n.factory('virtoCommerce.marketingModule.promotions', ['$resource', function ($resource) {\n return $resource('api/marketing/promotions/:id', null, {\n search: { url: 'api/marketing/promotions/search', method: 'POST' },\n getNew: { url: 'api/marketing/promotions/new' },\n update: { method: 'PUT' },\n searchCoupons: { url: 'api/marketing/promotions/coupons/search', method: 'POST' },\n getCoupon: { url: 'api/marketing/promotions/coupons/:id' },\n saveCoupon: { url: 'api/marketing/promotions/coupons/add', method: 'POST' },\n deleteCoupons: { url: 'api/marketing/promotions/coupons/delete', method: 'DELETE' },\n importCoupons: { url: 'api/marketing/promotions/coupons/import', method: 'POST' }\n });\n}]);\n","angular.module('virtoCommerce.marketingModule')\n.controller('virtoCommerce.marketingModule.couponsWidgetController', ['$scope', 'platformWebApp.bladeNavigationService', 'virtoCommerce.marketingModule.promotions', function ($scope, bladeNavigationService, promotionsApi) {\n var blade = $scope.blade;\n\n blade.couponCount = function () {\n if (!blade.isNew) {\n promotionsApi.searchCoupons({ promotionId: blade.currentEntity.id, skip: 0, take: 0 }, function (response) {\n blade.totalCouponsCount = response.totalCount;\n });\n }\n }\n\n blade.couponCount();\n\n $scope.$on('coupon-import-finished', function (event) {\n blade.couponCount();\n });\n\n $scope.openBlade = function () {\n var newBlade = {\n id: 'coupons',\n title: 'marketing.blades.promotion-detail.toolbar.coupons',\n promotionId: blade.currentEntity.id,\n promotion: blade.currentEntity,\n controller: 'virtoCommerce.marketingModule.couponListController',\n template: 'Modules/$(VirtoCommerce.Marketing)/Scripts/promotion/blades/coupon-list.tpl.html'\n }\n bladeNavigationService.showBlade(newBlade, blade);\n }\n}]);\n","angular.module('virtoCommerce.marketingModule')\n.controller('virtoCommerce.marketingModule.dashboard.promotionsWidgetController', ['$scope', '$state', 'virtoCommerce.marketingModule.promotions', function ($scope, $state, promotions) {\n $scope.data = { count: '', descr: 'Active Promotions' };\n\n $scope.widgetAction = function () {\n $state.go('workspace.marketing');\n };\n\n promotions.search({ responseGroup: 'none', count: 1000 }, function (data) {\n var selection = _.where(data.results, { isActive: true });\n $scope.data.count = selection.length;\n });\n}]);\n"],"names":["moduleName","undefined","AppDependencies","push","angular","module","config","$stateProvider","state","url","templateUrl","controller","$scope","bladeNavigationService","showBlade","id","title","template","isClosingDisabled","factory","items","register","item","this","run","$http","$compile","mainMenuService","widgetService","toolbarService","breadcrumbHistoryService","$state","authService","stores","permissionScopeResolver","dynamicExpressionService","marketingMenuItemService","menuItem","path","icon","priority","action","go","permission","addMenuItem","name","entityName","getBackButtonInstance","registerWidget","marketingStoreScope","type","selectFn","blade","callback","newBlade","subtitle","currentEntity","onChangesConfirmedFn","dataService","registerExpression","displayName","catalogGroupName","groupName","templateURL","get","then","response","data","entities","selectedNodeId","openBlade","headIcon","_","sortBy","currentEntities","isLoading","subname","description","categories","dynamicProperties","pageSettings","totalItems","currentPage","numPages","itemsPerPageCount","addFolder","parentFolderId","chosenFolder","childrenFolders","addNewFolder","addContentItem","query","forEach","values","displayNames","contentItem","folderId","addNewContentItem","dynamicContentItemsApi","dialogService","dictionaryItemsApi","settings","dynamicPropertiesApi","updatePermission","refresh","isNew","initialize","entity","search","objectType","take","dynamicPropertiesResponse","rawDynamicProperties","results","each","prop","filteredProperty","find","o","IsChanged","equals","origEntity","omit","length","originalEntityDynamicProperty","currentEntityDynamicProperty","x","isDictionary","currDictionaryValuesIds","filter","value","map","every","includes","valueId","isArray","originalValues","currentValues","toolbarCommands","executeMethod","saveChanges","canExecuteMethod","formScope","$valid","copy","dialog","message","remove","delete","ids","parentBlade","initializeBlade","closeBlade","showConfirmationDialog","isDefined","save","update","editDictionary","property","isApiSave","getDictionaryValues","propertyId","setForm","form","getValues","languages","marketing_dynamicContents_res_folders","$invalid","pathSteps","outline","split","bladeUtils","uiGridHelper","dynamicContentFoldersApi","generateBreadcrumb","node","navigate","selectNode","chosenFolderId","addNew","closeChildrenBlades","skip","keyword","searchKeyword","sort","getSortExpression","responseGroup","entry","isFolder","listEntries","totalCount","breadcrumbs","breadcrumb","b","position","indexOf","slice","setBreadcrumbs","deleteItems","gridApi","selection","getSelectedRows","any","criteriaChanged","clearKeyword","openDetailsBlade","folderItems","i","pluck","contentItems","setGridOptions","gridOptions","onRegisterApi","core","on","sortChanged","initializePagination","addPlaceholder","imageUrl","addNewPlaceholder","contentPlacesApi","placeholderItems","FileUploader","uploader","hasUpdatePermission","scope","headers","Accept","autoUpload","removeAfterUpload","onSuccessItem","fileItem","images","status","onAfterAddingAll","addedItems","setError","onErrorItem","_file","browseFolder","index","findLastIndex","publication","el","orEl","isUndefined","deleteAllContentItems","grid","queueGridRefresh","deleteContentItem","place","registerRowsProcessor","renderableRows","visibleCount","row","visible","all","ci","filteredEntitiesCount","contentPlaces","contentPlace","deleteAllPlaceholder","deletePlaceholder","dynamicContentPublicationsApi","removePublishings","selectedRows","confirm","publishingIds","extend","contentPublications","expressionBlock","dynamicExpression","children","extendElementBlock","groupBy","availableChildren","key","subitems","$watch","autogenerateName","retVal","expressions","stripOffUiInformation","expressionElement","getValidationError","newChildLabel","getNew","checkDifferense","addPlaceholders","addContentItems","error","statusText","availableSave","ciIdse","v","ciIdsoe","intersection","Math","max","cpIdse","cpIdsoe","datepickers","endDate","startDate","today","Date","open","$event","which","preventDefault","stopPropagation","dateOptions","formats","format","String","prototype","trimLeft","charlist","replace","RegExp","trimRight","focusNameInput","placeholderPublicationNamePart","contentItemPublicationNamePart","newName","$resource","method","create","gridOptionExtension","isValid","productIds","promotion","productNames","selectedListEntries","productCodes","bladeClose","gridId","tryExtendGridOptions","externalRegisterApiCallback","cancelChanges","isFirstRun","respGroup","options","openCatalogBlade","$parent","bindRefreshOnSortChanged","catalogBlade","imgSrc","selectedIds","uniq","union","selectedItemIds","showCheckingMultiple","checkItemFn","listItem","isSelected","selected","reject","toRemoveArray","difference","childrenBlades","api","promotionsApi","parentRefresh","getCoupon","formCoupon","expirationDate","openCalendar","calendar","originalEntity","saveCoupon","$rootScope","$on","event","notification","finished","$broadcast","filters","fn","lastIndexOf","onBeforeUploadItem","asset","canImport","csvFileUrl","relativeUrl","columnDelimiters","startImport","request","fileUrl","delimiter","columnDelimiter","promotionId","importCoupons","$localStorage","criteria","code","current","searchCoupons","couponCount","removeAll","itemIds","deleteCoupons","showFilterDetailBlade","bladeData","couponSearchFilters","couponSearchFilterId","findWhere","change","edit","selectedEntity","$translate","metaFields","valueType","promotionSearchFilters","promotionSearchFilterId","splice","result","getTime","marketing_res_promotions","$q","metaFormsService","shippingMethods","paymentMethods","coupons","text","expressionPromises","allData","finally","isDirty","initializeToolbar","isCloning","excludingCategoryIds","excludingItem","categoryId","promise","categoryName","$promise","excludingProductIds","productId","productName","productCode","selectedCategories","where","selectedProducts","getMetaFields","expressionTreeTemplateUrl","showPriority","shippingMethodsPromise","when","getAllRegistered","methods","paymentMethodsPromise","currentEntityCode","onClose","closeCallback","showConfirmationIfNeeded","str","end","pageSize","lastSearchPhrase","joinStores","newItems","y","store","concat","fetchStores","$select","storeIds","resolve","fetchNextStores","page","searchPhrase","exclusivityTypes","currencyUtils","openItemSelectWizard","parentElement","isMultiSelect","checkPermission","itemDetailBlade","itemId","openCategorySelectWizard","allowCheckingItem","allowCheckingCategory","promotions","deleteList","list","totalCouponsCount","count","descr","widgetAction","isActive"],"sourceRoot":""}