From 9e04379d9cdb68b790818259fdaa41e2fbf22411 Mon Sep 17 00:00:00 2001 From: Georg Fischer Date: Wed, 13 Jan 2016 17:09:54 +0100 Subject: [PATCH] update settings object merging --- scripts/models/settingsmodel.js | 27 +++++++++++++++++---------- scripts/util/object.js | 32 +++++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 11 deletions(-) diff --git a/scripts/models/settingsmodel.js b/scripts/models/settingsmodel.js index 0c91c12..91fdf36 100644 --- a/scripts/models/settingsmodel.js +++ b/scripts/models/settingsmodel.js @@ -70,6 +70,8 @@ define( function save ( newSettings ) { if ( useLocalForage ) { + newSettings = getValidSettings( newSettings ); + if ( worker ) { sendMessageToWorker( 'save', newSettings ); } elseĀ { @@ -142,24 +144,29 @@ define( if ( newSettings ) { settings = newSettings || defaultSettings; - if ( settings !== defaultSettings ) { - for ( var name in defaultSettings ) { - if ( ! settings[name] ) { - settings[name] = defaultSettings[name]; - } + if ( objectHelper.isEqual( getValidSettings( settings ), settings ) ) { + for ( var name in settings ) { + publishers.update.dispatch( name, settings[name].value, settings[name].options ); } + } else { + save( getValidSettings( settings ) ); } - - for ( var name in settings ) { - publishers.update.dispatch( name, settings[name].value, settings[name].options ); - } - } elseĀ { settings = defaultSettings; save( settings ); } } + function getValidSettings ( settings ) { + if ( settings&& defaultSettings && settings !== defaultSettings ) { + settings = objectHelper.merge( settings, defaultSettings ); + } + + return settings; + } + + + self.getSetting = getSetting; self.getSettingValue = getSettingValue; self.getSettings = getSettings; diff --git a/scripts/util/object.js b/scripts/util/object.js index 8e0572b..5401992 100644 --- a/scripts/util/object.js +++ b/scripts/util/object.js @@ -27,9 +27,39 @@ define( return JSON.parse( JSON.stringify( obj ) ); } + function isEqual ( obj1, obj2 ) { + return JSON.stringify( obj1 ) === JSON.stringify( obj2 ); + } + + // http://stackoverflow.com/a/383245/229189 + // add missing properties from obj2 + function merge ( obj1, obj2 ) { + obj1 = getCopy( obj1 ); + obj2 = getCopy( obj2 ); + + for ( var p in obj2 ) { + try { + // Property in destination object set; update its value. + if ( typeof obj2[p] === 'object' ) { + obj1[p] = merge( obj1[p], obj2[p] ); + } else { + if ( typeof obj1[p] === 'undefined' && typeof obj2[p] !== 'undefined' ) { + obj1[p] = obj2[p]; + } + } + } catch ( e ) { + obj1[p] = obj2[p]; + } + } + + return obj1; + } + return { getObjectByString: getObjectByString, - getCopy: getCopy + getCopy: getCopy, + merge: merge, + isEqual: isEqual }; } ); \ No newline at end of file