/*-
* ============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 IComponentViewerViewModelScope extends ng.IScope {
component: Models.Components.Component;
additionalInformations: Array;
activityLog: any;
activityDateArray: Array; //this is in order to sort the dates
inputs: Array;
isLoading: boolean;
templateUrl: string;
currentTab:string;
preVersion:string;
sdcMenu:Models.IAppMenu;
versionsList:Array;
close(): void;
hasItems(obj:any): boolean;
onVersionChanged(version:any) : void;
moveToTab(tab:string):void;
isSelected(tab:string):boolean;
getActivityLog(uniqueId:string):void;
parseAction(action:string):string;
}
export class ComponentViewerViewModel {
static '$inject' = [
'$scope',
'$modalInstance',
'component',
'Sdc.Services.ActivityLogService',
'sdcMenu',
'ComponentFactory'
];
constructor(private $scope:IComponentViewerViewModelScope,
private $modalInstance:ng.ui.bootstrap.IModalServiceInstance,
private component:Models.Components.Component,
private activityLogService:Services.ActivityLogService,
private sdcMenu:Models.IAppMenu,
private ComponentFactory: Utils.ComponentFactory) {
this.initScope(component);
}
//creating objects for versions
private initVersionObject:Function = ():void => {
this.$scope.versionsList = [];
for (let version in this.$scope.component.allVersions) {
this.$scope.versionsList.push({
versionNumber: version,
versioning: this.versioning(version),
versionId: this.$scope.component.allVersions[version]
});
}
};
private versioning:Function = (versionNumber:string):string => {
let version:Array = versionNumber.split('.');
return '00000000'.slice(version[0].length) + version[0] + '.' + '00000000'.slice(version[1].length) + version[1];
};
private showComponentInformationView:Function = ():void => {
if (this.$scope.component.isResource()) {
this.$scope.templateUrl = '/app/scripts/view-models/component-viewer/properties/resource-properties-view.html';
} else if(this.$scope.component.isService()) {
this.$scope.templateUrl = '/app/scripts/view-models/component-viewer/properties/service-properties-view.html';
} else {
this.$scope.templateUrl = '/app/scripts/view-models/component-viewer/properties/product-properties-view.html';
}
};
private showActivityLogView:Function = ():void => {
this.$scope.templateUrl = '/app/scripts/view-models/component-viewer/activity-log/activity-log-view.html';
};
private initComponent = (component:Models.Components.Component):void => {
this.$scope.component = component;
this.$scope.additionalInformations = component.getAdditionalInformation();
this.initVersionObject();
this.$scope.isLoading = false;
};
private initScope = (component:Models.Components.Component):void => {
this.$scope.isLoading = false;
this.initComponent(component);
this.$scope.currentTab = 'PROPERTIES';
this.$scope.preVersion = component.version;
this.$scope.sdcMenu = this.sdcMenu;
this.showComponentInformationView();
//service inputs
if (component.isService()) {
let inputs:Array = [];
for (let group in component.componentInstancesProperties) {
if (component.componentInstancesProperties[group]) {
component.componentInstancesProperties[group].forEach((property:Models.PropertyModel):void => {
if (!property.value) {
property.value = property.defaultValue;
}
inputs.push({
name: property.name,
value: property.value,
type: property.type
});
});
}
}
this.$scope.inputs = inputs;
}
this.$scope.hasItems = (obj:any):boolean => {
return Object.keys(obj).length > 0;
};
this.$scope.close = ():void => {
this.$modalInstance.dismiss();
};
this.$scope.onVersionChanged = (version:any):void => {
if (version.versionNumber != this.$scope.component.version) {
this.$scope.isLoading = true;
this.ComponentFactory.getComponentFromServer(this.component.componentType, version.versionId).then((component: Models.Components.Component):void => {
this.initComponent(component);
});
if (this.$scope.currentTab === 'ACTIVITY_LOG') {
this.$scope.getActivityLog(version.versionId);
}
}
};
this.$scope.getActivityLog = (uniqueId:any):void => {
let onError = (response) => {
this.$scope.isLoading = false;
console.info('onFaild', response);
};
let onSuccess = (response:Array) => {
this.$scope.activityLog = _.groupBy(response, function (activity:Models.Activity) { //group by date only
let dateTime:Date = new Date(activity.TIMESTAMP.replace(" UTC", '').replace(" ", 'T'));
// let date:Date = new Date(dateTime.getFullYear(), dateTime.getMonth(), dateTime.getDate());
return dateTime.getTime();
});
/*this is in order to sort the jsonObject by date*/
this.$scope.activityDateArray = Object.keys(this.$scope.activityLog);
this.$scope.activityDateArray.sort().reverse();
this.$scope.isLoading = false;
};
this.$scope.isLoading = true;
if (this.$scope.component.isResource()) {
this.activityLogService.getActivityLogService('resources', uniqueId).then(onSuccess, onError);
}
if (this.$scope.component.isService()) {
this.activityLogService.getActivityLogService('services', uniqueId).then(onSuccess, onError);
}
};
this.$scope.moveToTab = (tab:string):void => {
if (tab === this.$scope.currentTab) {
return;
} else if (tab === 'PROPERTIES') {
this.showComponentInformationView();
this.$scope.preVersion = this.$scope.component.version;
} else if (tab === 'ACTIVITY_LOG') {
if (!this.$scope.activityLog || this.$scope.preVersion != this.$scope.component.version) {
this.$scope.activityLog = this.$scope.getActivityLog(this.$scope.component.uniqueId);
}
this.showActivityLogView();
} else {
console.error("Tab " + tab + " not found!");
return;
}
this.$scope.currentTab = tab;
};
this.$scope.isSelected = (tab:string):boolean => {
return tab === this.$scope.currentTab;
};
this.$scope.parseAction = (action:string) => {
return action ? action.split(/(?=[A-Z])/).join(' ') : '';
};
}
}
}