import {ComponentFactory} from "./component-factory"; import {Component, Service,IAppMenu, IAppConfigurtaion} from "../models"; import {IEmailModalModel, IEmailModalModel_Email, IEmailModalModel_Data} from "../view-models/modals/email-modal/email-modal-view-model"; import {AsdcComment} from "../models/comments"; import {ModalsHandler} from "./modals-handler"; import {ServiceServiceNg2} from "../ng2/services/component-services/service.service"; /** * Created by obarda on 2/11/2016. */ export class ChangeLifecycleStateHandler { static '$inject' = [ 'sdcConfig', 'sdcMenu', 'ComponentFactory', '$filter', 'ModalsHandler', 'ServiceServiceNg2' ]; constructor(private sdcConfig:IAppConfigurtaion, private sdcMenu:IAppMenu, private ComponentFactory:ComponentFactory, private $filter:ng.IFilterService, private ModalsHandler:ModalsHandler, private ServiceServiceNg2:ServiceServiceNg2) { } private actualChangeLifecycleState = (component:Component, data:any, scope:any, onSuccessCallback?:Function, onErrorCallback?:Function):void => { let self = this; let getContacts = (component:Component):string => { let testers = this.sdcConfig.testers; let result:string = testers[component.componentType][component.categories[0].name] ? testers[component.componentType][component.categories[0].name] : testers[component.componentType]['default']; return result; }; let onSuccess = (newComponent:Component):void => { //scope.isLoading = false; console.info(component.componentType.toLowerCase + ' change state ', newComponent); if (onSuccessCallback) { onSuccessCallback(self.ComponentFactory.createComponent(newComponent), data.url); } }; let onError = (error):void => { scope.isLoading = false; console.info('Failed to changeLifecycleState to ', data.url); if (onErrorCallback) { onErrorCallback(error); } }; let comment:AsdcComment = new AsdcComment(); if (data.alertModal) { // Show alert dialog if defined in menu.json //------------------------------------------------- let onOk = (confirmationText):void => { comment.userRemarks = confirmationText; scope.isLoading = true; component.changeLifecycleState(data.url, comment).then(onSuccess, onError); }; let onCancel = ():void => { console.info('Cancel pressed'); scope.isLoading = false; }; let modalTitle = this.sdcMenu.alertMessages[data.alertModal].title; let modalMessage = this.sdcMenu.alertMessages[data.alertModal].message.format([component.componentType.toLowerCase()]); this.ModalsHandler.openAlertModal(modalTitle, modalMessage).then(onOk, onCancel); } else if (data.confirmationModal) { // Show confirmation dialog if defined in menu.json //------------------------------------------------- let onOk = (confirmationText):void => { comment.userRemarks = confirmationText; scope.isLoading = true; component.changeLifecycleState(data.url, comment).then(onSuccess, onError); }; let onCancel = ():void => { console.info('Cancel pressed'); scope.isLoading = false; }; let modalTitle = this.sdcMenu.confirmationMessages[data.confirmationModal].title; let modalMessage = this.sdcMenu.confirmationMessages[data.confirmationModal].message.format([component.componentType.toLowerCase()]); let modalShowComment = this.sdcMenu.confirmationMessages[data.confirmationModal].showComment; this.ModalsHandler.openConfirmationModal(modalTitle, modalMessage, modalShowComment).then(onOk, onCancel); } else if (data.emailModal) { // Show email dialog if defined in menu.json //------------------------------------------------- let onOk = (resource):void => { if (resource) { onSuccess(resource); } else { onError("Error changing life cycle state"); } }; let onCancel = ():void => { scope.isLoading = false; }; let emailModel:IEmailModalModel = {}; emailModel.email = {}; emailModel.data = {}; emailModel.title = this.$filter('translate')("EMAIL_MODAL_TITLE"); emailModel.email.to = getContacts(component); emailModel.email.subject = this.$filter('translate')("EMAIL_MODAL_SUBJECT", "{'entityName': '" + this.$filter('resourceName')(component.name) + "','entityVersion': '" + component.version + "'}"); emailModel.email.message = ''; emailModel.data.component = component; emailModel.data.stateUrl = data.url; this.ModalsHandler.openEmailModal(emailModel).then(onOk, onCancel); } else { // Submit to server only (no modal is shown). scope.isLoading = true; component.changeLifecycleState(data.url, comment).then(onSuccess, onError); } } public changeLifecycleState = (component:Component, data:any, scope:any, onSuccessCallback?:Function, onErrorCallback?:Function):void => { if (data.conformanceLevelModal) { this.validateConformanceLevel(component, data, scope, onSuccessCallback, onErrorCallback); } else { this.actualChangeLifecycleState(component, data, scope, onSuccessCallback, onErrorCallback); } } private validateConformanceLevel = (component:Component, data:any, scope:any, onSuccessCallback?:Function, onErrorCallback?:Function):void => { // Validate conformance level if defined in menu.json //------------------------------------------------- this.ServiceServiceNg2.validateConformanceLevel(component).subscribe((res:boolean) => { if (res === true) { //conformance level is ok - continue this.actualChangeLifecycleState(component, data, scope, onSuccessCallback, onErrorCallback); } else { //show warning modal this.ModalsHandler.openConformanceLevelModal() .then(() => { //continue distribute this.actualChangeLifecycleState(component, data, scope, onSuccessCallback, onErrorCallback); }).catch(() => { //reject distribution this.actualChangeLifecycleState(component, data.conformanceLevelModal, scope, onSuccessCallback, onErrorCallback); }); } }); } }