ende 0.3.13 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/component.json +7 -0
- data/lib/assets/javascripts/aura/extensions/devise.js.coffee +2 -2
- data/lib/assets/javascripts/aura/extensions/loader.js.coffee +13 -11
- data/lib/assets/javascripts/aura/extensions/mask.js.coffee +54 -40
- data/lib/assets/javascripts/aura/extensions/mediator.js +5 -3
- data/lib/assets/javascripts/aura/extensions/models.js.coffee.erb +2 -2
- data/lib/assets/javascripts/aura/extensions/rivets/accounting.js.coffee +7 -1
- data/lib/assets/javascripts/aura/extensions/rivets/formatters.js.coffee +5 -1
- data/lib/assets/javascripts/aura/extensions/rivets.js.coffee +47 -29
- data/lib/assets/javascripts/aura/extensions/routes.js.coffee +10 -5
- data/lib/assets/javascripts/aura/extensions/states.js.coffee +2 -2
- data/lib/assets/javascripts/aura/extensions/widget/eventable.js.coffee +18 -19
- data/lib/assets/javascripts/aura/extensions/widget/lifecycleable.js.coffee +15 -10
- data/lib/assets/javascripts/config/initializers/jquery.js.coffee +2 -1
- data/lib/assets/javascripts/config/initializers/requirejs.js.coffee +3 -4
- data/lib/assets/javascripts/config/initializers.js.coffee +3 -0
- data/lib/assets/javascripts/config/load_components.js.coffee +106 -83
- data/lib/assets/javascripts/ende.js.coffee +13 -4
- data/lib/assets/javascripts/widgets/authenticator/presenter.js.coffee +3 -2
- data/lib/assets/javascripts/widgets/dialog/main.js.coffee +7 -3
- data/lib/assets/javascripts/widgets/support/main.js.coffee +3 -4
- data/lib/assets/javascripts/widgets/viewer/main.js.coffee +35 -103
- data/lib/assets/javascripts/widgets/viewer/presenters/default.js.coffee +2 -4
- data/lib/ende/version.rb +1 -1
- data/vendor/assets/components/build.js +30877 -0
- data/vendor/assets/components/ende_build.js +2487 -148
- data/vendor/assets/components/indemma_with_none.js +30553 -0
- data/vendor/assets/javascripts/spin/spin.js +349 -0
- data/vendor/components/indefinido-indemma/.gitignore +3 -0
- data/vendor/components/indefinido-indemma/.ruby-gemset +1 -1
- data/vendor/components/indefinido-indemma/.ruby-version +1 -1
- data/vendor/components/indefinido-indemma/build/development.js +17 -14
- data/vendor/components/indefinido-indemma/build/release.js +213 -148
- data/vendor/components/indefinido-indemma/build/test.js +213 -148
- data/vendor/components/indefinido-indemma/component.json +3 -1
- data/vendor/components/indefinido-indemma/karma.conf.js +50 -60
- data/vendor/components/indefinido-indemma/lib/record/associable.js +17 -17
- data/vendor/components/indefinido-indemma/lib/record/persistable.js +8 -1
- data/vendor/components/indefinido-indemma/lib/record/queryable.js +3 -0
- data/vendor/components/indefinido-indemma/lib/record/resource.js +25 -45
- data/vendor/components/indefinido-indemma/lib/record/restfulable.js +82 -28
- data/vendor/components/indefinido-indemma/lib/record/scopable.js +28 -2
- data/vendor/components/indefinido-indemma/lib/record/storable.js +1 -1
- data/vendor/components/indefinido-indemma/lib/record/validatable.js +15 -23
- data/vendor/components/indefinido-indemma/lib/record/validations/associated.js +3 -5
- data/vendor/components/indefinido-indemma/lib/record/validations/confirmation.js +3 -5
- data/vendor/components/indefinido-indemma/lib/record/validations/cpf.js +5 -7
- data/vendor/components/indefinido-indemma/lib/record/validations/presence.js +3 -5
- data/vendor/components/indefinido-indemma/lib/record/validations/remote.js +3 -7
- data/vendor/components/indefinido-indemma/lib/record/validations/type.js +2 -2
- data/vendor/components/indefinido-indemma/lib/record/validations/validatorable.js +12 -0
- data/vendor/components/indefinido-indemma/package.json +9 -0
- data/vendor/components/indefinido-indemma/spec/record/restfulable_spec.js +12 -0
- data/vendor/components/indefinido-indemma/spec/record/validatable_spec.js +4 -4
- data/vendor/components/indefinido-indemma/spec/record/validations/associated_spec.js +2 -2
- data/vendor/components/indefinido-indemma/src/lib/record/associable.coffee +44 -20
- data/vendor/components/indefinido-indemma/src/lib/record/persistable.coffee +7 -2
- data/vendor/components/indefinido-indemma/src/lib/record/queryable.coffee +1 -0
- data/vendor/components/indefinido-indemma/src/lib/record/resource.coffee +32 -32
- data/vendor/components/indefinido-indemma/src/lib/record/restfulable.coffee +79 -22
- data/vendor/components/indefinido-indemma/src/lib/record/scopable.coffee +27 -8
- data/vendor/components/indefinido-indemma/src/lib/record/storable.coffee +1 -1
- data/vendor/components/indefinido-indemma/src/lib/record/validatable.coffee +20 -19
- data/vendor/components/indefinido-indemma/src/lib/record/validations/associated.coffee +3 -5
- data/vendor/components/indefinido-indemma/src/lib/record/validations/confirmation.coffee +2 -4
- data/vendor/components/indefinido-indemma/src/lib/record/validations/cpf.coffee +4 -5
- data/vendor/components/indefinido-indemma/src/lib/record/validations/presence.coffee +2 -5
- data/vendor/components/indefinido-indemma/src/lib/record/validations/remote.coffee +3 -7
- data/vendor/components/indefinido-indemma/src/lib/record/validations/type.coffee +2 -3
- data/vendor/components/indefinido-indemma/src/lib/record/validations/validatorable.coffee +5 -0
- data/vendor/components/indefinido-indemma/src/spec/record/restfulable_spec.coffee +8 -0
- data/vendor/components/indefinido-indemma/src/spec/record/validatable_spec.coffee +4 -4
- data/vendor/components/indefinido-indemma/src/spec/record/validations/associated_spec.coffee +2 -2
- metadata +9 -3
- data/lib/assets/javascripts/aura/extensions/rivets/formatters.js.coffee~ +0 -0
@@ -2,7 +2,7 @@
|
|
2
2
|
"name": "indemma",
|
3
3
|
"repo": "indefinido/indemma",
|
4
4
|
"description": "Indemma (mind picture = memory), client side ES5 observable REST model",
|
5
|
-
"version": "0.1.
|
5
|
+
"version": "0.1.9",
|
6
6
|
"keywords": [],
|
7
7
|
"dependencies": {
|
8
8
|
"pluma/assimilate": "0.3.0",
|
@@ -19,6 +19,7 @@
|
|
19
19
|
"vendor/stampit.js",
|
20
20
|
"vendor/sinon.js",
|
21
21
|
"vendor/owl/pluralize.js",
|
22
|
+
|
22
23
|
"lib/record.js",
|
23
24
|
"lib/record/associable.js",
|
24
25
|
"lib/record/persistable.js",
|
@@ -30,6 +31,7 @@
|
|
30
31
|
"lib/record/scopable.js",
|
31
32
|
"lib/record/maid.js",
|
32
33
|
"lib/record/translationable.js",
|
34
|
+
"lib/record/validations/validatorable.js",
|
33
35
|
"lib/record/validations/confirmation.js",
|
34
36
|
"lib/record/validations/associated.js",
|
35
37
|
"lib/record/validations/presence.js",
|
@@ -1,86 +1,76 @@
|
|
1
1
|
// Karma configuration
|
2
|
-
// Generated on Mon May 27 2013 16:00:28 GMT-0300 (BRT)
|
3
2
|
|
3
|
+
module.exports = function(config) {
|
4
|
+
config.set({
|
4
5
|
|
5
|
-
// base path, that will be used to resolve files and exclude
|
6
|
-
basePath
|
6
|
+
// base path, that will be used to resolve files and exclude
|
7
|
+
basePath: '',
|
7
8
|
|
8
|
-
// list of files / patterns to load in the browser
|
9
|
-
files = [
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
MOCHA_ADAPTER,
|
14
|
-
'vendor/sinon.js',
|
10
|
+
// frameworks to use
|
11
|
+
frameworks: ['mocha'],
|
15
12
|
|
16
|
-
// Test dependencies
|
17
|
-
'build/test.js',
|
18
|
-
'spec/support/**/*.js',
|
19
13
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
14
|
+
// list of files / patterns to load in the browser
|
15
|
+
files: [
|
16
|
+
'vendor/sinon.js',
|
17
|
+
'build/test.js',
|
18
|
+
'spec/support/**/*.js',
|
19
|
+
'spec/spec_helper.js',
|
20
|
+
'spec/**/*.js'
|
21
|
+
],
|
24
22
|
|
23
|
+
// list of files to excudle
|
24
|
+
exclude: [
|
25
|
+
'spec/coverage/**/*.js'
|
26
|
+
],
|
25
27
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
28
|
+
client: {
|
29
|
+
mocha: {
|
30
|
+
ui: 'bdd'
|
31
|
+
}
|
32
|
+
},
|
30
33
|
|
31
34
|
|
32
|
-
// test results reporter to use
|
33
|
-
// possible values: 'dots', 'progress', 'junit'
|
34
|
-
reporters
|
35
|
+
// test results reporter to use
|
36
|
+
// possible values: 'dots', 'progress', 'junit', 'growl', 'coverage'
|
37
|
+
reporters: ['progress'],
|
35
38
|
|
36
39
|
|
37
|
-
// web server port
|
38
|
-
port
|
40
|
+
// web server port
|
41
|
+
port: 9876,
|
39
42
|
|
40
43
|
|
41
|
-
//
|
42
|
-
|
44
|
+
// enable / disable colors in the output (reporters and logs)
|
45
|
+
colors: true,
|
43
46
|
|
44
47
|
|
45
|
-
//
|
46
|
-
|
48
|
+
// level of logging
|
49
|
+
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
|
50
|
+
logLevel: config.LOG_INFO,
|
47
51
|
|
48
52
|
|
49
|
-
//
|
50
|
-
|
51
|
-
logLevel = LOG_INFO;
|
53
|
+
// enable / disable watching file and executing tests whenever any file changes
|
54
|
+
autoWatch: true,
|
52
55
|
|
53
56
|
|
54
|
-
//
|
55
|
-
|
57
|
+
// Start these browsers, currently available:
|
58
|
+
// - Chrome
|
59
|
+
// - ChromeCanary
|
60
|
+
// - Firefox
|
61
|
+
// - Opera (has to be installed with `npm install karma-opera-launcher`)
|
62
|
+
// - Safari (only Mac; has to be installed with `npm install karma-safari-launcher`)
|
63
|
+
// - PhantomJS
|
64
|
+
// - IE (only Windows; has to be installed with `npm install karma-ie-launcher`)
|
65
|
+
browsers: ['Chrome'],
|
56
66
|
|
57
67
|
|
58
|
-
//
|
59
|
-
|
60
|
-
// - ChromeCanary
|
61
|
-
// - Firefox
|
62
|
-
// - Opera
|
63
|
-
// - Safari (only Mac)
|
64
|
-
// - PhantomJS
|
65
|
-
// - IE (only Windows)
|
66
|
-
browsers = ['Chrome'];
|
68
|
+
// If browser does not capture in given timeout [ms], kill it
|
69
|
+
captureTimeout: 60000,
|
67
70
|
|
68
71
|
|
69
|
-
//
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
// Continuous Integration mode
|
74
|
-
// if true, it capture browsers, run tests and exit
|
75
|
-
singleRun = false;
|
76
|
-
|
77
|
-
// Coverage preprocessors
|
78
|
-
preprocessors = {
|
79
|
-
'**/lib/*.js': 'coverage'
|
72
|
+
// Continuous Integration mode
|
73
|
+
// if true, it capture browsers, run tests and exit
|
74
|
+
singleRun: false
|
75
|
+
});
|
80
76
|
};
|
81
|
-
|
82
|
-
// Converage configuration
|
83
|
-
coverageReporter = {
|
84
|
-
type : 'html',
|
85
|
-
dir : 'spec/coverage'
|
86
|
-
}
|
@@ -79,26 +79,22 @@ singular = {
|
|
79
79
|
subscribers = {
|
80
80
|
belongs_to: {
|
81
81
|
foreign_key: function(resource_id) {
|
82
|
-
var
|
82
|
+
var association_name, current_resource_id, resource, _ref;
|
83
83
|
|
84
84
|
association_name = this.resource.toString();
|
85
|
-
if (resource_id
|
85
|
+
if (!resource_id) {
|
86
86
|
this.dirty = true;
|
87
87
|
this.owner[association_name] = resource_id;
|
88
88
|
return resource_id;
|
89
89
|
}
|
90
|
-
current_resource_id = (_ref = this.owner[association_name]) != null ? _ref._id : void 0;
|
90
|
+
current_resource_id = (_ref = this.owner.observed[association_name]) != null ? _ref._id : void 0;
|
91
91
|
if (resource_id !== current_resource_id) {
|
92
92
|
resource = model[association_name];
|
93
93
|
if (!resource) {
|
94
94
|
console.warn("subscribers.belongs_to.foreign_key: associated factory not found for model: " + association_name);
|
95
95
|
return resource_id;
|
96
96
|
}
|
97
|
-
|
98
|
-
associated || (associated = resource({
|
99
|
-
_id: resource_id
|
100
|
-
}));
|
101
|
-
this.owner.observed[association_name] = associated;
|
97
|
+
this.owner.observed[association_name] = null;
|
102
98
|
}
|
103
99
|
return resource_id;
|
104
100
|
},
|
@@ -136,10 +132,12 @@ modifiers = {
|
|
136
132
|
return associated;
|
137
133
|
}
|
138
134
|
associated = resource.find(associated_id || associated._id);
|
135
|
+
if (associated) {
|
136
|
+
return _this.owner.observed[association_name] = associated;
|
137
|
+
}
|
139
138
|
associated || (associated = resource({
|
140
139
|
_id: associated_id
|
141
140
|
}));
|
142
|
-
resource.storage.store(associated._id, associated);
|
143
141
|
associated.reload();
|
144
142
|
return _this.owner.observed[association_name] = associated;
|
145
143
|
},
|
@@ -161,8 +159,8 @@ callbacks = {
|
|
161
159
|
for (_i = 0, _len = association_names.length; _i < _len; _i++) {
|
162
160
|
association_name = association_names[_i];
|
163
161
|
associations_attributes = this["" + association_name + "_attributes"];
|
162
|
+
association = this[model.pluralize(association_name)];
|
164
163
|
if (associations_attributes && associations_attributes.length) {
|
165
|
-
association = this[model.pluralize(association_name)];
|
166
164
|
if (!association) {
|
167
165
|
message = "has_many.nest_attributes: Association not found for " + association_name + ". \n";
|
168
166
|
message += "did you set it on model declaration? \n has_many: " + association_name + " ";
|
@@ -252,7 +250,7 @@ associable = {
|
|
252
250
|
return true;
|
253
251
|
},
|
254
252
|
create_after_hooks: function(definition) {
|
255
|
-
var association_name, association_proxy, old_resource_id, options, resource, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _results;
|
253
|
+
var association_attributes, association_name, association_proxy, old_dirty, old_resource_id, options, resource, _i, _j, _k, _len, _len1, _len2, _name, _ref, _ref1, _ref2, _results;
|
256
254
|
|
257
255
|
options = model[this.resource.name || this.resource.toString()];
|
258
256
|
if (options.has_many) {
|
@@ -265,6 +263,11 @@ associable = {
|
|
265
263
|
parent: this
|
266
264
|
};
|
267
265
|
association_name = model.pluralize(resource);
|
266
|
+
association_attributes = this[association_name] || [];
|
267
|
+
this[_name = "" + association_name + "_attributes"] || (this[_name] = []);
|
268
|
+
if (association_attributes.length) {
|
269
|
+
this["" + association_name + "_attributes"] = this["" + association_name + "_attributes"].concat(association_attributes);
|
270
|
+
}
|
268
271
|
this[association_name] = $.extend(association_proxy, plural);
|
269
272
|
}
|
270
273
|
this.after('saved', callbacks.has_many.update_association);
|
@@ -300,15 +303,12 @@ associable = {
|
|
300
303
|
this["build_" + resource] = $.proxy(singular.build, association_proxy);
|
301
304
|
this["create_" + resource] = $.proxy(singular.create, association_proxy);
|
302
305
|
old_resource_id = this["" + resource + "_id"];
|
306
|
+
old_dirty = this.dirty;
|
303
307
|
this["" + resource + "_id"] = null;
|
304
308
|
this.subscribe("" + resource + "_id", $.proxy(subscribers.belongs_to.foreign_key, association_proxy));
|
305
309
|
this.subscribe(resource.toString(), $.proxy(subscribers.belongs_to.associated_changed, association_proxy));
|
306
|
-
this
|
307
|
-
|
308
|
-
_results.push(this.publish("" + resource + "_id", this["" + resource + "_id"]));
|
309
|
-
} else {
|
310
|
-
_results.push(void 0);
|
311
|
-
}
|
310
|
+
this["" + resource + "_id"] = old_resource_id;
|
311
|
+
_results.push(this.dirty = old_dirty);
|
312
312
|
}
|
313
313
|
return _results;
|
314
314
|
}
|
@@ -16,7 +16,14 @@ handlers = {
|
|
16
16
|
persistable = {
|
17
17
|
record: {
|
18
18
|
after_initialize: function() {
|
19
|
-
|
19
|
+
var storage;
|
20
|
+
|
21
|
+
if (this._id) {
|
22
|
+
storage = model[this.resource.toString()].storage;
|
23
|
+
return storage.store(this._id, this);
|
24
|
+
} else {
|
25
|
+
return this.after('saved', handlers.store_after_saved);
|
26
|
+
}
|
20
27
|
}
|
21
28
|
}
|
22
29
|
};
|
@@ -9,6 +9,9 @@ stampit = require('../../vendor/stampit');
|
|
9
9
|
queryable = {
|
10
10
|
storage: storable(),
|
11
11
|
find: function(key) {
|
12
|
+
if (!key) {
|
13
|
+
throw new TypeError("InvalidFind: resource.find was called with a falsey value");
|
14
|
+
}
|
12
15
|
return this.storage.store(key);
|
13
16
|
},
|
14
17
|
all: function() {
|
@@ -1,4 +1,4 @@
|
|
1
|
-
var model, resource, resourceable, stampit;
|
1
|
+
var descriptors, model, resource, resourceable, stampit;
|
2
2
|
|
3
3
|
stampit = require('../../vendor/stampit');
|
4
4
|
|
@@ -25,34 +25,11 @@ resource = stampit({
|
|
25
25
|
return this;
|
26
26
|
});
|
27
27
|
|
28
|
-
|
29
|
-
pluralize: function(word, count, plural) {
|
30
|
-
if (!(word && word.length)) {
|
31
|
-
throw new TypeError("Invalid string passed to pluralize '" + word + "'");
|
32
|
-
}
|
33
|
-
if (word.indexOf('s') !== word.length - 1) {
|
34
|
-
return owl.pluralize(word, count, plural);
|
35
|
-
} else {
|
36
|
-
return word;
|
37
|
-
}
|
38
|
-
},
|
39
|
-
singularize: function(word) {
|
40
|
-
if (!(word && word.length)) {
|
41
|
-
throw new TypeError("Invalid string passed to singularize '" + word + "'");
|
42
|
-
}
|
43
|
-
if (word.lastIndexOf('s') === word.length - 1) {
|
44
|
-
return word.substring(0, word.length - 1);
|
45
|
-
} else {
|
46
|
-
return word;
|
47
|
-
}
|
48
|
-
},
|
28
|
+
descriptors = {
|
49
29
|
route: {
|
50
30
|
get: function() {
|
51
31
|
var route;
|
52
32
|
|
53
|
-
if (this.initial_route != null) {
|
54
|
-
return this.initial_route;
|
55
|
-
}
|
56
33
|
if (typeof this.resource === 'string') {
|
57
34
|
this.resource = {
|
58
35
|
name: this.resource
|
@@ -66,33 +43,36 @@ resourceable = {
|
|
66
43
|
route += this.resource.scope + '/';
|
67
44
|
}
|
68
45
|
route += this.resource.singular ? this.resource.name : model.pluralize(this.resource.name);
|
69
|
-
this.
|
70
|
-
return route;
|
46
|
+
return this.route = route;
|
71
47
|
},
|
72
|
-
|
73
|
-
|
48
|
+
configurable: true
|
49
|
+
}
|
50
|
+
};
|
51
|
+
|
52
|
+
resourceable = {
|
53
|
+
pluralize: function(word, count, plural) {
|
54
|
+
if (!(word && word.length)) {
|
55
|
+
throw new TypeError("Invalid string passed to pluralize '" + word + "'");
|
56
|
+
}
|
57
|
+
if (word.indexOf('s') !== word.length - 1) {
|
58
|
+
return owl.pluralize(word, count, plural);
|
59
|
+
} else {
|
60
|
+
return word;
|
74
61
|
}
|
75
62
|
},
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
return
|
63
|
+
singularize: function(word) {
|
64
|
+
if (!(word && word.length)) {
|
65
|
+
throw new TypeError("Invalid string passed to singularize '" + word + "'");
|
66
|
+
}
|
67
|
+
if (word.lastIndexOf('s') === word.length - 1) {
|
68
|
+
return word.substring(0, word.length - 1);
|
69
|
+
} else {
|
70
|
+
return word;
|
84
71
|
}
|
85
72
|
},
|
86
73
|
initialize: function() {
|
87
74
|
var resource_definition, _ref;
|
88
75
|
|
89
|
-
if (this.parent_resource) {
|
90
|
-
Object.defineProperty(this, "" + this.parent_resource + "_id", {
|
91
|
-
value: resourceable.parent_id,
|
92
|
-
configurable: true,
|
93
|
-
enumerable: true
|
94
|
-
});
|
95
|
-
}
|
96
76
|
resource_definition = {};
|
97
77
|
if (typeof this.resource === 'string') {
|
98
78
|
resource_definition = {
|
@@ -105,7 +85,7 @@ resourceable = {
|
|
105
85
|
}
|
106
86
|
resource_definition.parent = this.parent_resource;
|
107
87
|
this.resource = resource(resource_definition);
|
108
|
-
return (_ref = this.route) != null ? _ref : Object.defineProperty(this, 'route',
|
88
|
+
return (_ref = this.route) != null ? _ref : Object.defineProperty(this, 'route', descriptors.route);
|
109
89
|
}
|
110
90
|
};
|
111
91
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
var $, merge, model, observable, record, rest, restful, type, util,
|
1
|
+
var $, merge, model, observable, record, rest, restful, root, type, util,
|
2
2
|
__slice = [].slice;
|
3
3
|
|
4
4
|
merge = require('assimilate').withStrategy('deep');
|
@@ -11,15 +11,17 @@ $ = require('jquery');
|
|
11
11
|
|
12
12
|
rest = require('./rest.js');
|
13
13
|
|
14
|
+
root = typeof exports !== "undefined" && exports !== null ? exports : this;
|
15
|
+
|
14
16
|
util = {
|
15
17
|
model: {
|
16
|
-
map: function(
|
17
|
-
var
|
18
|
+
map: function(records) {
|
19
|
+
var record, _i, _len, _results;
|
18
20
|
|
19
21
|
_results = [];
|
20
|
-
for (_i = 0, _len =
|
21
|
-
|
22
|
-
_results.push(this(
|
22
|
+
for (_i = 0, _len = records.length; _i < _len; _i++) {
|
23
|
+
record = records[_i];
|
24
|
+
_results.push(this(record));
|
23
25
|
}
|
24
26
|
return _results;
|
25
27
|
}
|
@@ -51,15 +53,15 @@ restful = {
|
|
51
53
|
}
|
52
54
|
return $.when.apply($, savings);
|
53
55
|
},
|
54
|
-
all: function(conditions,
|
56
|
+
all: function(conditions, doned, failed) {
|
55
57
|
if (conditions == null) {
|
56
58
|
conditions = {};
|
57
59
|
}
|
58
60
|
if (typeof conditions === 'function') {
|
59
|
-
|
61
|
+
doned = conditions;
|
60
62
|
conditions = {};
|
61
63
|
}
|
62
|
-
return $.when(rest.get.call(this, conditions)).then(util.model.map).done(
|
64
|
+
return $.when(rest.get.call(this, conditions)).then(util.model.map).done(doned).fail(failed);
|
63
65
|
},
|
64
66
|
first: function(conditions, callback) {
|
65
67
|
var namespaced;
|
@@ -77,15 +79,21 @@ restful = {
|
|
77
79
|
return this.all(conditions, callback);
|
78
80
|
},
|
79
81
|
get: function(action, data) {
|
80
|
-
var old_route, payload, promise, resource
|
82
|
+
var default_route, old_route, payload, promise, resource;
|
81
83
|
|
82
84
|
if (data == null) {
|
83
85
|
data = {};
|
84
86
|
}
|
85
87
|
old_route = this.route;
|
86
|
-
|
88
|
+
default_route = "/" + (model.pluralize(this.resource.name));
|
89
|
+
if (default_route !== this.route) {
|
90
|
+
this.route = default_route;
|
91
|
+
}
|
87
92
|
if (action) {
|
88
|
-
this
|
93
|
+
Object.defineProperty(this, 'route', {
|
94
|
+
value: "" + default_route + "/" + action,
|
95
|
+
configurable: true
|
96
|
+
});
|
89
97
|
}
|
90
98
|
resource = data.resource;
|
91
99
|
if (data && data.json) {
|
@@ -97,13 +105,19 @@ restful = {
|
|
97
105
|
data[resource] = payload;
|
98
106
|
}
|
99
107
|
promise = rest.get.call(this, data);
|
100
|
-
route
|
108
|
+
Object.defineProperty(this, 'route', {
|
109
|
+
value: old_route,
|
110
|
+
configurable: true
|
111
|
+
});
|
101
112
|
return promise;
|
102
113
|
},
|
103
114
|
put: rest.put,
|
104
115
|
"delete": rest["delete"]
|
105
116
|
},
|
106
117
|
record: {
|
118
|
+
ready: function(callback) {
|
119
|
+
return callback.call(this);
|
120
|
+
},
|
107
121
|
reload: function() {
|
108
122
|
var data, param, params, promise, _i, _len;
|
109
123
|
|
@@ -115,6 +129,11 @@ restful = {
|
|
115
129
|
promise = rest.get.call(this, data || {});
|
116
130
|
promise.done(this.assign_attributes);
|
117
131
|
promise.fail(this.failed);
|
132
|
+
this.reloading = promise;
|
133
|
+
this.ready = function() {
|
134
|
+
console.warn("resource.ready was deprecated, please use resource.reloading.done");
|
135
|
+
return promise.done.apply(promise, arguments);
|
136
|
+
};
|
118
137
|
for (_i = 0, _len = params.length; _i < _len; _i++) {
|
119
138
|
param = params[_i];
|
120
139
|
promise.done(param);
|
@@ -122,7 +141,7 @@ restful = {
|
|
122
141
|
return promise;
|
123
142
|
},
|
124
143
|
assign_attributes: function(attributes) {
|
125
|
-
var association, association_attributes, association_name, associations_attributes, attribute, message, singular_resource, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _results;
|
144
|
+
var association, association_attributes, association_name, associations_attributes, attribute, message, name, singular_resource, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _results;
|
126
145
|
|
127
146
|
_ref = model[this.resource.toString()].has_many;
|
128
147
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
@@ -167,9 +186,18 @@ restful = {
|
|
167
186
|
}
|
168
187
|
}
|
169
188
|
_results = [];
|
170
|
-
for (
|
171
|
-
|
172
|
-
|
189
|
+
for (name in attributes) {
|
190
|
+
attribute = attributes[name];
|
191
|
+
if (attribute !== this[name]) {
|
192
|
+
if (type(attribute) === 'object') {
|
193
|
+
if (JSON.stringify(attribute) !== JSON.stringify(this[name])) {
|
194
|
+
_results.push(this[name] = attributes[name]);
|
195
|
+
} else {
|
196
|
+
_results.push(void 0);
|
197
|
+
}
|
198
|
+
} else {
|
199
|
+
_results.push(this[name] = attributes[name]);
|
200
|
+
}
|
173
201
|
}
|
174
202
|
}
|
175
203
|
return _results;
|
@@ -190,18 +218,23 @@ restful = {
|
|
190
218
|
saving: false,
|
191
219
|
salvation: null,
|
192
220
|
save: function(doned, failed, data) {
|
193
|
-
var salvation;
|
221
|
+
var lock, salvation;
|
194
222
|
|
223
|
+
lock = JSON.stringify(this.json());
|
195
224
|
if (this.saving) {
|
196
|
-
|
225
|
+
if (this.lock === lock) {
|
226
|
+
return this.salvation;
|
227
|
+
} else {
|
228
|
+
this.salvation.abort();
|
229
|
+
}
|
197
230
|
}
|
198
|
-
this.lock =
|
231
|
+
this.lock = lock;
|
199
232
|
if (!this.dirty) {
|
200
233
|
salvation = $.Deferred().resolveWith(this, null);
|
201
234
|
}
|
235
|
+
this.saving = true;
|
202
236
|
salvation || (salvation = rest[this._id ? 'put' : 'post'].call(this, data));
|
203
237
|
this.salvation = salvation;
|
204
|
-
this.saving = true;
|
205
238
|
salvation.done(this.saved);
|
206
239
|
salvation.fail(this.failed);
|
207
240
|
salvation.always(function() {
|
@@ -217,8 +250,6 @@ restful = {
|
|
217
250
|
if (this.lock === JSON.stringify(this.json())) {
|
218
251
|
this.dirty = false;
|
219
252
|
delete this.lock;
|
220
|
-
} else {
|
221
|
-
return this.save();
|
222
253
|
}
|
223
254
|
if (data != null) {
|
224
255
|
this.assign_attributes(data);
|
@@ -244,8 +275,21 @@ restful = {
|
|
244
275
|
}
|
245
276
|
payload || (payload = xhr.responseText);
|
246
277
|
switch (xhr.status) {
|
278
|
+
case 0:
|
279
|
+
message = status || xhr.statusText;
|
280
|
+
switch (message) {
|
281
|
+
case 'abort':
|
282
|
+
console.info("salvation probably aborted");
|
283
|
+
break;
|
284
|
+
case 'error':
|
285
|
+
console.info("server probably unreachable");
|
286
|
+
break;
|
287
|
+
default:
|
288
|
+
throw new Error('Unhandled status code for xhr');
|
289
|
+
}
|
290
|
+
break;
|
247
291
|
case 422:
|
248
|
-
definition = model[this.resource];
|
292
|
+
definition = model[this.resource.toString()];
|
249
293
|
_ref = payload.errors;
|
250
294
|
for (attribute_name in _ref) {
|
251
295
|
messages = _ref[attribute_name];
|
@@ -270,8 +314,9 @@ restful = {
|
|
270
314
|
default:
|
271
315
|
message = "Fail in " + this.resource + ".save:\n";
|
272
316
|
message += "Record: " + this + "\n";
|
273
|
-
message += "Status: " + status + " (" + (payload
|
317
|
+
message += "Status: " + status + " (" + (payload || xhr).status + ")\n";
|
274
318
|
message += "Error : " + (payload.error || payload.message || payload);
|
319
|
+
console.log(message);
|
275
320
|
}
|
276
321
|
return this.saving = false;
|
277
322
|
},
|
@@ -283,20 +328,27 @@ restful = {
|
|
283
328
|
return JSON.stringify(serialized);
|
284
329
|
},
|
285
330
|
json: function(methods) {
|
286
|
-
var attribute, json, name, value, _i, _len, _ref;
|
331
|
+
var attribute, definition, json, name, value, _i, _len, _ref;
|
287
332
|
|
288
333
|
if (methods == null) {
|
289
334
|
methods = {};
|
290
335
|
}
|
291
336
|
json = {};
|
337
|
+
definition = model[this.resource.toString()];
|
292
338
|
for (name in this) {
|
293
|
-
value
|
294
|
-
if (!(type(value) !== 'function')) {
|
339
|
+
if (!(type(value))) {
|
295
340
|
continue;
|
296
341
|
}
|
342
|
+
if (definition.belongs_to.indexOf(name) !== -1 && this.nested_attributes.indexOf(name) === -1) {
|
343
|
+
continue;
|
344
|
+
}
|
345
|
+
value = this[name];
|
297
346
|
if (value == null) {
|
298
347
|
continue;
|
299
348
|
}
|
349
|
+
if (type(value) === 'function') {
|
350
|
+
continue;
|
351
|
+
}
|
300
352
|
if (type(value) === 'object') {
|
301
353
|
if (value.toJSON != null) {
|
302
354
|
json[name] = value.toJSON(methods[name]);
|
@@ -322,6 +374,8 @@ restful = {
|
|
322
374
|
delete json.before_initialize;
|
323
375
|
delete json.parent_resource;
|
324
376
|
delete json.nested_attributes;
|
377
|
+
delete json.reloading;
|
378
|
+
delete json.ready;
|
325
379
|
delete json.saving;
|
326
380
|
delete json.salvation;
|
327
381
|
delete json.sustained;
|