Skip to content

Commit 24fb6d4

Browse files
adding placeholders for target service and port combo boxes (#96)
* adding placeholders for target service and port combo boxes * adding busy dialog while fetching service details * eslint warning
1 parent f867869 commit 24fb6d4

File tree

4 files changed

+64
-43
lines changed

4 files changed

+64
-43
lines changed

electron/app/locales/en/webui.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -667,14 +667,19 @@
667667
"ingress-design-ingress-docker-reg-secret-userpwd-help": "The password used to log in to Docker Hub.",
668668
"ingress-design-ingress-docker-reg-secret-useremail": "Docker Hub Email Address",
669669
"ingress-design-ingress-docker-reg-secret-useremail-help": "The email address of the user logging in to Docker Hub.",
670+
"ingress-design-route-get-services-title": "Getting services for namespace {{namespace}}",
670671

671672
"ingress-design-ingress-routes-title": "Ingress Routes Configuration",
672673
"ingress-design-ingress-route-virtualhost-label": "Virtual Host",
673674
"ingress-design-ingress-route-targetservicenamespace-label": "Target Service Namespace",
674675
"ingress-design-ingress-route-targetservicenamespace-help": "The target service namespace value points to the namespace where the domain is running.",
675676
"ingress-design-ingress-route-accesspoint-label": "Access Point",
676677
"ingress-design-ingress-route-targetservice-label": "Target Service",
678+
"ingress-design-ingress-route-targetservice-placeholder": "Select Domain Service",
679+
"ingress-design-ingress-route-targetservice-placeholder-empty": "No Domain Services Available",
677680
"ingress-design-ingress-route-targetport-label": "Target Port",
681+
"ingress-design-ingress-route-targetport-placeholder": "Select Target Service Port",
682+
"ingress-design-ingress-route-targetport-placeholder-empty": "No Target Service Selected",
678683
"ingress-design-ingress-route-path-label": "Path Expression",
679684
"ingress-design-ingress-route-tls-label": "Transport Options",
680685
"ingress-design-ingress-route-tls-help": "Select the transport option for this ingress route",

webui/src/js/viewModels/ingress-design-view-impl.js

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -209,12 +209,11 @@ function(i18n, accUtils, ko, ArrayDataProvider, BufferingDataProvider, project,
209209
window.api.ipc.invoke('show-error-message', title, message);
210210
};
211211

212-
async function getTargetServiceDetails (project) {
213-
212+
async function getTargetServiceDetails(myProject) {
214213
const kubectlExe = k8sHelper.getKubectlExe();
215214
const kubectlOptions = k8sHelper.getKubectlOptions();
216215
const results = await window.api.ipc.invoke('k8s-get-service-details',
217-
kubectlExe, project.k8sDomain.kubernetesNamespace.value, '', kubectlOptions);
216+
kubectlExe, myProject.k8sDomain.kubernetesNamespace.value, '', kubectlOptions);
218217
let serviceLists = {};
219218
if (results.isSuccess) {
220219
for (const item of results.serviceDetails.items) {
@@ -230,37 +229,37 @@ function(i18n, accUtils, ko, ArrayDataProvider, BufferingDataProvider, project,
230229
return Promise.resolve(false);
231230
}
232231
return Promise.resolve( { serviceList: serviceLists});
233-
};
232+
}
234233

235234
this.handleEditRoute = async (event, context) => {
236235
// using context.item.data directly was causing problems
237236
// when project data was reloaded with matching UIDs.
238237
const index = context.item.index;
239238
let route = this.routes.observable()[index];
240-
getTargetServiceDetails(this.project).then( svc => {
241-
const options = {route: route, serviceList: svc.serviceList};
242-
dialogHelper.promptDialog('route-edit-dialog', options)
243-
.then(result => {
244-
245-
// no result indicates operation was cancelled
246-
if (result) {
247-
let changed = false;
248-
project.ingress.ingressRouteKeys.forEach(key => {
249-
if ((key !== 'uid') && result.hasOwnProperty(key)) {
250-
route[key] = result[key];
251-
changed = true;
252-
}
253-
});
254-
255-
if (changed) {
256-
this.routes.observable.replace(route, route);
239+
240+
dialogHelper.openBusyDialog(this.labelMapper('route-get-services-title',
241+
{ namespace: this.project.k8sDomain.kubernetesNamespace.value }));
242+
const targetServiceDetails = await getTargetServiceDetails(this.project);
243+
dialogHelper.closeBusyDialog();
244+
if (targetServiceDetails) {
245+
const options = {route: route, serviceList: targetServiceDetails.serviceList};
246+
dialogHelper.promptDialog('route-edit-dialog', options).then(result => {
247+
// no result indicates operation was cancelled
248+
if (result) {
249+
let changed = false;
250+
project.ingress.ingressRouteKeys.forEach(key => {
251+
if ((key !== 'uid') && result.hasOwnProperty(key)) {
252+
route[key] = result[key];
253+
changed = true;
257254
}
255+
});
256+
257+
if (changed) {
258+
this.routes.observable.replace(route, route);
258259
}
259-
});
260+
}
261+
});
260262
}
261-
);
262-
263-
264263
};
265264

266265
this.handleCancel = () => {

webui/src/js/viewModels/route-edit-dialog.js

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,26 @@
66
'use strict';
77

88
define(['accUtils', 'knockout', 'utils/i18n', 'models/wkt-project', 'utils/view-helper', 'ojs/ojarraydataprovider',
9-
'ojs/ojbufferingdataprovider', 'utils/observable-properties', 'ojs/ojconverter-number', 'ojs/ojinputtext',
10-
'ojs/ojlabel', 'ojs/ojbutton', 'ojs/ojdialog', 'ojs/ojformlayout', 'ojs/ojvalidationgroup', 'ojs/ojselectcombobox'],
11-
function(accUtils, ko, i18n, project, viewHelper, ArrayDataProvider, BufferingDataProvider, props, ojConverterNumber) {
9+
'ojs/ojbufferingdataprovider', 'utils/observable-properties', 'ojs/ojconverter-number', 'utils/wkt-logger',
10+
'ojs/ojinputtext', 'ojs/ojlabel', 'ojs/ojbutton', 'ojs/ojdialog', 'ojs/ojformlayout', 'ojs/ojvalidationgroup',
11+
'ojs/ojselectcombobox'],
12+
function(accUtils, ko, i18n, project, viewHelper, ArrayDataProvider, BufferingDataProvider, props,
13+
ojConverterNumber) {
1214
function RouteEditDialogModel(args) {
1315
const DIALOG_SELECTOR = '#routeEditDialog';
1416

15-
const DEFAULT_ROUTE_PORT = 0;
17+
const DEFAULT_ROUTE_PORT = undefined;
1618

1719
// SIMPLE_PROPERTIES - names matching simple route fields
1820
let EXCLUDE_PROPERTIES = ['uid', 'annotations'];
1921
let SIMPLE_PROPERTIES = project.ingress.ingressRouteKeys.filter(key => !EXCLUDE_PROPERTIES.includes(key));
2022

23+
this.project = project;
24+
this.route = args.route;
25+
this.serviceList = args.serviceList;
26+
2127
this.connected = () => {
2228
accUtils.announce('Route edit dialog loaded.', 'assertive');
23-
2429
// open the dialog after the current thread, which is loading this view model.
2530
// using oj-dialog initial-visibility="show" causes vertical centering issues.
2631
setTimeout(function() {
@@ -36,13 +41,9 @@ function(accUtils, ko, i18n, project, viewHelper, ArrayDataProvider, BufferingDa
3641
return i18n.t(labelId, arg);
3742
};
3843

39-
this.project = project;
40-
this.route = args.route;
41-
this.serviceList = args.serviceList;
42-
4344
this.buildTargetSvcNames = () => {
4445
let options = [];
45-
for(var name in this.serviceList){
46+
for (const name in this.serviceList) {
4647
options.push( { id : name, value: name, text: name});
4748
}
4849
return options;
@@ -52,7 +53,7 @@ function(accUtils, ko, i18n, project, viewHelper, ArrayDataProvider, BufferingDa
5253
let options = [];
5354
if (this.serviceList[svcName]) {
5455
for (const port of this.serviceList[svcName].ports) {
55-
options.push( { id : port.port, value: port.port, text: port.port});
56+
options.push( { id : port.port, value: port.port, text: port.port} );
5657
}
5758
}
5859

@@ -64,7 +65,7 @@ function(accUtils, ko, i18n, project, viewHelper, ArrayDataProvider, BufferingDa
6465
this.targetSvcPorts = ko.observableArray([] );
6566

6667
if (this.route.targetService) {
67-
this.targetSvcPorts = this.buildTargetSvcPorts(this.route.targetService);
68+
this.buildTargetSvcPorts(this.route.targetService).forEach(port => this.targetSvcPorts.push(port));
6869
}
6970

7071
this.savedAnnotations = args.route.annotations || {};
@@ -144,6 +145,24 @@ function(accUtils, ko, i18n, project, viewHelper, ArrayDataProvider, BufferingDa
144145
this[propertyName] = props.createProperty(defaultValue);
145146
});
146147

148+
this.getTargetServicePlaceholder = ko.computed(() => {
149+
if (Array.isArray(this.targetSvcNames) && this.targetSvcNames.length > 0) {
150+
return this.labelMapper('route-targetservice-placeholder');
151+
} else {
152+
return this.labelMapper('route-targetservice-placeholder-empty');
153+
}
154+
});
155+
156+
this.getTargetPortPlaceholder = ko.computed(() => {
157+
console.log('targetSvcPorts is a ' + typeof(this.targetSvcPorts));
158+
const ports = this.targetSvcPorts();
159+
if (Array.isArray(ports) && ports.length > 0) {
160+
return this.labelMapper('route-targetport-placeholder');
161+
} else {
162+
return this.labelMapper('route-targetport-placeholder-empty');
163+
}
164+
});
165+
147166
this.handleAddAnnotation = () => {
148167
const nextIndex = this.nextAnnotationIndex();
149168
const annotation = {uid: getAnnotationUid(nextIndex), key: `annotation-${nextIndex}`};
@@ -186,10 +205,7 @@ function(accUtils, ko, i18n, project, viewHelper, ArrayDataProvider, BufferingDa
186205

187206
this.targetSvcNameChanged = (event) => {
188207
this.targetSvcPorts.removeAll();
189-
const list = this.buildTargetSvcPorts(event.detail.value);
190-
for (const item of list) {
191-
this.targetSvcPorts.push(item);
192-
}
208+
this.buildTargetSvcPorts(event.detail.value).forEach(port => this.targetSvcPorts.push(port));
193209
};
194210

195211
this.okInput = () => {

webui/src/js/views/route-edit-dialog.html

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636

3737
<oj-combobox-one id="targetsvc" value="{{targetService.observable}}"
3838
label-hint="[[labelMapper('route-targetservice-label')]]"
39+
placeholder="{{getTargetServicePlaceholder}}"
3940
help.instruction="[[labelMapper('route-targetservice-help')]]"
4041
validators="[[project.ingress.validators.k8sNameValidator]]"
4142
options="[[targetSvcNames]]"
@@ -44,10 +45,10 @@
4445

4546
<oj-combobox-one id="targetport" value="{{targetPort.observable}}"
4647
label-hint="[[labelMapper('route-targetport-label')]]"
48+
placeholder="{{getTargetPortPlaceholder}}"
4749
validators="[[project.ingress.validators.targetPortValidator]]"
4850
help.instruction="[[labelMapper('route-targetport-help')]]"
49-
options="[[targetServicePorts]]"
50-
>
51+
options="[[targetServicePorts]]">
5152
</oj-combobox-one>
5253

5354
<oj-radioset id="tlsOptionId"

0 commit comments

Comments
 (0)