spine-rails 0.0.9 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +3 -3
- data/README.md +21 -21
- data/app/assets/javascripts/spine.js +279 -222
- data/app/assets/javascripts/spine/ajax.js +152 -94
- data/app/assets/javascripts/spine/list.js +29 -21
- data/app/assets/javascripts/spine/local.js +5 -3
- data/app/assets/javascripts/spine/manager.js +62 -38
- data/app/assets/javascripts/spine/relation.js +102 -85
- data/app/assets/javascripts/spine/route.js +73 -60
- data/app/assets/javascripts/spine/tabs.js +31 -23
- data/app/assets/javascripts/spine/tmpl.js +6 -1
- data/lib/generators/spine/scaffold/templates/controller.coffee.erb +2 -2
- data/lib/generators/spine/scaffold/templates/new.jst.erb +1 -1
- data/lib/spine/rails/version.rb +2 -2
- metadata +34 -65
@@ -1,7 +1,7 @@
|
|
1
1
|
(function() {
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
|
3
|
+
if (typeof Spine === "undefined" || Spine === null) Spine = require('spine');
|
4
|
+
|
5
5
|
Spine.Model.Local = {
|
6
6
|
extended: function() {
|
7
7
|
this.change(this.saveLocal);
|
@@ -20,7 +20,9 @@
|
|
20
20
|
});
|
21
21
|
}
|
22
22
|
};
|
23
|
+
|
23
24
|
if (typeof module !== "undefined" && module !== null) {
|
24
25
|
module.exports = Spine.Model.Local;
|
25
26
|
}
|
27
|
+
|
26
28
|
}).call(this);
|
@@ -1,25 +1,25 @@
|
|
1
1
|
(function() {
|
2
|
-
var
|
3
|
-
|
4
|
-
for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
return child;
|
10
|
-
}, __slice = Array.prototype.slice, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
|
11
|
-
if (typeof Spine === "undefined" || Spine === null) {
|
12
|
-
Spine = require('spine');
|
13
|
-
}
|
2
|
+
var $,
|
3
|
+
__hasProp = Object.prototype.hasOwnProperty,
|
4
|
+
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; },
|
5
|
+
__slice = Array.prototype.slice;
|
6
|
+
|
7
|
+
if (typeof Spine === "undefined" || Spine === null) Spine = require('spine');
|
8
|
+
|
14
9
|
$ = Spine.$;
|
15
|
-
|
16
|
-
|
10
|
+
|
11
|
+
Spine.Manager = (function(_super) {
|
12
|
+
|
13
|
+
__extends(Manager, _super);
|
14
|
+
|
17
15
|
Manager.include(Spine.Events);
|
16
|
+
|
18
17
|
function Manager() {
|
19
18
|
this.controllers = [];
|
20
19
|
this.bind('change', this.change);
|
21
20
|
this.add.apply(this, arguments);
|
22
21
|
}
|
22
|
+
|
23
23
|
Manager.prototype.add = function() {
|
24
24
|
var cont, controllers, _i, _len, _results;
|
25
25
|
controllers = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
|
@@ -30,20 +30,24 @@
|
|
30
30
|
}
|
31
31
|
return _results;
|
32
32
|
};
|
33
|
+
|
33
34
|
Manager.prototype.addOne = function(controller) {
|
34
|
-
|
35
|
+
var _this = this;
|
36
|
+
controller.bind('active', function() {
|
35
37
|
var args;
|
36
38
|
args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
|
37
|
-
return
|
38
|
-
}
|
39
|
-
controller.bind('release',
|
40
|
-
return
|
41
|
-
}
|
39
|
+
return _this.trigger.apply(_this, ['change', controller].concat(__slice.call(args)));
|
40
|
+
});
|
41
|
+
controller.bind('release', function() {
|
42
|
+
return _this.controllers.splice(_this.controllers.indexOf(controller), 1);
|
43
|
+
});
|
42
44
|
return this.controllers.push(controller);
|
43
45
|
};
|
46
|
+
|
44
47
|
Manager.prototype.deactivate = function() {
|
45
48
|
return this.trigger.apply(this, ['change', false].concat(__slice.call(arguments)));
|
46
49
|
};
|
50
|
+
|
47
51
|
Manager.prototype.change = function() {
|
48
52
|
var args, cont, current, _i, _len, _ref, _results;
|
49
53
|
current = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
|
@@ -51,12 +55,19 @@
|
|
51
55
|
_results = [];
|
52
56
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
53
57
|
cont = _ref[_i];
|
54
|
-
|
58
|
+
if (cont === current) {
|
59
|
+
_results.push(cont.activate.apply(cont, args));
|
60
|
+
} else {
|
61
|
+
_results.push(cont.deactivate.apply(cont, args));
|
62
|
+
}
|
55
63
|
}
|
56
64
|
return _results;
|
57
65
|
};
|
66
|
+
|
58
67
|
return Manager;
|
59
|
-
|
68
|
+
|
69
|
+
})(Spine.Module);
|
70
|
+
|
60
71
|
Spine.Controller.include({
|
61
72
|
active: function() {
|
62
73
|
var args;
|
@@ -81,15 +92,27 @@
|
|
81
92
|
return this;
|
82
93
|
}
|
83
94
|
});
|
84
|
-
|
85
|
-
|
95
|
+
|
96
|
+
Spine.Stack = (function(_super) {
|
97
|
+
|
98
|
+
__extends(Stack, _super);
|
99
|
+
|
86
100
|
Stack.prototype.controllers = {};
|
101
|
+
|
87
102
|
Stack.prototype.routes = {};
|
103
|
+
|
88
104
|
Stack.prototype.className = 'spine stack';
|
105
|
+
|
89
106
|
function Stack() {
|
90
|
-
var key, value, _fn, _ref, _ref2
|
107
|
+
var key, value, _fn, _ref, _ref2,
|
108
|
+
_this = this;
|
91
109
|
Stack.__super__.constructor.apply(this, arguments);
|
92
110
|
this.manager = new Spine.Manager;
|
111
|
+
this.manager.bind('change', function() {
|
112
|
+
var args, controller;
|
113
|
+
controller = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
|
114
|
+
if (controller) return _this.active.apply(_this, args);
|
115
|
+
});
|
93
116
|
_ref = this.controllers;
|
94
117
|
for (key in _ref) {
|
95
118
|
value = _ref[key];
|
@@ -99,32 +122,33 @@
|
|
99
122
|
this.add(this[key]);
|
100
123
|
}
|
101
124
|
_ref2 = this.routes;
|
102
|
-
_fn =
|
125
|
+
_fn = function(key, value) {
|
103
126
|
var callback;
|
104
|
-
if (typeof value === 'function')
|
105
|
-
|
106
|
-
}
|
107
|
-
callback || (callback = __bind(function() {
|
127
|
+
if (typeof value === 'function') callback = value;
|
128
|
+
callback || (callback = function() {
|
108
129
|
var _ref3;
|
109
|
-
return (_ref3 =
|
110
|
-
}
|
111
|
-
return
|
112
|
-
}
|
130
|
+
return (_ref3 = _this[value]).active.apply(_ref3, arguments);
|
131
|
+
});
|
132
|
+
return _this.route(key, callback);
|
133
|
+
};
|
113
134
|
for (key in _ref2) {
|
114
135
|
value = _ref2[key];
|
115
136
|
_fn(key, value);
|
116
137
|
}
|
117
|
-
if (this["default"])
|
118
|
-
this[this["default"]].active();
|
119
|
-
}
|
138
|
+
if (this["default"]) this[this["default"]].active();
|
120
139
|
}
|
140
|
+
|
121
141
|
Stack.prototype.add = function(controller) {
|
122
142
|
this.manager.add(controller);
|
123
143
|
return this.append(controller);
|
124
144
|
};
|
145
|
+
|
125
146
|
return Stack;
|
126
|
-
|
147
|
+
|
148
|
+
})(Spine.Controller);
|
149
|
+
|
127
150
|
if (typeof module !== "undefined" && module !== null) {
|
128
151
|
module.exports = Spine.Manager;
|
129
152
|
}
|
153
|
+
|
130
154
|
}).call(this);
|
@@ -1,145 +1,175 @@
|
|
1
1
|
(function() {
|
2
|
-
var Collection, Instance, Singleton, singularize, underscore
|
3
|
-
|
4
|
-
for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
}, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
|
11
|
-
if (typeof Spine === "undefined" || Spine === null) {
|
12
|
-
Spine = require('spine');
|
13
|
-
}
|
2
|
+
var Collection, Instance, Singleton, isArray, singularize, underscore,
|
3
|
+
__hasProp = Object.prototype.hasOwnProperty,
|
4
|
+
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; };
|
5
|
+
|
6
|
+
if (typeof Spine === "undefined" || Spine === null) Spine = require('spine');
|
7
|
+
|
8
|
+
isArray = Spine.isArray;
|
9
|
+
|
14
10
|
if (typeof require === "undefined" || require === null) {
|
15
11
|
require = (function(value) {
|
16
12
|
return eval(value);
|
17
13
|
});
|
18
14
|
}
|
19
|
-
|
20
|
-
|
15
|
+
|
16
|
+
Collection = (function(_super) {
|
17
|
+
|
18
|
+
__extends(Collection, _super);
|
19
|
+
|
21
20
|
function Collection(options) {
|
22
21
|
var key, value;
|
23
|
-
if (options == null) {
|
24
|
-
options = {};
|
25
|
-
}
|
22
|
+
if (options == null) options = {};
|
26
23
|
for (key in options) {
|
27
24
|
value = options[key];
|
28
25
|
this[key] = value;
|
29
26
|
}
|
30
27
|
}
|
28
|
+
|
31
29
|
Collection.prototype.all = function() {
|
32
|
-
|
33
|
-
|
34
|
-
|
30
|
+
var _this = this;
|
31
|
+
return this.model.select(function(rec) {
|
32
|
+
return _this.associated(rec);
|
33
|
+
});
|
35
34
|
};
|
35
|
+
|
36
36
|
Collection.prototype.first = function() {
|
37
37
|
return this.all()[0];
|
38
38
|
};
|
39
|
+
|
39
40
|
Collection.prototype.last = function() {
|
40
41
|
var values;
|
41
42
|
values = this.all();
|
42
43
|
return values[values.length - 1];
|
43
44
|
};
|
45
|
+
|
44
46
|
Collection.prototype.find = function(id) {
|
45
|
-
var records
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
}
|
47
|
+
var records,
|
48
|
+
_this = this;
|
49
|
+
records = this.select(function(rec) {
|
50
|
+
return rec.id + '' === id + '';
|
51
|
+
});
|
52
|
+
if (!records[0]) throw 'Unknown record';
|
52
53
|
return records[0];
|
53
54
|
};
|
55
|
+
|
56
|
+
Collection.prototype.findAllByAttribute = function(name, value) {
|
57
|
+
var _this = this;
|
58
|
+
return this.model.select(function(rec) {
|
59
|
+
return rec[name] === value;
|
60
|
+
});
|
61
|
+
};
|
62
|
+
|
63
|
+
Collection.prototype.findByAttribute = function(name, value) {
|
64
|
+
return this.findAllByAttribute(name, value)[0];
|
65
|
+
};
|
66
|
+
|
54
67
|
Collection.prototype.select = function(cb) {
|
55
|
-
|
56
|
-
|
57
|
-
|
68
|
+
var _this = this;
|
69
|
+
return this.model.select(function(rec) {
|
70
|
+
return _this.associated(rec) && cb(rec);
|
71
|
+
});
|
58
72
|
};
|
73
|
+
|
59
74
|
Collection.prototype.refresh = function(values) {
|
60
|
-
var record, records,
|
61
|
-
|
62
|
-
for (_i = 0, _len =
|
63
|
-
record =
|
75
|
+
var record, records, _i, _j, _len, _len2, _ref;
|
76
|
+
_ref = this.all();
|
77
|
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
78
|
+
record = _ref[_i];
|
64
79
|
delete this.model.records[record.id];
|
65
80
|
}
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
this.
|
81
|
+
records = this.model.fromJSON(values);
|
82
|
+
if (!isArray(records)) records = [records];
|
83
|
+
for (_j = 0, _len2 = records.length; _j < _len2; _j++) {
|
84
|
+
record = records[_j];
|
85
|
+
record.newRecord = false;
|
86
|
+
record[this.fkey] = this.record.id;
|
87
|
+
this.model.records[record.id] = record;
|
72
88
|
}
|
73
|
-
return this.model.trigger('refresh');
|
89
|
+
return this.model.trigger('refresh', records);
|
74
90
|
};
|
91
|
+
|
75
92
|
Collection.prototype.create = function(record) {
|
76
93
|
record[this.fkey] = this.record.id;
|
77
94
|
return this.model.create(record);
|
78
95
|
};
|
96
|
+
|
79
97
|
Collection.prototype.associated = function(record) {
|
80
98
|
return record[this.fkey] === this.record.id;
|
81
99
|
};
|
100
|
+
|
82
101
|
return Collection;
|
83
|
-
|
84
|
-
|
85
|
-
|
102
|
+
|
103
|
+
})(Spine.Module);
|
104
|
+
|
105
|
+
Instance = (function(_super) {
|
106
|
+
|
107
|
+
__extends(Instance, _super);
|
108
|
+
|
86
109
|
function Instance(options) {
|
87
110
|
var key, value;
|
88
|
-
if (options == null) {
|
89
|
-
options = {};
|
90
|
-
}
|
111
|
+
if (options == null) options = {};
|
91
112
|
for (key in options) {
|
92
113
|
value = options[key];
|
93
114
|
this[key] = value;
|
94
115
|
}
|
95
116
|
}
|
117
|
+
|
96
118
|
Instance.prototype.exists = function() {
|
97
119
|
return this.record[this.fkey] && this.model.exists(this.record[this.fkey]);
|
98
120
|
};
|
121
|
+
|
99
122
|
Instance.prototype.update = function(value) {
|
123
|
+
if (!(value instanceof this.model)) value = new this.model(value);
|
124
|
+
if (value.isNew()) value.save();
|
100
125
|
return this.record[this.fkey] = value && value.id;
|
101
126
|
};
|
127
|
+
|
102
128
|
return Instance;
|
103
|
-
|
104
|
-
|
105
|
-
|
129
|
+
|
130
|
+
})(Spine.Module);
|
131
|
+
|
132
|
+
Singleton = (function(_super) {
|
133
|
+
|
134
|
+
__extends(Singleton, _super);
|
135
|
+
|
106
136
|
function Singleton(options) {
|
107
137
|
var key, value;
|
108
|
-
if (options == null) {
|
109
|
-
options = {};
|
110
|
-
}
|
138
|
+
if (options == null) options = {};
|
111
139
|
for (key in options) {
|
112
140
|
value = options[key];
|
113
141
|
this[key] = value;
|
114
142
|
}
|
115
143
|
}
|
144
|
+
|
116
145
|
Singleton.prototype.find = function() {
|
117
146
|
return this.record.id && this.model.findByAttribute(this.fkey, this.record.id);
|
118
147
|
};
|
148
|
+
|
119
149
|
Singleton.prototype.update = function(value) {
|
120
|
-
if (value
|
121
|
-
|
122
|
-
|
123
|
-
return value;
|
150
|
+
if (!(value instanceof this.model)) value = this.model.fromJSON(value);
|
151
|
+
value[this.fkey] = this.record.id;
|
152
|
+
return value.save();
|
124
153
|
};
|
154
|
+
|
125
155
|
return Singleton;
|
126
|
-
|
156
|
+
|
157
|
+
})(Spine.Module);
|
158
|
+
|
127
159
|
singularize = function(str) {
|
128
160
|
return str.replace(/s$/, '');
|
129
161
|
};
|
162
|
+
|
130
163
|
underscore = function(str) {
|
131
164
|
return str.replace(/::/g, '/').replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2').replace(/([a-z\d])([A-Z])/g, '$1_$2').replace(/-/g, '_').toLowerCase();
|
132
165
|
};
|
166
|
+
|
133
167
|
Spine.Model.extend({
|
134
168
|
hasMany: function(name, model, fkey) {
|
135
169
|
var association;
|
136
|
-
if (fkey == null)
|
137
|
-
fkey = "" + (underscore(this.className)) + "_id";
|
138
|
-
}
|
170
|
+
if (fkey == null) fkey = "" + (underscore(this.className)) + "_id";
|
139
171
|
association = function(record) {
|
140
|
-
if (typeof model === 'string')
|
141
|
-
model = require(model);
|
142
|
-
}
|
172
|
+
if (typeof model === 'string') model = require(model);
|
143
173
|
return new Collection({
|
144
174
|
name: name,
|
145
175
|
model: model,
|
@@ -148,21 +178,15 @@
|
|
148
178
|
});
|
149
179
|
};
|
150
180
|
return this.prototype[name] = function(value) {
|
151
|
-
if (value != null)
|
152
|
-
association(this).refresh(value);
|
153
|
-
}
|
181
|
+
if (value != null) association(this).refresh(value);
|
154
182
|
return association(this);
|
155
183
|
};
|
156
184
|
},
|
157
185
|
belongsTo: function(name, model, fkey) {
|
158
186
|
var association;
|
159
|
-
if (fkey == null)
|
160
|
-
fkey = "" + (singularize(name)) + "_id";
|
161
|
-
}
|
187
|
+
if (fkey == null) fkey = "" + (singularize(name)) + "_id";
|
162
188
|
association = function(record) {
|
163
|
-
if (typeof model === 'string')
|
164
|
-
model = require(model);
|
165
|
-
}
|
189
|
+
if (typeof model === 'string') model = require(model);
|
166
190
|
return new Instance({
|
167
191
|
name: name,
|
168
192
|
model: model,
|
@@ -171,22 +195,16 @@
|
|
171
195
|
});
|
172
196
|
};
|
173
197
|
this.prototype[name] = function(value) {
|
174
|
-
if (value != null)
|
175
|
-
association(this).update(value);
|
176
|
-
}
|
198
|
+
if (value != null) association(this).update(value);
|
177
199
|
return association(this).exists();
|
178
200
|
};
|
179
201
|
return this.attributes.push(fkey);
|
180
202
|
},
|
181
203
|
hasOne: function(name, model, fkey) {
|
182
204
|
var association;
|
183
|
-
if (fkey == null)
|
184
|
-
fkey = "" + (underscore(this.className)) + "_id";
|
185
|
-
}
|
205
|
+
if (fkey == null) fkey = "" + (underscore(this.className)) + "_id";
|
186
206
|
association = function(record) {
|
187
|
-
if (typeof model === 'string')
|
188
|
-
model = require(model);
|
189
|
-
}
|
207
|
+
if (typeof model === 'string') model = require(model);
|
190
208
|
return new Singleton({
|
191
209
|
name: name,
|
192
210
|
model: model,
|
@@ -195,11 +213,10 @@
|
|
195
213
|
});
|
196
214
|
};
|
197
215
|
return this.prototype[name] = function(value) {
|
198
|
-
if (value != null)
|
199
|
-
association(this).update(value);
|
200
|
-
}
|
216
|
+
if (value != null) association(this).update(value);
|
201
217
|
return association(this).find();
|
202
218
|
};
|
203
219
|
}
|
204
220
|
});
|
221
|
+
|
205
222
|
}).call(this);
|