diff -r 948283342245 -r 70c8af9b44ec client/js/models.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/js/models.js Tue Aug 21 12:46:11 2012 +0200 @@ -0,0 +1,178 @@ +(function() { + + var root = this; + + var Backbone = root.Backbone; + + var Models = root.Rkns.Models = {}; + + + Models.getUID = function(obj) { + var guid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); + return v.toString(16); + }); + return obj.type + "-" + guid; + }; + + + var RenkanModel = Backbone.RelationalModel.extend({ + idAttribute : "_id", + constructor: function(options) { + + if (typeof options !== "undefined") { + options._id = options.id || Models.getUID(this); + options.title = options.title || "(untitled " + this.type + ")"; + options.description = options.description || ""; + options.uri = options.uri || ""; + + if(typeof this.prepare === "function") { + options = this.prepare(options); + } + } + Backbone.RelationalModel.prototype.constructor.call(this, options); + }, + validate: function() { + if(!this.type) { + return "object has no type"; + } + }, + addReference : function(_options, _propName, _list, _id, _default) { + var _element = _list.get(_id); + if (typeof _element === "undefined" && typeof _default !== "undefined") { + _options[_propName ] = _default; + } + else { + _options[_propName ] = _element; + } + } + }); + + // USER + var User = Models.User = RenkanModel.extend({ + type: "user", + prepare: function(options) { + options.color = options.color || "#666666"; + return options; + } + + }); + + // NODE + var Node = Models.Node = RenkanModel.extend({ + type: "node", + relations: [{ + type: Backbone.HasOne, + key: "created_by", + relatedModel: User + }], + prepare: function(options) { + project = options.project; + this.addReference(options, "created_by", project.get("users"), options.created_by, project.current_user); + options.description = options.description || ""; + return options; + } + + }); + + // EDGE + var Edge = Models.Edge = RenkanModel.extend({ + type: "edge", + relations: [ + { + type: Backbone.HasOne, + key: "created_by", + relatedModel: User + }, + { + type: Backbone.HasOne, + key: "from", + relatedModel: Node + }, + { + type: Backbone.HasOne, + key: "to", + relatedModel: Node + }, + ], + prepare: function(options) { + project = options.project; + this.addReference(options, "created_by", project.get("users"), options.created_by, project.current_user); + this.addReference(options, "from", project.get("nodes"), options.from); + this.addReference(options, "to", project.get("nodes"), options.to); + return options; + } + }); + + // PROJECT + var Project = Models.Project = RenkanModel.extend({ + type: "project", + relations: [ + { + type: Backbone.HasMany, + key: "users", + relatedModel: User, + reverseRelation: { + key: 'project', + includeInJSON: '_id' + }, + }, + { + type: Backbone.HasMany, + key: "nodes", + relatedModel: Node, + reverseRelation: { + key: 'project', + includeInJSON: '_id' + }, + }, + { + type: Backbone.HasMany, + key: "edges", + relatedModel: Edge, + reverseRelation: { + key: 'project', + includeInJSON: '_id' + }, + } + ], + addUser: function(_props) { + _props.project = this; + var _user = new User(_props); + this.get("users").push(_user); + return _user; + }, + addNode: function(_props) { + _props.project = this; + var _node = new Node(_props); + this.get("nodes").push(_node); + return _node; + }, + addEdge: function(_props) { + _props.project = this; + var _edge = new Edge(_props); + this.get("edges").push(_edge); + return _edge; + }, + removeNode: function(_model) { + this.get("nodes").remove(_model); + }, + removeEdge: function(_model) { + this.get("edges").remove(_model); + }, + // Add event handler to remove edges when a node is removed + initialize: function() { + var _this = this; + this.on("remove:nodes", function(_node) { + _this.get("edges").remove( + _this.get("edges").filter(function(_edge) { + return _edge.get("from") == _node || _edge.get("to") == _node; + }) + ); + }); + } + }); + + +}).call(window); +