client/js/models.js
changeset 23 70c8af9b44ec
child 24 121a24be9da4
equal deleted inserted replaced
22:948283342245 23:70c8af9b44ec
       
     1 (function() {
       
     2     
       
     3     var root = this;
       
     4         
       
     5     var Backbone = root.Backbone;
       
     6     
       
     7     var Models = root.Rkns.Models = {};
       
     8     
       
     9     
       
    10     Models.getUID = function(obj) {
       
    11         var guid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
       
    12             var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
       
    13             return v.toString(16);
       
    14         });
       
    15         return obj.type + "-" + guid; 
       
    16     };
       
    17     
       
    18     
       
    19     var RenkanModel = Backbone.RelationalModel.extend({
       
    20         idAttribute : "_id",
       
    21         constructor: function(options) {
       
    22             
       
    23             if (typeof options !== "undefined") {
       
    24                 options._id = options.id || Models.getUID(this);
       
    25                 options.title = options.title || "(untitled " + this.type + ")";
       
    26                 options.description = options.description || "";
       
    27                 options.uri = options.uri || "";
       
    28                 
       
    29                 if(typeof this.prepare === "function") {
       
    30                     options = this.prepare(options);
       
    31                 }
       
    32             }
       
    33             Backbone.RelationalModel.prototype.constructor.call(this, options);
       
    34         },
       
    35         validate: function() {
       
    36             if(!this.type) {
       
    37                 return "object has no type";
       
    38             }
       
    39         },
       
    40         addReference : function(_options, _propName, _list, _id, _default) {
       
    41             var _element = _list.get(_id);
       
    42             if (typeof _element === "undefined" && typeof _default !== "undefined") {
       
    43                 _options[_propName ] = _default;
       
    44             }
       
    45             else {
       
    46                 _options[_propName ] = _element;
       
    47             }
       
    48         }
       
    49     });
       
    50         
       
    51     // USER
       
    52     var User = Models.User = RenkanModel.extend({
       
    53         type: "user",
       
    54         prepare: function(options) {
       
    55             options.color = options.color || "#666666";
       
    56             return options;
       
    57         }    
       
    58     
       
    59     });
       
    60     
       
    61     // NODE
       
    62     var Node = Models.Node = RenkanModel.extend({
       
    63         type: "node",
       
    64         relations: [{
       
    65             type: Backbone.HasOne,
       
    66             key: "created_by",
       
    67             relatedModel: User
       
    68         }],
       
    69         prepare: function(options) {
       
    70             project = options.project;
       
    71             this.addReference(options, "created_by", project.get("users"), options.created_by, project.current_user);
       
    72             options.description = options.description || "";
       
    73             return options;
       
    74         }
       
    75     
       
    76     });
       
    77     
       
    78     // EDGE
       
    79     var Edge = Models.Edge = RenkanModel.extend({
       
    80         type: "edge",
       
    81         relations: [
       
    82           {
       
    83             type: Backbone.HasOne,
       
    84             key: "created_by",
       
    85             relatedModel: User
       
    86           },
       
    87           {
       
    88             type: Backbone.HasOne,
       
    89             key: "from",
       
    90             relatedModel: Node
       
    91           },
       
    92           {
       
    93             type: Backbone.HasOne,
       
    94             key: "to",
       
    95             relatedModel: Node
       
    96           },
       
    97         ],
       
    98         prepare: function(options) {
       
    99             project = options.project;
       
   100             this.addReference(options, "created_by", project.get("users"), options.created_by, project.current_user);
       
   101             this.addReference(options, "from", project.get("nodes"), options.from);
       
   102             this.addReference(options, "to", project.get("nodes"), options.to);
       
   103             return options;
       
   104         }
       
   105     });
       
   106         
       
   107     // PROJECT
       
   108     var Project = Models.Project = RenkanModel.extend({
       
   109         type: "project",
       
   110         relations: [
       
   111           {
       
   112             type: Backbone.HasMany,
       
   113             key: "users",
       
   114             relatedModel: User,
       
   115             reverseRelation: {
       
   116                 key: 'project',
       
   117                 includeInJSON: '_id'
       
   118             },
       
   119           },
       
   120           {
       
   121             type: Backbone.HasMany,
       
   122             key: "nodes",
       
   123             relatedModel: Node,
       
   124             reverseRelation: {
       
   125                 key: 'project',
       
   126                 includeInJSON: '_id'
       
   127             },
       
   128           },
       
   129           {
       
   130             type: Backbone.HasMany,
       
   131             key: "edges",
       
   132             relatedModel: Edge,
       
   133             reverseRelation: {
       
   134                 key: 'project',
       
   135                 includeInJSON: '_id'
       
   136             },
       
   137           }
       
   138         ],
       
   139         addUser: function(_props) {
       
   140             _props.project = this;
       
   141             var _user = new User(_props);
       
   142             this.get("users").push(_user);
       
   143             return _user;
       
   144         },
       
   145         addNode: function(_props) {
       
   146             _props.project = this;
       
   147             var _node = new Node(_props);
       
   148             this.get("nodes").push(_node);
       
   149             return _node;
       
   150         },
       
   151         addEdge: function(_props) {
       
   152             _props.project = this;
       
   153             var _edge = new Edge(_props);
       
   154             this.get("edges").push(_edge);
       
   155             return _edge;
       
   156         },
       
   157         removeNode: function(_model) {
       
   158             this.get("nodes").remove(_model);
       
   159         },
       
   160         removeEdge: function(_model) {
       
   161             this.get("edges").remove(_model);
       
   162         },
       
   163         // Add event handler to remove edges when a node is removed
       
   164         initialize: function() {
       
   165             var _this = this;
       
   166             this.on("remove:nodes", function(_node) {
       
   167                 _this.get("edges").remove(
       
   168                     _this.get("edges").filter(function(_edge) {
       
   169                         return _edge.get("from") == _node || _edge.get("to") == _node;
       
   170                     })
       
   171                 );
       
   172             });
       
   173         }
       
   174     });
       
   175     
       
   176 
       
   177 }).call(window);
       
   178