right-rails 1.0.3 → 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +8 -2
- data/Rakefile +28 -28
- data/lib/right_rails/java_script_generator.rb +59 -51
- data/public/images/{colorpicker.png → rightjs-ui/colorpicker.png} +0 -0
- data/public/images/{resizable.png → rightjs-ui/resizable.png} +0 -0
- data/public/javascripts/right-olds-src.js +47 -46
- data/public/javascripts/right-safe-src.js +103 -102
- data/public/javascripts/right-safe.js +1 -1
- data/public/javascripts/right-src.js +611 -541
- data/public/javascripts/right.js +86 -85
- data/public/javascripts/right/autocompleter-src.js +81 -77
- data/public/javascripts/right/autocompleter.js +1 -1
- data/public/javascripts/right/calendar-src.js +209 -197
- data/public/javascripts/right/calendar.js +6 -6
- data/public/javascripts/right/colorpicker-src.js +127 -117
- data/public/javascripts/right/colorpicker.js +6 -6
- data/public/javascripts/right/dnd-src.js +63 -63
- data/public/javascripts/right/dnd.js +2 -2
- data/public/javascripts/right/in-edit-src.js +53 -48
- data/public/javascripts/right/in-edit.js +2 -2
- data/public/javascripts/right/lightbox-src.js +107 -99
- data/public/javascripts/right/lightbox.js +2 -2
- data/public/javascripts/right/rater-src.js +48 -46
- data/public/javascripts/right/rater.js +3 -3
- data/public/javascripts/right/resizable-src.js +53 -61
- data/public/javascripts/right/resizable.js +4 -4
- data/public/javascripts/right/selectable-src.js +97 -95
- data/public/javascripts/right/selectable.js +2 -2
- data/public/javascripts/right/slider-src.js +47 -45
- data/public/javascripts/right/slider.js +8 -8
- data/public/javascripts/right/sortable-src.js +54 -52
- data/public/javascripts/right/tabs-src.js +181 -171
- data/public/javascripts/right/tooltip-src.js +39 -37
- data/public/javascripts/right/uploader-src.js +21 -19
- data/spec/lib/right_rails/java_script_generator_spec.rb +61 -56
- metadata +9 -7
@@ -33,13 +33,13 @@ var R = RightJS,
|
|
33
33
|
* @param String tag-name or Object methods
|
34
34
|
* @param Object methods
|
35
35
|
* @return Widget wrapper
|
36
|
-
*/
|
36
|
+
*/
|
37
37
|
function Widget(tag_name, methods) {
|
38
38
|
if (!methods) {
|
39
39
|
methods = tag_name;
|
40
40
|
tag_name = 'DIV';
|
41
41
|
}
|
42
|
-
|
42
|
+
|
43
43
|
/**
|
44
44
|
* An Abstract Widget Unit
|
45
45
|
*
|
@@ -56,17 +56,17 @@ function Widget(tag_name, methods) {
|
|
56
56
|
initialize: function(key, options) {
|
57
57
|
this.key = key;
|
58
58
|
var args = [{'class': 'rui-' + key}];
|
59
|
-
|
59
|
+
|
60
60
|
// those two have different constructors
|
61
61
|
if (!(this instanceof RightJS.Input || this instanceof RightJS.Form)) {
|
62
62
|
args.unshift(tag_name);
|
63
63
|
}
|
64
64
|
this.$super.apply(this, args);
|
65
|
-
|
65
|
+
|
66
66
|
if (RightJS.isString(options)) {
|
67
67
|
options = RightJS.$(options);
|
68
68
|
}
|
69
|
-
|
69
|
+
|
70
70
|
// if the options is another element then
|
71
71
|
// try to dynamically rewrap it with our widget
|
72
72
|
if (options instanceof RightJS.Element) {
|
@@ -99,16 +99,16 @@ function Widget(tag_name, methods) {
|
|
99
99
|
return this;
|
100
100
|
}
|
101
101
|
});
|
102
|
-
|
102
|
+
|
103
103
|
/**
|
104
104
|
* Creating the actual widget class
|
105
105
|
*
|
106
106
|
*/
|
107
107
|
var Klass = new RightJS.Wrapper(AbstractWidget, methods);
|
108
|
-
|
108
|
+
|
109
109
|
// creating the widget related shortcuts
|
110
110
|
RightJS.Observer.createShortcuts(Klass.prototype, Klass.EVENTS || []);
|
111
|
-
|
111
|
+
|
112
112
|
return Klass;
|
113
113
|
}
|
114
114
|
|
@@ -121,35 +121,35 @@ function Widget(tag_name, methods) {
|
|
121
121
|
var Tooltip = new Widget({
|
122
122
|
extend: {
|
123
123
|
version: '2.0.0',
|
124
|
-
|
124
|
+
|
125
125
|
EVENTS: $w('show hide'),
|
126
|
-
|
126
|
+
|
127
127
|
Options: {
|
128
128
|
cssRule: '[data-tooltip]', // a css-marker of an element with a tooltip
|
129
|
-
|
129
|
+
|
130
130
|
fxName: 'fade', // the appearance effect name
|
131
131
|
fxDuration: 400, // the appearance effect duration
|
132
132
|
delay: 400, // the appearance delay
|
133
|
-
|
133
|
+
|
134
134
|
move: true, // if it should be moved with the mouse
|
135
|
-
|
135
|
+
|
136
136
|
idSuffix: '-tooltip' // ID prefix for tooltips with ID
|
137
137
|
},
|
138
|
-
|
138
|
+
|
139
139
|
current: null, // the currently active tooltip reference
|
140
140
|
instances: R([]), // keeps the list of instances
|
141
|
-
|
141
|
+
|
142
142
|
// tries to find a tip closest to the event
|
143
143
|
find: function(event) {
|
144
144
|
var element = event.find(Tooltip.Options.cssRule);
|
145
|
-
|
145
|
+
|
146
146
|
if (element) {
|
147
147
|
var uid = $uid(element);
|
148
148
|
return (Tooltip.instances[uid] || (Tooltip.instances[uid] = new Tooltip(element)));
|
149
149
|
}
|
150
150
|
}
|
151
151
|
},
|
152
|
-
|
152
|
+
|
153
153
|
/**
|
154
154
|
* Constructor
|
155
155
|
*
|
@@ -158,7 +158,7 @@ var Tooltip = new Widget({
|
|
158
158
|
*/
|
159
159
|
initialize: function(element, options) {
|
160
160
|
this.associate = element = $(element);
|
161
|
-
|
161
|
+
|
162
162
|
this
|
163
163
|
.$super('tooltip')
|
164
164
|
.setOptions(options, element)
|
@@ -172,16 +172,16 @@ var Tooltip = new Widget({
|
|
172
172
|
mouseover: this._cancelTimer
|
173
173
|
})
|
174
174
|
.insertTo(document.body);
|
175
|
-
|
175
|
+
|
176
176
|
// adding the ID if needed
|
177
177
|
if (element.has('id')) {
|
178
178
|
this.set('id', element.get('id') + this.options.idSuffix);
|
179
179
|
}
|
180
|
-
|
180
|
+
|
181
181
|
// removing the titles from the elment
|
182
182
|
element.set({ title: '', alt: ''});
|
183
183
|
},
|
184
|
-
|
184
|
+
|
185
185
|
/**
|
186
186
|
* Hides the tooltip
|
187
187
|
*
|
@@ -189,7 +189,7 @@ var Tooltip = new Widget({
|
|
189
189
|
*/
|
190
190
|
hide: function() {
|
191
191
|
this._cancelTimer();
|
192
|
-
|
192
|
+
|
193
193
|
this._timer = R(function() {
|
194
194
|
Element.prototype.hide.call(this, this.options.fxName, {
|
195
195
|
duration: this.options.fxDuration,
|
@@ -201,10 +201,10 @@ var Tooltip = new Widget({
|
|
201
201
|
});
|
202
202
|
this.fire('hide');
|
203
203
|
}).bind(this).delay(100);
|
204
|
-
|
204
|
+
|
205
205
|
return this;
|
206
206
|
},
|
207
|
-
|
207
|
+
|
208
208
|
/**
|
209
209
|
* Shows the tooltip with a dealy
|
210
210
|
*
|
@@ -216,19 +216,19 @@ var Tooltip = new Widget({
|
|
216
216
|
Tooltip.instances.each(function(tip) {
|
217
217
|
if (tip && tip !== this) { tip.hide(); }
|
218
218
|
}, this);
|
219
|
-
|
219
|
+
|
220
220
|
// show the tooltip with a delay
|
221
221
|
this._timer = R(function() {
|
222
222
|
Element.prototype.show.call(this.stop(),
|
223
223
|
this.options.fxName, {duration: this.options.fxDuration}
|
224
224
|
);
|
225
|
-
|
225
|
+
|
226
226
|
Tooltip.current = this.fire('show');
|
227
227
|
}).bind(this).delay(this.options.delay);
|
228
|
-
|
228
|
+
|
229
229
|
return (Tooltip.current = this);
|
230
230
|
},
|
231
|
-
|
231
|
+
|
232
232
|
/**
|
233
233
|
* Moves it to where the event happened
|
234
234
|
*
|
@@ -237,22 +237,23 @@ var Tooltip = new Widget({
|
|
237
237
|
moveToEvent: function(event) {
|
238
238
|
this._.style.left = event.pageX + 'px';
|
239
239
|
this._.style.top = event.pageY + 'px';
|
240
|
-
|
240
|
+
|
241
241
|
return this;
|
242
242
|
},
|
243
|
-
|
243
|
+
|
244
244
|
// protected
|
245
|
-
|
245
|
+
|
246
246
|
// cancels a show timeout
|
247
247
|
_cancelTimer: function(event) {
|
248
248
|
if (event) { event.stop(); }
|
249
249
|
if (this._timer) {
|
250
|
-
this._timer.cancel();
|
250
|
+
this._timer.cancel();
|
251
251
|
this._timer = null;
|
252
252
|
}
|
253
253
|
}
|
254
254
|
});
|
255
255
|
|
256
|
+
|
256
257
|
/**
|
257
258
|
* The post load tooltips initialization script
|
258
259
|
*
|
@@ -270,11 +271,11 @@ $(document).on({
|
|
270
271
|
if (this_tip) {
|
271
272
|
if (prev_tip && prev_tip !== this_tip) { prev_tip.hide(); }
|
272
273
|
if (this_tip.hidden()) { this_tip.show(); }
|
273
|
-
|
274
|
+
|
274
275
|
this_tip.moveToEvent(event);
|
275
276
|
}
|
276
277
|
},
|
277
|
-
|
278
|
+
|
278
279
|
/**
|
279
280
|
* Catches the mouseout events and hides tooltips when needed
|
280
281
|
*
|
@@ -282,12 +283,12 @@ $(document).on({
|
|
282
283
|
*/
|
283
284
|
mouseout: function(event) {
|
284
285
|
var curr_tip = Tooltip.current, this_tip = Tooltip.find(event);
|
285
|
-
|
286
|
+
|
286
287
|
if (curr_tip && (!this_tip || this_tip === curr_tip)) {
|
287
288
|
curr_tip.hide();
|
288
289
|
}
|
289
290
|
},
|
290
|
-
|
291
|
+
|
291
292
|
/**
|
292
293
|
* Moves tooltips when active
|
293
294
|
*
|
@@ -301,7 +302,8 @@ $(document).on({
|
|
301
302
|
}
|
302
303
|
});
|
303
304
|
|
305
|
+
|
304
306
|
document.write("<style type=\"text/css\">div.rui-tooltip{display:none;position:absolute;z-index:99999;font-size:90%;margin-top:16pt;margin-left:5pt;color:#FFF;text-shadow:0 0 .2em #000;border:.3em solid rgba(255,255,255,0.2);background-color:rgba(25,25,25,0.92); *background-color:#000; *border:.3em solid #444;background-image:-webkit-gradient(linear,0% 0%,0% 100%,from(transparent) ,to(#000) );border-radius:.4em;-moz-border-radius:.4em;-webkit-border-radius:.4em;box-shadow:0 0 .4em #555;-moz-box-shadow:0 0 .4em #555;-webkit-box-shadow:0 0 .4em #555}div.rui-tooltip-container{margin:.4em .6em}</style>");
|
305
307
|
|
306
308
|
return Tooltip;
|
307
|
-
})(document, RightJS);
|
309
|
+
})(document, RightJS);
|
@@ -37,13 +37,13 @@ var R = RightJS,
|
|
37
37
|
* @param String tag-name or Object methods
|
38
38
|
* @param Object methods
|
39
39
|
* @return Widget wrapper
|
40
|
-
*/
|
40
|
+
*/
|
41
41
|
function Widget(tag_name, methods) {
|
42
42
|
if (!methods) {
|
43
43
|
methods = tag_name;
|
44
44
|
tag_name = 'DIV';
|
45
45
|
}
|
46
|
-
|
46
|
+
|
47
47
|
/**
|
48
48
|
* An Abstract Widget Unit
|
49
49
|
*
|
@@ -60,17 +60,17 @@ function Widget(tag_name, methods) {
|
|
60
60
|
initialize: function(key, options) {
|
61
61
|
this.key = key;
|
62
62
|
var args = [{'class': 'rui-' + key}];
|
63
|
-
|
63
|
+
|
64
64
|
// those two have different constructors
|
65
65
|
if (!(this instanceof RightJS.Input || this instanceof RightJS.Form)) {
|
66
66
|
args.unshift(tag_name);
|
67
67
|
}
|
68
68
|
this.$super.apply(this, args);
|
69
|
-
|
69
|
+
|
70
70
|
if (RightJS.isString(options)) {
|
71
71
|
options = RightJS.$(options);
|
72
72
|
}
|
73
|
-
|
73
|
+
|
74
74
|
// if the options is another element then
|
75
75
|
// try to dynamically rewrap it with our widget
|
76
76
|
if (options instanceof RightJS.Element) {
|
@@ -103,16 +103,16 @@ function Widget(tag_name, methods) {
|
|
103
103
|
return this;
|
104
104
|
}
|
105
105
|
});
|
106
|
-
|
106
|
+
|
107
107
|
/**
|
108
108
|
* Creating the actual widget class
|
109
109
|
*
|
110
110
|
*/
|
111
111
|
var Klass = new RightJS.Wrapper(AbstractWidget, methods);
|
112
|
-
|
112
|
+
|
113
113
|
// creating the widget related shortcuts
|
114
114
|
RightJS.Observer.createShortcuts(Klass.prototype, Klass.EVENTS || []);
|
115
|
-
|
115
|
+
|
116
116
|
return Klass;
|
117
117
|
}
|
118
118
|
|
@@ -125,7 +125,7 @@ function Widget(tag_name, methods) {
|
|
125
125
|
var Uploader = new Widget({
|
126
126
|
extend: {
|
127
127
|
version: '2.0.0',
|
128
|
-
|
128
|
+
|
129
129
|
EVENTS: $w('start update finish error'),
|
130
130
|
|
131
131
|
Options: {
|
@@ -148,7 +148,7 @@ var Uploader = new Widget({
|
|
148
148
|
*/
|
149
149
|
initialize: function(form, options) {
|
150
150
|
this.form = form = $(form);
|
151
|
-
|
151
|
+
|
152
152
|
// trying to find an existing progress-bar
|
153
153
|
var element = form.first('.rui-uploader');
|
154
154
|
|
@@ -160,7 +160,7 @@ var Uploader = new Widget({
|
|
160
160
|
this.bar = this.first('.bar') || $E('div', {'class': 'bar'}),
|
161
161
|
this.num = this.first('.num') || $E('div', {'class': 'num'})
|
162
162
|
]);
|
163
|
-
|
163
|
+
|
164
164
|
if (!element) {
|
165
165
|
this.insertTo(form);
|
166
166
|
}
|
@@ -209,7 +209,7 @@ var Uploader = new Widget({
|
|
209
209
|
}
|
210
210
|
|
211
211
|
this.percent = R(percent * 100).round(this.options.round);
|
212
|
-
|
212
|
+
|
213
213
|
if (this.percent === 0 || !RightJS.Fx || !this.options.fxDuration) {
|
214
214
|
this.bar._.style.width = this.percent + '%';
|
215
215
|
this.num._.innerHTML = this.percent + '%';
|
@@ -242,18 +242,19 @@ var Uploader = new Widget({
|
|
242
242
|
prepare: function() {
|
243
243
|
this.uid = "";
|
244
244
|
for (i = 0; i < 32; i++) { this.uid += Math.random(0, 15).toString(16); }
|
245
|
-
|
245
|
+
|
246
246
|
var param = this.options.param;
|
247
247
|
var url = this.form.get('action').replace(new RegExp('(\\?|&)'+RegExp.escape(param) + '=[^&]*', 'i'), '');
|
248
248
|
this.form.set('action', (R(url).includes('?') ? '&' : '?') + param + '=' + this.uid);
|
249
|
-
|
249
|
+
|
250
250
|
this.show();
|
251
|
-
|
251
|
+
|
252
252
|
return this;
|
253
253
|
}
|
254
254
|
|
255
255
|
});
|
256
256
|
|
257
|
+
|
257
258
|
/**
|
258
259
|
* Overloading the Form#send method so we could
|
259
260
|
* catch up the moment when a form was sent and show the bar
|
@@ -264,20 +265,21 @@ var old_send = Form.prototype.send;
|
|
264
265
|
|
265
266
|
Form.include({
|
266
267
|
send: function() {
|
267
|
-
|
268
|
+
|
268
269
|
if (!this.uploader && (this.match(Uploader.Options.cssRule) || this.first('.rui-uploader'))) {
|
269
270
|
this.uploader = new Uploader(this);
|
270
271
|
}
|
271
|
-
|
272
|
+
|
272
273
|
if (this.uploader) {
|
273
274
|
this.uploader.start();
|
274
275
|
}
|
275
|
-
|
276
|
+
|
276
277
|
return old_send.apply(this, arguments);
|
277
278
|
}
|
278
279
|
});
|
279
280
|
|
281
|
+
|
280
282
|
document.write("<style type=\"text/css\">div.rui-progress-bar,div.rui-progress-bar *{margin:0;padding:0;border:none;background:none}div.rui-progress-bar{position:relative;height:1.4em;line-height:1.4em;width:20em;border:1px solid #999}div.rui-progress-bar,div.rui-progress-bar div.bar{border-radius:0.25em;-moz-border-radius:0.25em;-webkit-border-radius:0.25em}div.rui-progress-bar div.bar{position:absolute;left:0;top:0;width:0%;height:100%;background:#CCC;z-index:1}div.rui-progress-bar div.num{position:absolute;width:100%;height:100%;z-index:2;text-align:center}div.rui-progress-bar-failed{border-color:red;color:red;background:pink}.rui-uploader{display:none}</style>");
|
281
283
|
|
282
284
|
return Uploader;
|
283
|
-
})(RightJS);
|
285
|
+
})(RightJS);
|
@@ -8,17 +8,17 @@ module ActiveRecord
|
|
8
8
|
def initialize(hash={})
|
9
9
|
@hash = hash
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
def id
|
13
13
|
@hash[:id]
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
def self.table_name
|
17
17
|
name = 'records'
|
18
18
|
name.stub!(:singularize).and_return('record')
|
19
19
|
name
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
def new_record?
|
23
23
|
true
|
24
24
|
end
|
@@ -33,23 +33,28 @@ end
|
|
33
33
|
describe RightRails::JavaScriptGenerator do
|
34
34
|
before :each do
|
35
35
|
RightRails::Config.reset!
|
36
|
-
|
36
|
+
|
37
37
|
@template = mock()
|
38
38
|
def @template.dom_id(record) "record_#{record.id}" end
|
39
39
|
def @template.escape_javascript(str) str end
|
40
|
-
|
40
|
+
|
41
41
|
@page = RightRails::JavaScriptGenerator.new(@template)
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
describe "top level calls" do
|
45
45
|
it "should generate a simple ID search" do
|
46
46
|
@page['element-id']
|
47
47
|
@page.to_s.should == '$("element-id");'
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
it "should respond to the top-level javascript objects" do
|
51
51
|
@page.document
|
52
|
-
@page.to_s.should == 'document;'
|
52
|
+
@page.to_s.should == '$(document);'
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should generate a normal window access" do
|
56
|
+
@page.window
|
57
|
+
@page.to_s.should == '$(window);'
|
53
58
|
end
|
54
59
|
|
55
60
|
it "should generate an ID search from active-records and active-resources" do
|
@@ -57,66 +62,66 @@ describe RightRails::JavaScriptGenerator do
|
|
57
62
|
@page[@record]
|
58
63
|
@page.to_s.should == '$("record_22");'
|
59
64
|
end
|
60
|
-
|
65
|
+
|
61
66
|
it "should generate a CSS select block" do
|
62
67
|
@page.find('div, span, table')
|
63
68
|
@page.to_s.should == '$$("div, span, table");'
|
64
69
|
end
|
65
|
-
|
70
|
+
|
66
71
|
it "should generate redirect" do
|
67
72
|
@page.redirect_to('/boo/boo/boo')
|
68
73
|
@page.to_s.should == 'document.location.href="/boo/boo/boo";'
|
69
74
|
end
|
70
|
-
|
75
|
+
|
71
76
|
it "should generate reload" do
|
72
77
|
@page.reload
|
73
78
|
@page.to_s.should == 'document.location.reload();'
|
74
79
|
end
|
75
|
-
|
80
|
+
|
76
81
|
it "should process assignments" do
|
77
82
|
@page.something = nil;
|
78
83
|
@page.to_s.should == 'something=null;'
|
79
84
|
end
|
80
|
-
|
85
|
+
|
81
86
|
it "should provide access to javascript context variables" do
|
82
87
|
@page.get(:my_var).property = 'boo';
|
83
88
|
@page.to_s.should == 'my_var.property="boo";'
|
84
89
|
end
|
85
|
-
|
90
|
+
|
86
91
|
it "should let you set the variables" do
|
87
92
|
@page.set(:my_var, nil)
|
88
93
|
@page.to_s.should == 'var my_var=null;'
|
89
94
|
end
|
90
|
-
|
95
|
+
|
91
96
|
it "should process << pushes correctly" do
|
92
97
|
@page << 'some_code();' << 'another_code();'
|
93
98
|
@page.to_s.should == 'some_code();another_code();'
|
94
99
|
end
|
95
|
-
|
100
|
+
|
96
101
|
it "should convert several lines of code properly" do
|
97
102
|
@page['el1'].update('text1').show();
|
98
103
|
@page['el2'].update('text2').highlight();
|
99
|
-
|
104
|
+
|
100
105
|
@page.to_s.should == '$("el1").update("text1").show();$("el2").update("text2").highlight();'
|
101
106
|
end
|
102
|
-
|
107
|
+
|
103
108
|
describe "in safe-mode" do
|
104
109
|
before :each do
|
105
110
|
RightRails::Config.safe_mode = true
|
106
111
|
end
|
107
|
-
|
112
|
+
|
108
113
|
it "should prefix $ with RightJS." do
|
109
114
|
@page['element-id']
|
110
115
|
@page.to_s.should == 'RightJS.$("element-id");'
|
111
116
|
end
|
112
|
-
|
117
|
+
|
113
118
|
it "should prefix $$ with RightJS." do
|
114
119
|
@page.find('div#css.rule')
|
115
120
|
@page.to_s.should == 'RightJS.$$("div#css.rule");'
|
116
121
|
end
|
117
122
|
end
|
118
123
|
end
|
119
|
-
|
124
|
+
|
120
125
|
describe "second level calls" do
|
121
126
|
it "should catch up an element method simple calls" do
|
122
127
|
@page['element-id'].myMethod
|
@@ -137,35 +142,35 @@ describe RightRails::JavaScriptGenerator do
|
|
137
142
|
@page['element-id'].test(1).show.highlight()
|
138
143
|
@page.to_s.should == '$("element-id").test(1).show().highlight();'
|
139
144
|
end
|
140
|
-
|
145
|
+
|
141
146
|
it "should catch up the assignments correctly" do
|
142
147
|
@page['element-id'].innerHTML = nil;
|
143
148
|
@page.to_s.should == '$("element-id").innerHTML=null;'
|
144
149
|
end
|
145
|
-
|
150
|
+
|
146
151
|
it "should catch the property assignment calls too" do
|
147
152
|
@page['element-id'][:title] = 'something';
|
148
153
|
@page.to_s.should == '$("element-id").title="something";'
|
149
154
|
end
|
150
|
-
|
155
|
+
|
151
156
|
it "should process other methods calls as arguments" do
|
152
157
|
@page['element-id'].update(@page.my_method(@page.another_method(1,2),3,nil))
|
153
158
|
@page.to_s.should == '$("element-id").update(my_method(another_method(1,2),3,null));'
|
154
159
|
end
|
155
|
-
|
160
|
+
|
156
161
|
it "should process operation calls" do
|
157
162
|
@page.property = @page.first + @page.another(1,nil) * @page.more / 2 -
|
158
163
|
@page.get(:thing) / @page.another(2) + nil - 'boo' + @page.last(@page.first)
|
159
|
-
|
164
|
+
|
160
165
|
@page.to_s.should == 'property=first()+another(1,null)*more()/2-thing/another(2)+null-"boo"+last(first());'
|
161
166
|
end
|
162
|
-
|
167
|
+
|
163
168
|
it "should process the append operation" do
|
164
169
|
@page['element'][:innerHTML] << 'boo'
|
165
170
|
@page.to_s.should == '$("element").innerHTML+="boo";'
|
166
171
|
end
|
167
172
|
end
|
168
|
-
|
173
|
+
|
169
174
|
describe "data types conversion" do
|
170
175
|
it "should correctly process numeric arguments" do
|
171
176
|
@page['element-id'].test(1, 2.3)
|
@@ -206,101 +211,101 @@ describe RightRails::JavaScriptGenerator do
|
|
206
211
|
})
|
207
212
|
@page.to_s.should == '$("element-id").test({"four":{"five":true,"six":null},one:1,two:2.3});'
|
208
213
|
end
|
209
|
-
|
214
|
+
|
210
215
|
it "should handle JSON exportable units too" do
|
211
216
|
@value = ActiveRecord::Base.new({:id => '22'});
|
212
217
|
def @value.to_json
|
213
218
|
{:id => id}
|
214
219
|
end
|
215
|
-
|
220
|
+
|
216
221
|
@page["element-id"].test(@value)
|
217
222
|
@page.to_s.should == '$("element-id").test({id:"22"});'
|
218
223
|
end
|
219
|
-
|
224
|
+
|
220
225
|
it "should convert lambdas to functions" do
|
221
226
|
@page.find("boo").each(lambda{ |item, i, array|
|
222
227
|
item.boo(i.foo(2)) + array.hoo
|
223
228
|
})
|
224
229
|
@page.to_s.should == '$$("boo").each(function(a,b,c){a.boo(b.foo(2))+c.hoo();});'
|
225
230
|
end
|
226
|
-
|
231
|
+
|
227
232
|
it "should process blocks nicely" do
|
228
233
|
@page.find("boo").each do |item, i|
|
229
234
|
item.boo(i.foo('hoo'))
|
230
235
|
end
|
231
|
-
|
236
|
+
|
232
237
|
@page.to_s.should == '$$("boo").each(function(a,b){a.boo(b.foo("hoo"));});'
|
233
238
|
end
|
234
|
-
|
239
|
+
|
235
240
|
it "should process blocks with scope variables and the page builder calls" do
|
236
241
|
some_text = 'boo'
|
237
|
-
|
242
|
+
|
238
243
|
@page.find("foo").each do |item, index|
|
239
244
|
@page['element'][:innerHTML] << item[:innerHTML] + index + some_text
|
240
245
|
end
|
241
|
-
|
246
|
+
|
242
247
|
# checking that the context is getting back
|
243
248
|
@page.alert(@page['element'][:innerHTML])
|
244
|
-
|
249
|
+
|
245
250
|
@page.to_s.should == '$$("foo").each(function(a,b){$("element").innerHTML+=a.innerHTML+b+"boo";});alert($("element").innerHTML);'
|
246
251
|
end
|
247
|
-
|
252
|
+
|
248
253
|
it "should throw an error for unknown data-types" do
|
249
254
|
class Booooooooooo
|
250
255
|
def respond_to?(name)
|
251
256
|
name.to_sym == :to_json ? false : super(name)
|
252
257
|
end
|
253
258
|
end
|
254
|
-
|
259
|
+
|
255
260
|
lambda {
|
256
261
|
@page['element'].insert(Booooooooooo.new)
|
257
262
|
}.should raise_error
|
258
263
|
end
|
259
264
|
end
|
260
|
-
|
265
|
+
|
261
266
|
describe "RR object method calls generator" do
|
262
267
|
before :each do
|
263
268
|
@record = ActiveRecord::Base.new({:id => '22'})
|
264
269
|
end
|
265
|
-
|
270
|
+
|
266
271
|
it "should generate script for the 'insert' request" do
|
267
272
|
@template.should_receive(:render).with(@record).and_return('<record html code/>')
|
268
|
-
|
273
|
+
|
269
274
|
@page.insert(@record)
|
270
275
|
@page.to_s.should == 'RR.insert("records","<record html code/>");'
|
271
276
|
end
|
272
|
-
|
277
|
+
|
273
278
|
it "should generate script for the 'replace' request" do
|
274
279
|
@template.should_receive(:render).with(@record).and_return('<record html code/>')
|
275
|
-
|
280
|
+
|
276
281
|
@page.replace(@record)
|
277
282
|
@page.to_s.should == 'RR.replace("record_22","<record html code/>");'
|
278
283
|
end
|
279
|
-
|
284
|
+
|
280
285
|
it "should generate script for the 'remove' request" do
|
281
286
|
@page.remove(@record)
|
282
287
|
@page.to_s.should == 'RR.remove("record_22");'
|
283
288
|
end
|
284
|
-
|
289
|
+
|
285
290
|
it "should generate script for the 'show_form_for' request" do
|
286
291
|
@template.should_receive(:render).with('form').and_return('<the form html code/>')
|
287
|
-
|
292
|
+
|
288
293
|
@page.show_form_for(@record)
|
289
294
|
@page.to_s.should == 'RR.show_form_for("record_22","<the form html code/>");'
|
290
295
|
end
|
291
|
-
|
296
|
+
|
292
297
|
describe "replace_form_for generator" do
|
293
298
|
before :each do
|
294
299
|
@template.should_receive(:render).with('form').and_return('<the form html code/>')
|
295
300
|
end
|
296
|
-
|
301
|
+
|
297
302
|
it "should generate a script for a new record" do
|
298
303
|
@record.should_receive(:new_record?).and_return(true)
|
299
304
|
|
300
305
|
@page.replace_form_for(@record)
|
301
306
|
@page.to_s.should == 'RR.replace_form("new_record","<the form html code/>");'
|
302
307
|
end
|
303
|
-
|
308
|
+
|
304
309
|
it "should generate a script for an existing record" do
|
305
310
|
@record.should_receive(:new_record?).and_return(false)
|
306
311
|
|
@@ -308,13 +313,13 @@ describe RightRails::JavaScriptGenerator do
|
|
308
313
|
@page.to_s.should == 'RR.replace_form("edit_record_22","<the form html code/>");'
|
309
314
|
end
|
310
315
|
end
|
311
|
-
|
316
|
+
|
312
317
|
describe "updates with care" do
|
313
318
|
before :each do
|
314
319
|
@template.should_receive(:flashes).and_return('<flashes/>')
|
315
320
|
@template.should_receive(:flash).and_return(mock(:flash, {:clear => true}))
|
316
321
|
end
|
317
|
-
|
322
|
+
|
318
323
|
it "should generate response for #update_flash" do
|
319
324
|
@page.update_flash
|
320
325
|
@page.to_s.should == 'RR.update_flash("<flashes/>");'
|
@@ -330,7 +335,7 @@ describe RightRails::JavaScriptGenerator do
|
|
330
335
|
'RR.replace_form("new_record","<the form html code/>");' +
|
331
336
|
'RR.update_flash("<flashes/>");'
|
332
337
|
end
|
333
|
-
|
338
|
+
|
334
339
|
it "should generate response for the #replace_and_care method" do
|
335
340
|
@template.should_receive(:render).with(@record).and_return('<record html code/>')
|
336
341
|
|
@@ -340,8 +345,8 @@ describe RightRails::JavaScriptGenerator do
|
|
340
345
|
'RR.update_flash("<flashes/>");'
|
341
346
|
end
|
342
347
|
end
|
343
|
-
|
348
|
+
|
344
349
|
end
|
345
|
-
|
346
|
-
|
350
|
+
|
351
|
+
|
347
352
|
end
|