From 5197c8b7b3cf7576f1198e4b59a7d6484e793107 Mon Sep 17 00:00:00 2001 From: Idan Amit Date: Mon, 15 Jan 2018 14:31:42 +0200 Subject: Designer-view component for top-nav Create a designer-view component for opening a designer view from the top-nav Updated the API to return the designers as a list and not as an object Created a designer-frame component that will get a designer url to open in the dedicated position Change-Id: Ic42f7695277e88aacdeaa74d4d0f95b49ce44999 Issue-ID: SDC-884 Signed-off-by: Idan Amit --- .../openecomp/sdc/fe/impl/DesignerStatusBL.java | 24 +-- .../openecomp/sdc/fe/servlets/ConfigServlet.java | 2 +- .../resources/config/designers-configuration.yaml | 28 ++-- .../sdc/fe/servlets/DesignerStatusBLTest.java | 41 +++--- catalog-ui/src/app/app.ts | 15 +- catalog-ui/src/app/models.ts | 5 +- catalog-ui/src/app/models/designers-config.ts | 17 +++ catalog-ui/src/app/modules/view-model-module.ts | 8 +- catalog-ui/src/app/ng2/app.module.ts | 4 +- .../components/layout/top-nav/top-nav.component.ts | 23 ++- .../ui/designer/designer-frame.component.html | 5 + .../ui/designer/designer-frame.component.less | 8 + .../ui/designer/designer-frame.component.ts | 25 ++++ .../ui/designer/designer-frame.module.ts | 25 ++++ .../src/app/ng2/pipes/global-pipes.module.ts | 10 +- .../src/app/ng2/pipes/safeUrlSanitizer.pipe.ts | 10 ++ catalog-ui/src/app/ng2/services/config.service.ts | 17 ++- catalog-ui/src/app/utils/menu-handler.ts | 8 +- .../view-models/designers/designers-view-model.ts | 42 ++++++ .../app/view-models/designers/designers-view.html | 7 + .../sdc/fe/config/ConfigurationManager.java | 2 +- .../sdc/fe/config/DesignersConfiguration.java | 162 ++++++++++++--------- sdc-os-chef/environments/Template.json | 10 +- .../recipes/FE_2_setup_configuration.rb | 22 ++- .../default/FE-designers-configuration.yaml.erb | 28 ++-- 25 files changed, 382 insertions(+), 166 deletions(-) create mode 100644 catalog-ui/src/app/models/designers-config.ts create mode 100644 catalog-ui/src/app/ng2/components/ui/designer/designer-frame.component.html create mode 100644 catalog-ui/src/app/ng2/components/ui/designer/designer-frame.component.less create mode 100644 catalog-ui/src/app/ng2/components/ui/designer/designer-frame.component.ts create mode 100644 catalog-ui/src/app/ng2/components/ui/designer/designer-frame.module.ts create mode 100644 catalog-ui/src/app/ng2/pipes/safeUrlSanitizer.pipe.ts create mode 100644 catalog-ui/src/app/view-models/designers/designers-view-model.ts create mode 100644 catalog-ui/src/app/view-models/designers/designers-view.html diff --git a/catalog-fe/src/main/java/org/openecomp/sdc/fe/impl/DesignerStatusBL.java b/catalog-fe/src/main/java/org/openecomp/sdc/fe/impl/DesignerStatusBL.java index cadaf19e96..eb43df6c95 100644 --- a/catalog-fe/src/main/java/org/openecomp/sdc/fe/impl/DesignerStatusBL.java +++ b/catalog-fe/src/main/java/org/openecomp/sdc/fe/impl/DesignerStatusBL.java @@ -1,8 +1,8 @@ package org.openecomp.sdc.fe.impl; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; +import java.util.ArrayList; +import java.util.List; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpHead; @@ -32,31 +32,31 @@ public class DesignerStatusBL { } - public String checkDesinerListAvailability() { + public String checkDesignerListAvailability() { String result = null; - DesignersConfiguration designersConfiguarion = ConfigurationManager.getConfigurationManager() + DesignersConfiguration designersConfiguration = ConfigurationManager.getConfigurationManager() .getDesignersConfiguration(); - if (designersConfiguarion == null || designersConfiguarion.getDesignersList() == null) { + if (designersConfiguration == null || designersConfiguration.getDesignersList() == null) { log.warn("Configuration of type {} was not found", DesignersConfiguration.class); } else { - log.debug("The value returned from getConfig is {}", designersConfiguarion); + log.debug("The value returned from getConfig is {}", designersConfiguration); - Map avaiableDesignersMap = new HashMap(); + List availableDesignersList = new ArrayList<>(); - designersConfiguarion.getDesignersList().forEach((key, value) -> { - if (CheckDesignerAvailabilty(value)) { - avaiableDesignersMap.put(key, value); + designersConfiguration.getDesignersList().forEach(value -> { + if (checkDesignerAvailability(value)) { + availableDesignersList.add(value); } }); - result = gson.toJson(avaiableDesignersMap); + result = gson.toJson(availableDesignersList); } return result; } - private boolean CheckDesignerAvailabilty(Designer designer) { + private boolean checkDesignerAvailability(Designer designer) { StringBuilder requestString = new StringBuilder(); boolean result = false; diff --git a/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/ConfigServlet.java b/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/ConfigServlet.java index bcaf504497..ba37e94d10 100644 --- a/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/ConfigServlet.java +++ b/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/ConfigServlet.java @@ -124,7 +124,7 @@ public class ConfigServlet extends BasicServlet { DesignerStatusBL designerStatusBL = (DesignerStatusBL) context.getAttribute(Constants.DESIGNER_BL_COMPONENT); - result = designerStatusBL.checkDesinerListAvailability(); + result = designerStatusBL.checkDesignerListAvailability(); return Response.status(Status.OK).entity(result).build(); diff --git a/catalog-fe/src/main/resources/config/designers-configuration.yaml b/catalog-fe/src/main/resources/config/designers-configuration.yaml index c8c041b975..7064619878 100644 --- a/catalog-fe/src/main/resources/config/designers-configuration.yaml +++ b/catalog-fe/src/main/resources/config/designers-configuration.yaml @@ -1,13 +1,17 @@ designersList: - DCAE: - displayName: DCAE - designerHost: 192.168.50.5 - designerPort: 8080 - designerPath: "/dcae" - designerProtocol: http - WORKFLOW: - displayName: WORKFLOW - designerHost: 192.168.50.5 - designerPort: 9527 - designerPath: "" - designerProtocol: http \ No newline at end of file + - displayName: DCAE + designerHost: 192.168.50.5 + designerPort: 8080 + designerPath: "/dcae" + designerStateUrl: "dcae" + designerProtocol: http + buttonLocation: ["top", "tab"] + tabPresentation: ["VF", "SERVICE"] + - displayName: WORKFLOW + designerHost: 192.168.50.5 + designerPort: 9527 + designerPath: "/" + designerStateUrl: "workflowDesigner" + designerProtocol: http + buttonLocation: ["top"] + tabPresentation: [] \ No newline at end of file diff --git a/catalog-fe/src/test/java/org/openecomp/sdc/fe/servlets/DesignerStatusBLTest.java b/catalog-fe/src/test/java/org/openecomp/sdc/fe/servlets/DesignerStatusBLTest.java index 0ad233fd6d..00c2d206d5 100644 --- a/catalog-fe/src/test/java/org/openecomp/sdc/fe/servlets/DesignerStatusBLTest.java +++ b/catalog-fe/src/test/java/org/openecomp/sdc/fe/servlets/DesignerStatusBLTest.java @@ -4,8 +4,8 @@ import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; +import java.util.ArrayList; +import java.util.List; import org.apache.http.StatusLine; import org.apache.http.client.ClientProtocolException; @@ -30,12 +30,12 @@ public class DesignerStatusBLTest { private static Gson gson = new GsonBuilder().setPrettyPrinting().create(); final static ConfigurationManager configurationManager = Mockito.mock(ConfigurationManager.class); - final static DesignersConfiguration designersConfiguraiton = Mockito.mock(DesignersConfiguration.class); + final static DesignersConfiguration designersConfiguration = Mockito.mock(DesignersConfiguration.class); final static Designer offlineDesigner = new Designer(); - final static Designer onlineDesinger = new Designer(); + final static Designer onlineDesigner = new Designer(); final static CloseableHttpResponse httpResponse = Mockito.mock(CloseableHttpResponse.class); final static StatusLine statusLine = Mockito.mock(StatusLine.class); - final static Map testDesignersList = new HashMap(); + final static List testDesignersList = new ArrayList<>(); final static String offlineDesignerDisplayName = "offlineDesigner"; final static String offlineDesignerHost = "192.168.10.1"; @@ -48,14 +48,11 @@ public class DesignerStatusBLTest { final static int onlineDesignerPort = 2000; final static String onlineDesignerPath = "/online"; final static String onlineDesignerProtocol = "http"; - - StringBuilder offlineRequestString = new StringBuilder(); - StringBuilder onlineRequestString = new StringBuilder(); @BeforeClass public static void beforeClass() { ConfigurationManager.setTestInstance(configurationManager); - when(configurationManager.getDesignersConfiguration()).thenReturn(designersConfiguraiton); + when(configurationManager.getDesignersConfiguration()).thenReturn(designersConfiguration); offlineDesigner.setDisplayName(offlineDesignerDisplayName); offlineDesigner.setDesignerHost(offlineDesignerHost); @@ -67,11 +64,11 @@ public class DesignerStatusBLTest { offlineRequestString.append(offlineDesignerProtocol).append("://").append(onlineDesignerHost).append(":") .append(offlineDesignerPort).append(offlineDesignerPath); - onlineDesinger.setDisplayName(onlineDesignerDisplayName); - onlineDesinger.setDesignerHost(onlineDesignerHost); - onlineDesinger.setDesignerPort(onlineDesignerPort); - onlineDesinger.setDesignerPath(onlineDesignerPath); - onlineDesinger.setDesignerProtocol(onlineDesignerProtocol); + onlineDesigner.setDisplayName(onlineDesignerDisplayName); + onlineDesigner.setDesignerHost(onlineDesignerHost); + onlineDesigner.setDesignerPort(onlineDesignerPort); + onlineDesigner.setDesignerPath(onlineDesignerPath); + onlineDesigner.setDesignerProtocol(onlineDesignerProtocol); StringBuilder onlineRequestString = new StringBuilder(); onlineRequestString.append(onlineDesignerProtocol).append("://").append(onlineDesignerHost).append(":") @@ -80,22 +77,22 @@ public class DesignerStatusBLTest { } @Test - public void TestOfflineDesignerNotBeingReturnedWhenCallingCheckDesinerListAvailability() throws ClientProtocolException, IOException { - testDesignersList.put("offlineDesigner", offlineDesigner); - when(designersConfiguraiton.getDesignersList()).thenReturn(testDesignersList); + public void TestOfflineDesignerNotBeingReturnedWhenCallingCheckDesignerListAvailability() throws ClientProtocolException, IOException { + testDesignersList.add(offlineDesigner); + when(designersConfiguration.getDesignersList()).thenReturn(testDesignersList); when(statusLine.getStatusCode()).thenReturn(404); when(httpResponse.getStatusLine()).thenReturn(statusLine); when(httpClient.execute(Mockito.any(HttpHead.class))).thenReturn(httpResponse); - assertTrue(designerStatusBL.checkDesinerListAvailability().equals("{}")); + assertTrue(designerStatusBL.checkDesignerListAvailability().equals("[]")); } @Test - public void TestOnlineDesignerNotBeingReturnedWhenCallingCheckDesinerListAvailability() throws ClientProtocolException, IOException { - testDesignersList.put("onlineDesigner", onlineDesinger); - when(designersConfiguraiton.getDesignersList()).thenReturn(testDesignersList); + public void TestOnlineDesignerNotBeingReturnedWhenCallingCheckDesignerListAvailability() throws ClientProtocolException, IOException { + testDesignersList.add(onlineDesigner); + when(designersConfiguration.getDesignersList()).thenReturn(testDesignersList); when(statusLine.getStatusCode()).thenReturn(200); when(httpResponse.getStatusLine()).thenReturn(statusLine); @@ -103,7 +100,7 @@ public class DesignerStatusBLTest { String result = gson.toJson(testDesignersList); - assertTrue(designerStatusBL.checkDesinerListAvailability().equals(result)); + assertTrue(designerStatusBL.checkDesignerListAvailability().contains(result)); } diff --git a/catalog-ui/src/app/app.ts b/catalog-ui/src/app/app.ts index 609ed48f3e..a3a1ba9230 100644 --- a/catalog-ui/src/app/app.ts +++ b/catalog-ui/src/app/app.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. @@ -58,6 +58,7 @@ import {ComponentMetadata} from "./models/component-metadata"; import {Categories} from "./models/categories"; import {IUserProperties} from "./models/user"; import {SearchWithAutoCompleteComponent} from "./ng2/components/ui/search-with-autocomplete/search-with-autocomplete.component"; +import {DesignerFrameComponent} from "./ng2/components/ui/designer/designer-frame.component"; let moduleName:string = 'sdcApp'; @@ -152,7 +153,7 @@ angular.module('sdcApp').directive('ng2SearchWithAutocomplete', inputs: ['searchPlaceholder', 'searchBarClass', 'autoCompleteValues'], outputs: ['searchChanged', 'searchButtonClicked'] }) as angular.IDirectiveFactory); - +angular.module('sdcApp').directive('designerFrame', downgradeComponent( {component: DesignerFrameComponent, inputs: ['designer']} ) as angular.IDirectiveFactory); ng1appModule.config([ '$stateProvider', @@ -533,6 +534,14 @@ ng1appModule.config([ } ); + $stateProvider.state( + 'designers', { + url: '/designers/*path', + templateUrl: './view-models/designers/designers-view.html', + controller: viewModelsModuleName + '.DesignersViewModel' + } + ); + // Build the states for all hosted apps dynamically _.each(hostedApplications, (hostedApp)=> { if (hostedApp.exists) { diff --git a/catalog-ui/src/app/models.ts b/catalog-ui/src/app/models.ts index 014525367d..4848fb5da2 100644 --- a/catalog-ui/src/app/models.ts +++ b/catalog-ui/src/app/models.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. @@ -26,6 +26,7 @@ export * from './models/activity'; export * from './models/additional-information'; export * from './models/app-config'; export * from './models/validation-config'; +export * from './models/designers-config'; export * from './models/artifacts'; export * from './models/aschema-property'; export * from './models/schema-attribute'; diff --git a/catalog-ui/src/app/models/designers-config.ts b/catalog-ui/src/app/models/designers-config.ts new file mode 100644 index 0000000000..c784be2707 --- /dev/null +++ b/catalog-ui/src/app/models/designers-config.ts @@ -0,0 +1,17 @@ + +export class Designer { + displayName: string; + designerHost: string; + designerPort: number; + designerPath: string; + designerStateUrl: string; + designerProtocol: string; + designerButtonLocation: Array; + designerTabPresentation: Array; +} + +export type Designers = Array; + +export class DesignersConfiguration { + static designers: Designers; +} diff --git a/catalog-ui/src/app/modules/view-model-module.ts b/catalog-ui/src/app/modules/view-model-module.ts index f94bfc3218..63ca9012d6 100644 --- a/catalog-ui/src/app/modules/view-model-module.ts +++ b/catalog-ui/src/app/modules/view-model-module.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. @@ -73,6 +73,7 @@ import {InputFormViewModel} from "../view-models/forms/input-form/input-form-vie import {HierarchyViewModel} from "../view-models/tabs/hierarchy/hierarchy-view-model"; import {downgradeComponent} from "@angular/upgrade/static"; import {ConformanceLevelModalViewModel} from "../view-models/modals/conformance-level-modal/conformance-level-modal-view-model"; +import {DesignersViewModel} from "../view-models/designers/designers-view-model"; // import {NG2ExampleComponent} from "../ng2/view-ng2/ng2.example.component/ng2.example.component"; // import {upgradeAdapter} from "../ng2/app.module"; // import { UpgradeAdapter } from '@angular/upgrade'; @@ -135,9 +136,10 @@ viewModelModule .controller(moduleName + '.ServiceInputsViewModel', ServiceInputsViewModel) .controller(moduleName + '.ReqAndCapabilitiesViewModel', ReqAndCapabilitiesViewModel) .controller(moduleName + '.InputFormViewModel', InputFormViewModel) + .controller(moduleName + '.DesignersViewModel', DesignersViewModel) // // //TABS - .controller(moduleName + '.HierarchyViewModel', HierarchyViewModel) + .controller(moduleName + '.HierarchyViewModel', HierarchyViewModel); // NG2 //.controller(moduleName + '.NG2Example', downgradeComponent({component: NG2Example2Component}) ); diff --git a/catalog-ui/src/app/ng2/app.module.ts b/catalog-ui/src/app/ng2/app.module.ts index 7108be93f9..ecaa26e1ce 100644 --- a/catalog-ui/src/app/ng2/app.module.ts +++ b/catalog-ui/src/app/ng2/app.module.ts @@ -46,6 +46,7 @@ import {UserService} from "./services/user.service"; import {SdcConfig} from "./config/sdc-config.config"; import { TranslateModule } from "./shared/translator/translate.module"; import { TranslationServiceConfig } from "./config/translation.service.config"; +import {DesignerFrameModule} from "./components/ui/designer/designer-frame.module"; export const upgradeAdapter = new UpgradeAdapter(forwardRef(() => AppModule)); @@ -72,7 +73,8 @@ export function configServiceFactory(config:ConfigService) { //We need to import them here since we use them in angular1 ConnectionWizardModule, - PropertiesAssignmentModule + PropertiesAssignmentModule, + DesignerFrameModule ], exports: [], entryComponents: [], diff --git a/catalog-ui/src/app/ng2/components/layout/top-nav/top-nav.component.ts b/catalog-ui/src/app/ng2/components/layout/top-nav/top-nav.component.ts index f48aa4801f..846b84c69f 100644 --- a/catalog-ui/src/app/ng2/components/layout/top-nav/top-nav.component.ts +++ b/catalog-ui/src/app/ng2/components/layout/top-nav/top-nav.component.ts @@ -24,6 +24,7 @@ import {MenuItemGroup, MenuItem} from "app/utils"; import {UserService} from "../../../services/user.service"; import {SdcConfigToken, ISdcConfig} from "../../../config/sdc-config.config"; import {TranslateService} from "../../../shared/translator/translate.service"; +import {DesignersConfiguration, Designer} from "app/models"; declare const window:any; @@ -62,10 +63,20 @@ export class TopNavComponent { let result = -1; //set result to current state - this.topLvlMenu.menuItems.forEach((item:MenuItem, index:number)=> { + this.topLvlMenu.menuItems.every((item:MenuItem, index:number)=> { if (item.state === this.$state.current.name) { - result = index; + if (this.$state.current.name === 'designers') { + const designerIdx = _.findIndex(DesignersConfiguration.designers, (designer: Designer) => designer.designerStateUrl === this.$state.params.path); + if (designerIdx !== -1) { + result = index + designerIdx; + return false; + } + } else { + result = index; + return false; + } } + return true; }); //if it's a different state , checking previous state param @@ -109,6 +120,10 @@ export class TopNavComponent { tmpArray.push(new MenuItem(hostedApp.navTitle, null, hostedApp.defaultState, "goToState", null, null)); } }); + + _.each(DesignersConfiguration.designers, (designer: Designer) => { + tmpArray.push(new MenuItem(designer.displayName, null, "designers", "goToState", {path: designer.designerStateUrl}, null)); + }) } this.topLvlMenu = new MenuItemGroup(0, tmpArray, true); @@ -124,9 +139,9 @@ export class TopNavComponent { } } - goToState(state:string, params:Array):Promise { + goToState(state:string, params:any):Promise { return new Promise((resolve, reject) => { - this.$state.go(state, params && params.length > 0 ? [0] : undefined); + this.$state.go(state, params || undefined); resolve(true); }); } diff --git a/catalog-ui/src/app/ng2/components/ui/designer/designer-frame.component.html b/catalog-ui/src/app/ng2/components/ui/designer/designer-frame.component.html new file mode 100644 index 0000000000..752e49e218 --- /dev/null +++ b/catalog-ui/src/app/ng2/components/ui/designer/designer-frame.component.html @@ -0,0 +1,5 @@ +
+
+ +
+
diff --git a/catalog-ui/src/app/ng2/components/ui/designer/designer-frame.component.less b/catalog-ui/src/app/ng2/components/ui/designer/designer-frame.component.less new file mode 100644 index 0000000000..4b9456b5b1 --- /dev/null +++ b/catalog-ui/src/app/ng2/components/ui/designer/designer-frame.component.less @@ -0,0 +1,8 @@ +.designer-frame { + + .designer-iframe { + width: 100%; + height: 100%; + border: none; + } +} diff --git a/catalog-ui/src/app/ng2/components/ui/designer/designer-frame.component.ts b/catalog-ui/src/app/ng2/components/ui/designer/designer-frame.component.ts new file mode 100644 index 0000000000..b66008f022 --- /dev/null +++ b/catalog-ui/src/app/ng2/components/ui/designer/designer-frame.component.ts @@ -0,0 +1,25 @@ +import {Component, OnInit, Input} from "@angular/core"; +import {Designer} from "app/models"; + +@Component({ + selector: 'designer-frame', + templateUrl: './designer-frame.component.html', + styleUrls:['designer-frame.component.less'] +}) + +export class DesignerFrameComponent implements OnInit { + + @Input() designer: Designer; + designerUrl: string; + + constructor() { + } + + ngOnInit(): void { + + this.designerUrl = this.designer.designerProtocol + "://" + + this.designer.designerHost + ":" + + this.designer.designerPort + + this.designer.designerPath; + } +} diff --git a/catalog-ui/src/app/ng2/components/ui/designer/designer-frame.module.ts b/catalog-ui/src/app/ng2/components/ui/designer/designer-frame.module.ts new file mode 100644 index 0000000000..1edf195230 --- /dev/null +++ b/catalog-ui/src/app/ng2/components/ui/designer/designer-frame.module.ts @@ -0,0 +1,25 @@ +import {NgModule} from "@angular/core"; +import { CommonModule } from '@angular/common'; +import {DesignerFrameComponent} from "./designer-frame.component"; +import {LayoutModule} from "../../layout/layout.module"; +import {GlobalPipesModule} from "../../../pipes/global-pipes.module"; + + +@NgModule({ + declarations: [ + DesignerFrameComponent + ], + imports: [ + CommonModule, + LayoutModule, + GlobalPipesModule + ], + entryComponents: [DesignerFrameComponent], + exports: [ + DesignerFrameComponent + ], + providers: [] +}) +export class DesignerFrameModule { + +} diff --git a/catalog-ui/src/app/ng2/pipes/global-pipes.module.ts b/catalog-ui/src/app/ng2/pipes/global-pipes.module.ts index 1d81a1a4bf..e89a816e95 100644 --- a/catalog-ui/src/app/ng2/pipes/global-pipes.module.ts +++ b/catalog-ui/src/app/ng2/pipes/global-pipes.module.ts @@ -3,21 +3,23 @@ import {SearchFilterPipe} from "./searchFilter.pipe"; import {KeysPipe} from "./keys.pipe"; import {GroupByPipe} from "./groupBy.pipe"; import {NgModule} from "@angular/core"; +import {SafeUrlSanitizerPipe} from "./safeUrlSanitizer.pipe"; @NgModule({ declarations: [ ContentAfterLastDotPipe, GroupByPipe, KeysPipe, - SearchFilterPipe - + SearchFilterPipe, + SafeUrlSanitizerPipe ], - + exports: [ ContentAfterLastDotPipe, GroupByPipe, KeysPipe, - SearchFilterPipe + SearchFilterPipe, + SafeUrlSanitizerPipe ] }) diff --git a/catalog-ui/src/app/ng2/pipes/safeUrlSanitizer.pipe.ts b/catalog-ui/src/app/ng2/pipes/safeUrlSanitizer.pipe.ts new file mode 100644 index 0000000000..9d8588030e --- /dev/null +++ b/catalog-ui/src/app/ng2/pipes/safeUrlSanitizer.pipe.ts @@ -0,0 +1,10 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { DomSanitizer } from '@angular/platform-browser'; + +@Pipe({ name: 'safeUrlSanitizer' }) +export class SafeUrlSanitizerPipe implements PipeTransform { + constructor(private sanitizer: DomSanitizer) {} + transform(url) { + return this.sanitizer.bypassSecurityTrustResourceUrl(url); + } +} diff --git a/catalog-ui/src/app/ng2/services/config.service.ts b/catalog-ui/src/app/ng2/services/config.service.ts index 1c0ee18d33..8675ea7d3d 100644 --- a/catalog-ui/src/app/ng2/services/config.service.ts +++ b/catalog-ui/src/app/ng2/services/config.service.ts @@ -25,7 +25,7 @@ import { Injectable, Inject } from '@angular/core'; import { Http, Response } from '@angular/http'; import 'rxjs/add/operator/toPromise'; -import {IAppConfigurtaion, ValidationConfiguration, Validations} from "app/models"; +import {IAppConfigurtaion, ValidationConfiguration, Validations, Designers, DesignersConfiguration} from "app/models"; import {IApi} from "app/models/app-config"; import {SdcConfigToken, ISdcConfig} from "../config/sdc-config.config"; @@ -69,15 +69,18 @@ export class ConfigService { return promise; } - loadDesignersConfiguration(): void { + loadDesignersConfiguration(): Promise { let url:string = this.api.no_proxy_root + this.api.GET_designers_configuration; let promise: Promise = this.http.get(url).map((res: Response) => res.json()).toPromise(); - - promise.then((config:any) => { - console.log(config); + promise.then((designersData: Designers) => { + DesignersConfiguration.designers = designersData; }).catch((ex) => { - console.error('Error was:', ex); - }) + console.error("Error loading designers configuration from BE", ex); + + DesignersConfiguration.designers = [] as Designers; + }); + + return promise; } } diff --git a/catalog-ui/src/app/utils/menu-handler.ts b/catalog-ui/src/app/utils/menu-handler.ts index 1a3215bf80..d48412a6ed 100644 --- a/catalog-ui/src/app/utils/menu-handler.ts +++ b/catalog-ui/src/app/utils/menu-handler.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. @@ -29,7 +29,7 @@ export class MenuItem { callback:(...args:Array) => ng.IPromise; state:string; action:string; - params:Array; + params:any; isDisabled:boolean; disabledRoles:Array; blockedForTypes:Array; // This item will not be shown for specific components types. @@ -42,7 +42,7 @@ export class MenuItem { url:string; // Data added to menu item, in case the function need to use it, example: for function "changeLifecycleState", I need to pass also the state "CHECKOUT" that I want the state to change to. - constructor(text:string, callback:(...args:Array) => ng.IPromise, state:string, action:string, params?:Array, blockedForTypes?:Array) { + constructor(text:string, callback:(...args:Array) => ng.IPromise, state:string, action:string, params?:any, blockedForTypes?:Array) { this.text = text; this.callback = callback; this.state = state; diff --git a/catalog-ui/src/app/view-models/designers/designers-view-model.ts b/catalog-ui/src/app/view-models/designers/designers-view-model.ts new file mode 100644 index 0000000000..42c1194258 --- /dev/null +++ b/catalog-ui/src/app/view-models/designers/designers-view-model.ts @@ -0,0 +1,42 @@ +import {Designer, IUserProperties, DesignersConfiguration} from "app/models"; +import {CacheService} from "app/services"; +import {MenuItemGroup} from "app/utils"; + + +interface IDesignerViewModelScope extends ng.IScope { + designer: Designer + topNavMenuModel:Array; + user:IUserProperties; + version:string; +} + +export class DesignersViewModel { + static '$inject' = [ + '$scope', + '$stateParams', + '$sce', + 'Sdc.Services.CacheService' + ]; + + constructor(private $scope:IDesignerViewModelScope, + private $stateParams:any, + private $sce:any, + private cacheService:CacheService) { + + this.initScope(); + } + + private initScope = ():void => { + // get the designer object by using the path parameter + let designerKey: any = _.findKey(DesignersConfiguration.designers, (designerConfig: Designer) =>{ + return designerConfig.designerStateUrl === this.$stateParams.path; + }); + + this.$scope.designer = DesignersConfiguration.designers[designerKey]; + + this.$scope.version = this.cacheService.get('version'); + this.$scope.topNavMenuModel = []; + + this.$scope.user = this.cacheService.get('user'); + } +} diff --git a/catalog-ui/src/app/view-models/designers/designers-view.html b/catalog-ui/src/app/view-models/designers/designers-view.html new file mode 100644 index 0000000000..3ae980589d --- /dev/null +++ b/catalog-ui/src/app/view-models/designers/designers-view.html @@ -0,0 +1,7 @@ +
+ + + + + +
diff --git a/common-app-api/src/main/java/org/openecomp/sdc/fe/config/ConfigurationManager.java b/common-app-api/src/main/java/org/openecomp/sdc/fe/config/ConfigurationManager.java index 0e1aabcccf..807189dabb 100644 --- a/common-app-api/src/main/java/org/openecomp/sdc/fe/config/ConfigurationManager.java +++ b/common-app-api/src/main/java/org/openecomp/sdc/fe/config/ConfigurationManager.java @@ -94,7 +94,7 @@ public class ConfigurationManager implements FileChangeCallback, IEcompConfigura public DesignersConfiguration getDesignersConfiguration() { - log.info("requested designers configuration and got this:{}", (DesignersConfiguration) configurations.get(getKey(DesignersConfiguration.class))); + log.info("requested designers configuration and got this:{}", configurations.get(getKey(DesignersConfiguration.class))); return (DesignersConfiguration) configurations.get(getKey(DesignersConfiguration.class)); } diff --git a/common-app-api/src/main/java/org/openecomp/sdc/fe/config/DesignersConfiguration.java b/common-app-api/src/main/java/org/openecomp/sdc/fe/config/DesignersConfiguration.java index 1b89ba02fd..6803120341 100644 --- a/common-app-api/src/main/java/org/openecomp/sdc/fe/config/DesignersConfiguration.java +++ b/common-app-api/src/main/java/org/openecomp/sdc/fe/config/DesignersConfiguration.java @@ -1,76 +1,102 @@ package org.openecomp.sdc.fe.config; -import java.util.HashMap; -import java.util.Map; +import java.util.ArrayList; +import java.util.List; import org.openecomp.sdc.common.api.BasicConfiguration; -public class DesignersConfiguration extends BasicConfiguration { - - private Map designersList; - - public Map getDesignersList() { - return designersList; - } - - public void setDesignersList(Map designersList) { - this.designersList = designersList; - } - - public DesignersConfiguration() { - this.designersList = new HashMap(); - } - - public static class Designer { - - private String displayName; - private String designerHost; - private Integer designerPort; - private String designerPath; - private String designerProtocol; - - - public String getDesignerProtocol() { - return designerProtocol; - } - - public void setDesignerProtocol(String designerProtocol) { - this.designerProtocol = designerProtocol; - } - - public String getDisplayName() { - return displayName; - } - - public void setDisplayName(String displayName) { - this.displayName = displayName; - } - - public String getDesignerHost() { - return designerHost; - } - - public void setDesignerHost(String designerHost) { - this.designerHost = designerHost; - } - - public Integer getDesignerPort() { - return designerPort; - } - - public void setDesignerPort(Integer designerPort) { - this.designerPort = designerPort; - } - - public String getDesignerPath() { - return designerPath; - } - - public void setDesignerPath(String designerPath) { - this.designerPath = designerPath; - } - - } +public class DesignersConfiguration extends BasicConfiguration { + + private List designersList; + + public List getDesignersList() { + return designersList; + } + + public void setDesignersList(List designersList) { + this.designersList = designersList; + } + + public DesignersConfiguration() { + this.designersList = new ArrayList<>(); + } + + public static class Designer { + + private String displayName; + private String designerHost; + private Integer designerPort; + private String designerPath; + private String designerStateUrl; + private String designerProtocol; + private List designerButtonLocation; + private List designerTabPresentation; + + public List getDesignerButtonLocation() { + return designerButtonLocation; + } + + public void setDesignerButtonLocation(List designerButtonLocation) { + this.designerButtonLocation = designerButtonLocation; + } + + public List getDesignerTabPresentation() { + return designerTabPresentation; + } + + public void setDesignerTabPresentation(List designerTabPresentation) { + this.designerTabPresentation = designerTabPresentation; + } + + public String getDesignerStateUrl() { + return designerStateUrl; + } + + public void setDesignerStateUrl(String designerStateUrl) { + this.designerStateUrl = designerStateUrl; + } + + public String getDesignerProtocol() { + return designerProtocol; + } + + public void setDesignerProtocol(String designerProtocol) { + this.designerProtocol = designerProtocol; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getDesignerHost() { + return designerHost; + } + + public void setDesignerHost(String designerHost) { + this.designerHost = designerHost; + } + + public Integer getDesignerPort() { + return designerPort; + } + + public void setDesignerPort(Integer designerPort) { + this.designerPort = designerPort; + } + + public String getDesignerPath() { + return designerPath; + } + + public void setDesignerPath(String designerPath) { + this.designerPath = designerPath; + } + + } } diff --git a/sdc-os-chef/environments/Template.json b/sdc-os-chef/environments/Template.json index d184712a4d..d39eba33b6 100644 --- a/sdc-os-chef/environments/Template.json +++ b/sdc-os-chef/environments/Template.json @@ -45,13 +45,19 @@ "dcae_host": "yyy", "dcae_port": "yyy", "dcae_path": "yyy", - "dcae_protocol": "yyy" + "dcae_state_url": "yyy", + "dcae_protocol": "yyy", + "dcae_button_position": ["xxx", "yyy"], + "dcae_tab_presentation": ["xxx", "yyy"] }, "WORKFLOW": { "workflow_host": "yyy", "workflow_port": "yyy", "workflow_path": "yyy", - "workflow_protocol": "yyy" + "workflow_state_url": "yyy", + "workflow_protocol": "yyy", + "workflow_button_position": ["xxx", "yyy"], + "workflow_tab_presentation": ["xxx", "yyy"] } } }, diff --git a/sdc-os-chef/sdc-frontend/chef-repo/cookbooks/sdc-catalog-fe/recipes/FE_2_setup_configuration.rb b/sdc-os-chef/sdc-frontend/chef-repo/cookbooks/sdc-catalog-fe/recipes/FE_2_setup_configuration.rb index 7dcf260d31..0d12e3b589 100644 --- a/sdc-os-chef/sdc-frontend/chef-repo/cookbooks/sdc-catalog-fe/recipes/FE_2_setup_configuration.rb +++ b/sdc-os-chef/sdc-frontend/chef-repo/cookbooks/sdc-catalog-fe/recipes/FE_2_setup_configuration.rb @@ -23,14 +23,20 @@ template "designers-fe-config" do group "jetty" mode "0755" variables({ - :dcae_host => node['Designers']['DCAE']['dcae_host'], - :dcae_port => node['Designers']['DCAE']['dcae_port'], - :dcae_path => node['Designers']['DCAE']['dcae_path'], - :dcae_protocol => node['Designers']['DCAE']['dcae_protocol'], - :workflow_host => node['Designers']['WORKFLOW']['workflow_host'], - :workflow_port => node['Designers']['WORKFLOW']['workflow_port'], - :workflow_path => node['Designers']['WORKFLOW']['workflow_path'], - :workflow_protocol => node['Designers']['WORKFLOW']['workflow_protocol'] + :dcae_host => node['Designers']['DCAE']['dcae_host'], + :dcae_port => node['Designers']['DCAE']['dcae_port'], + :dcae_path => node['Designers']['DCAE']['dcae_path'], + :dcae_state_url => node['Designers']['DCAE']['dcae_state_url'], + :dcae_protocol => node['Designers']['DCAE']['dcae_protocol'], + :dcae_button_location => node['Designers']['DCAE']['dcae_button_location'], + :dcae_tab_presentation => node['Designers']['DCAE']['dcae_tab_presentation'], + :workflow_host => node['Designers']['WORKFLOW']['workflow_host'], + :workflow_port => node['Designers']['WORKFLOW']['workflow_port'], + :workflow_path => node['Designers']['WORKFLOW']['workflow_path'], + :workflow_state_url => node['Designers']['WORKFLOW']['workflow_state_url'], + :workflow_protocol => node['Designers']['WORKFLOW']['workflow_protocol'], + :workflow_button_location => node['Designers']['WORKFLOW']['workflow_button_location'], + :workflow_tab_presentation => node['Designers']['WORKFLOW']['workflow_tab_presentation'] }) end diff --git a/sdc-os-chef/sdc-frontend/chef-repo/cookbooks/sdc-catalog-fe/templates/default/FE-designers-configuration.yaml.erb b/sdc-os-chef/sdc-frontend/chef-repo/cookbooks/sdc-catalog-fe/templates/default/FE-designers-configuration.yaml.erb index b5092728ba..f8a7999704 100644 --- a/sdc-os-chef/sdc-frontend/chef-repo/cookbooks/sdc-catalog-fe/templates/default/FE-designers-configuration.yaml.erb +++ b/sdc-os-chef/sdc-frontend/chef-repo/cookbooks/sdc-catalog-fe/templates/default/FE-designers-configuration.yaml.erb @@ -1,13 +1,17 @@ designersList: - DCAE: - displayName: DCAE - designerHost: <%= @dcae_host %> - designerPort: <%= @dcae_port %> - designerPath: <%= @dcae_path %> - designerProtocol: <%= @dcae_protocol %> - WORKFLOW: - displayName: WORKFLOW - designerHost: <%= @workflow_host %> - designerPort: <%= @workflow_port %> - designerPath: <%= @workflow_path %> - designerProtocol: <%= @workflow_protocol %> \ No newline at end of file + - displayName: DCAE + designerHost: <%= @dcae_host %> + designerPort: <%= @dcae_port %> + designerPath: <%= @dcae_path %> + designerStateUrl: <%= @dcae_state_url %> + designerProtocol: <%= @dcae_protocol %> + designerButtonLocation: <%= @dcae_button_location %> + designerTabPresentation: <%= @dcae_tab_presentation %> + - displayName: WORKFLOW + designerHost: <%= @workflow_host %> + designerPort: <%= @workflow_port %> + designerPath: <%= @workflow_path %> + designerStateUrl: <%= @workflow_state_url %> + designerProtocol: <%= @workflow_protocol %> + designerButtonLocation: <%= @workflow_button_location %> + designerTabPresentation: <%= @workflow_tab_presentation %> \ No newline at end of file -- cgit 1.2.3-korg