diff --git a/server/src/main/resources/html/static/models.js b/server/src/main/resources/html/static/models.js
index 4534b531..50e08cf3 100644
--- a/server/src/main/resources/html/static/models.js
+++ b/server/src/main/resources/html/static/models.js
@@ -43,21 +43,18 @@ function isModelInArray(array, model) {
/**
* Synchronizes models from the server with the displayed knockout model table
*/
-function syncModels(models) {
- // remove models from the observable array, which are not in the
- // updated list
- for ( let idx in observableModelsArray()) {
- let model = observableModelsArray()[idx];
- if (!isModelInArray(models, model)) {
- observableModelsArray.remove(model);
- }
- }
-
- // add models to the observable array, which are new in the
- // updated list
- for ( let idx in models) {
- let model = models[idx];
- if (!isModelInArray(observableModelsArray(), model)) {
+function syncModels(models) {
+ // remove models from the observable array, which are not in the updated list
+ var newModelsMap = new Map(models.map(m => [m.url, m]));
+ observableModelsArray.remove(m => !newModelsMap.get(m.ko_url()));
+
+ var modelsMap = new Map(observableModelsArray().map(m => [m.ko_url(), m]));
+
+ for (let model of models) {
+ const m = modelsMap.get(model.url);
+
+ if (!m) {
+ // add models to the observable array, which are new in the updated list
model.ko_name = ko.observable(model.name);
model.ko_url = ko.observable(model.url);
model.ko_online = ko.observable(false);
@@ -83,32 +80,24 @@ function syncModels(models) {
}
});
observableModelsArray.push(model);
- }
- }
-
- // update existing models
- for ( let i in models) {
- let model = models[i];
- for ( let j in observableModelsArray()) {
- let m = observableModelsArray()[j];
- if (model.url === m.ko_url()) {
- m.ko_name(model.name);
- m.ko_url(model.url);
- let onlineState = false;
- for ( let i in onlineModels) {
- let onlineModel = onlineModels[i];
- if (onlineModel.url === model.url) {
- onlineState = true;
- break;
- }
+ } else {
+ // update existing models
+ m.ko_name(model.name);
+ m.ko_url(model.url);
+ let onlineState = false;
+ for ( let i in onlineModels) {
+ let onlineModel = onlineModels[i];
+ if (onlineModel.url === model.url) {
+ onlineState = true;
+ break;
}
- m.ko_online(onlineState);
- //m.ko_recording_class( (model.online && !model.suspended) ? 'fa fa-circle red' : '');
- m.swallowEvents = true;
- m.ko_suspended(model.suspended);
- m.swallowEvents = false;
- m.ko_recording(m.ko_online() && !m.ko_suspended());
}
+ m.ko_online(onlineState);
+ //m.ko_recording_class( (model.online && !model.suspended) ? 'fa fa-circle red' : '');
+ m.swallowEvents = true;
+ m.ko_suspended(model.suspended);
+ m.swallowEvents = false;
+ m.ko_recording(m.ko_online() && !m.ko_suspended());
}
}
}