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()); } } }