server/src/main/webapp/static/js/corenkan.js
changeset 48 01fb9167ad75
parent 47 267d67791e05
child 51 3247fccfbd3f
--- a/server/src/main/webapp/static/js/corenkan.js	Tue Dec 25 21:29:11 2012 +0100
+++ b/server/src/main/webapp/static/js/corenkan.js	Mon Dec 31 12:19:10 2012 +0100
@@ -28,7 +28,10 @@
     
     proto.initCollab = function(id) {    	
     	this.collab = coweb.initCollab({id : id});
-    	this.collab.subscribeSync("project", this, "onRemoteProjectChange");    	
+    	this.collab.subscribeSync("project", this, "onRemoteProjectChange");
+    	this.collab.subscribeSync("user", this, "onRemoteUserChange");
+    	this.collab.subscribeSync("node", this, "onRemoteNodeChange");
+    	this.collab.subscribeSync("edge", this, "onRemoteEdgeChange");
     };
     
     function prepareValues(obj,c) {
@@ -70,7 +73,7 @@
     
     proto.updateObjectBind = function(type, obj, options) {
 		console.log("change " + type,obj, options);
-		if(obj.hasChanged()) {
+		if(typeof obj != "undefined" && obj.hasChanged()) {
 			var values = {
 			    id: obj.id,
 	    	    _type: type,
@@ -176,9 +179,9 @@
         if (args.type === "insert") {
             this.onRemoteObjectInsert(field, args.value, args.position);
         } else if (args.type === "update") {
-            this.onRemoteNodeUpdate(field, args.value, args.position);
+            this.onRemoteObjectUpdate(field, args.value, args.position);
         } else if (args.type === "delete") {
-            this.onRemoteNodeDelete(field, args.position);
+            this.onRemoteObjectDelete(field, args.position);
         }
     };
 
@@ -207,7 +210,7 @@
      * local methods for insert, update, delete handling.
      * @param args Cooperative web event
      */
-    proto.onRemoteUserChange = function(args) {    	
+    proto.onRemoteEdgeChange = function(args) {    	
     	this.onRemoteObjectChange("edges", args);
     };
 
@@ -244,6 +247,8 @@
      */
     proto.onRemoteObjectInsert = function(field, values, position) {
     	
+    	console.log("Remote "+ field +" insert values ", values, "position", position);
+    	
     	var coll = this.project.get(field);    	
     	var object_id = values['id'];    	
     	
@@ -253,7 +258,23 @@
     		this.onRemoteObjectUpdate(field, values, coll.indexOf(obj));
     	}
     	else {
-    		this.project.get(field).add(values, {at:position});
+    		var add_values = {};
+    		for(var fieldname in values) {
+    			if(fieldname == "_id" || fieldname[0] !== '_' ) {
+    				add_values[fieldname] = values[fieldname];
+    			}
+    		}
+    		switch(field) {
+    		case "nodes":
+    			this.project.addNode(add_values, {at:position});
+    			break;
+    		case "edges":
+    			this.project.addEdge(add_values, {at:position});
+    			break;
+    		case "users":
+    			this.project.addUser(add_values, {at:position});
+    			break;
+    		}
     	}
     	
     };
@@ -269,17 +290,20 @@
      */
     proto.onRemoteObjectUpdate = function(field, values, position) {
 
+    	console.log("Remote "+ field +" update values ", values, "position", position);
+    	
     	var object_id = values['id'];
     	
     	if(this.project != null) {
-    		for(var obj in this.project.get(field)) {
-    			if(obj.id == object_id) {
-    	    		for(var fieldname in values) {
-    	    			if(fieldname != "id" && fieldname != "type") {
-    	    				obj.set(fieldname, values[fieldname]);
-    	    			}
-    	    		}
-    			}
+    		var obj = this.project.get(field).get(object_id);
+    		if(obj != null) {
+    			var changed_val = {};
+	    		for(var fieldname in values) {
+	    			if(fieldname != "id" && fieldname != "type") {
+	    				changed_val[fieldname] = values[fieldname];
+	    			}
+	    		}
+	    		obj.set(changed_val);
     		}
     	}
     };
@@ -290,6 +314,7 @@
      * @param position Which item to update.
      */
     proto.onRemoteObjectDelete = function(field, position) {
+    	console.log("Remote "+ field +" delete position", position);
     	this.project.get(field).remove(this.project.get(field).at(position));
     };