canjs-rails 0.1.0 → 1.1.2
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.
- data/CHANGELOG.md +5 -0
- data/canjs-rails.gemspec +1 -1
- data/lib/canjs/rails/version.rb +2 -2
- data/vendor/assets/javascripts/can.construct.proxy.js +27 -26
- data/vendor/assets/javascripts/can.construct.super.js +40 -36
- data/vendor/assets/javascripts/can.control.plugin.js +92 -229
- data/vendor/assets/javascripts/can.control.view.js +37 -31
- data/vendor/assets/javascripts/can.fixture.js +277 -570
- data/vendor/assets/javascripts/can.jquery.js +2396 -1792
- data/vendor/assets/javascripts/can.jquery.min.js +70 -52
- data/vendor/assets/javascripts/can.observe.attributes.js +137 -276
- data/vendor/assets/javascripts/can.observe.backup.js +137 -335
- data/vendor/assets/javascripts/can.observe.delegate.js +97 -250
- data/vendor/assets/javascripts/can.observe.setter.js +53 -52
- data/vendor/assets/javascripts/can.observe.validations.js +187 -362
- data/vendor/assets/javascripts/can.view.modifiers.js +57 -190
- data/vendor/assets/javascripts/can.view.mustache.js +758 -0
- data/vendor/assets/javascripts/download_canjs.sh +18 -13
- metadata +4 -3
data/CHANGELOG.md
CHANGED
data/canjs-rails.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.email = ["craig@mindscratch.org"]
|
10
10
|
s.homepage = "https://github.com/mindscratch/canjs-rails"
|
11
11
|
s.summary = "Use CanJS with Rails 3.1+"
|
12
|
-
s.description = "This gem provides CanJS for your Rails 3.1+ application."
|
12
|
+
s.description = "This gem provides CanJS (for jQuery) for your Rails 3.1+ application."
|
13
13
|
|
14
14
|
s.required_rubygems_version = ">= 1.3.6"
|
15
15
|
s.rubyforge_project = "canjs-rails"
|
data/lib/canjs/rails/version.rb
CHANGED
@@ -1,9 +1,16 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
/*
|
2
|
+
* CanJS - 1.1.2 (2012-11-28)
|
3
|
+
* http://canjs.us/
|
4
|
+
* Copyright (c) 2012 Bitovi
|
5
|
+
* Licensed MIT
|
6
|
+
*/
|
7
|
+
(function (can, window, undefined) {
|
8
|
+
// ## can/construct/proxy/proxy.js
|
9
|
+
var isFunction = can.isFunction,
|
10
|
+
isArray = can.isArray,
|
11
|
+
makeArray = can.makeArray,
|
12
|
+
|
13
|
+
proxy = function (funcs) {
|
7
14
|
|
8
15
|
//args that should be curried
|
9
16
|
var args = makeArray(arguments),
|
@@ -13,48 +20,42 @@ proxy = function( funcs ) {
|
|
13
20
|
funcs = args.shift();
|
14
21
|
|
15
22
|
// if there is only one function, make funcs into an array
|
16
|
-
if (!isArray(funcs)
|
23
|
+
if (!isArray(funcs)) {
|
17
24
|
funcs = [funcs];
|
18
25
|
}
|
19
|
-
|
26
|
+
|
20
27
|
// keep a reference to us in self
|
21
28
|
self = this;
|
22
|
-
|
23
|
-
|
29
|
+
|
30
|
+
|
24
31
|
return function class_cb() {
|
25
32
|
// add the arguments after the curried args
|
26
33
|
var cur = args.concat(makeArray(arguments)),
|
27
|
-
isString,
|
28
|
-
length = funcs.length,
|
34
|
+
isString, length = funcs.length,
|
29
35
|
f = 0,
|
30
36
|
func;
|
31
|
-
|
37
|
+
|
32
38
|
// go through each function to call back
|
33
|
-
for (; f < length; f++
|
39
|
+
for (; f < length; f++) {
|
34
40
|
func = funcs[f];
|
35
|
-
if (!func
|
41
|
+
if (!func) {
|
36
42
|
continue;
|
37
43
|
}
|
38
|
-
|
44
|
+
|
39
45
|
// set called with the name of the function on self (this is how this.view works)
|
40
46
|
isString = typeof func == "string";
|
41
|
-
|
47
|
+
|
42
48
|
// call the function
|
43
49
|
cur = (isString ? self[func] : func).apply(self, cur || []);
|
44
|
-
|
50
|
+
|
45
51
|
// pass the result to the next function (if there is a next function)
|
46
|
-
if (
|
52
|
+
if (f < length - 1) {
|
47
53
|
cur = !isArray(cur) || cur._use_call ? [cur] : cur
|
48
54
|
}
|
49
55
|
}
|
50
56
|
return cur;
|
51
57
|
}
|
52
58
|
}
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
+
can.Construct.proxy = can.Construct.prototype.proxy = proxy;
|
59
60
|
|
60
|
-
})(
|
61
|
+
})(can, this);
|
@@ -1,44 +1,48 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
/*
|
2
|
+
* CanJS - 1.1.2 (2012-11-28)
|
3
|
+
* http://canjs.us/
|
4
|
+
* Copyright (c) 2012 Bitovi
|
5
|
+
* Licensed MIT
|
6
|
+
*/
|
7
|
+
(function (can, window, undefined) {
|
8
|
+
// ## can/construct/super/super.js
|
9
|
+
// tests if we can get super in .toString()
|
4
10
|
var isFunction = can.isFunction,
|
5
|
-
|
6
|
-
fnTest = /xyz/.test(function() {
|
11
|
+
|
12
|
+
fnTest = /xyz/.test(function () {
|
7
13
|
xyz;
|
8
14
|
}) ? /\b_super\b/ : /.*/;
|
9
|
-
|
10
|
-
// overwrites a single property so it can still call super
|
11
|
-
can.Construct._overwrite = function(addTo, base, name, val){
|
12
|
-
// Check if we're overwriting an existing function
|
13
|
-
addTo[name] = isFunction(val) &&
|
14
|
-
isFunction(base[name]) &&
|
15
|
-
fnTest.test(val) ? (function( name, fn ) {
|
16
|
-
return function() {
|
17
|
-
var tmp = this._super,
|
18
|
-
ret;
|
19
15
|
|
20
|
-
|
21
|
-
|
22
|
-
|
16
|
+
// overwrites a single property so it can still call super
|
17
|
+
can.Construct._overwrite = function (addTo, base, name, val) {
|
18
|
+
// Check if we're overwriting an existing function
|
19
|
+
addTo[name] = isFunction(val) && isFunction(base[name]) && fnTest.test(val) ? (function (name, fn) {
|
20
|
+
return function () {
|
21
|
+
var tmp = this._super,
|
22
|
+
ret;
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
24
|
+
// Add a new ._super() method that is the same method
|
25
|
+
// but on the super-class
|
26
|
+
this._super = base[name];
|
27
|
+
|
28
|
+
// The method only need to be bound temporarily, so we
|
29
|
+
// remove it when we're done executing
|
30
|
+
ret = fn.apply(this, arguments);
|
31
|
+
this._super = tmp;
|
32
|
+
return ret;
|
33
|
+
};
|
34
|
+
})(name, val) : val;
|
35
|
+
}
|
36
|
+
// overwrites an object with methods, sets up _super
|
37
|
+
// newProps - new properties
|
38
|
+
// oldProps - where the old properties might be
|
39
|
+
// addTo - what we are adding to
|
40
|
+
can.Construct._inherit = function (newProps, oldProps, addTo) {
|
41
|
+
addTo = addTo || newProps
|
42
|
+
for (var name in newProps) {
|
43
|
+
can.Construct._overwrite(addTo, oldProps, name, newProps[name]);
|
41
44
|
}
|
45
|
+
}
|
42
46
|
|
43
47
|
|
44
|
-
})(
|
48
|
+
})(can, this);
|
@@ -1,245 +1,108 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
1
|
+
/*
|
2
|
+
* CanJS - 1.1.2 (2012-11-28)
|
3
|
+
* http://canjs.us/
|
4
|
+
* Copyright (c) 2012 Bitovi
|
5
|
+
* Licensed MIT
|
6
|
+
*/
|
7
|
+
(function (window, $, can, undefined) {
|
8
|
+
// ## can/control/plugin/plugin.js
|
9
|
+
//used to determine if a control instance is one of controllers
|
10
|
+
//controllers can be strings or classes
|
11
|
+
var i, isAControllerOf = function (instance, controllers) {
|
12
|
+
for (i = 0; i < controllers.length; i++) {
|
13
|
+
if (typeof controllers[i] == 'string' ? instance.constructor._shortName == controllers[i] : instance instanceof controllers[i]) {
|
11
14
|
return true;
|
12
15
|
}
|
13
16
|
}
|
14
17
|
return false;
|
15
18
|
},
|
16
|
-
|
17
|
-
|
18
|
-
},
|
19
|
-
makeArray = can.makeArray,
|
20
|
-
old = can.Control.setup;
|
19
|
+
makeArray = can.makeArray,
|
20
|
+
old = can.Control.setup;
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
can.Control.setup = function() {
|
26
|
-
// if you didn't provide a name, or are control, don't do anything
|
27
|
-
if ( this !== can.Control ) {
|
28
|
-
|
29
|
-
/**
|
30
|
-
* @attribute can.Control.plugin.static.pluginName
|
31
|
-
* @parent can.Control.plugin
|
32
|
-
*
|
33
|
-
* Setting the static `pluginName` property allows you to override the default name
|
34
|
-
* with your own.
|
35
|
-
*
|
36
|
-
* var Filler = can.Control({
|
37
|
-
* pluginName: 'fillWith'
|
38
|
-
* },{});
|
39
|
-
*
|
40
|
-
* $("#foo").fillWith();
|
41
|
-
*
|
42
|
-
* If you don't provide a `pluginName`, the control falls back to the
|
43
|
-
* [can.Construct.fullName fullName] attribute:
|
44
|
-
*
|
45
|
-
* can.Control('Ui.Layout.FillWith', {}, {});
|
46
|
-
* $("#foo").ui_layout_fill_with();
|
47
|
-
*
|
48
|
-
*/
|
49
|
-
var pluginName = this.pluginName || this._fullName;
|
50
|
-
|
51
|
-
// create jQuery plugin
|
52
|
-
if(pluginName !== 'can_control'){
|
53
|
-
this.plugin(pluginName);
|
54
|
-
}
|
55
|
-
|
56
|
-
old.apply(this, arguments);
|
57
|
-
}
|
58
|
-
};
|
22
|
+
can.Control.setup = function () {
|
23
|
+
// if you didn't provide a name, or are control, don't do anything
|
24
|
+
if (this !== can.Control) {
|
59
25
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
* @function jQuery.fn.controls
|
67
|
-
* @parent can.Control.plugin
|
68
|
-
*
|
69
|
-
* When the widget is initialized, the plugin control creates an array
|
70
|
-
* of control instance(s) with the DOM element it was initialized on using
|
71
|
-
* [can.data] method.
|
72
|
-
*
|
73
|
-
* The `controls` method allows you to get the control instance(s) for any element.
|
74
|
-
*
|
75
|
-
* //- Inits the widgets
|
76
|
-
* $('.widgets:eq(0)').my_box();
|
77
|
-
* $('.widgets:eq(1)').my_clock();
|
78
|
-
*
|
79
|
-
* <div class="widgets my_box" />
|
80
|
-
* <div class="widgets my_clock" />
|
81
|
-
*
|
82
|
-
* $('.widgets').controls() //-> [ MyBox, MyClock ]
|
83
|
-
*
|
84
|
-
* Additionally, you can invoke it passing the name of a control
|
85
|
-
* to fetch a specific instance(s).
|
86
|
-
*
|
87
|
-
* //- Inits the widgets
|
88
|
-
* $('.widgets:eq(0)').my_box();
|
89
|
-
* $('.widgets:eq(1)').my_clock();
|
90
|
-
*
|
91
|
-
* <div class="widgets my_box" />
|
92
|
-
* <div class="widgets my_clock" />
|
93
|
-
*
|
94
|
-
* $('.widgets').controls('MyBox') //-> [ MyBox ]
|
95
|
-
*
|
96
|
-
* @param {Object} control (optional) if exists the control instance(s) with that constructor function or type will be returned.
|
97
|
-
* @return {Array} an array of control instance(s).
|
98
|
-
*/
|
99
|
-
controls: function() {
|
100
|
-
var controllerNames = makeArray(arguments),
|
101
|
-
instances = [],
|
102
|
-
controls, c, cname;
|
103
|
-
//check if arguments
|
104
|
-
this.each(function() {
|
105
|
-
|
106
|
-
controls = can.$(this).data("controls");
|
107
|
-
if(!controls){
|
108
|
-
return;
|
26
|
+
|
27
|
+
var pluginName = this.pluginName || this._fullName;
|
28
|
+
|
29
|
+
// create jQuery plugin
|
30
|
+
if (pluginName !== 'can_control') {
|
31
|
+
this.plugin(pluginName);
|
109
32
|
}
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
33
|
+
|
34
|
+
old.apply(this, arguments);
|
35
|
+
}
|
36
|
+
};
|
37
|
+
|
38
|
+
$.fn.extend({
|
39
|
+
|
40
|
+
|
41
|
+
controls: function () {
|
42
|
+
var controllerNames = makeArray(arguments),
|
43
|
+
instances = [],
|
44
|
+
controls, c, cname;
|
45
|
+
//check if arguments
|
46
|
+
this.each(function () {
|
47
|
+
|
48
|
+
controls = can.$(this).data("controls");
|
49
|
+
if (!controls) {
|
50
|
+
return;
|
114
51
|
}
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
/**
|
121
|
-
* @function jQuery.fn.control
|
122
|
-
* @parent can.Control.plugin
|
123
|
-
*
|
124
|
-
* The `control` does the same as [jQuery.fn.controls controls] execept it only
|
125
|
-
* returns the first instance found.
|
126
|
-
*
|
127
|
-
* //- Init MyBox widget
|
128
|
-
* $('.widgets').my_box();
|
129
|
-
*
|
130
|
-
* <div class="widgets my_box" />
|
131
|
-
*
|
132
|
-
* $('.widgets').controls() //-> MyBox
|
133
|
-
*
|
134
|
-
* @param {Object} control (optional) if exists the first control instance with that constructor function or type will be returned.
|
135
|
-
* @return {can.Control} the first control.
|
136
|
-
*/
|
137
|
-
control: function( control ) {
|
138
|
-
return this.controls.apply(this, arguments)[0];
|
139
|
-
}
|
140
|
-
});
|
141
|
-
|
142
|
-
can.Control.plugin = function(pluginname){
|
143
|
-
var control = this;
|
144
|
-
|
145
|
-
if (!$.fn[pluginname]) {
|
146
|
-
$.fn[pluginname] = function(options){
|
147
|
-
|
148
|
-
var args = makeArray(arguments), //if the arg is a method on this control
|
149
|
-
isMethod = typeof options == "string" && $.isFunction(control.prototype[options]), meth = args[0];
|
150
|
-
return this.each(function(){
|
151
|
-
//check if created
|
152
|
-
var plugin = can.$(this).control(control);
|
153
|
-
|
154
|
-
if (plugin) {
|
155
|
-
if (isMethod) {
|
156
|
-
// call a method on the control with the remaining args
|
157
|
-
plugin[meth].apply(plugin, args.slice(1));
|
52
|
+
for (var i = 0; i < controls.length; i++) {
|
53
|
+
c = controls[i];
|
54
|
+
if (!controllerNames.length || isAControllerOf(c, controllerNames)) {
|
55
|
+
instances.push(c);
|
158
56
|
}
|
159
|
-
else {
|
160
|
-
// call the plugin's update method
|
161
|
-
plugin.update.apply(plugin, args);
|
162
|
-
}
|
163
|
-
}
|
164
|
-
else {
|
165
|
-
//create a new control instance
|
166
|
-
control.newInstance.apply(control, [this].concat(args));
|
167
57
|
}
|
168
58
|
});
|
169
|
-
|
59
|
+
return instances;
|
60
|
+
},
|
61
|
+
|
62
|
+
|
63
|
+
control: function (control) {
|
64
|
+
return this.controls.apply(this, arguments)[0];
|
65
|
+
}
|
66
|
+
});
|
67
|
+
|
68
|
+
can.Control.plugin = function (pluginname) {
|
69
|
+
var control = this;
|
70
|
+
|
71
|
+
if (!$.fn[pluginname]) {
|
72
|
+
$.fn[pluginname] = function (options) {
|
73
|
+
|
74
|
+
var args = makeArray(arguments),
|
75
|
+
//if the arg is a method on this control
|
76
|
+
isMethod = typeof options == "string" && $.isFunction(control.prototype[options]),
|
77
|
+
meth = args[0],
|
78
|
+
returns;
|
79
|
+
this.each(function () {
|
80
|
+
//check if created
|
81
|
+
var plugin = can.$(this).control(control);
|
82
|
+
|
83
|
+
if (plugin) {
|
84
|
+
if (isMethod) {
|
85
|
+
// call a method on the control with the remaining args
|
86
|
+
returns = plugin[meth].apply(plugin, args.slice(1));
|
87
|
+
}
|
88
|
+
else {
|
89
|
+
// call the plugin's update method
|
90
|
+
plugin.update.apply(plugin, args);
|
91
|
+
}
|
92
|
+
}
|
93
|
+
else {
|
94
|
+
//create a new control instance
|
95
|
+
control.newInstance.apply(control, [this].concat(args));
|
96
|
+
}
|
97
|
+
});
|
98
|
+
return returns !== undefined ? returns : this;
|
99
|
+
};
|
100
|
+
}
|
170
101
|
}
|
171
|
-
|
172
|
-
|
173
|
-
/**
|
174
|
-
* @function can.Control.prototype.update
|
175
|
-
* @parent can.Control.plugin
|
176
|
-
*
|
177
|
-
* Update extends [can.Control.prototype.options options]
|
178
|
-
* with the `options` argument and rebinds all events. It
|
179
|
-
* re-configures the control.
|
180
|
-
*
|
181
|
-
* For example, the following control wraps a recipe form. When the form
|
182
|
-
* is submitted, it creates the recipe on the server. When the recipe
|
183
|
-
* is `created`, it resets the form with a new instance.
|
184
|
-
*
|
185
|
-
* var Creator = can.Control({
|
186
|
-
* "{recipe} created" : function(){
|
187
|
-
* this.update({recipe : new Recipe()});
|
188
|
-
* this.element[0].reset();
|
189
|
-
* this.element.find("[type=submit]").val("Create Recipe")
|
190
|
-
* },
|
191
|
-
* "submit" : function(el, ev){
|
192
|
-
* ev.preventDefault();
|
193
|
-
* var recipe = this.options.recipe;
|
194
|
-
* recipe.attrs( this.element.formParams() );
|
195
|
-
* this.element.find("[type=submit]").val("Saving...")
|
196
|
-
* recipe.save();
|
197
|
-
* }
|
198
|
-
* });
|
199
|
-
*
|
200
|
-
* $('#createRecipes').creator({ recipe : new Recipe() })
|
201
|
-
*
|
202
|
-
* *Update* is called if a control's plugin helper is called with the plugin options on an element
|
203
|
-
* that already has a control instance of the same type. If you want to implement your
|
204
|
-
* own update method make sure to call the old one either using the [can.Construct.super super] plugin or
|
205
|
-
* by calling `can.Control.prototype.update.apply(this, arguments);`.
|
206
|
-
* For example, you can change the content of the control element every time the options change:
|
207
|
-
*
|
208
|
-
* var Plugin = can.Control({
|
209
|
-
* pluginName: 'myPlugin'
|
210
|
-
* }, {
|
211
|
-
* init : function(el, options) {
|
212
|
-
* this.updateCount = 0;
|
213
|
-
* this.update({
|
214
|
-
* text : 'Initialized'
|
215
|
-
* });
|
216
|
-
* },
|
217
|
-
* update : function(options) {
|
218
|
-
* // Call the can.Control update first.
|
219
|
-
* // Use this._super when using can/construct/super
|
220
|
-
* can.Control.prototype.update.call(this, options);
|
221
|
-
* this.element.html(this.options.text + ' ' +
|
222
|
-
* (++this.updateCount) + ' times');
|
223
|
-
* }
|
224
|
-
* });
|
225
|
-
*
|
226
|
-
* $('#control').myPlugin();
|
227
|
-
* $('#control').html();
|
228
|
-
* // Initialized. Updated 1 times
|
229
|
-
*
|
230
|
-
* $('#control').myPlugin({ text : 'Calling update. Updated' });
|
231
|
-
* $('#control').html();
|
232
|
-
* // Calling update. Updated 2 times
|
233
|
-
*
|
234
|
-
* @demo can/control/plugin/demo-update.html
|
235
|
-
*
|
236
|
-
* @param {Object} options A list of options to merge with
|
237
|
-
* [can.Control.prototype.options this.options]. Often this method
|
238
|
-
* is called by the [can.Control.plugin jQuery helper function].
|
239
|
-
*/
|
240
|
-
can.Control.prototype.update = function( options ) {
|
102
|
+
|
103
|
+
can.Control.prototype.update = function (options) {
|
241
104
|
can.extend(this.options, options);
|
242
105
|
this.on();
|
243
|
-
};
|
106
|
+
};
|
244
107
|
|
245
|
-
})(this
|
108
|
+
})(this, jQuery, can);
|