/*- * ============LICENSE_START======================================================= * SDC * ================================================================================ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= */ /// module Sdc.ViewModels { 'use strict'; interface Checkboxes { componentTypes:Array; resourceSubTypes:Array; } interface CheckboxesFilter { // Types selectedComponentTypes:Array; selectedResourceSubTypes:Array; // Categories selectedCategoriesModel:Array; // Statuses selectedStatuses:Array; } interface Gui { isLoading: boolean; onResourceSubTypesClick:Function; onComponentTypeClick:Function; onCategoryClick:Function; onSubcategoryClick:Function; onGroupClick:Function; } export interface ICatalogViewModelScope extends ng.IScope { checkboxes:Checkboxes; checkboxesFilter:CheckboxesFilter; gui:Gui; categories: Array; confStatus: Models.IConfigStatuses; sdcMenu:Models.IAppMenu; catalogFilterdItems: Array; expandedSection: Array; actionStrategy: any; user: Models.IUserProperties; catalogMenuItem: any; version:string; sortBy:string; reverse:boolean; //this is for UI paging numberOfItemToDisplay:number; isAllItemDisplay: boolean; openViewerModal(isResource: boolean, uniqueId: string): void; changeLifecycleState(entity:any,state:string): void; sectionClick (section:string):void; order(sortBy:string): void; getNumOfElements(num:number): string; goToComponent(component:Models.Components.Component):void; raiseNumberOfElementToDisplay():void; } export class CatalogViewModel { static '$inject' = [ '$scope', '$filter', 'Sdc.Services.EntityService', 'sdcConfig', 'sdcMenu', '$state', '$q', 'Sdc.Services.UserResourceService', '$modal', '$templateCache', 'Sdc.Services.CacheService', 'ComponentFactory', 'ChangeLifecycleStateHandler', 'ModalsHandler', 'MenuHandler' ]; constructor(private $scope:ICatalogViewModelScope, private $filter:ng.IFilterService, private EntityService:Services.EntityService, private sdcConfig:Models.IAppConfigurtaion, private sdcMenu:Models.IAppMenu, private $state:any, private $q:any, private userResourceService:Sdc.Services.IUserResourceClass, private $modal:ng.ui.bootstrap.IModalService, private $templateCache:ng.ITemplateCacheService, private cacheService:Services.CacheService, private ComponentFactory: Sdc.Utils.ComponentFactory, private ChangeLifecycleStateHandler: Sdc.Utils.ChangeLifecycleStateHandler, private OpenViewModalHandler: Utils.ModalsHandler, private MenuHandler: Utils.MenuHandler ) { this.initScopeMembers(); this.initCatalogData(); // Async task to get catalog from server. this.initScopeMethods(); } private initCatalogData = ():void => { let onSuccess = (followedResponse:Array):void => { this.$scope.catalogFilterdItems = followedResponse; this.$scope.isAllItemDisplay = this.$scope.numberOfItemToDisplay >= this.$scope.catalogFilterdItems.length; this.$scope.categories = this.cacheService.get('serviceCategories').concat(this.cacheService.get('resourceCategories')).concat(this.cacheService.get('productCategories')); this.$scope.gui.isLoading = false; }; let onError = ():void => { console.info('Failed to load catalog CatalogViewModel::initCatalog'); this.$scope.gui.isLoading = false; }; this.EntityService.getCatalog().then(onSuccess, onError); }; private initScopeMembers = ():void => { // Gui init this.$scope.gui = {}; this.$scope.gui.isLoading = true; this.$scope.numberOfItemToDisplay = 0; //this.$scope.categories = this.cacheService.get('categoriesMap'); this.$scope.sdcMenu = this.sdcMenu; this.$scope.confStatus = this.sdcMenu.statuses; this.$scope.expandedSection = ["type", "cssClasses", "product-category", "status"]; this.$scope.user = this.userResourceService.getLoggedinUser(); this.$scope.catalogMenuItem = this.sdcMenu.catalogMenuItem; this.$scope.version = this.cacheService.get('version'); this.$scope.sortBy = 'lastUpdateDate'; this.$scope.reverse = true; // Checklist init this.$scope.checkboxes = {}; this.$scope.checkboxes.componentTypes = ['Resource', 'Service', 'Product']; this.$scope.checkboxes.resourceSubTypes = ['VF', 'VFC', 'CP', 'VL']; // Checkboxes filter init this.$scope.checkboxesFilter = {}; this.$scope.checkboxesFilter.selectedComponentTypes = []; this.$scope.checkboxesFilter.selectedResourceSubTypes = []; this.$scope.checkboxesFilter.selectedCategoriesModel = []; this.$scope.checkboxesFilter.selectedStatuses = []; // this.$scope.isAllItemDisplay = this.$scope.numberOfItemToDisplay >= this.$scope.catalogFilterdItems.length; }; private initScopeMethods = ():void => { this.$scope.sectionClick = (section:string):void => { let index:number = this.$scope.expandedSection.indexOf(section); if (index!==-1) { this.$scope.expandedSection.splice(index,1); } else { this.$scope.expandedSection.push(section); } }; this.$scope.order = (sortBy:string):void => {//default sort by descending last update. default for alphabetical = ascending this.$scope.reverse = (this.$scope.sortBy === sortBy) ? !this.$scope.reverse : (sortBy === 'lastUpdateDate') ? true: false; this.$scope.sortBy = sortBy; }; this.$scope.goToComponent = (component:Models.Components.Component):void => { this.$scope.gui.isLoading = true; this.$state.go('workspace.general', {id: component.uniqueId, type:component.componentType.toLowerCase()}); }; // Will print the number of elements found in catalog this.$scope.getNumOfElements = (num:number) : string => { if (!num || num===0){ return "No Elements found"; } else if (num===1){ return "1 Element found"; }else { return num + " Elements found"; } }; /** * Select | unselect sub resource when resource is clicked | unclicked. * @param type */ this.$scope.gui.onComponentTypeClick = (type:string): void => { if (type==='Resource'){ if (this.$scope.checkboxesFilter.selectedComponentTypes.indexOf('Resource')===-1){ // If the resource was not selected, unselect all childs. this.$scope.checkboxesFilter.selectedResourceSubTypes = []; } else { // If the resource was selected, select all childs this.$scope.checkboxesFilter.selectedResourceSubTypes = angular.copy(this.$scope.checkboxes.resourceSubTypes); } } }; /** * Selecting | unselect resources when sub resource is clicked | unclicked. */ this.$scope.gui.onResourceSubTypesClick = ():void => { if (this.$scope.checkboxesFilter.selectedResourceSubTypes && this.$scope.checkboxesFilter.selectedResourceSubTypes.length===this.$scope.checkboxes.resourceSubTypes.length){ this.$scope.checkboxesFilter.selectedComponentTypes.push('Resource'); } else { this.$scope.checkboxesFilter.selectedComponentTypes = _.without(this.$scope.checkboxesFilter.selectedComponentTypes,'Resource'); } }; this.$scope.gui.onCategoryClick = (category:Models.IMainCategory): void => { // Select | Unselect all childs if (this.isCategorySelected(category.uniqueId)){ this.$scope.checkboxesFilter.selectedCategoriesModel = this.$scope.checkboxesFilter.selectedCategoriesModel.concat(angular.copy(_.map(category.subcategories, (item) => { return item.uniqueId; }))); if (category.subcategories) { category.subcategories.forEach((sub:Models.ISubCategory)=> { // Loop on all selected subcategories and mark the childrens this.$scope.checkboxesFilter.selectedCategoriesModel = this.$scope.checkboxesFilter.selectedCategoriesModel.concat(angular.copy(_.map(sub.groupings, (item) => { return item.uniqueId; }))); }); } } else { this.$scope.checkboxesFilter.selectedCategoriesModel = _.difference(this.$scope.checkboxesFilter.selectedCategoriesModel, _.map(category.subcategories, (item) => { return item.uniqueId; })); if (category.subcategories) { category.subcategories.forEach((sub:Models.ISubCategory)=> { // Loop on all selected subcategories and un mark the childrens this.$scope.checkboxesFilter.selectedCategoriesModel = _.difference(this.$scope.checkboxesFilter.selectedCategoriesModel, _.map(sub.groupings, (item) => { return item.uniqueId; })); }); } } }; this.$scope.gui.onSubcategoryClick = (category:Models.IMainCategory, subCategory:Models.ISubCategory) : void => { // Select | Unselect all childs if (this.isCategorySelected(subCategory.uniqueId)){ this.$scope.checkboxesFilter.selectedCategoriesModel = this.$scope.checkboxesFilter.selectedCategoriesModel.concat(angular.copy(_.map(subCategory.groupings, (item) => { return item.uniqueId; }))); } else { this.$scope.checkboxesFilter.selectedCategoriesModel = _.difference(this.$scope.checkboxesFilter.selectedCategoriesModel, _.map(subCategory.groupings, (item) => { return item.uniqueId; })); } // Mark | Un mark the parent when all childs selected. if (this.areAllCategoryChildsSelected(category)){ // Add the category to checkboxesFilter.selectedCategoriesModel this.$scope.checkboxesFilter.selectedCategoriesModel.push(category.uniqueId); } else { this.$scope.checkboxesFilter.selectedCategoriesModel = _.without(this.$scope.checkboxesFilter.selectedCategoriesModel, category.uniqueId); } }; this.$scope.raiseNumberOfElementToDisplay = () : void => { this.$scope.numberOfItemToDisplay = this.$scope.numberOfItemToDisplay +35; if(this.$scope.catalogFilterdItems) { this.$scope.isAllItemDisplay = this.$scope.numberOfItemToDisplay >= this.$scope.catalogFilterdItems.length; } }; this.$scope.gui.onGroupClick = (subCategory:Models.ISubCategory) : void => { // Mark | Un mark the parent when all childs selected. if (this.areAllSubCategoryChildsSelected(subCategory)){ // Add the category to checkboxesFilter.selectedCategoriesModel this.$scope.checkboxesFilter.selectedCategoriesModel.push(subCategory.uniqueId); } else { this.$scope.checkboxesFilter.selectedCategoriesModel = _.without(this.$scope.checkboxesFilter.selectedCategoriesModel, subCategory.uniqueId); } }; }; private areAllCategoryChildsSelected = (category:Models.IMainCategory):boolean => { if (!category.subcategories){return false;} let allIds = _.map(category.subcategories, (sub:Models.ISubCategory)=>{return sub.uniqueId;}); let total = _.intersection(this.$scope.checkboxesFilter.selectedCategoriesModel, allIds); return total.length === category.subcategories.length?true:false; }; private areAllSubCategoryChildsSelected = (subCategory:Models.ISubCategory):boolean => { if (!subCategory.groupings){return false;} let allIds = _.map(subCategory.groupings, (group:Models.IGroup)=>{return group.uniqueId;}); let total = _.intersection(this.$scope.checkboxesFilter.selectedCategoriesModel, allIds); return total.length === subCategory.groupings.length?true:false; }; private isCategorySelected = (uniqueId:string):boolean => { if (this.$scope.checkboxesFilter.selectedCategoriesModel.indexOf(uniqueId)!==-1){ return true; } return false; }; } }