From f97bae33631c3f5ef06574e9d21620c8dfff8f62 Mon Sep 17 00:00:00 2001 From: Idan Amit Date: Tue, 6 Mar 2018 13:52:58 +0200 Subject: [PATCH] Add events hub notify calls Added events hub notify calls. Fixed issues raised by development across the publish subscribe mechanism development Change-Id: I0768bdcb2d89f99634cdb6bc7cb75e20263f5c00 Issue-ID: SDC-1029 Signed-off-by: Idan Amit --- catalog-ui/src/app/app.ts | 2 +- catalog-ui/src/app/models/base-pubsub.ts | 6 +-- catalog-ui/src/app/modules/service-module.ts | 2 + catalog-ui/src/app/ng2/app.module.ts | 3 +- .../components/ui/plugin/plugin-frame.component.ts | 41 +++++++++++++++--- .../components/ui/plugin/plugin-frame.module.ts | 4 +- .../src/app/ng2/utils/ng1-upgraded-provider.ts | 14 +++++- .../app/services/components/component-service.ts | 22 ++++++++-- .../app/services/components/resource-service.ts | 13 +++--- .../src/app/services/components/service-service.ts | 10 +++-- .../view-models/plugins/plugins-tab-view-model.ts | 15 +++++-- .../app/view-models/plugins/plugins-tab-view.html | 6 +-- .../tabs/plugins/plugins-context-view-model.ts | 14 +++++- .../tabs/plugins/plugins-context-view.html | 5 +-- .../view-models/workspace/workspace-view-model.ts | 50 ++++++++++++++++++---- 15 files changed, 160 insertions(+), 47 deletions(-) diff --git a/catalog-ui/src/app/app.ts b/catalog-ui/src/app/app.ts index d67f158ded..e44e4eecb6 100644 --- a/catalog-ui/src/app/app.ts +++ b/catalog-ui/src/app/app.ts @@ -153,7 +153,7 @@ angular.module('sdcApp').directive('ng2SearchWithAutocomplete', inputs: ['searchPlaceholder', 'searchBarClass', 'autoCompleteValues'], outputs: ['searchChanged', 'searchButtonClicked'] }) as angular.IDirectiveFactory); -angular.module('sdcApp').directive('pluginFrame', downgradeComponent( {component: PluginFrameComponent, inputs: ['plugin', 'queryParams']} ) as angular.IDirectiveFactory); +angular.module('sdcApp').directive('pluginFrame', downgradeComponent( {component: PluginFrameComponent, inputs: ['plugin', 'queryParams'], outputs: ['onLoadingDone']} ) as angular.IDirectiveFactory); ng1appModule.config([ '$stateProvider', diff --git a/catalog-ui/src/app/models/base-pubsub.ts b/catalog-ui/src/app/models/base-pubsub.ts index ca500ca173..ca313b15f5 100644 --- a/catalog-ui/src/app/models/base-pubsub.ts +++ b/catalog-ui/src/app/models/base-pubsub.ts @@ -37,7 +37,7 @@ export class BasePubSub { this.eventsCallbacks.splice(index, 1) } - public notify(eventType:string, eventData:any) { + public notify(eventType:string, eventData?:any) { let eventObj = { type: eventType, data: eventData, @@ -60,9 +60,9 @@ export class BasePubSub { export class PluginPubSub extends BasePubSub { - constructor(pluginId: string, subscriberUrl: string) { + constructor(pluginId: string, parentUrl: string) { super(pluginId); - this.register('sdc-hub', window.parent, subscriberUrl); + this.register('sdc-hub', window.parent, parentUrl); this.subscribe(); } diff --git a/catalog-ui/src/app/modules/service-module.ts b/catalog-ui/src/app/modules/service-module.ts index 87a435df40..387332cae5 100644 --- a/catalog-ui/src/app/modules/service-module.ts +++ b/catalog-ui/src/app/modules/service-module.ts @@ -52,6 +52,7 @@ import {ConnectionWizardService} from "../ng2/pages/connection-wizard/connection import {ComponentInstanceServiceNg2} from "../ng2/services/component-instance-services/component-instance.service"; import {UserService as UserServiceNg2} from "../ng2/services/user.service"; import {PluginsService} from "../ng2/services/plugins.service"; +import {EventBusService} from "../ng2/services/event-bus.service"; let moduleName:string = 'Sdc.Services'; let serviceModule:ng.IModule = angular.module(moduleName, []); @@ -97,3 +98,4 @@ serviceModule.factory('ConnectionWizardServiceNg2', downgradeInjectable(Connecti serviceModule.factory('ComponentInstanceServiceNg2', downgradeInjectable(ComponentInstanceServiceNg2)); serviceModule.factory('UserServiceNg2', downgradeInjectable(UserServiceNg2)); serviceModule.factory('PluginsService', downgradeInjectable(PluginsService)); +serviceModule.factory('EventBusService', downgradeInjectable(EventBusService)); diff --git a/catalog-ui/src/app/ng2/app.module.ts b/catalog-ui/src/app/ng2/app.module.ts index 0346b10915..ffeb1fd89f 100644 --- a/catalog-ui/src/app/ng2/app.module.ts +++ b/catalog-ui/src/app/ng2/app.module.ts @@ -28,7 +28,7 @@ import {UpgradeModule} from '@angular/upgrade/static'; import {PropertiesAssignmentModule} from './pages/properties-assignment/properties-assignment.module'; import { DataTypesServiceProvider, SharingServiceProvider, CookieServiceProvider, StateServiceFactory, - StateParamsServiceFactory, CacheServiceProvider, EventListenerServiceProvider + StateParamsServiceFactory, CacheServiceProvider, EventListenerServiceProvider, ScopeServiceFactory } from "./utils/ng1-upgraded-provider"; import {ConfigService} from "./services/config.service"; import {HttpModule} from '@angular/http'; @@ -85,6 +85,7 @@ export function configServiceFactory(config:ConfigService) { SharingServiceProvider, CookieServiceProvider, StateServiceFactory, + ScopeServiceFactory, StateParamsServiceFactory, CacheServiceProvider, EventListenerServiceProvider, diff --git a/catalog-ui/src/app/ng2/components/ui/plugin/plugin-frame.component.ts b/catalog-ui/src/app/ng2/components/ui/plugin/plugin-frame.component.ts index 801dfa98fe..eb7d138232 100644 --- a/catalog-ui/src/app/ng2/components/ui/plugin/plugin-frame.component.ts +++ b/catalog-ui/src/app/ng2/components/ui/plugin/plugin-frame.component.ts @@ -1,27 +1,32 @@ -import {Component, OnInit, Input} from "@angular/core"; -import { URLSearchParams } from '@angular/http'; +import {Component, Inject, Input, Output, OnInit, EventEmitter, ViewChild, ElementRef} from "@angular/core"; +import {URLSearchParams} from '@angular/http'; import {Plugin} from "app/models"; +import {EventBusService} from "../../../services/event-bus.service"; @Component({ selector: 'plugin-frame', templateUrl: './plugin-frame.component.html', - styleUrls:['plugin-frame.component.less'] + styleUrls: ['plugin-frame.component.less'] }) export class PluginFrameComponent implements OnInit { @Input() plugin: Plugin; @Input() queryParams: Object; + @Output() onLoadingDone: EventEmitter = new EventEmitter(); pluginUrl: string; private urlSearchParams: URLSearchParams; + private isClosed: boolean; - constructor() { + constructor(private eventBusService: EventBusService, + @Inject('$scope') private $scope: ng.IScope, + @Inject('$state') private $state: ng.ui.IStateService) { this.urlSearchParams = new URLSearchParams(); } ngOnInit(): void { - this.pluginUrl = this.plugin.pluginSourceUrl; + this.isClosed = false; if (this.queryParams && !_.isEmpty(this.queryParams)) { _.forOwn(this.queryParams, (value, key) => { @@ -31,5 +36,31 @@ export class PluginFrameComponent implements OnInit { this.pluginUrl += '?'; this.pluginUrl += this.urlSearchParams.toString(); } + + this.eventBusService.on((eventData) => { + if (eventData.originId === this.plugin.pluginId) { + if (eventData.type == "READY") { + this.onLoadingDone.emit(); + } + } + }); + + // Listening to the stateChangeStart event in order to notify the plugin about it being closed + // before moving to a new state + this.$scope.$on('$stateChangeStart', (event, toState, toParams, fromState, fromParams) => { + if (fromState.name !== toState.name) { + if (!this.isClosed) { + event.preventDefault(); + + this.eventBusService.notify("WINDOW_OUT"); + + this.isClosed = true; + + setTimeout(() => { + this.$state.go(toState.name, toParams); + }); + } + } + }); } } diff --git a/catalog-ui/src/app/ng2/components/ui/plugin/plugin-frame.module.ts b/catalog-ui/src/app/ng2/components/ui/plugin/plugin-frame.module.ts index 81b99cc2d8..9eebd5c47f 100644 --- a/catalog-ui/src/app/ng2/components/ui/plugin/plugin-frame.module.ts +++ b/catalog-ui/src/app/ng2/components/ui/plugin/plugin-frame.module.ts @@ -3,6 +3,7 @@ import { CommonModule } from '@angular/common'; import {PluginFrameComponent} from "./plugin-frame.component"; import {LayoutModule} from "../../layout/layout.module"; import {GlobalPipesModule} from "../../../pipes/global-pipes.module"; +import {UiElementsModule} from "../ui-elements.module"; @NgModule({ @@ -12,7 +13,8 @@ import {GlobalPipesModule} from "../../../pipes/global-pipes.module"; imports: [ CommonModule, LayoutModule, - GlobalPipesModule + GlobalPipesModule, + UiElementsModule ], entryComponents: [PluginFrameComponent], exports: [ diff --git a/catalog-ui/src/app/ng2/utils/ng1-upgraded-provider.ts b/catalog-ui/src/app/ng2/utils/ng1-upgraded-provider.ts index c21817c001..51314c04bd 100644 --- a/catalog-ui/src/app/ng2/utils/ng1-upgraded-provider.ts +++ b/catalog-ui/src/app/ng2/utils/ng1-upgraded-provider.ts @@ -7,9 +7,9 @@ * 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. @@ -46,6 +46,10 @@ export function stateServiceFactory(cacheObj: ICacheObject) { return cacheObj.get('$state'); } +export function scopeServiceFactory(cacheObj: ICacheObject) { + return cacheObj.get('$scope'); +} + export function stateParamsServiceFactory(cacheObj: ICacheObject) { return cacheObj.get('$stateParams'); } @@ -84,6 +88,12 @@ export const StateServiceFactory = { deps: ['$injector'] }; +export const ScopeServiceFactory= { + provide: '$scope', + useFactory: scopeServiceFactory, + deps: ['$injector'] +}; + export const StateParamsServiceFactory = { provide: '$stateParams', useFactory: stateParamsServiceFactory, diff --git a/catalog-ui/src/app/services/components/component-service.ts b/catalog-ui/src/app/services/components/component-service.ts index 90ae850899..1b2b9f2fa1 100644 --- a/catalog-ui/src/app/services/components/component-service.ts +++ b/catalog-ui/src/app/services/components/component-service.ts @@ -7,9 +7,9 @@ * 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. @@ -23,6 +23,7 @@ import {ArtifactModel, IFileDownload, InstancesInputsPropertiesMap, InputModel, import {ComponentInstanceFactory, CommonUtils} from "app/utils"; import {SharingService} from "../sharing-service"; import {ComponentMetadata} from "../../models/component-metadata"; +import {EventBusService} from "../../ng2/services/event-bus.service"; export interface IComponentService { @@ -79,14 +80,16 @@ export class ComponentService implements IComponentService { 'sdcConfig', 'Sdc.Services.SharingService', '$q', - '$base64' + '$base64', + 'EventBusService' ]; constructor(protected restangular:restangular.IElement, protected sdcConfig:IAppConfigurtaion, protected sharingService:SharingService, protected $q:ng.IQService, - protected $base64:any + protected $base64:any, + protected eventBusService:EventBusService ) { this.restangular.setBaseUrl(sdcConfig.api.root + sdcConfig.api.component_api_root); @@ -224,6 +227,17 @@ export class ComponentService implements IComponentService { }, (err)=> { deferred.reject(err); }); + + // Notifying about events before executing the actual actions + switch (state) { + case "checkIn": + this.eventBusService.notify("CHECK_IN"); + break; + case "submitForTesting": + this.eventBusService.notify("SUBMIT_FOR_TESTING"); + break; + } + return deferred.promise; }; diff --git a/catalog-ui/src/app/services/components/resource-service.ts b/catalog-ui/src/app/services/components/resource-service.ts index 472775e50d..641d7cba48 100644 --- a/catalog-ui/src/app/services/components/resource-service.ts +++ b/catalog-ui/src/app/services/components/resource-service.ts @@ -7,9 +7,9 @@ * 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. @@ -25,6 +25,7 @@ import {IComponentService, ComponentService} from "./component-service"; import {PropertyModel, IAppConfigurtaion, Resource, Component} from "../../models"; import {SharingService} from "../sharing-service"; +import {EventBusService} from "../../ng2/services/event-bus.service"; export interface IResourceService extends IComponentService { updateResourceGroupProperties(uniqueId:string, groupId:string, properties:Array):ng.IPromise> @@ -37,16 +38,18 @@ export class ResourceService extends ComponentService implements IResourceServic 'sdcConfig', 'Sdc.Services.SharingService', '$q', - '$base64' + '$base64', + 'EventBusService' ]; constructor(protected restangular:restangular.IElement, protected sdcConfig:IAppConfigurtaion, protected sharingService:SharingService, protected $q:ng.IQService, - protected $base64:any + protected $base64:any, + protected eventBusService:EventBusService ) { - super(restangular, sdcConfig, sharingService, $q, $base64); + super(restangular, sdcConfig, sharingService, $q, $base64, eventBusService); this.restangular = restangular.one("resources"); } diff --git a/catalog-ui/src/app/services/components/service-service.ts b/catalog-ui/src/app/services/components/service-service.ts index f92f5699dc..4229c4aa2a 100644 --- a/catalog-ui/src/app/services/components/service-service.ts +++ b/catalog-ui/src/app/services/components/service-service.ts @@ -7,9 +7,9 @@ * 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. @@ -25,6 +25,7 @@ import {IComponentService, ComponentService} from "./component-service"; import {Distribution, DistributionComponent, Service, PropertyModel, Component, IAppConfigurtaion} from "app/models"; import {SharingService} from "../sharing-service"; +import {EventBusService} from "../../ng2/services/event-bus.service"; export interface IServiceService extends IComponentService { getDistributionsList(uuid:string):ng.IPromise>; @@ -49,8 +50,9 @@ export class ServiceService extends ComponentService implements IServiceService protected sdcConfig:IAppConfigurtaion, protected sharingService:SharingService, protected $q:ng.IQService, - protected $base64:any) { - super(restangular, sdcConfig, sharingService, $q, $base64); + protected $base64:any, + protected eventBusService:EventBusService) { + super(restangular, sdcConfig, sharingService, $q, $base64, eventBusService); this.restangular = restangular.one("services"); } diff --git a/catalog-ui/src/app/view-models/plugins/plugins-tab-view-model.ts b/catalog-ui/src/app/view-models/plugins/plugins-tab-view-model.ts index 5e2a59925c..438cf4a60c 100644 --- a/catalog-ui/src/app/view-models/plugins/plugins-tab-view-model.ts +++ b/catalog-ui/src/app/view-models/plugins/plugins-tab-view-model.ts @@ -8,6 +8,9 @@ interface IPluginsTabViewModelScope extends ng.IScope { user: IUserProperties; version: string; queryParams: Object; + isLoading: boolean; + + onLoadingDone(plugin: Plugin): void; } export class PluginsTabViewModel { @@ -27,17 +30,23 @@ export class PluginsTabViewModel { } private initScope = ():void => { + this.$scope.isLoading = true; this.$scope.plugin = this.pluginsService.getPluginByStateUrl(this.$stateParams.path); - this.$scope.version = this.cacheService.get('version'); - this.$scope.user = this.cacheService.get('user'); this.$scope.queryParams = { userId: this.$scope.user.userId, userRole: this.$scope.user.role, displayType: "tab", - parentUrl: window.location.origin + parentUrl: window.location.origin, + eventsClientId: this.$scope.plugin.pluginId + }; + + this.$scope.onLoadingDone = (plugin: Plugin) => { + if (plugin.pluginId == this.$scope.plugin.pluginId) { + this.$scope.isLoading = false; + } }; } } diff --git a/catalog-ui/src/app/view-models/plugins/plugins-tab-view.html b/catalog-ui/src/app/view-models/plugins/plugins-tab-view.html index 3695434463..bc404b46d1 100644 --- a/catalog-ui/src/app/view-models/plugins/plugins-tab-view.html +++ b/catalog-ui/src/app/view-models/plugins/plugins-tab-view.html @@ -1,7 +1,5 @@
- + - - - +
diff --git a/catalog-ui/src/app/view-models/workspace/tabs/plugins/plugins-context-view-model.ts b/catalog-ui/src/app/view-models/workspace/tabs/plugins/plugins-context-view-model.ts index 959aead3ae..550fb84c10 100644 --- a/catalog-ui/src/app/view-models/workspace/tabs/plugins/plugins-context-view-model.ts +++ b/catalog-ui/src/app/view-models/workspace/tabs/plugins/plugins-context-view-model.ts @@ -8,6 +8,9 @@ interface IPluginsContextViewModelScope extends IWorkspaceViewModelScope { plugin: Plugin; user:IUserProperties; queryParams: Object; + isLoading: boolean; + + onLoadingDone(plugin: Plugin): void; } export class PluginsContextViewModel { @@ -27,8 +30,8 @@ export class PluginsContextViewModel { } private initScope = ():void => { + this.$scope.isLoading = true; this.$scope.plugin = this.pluginsService.getPluginByStateUrl(this.$stateParams.path); - this.$scope.user = this.cacheService.get('user'); this.$scope.queryParams = { @@ -40,7 +43,14 @@ export class PluginsContextViewModel { lifecycleState: this.$scope.component.lifecycleState, isOwner: this.$scope.component.lastUpdaterUserId === this.$scope.user.userId, version: this.$scope.component.version , - parentUrl: window.location.origin + parentUrl: window.location.origin, + eventsClientId: this.$scope.plugin.pluginId + }; + + this.$scope.onLoadingDone = (plugin: Plugin) => { + if (plugin.pluginId == this.$scope.plugin.pluginId) { + this.$scope.isLoading = false; + } }; } diff --git a/catalog-ui/src/app/view-models/workspace/tabs/plugins/plugins-context-view.html b/catalog-ui/src/app/view-models/workspace/tabs/plugins/plugins-context-view.html index e155370ddd..d70717a3ed 100644 --- a/catalog-ui/src/app/view-models/workspace/tabs/plugins/plugins-context-view.html +++ b/catalog-ui/src/app/view-models/workspace/tabs/plugins/plugins-context-view.html @@ -1,5 +1,4 @@ +
- - - +
diff --git a/catalog-ui/src/app/view-models/workspace/workspace-view-model.ts b/catalog-ui/src/app/view-models/workspace/workspace-view-model.ts index 0f9d7590c7..ca34d6fdc4 100644 --- a/catalog-ui/src/app/view-models/workspace/workspace-view-model.ts +++ b/catalog-ui/src/app/view-models/workspace/workspace-view-model.ts @@ -35,6 +35,7 @@ import { LeftPaletteLoaderService } from "app/services"; import {FileUploadModel} from "../../directives/file-upload/file-upload"; +import {EventBusService} from "../../ng2/services/event-bus.service"; export interface IWorkspaceViewModelScope extends ng.IScope { @@ -115,7 +116,8 @@ export class WorkspaceViewModel { 'Sdc.Services.EntityService', 'Notification', '$stateParams', - 'Sdc.Services.ProgressService' + 'Sdc.Services.ProgressService', + 'EventBusService' ]; constructor(private $scope:IWorkspaceViewModelScope, @@ -134,7 +136,8 @@ export class WorkspaceViewModel { private EntityService:EntityService, private Notification:any, private $stateParams:any, - private progressService:ProgressService) { + private progressService:ProgressService, + private eventBusService:EventBusService) { this.initScope(); this.initAfterScope(); @@ -216,6 +219,10 @@ export class WorkspaceViewModel { } }; + this.$scope.$on('$stateChangeSuccess', (event, toState) => { + this.$scope.updateSelectedMenuItem(this.$state.current.name); + }); + this.$scope.onMenuItemPressed = (state:string, params:any):ng.IPromise => { let deferred = this.$q.defer(); let goToState = ():void => { @@ -223,9 +230,7 @@ export class WorkspaceViewModel { id: this.$scope.component.uniqueId, type: this.$scope.component.componentType.toLowerCase(), components: this.components - }, params)).then(() => { - this.$scope.updateSelectedMenuItem(state); - }); + }, params)); deferred.resolve(true); }; if (this.isNeedSave()) { @@ -266,6 +271,14 @@ export class WorkspaceViewModel { }); } this.$scope.isLoading = true; + + let eventData = { + uuid: this.$scope.component.uuid, + version: this.$scope.changeVersion.selectedVersion.versionNumber + }; + + this.eventBusService.notify("VERSION_CHANGED", eventData); + this.$state.go(this.$state.current.name, { id: selectedId, type: this.$scope.componentType.toLowerCase(), @@ -426,6 +439,22 @@ export class WorkspaceViewModel { let onSuccess = (component:Component, url:string):void => { //Updating the component from server response + // Creating the data object to notify the plugins with + let eventData: any = { + uuid: this.$scope.component.uuid, + version: this.$scope.component.version + }; + + // Notifying about events after successfully executing the actions + switch (state) { + case "checkOut": + this.eventBusService.notify("CHECK_OUT", eventData); + break; + case "deleteVersion": + this.eventBusService.notify("UNDO_CHECK_OUT", eventData); + break; + } + //the server returns only metaData (small component) except checkout (Full component) ,so we update only the statuses of distribution & lifecycle this.$scope.component.lifecycleState = component.lifecycleState; this.$scope.component.distributionStatus = component.distributionStatus; @@ -472,10 +501,12 @@ export class WorkspaceViewModel { }); break; case 'lifecycleState/UNDOCHECKOUT': - defaultActionAfterChangeLifecycleState(); - this.Notification.success({ - message: this.$filter('translate')("DELETE_SUCCESS_MESSAGE_TEXT"), - title: this.$filter('translate')("DELETE_SUCCESS_MESSAGE_TITLE") + setTimeout(() => { + defaultActionAfterChangeLifecycleState(); + this.Notification.success({ + message: this.$filter('translate')("DELETE_SUCCESS_MESSAGE_TEXT"), + title: this.$filter('translate')("DELETE_SUCCESS_MESSAGE_TITLE") + }); }); break; case 'lifecycleState/certificationRequest': @@ -550,6 +581,7 @@ export class WorkspaceViewModel { } }; //this.$scope.isLoading = true; + this.ChangeLifecycleStateHandler.changeLifecycleState(this.$scope.component, data, this.$scope, onSuccess); }; -- 2.16.6