diff --git a/electron/app/locales/en/webui.json b/electron/app/locales/en/webui.json index acb54dca8..e5a3e095f 100644 --- a/electron/app/locales/en/webui.json +++ b/electron/app/locales/en/webui.json @@ -761,6 +761,7 @@ "ingress-design-ingress-route-targetservicenamespace-label": "Target Service Namespace", "ingress-design-ingress-route-targetservicenamespace-help": "The target service namespace value points to the namespace where the domain is running.", "ingress-design-ingress-route-accesspoint-label": "Access Point", + "ingress-design-ingress-route-target-label": "Target", "ingress-design-ingress-route-targetservice-label": "Target Service", "ingress-design-ingress-route-targetservice-placeholder": "Select Domain Service", "ingress-design-ingress-route-targetservice-placeholder-empty": "No Domain Services Available", diff --git a/webui/src/js/models/vz-application-definition.js b/webui/src/js/models/vz-application-definition.js index 032486a34..d291a6672 100644 --- a/webui/src/js/models/vz-application-definition.js +++ b/webui/src/js/models/vz-application-definition.js @@ -5,8 +5,8 @@ */ 'use strict'; -define(['utils/observable-properties', 'utils/validation-helper', 'knockout', 'utils/wkt-logger'], - function(props, validationHelper, ko) { +define(['utils/observable-properties', 'utils/validation-helper', 'utils/wkt-logger'], + function(props, validationHelper) { return function (name, k8sDomain) { function VerrazzanoApplicationModel() { let componentChanged = false; @@ -30,10 +30,6 @@ define(['utils/observable-properties', 'utils/validation-helper', 'knockout', 'u 'loggingTraitEnabled', 'loggingTraitImage', 'loggingTraitConfiguration' ]; this.components = props.createListProperty(this.componentKeys).persistByKey('name'); - // this is a transient ko observable that is not persisted - this.hosts = ko.observableArray(); - this.generatedHost = ko.observable(); - this.readFrom = (json) => { props.createGroup(name, this).readFrom(json); }; diff --git a/webui/src/js/viewModels/ingress-design-view-impl.js b/webui/src/js/viewModels/ingress-design-view-impl.js index af0fbc97b..29c06c838 100644 --- a/webui/src/js/viewModels/ingress-design-view-impl.js +++ b/webui/src/js/viewModels/ingress-design-view-impl.js @@ -129,15 +129,10 @@ function(i18n, accUtils, ko, ArrayDataProvider, BufferingDataProvider, project, resizable: 'enabled' }, { - headerText: this.labelMapper('ingress-route-targetservice-label'), + headerText: this.labelMapper('ingress-route-target-label'), sortProperty: 'targetService', resizable: 'enabled' }, - { - headerText: this.labelMapper('ingress-route-targetport-label'), - sortProperty: 'targetPort', - resizable: 'enabled' - }, { headerText: this.labelMapper('ingress-route-accesspoint-label'), sortProperty: 'targetServiceNameSpace' @@ -170,6 +165,18 @@ function(i18n, accUtils, ko, ArrayDataProvider, BufferingDataProvider, project, return 'r' + routeIndex; } + // display in the target column, example "host:port" + this.getTargetText = (routeData) => { + let result = routeData.targetService; + if(result) { + const port = routeData.targetPort; + if(port != null) { + result += `:${port}`; + } + } + return result; + }; + this.handleAddRoute = () => { const uids = []; this.routes.observable().forEach(route => { diff --git a/webui/src/js/viewModels/vz-application-design-view.js b/webui/src/js/viewModels/vz-application-design-view.js index d93655603..faaf88693 100644 --- a/webui/src/js/viewModels/vz-application-design-view.js +++ b/webui/src/js/viewModels/vz-application-design-view.js @@ -507,57 +507,50 @@ function (project, accUtils, utils, ko, i18n, BufferingDataProvider, ArrayDataPr return null; } - this.computedUrl = (rowData) => { - return ko.computed(() => { - let urlHost = ''; - const generatedHost = project.vzApplication.generatedHost(); - if(generatedHost && generatedHost.length) { - urlHost = generatedHost; - } + function getUrl(ruleData, generatedHostname) { + let urlHost = ''; + if(generatedHostname && generatedHostname.length) { + urlHost = generatedHostname; + } - const ruleHost = getRuleHost(rowData); - if(ruleHost) { - urlHost = ruleHost; - } + const ruleHost = getRuleHost(ruleData); + if(ruleHost) { + urlHost = ruleHost; + } - let result = 'https://' + urlHost; + let result = 'https://' + urlHost; - let urlPath = ''; - const paths = rowData.paths; - if(paths && paths.length) { - urlPath = paths[0].path; - if(urlPath && urlPath.length) { - result += urlPath; - } + let urlPath = ''; + const paths = ruleData.paths; + if(paths && paths.length) { + urlPath = paths[0].path; + if(urlPath && urlPath.length) { + result += urlPath; } + } - return result; - }); - }; + return result; + } - // resolves to true if the row data can make a clickable link - this.computedCanLink = (rowData) => { - return ko.computed(() => { - const appHosts = project.vzApplication.hosts(); - if(!appHosts.length) { - return false; - } + function isLinkable(ruleData, hostnames) { + if(!hostnames || !hostnames.length) { + return false; + } - const ruleHost = getRuleHost(rowData); - if(ruleHost && !appHosts.includes(ruleHost)) { - return false; - } + const ruleHost = getRuleHost(ruleData); + if(ruleHost && !hostnames.includes(ruleHost)) { + return false; + } - const paths = rowData.paths; - if(!paths || !paths.length) { - return false; - } + const paths = ruleData.paths; + if(!paths || !paths.length) { + return false; + } - return paths[0].pathType !== 'regex'; - }); - }; + return paths[0].pathType !== 'regex'; + } - this.updateUrls = async() => { + this.updateUrls = async(component) => { const busyDialogMessage = this.labelMapper('get-hosts-in-progress'); dialogHelper.openBusyDialog(busyDialogMessage, 'bar', 1 / 2.0); @@ -577,8 +570,16 @@ function (project, accUtils, utils, ko, i18n, BufferingDataProvider, ArrayDataPr return; } - project.vzApplication.hosts(hostsResult.hostnames); - project.vzApplication.generatedHost(hostsResult.generatedHostname); + const observableRules = this.componentObservable(component, 'ingressTraitRules'); + for(const ruleData of observableRules()) { + const canLink = isLinkable(ruleData, hostsResult.hostnames); + const url = getUrl(ruleData, hostsResult.generatedHostname); + + if((ruleData.url !== url) || (ruleData.canLink !== canLink)) { + const newData = {...ruleData, canLink: canLink, url: url }; + observableRules.replace(ruleData, newData); + } + } }; this.componentsIngressTraitRulesDataProvider = (component) => { diff --git a/webui/src/js/views/ingress-design-view.html b/webui/src/js/views/ingress-design-view.html index 194047d8d..b26d05a6f 100644 --- a/webui/src/js/views/ingress-design-view.html +++ b/webui/src/js/views/ingress-design-view.html @@ -203,11 +203,8 @@
- - - - - + + diff --git a/webui/src/js/views/vz-application-design-view.html b/webui/src/js/views/vz-application-design-view.html index 1d4191625..b0c053af0 100644 --- a/webui/src/js/views/vz-application-design-view.html +++ b/webui/src/js/views/vz-application-design-view.html @@ -136,7 +136,8 @@
- + @@ -157,14 +158,14 @@
- - - - + + + + - - + +