From 88eb124a359969ec4a9b4eafa98220ce217dcbd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Fri, 24 Jul 2015 14:27:02 +0200 Subject: [PATCH] Improved settings dialog behaviour * Show when settings are saving * Show when settings are being retrieved * Disable Send/Cancel buttons while settings are saving * Prevent concurrent retrieval --- .../static/js/app/viewmodels/settings.js | 51 +++++++++++++++++-- .../templates/dialogs/settings.jinja2 | 4 +- 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/src/octoprint/static/js/app/viewmodels/settings.js b/src/octoprint/static/js/app/viewmodels/settings.js index 9b33f313..1c5a42c4 100644 --- a/src/octoprint/static/js/app/viewmodels/settings.js +++ b/src/octoprint/static/js/app/viewmodels/settings.js @@ -6,6 +6,10 @@ $(function() { self.users = parameters[1]; self.printerProfiles = parameters[2]; + self.receiving = ko.observable(false); + self.sending = ko.observable(false); + self.callbacks = []; + self.api_enabled = ko.observable(undefined); self.api_key = ko.observable(undefined); self.api_allowCrossOrigin = ko.observable(undefined); @@ -261,13 +265,37 @@ $(function() { }; self.requestData = function(callback) { + if (self.receiving()) { + if (callback) { + self.callbacks.push(callback); + } + return; + } + + self.receiving(true); $.ajax({ url: API_BASEURL + "settings", type: "GET", dataType: "json", success: function(response) { - self.fromResponse(response); - if (callback) callback(); + var callbacks = self.callbacks; + self.callbacks = []; + + if (callback) { + callbacks.push(callback); + } + + try { + self.fromResponse(response); + _.each(callbacks, function(cb) { + cb(); + }); + } finally { + self.receiving(false); + } + }, + error: function(xhr) { + self.receiving(false); } }); }; @@ -429,6 +457,8 @@ $(function() { self.settingsDialog.trigger("beforeSave"); if (data == undefined) { + // we only set sending to true when we didn't include data + self.sending(true); data = ko.mapping.toJS(self.settings); data = _.extend(data, { @@ -525,11 +555,24 @@ $(function() { contentType: "application/json; charset=UTF-8", data: JSON.stringify(data), success: function(response) { - self.fromResponse(response); - if (successCallback) successCallback(response); + self.receiving(true); + self.sending(false); + try { + self.fromResponse(response); + if (successCallback) successCallback(response); + } finally { + self.receiving(false); + } + }, + error: function(xhr) { + self.sending(false); } }); }; + + self.onEventSettingsUpdated = function() { + self.requestData(); + }; } OCTOPRINT_VIEWMODELS.push([ diff --git a/src/octoprint/templates/dialogs/settings.jinja2 b/src/octoprint/templates/dialogs/settings.jinja2 index aa27a626..f3d3f708 100644 --- a/src/octoprint/templates/dialogs/settings.jinja2 +++ b/src/octoprint/templates/dialogs/settings.jinja2 @@ -1,7 +1,7 @@