batman-rails 0.15.4 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +34 -11
- data/lib/batman-rails.rb +6 -0
- data/lib/batman-rails/helpers/define_view_helper.rb +45 -0
- data/lib/batman-rails/version.rb +2 -2
- data/lib/generators/batman/app_generator.rb +10 -0
- data/lib/generators/common.rb +1 -1
- data/lib/templates/rails/controller.rb +7 -1
- data/test/define_view_helper_test.rb +18 -0
- data/vendor/assets/javascripts/batman/batman.i18n.js +140 -0
- data/vendor/assets/javascripts/batman/batman.js +2705 -264
- data/vendor/assets/javascripts/batman/batman.rails.js +6 -2
- data/vendor/assets/javascripts/batman/batman.testing.js +8524 -0
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c8deae7a6dad1d59f1cb67e92a798e50414598d
|
4
|
+
data.tar.gz: a7b266ed03e94f18b5db5b585e4de18138e9510a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a69ac93e5f28fc771eae9177305d3cc7c821d8a8f15a01220785b1562930f16b0577187f62c54185739cbf82af8ce27b435bc381eee4d795a18c136f276e896e
|
7
|
+
data.tar.gz: 2bd249704f4a95b3dc1bf3fc4acf8e94a7d09788cf362ff4b01b833a4924a4b0cec9883d16707fa134c972226732413609077ae29d682da5ea2bee6e282f0991
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Batman::Rails
|
2
2
|
|
3
|
-
Easily setup and use batman.js (0.
|
3
|
+
Easily setup and use batman.js (0.16) with Rails 4
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -15,25 +15,32 @@ And then execute:
|
|
15
15
|
|
16
16
|
### Layout and namespacing
|
17
17
|
|
18
|
-
Running `rails generate batman:app` will
|
18
|
+
Running `rails generate batman:app` will:
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
20
|
+
- create the following directory structure under `app/assets/batman/`:
|
21
|
+
|
22
|
+
```
|
23
|
+
- models/
|
24
|
+
- views/
|
25
|
+
- controllers/
|
26
|
+
- html/
|
27
|
+
- lib/
|
28
|
+
- app_name.coffee # initial setup & requires
|
29
|
+
```
|
25
30
|
|
26
|
-
|
31
|
+
- create a controller & route to server your batman.js app from `/` and serve HTML
|
32
|
+
- configure the asset pipeline to precompile `app_name.coffee`
|
27
33
|
|
28
34
|
## Generators
|
29
|
-
|
30
|
-
|
35
|
+
|
36
|
+
Batman-Rails provides 3 simple generators to help get you started using batman.js with Rails.
|
37
|
+
The generators will only create client-side code (CoffeeScript).
|
31
38
|
|
32
39
|
### Model Generator
|
33
40
|
|
34
41
|
rails generate batman:model
|
35
42
|
|
36
|
-
This generator creates a batman model inside `app/assets/
|
43
|
+
This generator creates a batman model inside `app/assets/batman/models` to be used to talk to the Rails backend.
|
37
44
|
|
38
45
|
### Controllers
|
39
46
|
|
@@ -67,6 +74,22 @@ Install the gem and generate scaffolding.
|
|
67
74
|
|
68
75
|
You now have installed the `batman-rails` gem, setup a default directory structure for your frontend batman code. Then you generated the usual Rails server side scaffolding and finally generated Batman.js code to provide a simple single page app.
|
69
76
|
|
77
|
+
## Precompiling Views
|
78
|
+
|
79
|
+
In production, you may want to send all your HTML templates with the first request rather than sending them as-needed. `batman-rails` includes a view helper to do this. Add it to your application layout:
|
80
|
+
|
81
|
+
```erb
|
82
|
+
<%= batman_define_views %>
|
83
|
+
```
|
84
|
+
|
85
|
+
It will gather HTML from `app/assets/batman/html` and interpolate them into JS code to preload `Batman.View.store`. If your HTML is in another directory, pass that directory as an option:
|
86
|
+
|
87
|
+
```erb
|
88
|
+
<%= batman_define_views(path_to_html: "app/assets/templates/">
|
89
|
+
```
|
90
|
+
|
91
|
+
Now it will gather HTML from `app/assets/templates`!
|
92
|
+
|
70
93
|
## Contributing
|
71
94
|
|
72
95
|
1. Fork it
|
data/lib/batman-rails.rb
CHANGED
@@ -1,8 +1,14 @@
|
|
1
1
|
require "batman-rails/version"
|
2
|
+
require "batman-rails/helpers/define_view_helper"
|
2
3
|
|
3
4
|
module Batman
|
4
5
|
module Rails
|
5
6
|
class Engine < ::Rails::Engine
|
7
|
+
initializer 'batman_rails.action_controller' do |app|
|
8
|
+
ActiveSupport.on_load :action_controller do
|
9
|
+
helper Batman::DefineViewHelper
|
10
|
+
end
|
11
|
+
end
|
6
12
|
end
|
7
13
|
end
|
8
14
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Batman
|
2
|
+
module DefineViewHelper
|
3
|
+
def batman_define_views(options={})
|
4
|
+
content_tag :script do
|
5
|
+
template_js_string = BatmanView.all(self, options).map(&:inline_preload_javascript).join
|
6
|
+
raw %Q[(function(){#{template_js_string}})();]
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class BatmanView
|
11
|
+
PATH_TO_HTML = "app/assets/batman/html/"
|
12
|
+
|
13
|
+
attr_accessor :pathname, :render_context, :path_to_html
|
14
|
+
|
15
|
+
def self.all(render_context, options={})
|
16
|
+
path_to_html = options[:path_to_html] || PATH_TO_HTML
|
17
|
+
glob_path = File.join(path_to_html, "**/*")
|
18
|
+
valid_files = Dir.glob(glob_path).select { |pathname| File.file?(pathname) }
|
19
|
+
valid_files.collect do |pathname|
|
20
|
+
new(pathname, render_context, path_to_html: path_to_html)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def initialize(pathname, render_context, options={})
|
25
|
+
@pathname = pathname
|
26
|
+
@render_context = render_context
|
27
|
+
@path_to_html = options[:path_to_html] || PATH_TO_HTML
|
28
|
+
end
|
29
|
+
|
30
|
+
def inline_preload_javascript
|
31
|
+
%Q{Batman.View.store.set(#{name.to_json}, #{content.to_json});}
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def name
|
37
|
+
pathname.split(path_to_html).last.gsub(/\.html\.[a-z]+$/, '').to_s
|
38
|
+
end
|
39
|
+
|
40
|
+
def content
|
41
|
+
render_context.render(file: pathname)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/batman-rails/version.rb
CHANGED
@@ -26,6 +26,10 @@ module Batman
|
|
26
26
|
inject_into_file "config/routes.rb", :after => "#{js_application_name}::Application.routes.draw do\n" do
|
27
27
|
route_catchall
|
28
28
|
end
|
29
|
+
|
30
|
+
inject_into_file "config/application.rb", :after => "class Application < Rails::Application\n" do
|
31
|
+
precompile_app
|
32
|
+
end
|
29
33
|
end
|
30
34
|
|
31
35
|
end
|
@@ -72,6 +76,12 @@ module Batman
|
|
72
76
|
CODE
|
73
77
|
end
|
74
78
|
|
79
|
+
def precompile_app
|
80
|
+
<<-CODE
|
81
|
+
\n config.assets.precompile += ['#{application_name}.js']\n
|
82
|
+
CODE
|
83
|
+
end
|
84
|
+
|
75
85
|
def es5_requires
|
76
86
|
<<-CODE
|
77
87
|
#= require batman/es5-shim\n
|
data/lib/generators/common.rb
CHANGED
@@ -51,7 +51,7 @@ module Batman
|
|
51
51
|
module ClassMethods
|
52
52
|
def requires_app_name
|
53
53
|
class_option :app_name, :type => :string, :optional => true,
|
54
|
-
:desc => "Name of the Batman app (defaults to the Rails app name"
|
54
|
+
:desc => "Name of the Batman app (defaults to the Rails app name)"
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
@@ -1,7 +1,13 @@
|
|
1
1
|
class <%= js_app_name %>Controller < ApplicationController
|
2
2
|
|
3
3
|
def index
|
4
|
-
|
4
|
+
if request.xhr?
|
5
|
+
prefix_length = Rails.application.config.assets.prefix.length + 1
|
6
|
+
path = request.path[prefix_length..-1]
|
7
|
+
render :text => Rails.application.assets[path]
|
8
|
+
else
|
9
|
+
render nothing: true, layout: '<%= app_name %>'
|
10
|
+
end
|
5
11
|
end
|
6
12
|
|
7
13
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'generators/batman/view_generator'
|
3
|
+
|
4
|
+
class DefineViewHelperTest < ActionView::TestCase
|
5
|
+
include Batman::DefineViewHelper
|
6
|
+
tests Batman::DefineViewHelper
|
7
|
+
|
8
|
+
test "it defaults to looking in app/assets/batman/html" do
|
9
|
+
File.expects(:join).with("app/assets/batman/html/", "**/*").returns("app/assets/batman/html/**/*")
|
10
|
+
batman_define_views
|
11
|
+
end
|
12
|
+
|
13
|
+
test "it can be given override path" do
|
14
|
+
File.expects(:join).with("app/assets/batman/templates/", "**/*").returns("app/assets/batman/templates/**/*")
|
15
|
+
batman_define_views(path_to_html: "app/assets/batman/templates")
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,140 @@
|
|
1
|
+
(function() {
|
2
|
+
var __hasProp = {}.hasOwnProperty,
|
3
|
+
__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; };
|
4
|
+
|
5
|
+
Batman.I18N = (function(_super) {
|
6
|
+
__extends(I18N, _super);
|
7
|
+
|
8
|
+
I18N.defaultLocale = "en";
|
9
|
+
|
10
|
+
I18N.useFallback = false;
|
11
|
+
|
12
|
+
I18N.classAccessor('locale', {
|
13
|
+
get: function() {
|
14
|
+
return this.locale || this.get('defaultLocale');
|
15
|
+
},
|
16
|
+
set: function(k, v) {
|
17
|
+
return this.locale = v;
|
18
|
+
},
|
19
|
+
unset: function() {
|
20
|
+
var x;
|
21
|
+
x = this.locale;
|
22
|
+
delete this.locale;
|
23
|
+
return x;
|
24
|
+
}
|
25
|
+
});
|
26
|
+
|
27
|
+
I18N.classAccessor('translations', function() {
|
28
|
+
return this.get("locales." + (this.get('locale')));
|
29
|
+
});
|
30
|
+
|
31
|
+
I18N.classAccessor('defaultTranslations', function() {
|
32
|
+
return this.get("locales." + this.defaultLocale);
|
33
|
+
});
|
34
|
+
|
35
|
+
I18N.translate = function(key, values) {
|
36
|
+
var translation;
|
37
|
+
translation = this.get("translations." + key);
|
38
|
+
if (this.useFallback) {
|
39
|
+
translation || (translation = this.get("defaultTranslations." + key));
|
40
|
+
}
|
41
|
+
if (translation == null) {
|
42
|
+
Batman.developer.warn("Warning, undefined translation " + key + " when in locale " + (this.get('locale')));
|
43
|
+
return "";
|
44
|
+
}
|
45
|
+
if (!values) {
|
46
|
+
return translation;
|
47
|
+
}
|
48
|
+
return Batman.helpers.interpolate(translation, values);
|
49
|
+
};
|
50
|
+
|
51
|
+
I18N.enable = function() {
|
52
|
+
var _this = this;
|
53
|
+
this._oldTranslation = Batman.translate;
|
54
|
+
this.locales.set('en', Batman.translate.messages);
|
55
|
+
return Batman.translate = function() {
|
56
|
+
return _this.translate.apply(_this, arguments);
|
57
|
+
};
|
58
|
+
};
|
59
|
+
|
60
|
+
I18N.disable = function() {
|
61
|
+
return Batman.translate = this._oldTranslation;
|
62
|
+
};
|
63
|
+
|
64
|
+
function I18N() {
|
65
|
+
Batman.developer.error("Can't instantiate i18n!");
|
66
|
+
}
|
67
|
+
|
68
|
+
return I18N;
|
69
|
+
|
70
|
+
})(Batman.Object);
|
71
|
+
|
72
|
+
Batman.I18N.LocalesStorage = (function(_super) {
|
73
|
+
__extends(LocalesStorage, _super);
|
74
|
+
|
75
|
+
function LocalesStorage() {
|
76
|
+
this.isStorage = true;
|
77
|
+
this._storage = {};
|
78
|
+
LocalesStorage.__super__.constructor.apply(this, arguments);
|
79
|
+
}
|
80
|
+
|
81
|
+
LocalesStorage.accessor({
|
82
|
+
get: function(k) {
|
83
|
+
var _this = this;
|
84
|
+
if (!this._storage[k]) {
|
85
|
+
this._storage[k] = {};
|
86
|
+
new Batman.Request({
|
87
|
+
url: "/locales/" + k + ".json",
|
88
|
+
success: function(data) {
|
89
|
+
return _this.set(k, data[k]);
|
90
|
+
},
|
91
|
+
error: function(xhr) {
|
92
|
+
throw new Error("Couldn't load locale file " + k + "!");
|
93
|
+
}
|
94
|
+
});
|
95
|
+
}
|
96
|
+
return this._storage[k];
|
97
|
+
},
|
98
|
+
set: function(k, v) {
|
99
|
+
return this._storage[k] = v;
|
100
|
+
},
|
101
|
+
unset: function(k) {
|
102
|
+
var x;
|
103
|
+
x = this._storage[k];
|
104
|
+
delete this._storage[k];
|
105
|
+
return x;
|
106
|
+
}
|
107
|
+
});
|
108
|
+
|
109
|
+
return LocalesStorage;
|
110
|
+
|
111
|
+
})(Batman.Object);
|
112
|
+
|
113
|
+
Batman.I18N.set('locales', new Batman.I18N.LocalesStorage);
|
114
|
+
|
115
|
+
Batman.Filters.t = Batman.Filters.translate = function(string, interpolationKeypaths, binding) {
|
116
|
+
var translated;
|
117
|
+
if (!binding) {
|
118
|
+
binding = interpolationKeypaths;
|
119
|
+
interpolationKeypaths = void 0;
|
120
|
+
}
|
121
|
+
if (string == null) {
|
122
|
+
return "";
|
123
|
+
}
|
124
|
+
if (!(binding.key && binding.key.substr(0, 2) === "t.")) {
|
125
|
+
translated = Batman.I18N.translate(string);
|
126
|
+
if (translated) {
|
127
|
+
string = translated;
|
128
|
+
}
|
129
|
+
}
|
130
|
+
return Batman.Filters.interpolate.call(this, string, interpolationKeypaths, binding);
|
131
|
+
};
|
132
|
+
|
133
|
+
Batman.config.translations = true;
|
134
|
+
|
135
|
+
}).call(this);
|
136
|
+
|
137
|
+
(function() {
|
138
|
+
|
139
|
+
|
140
|
+
}).call(this);
|
@@ -12,7 +12,7 @@
|
|
12
12
|
})(Batman.Object, mixins, function(){});
|
13
13
|
};
|
14
14
|
|
15
|
-
Batman.version = '0.
|
15
|
+
Batman.version = '0.16.0';
|
16
16
|
|
17
17
|
Batman.config = {
|
18
18
|
pathToApp: '/',
|
@@ -433,6 +433,7 @@
|
|
433
433
|
"<": "<",
|
434
434
|
">": ">",
|
435
435
|
"\"": """,
|
436
|
+
"/": "/",
|
436
437
|
"'": "'"
|
437
438
|
};
|
438
439
|
|
@@ -624,11 +625,11 @@
|
|
624
625
|
}).call(this);
|
625
626
|
|
626
627
|
(function() {
|
627
|
-
var Inflector, camelize_rx,
|
628
|
+
var Inflector, camelize_rx, humanize_rx1, humanize_rx2, humanize_rx3, titleize_rx, underscore_rx1, underscore_rx2;
|
628
629
|
|
629
630
|
camelize_rx = /(?:^|_|\-)(.)/g;
|
630
631
|
|
631
|
-
|
632
|
+
titleize_rx = /(^|\s)([a-z])/g;
|
632
633
|
|
633
634
|
underscore_rx1 = /([A-Z]+)([A-Z][a-z])/g;
|
634
635
|
|
@@ -636,7 +637,7 @@
|
|
636
637
|
|
637
638
|
humanize_rx1 = /_id$/;
|
638
639
|
|
639
|
-
humanize_rx2 = /_
|
640
|
+
humanize_rx2 = /_|-|\./g;
|
640
641
|
|
641
642
|
humanize_rx3 = /^\w/g;
|
642
643
|
|
@@ -675,11 +676,15 @@
|
|
675
676
|
underscore: function(string) {
|
676
677
|
return string.replace(underscore_rx1, '$1_$2').replace(underscore_rx2, '$1_$2').replace('-', '_').toLowerCase();
|
677
678
|
},
|
678
|
-
|
679
|
-
return string.replace(
|
679
|
+
titleize: function(string) {
|
680
|
+
return string.replace(titleize_rx, function(m, p1, p2) {
|
680
681
|
return p1 + p2.toUpperCase();
|
681
682
|
});
|
682
683
|
},
|
684
|
+
capitalize: function(string) {
|
685
|
+
Batman.developer.deprecated('capitalize', 'Renamed to titleize.');
|
686
|
+
return Batman.helpers.titleize(string);
|
687
|
+
},
|
683
688
|
trim: function(string) {
|
684
689
|
if (string) {
|
685
690
|
return string.trim();
|
@@ -709,6 +714,17 @@
|
|
709
714
|
return string.replace(humanize_rx1, '').replace(humanize_rx2, ' ').replace(humanize_rx3, function(match) {
|
710
715
|
return match.toUpperCase();
|
711
716
|
});
|
717
|
+
},
|
718
|
+
toSentence: function(array) {
|
719
|
+
var itemString, last;
|
720
|
+
if (array.length < 3) {
|
721
|
+
return array.join(' and ');
|
722
|
+
} else {
|
723
|
+
last = array.pop();
|
724
|
+
itemString = array.join(', ');
|
725
|
+
itemString += ", and " + last;
|
726
|
+
return itemString;
|
727
|
+
}
|
712
728
|
}
|
713
729
|
};
|
714
730
|
|
@@ -1050,7 +1066,7 @@
|
|
1050
1066
|
};
|
1051
1067
|
|
1052
1068
|
Event.prototype.allowAndFire = function() {
|
1053
|
-
return this.allowAndFireWithContext(this.handlerContext, arguments);
|
1069
|
+
return this.allowAndFireWithContext(this.handlerContext(), arguments);
|
1054
1070
|
};
|
1055
1071
|
|
1056
1072
|
Event.prototype.allowAndFireWithContext = function(context, args) {
|
@@ -1298,7 +1314,7 @@
|
|
1298
1314
|
}
|
1299
1315
|
result = true;
|
1300
1316
|
this.forEach(function() {
|
1301
|
-
return result = result && f.apply(ctx, arguments);
|
1317
|
+
return result = result && !!f.apply(ctx, arguments);
|
1302
1318
|
});
|
1303
1319
|
return result;
|
1304
1320
|
},
|
@@ -1309,7 +1325,7 @@
|
|
1309
1325
|
}
|
1310
1326
|
result = false;
|
1311
1327
|
this.forEach(function() {
|
1312
|
-
return result = result || f.apply(ctx, arguments);
|
1328
|
+
return result = result || !!f.apply(ctx, arguments);
|
1313
1329
|
});
|
1314
1330
|
return result;
|
1315
1331
|
},
|
@@ -1690,7 +1706,24 @@
|
|
1690
1706
|
return obj;
|
1691
1707
|
};
|
1692
1708
|
|
1693
|
-
SimpleHash.prototype.toJSON =
|
1709
|
+
SimpleHash.prototype.toJSON = function() {
|
1710
|
+
var key, obj, objectKey, value, values, _ref, _ref1, _ref2;
|
1711
|
+
obj = {};
|
1712
|
+
_ref = this._storage;
|
1713
|
+
for (key in _ref) {
|
1714
|
+
value = _ref[key];
|
1715
|
+
obj[this.unprefixedKey(key)] = (value != null ? typeof value.toJSON === "function" ? value.toJSON() : void 0 : void 0) || value;
|
1716
|
+
}
|
1717
|
+
if (this._objectStorage) {
|
1718
|
+
_ref1 = this._objectStorage;
|
1719
|
+
for (key in _ref1) {
|
1720
|
+
values = _ref1[key];
|
1721
|
+
_ref2 = values[0], objectKey = _ref2[0], value = _ref2[1];
|
1722
|
+
obj[key] = (value != null ? typeof value.toJSON === "function" ? value.toJSON() : void 0 : void 0) || value;
|
1723
|
+
}
|
1724
|
+
}
|
1725
|
+
return obj;
|
1726
|
+
};
|
1694
1727
|
|
1695
1728
|
return SimpleHash;
|
1696
1729
|
|
@@ -1732,6 +1765,14 @@
|
|
1732
1765
|
return this.get(label);
|
1733
1766
|
};
|
1734
1767
|
|
1768
|
+
AssociationCurator.prototype.getAll = function() {
|
1769
|
+
var allAssociations, typeSets, _ref;
|
1770
|
+
typeSets = this._byTypeStorage.map(function(label, typeSet) {
|
1771
|
+
return typeSet;
|
1772
|
+
});
|
1773
|
+
return allAssociations = (_ref = new Batman.SimpleSet).merge.apply(_ref, typeSets);
|
1774
|
+
};
|
1775
|
+
|
1735
1776
|
AssociationCurator.prototype.reset = function() {
|
1736
1777
|
this.forEach(function(label, association) {
|
1737
1778
|
return association.reset();
|
@@ -1921,6 +1962,14 @@
|
|
1921
1962
|
return merged;
|
1922
1963
|
};
|
1923
1964
|
|
1965
|
+
SimpleSet.prototype.mappedTo = function(key) {
|
1966
|
+
var _this = this;
|
1967
|
+
this._mappings || (this._mappings = new Batman.SimpleHash);
|
1968
|
+
return this._mappings.getOrSet(key, function() {
|
1969
|
+
return new Batman.SetMapping(_this, key);
|
1970
|
+
});
|
1971
|
+
};
|
1972
|
+
|
1924
1973
|
SimpleSet.prototype.indexedBy = function(key) {
|
1925
1974
|
this._indexes || (this._indexes = new Batman.SimpleHash);
|
1926
1975
|
return this._indexes.get(key) || this._indexes.set(key, new Batman.SetIndex(this, key));
|
@@ -2100,6 +2149,8 @@
|
|
2100
2149
|
|
2101
2150
|
Property.prototype.isDead = false;
|
2102
2151
|
|
2152
|
+
Property.prototype.isBatchingChanges = false;
|
2153
|
+
|
2103
2154
|
Property.prototype.registerAsMutableSource = function() {
|
2104
2155
|
return Batman.Property.registerSource(this);
|
2105
2156
|
};
|
@@ -2241,7 +2292,9 @@
|
|
2241
2292
|
|
2242
2293
|
Property.prototype.sourceChangeHandler = function() {
|
2243
2294
|
var _this = this;
|
2244
|
-
this._sourceChangeHandler || (this._sourceChangeHandler =
|
2295
|
+
this._sourceChangeHandler || (this._sourceChangeHandler = function() {
|
2296
|
+
return _this._handleSourceChange();
|
2297
|
+
});
|
2245
2298
|
Batman.developer["do"](function() {
|
2246
2299
|
return _this._sourceChangeHandler.property = _this;
|
2247
2300
|
});
|
@@ -2256,7 +2309,7 @@
|
|
2256
2309
|
} else if (!this.isFinal() && !this.hasObservers()) {
|
2257
2310
|
this.cached = false;
|
2258
2311
|
return this._removeHandlers();
|
2259
|
-
} else {
|
2312
|
+
} else if (!this.isBatchingChanges) {
|
2260
2313
|
return this.refresh();
|
2261
2314
|
}
|
2262
2315
|
};
|
@@ -2750,6 +2803,10 @@
|
|
2750
2803
|
definition.invert = true;
|
2751
2804
|
return new Batman.DOM.InsertionBinding(definition);
|
2752
2805
|
},
|
2806
|
+
deferif: function(definition) {
|
2807
|
+
definition.invert = true;
|
2808
|
+
return new Batman.DOM.DeferredRenderBinding(definition);
|
2809
|
+
},
|
2753
2810
|
renderif: function(definition) {
|
2754
2811
|
return new Batman.DOM.DeferredRenderBinding(definition);
|
2755
2812
|
},
|
@@ -2827,9 +2884,9 @@
|
|
2827
2884
|
__indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
|
2828
2885
|
|
2829
2886
|
Batman.DOM.events = {
|
2830
|
-
|
2887
|
+
primaryInteractionEvent: function(node, callback, view, eventName, preventDefault) {
|
2831
2888
|
if (eventName == null) {
|
2832
|
-
eventName =
|
2889
|
+
eventName = Batman.DOM.primaryInteractionEventName;
|
2833
2890
|
}
|
2834
2891
|
if (preventDefault == null) {
|
2835
2892
|
preventDefault = true;
|
@@ -2853,6 +2910,15 @@
|
|
2853
2910
|
}
|
2854
2911
|
return node;
|
2855
2912
|
},
|
2913
|
+
click: function(node, callback, view, eventName, preventDefault) {
|
2914
|
+
if (eventName == null) {
|
2915
|
+
eventName = 'click';
|
2916
|
+
}
|
2917
|
+
if (preventDefault == null) {
|
2918
|
+
preventDefault = true;
|
2919
|
+
}
|
2920
|
+
return Batman.DOM.events.primaryInteractionEvent(node, callback, view, eventName, preventDefault);
|
2921
|
+
},
|
2856
2922
|
doubleclick: function(node, callback, view) {
|
2857
2923
|
return Batman.DOM.events.click(node, callback, view, 'dblclick');
|
2858
2924
|
},
|
@@ -2943,6 +3009,8 @@
|
|
2943
3009
|
return true;
|
2944
3010
|
};
|
2945
3011
|
|
3012
|
+
Batman.DOM.primaryInteractionEventName = 'click';
|
3013
|
+
|
2946
3014
|
}).call(this);
|
2947
3015
|
|
2948
3016
|
(function() {
|
@@ -3001,6 +3069,13 @@
|
|
3001
3069
|
event: function(definition) {
|
3002
3070
|
return new Batman.DOM.EventBinding(definition);
|
3003
3071
|
},
|
3072
|
+
track: function(definition) {
|
3073
|
+
if (definition.attr === 'view') {
|
3074
|
+
return new Batman.DOM.ViewTrackingBinding(definition);
|
3075
|
+
} else if (definition.attr === 'click') {
|
3076
|
+
return new Batman.DOM.ClickTrackingBinding(definition);
|
3077
|
+
}
|
3078
|
+
},
|
3004
3079
|
addclass: function(definition) {
|
3005
3080
|
return new Batman.DOM.AddClassBinding(definition);
|
3006
3081
|
},
|
@@ -3211,6 +3286,62 @@
|
|
3211
3286
|
return this._batmanID();
|
3212
3287
|
});
|
3213
3288
|
|
3289
|
+
BatmanObject.delegate = function() {
|
3290
|
+
var options, properties, _i,
|
3291
|
+
_this = this;
|
3292
|
+
properties = 2 <= arguments.length ? __slice.call(arguments, 0, _i = arguments.length - 1) : (_i = 0, []), options = arguments[_i++];
|
3293
|
+
if (options == null) {
|
3294
|
+
options = {};
|
3295
|
+
}
|
3296
|
+
if (!options.to) {
|
3297
|
+
Batman.developer.warn('delegate must include to option', this, properties);
|
3298
|
+
}
|
3299
|
+
return properties.forEach(function(property) {
|
3300
|
+
return _this.accessor(property, {
|
3301
|
+
get: function() {
|
3302
|
+
var _ref;
|
3303
|
+
return (_ref = this.get(options.to)) != null ? _ref.get(property) : void 0;
|
3304
|
+
},
|
3305
|
+
set: function(key, value) {
|
3306
|
+
var _ref;
|
3307
|
+
return (_ref = this.get(options.to)) != null ? _ref.set(property, value) : void 0;
|
3308
|
+
},
|
3309
|
+
unset: function() {
|
3310
|
+
var _ref;
|
3311
|
+
return (_ref = this.get(options.to)) != null ? _ref.unset(property) : void 0;
|
3312
|
+
}
|
3313
|
+
});
|
3314
|
+
});
|
3315
|
+
};
|
3316
|
+
|
3317
|
+
BatmanObject.classDelegate = function() {
|
3318
|
+
var options, properties, _i,
|
3319
|
+
_this = this;
|
3320
|
+
properties = 2 <= arguments.length ? __slice.call(arguments, 0, _i = arguments.length - 1) : (_i = 0, []), options = arguments[_i++];
|
3321
|
+
if (options == null) {
|
3322
|
+
options = {};
|
3323
|
+
}
|
3324
|
+
if (!options.to) {
|
3325
|
+
Batman.developer.warn('delegate must include to option', this, properties);
|
3326
|
+
}
|
3327
|
+
return properties.forEach(function(property) {
|
3328
|
+
return _this.classAccessor(property, {
|
3329
|
+
get: function() {
|
3330
|
+
var _ref;
|
3331
|
+
return (_ref = this.get(options.to)) != null ? _ref.get(property) : void 0;
|
3332
|
+
},
|
3333
|
+
set: function(key, value) {
|
3334
|
+
var _ref;
|
3335
|
+
return (_ref = this.get(options.to)) != null ? _ref.set(property, value) : void 0;
|
3336
|
+
},
|
3337
|
+
unset: function() {
|
3338
|
+
var _ref;
|
3339
|
+
return (_ref = this.get(options.to)) != null ? _ref.unset(property) : void 0;
|
3340
|
+
}
|
3341
|
+
});
|
3342
|
+
});
|
3343
|
+
};
|
3344
|
+
|
3214
3345
|
function BatmanObject() {
|
3215
3346
|
var mixins;
|
3216
3347
|
mixins = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
|
@@ -3250,6 +3381,23 @@
|
|
3250
3381
|
return obj;
|
3251
3382
|
};
|
3252
3383
|
|
3384
|
+
BatmanObject.prototype.batchAccessorChanges = function() {
|
3385
|
+
var i, key, properties, property, result, wrappedFunction, _i, _j, _k, _len, _len1;
|
3386
|
+
properties = 2 <= arguments.length ? __slice.call(arguments, 0, _i = arguments.length - 1) : (_i = 0, []), wrappedFunction = arguments[_i++];
|
3387
|
+
for (i = _j = 0, _len = properties.length; _j < _len; i = ++_j) {
|
3388
|
+
key = properties[i];
|
3389
|
+
property = properties[i] = this.property(key);
|
3390
|
+
property.isBatchingChanges = true;
|
3391
|
+
}
|
3392
|
+
result = wrappedFunction.call(this);
|
3393
|
+
for (_k = 0, _len1 = properties.length; _k < _len1; _k++) {
|
3394
|
+
property = properties[_k];
|
3395
|
+
property.isBatchingChanges = false;
|
3396
|
+
property.refresh();
|
3397
|
+
}
|
3398
|
+
return result;
|
3399
|
+
};
|
3400
|
+
|
3253
3401
|
return BatmanObject;
|
3254
3402
|
|
3255
3403
|
})(Object);
|
@@ -3274,7 +3422,7 @@
|
|
3274
3422
|
this.parseTree(this.node);
|
3275
3423
|
}
|
3276
3424
|
|
3277
|
-
bindingSortOrder = ["defineview", "foreach", "renderif", "view", "formfor", "context", "bind", "source", "target"];
|
3425
|
+
bindingSortOrder = ["defineview", "foreach", "renderif", "view", "formfor", "context", "bind", "source", "target", "track", "event"];
|
3278
3426
|
|
3279
3427
|
viewBackedBindings = ["foreach", "renderif", "formfor", "context"];
|
3280
3428
|
|
@@ -3407,7 +3555,7 @@
|
|
3407
3555
|
});
|
3408
3556
|
} else {
|
3409
3557
|
return Batman.t('errors.format', {
|
3410
|
-
attribute: Batman.helpers.humanize(this.attribute),
|
3558
|
+
attribute: Batman.helpers.humanize(Batman.ValidationError.singularizeAssociated(this.attribute)),
|
3411
3559
|
message: this.message
|
3412
3560
|
});
|
3413
3561
|
}
|
@@ -3420,6 +3568,15 @@
|
|
3420
3568
|
});
|
3421
3569
|
}
|
3422
3570
|
|
3571
|
+
ValidationError.singularizeAssociated = function(attribute) {
|
3572
|
+
var i, parts, _i, _ref;
|
3573
|
+
parts = attribute.split(".");
|
3574
|
+
for (i = _i = 0, _ref = parts.length - 1; _i < _ref; i = _i += 1) {
|
3575
|
+
parts[i] = Batman.helpers.singularize(parts[i]);
|
3576
|
+
}
|
3577
|
+
return parts.join(" ");
|
3578
|
+
};
|
3579
|
+
|
3423
3580
|
return ValidationError;
|
3424
3581
|
|
3425
3582
|
})(Batman.Object);
|
@@ -3474,6 +3631,19 @@
|
|
3474
3631
|
|
3475
3632
|
})(StorageAdapter.StorageError);
|
3476
3633
|
|
3634
|
+
StorageAdapter.UnauthorizedError = (function(_super1) {
|
3635
|
+
__extends(UnauthorizedError, _super1);
|
3636
|
+
|
3637
|
+
UnauthorizedError.prototype.name = 'UnauthorizedError';
|
3638
|
+
|
3639
|
+
function UnauthorizedError(message) {
|
3640
|
+
UnauthorizedError.__super__.constructor.call(this, message || "Storage operation denied due to invalid credentials!");
|
3641
|
+
}
|
3642
|
+
|
3643
|
+
return UnauthorizedError;
|
3644
|
+
|
3645
|
+
})(StorageAdapter.StorageError);
|
3646
|
+
|
3477
3647
|
StorageAdapter.NotAllowedError = (function(_super1) {
|
3478
3648
|
__extends(NotAllowedError, _super1);
|
3479
3649
|
|
@@ -3500,6 +3670,19 @@
|
|
3500
3670
|
|
3501
3671
|
})(StorageAdapter.StorageError);
|
3502
3672
|
|
3673
|
+
StorageAdapter.EntityTooLargeError = (function(_super1) {
|
3674
|
+
__extends(EntityTooLargeError, _super1);
|
3675
|
+
|
3676
|
+
EntityTooLargeError.prototype.name = "EntityTooLargeError";
|
3677
|
+
|
3678
|
+
function EntityTooLargeError(message) {
|
3679
|
+
EntityTooLargeError.__super__.constructor.call(this, message || "Storage operation denied due to size constraints!");
|
3680
|
+
}
|
3681
|
+
|
3682
|
+
return EntityTooLargeError;
|
3683
|
+
|
3684
|
+
})(StorageAdapter.StorageError);
|
3685
|
+
|
3503
3686
|
StorageAdapter.UnprocessableRecordError = (function(_super1) {
|
3504
3687
|
__extends(UnprocessableRecordError, _super1);
|
3505
3688
|
|
@@ -3539,6 +3722,19 @@
|
|
3539
3722
|
|
3540
3723
|
})(StorageAdapter.StorageError);
|
3541
3724
|
|
3725
|
+
StorageAdapter.BadGatewayError = (function(_super1) {
|
3726
|
+
__extends(BadGatewayError, _super1);
|
3727
|
+
|
3728
|
+
BadGatewayError.prototype.name = "BadGatewayError";
|
3729
|
+
|
3730
|
+
function BadGatewayError(message) {
|
3731
|
+
BadGatewayError.__super__.constructor.call(this, message || "Storage operation failed due to unavailability of the backend!");
|
3732
|
+
}
|
3733
|
+
|
3734
|
+
return BadGatewayError;
|
3735
|
+
|
3736
|
+
})(StorageAdapter.StorageError);
|
3737
|
+
|
3542
3738
|
function StorageAdapter(model) {
|
3543
3739
|
var constructor;
|
3544
3740
|
StorageAdapter.__super__.constructor.call(this, {
|
@@ -3555,6 +3751,25 @@
|
|
3555
3751
|
|
3556
3752
|
StorageAdapter.prototype.isStorageAdapter = true;
|
3557
3753
|
|
3754
|
+
StorageAdapter.prototype.onlyCertainAttributes = function(json, only) {
|
3755
|
+
var key;
|
3756
|
+
for (key in json) {
|
3757
|
+
if (only.indexOf(key) < 0) {
|
3758
|
+
delete json[key];
|
3759
|
+
}
|
3760
|
+
}
|
3761
|
+
return json;
|
3762
|
+
};
|
3763
|
+
|
3764
|
+
StorageAdapter.prototype.exceptCertainAttributes = function(json, except) {
|
3765
|
+
var key, _i, _len;
|
3766
|
+
for (_i = 0, _len = except.length; _i < _len; _i++) {
|
3767
|
+
key = except[_i];
|
3768
|
+
delete json[key];
|
3769
|
+
}
|
3770
|
+
return json;
|
3771
|
+
};
|
3772
|
+
|
3558
3773
|
StorageAdapter.prototype.storageKey = function(record) {
|
3559
3774
|
var model;
|
3560
3775
|
model = (record != null ? record.constructor : void 0) || this.model;
|
@@ -3565,14 +3780,14 @@
|
|
3565
3780
|
if (constructor == null) {
|
3566
3781
|
constructor = this.model;
|
3567
3782
|
}
|
3568
|
-
return constructor.
|
3783
|
+
return constructor.createFromJSON(attributes);
|
3569
3784
|
};
|
3570
3785
|
|
3571
3786
|
StorageAdapter.prototype.getRecordsFromData = function(attributeSet, constructor) {
|
3572
3787
|
if (constructor == null) {
|
3573
3788
|
constructor = this.model;
|
3574
3789
|
}
|
3575
|
-
return constructor.
|
3790
|
+
return constructor.createMultipleFromJSON(attributeSet);
|
3576
3791
|
};
|
3577
3792
|
|
3578
3793
|
StorageAdapter.skipIfError = function(f) {
|
@@ -3744,7 +3959,7 @@
|
|
3744
3959
|
}
|
3745
3960
|
this.url = function(options) {
|
3746
3961
|
var childSegment, parentID, plural;
|
3747
|
-
childSegment = Batman.helpers.pluralize(this.get('resourceName').toLowerCase());
|
3962
|
+
childSegment = this.storageKey || Batman.helpers.pluralize(this.get('resourceName').toLowerCase());
|
3748
3963
|
for (key in parents) {
|
3749
3964
|
plural = parents[key];
|
3750
3965
|
parentID = options.data[key];
|
@@ -3757,7 +3972,7 @@
|
|
3757
3972
|
};
|
3758
3973
|
return this.prototype.url = function() {
|
3759
3974
|
var childSegment, id, parentID, plural, url;
|
3760
|
-
childSegment = Batman.helpers.pluralize(this.constructor.get('resourceName').toLowerCase());
|
3975
|
+
childSegment = this.constructor.storageKey || Batman.helpers.pluralize(this.constructor.get('resourceName').toLowerCase());
|
3761
3976
|
for (key in parents) {
|
3762
3977
|
plural = parents[key];
|
3763
3978
|
parentID = this.get('dirtyKeys').get(key);
|
@@ -3916,6 +4131,12 @@
|
|
3916
4131
|
RestStorage.prototype.before('create', 'update', RestStorage.skipIfError(function(env, next) {
|
3917
4132
|
var data, json, namespace;
|
3918
4133
|
json = env.subject.toJSON();
|
4134
|
+
if (env.options.only) {
|
4135
|
+
json = this.onlyCertainAttributes(json, env.options.only);
|
4136
|
+
}
|
4137
|
+
if (env.options.except) {
|
4138
|
+
json = this.exceptCertainAttributes(json, env.options.except);
|
4139
|
+
}
|
3919
4140
|
if (namespace = this.recordJsonNamespace(env.subject)) {
|
3920
4141
|
data = {};
|
3921
4142
|
data[namespace] = json;
|
@@ -4033,13 +4254,16 @@
|
|
4033
4254
|
|
4034
4255
|
RestStorage._statusCodeErrors = {
|
4035
4256
|
'0': RestStorage.CommunicationError,
|
4257
|
+
'401': RestStorage.UnauthorizedError,
|
4036
4258
|
'403': RestStorage.NotAllowedError,
|
4037
4259
|
'404': RestStorage.NotFoundError,
|
4038
4260
|
'406': RestStorage.NotAcceptableError,
|
4039
4261
|
'409': RestStorage.RecordExistsError,
|
4262
|
+
'413': RestStorage.EntityTooLargeError,
|
4040
4263
|
'422': RestStorage.UnprocessableRecordError,
|
4041
4264
|
'500': RestStorage.InternalStorageError,
|
4042
|
-
'501': RestStorage.NotImplementedError
|
4265
|
+
'501': RestStorage.NotImplementedError,
|
4266
|
+
'502': RestStorage.BadGatewayError
|
4043
4267
|
};
|
4044
4268
|
|
4045
4269
|
RestStorage.prototype._errorFor = function(error, env) {
|
@@ -4151,7 +4375,15 @@
|
|
4151
4375
|
}));
|
4152
4376
|
|
4153
4377
|
LocalStorage.prototype.before('create', 'update', LocalStorage.skipIfError(function(env, next) {
|
4154
|
-
|
4378
|
+
var json;
|
4379
|
+
json = env.subject.toJSON();
|
4380
|
+
if (env.options.only) {
|
4381
|
+
json = this.onlyCertainAttributes(json, env.options.only);
|
4382
|
+
}
|
4383
|
+
if (env.options.except) {
|
4384
|
+
json = this.exceptCertainAttributes(json, env.options.except);
|
4385
|
+
}
|
4386
|
+
env.recordAttributes = JSON.stringify(json);
|
4155
4387
|
return next();
|
4156
4388
|
}));
|
4157
4389
|
|
@@ -4516,7 +4748,7 @@
|
|
4516
4748
|
return {
|
4517
4749
|
controller: resourceNameFromModel(argument.constructor),
|
4518
4750
|
action: 'show',
|
4519
|
-
id: argument.get('id')
|
4751
|
+
id: (typeof argument.toParam === "function" ? argument.toParam() : void 0) || argument.get('id')
|
4520
4752
|
};
|
4521
4753
|
} else {
|
4522
4754
|
return {};
|
@@ -4542,7 +4774,7 @@
|
|
4542
4774
|
ControllerDirectory.accessor('__app', Batman.Property.defaultAccessor);
|
4543
4775
|
|
4544
4776
|
ControllerDirectory.accessor(function(key) {
|
4545
|
-
return this.get("__app." + (Batman.helpers.
|
4777
|
+
return this.get("__app." + (Batman.helpers.titleize(key)) + "Controller.sharedController");
|
4546
4778
|
});
|
4547
4779
|
|
4548
4780
|
return ControllerDirectory;
|
@@ -4689,7 +4921,9 @@
|
|
4689
4921
|
for (index = _i = 0, _len = matches.length; _i < _len; index = ++_i) {
|
4690
4922
|
match = matches[index];
|
4691
4923
|
name = namedArguments[index];
|
4692
|
-
|
4924
|
+
if (match != null) {
|
4925
|
+
params[name] = decodeURIComponent(match);
|
4926
|
+
}
|
4693
4927
|
}
|
4694
4928
|
return Batman.extend(params, uri.queryParams);
|
4695
4929
|
};
|
@@ -4791,9 +5025,13 @@
|
|
4791
5025
|
|
4792
5026
|
function ControllerActionRoute(templatePath, options) {
|
4793
5027
|
this.callback = __bind(this.callback, this);
|
4794
|
-
var action, controller, _ref;
|
5028
|
+
var action, controller, _ref, _ref1;
|
4795
5029
|
if (options.signature) {
|
4796
|
-
|
5030
|
+
if (Batman.typeOf(options.signature) === 'String') {
|
5031
|
+
_ref = options.signature.split('#'), controller = _ref[0], action = _ref[1];
|
5032
|
+
} else {
|
5033
|
+
_ref1 = options.signature, controller = _ref1.controller, action = _ref1.action;
|
5034
|
+
}
|
4797
5035
|
action || (action = 'index');
|
4798
5036
|
options.controller = controller;
|
4799
5037
|
options.action = action;
|
@@ -5279,6 +5517,9 @@
|
|
5279
5517
|
_results = [];
|
5280
5518
|
for (_i = 0, _len = value.length; _i < _len; _i++) {
|
5281
5519
|
handler = value[_i];
|
5520
|
+
if (typeof handler === 'string') {
|
5521
|
+
handler = _this[handler];
|
5522
|
+
}
|
5282
5523
|
_results.push(handler.call(_this, error));
|
5283
5524
|
}
|
5284
5525
|
return _results;
|
@@ -5379,16 +5620,14 @@
|
|
5379
5620
|
}
|
5380
5621
|
} else {
|
5381
5622
|
if (Batman.typeOf(url) === 'Object') {
|
5382
|
-
|
5383
|
-
url.controller = this;
|
5384
|
-
}
|
5623
|
+
url.controller || (url.controller = this.get('routingKey'));
|
5385
5624
|
}
|
5386
5625
|
return Batman.redirect(url);
|
5387
5626
|
}
|
5388
5627
|
};
|
5389
5628
|
|
5390
5629
|
Controller.prototype.render = function(options) {
|
5391
|
-
var action, frame, view, yieldContentView, yieldName, _ref, _ref1, _ref2, _ref3;
|
5630
|
+
var action, frame, view, yieldContentView, yieldName, _ref, _ref1, _ref2, _ref3, _ref4;
|
5392
5631
|
if (options == null) {
|
5393
5632
|
options = {};
|
5394
5633
|
}
|
@@ -5404,7 +5643,7 @@
|
|
5404
5643
|
options.view = null;
|
5405
5644
|
} else {
|
5406
5645
|
options.viewClass || (options.viewClass = this._viewClassForAction(action));
|
5407
|
-
options.source || (options.source = Batman.helpers.underscore(this.get('routingKey') + '/' + action));
|
5646
|
+
options.source || (options.source = ((_ref1 = options.viewClass) != null ? _ref1.prototype.source : void 0) || Batman.helpers.underscore(this.get('routingKey') + '/' + action));
|
5408
5647
|
view = this.renderCache.viewForOptions(options);
|
5409
5648
|
}
|
5410
5649
|
if (view) {
|
@@ -5421,10 +5660,10 @@
|
|
5421
5660
|
view.set('contentFor', yieldName);
|
5422
5661
|
}
|
5423
5662
|
view.set('controller', this);
|
5424
|
-
if ((
|
5425
|
-
if ((
|
5426
|
-
if ((
|
5427
|
-
|
5663
|
+
if ((_ref2 = Batman.currentApp) != null) {
|
5664
|
+
if ((_ref3 = _ref2.layout) != null) {
|
5665
|
+
if ((_ref4 = _ref3.subviews) != null) {
|
5666
|
+
_ref4.add(view);
|
5428
5667
|
}
|
5429
5668
|
}
|
5430
5669
|
}
|
@@ -5526,7 +5765,7 @@
|
|
5526
5765
|
|
5527
5766
|
Set._applySetAccessors(Set);
|
5528
5767
|
|
5529
|
-
_ref = ['indexedBy', 'indexedByUnique', 'sortedBy', 'equality', '_indexOfItem'];
|
5768
|
+
_ref = ['indexedBy', 'indexedByUnique', 'sortedBy', 'equality', '_indexOfItem', 'mappedTo'];
|
5530
5769
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
5531
5770
|
k = _ref[_i];
|
5532
5771
|
Set.prototype[k] = Batman.SimpleSet.prototype[k];
|
@@ -5544,7 +5783,11 @@
|
|
5544
5783
|
_fn(k);
|
5545
5784
|
}
|
5546
5785
|
|
5547
|
-
Set.prototype.toJSON =
|
5786
|
+
Set.prototype.toJSON = function() {
|
5787
|
+
return this.map(function(value) {
|
5788
|
+
return (typeof value.toJSON === "function" ? value.toJSON() : void 0) || value;
|
5789
|
+
});
|
5790
|
+
};
|
5548
5791
|
|
5549
5792
|
Set.prototype.add = Set.mutation(function() {
|
5550
5793
|
var addedItems;
|
@@ -6005,7 +6248,7 @@
|
|
6005
6248
|
predicateKeys = [];
|
6006
6249
|
definePredicate = function(state) {
|
6007
6250
|
var key;
|
6008
|
-
key = "is" + (Batman.helpers.
|
6251
|
+
key = "is" + (Batman.helpers.titleize(state));
|
6009
6252
|
if (_this.prototype[key] != null) {
|
6010
6253
|
return;
|
6011
6254
|
}
|
@@ -6259,7 +6502,9 @@
|
|
6259
6502
|
if ((matches = validatorClass.matches(optionsOrFunction))) {
|
6260
6503
|
validators.push({
|
6261
6504
|
keys: keys,
|
6262
|
-
validator: new validatorClass(matches)
|
6505
|
+
validator: new validatorClass(matches),
|
6506
|
+
"if": optionsOrFunction["if"],
|
6507
|
+
unless: optionsOrFunction.unless
|
6263
6508
|
});
|
6264
6509
|
}
|
6265
6510
|
}
|
@@ -6333,16 +6578,25 @@
|
|
6333
6578
|
};
|
6334
6579
|
|
6335
6580
|
Model.findWithOptions = function(id, options, callback) {
|
6336
|
-
var record
|
6581
|
+
var record,
|
6582
|
+
_this = this;
|
6337
6583
|
if (options == null) {
|
6338
6584
|
options = {};
|
6339
6585
|
}
|
6340
6586
|
Batman.developer.assert(callback, "Must call find with a callback!");
|
6341
|
-
|
6342
|
-
record.
|
6343
|
-
|
6587
|
+
this._pending || (this._pending = {});
|
6588
|
+
record = this._loadIdentity(id) || this._pending[id];
|
6589
|
+
if (record == null) {
|
6590
|
+
record = new this;
|
6591
|
+
record._withoutDirtyTracking(function() {
|
6592
|
+
return this.set('id', id);
|
6593
|
+
});
|
6594
|
+
this._pending[id] = record;
|
6595
|
+
}
|
6596
|
+
record.loadWithOptions(options, function() {
|
6597
|
+
delete _this._pending[id];
|
6598
|
+
return callback.apply(_this, arguments);
|
6344
6599
|
});
|
6345
|
-
record.loadWithOptions(options, callback);
|
6346
6600
|
return record;
|
6347
6601
|
};
|
6348
6602
|
|
@@ -6400,6 +6654,10 @@
|
|
6400
6654
|
return this._makeOrFindRecordFromData(json);
|
6401
6655
|
};
|
6402
6656
|
|
6657
|
+
Model.createMultipleFromJSON = function(array) {
|
6658
|
+
return this._makeOrFindRecordsFromData(array);
|
6659
|
+
};
|
6660
|
+
|
6403
6661
|
Model._loadIdentity = function(id) {
|
6404
6662
|
return this.get('loaded.indexedByUnique.id').get(id);
|
6405
6663
|
};
|
@@ -6625,10 +6883,7 @@
|
|
6625
6883
|
}
|
6626
6884
|
},
|
6627
6885
|
set: function(key, value) {
|
6628
|
-
var
|
6629
|
-
if ((typeof value === "string") && (value.match(/[^0-9]/) === null) && (("" + (parsedValue = parseInt(value, 10))) === value)) {
|
6630
|
-
value = parsedValue;
|
6631
|
-
}
|
6886
|
+
var primaryKey;
|
6632
6887
|
primaryKey = this.constructor.primaryKey;
|
6633
6888
|
if (primaryKey === 'id') {
|
6634
6889
|
this._willSet(key);
|
@@ -6664,22 +6919,20 @@
|
|
6664
6919
|
Model.prototype.toJSON = function() {
|
6665
6920
|
var encoders, obj,
|
6666
6921
|
_this = this;
|
6667
|
-
obj = {};
|
6668
6922
|
encoders = this._batman.get('encoders');
|
6669
|
-
if (!
|
6670
|
-
|
6671
|
-
var encodedVal, val;
|
6672
|
-
if (encoder.encode) {
|
6673
|
-
val = _this.get(key);
|
6674
|
-
if (typeof val !== 'undefined') {
|
6675
|
-
encodedVal = encoder.encode(val, key, obj, _this);
|
6676
|
-
if (typeof encodedVal !== 'undefined') {
|
6677
|
-
return obj[encoder.as] = encodedVal;
|
6678
|
-
}
|
6679
|
-
}
|
6680
|
-
}
|
6681
|
-
});
|
6923
|
+
if (!encoders || encoders.isEmpty()) {
|
6924
|
+
return {};
|
6682
6925
|
}
|
6926
|
+
obj = {};
|
6927
|
+
encoders.forEach(function(key, encoder) {
|
6928
|
+
var encodedVal, val, _ref2;
|
6929
|
+
if (!encoder.encode || (val = _this.get(key)) === void 0) {
|
6930
|
+
return;
|
6931
|
+
}
|
6932
|
+
if ((encodedVal = encoder.encode(val, key, obj, _this)) !== void 0) {
|
6933
|
+
return obj[(_ref2 = typeof encoder.as === "function" ? encoder.as(key, val, obj, _this) : void 0) != null ? _ref2 : encoder.as] = encodedVal;
|
6934
|
+
}
|
6935
|
+
});
|
6683
6936
|
return obj;
|
6684
6937
|
};
|
6685
6938
|
|
@@ -6697,9 +6950,16 @@
|
|
6697
6950
|
}
|
6698
6951
|
} else {
|
6699
6952
|
encoders.forEach(function(key, encoder) {
|
6700
|
-
|
6701
|
-
|
6953
|
+
var as, _ref2;
|
6954
|
+
if (!encoder.decode) {
|
6955
|
+
return;
|
6956
|
+
}
|
6957
|
+
as = (_ref2 = typeof encoder.as === "function" ? encoder.as(key, data[key], obj, _this) : void 0) != null ? _ref2 : encoder.as;
|
6958
|
+
value = data[as];
|
6959
|
+
if (value === void 0 || (value === null && (_this._associationForAttribute(as) != null))) {
|
6960
|
+
return;
|
6702
6961
|
}
|
6962
|
+
return obj[key] = encoder.decode(value, as, data, obj, _this);
|
6703
6963
|
});
|
6704
6964
|
}
|
6705
6965
|
if (this.constructor.primaryKey !== 'id') {
|
@@ -6785,11 +7045,12 @@
|
|
6785
7045
|
_ref3 = isNew ? ['create', 'create', 'created'] : ['save', 'update', 'saved'], startState = _ref3[0], storageOperation = _ref3[1], endState = _ref3[2];
|
6786
7046
|
if (this.get('lifecycle').startTransition(startState)) {
|
6787
7047
|
return this.validate(function(error, errors) {
|
6788
|
-
var associations;
|
7048
|
+
var associations, payload;
|
6789
7049
|
if (error || errors.length) {
|
6790
7050
|
_this.get('lifecycle').failedValidation();
|
6791
7051
|
return typeof callback === "function" ? callback(error || errors, _this) : void 0;
|
6792
7052
|
}
|
7053
|
+
_this.fire('validated');
|
6793
7054
|
associations = _this.constructor._batman.get('associations');
|
6794
7055
|
_this._withoutDirtyTracking(function() {
|
6795
7056
|
var _ref4,
|
@@ -6798,9 +7059,10 @@
|
|
6798
7059
|
return association.apply(_this);
|
6799
7060
|
}) : void 0 : void 0;
|
6800
7061
|
});
|
6801
|
-
|
7062
|
+
payload = Batman.extend({}, options, {
|
6802
7063
|
data: options
|
6803
|
-
}
|
7064
|
+
});
|
7065
|
+
return _this._doStorageOperation(storageOperation, payload, function(err, record, env) {
|
6804
7066
|
if (!err) {
|
6805
7067
|
_this.get('dirtyKeys').clear();
|
6806
7068
|
_this.get('_dirtiedKeys').clear();
|
@@ -6858,7 +7120,7 @@
|
|
6858
7120
|
};
|
6859
7121
|
|
6860
7122
|
Model.prototype.validate = function(callback) {
|
6861
|
-
var args, count, e, errors, finishedValidation, key, validator, validators, _j, _k, _len1, _len2, _ref2;
|
7123
|
+
var args, condition, count, e, errors, finishedValidation, key, validator, validators, _j, _k, _len1, _len2, _ref2;
|
6862
7124
|
errors = this.get('errors');
|
6863
7125
|
errors.clear();
|
6864
7126
|
validators = this._batman.get('validators') || [];
|
@@ -6878,6 +7140,20 @@
|
|
6878
7140
|
};
|
6879
7141
|
for (_j = 0, _len1 = validators.length; _j < _len1; _j++) {
|
6880
7142
|
validator = validators[_j];
|
7143
|
+
if (validator["if"]) {
|
7144
|
+
condition = typeof validator["if"] === 'string' ? this.get(validator["if"]) : validator["if"].call(this, errors, this, key);
|
7145
|
+
if (!condition) {
|
7146
|
+
finishedValidation();
|
7147
|
+
continue;
|
7148
|
+
}
|
7149
|
+
}
|
7150
|
+
if (validator.unless) {
|
7151
|
+
condition = typeof validator.unless === 'string' ? this.get(validator.unless) : validator.unless.call(this, errors, this, key);
|
7152
|
+
if (condition) {
|
7153
|
+
finishedValidation();
|
7154
|
+
continue;
|
7155
|
+
}
|
7156
|
+
}
|
6881
7157
|
_ref2 = validator.keys;
|
6882
7158
|
for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
|
6883
7159
|
key = _ref2[_k];
|
@@ -6921,6 +7197,11 @@
|
|
6921
7197
|
}
|
6922
7198
|
};
|
6923
7199
|
|
7200
|
+
Model.prototype._associationForAttribute = function(attribute) {
|
7201
|
+
var _ref2;
|
7202
|
+
return (_ref2 = this.constructor._batman.get('associations')) != null ? _ref2.get(attribute) : void 0;
|
7203
|
+
};
|
7204
|
+
|
6924
7205
|
Model.prototype._doStorageOperation = function(operation, options, callback) {
|
6925
7206
|
var adapter,
|
6926
7207
|
_this = this;
|
@@ -6948,6 +7229,74 @@
|
|
6948
7229
|
Model.prototype[functionName] = Batman.Property.wrapTrackingPrevention(Model.prototype[functionName]);
|
6949
7230
|
}
|
6950
7231
|
|
7232
|
+
Model.prototype.reflectOnAllAssociations = function(associationType) {
|
7233
|
+
var associations;
|
7234
|
+
associations = this.constructor._batman.get('associations');
|
7235
|
+
if (associationType != null) {
|
7236
|
+
return associations != null ? associations.getByType(associationType) : void 0;
|
7237
|
+
} else {
|
7238
|
+
return associations != null ? associations.getAll() : void 0;
|
7239
|
+
}
|
7240
|
+
};
|
7241
|
+
|
7242
|
+
Model.prototype.reflectOnAssociation = function(associationLabel) {
|
7243
|
+
var _ref3;
|
7244
|
+
return (_ref3 = this.constructor._batman.get('associations')) != null ? _ref3.getByLabel(associationLabel) : void 0;
|
7245
|
+
};
|
7246
|
+
|
7247
|
+
Model.prototype.transaction = function() {
|
7248
|
+
return this._transaction([], []);
|
7249
|
+
};
|
7250
|
+
|
7251
|
+
Model.prototype._transaction = function(visited, stack) {
|
7252
|
+
var attributes, hasManys, index, key, label, newValues, transaction, value, _k, _len2, _ref3, _ref4;
|
7253
|
+
index = visited.indexOf(this);
|
7254
|
+
if (index !== -1) {
|
7255
|
+
return stack[index];
|
7256
|
+
}
|
7257
|
+
visited.push(this);
|
7258
|
+
stack.push(transaction = new this.constructor);
|
7259
|
+
if (hasManys = this.reflectOnAllAssociations('hasMany')) {
|
7260
|
+
hasManys = hasManys.filter(function(association) {
|
7261
|
+
return association.options.includeInTransaction;
|
7262
|
+
});
|
7263
|
+
_ref3 = hasManys.mapToProperty('label');
|
7264
|
+
for (_k = 0, _len2 = _ref3.length; _k < _len2; _k++) {
|
7265
|
+
label = _ref3[_k];
|
7266
|
+
this.get(label);
|
7267
|
+
}
|
7268
|
+
}
|
7269
|
+
attributes = this.get('attributes').toObject();
|
7270
|
+
for (key in attributes) {
|
7271
|
+
if (!__hasProp.call(attributes, key)) continue;
|
7272
|
+
value = attributes[key];
|
7273
|
+
if (value instanceof Batman.Model && !value.isTransaction) {
|
7274
|
+
attributes[key] = value._transaction(visited, stack);
|
7275
|
+
} else if (value instanceof Batman.AssociationSet && !value.isTransaction) {
|
7276
|
+
newValues = new Batman.TransactionAssociationSet(value, visited, stack);
|
7277
|
+
attributes[key] = newValues;
|
7278
|
+
} else if (Batman.typeOf(value) === 'Object') {
|
7279
|
+
Batman.developer.warn("You're passing a mutable object (" + key + ", " + value.constructor.name + ") in a " + this.constructor.name + " transaction:", value);
|
7280
|
+
}
|
7281
|
+
}
|
7282
|
+
transaction._withoutDirtyTracking(function() {
|
7283
|
+
return transaction.updateAttributes(attributes);
|
7284
|
+
});
|
7285
|
+
transaction._batman.base = this;
|
7286
|
+
_ref4 = Batman.Transaction;
|
7287
|
+
for (key in _ref4) {
|
7288
|
+
value = _ref4[key];
|
7289
|
+
transaction[key] = value;
|
7290
|
+
}
|
7291
|
+
transaction.accessor('isTransaction', function() {
|
7292
|
+
return this.isTransaction;
|
7293
|
+
});
|
7294
|
+
transaction.accessor('base', function() {
|
7295
|
+
return this.base();
|
7296
|
+
});
|
7297
|
+
return transaction;
|
7298
|
+
};
|
7299
|
+
|
6951
7300
|
return Model;
|
6952
7301
|
|
6953
7302
|
}).call(this, Batman.Object);
|
@@ -6964,7 +7313,7 @@
|
|
6964
7313
|
var collection, _base;
|
6965
7314
|
Batman.initializeObject(this);
|
6966
7315
|
collection = (_base = this._batman).associations || (_base.associations = new Batman.AssociationCurator(this));
|
6967
|
-
return collection.add(new Batman["" + (Batman.helpers.
|
7316
|
+
return collection.add(new Batman["" + (Batman.helpers.titleize(k)) + "Association"](this, label, scope));
|
6968
7317
|
};
|
6969
7318
|
};
|
6970
7319
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
@@ -7131,11 +7480,8 @@
|
|
7131
7480
|
loadOptions.urlContext = this.model;
|
7132
7481
|
}
|
7133
7482
|
return this.association.getRelatedModel().loadWithOptions(loadOptions, function(error, loadedRecords) {
|
7134
|
-
if (error) {
|
7135
|
-
throw error;
|
7136
|
-
}
|
7137
7483
|
if (!loadedRecords || loadedRecords.length <= 0) {
|
7138
|
-
return callback(new Error("Couldn't find related record!"), void 0);
|
7484
|
+
return callback(error || new Error("Couldn't find related record!"), void 0);
|
7139
7485
|
} else {
|
7140
7486
|
return callback(void 0, loadedRecords[0]);
|
7141
7487
|
}
|
@@ -7170,18 +7516,12 @@
|
|
7170
7516
|
};
|
7171
7517
|
|
7172
7518
|
BelongsToProxy.prototype.fetchFromRemote = function(callback) {
|
7173
|
-
var loadOptions
|
7174
|
-
_this = this;
|
7519
|
+
var loadOptions;
|
7175
7520
|
loadOptions = {};
|
7176
7521
|
if (this.association.options.url) {
|
7177
7522
|
loadOptions.recordUrl = this.association.options.url;
|
7178
7523
|
}
|
7179
|
-
return this.association.getRelatedModel().findWithOptions(this.get('foreignValue'), loadOptions,
|
7180
|
-
if (error) {
|
7181
|
-
throw error;
|
7182
|
-
}
|
7183
|
-
return callback(void 0, loadedRecord);
|
7184
|
-
});
|
7524
|
+
return this.association.getRelatedModel().findWithOptions(this.get('foreignValue'), loadOptions, callback);
|
7185
7525
|
};
|
7186
7526
|
|
7187
7527
|
return BelongsToProxy;
|
@@ -7212,18 +7552,12 @@
|
|
7212
7552
|
};
|
7213
7553
|
|
7214
7554
|
PolymorphicBelongsToProxy.prototype.fetchFromRemote = function(callback) {
|
7215
|
-
var loadOptions
|
7216
|
-
_this = this;
|
7555
|
+
var loadOptions;
|
7217
7556
|
loadOptions = {};
|
7218
7557
|
if (this.association.options.url) {
|
7219
7558
|
loadOptions.recordUrl = this.association.options.url;
|
7220
7559
|
}
|
7221
|
-
return this.association.getRelatedModelForType(this.get('foreignTypeValue')).findWithOptions(this.get('foreignValue'), loadOptions,
|
7222
|
-
if (error) {
|
7223
|
-
throw error;
|
7224
|
-
}
|
7225
|
-
return callback(void 0, loadedRecord);
|
7226
|
-
});
|
7560
|
+
return this.association.getRelatedModelForType(this.get('foreignTypeValue')).findWithOptions(this.get('foreignValue'), loadOptions, callback);
|
7227
7561
|
};
|
7228
7562
|
|
7229
7563
|
return PolymorphicBelongsToProxy;
|
@@ -7599,10 +7933,24 @@
|
|
7599
7933
|
}
|
7600
7934
|
}
|
7601
7935
|
|
7602
|
-
Request.prototype.send = function() {
|
7603
|
-
return Batman.developer.error("
|
7936
|
+
Request.prototype.send = function(data) {
|
7937
|
+
return Batman.developer.error("You must add a platform library to implement Batman.Request (for example, batman.jquery)");
|
7604
7938
|
};
|
7605
7939
|
|
7940
|
+
Request.set('pendingRequestCount', 0);
|
7941
|
+
|
7942
|
+
Request.classAccessor('requestIsPending', function() {
|
7943
|
+
return this.get('pendingRequestCount') > 0;
|
7944
|
+
});
|
7945
|
+
|
7946
|
+
Request.prototype.on('loading', function() {
|
7947
|
+
return Batman.Request.set('pendingRequestCount', Batman.Request.get('pendingRequestCount') + 1);
|
7948
|
+
});
|
7949
|
+
|
7950
|
+
Request.prototype.on('loaded', function() {
|
7951
|
+
return Batman.Request.set('pendingRequestCount', Batman.Request.get('pendingRequestCount') - 1);
|
7952
|
+
});
|
7953
|
+
|
7606
7954
|
return Request;
|
7607
7955
|
|
7608
7956
|
})(Batman.Object);
|
@@ -7675,7 +8023,7 @@
|
|
7675
8023
|
|
7676
8024
|
SetObserver.prototype._manageObserversForItem = function(item, method) {
|
7677
8025
|
var key, _i, _len, _ref;
|
7678
|
-
if (item.isObservable) {
|
8026
|
+
if (item != null ? item.isObservable : void 0) {
|
7679
8027
|
_ref = this.observedItemKeys;
|
7680
8028
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
7681
8029
|
key = _ref[_i];
|
@@ -8003,16 +8351,23 @@
|
|
8003
8351
|
|
8004
8352
|
AssociationSet.accessor('loaded', Batman.Property.defaultAccessor);
|
8005
8353
|
|
8006
|
-
AssociationSet.prototype.load = function(callback) {
|
8007
|
-
var
|
8354
|
+
AssociationSet.prototype.load = function(options, callback) {
|
8355
|
+
var loadOptions,
|
8356
|
+
_this = this;
|
8357
|
+
loadOptions = this._getLoadOptions();
|
8358
|
+
if (!callback) {
|
8359
|
+
callback = options;
|
8360
|
+
} else {
|
8361
|
+
loadOptions.data = Batman.extend(loadOptions.data, options);
|
8362
|
+
}
|
8008
8363
|
if (this.foreignKeyValue == null) {
|
8009
8364
|
return callback(void 0, this);
|
8010
8365
|
}
|
8011
|
-
return this.association.getRelatedModel().loadWithOptions(
|
8366
|
+
return this.association.getRelatedModel().loadWithOptions(loadOptions, function(err, records, env) {
|
8012
8367
|
if (!err) {
|
8013
8368
|
_this.markAsLoaded();
|
8014
8369
|
}
|
8015
|
-
return callback(err, _this);
|
8370
|
+
return callback(err, _this, env);
|
8016
8371
|
});
|
8017
8372
|
};
|
8018
8373
|
|
@@ -8034,6 +8389,35 @@
|
|
8034
8389
|
return this.fire('loaded');
|
8035
8390
|
};
|
8036
8391
|
|
8392
|
+
AssociationSet.accessor('parentRecord', function() {
|
8393
|
+
var parentClass, parentPrimaryKey, parentPrimaryKeyValue, query;
|
8394
|
+
parentClass = this.get('association.model');
|
8395
|
+
parentPrimaryKey = parentClass.get('primaryKey');
|
8396
|
+
parentPrimaryKeyValue = this.get('foreignKeyValue');
|
8397
|
+
query = {};
|
8398
|
+
query[parentPrimaryKey] = parentPrimaryKeyValue;
|
8399
|
+
return parentClass.createFromJSON(query);
|
8400
|
+
});
|
8401
|
+
|
8402
|
+
AssociationSet.prototype.build = function(attrs) {
|
8403
|
+
var associatedClass, initParams, mixedAttrs, newObj, options, scope;
|
8404
|
+
if (attrs == null) {
|
8405
|
+
attrs = {};
|
8406
|
+
}
|
8407
|
+
initParams = {};
|
8408
|
+
initParams[this.get('association.foreignKey')] = this.get('foreignKeyValue');
|
8409
|
+
options = this.get('association.options');
|
8410
|
+
if (options.inverseOf != null) {
|
8411
|
+
initParams[options.inverseOf] = this.get('parentRecord');
|
8412
|
+
}
|
8413
|
+
scope = options.namespace || Batman.currentApp;
|
8414
|
+
associatedClass = scope[options.name];
|
8415
|
+
mixedAttrs = Batman.extend(attrs, initParams);
|
8416
|
+
newObj = new associatedClass(mixedAttrs);
|
8417
|
+
this.add(newObj);
|
8418
|
+
return newObj;
|
8419
|
+
};
|
8420
|
+
|
8037
8421
|
return AssociationSet;
|
8038
8422
|
|
8039
8423
|
})(Batman.SetSort);
|
@@ -8074,6 +8458,107 @@
|
|
8074
8458
|
|
8075
8459
|
}).call(this);
|
8076
8460
|
|
8461
|
+
(function() {
|
8462
|
+
var __hasProp = {}.hasOwnProperty,
|
8463
|
+
__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; };
|
8464
|
+
|
8465
|
+
Batman.SetMapping = (function(_super) {
|
8466
|
+
__extends(SetMapping, _super);
|
8467
|
+
|
8468
|
+
function SetMapping(base, key) {
|
8469
|
+
var initialValues,
|
8470
|
+
_this = this;
|
8471
|
+
this.base = base;
|
8472
|
+
this.key = key;
|
8473
|
+
initialValues = this.base.mapToProperty(this.key);
|
8474
|
+
this._counter = new this.constructor.PresenceCounter(initialValues);
|
8475
|
+
SetMapping.__super__.constructor.apply(this, initialValues);
|
8476
|
+
this._setObserver = new Batman.SetObserver(this.base);
|
8477
|
+
this._setObserver.observedItemKeys = [this.key];
|
8478
|
+
this._setObserver.observerForItemAndKey = function(item) {
|
8479
|
+
return function(newValue, oldValue) {
|
8480
|
+
return _this._handleItemModified(item, newValue, oldValue);
|
8481
|
+
};
|
8482
|
+
};
|
8483
|
+
this._setObserver.on('itemsWereAdded', this._handleItemsAdded.bind(this));
|
8484
|
+
this._setObserver.on('itemsWereRemoved', this._handleItemsRemoved.bind(this));
|
8485
|
+
this._setObserver.startObserving();
|
8486
|
+
}
|
8487
|
+
|
8488
|
+
SetMapping.prototype._handleItemsAdded = function(items, indexes) {
|
8489
|
+
var item, _i, _len, _results;
|
8490
|
+
_results = [];
|
8491
|
+
for (_i = 0, _len = items.length; _i < _len; _i++) {
|
8492
|
+
item = items[_i];
|
8493
|
+
_results.push(this._addValueInstance(item.get(this.key)));
|
8494
|
+
}
|
8495
|
+
return _results;
|
8496
|
+
};
|
8497
|
+
|
8498
|
+
SetMapping.prototype._handleItemsRemoved = function(items, indexes) {
|
8499
|
+
var item, _i, _len, _results;
|
8500
|
+
_results = [];
|
8501
|
+
for (_i = 0, _len = items.length; _i < _len; _i++) {
|
8502
|
+
item = items[_i];
|
8503
|
+
_results.push(this._removeValueInstance(item.get(this.key)));
|
8504
|
+
}
|
8505
|
+
return _results;
|
8506
|
+
};
|
8507
|
+
|
8508
|
+
SetMapping.prototype._handleItemModified = function(item, newValue, oldValue) {
|
8509
|
+
this._removeValueInstance(oldValue);
|
8510
|
+
return this._addValueInstance(newValue);
|
8511
|
+
};
|
8512
|
+
|
8513
|
+
SetMapping.prototype._addValueInstance = function(mappedValue) {
|
8514
|
+
this._counter.increment(mappedValue);
|
8515
|
+
return this.add(mappedValue);
|
8516
|
+
};
|
8517
|
+
|
8518
|
+
SetMapping.prototype._removeValueInstance = function(mappedValue) {
|
8519
|
+
var remaining;
|
8520
|
+
remaining = this._counter.decrement(mappedValue);
|
8521
|
+
if (remaining === 0) {
|
8522
|
+
return this.remove(mappedValue);
|
8523
|
+
}
|
8524
|
+
};
|
8525
|
+
|
8526
|
+
return SetMapping;
|
8527
|
+
|
8528
|
+
})(Batman.Set);
|
8529
|
+
|
8530
|
+
Batman.SetMapping.PresenceCounter = (function() {
|
8531
|
+
function PresenceCounter(initialValues) {
|
8532
|
+
var value, _i, _len;
|
8533
|
+
this._storage = new Batman.SimpleHash;
|
8534
|
+
for (_i = 0, _len = initialValues.length; _i < _len; _i++) {
|
8535
|
+
value = initialValues[_i];
|
8536
|
+
this.increment(value);
|
8537
|
+
}
|
8538
|
+
}
|
8539
|
+
|
8540
|
+
PresenceCounter.prototype.increment = function(value) {
|
8541
|
+
var count;
|
8542
|
+
count = this._storage.get(value);
|
8543
|
+
if (!count) {
|
8544
|
+
return this._storage.set(value, 1);
|
8545
|
+
} else {
|
8546
|
+
return this._storage.set(value, count + 1);
|
8547
|
+
}
|
8548
|
+
};
|
8549
|
+
|
8550
|
+
PresenceCounter.prototype.decrement = function(value) {
|
8551
|
+
var count;
|
8552
|
+
count = this._storage.get(value);
|
8553
|
+
return this._storage.set(value, count - 1);
|
8554
|
+
};
|
8555
|
+
|
8556
|
+
return PresenceCounter;
|
8557
|
+
|
8558
|
+
})();
|
8559
|
+
|
8560
|
+
}).call(this);
|
8561
|
+
|
8077
8562
|
(function() {
|
8078
8563
|
var __hasProp = {}.hasOwnProperty,
|
8079
8564
|
__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; };
|
@@ -8944,6 +9429,9 @@
|
|
8944
9429
|
};
|
8945
9430
|
|
8946
9431
|
RouteMapBuilder.prototype.root = function(signature, options) {
|
9432
|
+
if (options == null) {
|
9433
|
+
options = {};
|
9434
|
+
}
|
8947
9435
|
return this.route('/', signature, options);
|
8948
9436
|
};
|
8949
9437
|
|
@@ -9018,7 +9506,10 @@
|
|
9018
9506
|
klass = options.callback ? Batman.CallbackActionRoute : Batman.ControllerActionRoute;
|
9019
9507
|
options.app = this.app;
|
9020
9508
|
route = new klass(path, options);
|
9021
|
-
|
9509
|
+
this.routeMap.addRoute(name, route);
|
9510
|
+
if (name === '') {
|
9511
|
+
return this.routeMap.addRoute('root', route);
|
9512
|
+
}
|
9022
9513
|
};
|
9023
9514
|
|
9024
9515
|
RouteMapBuilder.prototype._nameFromPath = function(path) {
|
@@ -9248,9 +9739,10 @@
|
|
9248
9739
|
Association.prototype.isPolymorphic = false;
|
9249
9740
|
|
9250
9741
|
Association.prototype.defaultOptions = {
|
9251
|
-
saveInline:
|
9742
|
+
saveInline: false,
|
9252
9743
|
autoload: true,
|
9253
|
-
nestUrl: false
|
9744
|
+
nestUrl: false,
|
9745
|
+
includeInTransaction: true
|
9254
9746
|
};
|
9255
9747
|
|
9256
9748
|
function Association(model, label, options) {
|
@@ -9626,7 +10118,7 @@
|
|
9626
10118
|
}
|
9627
10119
|
Batman.developer["do"](function() {
|
9628
10120
|
if ((Batman.currentApp != null) && !relatedModel) {
|
9629
|
-
return Batman.developer.warn("Related model " + type + " for polymorphic association not found.");
|
10121
|
+
return Batman.developer.warn("Related model " + type + " for hasMany polymorphic association " + this.label + " not found.");
|
9630
10122
|
}
|
9631
10123
|
});
|
9632
10124
|
return relatedModel;
|
@@ -9729,21 +10221,13 @@
|
|
9729
10221
|
SingularAssociation.prototype.isSingular = true;
|
9730
10222
|
|
9731
10223
|
SingularAssociation.prototype.getAccessor = function(association, model, label) {
|
9732
|
-
var proxy, record, recordInAttributes
|
9733
|
-
_this = this;
|
10224
|
+
var proxy, record, recordInAttributes;
|
9734
10225
|
if (recordInAttributes = association.getFromAttributes(this)) {
|
9735
10226
|
return recordInAttributes;
|
9736
10227
|
}
|
9737
10228
|
if (association.getRelatedModel()) {
|
9738
10229
|
proxy = this.associationProxy(association);
|
9739
10230
|
record = false;
|
9740
|
-
if (proxy._loadSetter == null) {
|
9741
|
-
proxy._loadSetter = proxy.once('loaded', function(child) {
|
9742
|
-
return _this._withoutDirtyTracking(function() {
|
9743
|
-
return this.set(association.label, child);
|
9744
|
-
});
|
9745
|
-
});
|
9746
|
-
}
|
9747
10231
|
if (!Batman.Property.withoutTracking(function() {
|
9748
10232
|
return proxy.get('loaded');
|
9749
10233
|
})) {
|
@@ -9935,7 +10419,7 @@
|
|
9935
10419
|
if (this.options.encodeForeignTypeKey) {
|
9936
10420
|
this.model.encode(this.foreignTypeKey);
|
9937
10421
|
}
|
9938
|
-
this.
|
10422
|
+
this.typeIndices = {};
|
9939
10423
|
}
|
9940
10424
|
|
9941
10425
|
PolymorphicBelongsToAssociation.prototype.getRelatedModel = false;
|
@@ -9990,7 +10474,7 @@
|
|
9990
10474
|
}
|
9991
10475
|
Batman.developer["do"](function() {
|
9992
10476
|
if ((Batman.currentApp != null) && !relatedModel) {
|
9993
|
-
return Batman.developer.warn("Related model " + type + " for polymorphic association not found.");
|
10477
|
+
return Batman.developer.warn("Related model " + type + " for belongsTo polymorphic association " + this.label + " not found.");
|
9994
10478
|
}
|
9995
10479
|
});
|
9996
10480
|
return relatedModel;
|
@@ -9998,8 +10482,8 @@
|
|
9998
10482
|
|
9999
10483
|
PolymorphicBelongsToAssociation.prototype.setIndexForType = function(type) {
|
10000
10484
|
var _base;
|
10001
|
-
(_base = this.
|
10002
|
-
return this.
|
10485
|
+
(_base = this.typeIndices)[type] || (_base[type] = new Batman.PolymorphicUniqueAssociationSetIndex(this, type, this.primaryKey));
|
10486
|
+
return this.typeIndices[type];
|
10003
10487
|
};
|
10004
10488
|
|
10005
10489
|
PolymorphicBelongsToAssociation.prototype.inverseForType = function(type) {
|
@@ -10049,9 +10533,193 @@
|
|
10049
10533
|
}).call(this);
|
10050
10534
|
|
10051
10535
|
(function() {
|
10052
|
-
var __hasProp = {}.hasOwnProperty
|
10053
|
-
|
10054
|
-
|
10536
|
+
var __hasProp = {}.hasOwnProperty;
|
10537
|
+
|
10538
|
+
Batman.Transaction = {
|
10539
|
+
isTransaction: true,
|
10540
|
+
base: function() {
|
10541
|
+
return this._batman.base;
|
10542
|
+
},
|
10543
|
+
applyChanges: function(visited) {
|
10544
|
+
var attributes, base, key, updatedAssociationSet, value, _ref;
|
10545
|
+
if (visited == null) {
|
10546
|
+
visited = [];
|
10547
|
+
}
|
10548
|
+
if (visited.indexOf(this) !== -1) {
|
10549
|
+
return this.base();
|
10550
|
+
}
|
10551
|
+
visited.push(this);
|
10552
|
+
attributes = this.get('attributes').toObject();
|
10553
|
+
for (key in attributes) {
|
10554
|
+
if (!__hasProp.call(attributes, key)) continue;
|
10555
|
+
value = attributes[key];
|
10556
|
+
if (value instanceof Batman.Model && value.isTransaction) {
|
10557
|
+
value.applyChanges(visited);
|
10558
|
+
delete attributes[key];
|
10559
|
+
} else if (value instanceof Batman.TransactionAssociationSet) {
|
10560
|
+
updatedAssociationSet = value.applyChanges(visited);
|
10561
|
+
attributes[key] = updatedAssociationSet;
|
10562
|
+
}
|
10563
|
+
}
|
10564
|
+
base = this.base();
|
10565
|
+
base.mixin(attributes);
|
10566
|
+
return (_ref = typeof base.applyChanges === "function" ? base.applyChanges() : void 0) != null ? _ref : base;
|
10567
|
+
},
|
10568
|
+
save: function(options, callback) {
|
10569
|
+
var finish, validated, _ref,
|
10570
|
+
_this = this;
|
10571
|
+
if (!callback) {
|
10572
|
+
_ref = [{}, options], options = _ref[0], callback = _ref[1];
|
10573
|
+
}
|
10574
|
+
this.once('validated', validated = function() {
|
10575
|
+
return _this.applyChanges();
|
10576
|
+
});
|
10577
|
+
finish = function() {
|
10578
|
+
_this.off('validated', validated);
|
10579
|
+
return typeof callback === "function" ? callback.apply(null, arguments) : void 0;
|
10580
|
+
};
|
10581
|
+
return this.constructor.prototype.save.call(this, options, function(err, result) {
|
10582
|
+
if (!err) {
|
10583
|
+
result = _this.base();
|
10584
|
+
result.get('dirtyKeys').clear();
|
10585
|
+
result.get('_dirtiedKeys').clear();
|
10586
|
+
result.get('lifecycle').startTransition('save');
|
10587
|
+
result.get('lifecycle').startTransition('saved');
|
10588
|
+
}
|
10589
|
+
return finish(err, result);
|
10590
|
+
});
|
10591
|
+
}
|
10592
|
+
};
|
10593
|
+
|
10594
|
+
}).call(this);
|
10595
|
+
|
10596
|
+
(function() {
|
10597
|
+
var __hasProp = {}.hasOwnProperty,
|
10598
|
+
__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; },
|
10599
|
+
__slice = [].slice;
|
10600
|
+
|
10601
|
+
Batman.TransactionAssociationSet = (function(_super) {
|
10602
|
+
__extends(TransactionAssociationSet, _super);
|
10603
|
+
|
10604
|
+
TransactionAssociationSet.prototype.isTransaction = true;
|
10605
|
+
|
10606
|
+
function TransactionAssociationSet(associationSet, visited, stack) {
|
10607
|
+
this.set('associationSet', associationSet);
|
10608
|
+
this._loader = this._addFromAssociationSet.bind(this);
|
10609
|
+
associationSet.on('itemsWereAdded', this._loader);
|
10610
|
+
this._visited = visited;
|
10611
|
+
this._stack = stack;
|
10612
|
+
this._storage = [];
|
10613
|
+
this._originalStorage = [];
|
10614
|
+
this._removedStorage = [];
|
10615
|
+
this.add.apply(this, associationSet.toArray());
|
10616
|
+
}
|
10617
|
+
|
10618
|
+
TransactionAssociationSet.delegate('association', 'foreignKeyValue', {
|
10619
|
+
to: 'associationSet'
|
10620
|
+
});
|
10621
|
+
|
10622
|
+
TransactionAssociationSet.prototype._addFromAssociationSet = function(items, indexes) {
|
10623
|
+
return this.add.apply(this, items);
|
10624
|
+
};
|
10625
|
+
|
10626
|
+
TransactionAssociationSet.prototype.add = TransactionAssociationSet.mutation(function() {
|
10627
|
+
var addedTransactions, item, items, originalIndex, removedIndex, transactionItem, _i, _len;
|
10628
|
+
items = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
|
10629
|
+
addedTransactions = [];
|
10630
|
+
for (_i = 0, _len = items.length; _i < _len; _i++) {
|
10631
|
+
item = items[_i];
|
10632
|
+
if (!(item instanceof Batman.Model && !item.isTransaction)) {
|
10633
|
+
Batman.developer.warn("You tried to add a " + item.constructor.name + " to a TransactionAssociationSet (" + (this.get('association.label')) + ")", item);
|
10634
|
+
continue;
|
10635
|
+
}
|
10636
|
+
transactionItem = item._transaction(this._visited, this._stack);
|
10637
|
+
this._storage.push(transactionItem);
|
10638
|
+
addedTransactions.push(transactionItem);
|
10639
|
+
originalIndex = this._originalStorage.indexOf(item);
|
10640
|
+
if (originalIndex === -1) {
|
10641
|
+
this._originalStorage.push(item);
|
10642
|
+
}
|
10643
|
+
removedIndex = this._removedStorage.indexOf(item);
|
10644
|
+
if (removedIndex > -1) {
|
10645
|
+
this._removedStorage.splice(removedIndex, 1);
|
10646
|
+
}
|
10647
|
+
}
|
10648
|
+
this.length = this._storage.length;
|
10649
|
+
if (addedTransactions.length) {
|
10650
|
+
this.fire('itemsWereAdded', addedTransactions);
|
10651
|
+
}
|
10652
|
+
return addedTransactions;
|
10653
|
+
});
|
10654
|
+
|
10655
|
+
TransactionAssociationSet.prototype.remove = TransactionAssociationSet.mutation(function() {
|
10656
|
+
var item, originalIndex, removedTransactions, transactionIndex, transactionItem, transactions, _i, _len;
|
10657
|
+
transactions = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
|
10658
|
+
removedTransactions = [];
|
10659
|
+
for (_i = 0, _len = transactions.length; _i < _len; _i++) {
|
10660
|
+
transactionItem = transactions[_i];
|
10661
|
+
if (!transactionItem.isTransaction) {
|
10662
|
+
throw "Tried to remove real item from transaction set: " + (t.toJSON());
|
10663
|
+
}
|
10664
|
+
transactionIndex = this._storage.indexOf(transactionItem);
|
10665
|
+
if (transactionIndex > -1) {
|
10666
|
+
this._storage.splice(transactionIndex, 1);
|
10667
|
+
removedTransactions.push(transactionItem);
|
10668
|
+
}
|
10669
|
+
item = transactionItem.base();
|
10670
|
+
originalIndex = this._originalStorage.indexOf(item);
|
10671
|
+
if (originalIndex > -1) {
|
10672
|
+
this._removedStorage.push(item);
|
10673
|
+
this._originalStorage.splice(originalIndex, 1);
|
10674
|
+
}
|
10675
|
+
}
|
10676
|
+
this.length = this._storage.length;
|
10677
|
+
if (removedTransactions.length) {
|
10678
|
+
this.fire('itemsWereRemoved', removedTransactions);
|
10679
|
+
}
|
10680
|
+
return removedTransactions;
|
10681
|
+
});
|
10682
|
+
|
10683
|
+
TransactionAssociationSet.prototype.applyChanges = function(visited) {
|
10684
|
+
var originals, target, transactionItem, _i, _len, _ref;
|
10685
|
+
_ref = this._storage;
|
10686
|
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
10687
|
+
transactionItem = _ref[_i];
|
10688
|
+
transactionItem.applyChanges(visited);
|
10689
|
+
}
|
10690
|
+
originals = (function(func, args, ctor) {
|
10691
|
+
ctor.prototype = func.prototype;
|
10692
|
+
var child = new ctor, result = func.apply(child, args);
|
10693
|
+
return Object(result) === result ? result : child;
|
10694
|
+
})(Batman.Set, this._originalStorage, function(){});
|
10695
|
+
target = this.get('associationSet');
|
10696
|
+
target.off('itemsWereAdded', this._loader);
|
10697
|
+
target.replace(originals);
|
10698
|
+
target.set('removedItems', (function(func, args, ctor) {
|
10699
|
+
ctor.prototype = func.prototype;
|
10700
|
+
var child = new ctor, result = func.apply(child, args);
|
10701
|
+
return Object(result) === result ? result : child;
|
10702
|
+
})(Batman.Set, this._removedStorage, function(){}));
|
10703
|
+
return target;
|
10704
|
+
};
|
10705
|
+
|
10706
|
+
TransactionAssociationSet.accessor('length', function() {
|
10707
|
+
this.registerAsMutableSource();
|
10708
|
+
return this.length;
|
10709
|
+
});
|
10710
|
+
|
10711
|
+
TransactionAssociationSet.prototype.build = Batman.AssociationSet.prototype.build;
|
10712
|
+
|
10713
|
+
return TransactionAssociationSet;
|
10714
|
+
|
10715
|
+
})(Batman.Set);
|
10716
|
+
|
10717
|
+
}).call(this);
|
10718
|
+
|
10719
|
+
(function() {
|
10720
|
+
var __hasProp = {}.hasOwnProperty,
|
10721
|
+
__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; },
|
10722
|
+
__slice = [].slice;
|
10055
10723
|
|
10056
10724
|
Batman.Validator = (function(_super) {
|
10057
10725
|
__extends(Validator, _super);
|
@@ -10102,12 +10770,20 @@
|
|
10102
10770
|
Validator.__super__.constructor.apply(this, mixins);
|
10103
10771
|
}
|
10104
10772
|
|
10105
|
-
Validator.prototype.
|
10106
|
-
return Batman.developer.error("You must override
|
10773
|
+
Validator.prototype.validateEach = function(record) {
|
10774
|
+
return Batman.developer.error("You must override validateEach in Batman.Validator subclasses.");
|
10107
10775
|
};
|
10108
10776
|
|
10109
|
-
Validator.prototype.format = function(
|
10110
|
-
|
10777
|
+
Validator.prototype.format = function(attr, messageKey, interpolations, record) {
|
10778
|
+
if (this.options.message) {
|
10779
|
+
if (typeof this.options.message === 'function') {
|
10780
|
+
return this.options.message.call(record, attr, messageKey);
|
10781
|
+
} else {
|
10782
|
+
return this.options.message;
|
10783
|
+
}
|
10784
|
+
} else {
|
10785
|
+
return Batman.t("errors.messages." + messageKey, interpolations);
|
10786
|
+
}
|
10111
10787
|
};
|
10112
10788
|
|
10113
10789
|
Validator.prototype.handleBlank = function(value) {
|
@@ -10142,10 +10818,13 @@
|
|
10142
10818
|
equal_to: "must be equal to %{count}",
|
10143
10819
|
less_than: "must be less than %{count}",
|
10144
10820
|
less_than_or_equal_to: "must be less than or equal to %{count}",
|
10821
|
+
not_an_integer: "must be an integer",
|
10145
10822
|
not_matching: "is not valid",
|
10146
10823
|
invalid_association: "is not valid",
|
10147
10824
|
not_included_in_list: "is not included in the list",
|
10148
|
-
included_in_list: "is included in the list"
|
10825
|
+
included_in_list: "is included in the list",
|
10826
|
+
not_an_email: "is not a valid email address",
|
10827
|
+
confirmation_does_not_match: 'and confirmation do not match'
|
10149
10828
|
}
|
10150
10829
|
}
|
10151
10830
|
});
|
@@ -10176,7 +10855,7 @@
|
|
10176
10855
|
return callback();
|
10177
10856
|
}
|
10178
10857
|
if ((value == null) || value === '' || !this.regexp.test(value)) {
|
10179
|
-
errors.add(key, this.format(key, 'not_matching'));
|
10858
|
+
errors.add(key, this.format(key, 'not_matching', {}, record));
|
10180
10859
|
}
|
10181
10860
|
return callback();
|
10182
10861
|
};
|
@@ -10208,7 +10887,7 @@
|
|
10208
10887
|
var value;
|
10209
10888
|
value = record.get(key);
|
10210
10889
|
if (!this.isPresent(value)) {
|
10211
|
-
errors.add(key, this.format(key, 'blank'));
|
10890
|
+
errors.add(key, this.format(key, 'blank', {}, record));
|
10212
10891
|
}
|
10213
10892
|
return callback();
|
10214
10893
|
};
|
@@ -10238,7 +10917,7 @@
|
|
10238
10917
|
return _ref;
|
10239
10918
|
}
|
10240
10919
|
|
10241
|
-
NumericValidator.triggers('numeric', 'greaterThan', 'greaterThanOrEqualTo', 'equalTo', 'lessThan', 'lessThanOrEqualTo');
|
10920
|
+
NumericValidator.triggers('numeric', 'greaterThan', 'greaterThanOrEqualTo', 'equalTo', 'lessThan', 'lessThanOrEqualTo', 'onlyInteger');
|
10242
10921
|
|
10243
10922
|
NumericValidator.options('allowBlank');
|
10244
10923
|
|
@@ -10250,32 +10929,34 @@
|
|
10250
10929
|
return callback();
|
10251
10930
|
}
|
10252
10931
|
if ((value == null) || !(this.isNumeric(value) || this.canCoerceToNumeric(value))) {
|
10253
|
-
errors.add(key, this.format(key, 'not_numeric'));
|
10932
|
+
errors.add(key, this.format(key, 'not_numeric', {}, record));
|
10933
|
+
} else if (options.onlyInteger && !this.isInteger(value)) {
|
10934
|
+
errors.add(key, this.format(key, 'not_an_integer', {}, record));
|
10254
10935
|
} else {
|
10255
10936
|
if ((options.greaterThan != null) && value <= options.greaterThan) {
|
10256
10937
|
errors.add(key, this.format(key, 'greater_than', {
|
10257
10938
|
count: options.greaterThan
|
10258
|
-
}));
|
10939
|
+
}, record));
|
10259
10940
|
}
|
10260
10941
|
if ((options.greaterThanOrEqualTo != null) && value < options.greaterThanOrEqualTo) {
|
10261
10942
|
errors.add(key, this.format(key, 'greater_than_or_equal_to', {
|
10262
10943
|
count: options.greaterThanOrEqualTo
|
10263
|
-
}));
|
10944
|
+
}, record));
|
10264
10945
|
}
|
10265
10946
|
if ((options.equalTo != null) && value !== options.equalTo) {
|
10266
10947
|
errors.add(key, this.format(key, 'equal_to', {
|
10267
10948
|
count: options.equalTo
|
10268
|
-
}));
|
10949
|
+
}, record));
|
10269
10950
|
}
|
10270
10951
|
if ((options.lessThan != null) && value >= options.lessThan) {
|
10271
10952
|
errors.add(key, this.format(key, 'less_than', {
|
10272
10953
|
count: options.lessThan
|
10273
|
-
}));
|
10954
|
+
}, record));
|
10274
10955
|
}
|
10275
10956
|
if ((options.lessThanOrEqualTo != null) && value > options.lessThanOrEqualTo) {
|
10276
10957
|
errors.add(key, this.format(key, 'less_than_or_equal_to', {
|
10277
10958
|
count: options.lessThanOrEqualTo
|
10278
|
-
}));
|
10959
|
+
}, record));
|
10279
10960
|
}
|
10280
10961
|
}
|
10281
10962
|
return callback();
|
@@ -10285,6 +10966,10 @@
|
|
10285
10966
|
return !isNaN(parseFloat(value)) && isFinite(value);
|
10286
10967
|
};
|
10287
10968
|
|
10969
|
+
NumericValidator.prototype.isInteger = function(value) {
|
10970
|
+
return parseFloat(value) === (value | 0);
|
10971
|
+
};
|
10972
|
+
|
10288
10973
|
NumericValidator.prototype.canCoerceToNumeric = function(value) {
|
10289
10974
|
return (value - 0) == value && value.length > 0;
|
10290
10975
|
};
|
@@ -10323,7 +11008,7 @@
|
|
10323
11008
|
var options, value;
|
10324
11009
|
options = this.options;
|
10325
11010
|
value = record.get(key);
|
10326
|
-
if (
|
11011
|
+
if (this.handleBlank(value)) {
|
10327
11012
|
return callback();
|
10328
11013
|
}
|
10329
11014
|
if (value == null) {
|
@@ -10332,17 +11017,17 @@
|
|
10332
11017
|
if (options.minLength && value.length < options.minLength) {
|
10333
11018
|
errors.add(key, this.format(key, 'too_short', {
|
10334
11019
|
count: options.minLength
|
10335
|
-
}));
|
11020
|
+
}, record));
|
10336
11021
|
}
|
10337
11022
|
if (options.maxLength && value.length > options.maxLength) {
|
10338
11023
|
errors.add(key, this.format(key, 'too_long', {
|
10339
11024
|
count: options.maxLength
|
10340
|
-
}));
|
11025
|
+
}, record));
|
10341
11026
|
}
|
10342
11027
|
if (options.length && value.length !== options.length) {
|
10343
11028
|
errors.add(key, this.format(key, 'wrong_length', {
|
10344
11029
|
count: options.length
|
10345
|
-
}));
|
11030
|
+
}, record));
|
10346
11031
|
}
|
10347
11032
|
return callback();
|
10348
11033
|
};
|
@@ -10364,14 +11049,18 @@
|
|
10364
11049
|
|
10365
11050
|
InclusionValidator.triggers('inclusion');
|
10366
11051
|
|
11052
|
+
InclusionValidator.options('allowBlank');
|
11053
|
+
|
10367
11054
|
function InclusionValidator(options) {
|
10368
11055
|
this.acceptableValues = options.inclusion["in"];
|
10369
11056
|
InclusionValidator.__super__.constructor.apply(this, arguments);
|
10370
11057
|
}
|
10371
11058
|
|
10372
11059
|
InclusionValidator.prototype.validateEach = function(errors, record, key, callback) {
|
10373
|
-
|
10374
|
-
|
11060
|
+
var value;
|
11061
|
+
value = record.get(key);
|
11062
|
+
if (!this.handleBlank(value) && this.acceptableValues.indexOf(value) === -1) {
|
11063
|
+
errors.add(key, this.format(key, 'not_included_in_list', {}, record));
|
10375
11064
|
}
|
10376
11065
|
return callback();
|
10377
11066
|
};
|
@@ -10400,7 +11089,7 @@
|
|
10400
11089
|
|
10401
11090
|
ExclusionValidator.prototype.validateEach = function(errors, record, key, callback) {
|
10402
11091
|
if (this.unacceptableValues.indexOf(record.get(key)) >= 0) {
|
10403
|
-
errors.add(key, this.format(key, 'included_in_list'));
|
11092
|
+
errors.add(key, this.format(key, 'included_in_list', {}, record));
|
10404
11093
|
}
|
10405
11094
|
return callback();
|
10406
11095
|
};
|
@@ -10413,6 +11102,82 @@
|
|
10413
11102
|
|
10414
11103
|
}).call(this);
|
10415
11104
|
|
11105
|
+
(function() {
|
11106
|
+
var _ref,
|
11107
|
+
__hasProp = {}.hasOwnProperty,
|
11108
|
+
__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; };
|
11109
|
+
|
11110
|
+
Batman.EmailValidator = (function(_super) {
|
11111
|
+
__extends(EmailValidator, _super);
|
11112
|
+
|
11113
|
+
function EmailValidator() {
|
11114
|
+
_ref = EmailValidator.__super__.constructor.apply(this, arguments);
|
11115
|
+
return _ref;
|
11116
|
+
}
|
11117
|
+
|
11118
|
+
EmailValidator.triggers('email');
|
11119
|
+
|
11120
|
+
EmailValidator.prototype.emailRegexp = /[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9-]+(\.[a-z0-9-]+)*/;
|
11121
|
+
|
11122
|
+
EmailValidator.prototype.validateEach = function(errors, record, key, callback) {
|
11123
|
+
var value;
|
11124
|
+
value = record.get(key);
|
11125
|
+
if ((value == null) || value === '' || !this.emailRegexp.test(value)) {
|
11126
|
+
errors.add(key, this.format(key, 'not_an_email', {}, record));
|
11127
|
+
}
|
11128
|
+
return callback();
|
11129
|
+
};
|
11130
|
+
|
11131
|
+
return EmailValidator;
|
11132
|
+
|
11133
|
+
})(Batman.Validator);
|
11134
|
+
|
11135
|
+
Batman.Validators.push(Batman.EmailValidator);
|
11136
|
+
|
11137
|
+
}).call(this);
|
11138
|
+
|
11139
|
+
(function() {
|
11140
|
+
var _ref,
|
11141
|
+
__hasProp = {}.hasOwnProperty,
|
11142
|
+
__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; };
|
11143
|
+
|
11144
|
+
Batman.ConfirmationValidator = (function(_super) {
|
11145
|
+
__extends(ConfirmationValidator, _super);
|
11146
|
+
|
11147
|
+
function ConfirmationValidator() {
|
11148
|
+
_ref = ConfirmationValidator.__super__.constructor.apply(this, arguments);
|
11149
|
+
return _ref;
|
11150
|
+
}
|
11151
|
+
|
11152
|
+
ConfirmationValidator.triggers('confirmation');
|
11153
|
+
|
11154
|
+
ConfirmationValidator.prototype.validateEach = function(errors, record, key, callback) {
|
11155
|
+
var confirmation_key, confirmation_value, options, value;
|
11156
|
+
options = this.options;
|
11157
|
+
if (!options.confirmation) {
|
11158
|
+
return;
|
11159
|
+
}
|
11160
|
+
if (Batman.typeOf(this.options.confirmation) === "String") {
|
11161
|
+
confirmation_key = this.options.confirmation;
|
11162
|
+
} else {
|
11163
|
+
confirmation_key = key + "_confirmation";
|
11164
|
+
}
|
11165
|
+
value = record.get(key);
|
11166
|
+
confirmation_value = record.get(confirmation_key);
|
11167
|
+
if (value !== confirmation_value) {
|
11168
|
+
errors.add(key, this.format(key, 'confirmation_does_not_match', {}, record));
|
11169
|
+
}
|
11170
|
+
return callback();
|
11171
|
+
};
|
11172
|
+
|
11173
|
+
return ConfirmationValidator;
|
11174
|
+
|
11175
|
+
})(Batman.Validator);
|
11176
|
+
|
11177
|
+
Batman.Validators.push(Batman.ConfirmationValidator);
|
11178
|
+
|
11179
|
+
}).call(this);
|
11180
|
+
|
10416
11181
|
(function() {
|
10417
11182
|
var _ref,
|
10418
11183
|
__hasProp = {}.hasOwnProperty,
|
@@ -10439,7 +11204,7 @@
|
|
10439
11204
|
count = 1;
|
10440
11205
|
childFinished = function(err, childErrors) {
|
10441
11206
|
if (childErrors.length > 0) {
|
10442
|
-
errors.add(key, _this.format(key, 'invalid_association'));
|
11207
|
+
errors.add(key, _this.format(key, 'invalid_association', {}, record));
|
10443
11208
|
}
|
10444
11209
|
if (--count === 0) {
|
10445
11210
|
return callback();
|
@@ -10468,6 +11233,63 @@
|
|
10468
11233
|
|
10469
11234
|
}).call(this);
|
10470
11235
|
|
11236
|
+
(function() {
|
11237
|
+
var _ref,
|
11238
|
+
__hasProp = {}.hasOwnProperty,
|
11239
|
+
__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; };
|
11240
|
+
|
11241
|
+
Batman.AssociatedFieldValidator = (function(_super) {
|
11242
|
+
__extends(AssociatedFieldValidator, _super);
|
11243
|
+
|
11244
|
+
function AssociatedFieldValidator() {
|
11245
|
+
_ref = AssociatedFieldValidator.__super__.constructor.apply(this, arguments);
|
11246
|
+
return _ref;
|
11247
|
+
}
|
11248
|
+
|
11249
|
+
AssociatedFieldValidator.triggers('associatedFields');
|
11250
|
+
|
11251
|
+
AssociatedFieldValidator.prototype.validateEach = function(errors, record, key, callback) {
|
11252
|
+
var childFinished, count, value,
|
11253
|
+
_this = this;
|
11254
|
+
value = record.get(key);
|
11255
|
+
if (value != null) {
|
11256
|
+
if (value instanceof Batman.AssociationProxy) {
|
11257
|
+
value = typeof value.get === "function" ? value.get('target') : void 0;
|
11258
|
+
}
|
11259
|
+
count = 1;
|
11260
|
+
childFinished = function(err, childErrors) {
|
11261
|
+
if (childErrors != null) {
|
11262
|
+
childErrors.forEach(function(validationError) {
|
11263
|
+
return errors.add(validationError.get('attribute'), validationError.get('message'));
|
11264
|
+
});
|
11265
|
+
}
|
11266
|
+
if (--count === 0) {
|
11267
|
+
return callback();
|
11268
|
+
}
|
11269
|
+
};
|
11270
|
+
if ((value != null ? value.forEach : void 0) != null) {
|
11271
|
+
value.forEach(function(record) {
|
11272
|
+
count += 1;
|
11273
|
+
return record.validate(childFinished);
|
11274
|
+
});
|
11275
|
+
} else if ((value != null ? value.validate : void 0) != null) {
|
11276
|
+
count += 1;
|
11277
|
+
value.validate(childFinished);
|
11278
|
+
}
|
11279
|
+
return childFinished(null, []);
|
11280
|
+
} else {
|
11281
|
+
return callback();
|
11282
|
+
}
|
11283
|
+
};
|
11284
|
+
|
11285
|
+
return AssociatedFieldValidator;
|
11286
|
+
|
11287
|
+
})(Batman.Validator);
|
11288
|
+
|
11289
|
+
Batman.Validators.push(Batman.AssociatedFieldValidator);
|
11290
|
+
|
11291
|
+
}).call(this);
|
11292
|
+
|
10471
11293
|
(function() {
|
10472
11294
|
var __hasProp = {}.hasOwnProperty,
|
10473
11295
|
__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; };
|
@@ -10629,6 +11451,14 @@
|
|
10629
11451
|
return this._batman.set('options', keys);
|
10630
11452
|
};
|
10631
11453
|
|
11454
|
+
View.filter = function(key, filter) {
|
11455
|
+
var filters;
|
11456
|
+
Batman.initializeObject(this.prototype);
|
11457
|
+
filters = this.prototype._batman.filters || {};
|
11458
|
+
filters[key] = filter;
|
11459
|
+
return this.prototype._batman.set('filters', filters);
|
11460
|
+
};
|
11461
|
+
|
10632
11462
|
View.viewForNode = function(node, climbTree) {
|
10633
11463
|
var view;
|
10634
11464
|
if (climbTree == null) {
|
@@ -10702,16 +11532,19 @@
|
|
10702
11532
|
};
|
10703
11533
|
|
10704
11534
|
View.prototype._addSubview = function(subview) {
|
10705
|
-
var subviewController, yieldName, yieldObject;
|
11535
|
+
var filters, subviewController, yieldName, yieldObject;
|
10706
11536
|
subviewController = subview.controller;
|
10707
11537
|
subview.removeFromSuperview();
|
10708
11538
|
subview.set('controller', subviewController || this.controller);
|
10709
11539
|
subview.set('superview', this);
|
10710
|
-
subview.
|
11540
|
+
subview.fireAndCall('viewDidMoveToSuperview');
|
10711
11541
|
if ((yieldName = subview.contentFor) && !subview.parentNode) {
|
10712
11542
|
yieldObject = Batman.DOM.Yield.withName(yieldName);
|
10713
11543
|
yieldObject.set('contentView', subview);
|
10714
11544
|
}
|
11545
|
+
if (filters = this._batman.get('filters')) {
|
11546
|
+
subview._batman.set('filters', Batman.mixin({}, filters, subview._batman.get('filters')));
|
11547
|
+
}
|
10715
11548
|
this.get('node');
|
10716
11549
|
subview.get('node');
|
10717
11550
|
this.observe('node', subview._nodesChanged);
|
@@ -10725,7 +11558,7 @@
|
|
10725
11558
|
if (!this.superview) {
|
10726
11559
|
return;
|
10727
11560
|
}
|
10728
|
-
this.
|
11561
|
+
this.fireAndCall('viewWillRemoveFromSuperview');
|
10729
11562
|
this.forget('node', this._nodesChanged);
|
10730
11563
|
this.forget('parentNode', this._nodesChanged);
|
10731
11564
|
this.superview.forget('node', this._nodesChanged);
|
@@ -10806,10 +11639,7 @@
|
|
10806
11639
|
if (value != null) {
|
10807
11640
|
this.set(eventName, value);
|
10808
11641
|
} else {
|
10809
|
-
this.
|
10810
|
-
if (typeof this[eventName] === "function") {
|
10811
|
-
this[eventName]();
|
10812
|
-
}
|
11642
|
+
this.fireAndCall(eventName);
|
10813
11643
|
}
|
10814
11644
|
_ref = this.subviews._storage;
|
10815
11645
|
_results = [];
|
@@ -10874,7 +11704,7 @@
|
|
10874
11704
|
if (node) {
|
10875
11705
|
this.set('node', node);
|
10876
11706
|
}
|
10877
|
-
this.
|
11707
|
+
this.fireAndCall('viewDidLoad');
|
10878
11708
|
}
|
10879
11709
|
return this.node;
|
10880
11710
|
},
|
@@ -10910,8 +11740,7 @@
|
|
10910
11740
|
}
|
10911
11741
|
new Batman.BindingParser(this);
|
10912
11742
|
this.set('isBound', true);
|
10913
|
-
this.
|
10914
|
-
return typeof this.ready === "function" ? this.ready() : void 0;
|
11743
|
+
return this.fireAndCall('ready');
|
10915
11744
|
};
|
10916
11745
|
|
10917
11746
|
View.prototype.destroyBindings = function() {
|
@@ -10945,11 +11774,14 @@
|
|
10945
11774
|
Batman.developer.warn("Tried to die() a view more than once.");
|
10946
11775
|
return;
|
10947
11776
|
}
|
10948
|
-
this.
|
11777
|
+
this.fireAndCall('destroy');
|
11778
|
+
this.destroyBindings();
|
11779
|
+
this.destroySubviews();
|
10949
11780
|
if (this.node) {
|
10950
11781
|
this.wasInDOM = Batman.DOM.containsNode(this.node);
|
10951
11782
|
Batman.DOM.destroyNode(this.node);
|
10952
11783
|
}
|
11784
|
+
this.removeFromSuperview();
|
10953
11785
|
this.forget();
|
10954
11786
|
if ((_ref = this._batman.properties) != null) {
|
10955
11787
|
_ref.forEach(function(key, property) {
|
@@ -10963,9 +11795,6 @@
|
|
10963
11795
|
event.clearHandlers();
|
10964
11796
|
}
|
10965
11797
|
}
|
10966
|
-
this.destroyBindings();
|
10967
|
-
this.destroySubviews();
|
10968
|
-
this.removeFromSuperview();
|
10969
11798
|
this.node = null;
|
10970
11799
|
this.parentNode = null;
|
10971
11800
|
this.subviews = null;
|
@@ -10987,22 +11816,19 @@
|
|
10987
11816
|
};
|
10988
11817
|
|
10989
11818
|
View.prototype.targetForKeypath = function(keypath, forceTarget) {
|
10990
|
-
var controller, lookupNode, nearestNonBackingView,
|
10991
|
-
|
10992
|
-
lookupNode = proxiedObject || this;
|
11819
|
+
var controller, lookupNode, nearestNonBackingView, target;
|
11820
|
+
lookupNode = this;
|
10993
11821
|
while (lookupNode) {
|
10994
|
-
if (
|
10995
|
-
return
|
11822
|
+
if (target = this._testTargetForKeypath(lookupNode, keypath)) {
|
11823
|
+
return target;
|
10996
11824
|
}
|
10997
11825
|
if (forceTarget && !nearestNonBackingView && !lookupNode.isBackingView) {
|
10998
|
-
nearestNonBackingView = lookupNode;
|
11826
|
+
nearestNonBackingView = Batman.get(lookupNode, 'proxiedObject') || lookupNode;
|
10999
11827
|
}
|
11000
11828
|
if (!controller && lookupNode.isView && lookupNode.controller) {
|
11001
11829
|
controller = lookupNode.controller;
|
11002
11830
|
}
|
11003
|
-
if (
|
11004
|
-
lookupNode = this;
|
11005
|
-
} else if (lookupNode.isView && lookupNode.superview) {
|
11831
|
+
if (lookupNode.isView && lookupNode.superview) {
|
11006
11832
|
lookupNode = lookupNode.superview;
|
11007
11833
|
} else if (controller) {
|
11008
11834
|
lookupNode = controller;
|
@@ -11022,6 +11848,18 @@
|
|
11022
11848
|
return nearestNonBackingView;
|
11023
11849
|
};
|
11024
11850
|
|
11851
|
+
View.prototype._testTargetForKeypath = function(object, keypath) {
|
11852
|
+
var proxiedObject;
|
11853
|
+
if (proxiedObject = Batman.get(object, 'proxiedObject')) {
|
11854
|
+
if (typeof Batman.get(proxiedObject, keypath) !== 'undefined') {
|
11855
|
+
return proxiedObject;
|
11856
|
+
}
|
11857
|
+
}
|
11858
|
+
if (typeof Batman.get(object, keypath) !== 'undefined') {
|
11859
|
+
return object;
|
11860
|
+
}
|
11861
|
+
};
|
11862
|
+
|
11025
11863
|
View.prototype.lookupKeypath = function(keypath) {
|
11026
11864
|
var base, target;
|
11027
11865
|
base = this.baseForKeypath(keypath);
|
@@ -11041,6 +11879,11 @@
|
|
11041
11879
|
return (_ref = Batman.Property.forBaseAndKey(target, keypath)) != null ? _ref.setValue(value) : void 0;
|
11042
11880
|
};
|
11043
11881
|
|
11882
|
+
View.prototype.fireAndCall = function(key) {
|
11883
|
+
this.fire(key);
|
11884
|
+
return typeof this[key] === "function" ? this[key]() : void 0;
|
11885
|
+
};
|
11886
|
+
|
11044
11887
|
return View;
|
11045
11888
|
|
11046
11889
|
})(Batman.Object);
|
@@ -11247,7 +12090,7 @@
|
|
11247
12090
|
};
|
11248
12091
|
|
11249
12092
|
AbstractBinding.prototype.parseFilter = function() {
|
11250
|
-
var args, e, filter, filterName, filterString, filters, key, keyPath, orig, split;
|
12093
|
+
var args, e, filter, filterName, filterString, filters, key, keyPath, orig, split, _ref, _ref1;
|
11251
12094
|
this.filterFunctions = [];
|
11252
12095
|
this.filterArguments = [];
|
11253
12096
|
keyPath = this.keyPath;
|
@@ -11275,7 +12118,7 @@
|
|
11275
12118
|
}
|
11276
12119
|
filterName = filterString.substr(0, split);
|
11277
12120
|
args = filterString.substr(split);
|
11278
|
-
if (!(filter = Batman.Filters[filterName])) {
|
12121
|
+
if (!(filter = ((_ref = this.view) != null ? (_ref1 = _ref._batman.get('filters')) != null ? _ref1[filterName] : void 0 : void 0) || Batman.Filters[filterName])) {
|
11279
12122
|
return Batman.developer.error("Unrecognized filter '" + filterName + "' in key \"" + this.keyPath + "\"!");
|
11280
12123
|
}
|
11281
12124
|
this.filterFunctions.push(filter);
|
@@ -11433,7 +12276,7 @@
|
|
11433
12276
|
if (_this.isDataChanging) {
|
11434
12277
|
return;
|
11435
12278
|
}
|
11436
|
-
return _this.view.
|
12279
|
+
return _this.view.setKeypath(_this.keyPath, value);
|
11437
12280
|
});
|
11438
12281
|
}
|
11439
12282
|
|
@@ -11509,16 +12352,16 @@
|
|
11509
12352
|
view = Batman.View.viewForNode(this.node, false);
|
11510
12353
|
if (!!value === !this.invert) {
|
11511
12354
|
if (view != null) {
|
11512
|
-
view.
|
12355
|
+
view.fireAndCall('viewWillShow');
|
11513
12356
|
}
|
11514
12357
|
this.node.style.display = this.originalDisplay;
|
11515
|
-
return view != null ? view.
|
12358
|
+
return view != null ? view.fireAndCall('viewDidShow') : void 0;
|
11516
12359
|
} else {
|
11517
12360
|
if (view != null) {
|
11518
|
-
view.
|
12361
|
+
view.fireAndCall('viewWillHide');
|
11519
12362
|
}
|
11520
12363
|
Batman.DOM.setStyleProperty(this.node, 'display', 'none', 'important');
|
11521
|
-
return view != null ? view.
|
12364
|
+
return view != null ? view.fireAndCall('viewDidHide') : void 0;
|
11522
12365
|
}
|
11523
12366
|
};
|
11524
12367
|
|
@@ -11692,20 +12535,13 @@
|
|
11692
12535
|
}).call(this);
|
11693
12536
|
|
11694
12537
|
(function() {
|
11695
|
-
var
|
11696
|
-
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
|
12538
|
+
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
|
11697
12539
|
__hasProp = {}.hasOwnProperty,
|
11698
12540
|
__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; };
|
11699
12541
|
|
11700
12542
|
Batman.DOM.RouteBinding = (function(_super) {
|
11701
12543
|
__extends(RouteBinding, _super);
|
11702
12544
|
|
11703
|
-
function RouteBinding() {
|
11704
|
-
this.routeClick = __bind(this.routeClick, this);
|
11705
|
-
_ref = RouteBinding.__super__.constructor.apply(this, arguments);
|
11706
|
-
return _ref;
|
11707
|
-
}
|
11708
|
-
|
11709
12545
|
RouteBinding.prototype.onAnchorTag = false;
|
11710
12546
|
|
11711
12547
|
RouteBinding.prototype.onlyObserve = Batman.BindingDefinitionOnlyObserve.Data;
|
@@ -11714,34 +12550,44 @@
|
|
11714
12550
|
return this.view.lookupKeypath('dispatcher') || Batman.App.get('current.dispatcher');
|
11715
12551
|
});
|
11716
12552
|
|
12553
|
+
function RouteBinding() {
|
12554
|
+
this.routeClick = __bind(this.routeClick, this);
|
12555
|
+
var definition, paramKeypath;
|
12556
|
+
RouteBinding.__super__.constructor.apply(this, arguments);
|
12557
|
+
if (paramKeypath = this.node.getAttribute('data-route-params')) {
|
12558
|
+
definition = new Batman.DOM.ReaderBindingDefinition(this.node, paramKeypath, this.view);
|
12559
|
+
this.set('queryParams', new Batman.DOM.RouteParamsBinding(definition, this));
|
12560
|
+
}
|
12561
|
+
}
|
12562
|
+
|
11717
12563
|
RouteBinding.prototype.bind = function() {
|
11718
|
-
var
|
11719
|
-
if ((
|
12564
|
+
var _ref;
|
12565
|
+
if ((_ref = this.node.nodeName) === 'a' || _ref === 'A') {
|
11720
12566
|
this.onAnchorTag = true;
|
11721
12567
|
}
|
11722
12568
|
RouteBinding.__super__.bind.apply(this, arguments);
|
11723
12569
|
if (this.onAnchorTag && this.node.getAttribute('target')) {
|
11724
12570
|
return;
|
11725
12571
|
}
|
11726
|
-
return Batman.DOM.events.
|
12572
|
+
return Batman.DOM.events.primaryInteractionEvent(this.node, this.routeClick);
|
11727
12573
|
};
|
11728
12574
|
|
11729
12575
|
RouteBinding.prototype.routeClick = function(node, event) {
|
11730
|
-
var
|
12576
|
+
var path;
|
11731
12577
|
if (event.__batmanActionTaken) {
|
11732
12578
|
return;
|
11733
12579
|
}
|
11734
12580
|
event.__batmanActionTaken = true;
|
11735
|
-
|
11736
|
-
if (
|
11737
|
-
return Batman.redirect(
|
12581
|
+
path = this.generatePath(this.get('filteredValue'), this.get('queryParams.filteredValue'));
|
12582
|
+
if (path != null) {
|
12583
|
+
return Batman.redirect(path);
|
11738
12584
|
}
|
11739
12585
|
};
|
11740
12586
|
|
11741
|
-
RouteBinding.prototype.dataChange = function(value) {
|
12587
|
+
RouteBinding.prototype.dataChange = function(value, node, queryParams) {
|
11742
12588
|
var path;
|
11743
12589
|
if (value) {
|
11744
|
-
path = this.
|
12590
|
+
path = this.generatePath(value, queryParams || this.get('queryParams.filteredValue'));
|
11745
12591
|
}
|
11746
12592
|
if (this.onAnchorTag) {
|
11747
12593
|
if (path && Batman.navigator) {
|
@@ -11753,21 +12599,46 @@
|
|
11753
12599
|
}
|
11754
12600
|
};
|
11755
12601
|
|
11756
|
-
RouteBinding.prototype.
|
11757
|
-
var
|
11758
|
-
|
11759
|
-
|
11760
|
-
|
11761
|
-
|
11762
|
-
|
12602
|
+
RouteBinding.prototype.generatePath = function(value, params) {
|
12603
|
+
var path, uri, _ref;
|
12604
|
+
path = (value != null ? value.isNamedRouteQuery : void 0) ? value.get('path') : (_ref = this.get('dispatcher')) != null ? _ref.pathFromParams(value) : void 0;
|
12605
|
+
if (!params || !path) {
|
12606
|
+
return path;
|
12607
|
+
}
|
12608
|
+
if (Batman.typeOf(params) === 'Object') {
|
12609
|
+
if (params.toObject != null) {
|
12610
|
+
params = params.toObject();
|
11763
12611
|
}
|
12612
|
+
} else {
|
12613
|
+
params = Batman.URI.paramsFromQuery(params);
|
11764
12614
|
}
|
12615
|
+
uri = new Batman.URI(path);
|
12616
|
+
uri.queryParams = params;
|
12617
|
+
return uri.toString();
|
11765
12618
|
};
|
11766
12619
|
|
11767
12620
|
return RouteBinding;
|
11768
12621
|
|
11769
12622
|
})(Batman.DOM.AbstractBinding);
|
11770
12623
|
|
12624
|
+
Batman.DOM.RouteParamsBinding = (function(_super) {
|
12625
|
+
__extends(RouteParamsBinding, _super);
|
12626
|
+
|
12627
|
+
RouteParamsBinding.prototype.onlyObserve = Batman.BindingDefinitionOnlyObserve.Data;
|
12628
|
+
|
12629
|
+
function RouteParamsBinding(definition, routeBinding) {
|
12630
|
+
this.routeBinding = routeBinding;
|
12631
|
+
RouteParamsBinding.__super__.constructor.call(this, definition);
|
12632
|
+
}
|
12633
|
+
|
12634
|
+
RouteParamsBinding.prototype.dataChange = function(value) {
|
12635
|
+
return this.routeBinding.dataChange(this.routeBinding.get('filteredValue'), this.node, value);
|
12636
|
+
};
|
12637
|
+
|
12638
|
+
return RouteParamsBinding;
|
12639
|
+
|
12640
|
+
})(Batman.DOM.AbstractBinding);
|
12641
|
+
|
11771
12642
|
}).call(this);
|
11772
12643
|
|
11773
12644
|
(function() {
|
@@ -11846,7 +12717,7 @@
|
|
11846
12717
|
}).call(this);
|
11847
12718
|
|
11848
12719
|
(function() {
|
11849
|
-
var _ref,
|
12720
|
+
var _ref,
|
11850
12721
|
__hasProp = {}.hasOwnProperty,
|
11851
12722
|
__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; };
|
11852
12723
|
|
@@ -11867,20 +12738,21 @@
|
|
11867
12738
|
Batman.DOM.DeferredRenderBinding = (function(_super) {
|
11868
12739
|
__extends(DeferredRenderBinding, _super);
|
11869
12740
|
|
11870
|
-
function DeferredRenderBinding() {
|
11871
|
-
_ref1 = DeferredRenderBinding.__super__.constructor.apply(this, arguments);
|
11872
|
-
return _ref1;
|
11873
|
-
}
|
11874
|
-
|
11875
12741
|
DeferredRenderBinding.prototype.onlyObserve = Batman.BindingDefinitionOnlyObserve.Data;
|
11876
12742
|
|
11877
12743
|
DeferredRenderBinding.prototype.backWithView = Batman.DeferredRenderView;
|
11878
12744
|
|
11879
12745
|
DeferredRenderBinding.prototype.skipChildren = true;
|
11880
12746
|
|
12747
|
+
function DeferredRenderBinding(definition) {
|
12748
|
+
this.invert = definition.invert;
|
12749
|
+
this.attributeName = this.invert ? 'data-deferif' : 'data-renderif';
|
12750
|
+
DeferredRenderBinding.__super__.constructor.apply(this, arguments);
|
12751
|
+
}
|
12752
|
+
|
11881
12753
|
DeferredRenderBinding.prototype.dataChange = function(value) {
|
11882
|
-
if (value && !this.backingView.isBound) {
|
11883
|
-
this.node.removeAttribute(
|
12754
|
+
if (!!value === !this.invert && !this.backingView.isBound) {
|
12755
|
+
this.node.removeAttribute(this.attributeName);
|
11884
12756
|
return this.backingView.initializeBindings();
|
11885
12757
|
}
|
11886
12758
|
};
|
@@ -11937,22 +12809,79 @@
|
|
11937
12809
|
var __hasProp = {}.hasOwnProperty,
|
11938
12810
|
__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; };
|
11939
12811
|
|
11940
|
-
Batman.
|
11941
|
-
|
12812
|
+
Batman.Tracking = {
|
12813
|
+
loadTracker: function() {
|
12814
|
+
if (Batman.Tracking.tracker) {
|
12815
|
+
return Batman.Tracking.tracker;
|
12816
|
+
}
|
12817
|
+
Batman.Tracking.tracker = Batman.currentApp.EventTracker ? new Batman.currentApp.EventTracker : (Batman.developer.warn("Define " + Batman.currentApp.name + ".EventTracker to use data-track"), {
|
12818
|
+
track: function() {}
|
12819
|
+
});
|
12820
|
+
return Batman.Tracking.tracker;
|
12821
|
+
},
|
12822
|
+
trackEvent: function(type, data, node) {
|
12823
|
+
return Batman.Tracking.loadTracker().track(type, data, node);
|
12824
|
+
}
|
12825
|
+
};
|
11942
12826
|
|
11943
|
-
|
12827
|
+
Batman.DOM.ClickTrackingBinding = (function(_super) {
|
12828
|
+
__extends(ClickTrackingBinding, _super);
|
11944
12829
|
|
11945
|
-
|
12830
|
+
ClickTrackingBinding.prototype.onlyObserve = Batman.BindingDefinitionOnlyObserve.None;
|
11946
12831
|
|
11947
|
-
|
11948
|
-
|
12832
|
+
ClickTrackingBinding.prototype.bindImmediately = false;
|
12833
|
+
|
12834
|
+
function ClickTrackingBinding() {
|
12835
|
+
var callback,
|
11949
12836
|
_this = this;
|
11950
|
-
|
12837
|
+
ClickTrackingBinding.__super__.constructor.apply(this, arguments);
|
11951
12838
|
callback = function() {
|
11952
|
-
|
11953
|
-
|
11954
|
-
|
11955
|
-
|
12839
|
+
return Batman.Tracking.trackEvent('click', _this.get('filteredValue'), _this.node);
|
12840
|
+
};
|
12841
|
+
Batman.DOM.events.click(this.node, callback, this.view, 'click', false);
|
12842
|
+
this.bind();
|
12843
|
+
}
|
12844
|
+
|
12845
|
+
return ClickTrackingBinding;
|
12846
|
+
|
12847
|
+
})(Batman.DOM.AbstractAttributeBinding);
|
12848
|
+
|
12849
|
+
Batman.DOM.ViewTrackingBinding = (function(_super) {
|
12850
|
+
__extends(ViewTrackingBinding, _super);
|
12851
|
+
|
12852
|
+
ViewTrackingBinding.prototype.onlyObserve = Batman.BindingDefinitionOnlyObserve.None;
|
12853
|
+
|
12854
|
+
function ViewTrackingBinding() {
|
12855
|
+
ViewTrackingBinding.__super__.constructor.apply(this, arguments);
|
12856
|
+
Batman.Tracking.trackEvent('view', this.get('filteredValue'), this.node);
|
12857
|
+
}
|
12858
|
+
|
12859
|
+
return ViewTrackingBinding;
|
12860
|
+
|
12861
|
+
})(Batman.DOM.AbstractAttributeBinding);
|
12862
|
+
|
12863
|
+
}).call(this);
|
12864
|
+
|
12865
|
+
(function() {
|
12866
|
+
var __hasProp = {}.hasOwnProperty,
|
12867
|
+
__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; };
|
12868
|
+
|
12869
|
+
Batman.DOM.EventBinding = (function(_super) {
|
12870
|
+
__extends(EventBinding, _super);
|
12871
|
+
|
12872
|
+
EventBinding.prototype.onlyObserve = Batman.BindingDefinitionOnlyObserve.None;
|
12873
|
+
|
12874
|
+
EventBinding.prototype.bindImmediately = false;
|
12875
|
+
|
12876
|
+
function EventBinding() {
|
12877
|
+
var attacher, callback,
|
12878
|
+
_this = this;
|
12879
|
+
EventBinding.__super__.constructor.apply(this, arguments);
|
12880
|
+
callback = function() {
|
12881
|
+
var func, target;
|
12882
|
+
func = _this.get('filteredValue');
|
12883
|
+
target = _this.view.targetForKeypath(_this.functionPath || _this.unfilteredKey);
|
12884
|
+
if (target && _this.functionPath) {
|
11956
12885
|
target = Batman.get(target, _this.functionPath);
|
11957
12886
|
}
|
11958
12887
|
return func != null ? func.apply(target, arguments) : void 0;
|
@@ -11962,7 +12891,7 @@
|
|
11962
12891
|
} else {
|
11963
12892
|
Batman.DOM.events.other(this.node, this.attributeName, callback, this.view);
|
11964
12893
|
}
|
11965
|
-
this.
|
12894
|
+
this.bind();
|
11966
12895
|
}
|
11967
12896
|
|
11968
12897
|
EventBinding.prototype._unfilteredValue = function(key) {
|
@@ -11999,20 +12928,31 @@
|
|
11999
12928
|
|
12000
12929
|
ContextBinding.prototype.bindingName = 'context';
|
12001
12930
|
|
12002
|
-
function ContextBinding() {
|
12003
|
-
var contextAttribute
|
12931
|
+
function ContextBinding(definition) {
|
12932
|
+
var contextAttribute,
|
12933
|
+
_this = this;
|
12934
|
+
this.contextKeypath = definition.attr || 'proxiedObject';
|
12004
12935
|
ContextBinding.__super__.constructor.apply(this, arguments);
|
12005
12936
|
contextAttribute = this.attributeName ? "data-" + this.bindingName + "-" + this.attributeName : "data-" + this.bindingName;
|
12006
12937
|
this.node.removeAttribute(contextAttribute);
|
12007
12938
|
this.node.insertBefore(document.createComment("batman-" + contextAttribute + "=\"" + this.keyPath + "\""), this.node.firstChild);
|
12939
|
+
this.backingView.observe(this.contextKeypath, this._updateValue = function(value) {
|
12940
|
+
if (_this.isDataChanging) {
|
12941
|
+
return;
|
12942
|
+
}
|
12943
|
+
return _this.view.setKeypath(_this.keyPath, value);
|
12944
|
+
});
|
12008
12945
|
}
|
12009
12946
|
|
12010
12947
|
ContextBinding.prototype.dataChange = function(proxiedObject) {
|
12011
|
-
|
12948
|
+
this.isDataChanging = true;
|
12949
|
+
this.backingView.set(this.contextKeypath, proxiedObject);
|
12950
|
+
return this.isDataChanging = false;
|
12012
12951
|
};
|
12013
12952
|
|
12014
12953
|
ContextBinding.prototype.die = function() {
|
12015
|
-
this.backingView.
|
12954
|
+
this.backingView.forget(this.contextKeypath, this._updateValue);
|
12955
|
+
this.backingView.unset(this.contextKeypath);
|
12016
12956
|
return ContextBinding.__super__.die.apply(this, arguments);
|
12017
12957
|
};
|
12018
12958
|
|
@@ -12250,6 +13190,22 @@
|
|
12250
13190
|
return _ref;
|
12251
13191
|
}
|
12252
13192
|
|
13193
|
+
AbstractCollectionBinding.prototype.dataChange = function(collection) {
|
13194
|
+
var items, _items;
|
13195
|
+
if (collection != null) {
|
13196
|
+
if (!this.bindCollection(collection)) {
|
13197
|
+
items = (collection != null ? collection.forEach : void 0) ? (_items = [], collection.forEach(function(item) {
|
13198
|
+
return _items.push(item);
|
13199
|
+
}), _items) : Object.keys(collection);
|
13200
|
+
this.handleArrayChanged(items);
|
13201
|
+
}
|
13202
|
+
} else {
|
13203
|
+
this.unbindCollection();
|
13204
|
+
this.collection = [];
|
13205
|
+
this.handleArrayChanged([]);
|
13206
|
+
}
|
13207
|
+
};
|
13208
|
+
|
12253
13209
|
AbstractCollectionBinding.prototype.bindCollection = function(newCollection) {
|
12254
13210
|
var _ref1;
|
12255
13211
|
if (newCollection instanceof Batman.Hash) {
|
@@ -12368,6 +13324,9 @@
|
|
12368
13324
|
|
12369
13325
|
StyleBinding.prototype.setStyle = function(key, value) {
|
12370
13326
|
key = Batman.helpers.camelize(key.trim(), true);
|
13327
|
+
if (key === "") {
|
13328
|
+
return false;
|
13329
|
+
}
|
12371
13330
|
if (this.oldStyles[key] == null) {
|
12372
13331
|
this.oldStyles[key] = this.node.style[key] || "";
|
12373
13332
|
}
|
@@ -12435,27 +13394,28 @@
|
|
12435
13394
|
}).call(this);
|
12436
13395
|
|
12437
13396
|
(function() {
|
12438
|
-
var
|
12439
|
-
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
|
13397
|
+
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
|
12440
13398
|
__hasProp = {}.hasOwnProperty,
|
12441
13399
|
__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; };
|
12442
13400
|
|
12443
13401
|
Batman.DOM.ClassBinding = (function(_super) {
|
12444
13402
|
__extends(ClassBinding, _super);
|
12445
13403
|
|
13404
|
+
ClassBinding.prototype.onlyObserve = Batman.BindingDefinitionOnlyObserve.Data;
|
13405
|
+
|
12446
13406
|
function ClassBinding() {
|
12447
13407
|
this.handleArrayChanged = __bind(this.handleArrayChanged, this);
|
12448
|
-
|
12449
|
-
|
13408
|
+
this.existingClasses = arguments[0].node.className.split(' ');
|
13409
|
+
ClassBinding.__super__.constructor.apply(this, arguments);
|
12450
13410
|
}
|
12451
13411
|
|
12452
|
-
ClassBinding.prototype.onlyObserve = Batman.BindingDefinitionOnlyObserve.Data;
|
12453
|
-
|
12454
13412
|
ClassBinding.prototype.dataChange = function(value) {
|
13413
|
+
var newClasses;
|
12455
13414
|
if (value != null) {
|
12456
13415
|
this.unbindCollection();
|
12457
13416
|
if (typeof value === 'string') {
|
12458
|
-
|
13417
|
+
newClasses = [value].concat(this.existingClasses);
|
13418
|
+
return this.node.className = newClasses.join(' ').trim();
|
12459
13419
|
} else {
|
12460
13420
|
this.bindCollection(value);
|
12461
13421
|
return this.updateFromCollection();
|
@@ -12464,17 +13424,17 @@
|
|
12464
13424
|
};
|
12465
13425
|
|
12466
13426
|
ClassBinding.prototype.updateFromCollection = function() {
|
12467
|
-
var array, k, v;
|
13427
|
+
var array, existingClasses, k, newClasses, v;
|
12468
13428
|
if (this.collection) {
|
12469
13429
|
array = this.collection.map ? this.collection.map(function(x) {
|
12470
13430
|
return x;
|
12471
13431
|
}) : (function() {
|
12472
|
-
var
|
12473
|
-
|
13432
|
+
var _ref, _results;
|
13433
|
+
_ref = this.collection;
|
12474
13434
|
_results = [];
|
12475
|
-
for (k in
|
12476
|
-
if (!__hasProp.call(
|
12477
|
-
v =
|
13435
|
+
for (k in _ref) {
|
13436
|
+
if (!__hasProp.call(_ref, k)) continue;
|
13437
|
+
v = _ref[k];
|
12478
13438
|
_results.push(k);
|
12479
13439
|
}
|
12480
13440
|
return _results;
|
@@ -12482,7 +13442,11 @@
|
|
12482
13442
|
if (array.toArray != null) {
|
12483
13443
|
array = array.toArray();
|
12484
13444
|
}
|
12485
|
-
|
13445
|
+
existingClasses = this.existingClasses.slice(0);
|
13446
|
+
newClasses = array.filter(function(val) {
|
13447
|
+
return existingClasses.indexOf(val) === -1;
|
13448
|
+
});
|
13449
|
+
return this.node.className = existingClasses.concat(newClasses).join(' ').trim();
|
12486
13450
|
}
|
12487
13451
|
};
|
12488
13452
|
|
@@ -12523,22 +13487,22 @@
|
|
12523
13487
|
parentNode = this.placeholderNode.parentNode || this.node.parentNode;
|
12524
13488
|
if (!!value === !this.invert) {
|
12525
13489
|
if (view != null) {
|
12526
|
-
view.
|
13490
|
+
view.fireAndCall('viewWillShow');
|
12527
13491
|
}
|
12528
13492
|
if (this.node.parentNode == null) {
|
12529
13493
|
parentNode.insertBefore(this.node, this.placeholderNode);
|
12530
13494
|
parentNode.removeChild(this.placeholderNode);
|
12531
13495
|
}
|
12532
|
-
return view != null ? view.
|
13496
|
+
return view != null ? view.fireAndCall('viewDidShow') : void 0;
|
12533
13497
|
} else {
|
12534
13498
|
if (view != null) {
|
12535
|
-
view.
|
13499
|
+
view.fireAndCall('viewWillHide');
|
12536
13500
|
}
|
12537
13501
|
if (this.node.parentNode != null) {
|
12538
13502
|
parentNode.insertBefore(this.placeholderNode, this.node);
|
12539
13503
|
parentNode.removeChild(this.node);
|
12540
13504
|
}
|
12541
|
-
return view != null ? view.
|
13505
|
+
return view != null ? view.fireAndCall('viewDidHide') : void 0;
|
12542
13506
|
}
|
12543
13507
|
};
|
12544
13508
|
|
@@ -12747,8 +13711,12 @@
|
|
12747
13711
|
IteratorBinding.__super__.constructor.apply(this, arguments);
|
12748
13712
|
this.backingView.set('attributeName', this.attributeName);
|
12749
13713
|
this.view.prevent('ready');
|
12750
|
-
Batman.setImmediate(function() {
|
13714
|
+
this._handle = Batman.setImmediate(function() {
|
12751
13715
|
var parentNode;
|
13716
|
+
if (_this.backingView.isDead) {
|
13717
|
+
Batman.developer.warn("IteratorBinding (data-foreach-" + _this.iteratorName + "='" + _this.keyPath + "') trying to insert dead backing view into DOM (" + _this.view.constructor.name + ")");
|
13718
|
+
return;
|
13719
|
+
}
|
12752
13720
|
parentNode = _this.prototypeNode.parentNode;
|
12753
13721
|
parentNode.insertBefore(_this.backingView.get('node'), _this.prototypeNode);
|
12754
13722
|
parentNode.removeChild(_this.prototypeNode);
|
@@ -12757,22 +13725,6 @@
|
|
12757
13725
|
});
|
12758
13726
|
}
|
12759
13727
|
|
12760
|
-
IteratorBinding.prototype.dataChange = function(collection) {
|
12761
|
-
var items, _items;
|
12762
|
-
if (collection != null) {
|
12763
|
-
if (!this.bindCollection(collection)) {
|
12764
|
-
items = (collection != null ? collection.forEach : void 0) ? (_items = [], collection.forEach(function(item) {
|
12765
|
-
return _items.push(item);
|
12766
|
-
}), _items) : Object.keys(collection);
|
12767
|
-
this.handleArrayChanged(items);
|
12768
|
-
}
|
12769
|
-
} else {
|
12770
|
-
this.unbindCollection();
|
12771
|
-
this.collection = [];
|
12772
|
-
this.handleArrayChanged([]);
|
12773
|
-
}
|
12774
|
-
};
|
12775
|
-
|
12776
13728
|
IteratorBinding.prototype.handleArrayChanged = function(newItems) {
|
12777
13729
|
if (!this.backingView.isDead) {
|
12778
13730
|
this.backingView.destroySubviews();
|
@@ -12806,6 +13758,9 @@
|
|
12806
13758
|
};
|
12807
13759
|
|
12808
13760
|
IteratorBinding.prototype.die = function() {
|
13761
|
+
if (this._handle) {
|
13762
|
+
Batman.clearImmediate(this._handle);
|
13763
|
+
}
|
12809
13764
|
this.prototypeNode = null;
|
12810
13765
|
return IteratorBinding.__super__.die.apply(this, arguments);
|
12811
13766
|
};
|
@@ -13074,6 +14029,24 @@
|
|
13074
14029
|
equals: buntUndefined(function(lhs, rhs, binding) {
|
13075
14030
|
return lhs === rhs;
|
13076
14031
|
}),
|
14032
|
+
eq: function(lhs, rhs) {
|
14033
|
+
return lhs === rhs;
|
14034
|
+
},
|
14035
|
+
neq: function(lhs, rhs) {
|
14036
|
+
return lhs !== rhs;
|
14037
|
+
},
|
14038
|
+
lt: buntUndefined(function(lhs, rhs) {
|
14039
|
+
return lhs < rhs;
|
14040
|
+
}),
|
14041
|
+
gt: buntUndefined(function(lhs, rhs) {
|
14042
|
+
return lhs > rhs;
|
14043
|
+
}),
|
14044
|
+
lteq: buntUndefined(function(lhs, rhs) {
|
14045
|
+
return lhs <= rhs;
|
14046
|
+
}),
|
14047
|
+
gteq: buntUndefined(function(lhs, rhs) {
|
14048
|
+
return lhs >= rhs;
|
14049
|
+
}),
|
13077
14050
|
and: function(lhs, rhs) {
|
13078
14051
|
return lhs && rhs;
|
13079
14052
|
},
|
@@ -13083,6 +14056,27 @@
|
|
13083
14056
|
not: function(value, binding) {
|
13084
14057
|
return !value;
|
13085
14058
|
},
|
14059
|
+
ceil: function(value) {
|
14060
|
+
return Math.ceil(value);
|
14061
|
+
},
|
14062
|
+
floor: function(value) {
|
14063
|
+
return Math.floor(value);
|
14064
|
+
},
|
14065
|
+
round: function(value) {
|
14066
|
+
return Math.round(value);
|
14067
|
+
},
|
14068
|
+
precision: function(value, p) {
|
14069
|
+
return parseFloat(value).toPrecision(p);
|
14070
|
+
},
|
14071
|
+
fixed: function(value, f) {
|
14072
|
+
return parseFloat(value).toFixed(f);
|
14073
|
+
},
|
14074
|
+
delimitNumber: function(value) {
|
14075
|
+
value = value.toString();
|
14076
|
+
return value.replace(/(^|[^\w.])(\d{4,})/g, function($0, $1, $2) {
|
14077
|
+
return $1 + $2.replace(/\d(?=(?:\d\d\d)+(?!\d))/g, "$&,");
|
14078
|
+
});
|
14079
|
+
},
|
13086
14080
|
trim: buntUndefined(function(value, binding) {
|
13087
14081
|
return value.trim();
|
13088
14082
|
}),
|
@@ -13193,7 +14187,7 @@
|
|
13193
14187
|
values = {};
|
13194
14188
|
for (k in interpolationKeypaths) {
|
13195
14189
|
v = interpolationKeypaths[k];
|
13196
|
-
values[k] = this.
|
14190
|
+
values[k] = this.lookupKeypath(v);
|
13197
14191
|
if (values[k] == null) {
|
13198
14192
|
Batman.developer.warn("Warning! Undefined interpolation key " + k + " for interpolation", string);
|
13199
14193
|
values[k] = '';
|
@@ -13207,18 +14201,14 @@
|
|
13207
14201
|
if (!block) {
|
13208
14202
|
return;
|
13209
14203
|
}
|
13210
|
-
|
13211
|
-
|
13212
|
-
|
13213
|
-
|
13214
|
-
}
|
14204
|
+
if (typeof block === "function") {
|
14205
|
+
return function() {
|
14206
|
+
return block.call.apply(block, [this].concat(__slice.call(curryArgs), __slice.call(arguments)));
|
14207
|
+
};
|
14208
|
+
} else if (typeof block.get === "function") {
|
14209
|
+
return block.get.apply(block, curryArgs);
|
14210
|
+
}
|
13215
14211
|
},
|
13216
|
-
routeToAction: buntUndefined(function(model, action) {
|
13217
|
-
var params;
|
13218
|
-
params = Batman.Dispatcher.paramsFromArgument(model);
|
13219
|
-
params.action = action;
|
13220
|
-
return params;
|
13221
|
-
}),
|
13222
14212
|
escape: buntUndefined(Batman.escapeHTML)
|
13223
14213
|
};
|
13224
14214
|
|
@@ -13240,4 +14230,1455 @@
|
|
13240
14230
|
(function() {
|
13241
14231
|
|
13242
14232
|
|
14233
|
+
}).call(this);
|
14234
|
+
|
14235
|
+
/**
|
14236
|
+
* Zest (https://github.com/chjj/zest)
|
14237
|
+
* A css selector engine.
|
14238
|
+
* Copyright (c) 2011-2012, Christopher Jeffrey. (MIT Licensed)
|
14239
|
+
*/
|
14240
|
+
|
14241
|
+
// TODO
|
14242
|
+
// - Recognize the TR subject selector when parsing.
|
14243
|
+
// - Pass context to scope.
|
14244
|
+
// - Add :column pseudo-classes.
|
14245
|
+
|
14246
|
+
;(function() {
|
14247
|
+
|
14248
|
+
/**
|
14249
|
+
* Shared
|
14250
|
+
*/
|
14251
|
+
|
14252
|
+
var window = this
|
14253
|
+
, document = this.document
|
14254
|
+
, old = this.zest;
|
14255
|
+
|
14256
|
+
/**
|
14257
|
+
* Helpers
|
14258
|
+
*/
|
14259
|
+
|
14260
|
+
var compareDocumentPosition = (function() {
|
14261
|
+
if (document.compareDocumentPosition) {
|
14262
|
+
return function(a, b) {
|
14263
|
+
return a.compareDocumentPosition(b);
|
14264
|
+
};
|
14265
|
+
}
|
14266
|
+
return function(a, b) {
|
14267
|
+
var el = a.ownerDocument.getElementsByTagName('*')
|
14268
|
+
, i = el.length;
|
14269
|
+
|
14270
|
+
while (i--) {
|
14271
|
+
if (el[i] === a) return 2;
|
14272
|
+
if (el[i] === b) return 4;
|
14273
|
+
}
|
14274
|
+
|
14275
|
+
return 1;
|
14276
|
+
};
|
14277
|
+
})();
|
14278
|
+
|
14279
|
+
var order = function(a, b) {
|
14280
|
+
return compareDocumentPosition(a, b) & 2 ? 1 : -1;
|
14281
|
+
};
|
14282
|
+
|
14283
|
+
var next = function(el) {
|
14284
|
+
while ((el = el.nextSibling)
|
14285
|
+
&& el.nodeType !== 1);
|
14286
|
+
return el;
|
14287
|
+
};
|
14288
|
+
|
14289
|
+
var prev = function(el) {
|
14290
|
+
while ((el = el.previousSibling)
|
14291
|
+
&& el.nodeType !== 1);
|
14292
|
+
return el;
|
14293
|
+
};
|
14294
|
+
|
14295
|
+
var child = function(el) {
|
14296
|
+
if (el = el.firstChild) {
|
14297
|
+
while (el.nodeType !== 1
|
14298
|
+
&& (el = el.nextSibling));
|
14299
|
+
}
|
14300
|
+
return el;
|
14301
|
+
};
|
14302
|
+
|
14303
|
+
var lastChild = function(el) {
|
14304
|
+
if (el = el.lastChild) {
|
14305
|
+
while (el.nodeType !== 1
|
14306
|
+
&& (el = el.previousSibling));
|
14307
|
+
}
|
14308
|
+
return el;
|
14309
|
+
};
|
14310
|
+
|
14311
|
+
var unquote = function(str) {
|
14312
|
+
if (!str) return str;
|
14313
|
+
var ch = str[0];
|
14314
|
+
return ch === '"' || ch === '\''
|
14315
|
+
? str.slice(1, -1)
|
14316
|
+
: str;
|
14317
|
+
};
|
14318
|
+
|
14319
|
+
var indexOf = (function() {
|
14320
|
+
if (Array.prototype.indexOf) {
|
14321
|
+
return Array.prototype.indexOf;
|
14322
|
+
}
|
14323
|
+
return function(obj, item) {
|
14324
|
+
var i = this.length;
|
14325
|
+
while (i--) {
|
14326
|
+
if (this[i] === item) return i;
|
14327
|
+
}
|
14328
|
+
return -1;
|
14329
|
+
};
|
14330
|
+
})();
|
14331
|
+
|
14332
|
+
var makeInside = function(start, end) {
|
14333
|
+
var regex = rules.inside.source
|
14334
|
+
.replace(/</g, start)
|
14335
|
+
.replace(/>/g, end);
|
14336
|
+
|
14337
|
+
return new RegExp(regex);
|
14338
|
+
};
|
14339
|
+
|
14340
|
+
var replace = function(regex, name, val) {
|
14341
|
+
regex = regex.source;
|
14342
|
+
regex = regex.replace(name, val.source || val);
|
14343
|
+
return new RegExp(regex);
|
14344
|
+
};
|
14345
|
+
|
14346
|
+
var truncateUrl = function(url, num) {
|
14347
|
+
return url
|
14348
|
+
.replace(/^(?:\w+:\/\/|\/+)/, '')
|
14349
|
+
.replace(/(?:\/+|\/*#.*?)$/, '')
|
14350
|
+
.split('/', num)
|
14351
|
+
.join('/');
|
14352
|
+
};
|
14353
|
+
|
14354
|
+
/**
|
14355
|
+
* Handle `nth` Selectors
|
14356
|
+
*/
|
14357
|
+
|
14358
|
+
var parseNth = function(param, test) {
|
14359
|
+
var param = param.replace(/\s+/g, '')
|
14360
|
+
, cap;
|
14361
|
+
|
14362
|
+
if (param === 'even') {
|
14363
|
+
param = '2n+0';
|
14364
|
+
} else if (param === 'odd') {
|
14365
|
+
param = '2n+1';
|
14366
|
+
} else if (!~param.indexOf('n')) {
|
14367
|
+
param = '0n' + param;
|
14368
|
+
}
|
14369
|
+
|
14370
|
+
cap = /^([+-])?(\d+)?n([+-])?(\d+)?$/.exec(param);
|
14371
|
+
|
14372
|
+
return {
|
14373
|
+
group: cap[1] === '-'
|
14374
|
+
? -(cap[2] || 1)
|
14375
|
+
: +(cap[2] || 1),
|
14376
|
+
offset: cap[4]
|
14377
|
+
? (cap[3] === '-' ? -cap[4] : +cap[4])
|
14378
|
+
: 0
|
14379
|
+
};
|
14380
|
+
};
|
14381
|
+
|
14382
|
+
var nth = function(param, test, last) {
|
14383
|
+
var param = parseNth(param)
|
14384
|
+
, group = param.group
|
14385
|
+
, offset = param.offset
|
14386
|
+
, find = !last ? child : lastChild
|
14387
|
+
, advance = !last ? next : prev;
|
14388
|
+
|
14389
|
+
return function(el) {
|
14390
|
+
if (el.parentNode.nodeType !== 1) return;
|
14391
|
+
|
14392
|
+
var rel = find(el.parentNode)
|
14393
|
+
, pos = 0;
|
14394
|
+
|
14395
|
+
while (rel) {
|
14396
|
+
if (test(rel, el)) pos++;
|
14397
|
+
if (rel === el) {
|
14398
|
+
pos -= offset;
|
14399
|
+
return group && pos
|
14400
|
+
? !(pos % group) && (pos < 0 === group < 0)
|
14401
|
+
: !pos;
|
14402
|
+
}
|
14403
|
+
rel = advance(rel);
|
14404
|
+
}
|
14405
|
+
};
|
14406
|
+
};
|
14407
|
+
|
14408
|
+
/**
|
14409
|
+
* Simple Selectors
|
14410
|
+
*/
|
14411
|
+
|
14412
|
+
var selectors = {
|
14413
|
+
'*': (function() {
|
14414
|
+
if (function() {
|
14415
|
+
var el = document.createElement('div');
|
14416
|
+
el.appendChild(document.createComment(''));
|
14417
|
+
return !!el.getElementsByTagName('*')[0];
|
14418
|
+
}()) {
|
14419
|
+
return function(el) {
|
14420
|
+
if (el.nodeType === 1) return true;
|
14421
|
+
};
|
14422
|
+
}
|
14423
|
+
return function() {
|
14424
|
+
return true;
|
14425
|
+
};
|
14426
|
+
})(),
|
14427
|
+
'type': function(type) {
|
14428
|
+
type = type.toLowerCase();
|
14429
|
+
return function(el) {
|
14430
|
+
return el.nodeName.toLowerCase() === type;
|
14431
|
+
};
|
14432
|
+
},
|
14433
|
+
'attr': function(key, op, val, i) {
|
14434
|
+
op = operators[op];
|
14435
|
+
return function(el) {
|
14436
|
+
var attr;
|
14437
|
+
switch (key) {
|
14438
|
+
case 'for':
|
14439
|
+
attr = el.htmlFor;
|
14440
|
+
break;
|
14441
|
+
case 'class':
|
14442
|
+
// className is '' when non-existent
|
14443
|
+
// getAttribute('class') is null
|
14444
|
+
attr = el.className;
|
14445
|
+
if (attr === '' && el.getAttribute('class') == null) {
|
14446
|
+
attr = null;
|
14447
|
+
}
|
14448
|
+
break;
|
14449
|
+
case 'href':
|
14450
|
+
attr = el.getAttribute('href', 2);
|
14451
|
+
break;
|
14452
|
+
case 'title':
|
14453
|
+
// getAttribute('title') can be '' when non-existent sometimes?
|
14454
|
+
attr = el.getAttribute('title') || null;
|
14455
|
+
break;
|
14456
|
+
case 'id':
|
14457
|
+
if (el.getAttribute) {
|
14458
|
+
attr = el.getAttribute('id');
|
14459
|
+
break;
|
14460
|
+
}
|
14461
|
+
default:
|
14462
|
+
attr = el[key] != null
|
14463
|
+
? el[key]
|
14464
|
+
: el.getAttribute && el.getAttribute(key);
|
14465
|
+
break;
|
14466
|
+
}
|
14467
|
+
if (attr == null) return;
|
14468
|
+
attr = attr + '';
|
14469
|
+
if (i) {
|
14470
|
+
attr = attr.toLowerCase();
|
14471
|
+
val = val.toLowerCase();
|
14472
|
+
}
|
14473
|
+
return op(attr, val);
|
14474
|
+
};
|
14475
|
+
},
|
14476
|
+
':first-child': function(el) {
|
14477
|
+
return !prev(el) && el.parentNode.nodeType === 1;
|
14478
|
+
},
|
14479
|
+
':last-child': function(el) {
|
14480
|
+
return !next(el) && el.parentNode.nodeType === 1;
|
14481
|
+
},
|
14482
|
+
':only-child': function(el) {
|
14483
|
+
return !prev(el) && !next(el)
|
14484
|
+
&& el.parentNode.nodeType === 1;
|
14485
|
+
},
|
14486
|
+
':nth-child': function(param, last) {
|
14487
|
+
return nth(param, function() {
|
14488
|
+
return true;
|
14489
|
+
}, last);
|
14490
|
+
},
|
14491
|
+
':nth-last-child': function(param) {
|
14492
|
+
return selectors[':nth-child'](param, true);
|
14493
|
+
},
|
14494
|
+
':root': function(el) {
|
14495
|
+
return el.ownerDocument.documentElement === el;
|
14496
|
+
},
|
14497
|
+
':empty': function(el) {
|
14498
|
+
return !el.firstChild;
|
14499
|
+
},
|
14500
|
+
':not': function(sel) {
|
14501
|
+
var test = compileGroup(sel);
|
14502
|
+
return function(el) {
|
14503
|
+
return !test(el);
|
14504
|
+
};
|
14505
|
+
},
|
14506
|
+
':first-of-type': function(el) {
|
14507
|
+
if (el.parentNode.nodeType !== 1) return;
|
14508
|
+
var type = el.nodeName;
|
14509
|
+
while (el = prev(el)) {
|
14510
|
+
if (el.nodeName === type) return;
|
14511
|
+
}
|
14512
|
+
return true;
|
14513
|
+
},
|
14514
|
+
':last-of-type': function(el) {
|
14515
|
+
if (el.parentNode.nodeType !== 1) return;
|
14516
|
+
var type = el.nodeName;
|
14517
|
+
while (el = next(el)) {
|
14518
|
+
if (el.nodeName === type) return;
|
14519
|
+
}
|
14520
|
+
return true;
|
14521
|
+
},
|
14522
|
+
':only-of-type': function(el) {
|
14523
|
+
return selectors[':first-of-type'](el)
|
14524
|
+
&& selectors[':last-of-type'](el);
|
14525
|
+
},
|
14526
|
+
':nth-of-type': function(param, last) {
|
14527
|
+
return nth(param, function(rel, el) {
|
14528
|
+
return rel.nodeName === el.nodeName;
|
14529
|
+
}, last);
|
14530
|
+
},
|
14531
|
+
':nth-last-of-type': function(param) {
|
14532
|
+
return selectors[':nth-of-type'](param, true);
|
14533
|
+
},
|
14534
|
+
':checked': function(el) {
|
14535
|
+
return !!(el.checked || el.selected);
|
14536
|
+
},
|
14537
|
+
':indeterminate': function(el) {
|
14538
|
+
return !selectors[':checked'](el);
|
14539
|
+
},
|
14540
|
+
':enabled': function(el) {
|
14541
|
+
return !el.disabled && el.type !== 'hidden';
|
14542
|
+
},
|
14543
|
+
':disabled': function(el) {
|
14544
|
+
return !!el.disabled;
|
14545
|
+
},
|
14546
|
+
':target': function(el) {
|
14547
|
+
return el.id === window.location.hash.substring(1);
|
14548
|
+
},
|
14549
|
+
':focus': function(el) {
|
14550
|
+
return el === el.ownerDocument.activeElement;
|
14551
|
+
},
|
14552
|
+
':matches': function(sel) {
|
14553
|
+
return compileGroup(sel);
|
14554
|
+
},
|
14555
|
+
':nth-match': function(param, last) {
|
14556
|
+
var args = param.split(/\s*,\s*/)
|
14557
|
+
, arg = args.shift()
|
14558
|
+
, test = compileGroup(args.join(','));
|
14559
|
+
|
14560
|
+
return nth(arg, test, last);
|
14561
|
+
},
|
14562
|
+
':nth-last-match': function(param) {
|
14563
|
+
return selectors[':nth-match'](param, true);
|
14564
|
+
},
|
14565
|
+
':links-here': function(el) {
|
14566
|
+
return el + '' === window.location + '';
|
14567
|
+
},
|
14568
|
+
':lang': function(param) {
|
14569
|
+
return function(el) {
|
14570
|
+
while (el) {
|
14571
|
+
if (el.lang) return el.lang.indexOf(param) === 0;
|
14572
|
+
el = el.parentNode;
|
14573
|
+
}
|
14574
|
+
};
|
14575
|
+
},
|
14576
|
+
':dir': function(param) {
|
14577
|
+
return function(el) {
|
14578
|
+
while (el) {
|
14579
|
+
if (el.dir) return el.dir === param;
|
14580
|
+
el = el.parentNode;
|
14581
|
+
}
|
14582
|
+
};
|
14583
|
+
},
|
14584
|
+
':scope': function(el, con) {
|
14585
|
+
var context = con || el.ownerDocument;
|
14586
|
+
if (context.nodeType === 9) {
|
14587
|
+
return el === context.documentElement;
|
14588
|
+
}
|
14589
|
+
return el === context;
|
14590
|
+
},
|
14591
|
+
':any-link': function(el) {
|
14592
|
+
return typeof el.href === 'string';
|
14593
|
+
},
|
14594
|
+
':local-link': function(el) {
|
14595
|
+
if (el.nodeName) {
|
14596
|
+
return el.href && el.host === window.location.host;
|
14597
|
+
}
|
14598
|
+
var param = +el + 1;
|
14599
|
+
return function(el) {
|
14600
|
+
if (!el.href) return;
|
14601
|
+
|
14602
|
+
var url = window.location + ''
|
14603
|
+
, href = el + '';
|
14604
|
+
|
14605
|
+
return truncateUrl(url, param) === truncateUrl(href, param);
|
14606
|
+
};
|
14607
|
+
},
|
14608
|
+
':default': function(el) {
|
14609
|
+
return !!el.defaultSelected;
|
14610
|
+
},
|
14611
|
+
':valid': function(el) {
|
14612
|
+
return el.willValidate || (el.validity && el.validity.valid);
|
14613
|
+
},
|
14614
|
+
':invalid': function(el) {
|
14615
|
+
return !selectors[':valid'](el);
|
14616
|
+
},
|
14617
|
+
':in-range': function(el) {
|
14618
|
+
return el.value > el.min && el.value <= el.max;
|
14619
|
+
},
|
14620
|
+
':out-of-range': function(el) {
|
14621
|
+
return !selectors[':in-range'](el);
|
14622
|
+
},
|
14623
|
+
':required': function(el) {
|
14624
|
+
return !!el.required;
|
14625
|
+
},
|
14626
|
+
':optional': function(el) {
|
14627
|
+
return !el.required;
|
14628
|
+
},
|
14629
|
+
':read-only': function(el) {
|
14630
|
+
if (el.readOnly) return true;
|
14631
|
+
|
14632
|
+
var attr = el.getAttribute('contenteditable')
|
14633
|
+
, prop = el.contentEditable
|
14634
|
+
, name = el.nodeName.toLowerCase();
|
14635
|
+
|
14636
|
+
name = name !== 'input' && name !== 'textarea';
|
14637
|
+
|
14638
|
+
return (name || el.disabled) && attr == null && prop !== 'true';
|
14639
|
+
},
|
14640
|
+
':read-write': function(el) {
|
14641
|
+
return !selectors[':read-only'](el);
|
14642
|
+
},
|
14643
|
+
':hover': function() {
|
14644
|
+
throw new Error(':hover is not supported.');
|
14645
|
+
},
|
14646
|
+
':active': function() {
|
14647
|
+
throw new Error(':active is not supported.');
|
14648
|
+
},
|
14649
|
+
':link': function() {
|
14650
|
+
throw new Error(':link is not supported.');
|
14651
|
+
},
|
14652
|
+
':visited': function() {
|
14653
|
+
throw new Error(':visited is not supported.');
|
14654
|
+
},
|
14655
|
+
':column': function() {
|
14656
|
+
throw new Error(':column is not supported.');
|
14657
|
+
},
|
14658
|
+
':nth-column': function() {
|
14659
|
+
throw new Error(':nth-column is not supported.');
|
14660
|
+
},
|
14661
|
+
':nth-last-column': function() {
|
14662
|
+
throw new Error(':nth-last-column is not supported.');
|
14663
|
+
},
|
14664
|
+
':current': function() {
|
14665
|
+
throw new Error(':current is not supported.');
|
14666
|
+
},
|
14667
|
+
':past': function() {
|
14668
|
+
throw new Error(':past is not supported.');
|
14669
|
+
},
|
14670
|
+
':future': function() {
|
14671
|
+
throw new Error(':future is not supported.');
|
14672
|
+
},
|
14673
|
+
// Non-standard, for compatibility purposes.
|
14674
|
+
':contains': function(param) {
|
14675
|
+
return function(el) {
|
14676
|
+
var text = el.innerText || el.textContent || el.value || '';
|
14677
|
+
return !!~text.indexOf(param);
|
14678
|
+
};
|
14679
|
+
},
|
14680
|
+
':has': function(param) {
|
14681
|
+
return function(el) {
|
14682
|
+
return zest(param, el).length > 0;
|
14683
|
+
};
|
14684
|
+
}
|
14685
|
+
// Potentially add more pseudo selectors for
|
14686
|
+
// compatibility with sizzle and most other
|
14687
|
+
// selector engines (?).
|
14688
|
+
};
|
14689
|
+
|
14690
|
+
/**
|
14691
|
+
* Attribute Operators
|
14692
|
+
*/
|
14693
|
+
|
14694
|
+
var operators = {
|
14695
|
+
'-': function() {
|
14696
|
+
return true;
|
14697
|
+
},
|
14698
|
+
'=': function(attr, val) {
|
14699
|
+
return attr === val;
|
14700
|
+
},
|
14701
|
+
'*=': function(attr, val) {
|
14702
|
+
return attr.indexOf(val) !== -1;
|
14703
|
+
},
|
14704
|
+
'~=': function(attr, val) {
|
14705
|
+
var i = attr.indexOf(val)
|
14706
|
+
, f
|
14707
|
+
, l;
|
14708
|
+
|
14709
|
+
if (i === -1) return;
|
14710
|
+
f = attr[i - 1];
|
14711
|
+
l = attr[i + val.length];
|
14712
|
+
|
14713
|
+
return (!f || f === ' ') && (!l || l === ' ');
|
14714
|
+
},
|
14715
|
+
'|=': function(attr, val) {
|
14716
|
+
var i = attr.indexOf(val)
|
14717
|
+
, l;
|
14718
|
+
|
14719
|
+
if (i !== 0) return;
|
14720
|
+
l = attr[i + val.length];
|
14721
|
+
|
14722
|
+
return l === '-' || !l;
|
14723
|
+
},
|
14724
|
+
'^=': function(attr, val) {
|
14725
|
+
return attr.indexOf(val) === 0;
|
14726
|
+
},
|
14727
|
+
'$=': function(attr, val) {
|
14728
|
+
return attr.indexOf(val) + val.length === attr.length;
|
14729
|
+
},
|
14730
|
+
// non-standard
|
14731
|
+
'!=': function(attr, val) {
|
14732
|
+
return attr !== val;
|
14733
|
+
}
|
14734
|
+
};
|
14735
|
+
|
14736
|
+
/**
|
14737
|
+
* Combinator Logic
|
14738
|
+
*/
|
14739
|
+
|
14740
|
+
var combinators = {
|
14741
|
+
' ': function(test) {
|
14742
|
+
return function(el) {
|
14743
|
+
while (el = el.parentNode) {
|
14744
|
+
if (test(el)) return el;
|
14745
|
+
}
|
14746
|
+
};
|
14747
|
+
},
|
14748
|
+
'>': function(test) {
|
14749
|
+
return function(el) {
|
14750
|
+
return test(el = el.parentNode) && el;
|
14751
|
+
};
|
14752
|
+
},
|
14753
|
+
'+': function(test) {
|
14754
|
+
return function(el) {
|
14755
|
+
return test(el = prev(el)) && el;
|
14756
|
+
};
|
14757
|
+
},
|
14758
|
+
'~': function(test) {
|
14759
|
+
return function(el) {
|
14760
|
+
while (el = prev(el)) {
|
14761
|
+
if (test(el)) return el;
|
14762
|
+
}
|
14763
|
+
};
|
14764
|
+
},
|
14765
|
+
'noop': function(test) {
|
14766
|
+
return function(el) {
|
14767
|
+
return test(el) && el;
|
14768
|
+
};
|
14769
|
+
},
|
14770
|
+
'ref': function(test, name) {
|
14771
|
+
var node;
|
14772
|
+
|
14773
|
+
function ref(el) {
|
14774
|
+
var doc = el.ownerDocument
|
14775
|
+
, nodes = doc.getElementsByTagName('*')
|
14776
|
+
, i = nodes.length;
|
14777
|
+
|
14778
|
+
while (i--) {
|
14779
|
+
node = nodes[i];
|
14780
|
+
if (ref.test(el)) {
|
14781
|
+
node = null;
|
14782
|
+
return true;
|
14783
|
+
}
|
14784
|
+
}
|
14785
|
+
|
14786
|
+
node = null;
|
14787
|
+
}
|
14788
|
+
|
14789
|
+
ref.combinator = function(el) {
|
14790
|
+
if (!node || !node.getAttribute) return;
|
14791
|
+
|
14792
|
+
var attr = node.getAttribute(name) || '';
|
14793
|
+
if (attr[0] === '#') attr = attr.substring(1);
|
14794
|
+
|
14795
|
+
if (attr === el.id && test(node)) {
|
14796
|
+
return node;
|
14797
|
+
}
|
14798
|
+
};
|
14799
|
+
|
14800
|
+
return ref;
|
14801
|
+
}
|
14802
|
+
};
|
14803
|
+
|
14804
|
+
/**
|
14805
|
+
* Grammar
|
14806
|
+
*/
|
14807
|
+
|
14808
|
+
var rules = {
|
14809
|
+
qname: /^ *([\w\-]+|\*)/,
|
14810
|
+
simple: /^(?:([.#][\w\-]+)|pseudo|attr)/,
|
14811
|
+
ref: /^ *\/([\w\-]+)\/ */,
|
14812
|
+
combinator: /^(?: +([^ \w*]) +|( )+|([^ \w*]))(?! *$)/,
|
14813
|
+
attr: /^\[([\w\-]+)(?:([^\w]?=)(inside))?\]/,
|
14814
|
+
pseudo: /^(:[\w\-]+)(?:\((inside)\))?/,
|
14815
|
+
inside: /(?:"(?:\\"|[^"])*"|'(?:\\'|[^'])*'|<[^"'>]*>|\\["'>]|[^"'>])*/
|
14816
|
+
};
|
14817
|
+
|
14818
|
+
rules.inside = replace(rules.inside, '[^"\'>]*', rules.inside);
|
14819
|
+
rules.attr = replace(rules.attr, 'inside', makeInside('\\[', '\\]'));
|
14820
|
+
rules.pseudo = replace(rules.pseudo, 'inside', makeInside('\\(', '\\)'));
|
14821
|
+
rules.simple = replace(rules.simple, 'pseudo', rules.pseudo);
|
14822
|
+
rules.simple = replace(rules.simple, 'attr', rules.attr);
|
14823
|
+
|
14824
|
+
/**
|
14825
|
+
* Compiling
|
14826
|
+
*/
|
14827
|
+
|
14828
|
+
var compile = function(sel) {
|
14829
|
+
var sel = sel.replace(/^\s+|\s+$/g, '')
|
14830
|
+
, test
|
14831
|
+
, filter = []
|
14832
|
+
, buff = []
|
14833
|
+
, subject
|
14834
|
+
, qname
|
14835
|
+
, cap
|
14836
|
+
, op
|
14837
|
+
, ref;
|
14838
|
+
|
14839
|
+
while (sel) {
|
14840
|
+
if (cap = rules.qname.exec(sel)) {
|
14841
|
+
sel = sel.substring(cap[0].length);
|
14842
|
+
qname = cap[1];
|
14843
|
+
buff.push(tok(qname, true));
|
14844
|
+
} else if (cap = rules.simple.exec(sel)) {
|
14845
|
+
sel = sel.substring(cap[0].length);
|
14846
|
+
qname = '*';
|
14847
|
+
buff.push(tok(qname, true));
|
14848
|
+
buff.push(tok(cap));
|
14849
|
+
} else {
|
14850
|
+
throw new Error('Invalid selector.');
|
14851
|
+
}
|
14852
|
+
|
14853
|
+
while (cap = rules.simple.exec(sel)) {
|
14854
|
+
sel = sel.substring(cap[0].length);
|
14855
|
+
buff.push(tok(cap));
|
14856
|
+
}
|
14857
|
+
|
14858
|
+
if (sel[0] === '!') {
|
14859
|
+
sel = sel.substring(1);
|
14860
|
+
subject = makeSubject();
|
14861
|
+
subject.qname = qname;
|
14862
|
+
buff.push(subject.simple);
|
14863
|
+
}
|
14864
|
+
|
14865
|
+
if (cap = rules.ref.exec(sel)) {
|
14866
|
+
sel = sel.substring(cap[0].length);
|
14867
|
+
ref = combinators.ref(makeSimple(buff), cap[1]);
|
14868
|
+
filter.push(ref.combinator);
|
14869
|
+
buff = [];
|
14870
|
+
continue;
|
14871
|
+
}
|
14872
|
+
|
14873
|
+
if (cap = rules.combinator.exec(sel)) {
|
14874
|
+
sel = sel.substring(cap[0].length);
|
14875
|
+
op = cap[1] || cap[2] || cap[3];
|
14876
|
+
if (op === ',') {
|
14877
|
+
filter.push(combinators.noop(makeSimple(buff)));
|
14878
|
+
break;
|
14879
|
+
}
|
14880
|
+
} else {
|
14881
|
+
op = 'noop';
|
14882
|
+
}
|
14883
|
+
|
14884
|
+
filter.push(combinators[op](makeSimple(buff)));
|
14885
|
+
buff = [];
|
14886
|
+
}
|
14887
|
+
|
14888
|
+
test = makeTest(filter);
|
14889
|
+
test.qname = qname;
|
14890
|
+
test.sel = sel;
|
14891
|
+
|
14892
|
+
if (subject) {
|
14893
|
+
subject.lname = test.qname;
|
14894
|
+
|
14895
|
+
subject.test = test;
|
14896
|
+
subject.qname = subject.qname;
|
14897
|
+
subject.sel = test.sel;
|
14898
|
+
test = subject;
|
14899
|
+
}
|
14900
|
+
|
14901
|
+
if (ref) {
|
14902
|
+
ref.test = test;
|
14903
|
+
ref.qname = test.qname;
|
14904
|
+
ref.sel = test.sel;
|
14905
|
+
test = ref;
|
14906
|
+
}
|
14907
|
+
|
14908
|
+
return test;
|
14909
|
+
};
|
14910
|
+
|
14911
|
+
var tok = function(cap, qname) {
|
14912
|
+
// qname
|
14913
|
+
if (qname) {
|
14914
|
+
return cap === '*'
|
14915
|
+
? selectors['*']
|
14916
|
+
: selectors.type(cap);
|
14917
|
+
}
|
14918
|
+
|
14919
|
+
// class/id
|
14920
|
+
if (cap[1]) {
|
14921
|
+
return cap[1][0] === '.'
|
14922
|
+
? selectors.attr('class', '~=', cap[1].substring(1))
|
14923
|
+
: selectors.attr('id', '=', cap[1].substring(1));
|
14924
|
+
}
|
14925
|
+
|
14926
|
+
// pseudo-name
|
14927
|
+
// inside-pseudo
|
14928
|
+
if (cap[2]) {
|
14929
|
+
return cap[3]
|
14930
|
+
? selectors[cap[2]](unquote(cap[3]))
|
14931
|
+
: selectors[cap[2]];
|
14932
|
+
}
|
14933
|
+
|
14934
|
+
// attr name
|
14935
|
+
// attr op
|
14936
|
+
// attr value
|
14937
|
+
if (cap[4]) {
|
14938
|
+
var i;
|
14939
|
+
if (cap[6]) {
|
14940
|
+
i = cap[6].length;
|
14941
|
+
cap[6] = cap[6].replace(/ +i$/, '');
|
14942
|
+
i = i > cap[6].length;
|
14943
|
+
}
|
14944
|
+
return selectors.attr(cap[4], cap[5] || '-', unquote(cap[6]), i);
|
14945
|
+
}
|
14946
|
+
|
14947
|
+
throw new Error('Unknown Selector.');
|
14948
|
+
};
|
14949
|
+
|
14950
|
+
var makeSimple = function(func) {
|
14951
|
+
var l = func.length
|
14952
|
+
, i;
|
14953
|
+
|
14954
|
+
// Potentially make sure
|
14955
|
+
// `el` is truthy.
|
14956
|
+
if (l < 2) return func[0];
|
14957
|
+
|
14958
|
+
return function(el) {
|
14959
|
+
if (!el) return;
|
14960
|
+
for (i = 0; i < l; i++) {
|
14961
|
+
if (!func[i](el)) return;
|
14962
|
+
}
|
14963
|
+
return true;
|
14964
|
+
};
|
14965
|
+
};
|
14966
|
+
|
14967
|
+
var makeTest = function(func) {
|
14968
|
+
if (func.length < 2) {
|
14969
|
+
return function(el) {
|
14970
|
+
return !!func[0](el);
|
14971
|
+
};
|
14972
|
+
}
|
14973
|
+
return function(el) {
|
14974
|
+
var i = func.length;
|
14975
|
+
while (i--) {
|
14976
|
+
if (!(el = func[i](el))) return;
|
14977
|
+
}
|
14978
|
+
return true;
|
14979
|
+
};
|
14980
|
+
};
|
14981
|
+
|
14982
|
+
var makeSubject = function() {
|
14983
|
+
var target;
|
14984
|
+
|
14985
|
+
function subject(el) {
|
14986
|
+
var node = el.ownerDocument
|
14987
|
+
, scope = node.getElementsByTagName(subject.lname)
|
14988
|
+
, i = scope.length;
|
14989
|
+
|
14990
|
+
while (i--) {
|
14991
|
+
if (subject.test(scope[i]) && target === el) {
|
14992
|
+
target = null;
|
14993
|
+
return true;
|
14994
|
+
}
|
14995
|
+
}
|
14996
|
+
|
14997
|
+
target = null;
|
14998
|
+
}
|
14999
|
+
|
15000
|
+
subject.simple = function(el) {
|
15001
|
+
target = el;
|
15002
|
+
return true;
|
15003
|
+
};
|
15004
|
+
|
15005
|
+
return subject;
|
15006
|
+
};
|
15007
|
+
|
15008
|
+
var compileGroup = function(sel) {
|
15009
|
+
var test = compile(sel)
|
15010
|
+
, tests = [ test ];
|
15011
|
+
|
15012
|
+
while (test.sel) {
|
15013
|
+
test = compile(test.sel);
|
15014
|
+
tests.push(test);
|
15015
|
+
}
|
15016
|
+
|
15017
|
+
if (tests.length < 2) return test;
|
15018
|
+
|
15019
|
+
return function(el) {
|
15020
|
+
var l = tests.length
|
15021
|
+
, i = 0;
|
15022
|
+
|
15023
|
+
for (; i < l; i++) {
|
15024
|
+
if (tests[i](el)) return true;
|
15025
|
+
}
|
15026
|
+
};
|
15027
|
+
};
|
15028
|
+
|
15029
|
+
/**
|
15030
|
+
* Selection
|
15031
|
+
*/
|
15032
|
+
|
15033
|
+
var find = function(sel, node) {
|
15034
|
+
var results = []
|
15035
|
+
, test = compile(sel)
|
15036
|
+
, scope = node.getElementsByTagName(test.qname)
|
15037
|
+
, i = 0
|
15038
|
+
, el;
|
15039
|
+
|
15040
|
+
while (el = scope[i++]) {
|
15041
|
+
if (test(el)) results.push(el);
|
15042
|
+
}
|
15043
|
+
|
15044
|
+
if (test.sel) {
|
15045
|
+
while (test.sel) {
|
15046
|
+
test = compile(test.sel);
|
15047
|
+
scope = node.getElementsByTagName(test.qname);
|
15048
|
+
i = 0;
|
15049
|
+
while (el = scope[i++]) {
|
15050
|
+
if (test(el) && !~indexOf.call(results, el)) {
|
15051
|
+
results.push(el);
|
15052
|
+
}
|
15053
|
+
}
|
15054
|
+
}
|
15055
|
+
results.sort(order);
|
15056
|
+
}
|
15057
|
+
|
15058
|
+
return results;
|
15059
|
+
};
|
15060
|
+
|
15061
|
+
/**
|
15062
|
+
* Native
|
15063
|
+
*/
|
15064
|
+
|
15065
|
+
var select = (function() {
|
15066
|
+
var slice = (function() {
|
15067
|
+
try {
|
15068
|
+
Array.prototype.slice.call(document.getElementsByTagName('zest'));
|
15069
|
+
return Array.prototype.slice;
|
15070
|
+
} catch(e) {
|
15071
|
+
e = null;
|
15072
|
+
return function() {
|
15073
|
+
var a = [], i = 0, l = this.length;
|
15074
|
+
for (; i < l; i++) a.push(this[i]);
|
15075
|
+
return a;
|
15076
|
+
};
|
15077
|
+
}
|
15078
|
+
})();
|
15079
|
+
|
15080
|
+
if (document.querySelectorAll) {
|
15081
|
+
return function(sel, node) {
|
15082
|
+
try {
|
15083
|
+
return slice.call(node.querySelectorAll(sel));
|
15084
|
+
} catch(e) {
|
15085
|
+
return find(sel, node);
|
15086
|
+
}
|
15087
|
+
};
|
15088
|
+
}
|
15089
|
+
|
15090
|
+
return function(sel, node) {
|
15091
|
+
try {
|
15092
|
+
if (sel[0] === '#' && /^#[\w\-]+$/.test(sel)) {
|
15093
|
+
return [node.getElementById(sel.substring(1))];
|
15094
|
+
}
|
15095
|
+
if (sel[0] === '.' && /^\.[\w\-]+$/.test(sel)) {
|
15096
|
+
sel = node.getElementsByClassName(sel.substring(1));
|
15097
|
+
return slice.call(sel);
|
15098
|
+
}
|
15099
|
+
if (/^[\w\-]+$/.test(sel)) {
|
15100
|
+
return slice.call(node.getElementsByTagName(sel));
|
15101
|
+
}
|
15102
|
+
} catch(e) {
|
15103
|
+
;
|
15104
|
+
}
|
15105
|
+
return find(sel, node);
|
15106
|
+
};
|
15107
|
+
})();
|
15108
|
+
|
15109
|
+
/**
|
15110
|
+
* Zest
|
15111
|
+
*/
|
15112
|
+
|
15113
|
+
var zest = function(sel, node) {
|
15114
|
+
try {
|
15115
|
+
sel = select(sel, node || document);
|
15116
|
+
} catch(e) {
|
15117
|
+
if (window.ZEST_DEBUG) {
|
15118
|
+
console.log(e.stack || e + '');
|
15119
|
+
}
|
15120
|
+
sel = [];
|
15121
|
+
}
|
15122
|
+
return sel;
|
15123
|
+
};
|
15124
|
+
|
15125
|
+
/**
|
15126
|
+
* Expose
|
15127
|
+
*/
|
15128
|
+
|
15129
|
+
zest.selectors = selectors;
|
15130
|
+
zest.operators = operators;
|
15131
|
+
zest.combinators = combinators;
|
15132
|
+
zest.compile = compileGroup;
|
15133
|
+
|
15134
|
+
zest.matches = function(el, sel) {
|
15135
|
+
return !!compileGroup(sel)(el);
|
15136
|
+
};
|
15137
|
+
|
15138
|
+
zest.cache = function() {
|
15139
|
+
if (compile.raw) return;
|
15140
|
+
|
15141
|
+
var raw = compile
|
15142
|
+
, cache = {};
|
15143
|
+
|
15144
|
+
compile = function(sel) {
|
15145
|
+
return cache[sel]
|
15146
|
+
|| (cache[sel] = raw(sel));
|
15147
|
+
};
|
15148
|
+
|
15149
|
+
compile.raw = raw;
|
15150
|
+
zest._cache = cache;
|
15151
|
+
};
|
15152
|
+
|
15153
|
+
zest.noCache = function() {
|
15154
|
+
if (!compile.raw) return;
|
15155
|
+
compile = compile.raw;
|
15156
|
+
delete zest._cache;
|
15157
|
+
};
|
15158
|
+
|
15159
|
+
zest.noConflict = function() {
|
15160
|
+
window.zest = old;
|
15161
|
+
return zest;
|
15162
|
+
};
|
15163
|
+
|
15164
|
+
zest.noNative = function() {
|
15165
|
+
select = find;
|
15166
|
+
};
|
15167
|
+
|
15168
|
+
if (typeof module !== 'undefined') {
|
15169
|
+
module.exports = zest;
|
15170
|
+
} else {
|
15171
|
+
this.zest = zest;
|
15172
|
+
}
|
15173
|
+
|
15174
|
+
if (window.ZEST_DEBUG) {
|
15175
|
+
zest.noNative();
|
15176
|
+
} else {
|
15177
|
+
zest.cache();
|
15178
|
+
}
|
15179
|
+
|
15180
|
+
}).call(function() {
|
15181
|
+
return this || (typeof window !== 'undefined' ? window : global);
|
15182
|
+
}());
|
15183
|
+
|
15184
|
+
/*!
|
15185
|
+
* Reqwest! A general purpose XHR connection manager
|
15186
|
+
* (c) Dustin Diaz 2011
|
15187
|
+
* https://github.com/ded/reqwest
|
15188
|
+
* license MIT
|
15189
|
+
*/
|
15190
|
+
!function (name, definition) {
|
15191
|
+
if (typeof module != 'undefined') module.exports = definition()
|
15192
|
+
else if (typeof define == 'function' && define.amd) define(name, definition)
|
15193
|
+
else this[name] = definition()
|
15194
|
+
}('reqwest', function () {
|
15195
|
+
|
15196
|
+
var context = this
|
15197
|
+
, win = window
|
15198
|
+
, doc = document
|
15199
|
+
, old = context.reqwest
|
15200
|
+
, twoHundo = /^20\d$/
|
15201
|
+
, byTag = 'getElementsByTagName'
|
15202
|
+
, readyState = 'readyState'
|
15203
|
+
, contentType = 'Content-Type'
|
15204
|
+
, requestedWith = 'X-Requested-With'
|
15205
|
+
, head = doc[byTag]('head')[0]
|
15206
|
+
, uniqid = 0
|
15207
|
+
, lastValue // data stored by the most recent JSONP callback
|
15208
|
+
, xmlHttpRequest = 'XMLHttpRequest'
|
15209
|
+
, isArray = typeof Array.isArray == 'function' ? Array.isArray : function (a) {
|
15210
|
+
return a instanceof Array
|
15211
|
+
}
|
15212
|
+
, defaultHeaders = {
|
15213
|
+
contentType: 'application/x-www-form-urlencoded'
|
15214
|
+
, accept: {
|
15215
|
+
'*': 'text/javascript, text/html, application/xml, text/xml, */*'
|
15216
|
+
, xml: 'application/xml, text/xml'
|
15217
|
+
, html: 'text/html'
|
15218
|
+
, text: 'text/plain'
|
15219
|
+
, json: 'application/json, text/javascript'
|
15220
|
+
, js: 'application/javascript, text/javascript'
|
15221
|
+
}
|
15222
|
+
, requestedWith: xmlHttpRequest
|
15223
|
+
}
|
15224
|
+
, xhr = win[xmlHttpRequest] ?
|
15225
|
+
function () {
|
15226
|
+
return new XMLHttpRequest()
|
15227
|
+
} :
|
15228
|
+
function () {
|
15229
|
+
return new ActiveXObject('Microsoft.XMLHTTP')
|
15230
|
+
}
|
15231
|
+
|
15232
|
+
function handleReadyState(o, success, error) {
|
15233
|
+
return function () {
|
15234
|
+
if (o && o[readyState] == 4) {
|
15235
|
+
if (twoHundo.test(o.status)) {
|
15236
|
+
success(o)
|
15237
|
+
} else {
|
15238
|
+
error(o)
|
15239
|
+
}
|
15240
|
+
}
|
15241
|
+
}
|
15242
|
+
}
|
15243
|
+
|
15244
|
+
function setHeaders(http, o) {
|
15245
|
+
var headers = o.headers || {}, h
|
15246
|
+
headers.Accept = headers.Accept || defaultHeaders.accept[o.type] || defaultHeaders.accept['*']
|
15247
|
+
// breaks cross-origin requests with legacy browsers
|
15248
|
+
if (!o.crossOrigin && !headers[requestedWith]) headers[requestedWith] = defaultHeaders.requestedWith
|
15249
|
+
if (!headers[contentType]) headers[contentType] = o.contentType || defaultHeaders.contentType
|
15250
|
+
for (h in headers) {
|
15251
|
+
headers.hasOwnProperty(h) && http.setRequestHeader(h, headers[h])
|
15252
|
+
}
|
15253
|
+
}
|
15254
|
+
|
15255
|
+
function generalCallback(data) {
|
15256
|
+
lastValue = data
|
15257
|
+
}
|
15258
|
+
|
15259
|
+
function urlappend(url, s) {
|
15260
|
+
return url + (/\?/.test(url) ? '&' : '?') + s
|
15261
|
+
}
|
15262
|
+
|
15263
|
+
function handleJsonp(o, fn, err, url) {
|
15264
|
+
var reqId = uniqid++
|
15265
|
+
, cbkey = o.jsonpCallback || 'callback' // the 'callback' key
|
15266
|
+
, cbval = o.jsonpCallbackName || ('reqwest_' + reqId) // the 'callback' value
|
15267
|
+
, cbreg = new RegExp('((^|\\?|&)' + cbkey + ')=([^&]+)')
|
15268
|
+
, match = url.match(cbreg)
|
15269
|
+
, script = doc.createElement('script')
|
15270
|
+
, loaded = 0
|
15271
|
+
|
15272
|
+
if (match) {
|
15273
|
+
if (match[3] === '?') {
|
15274
|
+
url = url.replace(cbreg, '$1=' + cbval) // wildcard callback func name
|
15275
|
+
} else {
|
15276
|
+
cbval = match[3] // provided callback func name
|
15277
|
+
}
|
15278
|
+
} else {
|
15279
|
+
url = urlappend(url, cbkey + '=' + cbval) // no callback details, add 'em
|
15280
|
+
}
|
15281
|
+
|
15282
|
+
win[cbval] = generalCallback
|
15283
|
+
|
15284
|
+
script.type = 'text/javascript'
|
15285
|
+
script.src = url
|
15286
|
+
script.async = true
|
15287
|
+
if (typeof script.onreadystatechange !== 'undefined') {
|
15288
|
+
// need this for IE due to out-of-order onreadystatechange(), binding script
|
15289
|
+
// execution to an event listener gives us control over when the script
|
15290
|
+
// is executed. See http://jaubourg.net/2010/07/loading-script-as-onclick-handler-of.html
|
15291
|
+
script.event = 'onclick'
|
15292
|
+
script.htmlFor = script.id = '_reqwest_' + reqId
|
15293
|
+
}
|
15294
|
+
|
15295
|
+
script.onload = script.onreadystatechange = function () {
|
15296
|
+
if ((script[readyState] && script[readyState] !== 'complete' && script[readyState] !== 'loaded') || loaded) {
|
15297
|
+
return false
|
15298
|
+
}
|
15299
|
+
script.onload = script.onreadystatechange = null
|
15300
|
+
script.onclick && script.onclick()
|
15301
|
+
// Call the user callback with the last value stored and clean up values and scripts.
|
15302
|
+
o.success && o.success(lastValue)
|
15303
|
+
lastValue = undefined
|
15304
|
+
head.removeChild(script)
|
15305
|
+
loaded = 1
|
15306
|
+
}
|
15307
|
+
|
15308
|
+
// Add the script to the DOM head
|
15309
|
+
head.appendChild(script)
|
15310
|
+
}
|
15311
|
+
|
15312
|
+
function getRequest(o, fn, err) {
|
15313
|
+
var method = (o.method || 'GET').toUpperCase()
|
15314
|
+
, url = typeof o === 'string' ? o : o.url
|
15315
|
+
// convert non-string objects to query-string form unless o.processData is false
|
15316
|
+
, data = (o.processData !== false && o.data && typeof o.data !== 'string')
|
15317
|
+
? reqwest.toQueryString(o.data)
|
15318
|
+
: (o.data || null)
|
15319
|
+
, http
|
15320
|
+
|
15321
|
+
// if we're working on a GET request and we have data then we should append
|
15322
|
+
// query string to end of URL and not post data
|
15323
|
+
if ((o.type == 'jsonp' || method == 'GET') && data) {
|
15324
|
+
url = urlappend(url, data)
|
15325
|
+
data = null
|
15326
|
+
}
|
15327
|
+
|
15328
|
+
if (o.type == 'jsonp') return handleJsonp(o, fn, err, url)
|
15329
|
+
|
15330
|
+
http = xhr()
|
15331
|
+
http.open(method, url, true)
|
15332
|
+
setHeaders(http, o)
|
15333
|
+
http.onreadystatechange = handleReadyState(http, fn, err)
|
15334
|
+
o.before && o.before(http)
|
15335
|
+
http.send(data)
|
15336
|
+
return http
|
15337
|
+
}
|
15338
|
+
|
15339
|
+
function Reqwest(o, fn) {
|
15340
|
+
this.o = o
|
15341
|
+
this.fn = fn
|
15342
|
+
init.apply(this, arguments)
|
15343
|
+
}
|
15344
|
+
|
15345
|
+
function setType(url) {
|
15346
|
+
var m = url.match(/\.(json|jsonp|html|xml)(\?|$)/)
|
15347
|
+
return m ? m[1] : 'js'
|
15348
|
+
}
|
15349
|
+
|
15350
|
+
function init(o, fn) {
|
15351
|
+
this.url = typeof o == 'string' ? o : o.url
|
15352
|
+
this.timeout = null
|
15353
|
+
var type = o.type || setType(this.url)
|
15354
|
+
, self = this
|
15355
|
+
fn = fn || function () {}
|
15356
|
+
|
15357
|
+
if (o.timeout) {
|
15358
|
+
this.timeout = setTimeout(function () {
|
15359
|
+
self.abort()
|
15360
|
+
}, o.timeout)
|
15361
|
+
}
|
15362
|
+
|
15363
|
+
function complete(resp) {
|
15364
|
+
o.timeout && clearTimeout(self.timeout)
|
15365
|
+
self.timeout = null
|
15366
|
+
o.complete && o.complete(resp)
|
15367
|
+
}
|
15368
|
+
|
15369
|
+
function success(resp) {
|
15370
|
+
var r = resp.responseText
|
15371
|
+
if (r) {
|
15372
|
+
switch (type) {
|
15373
|
+
case 'json':
|
15374
|
+
try {
|
15375
|
+
resp = win.JSON ? win.JSON.parse(r) : eval('(' + r + ')')
|
15376
|
+
} catch (err) {
|
15377
|
+
return error(resp, 'Could not parse JSON in response', err)
|
15378
|
+
}
|
15379
|
+
break;
|
15380
|
+
case 'js':
|
15381
|
+
resp = eval(r)
|
15382
|
+
break;
|
15383
|
+
case 'html':
|
15384
|
+
resp = r
|
15385
|
+
break;
|
15386
|
+
}
|
15387
|
+
}
|
15388
|
+
|
15389
|
+
fn(resp)
|
15390
|
+
o.success && o.success(resp)
|
15391
|
+
|
15392
|
+
complete(resp)
|
15393
|
+
}
|
15394
|
+
|
15395
|
+
function error(resp, msg, t) {
|
15396
|
+
o.error && o.error(resp, msg, t)
|
15397
|
+
complete(resp)
|
15398
|
+
}
|
15399
|
+
|
15400
|
+
this.request = getRequest(o, success, error)
|
15401
|
+
}
|
15402
|
+
|
15403
|
+
Reqwest.prototype = {
|
15404
|
+
abort: function () {
|
15405
|
+
this.request.abort()
|
15406
|
+
}
|
15407
|
+
|
15408
|
+
, retry: function () {
|
15409
|
+
init.call(this, this.o, this.fn)
|
15410
|
+
}
|
15411
|
+
}
|
15412
|
+
|
15413
|
+
function reqwest(o, fn) {
|
15414
|
+
return new Reqwest(o, fn)
|
15415
|
+
}
|
15416
|
+
|
15417
|
+
// normalize newline variants according to spec -> CRLF
|
15418
|
+
function normalize(s) {
|
15419
|
+
return s ? s.replace(/\r?\n/g, '\r\n') : ''
|
15420
|
+
}
|
15421
|
+
|
15422
|
+
function serial(el, cb) {
|
15423
|
+
var n = el.name
|
15424
|
+
, t = el.tagName.toLowerCase()
|
15425
|
+
, optCb = function(o) {
|
15426
|
+
// IE gives value="" even where there is no value attribute
|
15427
|
+
// 'specified' ref: http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-862529273
|
15428
|
+
if (o && !o.disabled)
|
15429
|
+
cb(n, normalize(o.attributes.value && o.attributes.value.specified ? o.value : o.text))
|
15430
|
+
}
|
15431
|
+
|
15432
|
+
// don't serialize elements that are disabled or without a name
|
15433
|
+
if (el.disabled || !n) return;
|
15434
|
+
|
15435
|
+
switch (t) {
|
15436
|
+
case 'input':
|
15437
|
+
if (!/reset|button|image|file/i.test(el.type)) {
|
15438
|
+
var ch = /checkbox/i.test(el.type)
|
15439
|
+
, ra = /radio/i.test(el.type)
|
15440
|
+
, val = el.value;
|
15441
|
+
// WebKit gives us "" instead of "on" if a checkbox has no value, so correct it here
|
15442
|
+
(!(ch || ra) || el.checked) && cb(n, normalize(ch && val === '' ? 'on' : val))
|
15443
|
+
}
|
15444
|
+
break;
|
15445
|
+
case 'textarea':
|
15446
|
+
cb(n, normalize(el.value))
|
15447
|
+
break;
|
15448
|
+
case 'select':
|
15449
|
+
if (el.type.toLowerCase() === 'select-one') {
|
15450
|
+
optCb(el.selectedIndex >= 0 ? el.options[el.selectedIndex] : null)
|
15451
|
+
} else {
|
15452
|
+
for (var i = 0; el.length && i < el.length; i++) {
|
15453
|
+
el.options[i].selected && optCb(el.options[i])
|
15454
|
+
}
|
15455
|
+
}
|
15456
|
+
break;
|
15457
|
+
}
|
15458
|
+
}
|
15459
|
+
|
15460
|
+
// collect up all form elements found from the passed argument elements all
|
15461
|
+
// the way down to child elements; pass a '<form>' or form fields.
|
15462
|
+
// called with 'this'=callback to use for serial() on each element
|
15463
|
+
function eachFormElement() {
|
15464
|
+
var cb = this
|
15465
|
+
, e, i, j
|
15466
|
+
, serializeSubtags = function(e, tags) {
|
15467
|
+
for (var i = 0; i < tags.length; i++) {
|
15468
|
+
var fa = e[byTag](tags[i])
|
15469
|
+
for (j = 0; j < fa.length; j++) serial(fa[j], cb)
|
15470
|
+
}
|
15471
|
+
}
|
15472
|
+
|
15473
|
+
for (i = 0; i < arguments.length; i++) {
|
15474
|
+
e = arguments[i]
|
15475
|
+
if (/input|select|textarea/i.test(e.tagName)) serial(e, cb)
|
15476
|
+
serializeSubtags(e, [ 'input', 'select', 'textarea' ])
|
15477
|
+
}
|
15478
|
+
}
|
15479
|
+
|
15480
|
+
// standard query string style serialization
|
15481
|
+
function serializeQueryString() {
|
15482
|
+
return reqwest.toQueryString(reqwest.serializeArray.apply(null, arguments))
|
15483
|
+
}
|
15484
|
+
|
15485
|
+
// { 'name': 'value', ... } style serialization
|
15486
|
+
function serializeHash() {
|
15487
|
+
var hash = {}
|
15488
|
+
eachFormElement.apply(function (name, value) {
|
15489
|
+
if (name in hash) {
|
15490
|
+
hash[name] && !isArray(hash[name]) && (hash[name] = [hash[name]])
|
15491
|
+
hash[name].push(value)
|
15492
|
+
} else hash[name] = value
|
15493
|
+
}, arguments)
|
15494
|
+
return hash
|
15495
|
+
}
|
15496
|
+
|
15497
|
+
// [ { name: 'name', value: 'value' }, ... ] style serialization
|
15498
|
+
reqwest.serializeArray = function () {
|
15499
|
+
var arr = []
|
15500
|
+
eachFormElement.apply(function(name, value) {
|
15501
|
+
arr.push({name: name, value: value})
|
15502
|
+
}, arguments)
|
15503
|
+
return arr
|
15504
|
+
}
|
15505
|
+
|
15506
|
+
reqwest.serialize = function () {
|
15507
|
+
if (arguments.length === 0) return ''
|
15508
|
+
var opt, fn
|
15509
|
+
, args = Array.prototype.slice.call(arguments, 0)
|
15510
|
+
|
15511
|
+
opt = args.pop()
|
15512
|
+
opt && opt.nodeType && args.push(opt) && (opt = null)
|
15513
|
+
opt && (opt = opt.type)
|
15514
|
+
|
15515
|
+
if (opt == 'map') fn = serializeHash
|
15516
|
+
else if (opt == 'array') fn = reqwest.serializeArray
|
15517
|
+
else fn = serializeQueryString
|
15518
|
+
|
15519
|
+
return fn.apply(null, args)
|
15520
|
+
}
|
15521
|
+
|
15522
|
+
reqwest.toQueryString = function (o) {
|
15523
|
+
var qs = '', i
|
15524
|
+
, enc = encodeURIComponent
|
15525
|
+
, push = function (k, v) {
|
15526
|
+
qs += enc(k) + '=' + enc(v) + '&'
|
15527
|
+
}
|
15528
|
+
|
15529
|
+
if (isArray(o)) {
|
15530
|
+
for (i = 0; o && i < o.length; i++) push(o[i].name, o[i].value)
|
15531
|
+
} else {
|
15532
|
+
for (var k in o) {
|
15533
|
+
if (!Object.hasOwnProperty.call(o, k)) continue;
|
15534
|
+
var v = o[k]
|
15535
|
+
if (isArray(v)) {
|
15536
|
+
for (i = 0; i < v.length; i++) push(k, v[i])
|
15537
|
+
} else push(k, o[k])
|
15538
|
+
}
|
15539
|
+
}
|
15540
|
+
|
15541
|
+
// spaces should be + according to spec
|
15542
|
+
return qs.replace(/&$/, '').replace(/%20/g,'+')
|
15543
|
+
}
|
15544
|
+
|
15545
|
+
// jQuery and Zepto compatibility, differences can be remapped here so you can call
|
15546
|
+
// .ajax.compat(options, callback)
|
15547
|
+
reqwest.compat = function (o, fn) {
|
15548
|
+
if (o) {
|
15549
|
+
o.type && (o.method = o.type) && delete o.type
|
15550
|
+
o.dataType && (o.type = o.dataType)
|
15551
|
+
o.jsonpCallback && (o.jsonpCallbackName = o.jsonpCallback) && delete o.jsonpCallback
|
15552
|
+
o.jsonp && (o.jsonpCallback = o.jsonp)
|
15553
|
+
}
|
15554
|
+
return new Reqwest(o, fn)
|
15555
|
+
}
|
15556
|
+
|
15557
|
+
return reqwest
|
15558
|
+
});
|
15559
|
+
|
15560
|
+
(function() {
|
15561
|
+
var SAFARI_CONTAINS_IS_BROKEN, version;
|
15562
|
+
|
15563
|
+
if (/Safari/.test(navigator.userAgent)) {
|
15564
|
+
version = /WebKit\/(\S+)/.exec(navigator.userAgent);
|
15565
|
+
if (version && parseFloat(version) < 540) {
|
15566
|
+
SAFARI_CONTAINS_IS_BROKEN = true;
|
15567
|
+
}
|
15568
|
+
}
|
15569
|
+
|
15570
|
+
(typeof window !== "undefined" && window !== null ? window : global).containsNode = function(parent, child) {
|
15571
|
+
if (parent === child) {
|
15572
|
+
return true;
|
15573
|
+
}
|
15574
|
+
if (parent.contains && !SAFARI_CONTAINS_IS_BROKEN) {
|
15575
|
+
return parent.contains(child);
|
15576
|
+
}
|
15577
|
+
if (parent.compareDocumentPosition) {
|
15578
|
+
return !!(parent.compareDocumentPosition(child) & 16);
|
15579
|
+
}
|
15580
|
+
while (child && parent !== child) {
|
15581
|
+
child = child.parentNode;
|
15582
|
+
}
|
15583
|
+
return child === parent;
|
15584
|
+
};
|
15585
|
+
|
15586
|
+
}).call(this);
|
15587
|
+
|
15588
|
+
(function() {
|
15589
|
+
Batman.extend(Batman.DOM, {
|
15590
|
+
querySelectorAll: function(node, selector) {
|
15591
|
+
return zest(selector, node);
|
15592
|
+
},
|
15593
|
+
querySelector: function(node, selector) {
|
15594
|
+
return zest(selector, node)[0];
|
15595
|
+
},
|
15596
|
+
setInnerHTML: function(node, html) {
|
15597
|
+
return node != null ? node.innerHTML = html : void 0;
|
15598
|
+
},
|
15599
|
+
containsNode: function(parent, child) {
|
15600
|
+
if (!child) {
|
15601
|
+
child = parent;
|
15602
|
+
parent = document.body;
|
15603
|
+
}
|
15604
|
+
return window.containsNode(parent, child);
|
15605
|
+
},
|
15606
|
+
textContent: function(node) {
|
15607
|
+
var _ref;
|
15608
|
+
return (_ref = node.textContent) != null ? _ref : node.innerText;
|
15609
|
+
},
|
15610
|
+
destroyNode: function(node) {
|
15611
|
+
var _ref;
|
15612
|
+
Batman.DOM.cleanupNode(node);
|
15613
|
+
return node != null ? (_ref = node.parentNode) != null ? _ref.removeChild(node) : void 0 : void 0;
|
15614
|
+
}
|
15615
|
+
});
|
15616
|
+
|
15617
|
+
Batman.extend(Batman.Request.prototype, {
|
15618
|
+
_parseResponseHeaders: function(xhr) {
|
15619
|
+
var headers;
|
15620
|
+
return headers = xhr.getAllResponseHeaders().split('\n').reduce(function(acc, header) {
|
15621
|
+
var key, matches, value;
|
15622
|
+
if (matches = header.match(/([^:]*):\s*(.*)/)) {
|
15623
|
+
key = matches[1];
|
15624
|
+
value = matches[2];
|
15625
|
+
acc[key] = value;
|
15626
|
+
}
|
15627
|
+
return acc;
|
15628
|
+
}, {});
|
15629
|
+
},
|
15630
|
+
send: function(data) {
|
15631
|
+
var options, xhr, _ref,
|
15632
|
+
_this = this;
|
15633
|
+
if (data == null) {
|
15634
|
+
data = this.get('data');
|
15635
|
+
}
|
15636
|
+
this.fire('loading');
|
15637
|
+
options = {
|
15638
|
+
url: this.get('url'),
|
15639
|
+
method: this.get('method'),
|
15640
|
+
type: this.get('type'),
|
15641
|
+
headers: this.get('headers'),
|
15642
|
+
success: function(response) {
|
15643
|
+
_this.mixin({
|
15644
|
+
xhr: xhr,
|
15645
|
+
response: response,
|
15646
|
+
status: typeof xhr !== "undefined" && xhr !== null ? xhr.status : void 0,
|
15647
|
+
responseHeaders: _this._parseResponseHeaders(xhr)
|
15648
|
+
});
|
15649
|
+
return _this.fire('success', response);
|
15650
|
+
},
|
15651
|
+
error: function(xhr) {
|
15652
|
+
_this.mixin({
|
15653
|
+
xhr: xhr,
|
15654
|
+
response: xhr.responseText || xhr.content,
|
15655
|
+
status: xhr.status,
|
15656
|
+
responseHeaders: _this._parseResponseHeaders(xhr)
|
15657
|
+
});
|
15658
|
+
xhr.request = _this;
|
15659
|
+
return _this.fire('error', xhr);
|
15660
|
+
},
|
15661
|
+
complete: function() {
|
15662
|
+
return _this.fire('loaded');
|
15663
|
+
}
|
15664
|
+
};
|
15665
|
+
if ((_ref = options.method) === 'PUT' || _ref === 'POST') {
|
15666
|
+
if (this.hasFileUploads()) {
|
15667
|
+
options.data = this.constructor.objectToFormData(data);
|
15668
|
+
} else {
|
15669
|
+
options.contentType = this.get('contentType');
|
15670
|
+
options.data = Batman.URI.queryFromParams(data);
|
15671
|
+
}
|
15672
|
+
} else {
|
15673
|
+
options.data = data;
|
15674
|
+
}
|
15675
|
+
return xhr = (reqwest(options)).request;
|
15676
|
+
}
|
15677
|
+
});
|
15678
|
+
|
15679
|
+
}).call(this);
|
15680
|
+
|
15681
|
+
(function() {
|
15682
|
+
|
15683
|
+
|
13243
15684
|
}).call(this);
|