Use maps for model updates

This commit is contained in:
reusedname 2025-02-21 18:58:14 +05:00
parent 04f8a74cd8
commit f4a13cb080
1 changed files with 28 additions and 39 deletions

View File

@ -43,21 +43,18 @@ function isModelInArray(array, model) {
/** /**
* Synchronizes models from the server with the displayed knockout model table * Synchronizes models from the server with the displayed knockout model table
*/ */
function syncModels(models) { function syncModels(models) {
// remove models from the observable array, which are not in the // remove models from the observable array, which are not in the updated list
// updated list var newModelsMap = new Map(models.map(m => [m.url, m]));
for ( let idx in observableModelsArray()) { observableModelsArray.remove(m => !newModelsMap.get(m.ko_url()));
let model = observableModelsArray()[idx];
if (!isModelInArray(models, model)) { var modelsMap = new Map(observableModelsArray().map(m => [m.ko_url(), m]));
observableModelsArray.remove(model);
} for (let model of models) {
} const m = modelsMap.get(model.url);
// add models to the observable array, which are new in the if (!m) {
// updated list // 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)) {
model.ko_name = ko.observable(model.name); model.ko_name = ko.observable(model.name);
model.ko_url = ko.observable(model.url); model.ko_url = ko.observable(model.url);
model.ko_online = ko.observable(false); model.ko_online = ko.observable(false);
@ -83,32 +80,24 @@ function syncModels(models) {
} }
}); });
observableModelsArray.push(model); observableModelsArray.push(model);
} } else {
} // update existing models
m.ko_name(model.name);
// update existing models m.ko_url(model.url);
for ( let i in models) { let onlineState = false;
let model = models[i]; for ( let i in onlineModels) {
for ( let j in observableModelsArray()) { let onlineModel = onlineModels[i];
let m = observableModelsArray()[j]; if (onlineModel.url === model.url) {
if (model.url === m.ko_url()) { onlineState = true;
m.ko_name(model.name); break;
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());
} }
} }
} }