@@ -3092,18 +3092,69 @@ MM.Backend.Firebase.reset = function() {
3092
3092
/**
3093
3093
* Merge current (remote) data with updated map
3094
3094
*/
3095
- MM . Backend . Firebase . mergeWidth = function ( data , name ) {
3095
+ MM . Backend . Firebase . mergeWith = function ( data , name ) {
3096
3096
if ( name != this . _current . name ) {
3097
3097
this . _current . name = name ;
3098
3098
this . ref . child ( "names/" + this . _current . id ) . set ( name ) ;
3099
3099
}
3100
3100
3101
3101
var dataRef = this . ref . child ( "data/" + this . _current . id ) ;
3102
3102
this . _recursiveRefMerge ( dataRef , this . _current . data , data ) ;
3103
+ this . _current . data = data ;
3103
3104
}
3104
3105
3106
+ /**
3107
+ * @param {Firebase } ref
3108
+ * @param {object } oldData
3109
+ * @param {object } newData
3110
+ */
3105
3111
MM . Backend . Firebase . _recursiveRefMerge = function ( ref , oldData , newData ) {
3106
- /* FIXME */
3112
+ var updateObject = { } ;
3113
+
3114
+ if ( newData instanceof Array ) { /* merge arrays */
3115
+
3116
+ for ( var i = 0 ; i < newData . length ; i ++ ) {
3117
+ var newValue = newData [ i ] ;
3118
+
3119
+ if ( ! ( i in oldData ) ) { /* new key */
3120
+ updateObject [ i ] = newValue ;
3121
+ } else if ( typeof ( newValue ) == "object" ) { /* recurse */
3122
+ this . _recursiveRefMerge ( ref . child ( i ) , oldData [ i ] , newValue ) ;
3123
+ } else if ( newValue !== oldData [ i ] ) { /* changed key */
3124
+ updateObject [ i ] = newValue ;
3125
+ }
3126
+ }
3127
+
3128
+ for ( var i = newData . length ; i < oldData . length ; i ++ ) { updateObject [ i ] = null ; } /* removed array items */
3129
+
3130
+ } else { /* merge objects */
3131
+
3132
+ for ( var p in newData ) { /* new/changed keys */
3133
+ var newValue = newData [ p ] ;
3134
+
3135
+ if ( ! ( p in oldData ) ) { /* new key */
3136
+ updateObject [ p ] = newValue ;
3137
+ } else if ( typeof ( newValue ) == "object" ) { /* recurse */
3138
+ this . _recursiveRefMerge ( ref . child ( p ) , oldData [ p ] , newValue ) ;
3139
+ } else if ( newValue !== oldData [ p ] ) { /* changed key */
3140
+ updateObject [ p ] = newValue ;
3141
+ }
3142
+
3143
+ }
3144
+
3145
+ for ( var p in oldData ) { /* removed keys */
3146
+ if ( ! ( p in newData ) ) { updateObject [ p ] = null ; }
3147
+ }
3148
+
3149
+ }
3150
+
3151
+ if ( Object . keys ( updateObject ) . length ) {
3152
+ console . log ( "Update set for " + ref , updateObject ) ;
3153
+ ref . update ( updateObject ) ;
3154
+ } /* else {
3155
+ console.log("No update needed for " + ref);
3156
+ } */
3157
+
3107
3158
}
3108
3159
3109
3160
MM . Backend . Firebase . _listenStart = function ( data , id ) {
@@ -4211,10 +4262,8 @@ MM.UI.Backend.Firebase.reset = function() {
4211
4262
}
4212
4263
4213
4264
MM . UI . Backend . Firebase . _itemChange = function ( ) {
4214
- console . log ( "updating to firebase" ) ;
4215
-
4216
4265
var map = MM . App . map ;
4217
- // FIXME this._backend.mergeWith(map.toJSON(), map.getName());
4266
+ this . _backend . mergeWith ( map . toJSON ( ) , map . getName ( ) ) ;
4218
4267
}
4219
4268
4220
4269
MM . UI . Backend . Firebase . _action = function ( ) {
0 commit comments