').appendTo(outer);
+ // entry.body = body;
+ // if (entry.path) {
+ // entry.removeButton = $('
')
+ // // .hide()
+ // .appendTo(header)
+ // .click(function(e) {
+ // entry.removed = true;
+ // body.fadeOut(100);
+ // entry.header.css("text-decoration","line-through")
+ // entry.header.css("font-style","italic")
+ // if (entry.copyToClipboard) {
+ // entry.copyToClipboard.hide();
+ // }
+ // $(this).hide();
+ // });
+ // if (entry.data) {
+ // entry.copyToClipboard = $('
')
+ // // .hide()
+ // .appendTo(header)
+ // .click(function(e) {
+ // var textarea = document.createElement("textarea");
+ // textarea.style.position = 'fixed';
+ // textarea.style.top = 0;
+ // textarea.style.left = 0;
+ // textarea.style.width = '2em';
+ // textarea.style.height = '2em';
+ // textarea.style.padding = 0;
+ // textarea.style.border = 'none';
+ // textarea.style.outline = 'none';
+ // textarea.style.boxShadow = 'none';
+ // textarea.style.background = 'transparent';
+ // textarea.value = entry.data;
+ // document.body.appendChild(textarea);
+ // textarea.select();
+ // try {
+ // var ret = document.execCommand('copy');
+ // var msg = ret ? 'successful' : 'unsuccessful';
+ // console.log('Copy text command was ' + msg);
+ // } catch (err) {
+ // console.log('Oops unable to copy');
+ // }
+ // document.body.removeChild(textarea);
+ // });
+ // }
+ // }
+ // }
+ // });
+
+ // var remoteListAddButton = row.find(".red-ui-editableList-addButton").hide();
+ }
+
+ function createSettingsPane(activeProject) {
+ var pane = $('
');
+ createRemoteRepositorySection(pane);
+ return pane;
+ }
+
+ var utils;
+ function init(_utils) {
+ utils = _utils;
+ RED.userSettings.add({
+ id:'gitconfig',
+ title: "Git config", // TODO: nls
+ get: createSettingsPane,
+ close: function() {
+ var currentGitSettings = RED.settings.get('git') || {};
+ currentGitSettings.user = currentGitSettings.user || {};
+ currentGitSettings.user.name = gitUsernameInput.val();
+ currentGitSettings.user.email = gitEmailInput.val();
+ RED.settings.set('git', currentGitSettings);
}
+ });
- utils.sendRequest({
- url: "settings/user",
- type: "GET",
- responses: {
- 0: function(error) {
- console.log(error);
- },
- 200: function(result) {
- console.log(result);
- if ( result && result.git && result.git.user ) {
- var username = result.git.user.name || "";
- var email = result.git.user.email || "";
- gitUsernameLabel.text(username);
- gitUsernameInput.val(username);
- gitEmailLabel.text(email);
- gitEmailInput.val(email);
- }
- },
- 400: {
- 'unexpected_error': function(error) {
- console.log(error);
- }
- }
- }
- })
+ }
- updateForm();
- }
-
- function createSettingsPane(activeProject) {
- var pane = $('
');
- createRemoteRepositorySection(pane);
- return pane;
- }
-
- var popover;
-
- var utils;
- function init(_utils) {
- utils = _utils;
- RED.userSettings.add({
- id:'gitconfig',
- title: "Git config", // TODO: nls
- get: createSettingsPane,
- close: function() {
- if (popover) {
- popover.close();
- popover = null;
- }
- }
- });
-
- }
-
- return {
- init: init,
- };
- })();
-
\ No newline at end of file
+ return {
+ init: init,
+ };
+})();
diff --git a/editor/js/ui/userSettings.js b/editor/js/ui/userSettings.js
index e7c5cb395..594129f87 100644
--- a/editor/js/ui/userSettings.js
+++ b/editor/js/ui/userSettings.js
@@ -127,10 +127,13 @@ RED.userSettings = (function() {
var pane = $('
');
+ var currentEditorSettings = RED.settings.get('editor') || {};
+ currentEditorSettings.view = currentEditorSettings.view || {};
+
viewSettings.forEach(function(section) {
$('
').text(RED._(section.title)).appendTo(pane);
section.options.forEach(function(opt) {
- var initialState = RED.settings.get(opt.setting);
+ var initialState = currentEditorSettings.view[opt.setting];
var row = $('
').appendTo(pane);
var input;
if (opt.toggle) {
@@ -147,7 +150,10 @@ RED.userSettings = (function() {
function setSelected(id, value) {
var opt = allSettings[id];
- RED.settings.set(opt.setting,value);
+ var currentEditorSettings = RED.settings.get('editor') || {};
+ currentEditorSettings.view = currentEditorSettings.view || {};
+ currentEditorSettings.view[opt.setting] = value;
+ RED.settings.set('editor', currentEditorSettings);
var callback = opt.onchange;
if (typeof callback === 'string') {
callback = RED.actions.get(callback);
@@ -158,8 +164,9 @@ RED.userSettings = (function() {
}
function toggle(id) {
var opt = allSettings[id];
- var state = RED.settings.get(opt.setting);
- setSelected(id,!state);
+ var currentEditorSettings = RED.settings.get('editor') || {};
+ currentEditorSettings.view = currentEditorSettings.view || {};
+ setSelected(id,!currentEditorSettings.view[opt.setting]);
}
@@ -185,21 +192,26 @@ RED.userSettings = (function() {
}
})
+ var currentEditorSettings = RED.settings.get('editor') || {};
+ currentEditorSettings.view = currentEditorSettings.view || {};
+ var editorSettingsChanged = false;
viewSettings.forEach(function(section) {
section.options.forEach(function(opt) {
if (opt.oldSetting) {
var oldValue = RED.settings.get(opt.oldSetting);
if (oldValue !== undefined && oldValue !== null) {
- RED.settings.set(opt.setting,oldValue);
+ currentEditorSettings.view[opt.setting] = oldValue;
+ editorSettingsChanged = true;
RED.settings.remove(opt.oldSetting);
}
}
allSettings[opt.setting] = opt;
if (opt.onchange) {
- var value = RED.settings.get(opt.setting);
+ var value = currentEditorSettings.view[opt.setting];
if ((value === null || value === undefined) && opt.hasOwnProperty('default')) {
value = opt.default;
- RED.settings.set(opt.setting,value);
+ currentEditorSettings.view[opt.setting] = value;
+ editorSettingsChanged = true;
}
var callback = opt.onchange;
@@ -212,6 +224,9 @@ RED.userSettings = (function() {
}
});
});
+ if (editorSettingsChanged) {
+ RED.settings.set('editor',currentEditorSettings);
+ }
}
return {
diff --git a/red/api/editor/settings.js b/red/api/editor/settings.js
index d4675902c..1408ec401 100644
--- a/red/api/editor/settings.js
+++ b/red/api/editor/settings.js
@@ -68,7 +68,9 @@ module.exports = {
} else {
username = req.user.username;
}
- settings.setUserSettings(username, req.body).then(function() {
+ var currentSettings = settings.getUserSettings(username)||{};
+ currentSettings = extend(currentSettings, req.body);
+ settings.setUserSettings(username, currentSettings).then(function() {
log.audit({event: "settings.update",username:username},req);
res.status(204).end();
}).otherwise(function(err) {
@@ -77,3 +79,27 @@ module.exports = {
});
}
}
+
+function extend(target, source) {
+ var keys = Object.keys(source);
+ var i = keys.length;
+ while(i--) {
+ var value = source[keys[i]]
+ var type = typeof value;
+ if (type === 'string' || type === 'number' || type === 'boolean' || Array.isArray(value)) {
+ target[keys[i]] = value;
+ } else if (value === null) {
+ if (target.hasOwnProperty(keys[i])) {
+ delete target[keys[i]];
+ }
+ } else {
+ // Object
+ if (target.hasOwnProperty(keys[i])) {
+ target[keys[i]] = extend(target[keys[i]],value);
+ } else {
+ target[keys[i]] = value;
+ }
+ }
+ }
+ return target;
+}
diff --git a/red/runtime/settings.js b/red/runtime/settings.js
index 93fe86cdd..ba913ea31 100644
--- a/red/runtime/settings.js
+++ b/red/runtime/settings.js
@@ -165,17 +165,18 @@ var persistentSettings = {
});
},
getUserSettings: function(username) {
- console.log(username);
- return userSettings[username];
+ return clone(userSettings[username]);
},
setUserSettings: function(username,settings) {
var current = userSettings[username];
userSettings[username] = settings;
try {
assert.deepEqual(current,settings);
+ console.log("skip the save");
return when.resolve();
} catch(err) {
globalSettings.users = userSettings;
+ console.log("saving");
return storage.saveSettings(globalSettings);
}
}
diff --git a/red/runtime/storage/localfilesystem/projects/Project.js b/red/runtime/storage/localfilesystem/projects/Project.js
index 863d27ad2..4143ed0cb 100644
--- a/red/runtime/storage/localfilesystem/projects/Project.js
+++ b/red/runtime/storage/localfilesystem/projects/Project.js
@@ -53,7 +53,6 @@ Project.prototype.load = function () {
this.credentialSecret = projectSettings.credentialSecret;
this.git = projectSettings.git || { user:{} };
-console.log("LOADED",this.git);
// this.paths.flowFile = fspath.join(this.path,"flow.json");
// this.paths.credentialsFile = fspath.join(this.path,"flow_cred.json");