|
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 |