2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
22 import {IConfigRoles, IAppConfigurtaion, IAppMenu, IUserProperties, Component} from "app/models";
23 import {EntityService, SharingService, CacheService} from "app/services";
24 import {ComponentType, ResourceType, MenuHandler, ModalsHandler, ChangeLifecycleStateHandler, SEVERITY, ComponentFactory} from "app/utils";
25 import {IClientMessageModalModel} from "../modals/message-modal/message-client-modal/client-message-modal-view-model";
26 import {UserService} from "../../ng2/services/user.service";
28 export interface IDashboardViewModelScope extends ng.IScope {
31 components:Array<Component>;
35 sdcConfig:IAppConfigurtaion;
37 sharingService:SharingService;
41 checkboxesFilter:CheckboxesFilter;
45 onImportVfc(file:any):void;
46 onImportVf(file:any):void;
47 openCreateModal(componentType:ComponentType, importedFile:any):void;
48 openWhatsNewModal(version:string):void;
49 openDesignerModal(isResource:boolean, uniqueId:string):void;
50 setSelectedFolder(folderItem:FoldersItemsMenu):void;
51 entitiesCount(folderItem:FoldersItemsMenu):number;
52 getCurrentFolderDistributed():Array<Component>;
53 changeLifecycleState(entity:any, data:any):void;
54 goToComponent(component:Component):void;
55 wizardDebugEdit:Function;
56 notificationIconCallback:Function;
59 interface CheckboxesFilter {
61 selectedStatuses:Array<string>;
63 distributed:Array<string>;
66 export interface IItemMenu {
70 export interface IMenuItemProperties {
79 export class FoldersMenu {
81 private _folders:Array<FoldersItemsMenu> = [];
83 constructor(folders:Array<IMenuItemProperties>) {
85 folders.forEach(function (folder:IMenuItemProperties) {
86 if (folder.groupname) {
87 self._folders.push(new FoldersItemsMenuGroup(folder));
89 self._folders.push(new FoldersItemsMenu(folder));
92 self._folders[0].setSelected(true);
95 public getFolders = ():Array<FoldersItemsMenu> => {
99 public getCurrentFolder = ():FoldersItemsMenu => {
100 let menuItem:FoldersItemsMenu = undefined;
101 this.getFolders().forEach(function (tmpFolder:FoldersItemsMenu) {
102 if (tmpFolder.isSelected()) {
103 menuItem = tmpFolder;
109 public setSelected = (folder:FoldersItemsMenu):void => {
110 this.getFolders().forEach(function (tmpFolder:FoldersItemsMenu) {
111 tmpFolder.setSelected(false);
113 folder.setSelected(true);
118 export class FoldersItemsMenu implements IItemMenu {
124 public states:Array<any>;
126 private selected:boolean = false;
128 constructor(menuProperties:IMenuItemProperties) {
129 this.text = menuProperties.text;
130 this.group = menuProperties.group;
131 this.state = menuProperties.state;
132 this.states = menuProperties.states;
133 this.dist = menuProperties.dist;
136 public isSelected = ():boolean => {
137 return this.selected;
140 public setSelected = (value:boolean):void => {
141 this.selected = value;
144 public isGroup = ():boolean => {
150 export class FoldersItemsMenuGroup extends FoldersItemsMenu {
152 public groupname:string;
154 constructor(menuProperties:IMenuItemProperties) {
155 super(menuProperties);
156 this.groupname = menuProperties.groupname;
159 public isGroup = ():boolean => {
165 export class DashboardViewModel {
169 'Sdc.Services.EntityService',
176 'Sdc.Services.SharingService',
177 'Sdc.Services.CacheService',
180 'ChangeLifecycleStateHandler',
185 private components:Array<Component>;
187 constructor(private $scope:IDashboardViewModelScope,
188 private $filter:ng.IFilterService,
189 private entityService:EntityService,
190 private $http:ng.IHttpService,
191 private sdcConfig:IAppConfigurtaion,
192 private sdcMenu:IAppMenu,
194 private $stateParams:any,
195 private userService:UserService,
196 private sharingService:SharingService,
197 private cacheService:CacheService,
198 private $q:ng.IQService,
199 private ComponentFactory:ComponentFactory,
200 private ChangeLifecycleStateHandler:ChangeLifecycleStateHandler,
201 private ModalsHandler:ModalsHandler,
202 private MenuHandler:MenuHandler) {
205 this.initEntities(true);
207 if (this.$stateParams) {
209 if (this.$state.params.folder) {
211 let folderName = this.$state.params.folder.replaceAll("_", " ");
213 this.$scope.folders.getFolders().forEach(function (tmpFolder:FoldersItemsMenu) {
214 if (tmpFolder.text === folderName) {
215 self.$scope.setSelectedFolder(tmpFolder);
220 // Show the tutorial if needed when the dashboard page is opened.<script src="bower_components/angular-filter/dist/angular-filter.min.js"></script>
221 // This is called from the welcome page.
222 else if (this.$stateParams.show === 'tutorial') {
223 this.$scope.showTutorial = true;
224 this.$scope.isFirstTime = true;
229 private initFolders = ():void => {
230 if (this.$scope.user) {
231 this.$scope.folders = new FoldersMenu(this.$scope.roles[this.$scope.user.role].folder);
235 private initScope = ():void => {
238 this.$scope.version = this.cacheService.get('version');
239 this.$scope.sharingService = this.sharingService;
240 this.$scope.isLoading = false;
241 this.$scope.sdcConfig = this.sdcConfig;
242 this.$scope.sdcMenu = this.sdcMenu;
243 this.$scope.user = this.userService.getLoggedinUser();
244 this.$scope.roles = this.sdcMenu.roles;
245 this.$scope.showTutorial = false;
246 this.$scope.isFirstTime = false;
247 this.$scope.vfcmtType = ResourceType.VFCMT;
249 // Open onboarding modal
250 this.$scope.notificationIconCallback = ():void => {
251 this.ModalsHandler.openOnboadrdingModal('Import').then(()=> {
258 // Checkboxes filter init
259 this.$scope.checkboxesFilter = <CheckboxesFilter>{};
260 this.$scope.checkboxesFilter.selectedStatuses = [];
261 this.$scope.checkboxesFilter.distributed = [];
263 this.$scope.onImportVf = (file:any):void => {
264 if (file && file.filename) {
265 // Check that the file has valid extension.
266 let fileExtension:string = file.filename.split(".").pop();
267 if (this.sdcConfig.csarFileExtension.indexOf(fileExtension.toLowerCase()) !== -1) {
268 this.$state.go('workspace.general', {
269 type: ComponentType.RESOURCE.toLowerCase(),
271 resourceType: ResourceType.VF
274 let data:IClientMessageModalModel = {
275 title: self.$filter('translate')("NEW_SERVICE_RESOURCE_ERROR_VALID_CSAR_EXTENSIONS_TITLE"),
276 message: self.$filter('translate')("NEW_SERVICE_RESOURCE_ERROR_VALID_CSAR_EXTENSIONS", "{'extensions': '" + this.sdcConfig.csarFileExtension + "'}"),
277 severity: SEVERITY.ERROR
279 this.ModalsHandler.openClientMessageModal(data);
284 this.$scope.onImportVfc = (file:any):void => {
285 if (file && file.filename) {
286 // Check that the file has valid extension.
287 let fileExtension:string = file.filename.split(".").pop();
288 if (this.sdcConfig.toscaFileExtension.indexOf(fileExtension.toLowerCase()) !== -1) {
289 this.$state.go('workspace.general', {
290 type: ComponentType.RESOURCE.toLowerCase(),
292 resourceType: ResourceType.VFC
295 let data:IClientMessageModalModel = {
296 title: self.$filter('translate')("NEW_SERVICE_RESOURCE_ERROR_VALID_TOSCA_EXTENSIONS_TITLE"),
297 message: self.$filter('translate')("NEW_SERVICE_RESOURCE_ERROR_VALID_TOSCA_EXTENSIONS", "{'extensions': '" + this.sdcConfig.toscaFileExtension + "'}"),
298 severity: SEVERITY.ERROR
300 this.ModalsHandler.openClientMessageModal(data);
305 this.$scope.openCreateModal = (componentType:string, importedFile:any):void => {
307 this.initEntities(true); // Return from import
309 this.$state.go('workspace.general', {type: componentType.toLowerCase()});
314 this.$scope.createPNF = ():void => {
315 this.$state.go('workspace.general', {
316 type: ComponentType.RESOURCE.toLowerCase(),
317 resourceType: ResourceType.PNF
321 this.$scope.createCR = ():void => {
322 this.$state.go('workspace.general', {
323 type: ComponentType.RESOURCE.toLowerCase(),
324 resourceType: ResourceType.CR
328 this.$scope.entitiesCount = (folderItem:FoldersItemsMenu):any => {
330 let total:number = 0;
331 if (folderItem.isGroup()) {
332 this.$scope.folders.getFolders().forEach(function (tmpFolder:FoldersItemsMenu) {
333 if (tmpFolder.group && tmpFolder.group === (<FoldersItemsMenuGroup>folderItem).groupname) {
334 total = total + self._getTotalCounts(tmpFolder, self);
338 total = total + self._getTotalCounts(folderItem, self);
343 this.$scope.getCurrentFolderDistributed = ():Array<any> => {
346 if (this.$scope.folders) {
347 let folderItem:FoldersItemsMenu = this.$scope.folders.getCurrentFolder();
348 if (folderItem.isGroup()) {
349 this.$scope.folders.getFolders().forEach(function (tmpFolder:FoldersItemsMenu) {
350 if (tmpFolder.group && tmpFolder.group === (<FoldersItemsMenuGroup>folderItem).groupname) {
351 self._setStates(tmpFolder, states);
355 self._setStates(folderItem, states);
361 this.$scope.setSelectedFolder = (folderItem:FoldersItemsMenu):void => {
362 this.$scope.folders.setSelected(folderItem);
365 this.$scope.goToComponent = (component:Component):void => {
366 this.$scope.isLoading = true;
367 this.$state.go('workspace.general', {id: component.uniqueId, type: component.componentType.toLowerCase()});
372 private _getTotalCounts(tmpFolder, self):number {
373 let total:number = 0;
374 if (tmpFolder.dist !== undefined) {
375 let distributions = tmpFolder.dist.split(',');
376 distributions.forEach((item:any) => {
377 total = total + self.getEntitiesByStateDist(tmpFolder.state, item).length;
381 total = total + self.getEntitiesByStateDist(tmpFolder.state, tmpFolder.dist).length;
386 private _setStates(tmpFolder, states) {
387 if (tmpFolder.states !== undefined) {
388 tmpFolder.states.forEach(function (item:any) {
389 states.push({"state": item.state, "dist": item.dist});
392 states.push({"state": tmpFolder.state, "dist": tmpFolder.dist});
396 private initEntities = (reload:boolean):void => {
397 this.$scope.isLoading = reload;
398 this.entityService.getAllComponents().then(
399 (components:Array<Component>) => {
400 this.components = components;
401 this.$scope.components = components;
402 this.$scope.isLoading = false;
406 private getEntitiesByStateDist = (state:string, dist:string):Array<Component> => {
407 let gObj:Array<Component>;
408 if (this.components && (state || dist)) {
409 gObj = this.components.filter(function (obj:Component) {
410 if (dist !== undefined && obj.distributionStatus === dist && obj.lifecycleState === state) {
412 } else if (dist === undefined && obj.lifecycleState === state) {