best_in_place 0.1.9 → 0.2.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.
- data/.gitignore +9 -3
- data/.rspec +1 -0
- data/.travis.yml +11 -0
- data/Gemfile +2 -0
- data/README.md +3 -1
- data/Rakefile +6 -0
- data/best_in_place.gemspec +5 -0
- data/lib/best_in_place.rb +3 -40
- data/lib/best_in_place/helper.rb +52 -0
- data/lib/best_in_place/test_helpers.rb +26 -0
- data/lib/best_in_place/version.rb +2 -2
- data/public/javascripts/best_in_place.js +148 -125
- data/spec/helpers/best_in_place_spec.rb +229 -0
- data/spec/integration/double_init_spec.rb +32 -0
- data/spec/integration/js_spec.rb +165 -0
- data/spec/spec_helper.rb +23 -0
- data/test_app/Gemfile +1 -25
- data/test_app/Gemfile.lock +57 -50
- data/test_app/app/controllers/users_controller.rb +15 -1
- data/test_app/app/views/users/double_init.html.erb +65 -0
- data/test_app/app/views/users/show.html.erb +15 -15
- data/test_app/config/environments/development.rb +0 -1
- data/test_app/config/initializers/countries.rb +1 -1
- data/test_app/config/routes.rb +6 -56
- data/test_app/db/schema.rb +1 -0
- data/test_app/db/seeds.rb +1 -0
- data/test_app/public/javascripts/application.js +2 -2
- data/test_app/public/javascripts/best_in_place.js +146 -125
- data/test_app/public/stylesheets/style.css +17 -17
- metadata +79 -56
- data/Gemfile.lock +0 -78
- data/test_app/.gitignore +0 -4
- data/test_app/public/javascripts/jquery.rest_in_place.js +0 -254
@@ -31,7 +31,7 @@ BestInPlaceEditor.prototype = {
|
|
31
31
|
// Public Interface Functions //////////////////////////////////////////////
|
32
32
|
|
33
33
|
activate : function() {
|
34
|
-
|
34
|
+
var elem = this.isNil ? "" : this.element.html();
|
35
35
|
this.oldValue = elem;
|
36
36
|
$(this.activator).unbind("click", this.clickHandler);
|
37
37
|
this.activateForm();
|
@@ -69,7 +69,7 @@ BestInPlaceEditor.prototype = {
|
|
69
69
|
} else if (this.formType == "checkbox") {
|
70
70
|
editor.element.html(this.getValue() ? this.values[1] : this.values[0]);
|
71
71
|
} else {
|
72
|
-
editor.element.html(this.getValue());
|
72
|
+
editor.element.html(this.getValue() != "" ? this.getValue() : this.nil);
|
73
73
|
}
|
74
74
|
},
|
75
75
|
|
@@ -89,6 +89,8 @@ BestInPlaceEditor.prototype = {
|
|
89
89
|
self.objectName = self.objectName || jQuery(this).attr("data-object");
|
90
90
|
self.attributeName = self.attributeName || jQuery(this).attr("data-attribute");
|
91
91
|
self.nil = self.nil || jQuery(this).attr("data-nil");
|
92
|
+
self.inner_class = self.inner_class || jQuery(this).attr("data-inner-class");
|
93
|
+
self.html_attrs = self.html_attrs || jQuery(this).attr("data-html-attrs");
|
92
94
|
});
|
93
95
|
|
94
96
|
// Try Rails-id based if parents did not explicitly supply something
|
@@ -107,6 +109,8 @@ BestInPlaceEditor.prototype = {
|
|
107
109
|
self.attributeName = self.element.attr("data-attribute") || self.attributeName;
|
108
110
|
self.activator = self.element.attr("data-activator") || self.element;
|
109
111
|
self.nil = self.element.attr("data-nil") || self.nil || "-";
|
112
|
+
self.inner_class = self.element.attr("data-inner-class") || self.inner_class || null;
|
113
|
+
self.html_attrs = self.element.attr("data-html-attrs") || self.html_attrs;
|
110
114
|
|
111
115
|
if (!self.element.attr("data-sanitize")) {
|
112
116
|
self.sanitize = true;
|
@@ -160,7 +164,7 @@ BestInPlaceEditor.prototype = {
|
|
160
164
|
|
161
165
|
if (csrf_param !== undefined && csrf_token !== undefined) {
|
162
166
|
data += "&" + csrf_param + "=" + encodeURIComponent(csrf_token);
|
163
|
-
|
167
|
+
}
|
164
168
|
return data;
|
165
169
|
},
|
166
170
|
|
@@ -174,7 +178,7 @@ BestInPlaceEditor.prototype = {
|
|
174
178
|
|
175
179
|
loadSuccessCallback : function(data) {
|
176
180
|
this.element.html(data[this.objectName]);
|
177
|
-
|
181
|
+
// Binding back after being clicked
|
178
182
|
$(this.activator).bind('click', {editor: this}, this.clickHandler);
|
179
183
|
},
|
180
184
|
|
@@ -183,16 +187,25 @@ BestInPlaceEditor.prototype = {
|
|
183
187
|
|
184
188
|
// Display all error messages from server side validation
|
185
189
|
$.each(jQuery.parseJSON(request.responseText), function(index, value) {
|
190
|
+
if( typeof(value) == "object") {value = index + " " + value.toString(); }
|
186
191
|
var container = $("<span class='flash-error'></span>").html(value);
|
187
192
|
container.purr();
|
188
193
|
});
|
189
194
|
|
190
|
-
|
195
|
+
// Binding back after being clicked
|
191
196
|
$(this.activator).bind('click', {editor: this}, this.clickHandler);
|
192
197
|
},
|
193
198
|
|
194
199
|
clickHandler : function(event) {
|
195
200
|
event.data.editor.activate();
|
201
|
+
},
|
202
|
+
|
203
|
+
setHtmlAttributes : function() {
|
204
|
+
var formField = this.element.find(this.formType);
|
205
|
+
var attrs = jQuery.parseJSON(this.html_attrs);
|
206
|
+
for(var key in attrs){
|
207
|
+
formField.attr(key, attrs[key]);
|
208
|
+
}
|
196
209
|
}
|
197
210
|
};
|
198
211
|
|
@@ -201,8 +214,13 @@ BestInPlaceEditor.forms = {
|
|
201
214
|
"input" : {
|
202
215
|
activateForm : function() {
|
203
216
|
var output = '<form class="form_in_place" action="javascript:void(0)" style="display:inline;">';
|
204
|
-
output += '<input type="text" value="' + this.sanitizeValue(this.oldValue) + '"
|
217
|
+
output += '<input type="text" name="'+ this.attributeName + '" value="' + this.sanitizeValue(this.oldValue) + '"';
|
218
|
+
if (this.inner_class != null) {
|
219
|
+
output += ' class="' + this.inner_class + '"';
|
220
|
+
}
|
221
|
+
output += '></form>'
|
205
222
|
this.element.html(output);
|
223
|
+
this.setHtmlAttributes();
|
206
224
|
this.element.find('input')[0].select();
|
207
225
|
this.element.find("form").bind('submit', {editor: this}, BestInPlaceEditor.forms.input.submitHandler);
|
208
226
|
this.element.find("input").bind('blur', {editor: this}, BestInPlaceEditor.forms.input.inputBlurHandler);
|
@@ -239,6 +257,7 @@ BestInPlaceEditor.forms = {
|
|
239
257
|
});
|
240
258
|
output += "</select></form>";
|
241
259
|
this.element.html(output);
|
260
|
+
this.setHtmlAttributes();
|
242
261
|
this.element.find("select").bind('change', {editor: this}, BestInPlaceEditor.forms.select.blurHandler);
|
243
262
|
this.element.find("select").bind('blur', {editor: this}, BestInPlaceEditor.forms.select.blurHandler);
|
244
263
|
this.element.find("select").bind('keyup', {editor: this}, BestInPlaceEditor.forms.select.keyupHandler);
|
@@ -263,6 +282,7 @@ BestInPlaceEditor.forms = {
|
|
263
282
|
var newValue = Boolean(this.oldValue != this.values[1]);
|
264
283
|
var output = newValue ? this.values[1] : this.values[0];
|
265
284
|
this.element.html(output);
|
285
|
+
this.setHtmlAttributes();
|
266
286
|
this.update();
|
267
287
|
},
|
268
288
|
|
@@ -282,6 +302,7 @@ BestInPlaceEditor.forms = {
|
|
282
302
|
output += this.sanitizeValue(this.oldValue);
|
283
303
|
output += '</textarea></form>';
|
284
304
|
this.element.html(output);
|
305
|
+
this.setHtmlAttributes();
|
285
306
|
|
286
307
|
// set width and height of textarea
|
287
308
|
jQuery(this.element.find("textarea")[0]).css({ 'min-width': width, 'min-height': height });
|
@@ -324,132 +345,132 @@ jQuery.fn.best_in_place = function() {
|
|
324
345
|
|
325
346
|
|
326
347
|
/**
|
327
|
-
*
|
328
|
-
*
|
329
|
-
*
|
330
|
-
*
|
348
|
+
* @name Elastic
|
349
|
+
* @descripton Elastic is Jquery plugin that grow and shrink your textareas automaticliy
|
350
|
+
* @version 1.6.5
|
351
|
+
* @requires Jquery 1.2.6+
|
331
352
|
*
|
332
|
-
*
|
333
|
-
*
|
334
|
-
*
|
353
|
+
* @author Jan Jarfalk
|
354
|
+
* @author-email jan.jarfalk@unwrongest.com
|
355
|
+
* @author-website http://www.unwrongest.com
|
335
356
|
*
|
336
|
-
*
|
357
|
+
* @licens MIT License - http://www.opensource.org/licenses/mit-license.php
|
337
358
|
*/
|
338
359
|
|
339
360
|
(function(jQuery){
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
// This function will update the height of the textarea if necessary
|
395
|
-
function update() {
|
396
|
-
|
397
|
-
// Get curated content from the textarea.
|
398
|
-
var textareaContent = $textarea.val().replace(/&/g,'&').replace(/ /g, ' ').replace(/<|>/g, '>').replace(/\n/g, '<br />');
|
399
|
-
|
400
|
-
// Compare curated content with curated twin.
|
401
|
-
var twinContent = $twin.html().replace(/<br>/ig,'<br />');
|
402
|
-
|
403
|
-
if(textareaContent+' ' != twinContent){
|
404
|
-
|
405
|
-
// Add an extra white space so new rows are added when you are at the end of a row.
|
406
|
-
$twin.html(textareaContent+' ');
|
407
|
-
|
408
|
-
// Change textarea height if twin plus the height of one line differs more than 3 pixel from textarea height
|
409
|
-
if(Math.abs($twin.height() + lineHeight - $textarea.height()) > 3){
|
410
|
-
|
411
|
-
var goalheight = $twin.height()+lineHeight;
|
412
|
-
if(goalheight >= maxheight) {
|
413
|
-
setHeightAndOverflow(maxheight,'auto');
|
414
|
-
} else if(goalheight <= minheight) {
|
415
|
-
setHeightAndOverflow(minheight,'hidden');
|
416
|
-
} else {
|
417
|
-
setHeightAndOverflow(goalheight,'hidden');
|
418
|
-
}
|
419
|
-
|
420
|
-
}
|
421
|
-
|
422
|
-
}
|
423
|
-
|
424
|
-
}
|
425
|
-
|
426
|
-
// Hide scrollbars
|
427
|
-
$textarea.css({'overflow':'hidden'});
|
428
|
-
|
429
|
-
// Update textarea size on keyup, change, cut and paste
|
430
|
-
$textarea.bind('keyup change cut paste', function(){
|
431
|
-
update();
|
432
|
-
});
|
433
|
-
|
434
|
-
// Compact textarea on blur
|
435
|
-
// Lets animate this....
|
436
|
-
$textarea.bind('blur',function(){
|
437
|
-
if($twin.height() < maxheight){
|
438
|
-
if($twin.height() > minheight) {
|
439
|
-
$textarea.height($twin.height());
|
440
|
-
} else {
|
441
|
-
$textarea.height(minheight);
|
442
|
-
}
|
443
|
-
}
|
444
|
-
});
|
445
|
-
|
446
|
-
// And this line is to catch the browser paste event
|
447
|
-
$textarea.live('input paste',function(e){ setTimeout( update, 250); });
|
361
|
+
jQuery.fn.extend({
|
362
|
+
elastic: function() {
|
363
|
+
// We will create a div clone of the textarea
|
364
|
+
// by copying these attributes from the textarea to the div.
|
365
|
+
var mimics = [
|
366
|
+
'paddingTop',
|
367
|
+
'paddingRight',
|
368
|
+
'paddingBottom',
|
369
|
+
'paddingLeft',
|
370
|
+
'fontSize',
|
371
|
+
'lineHeight',
|
372
|
+
'fontFamily',
|
373
|
+
'width',
|
374
|
+
'fontWeight'];
|
375
|
+
|
376
|
+
return this.each( function() {
|
377
|
+
|
378
|
+
// Elastic only works on textareas
|
379
|
+
if ( this.type != 'textarea' ) {
|
380
|
+
return false;
|
381
|
+
}
|
382
|
+
|
383
|
+
var $textarea = jQuery(this),
|
384
|
+
$twin = jQuery('<div />').css({'position': 'absolute','display':'none','word-wrap':'break-word'}),
|
385
|
+
lineHeight = parseInt($textarea.css('line-height'),10) || parseInt($textarea.css('font-size'),'10'),
|
386
|
+
minheight = parseInt($textarea.css('height'),10) || lineHeight*3,
|
387
|
+
maxheight = parseInt($textarea.css('max-height'),10) || Number.MAX_VALUE,
|
388
|
+
goalheight = 0,
|
389
|
+
i = 0;
|
390
|
+
|
391
|
+
// Opera returns max-height of -1 if not set
|
392
|
+
if (maxheight < 0) { maxheight = Number.MAX_VALUE; }
|
393
|
+
|
394
|
+
// Append the twin to the DOM
|
395
|
+
// We are going to meassure the height of this, not the textarea.
|
396
|
+
$twin.appendTo($textarea.parent());
|
397
|
+
|
398
|
+
// Copy the essential styles (mimics) from the textarea to the twin
|
399
|
+
var i = mimics.length;
|
400
|
+
while(i--){
|
401
|
+
$twin.css(mimics[i].toString(),$textarea.css(mimics[i].toString()));
|
402
|
+
}
|
403
|
+
|
404
|
+
|
405
|
+
// Sets a given height and overflow state on the textarea
|
406
|
+
function setHeightAndOverflow(height, overflow){
|
407
|
+
curratedHeight = Math.floor(parseInt(height,10));
|
408
|
+
if($textarea.height() != curratedHeight){
|
409
|
+
$textarea.css({'height': curratedHeight + 'px','overflow':overflow});
|
410
|
+
|
411
|
+
}
|
412
|
+
}
|
448
413
|
|
449
|
-
// Run update once when elastic is initialized
|
450
|
-
update();
|
451
414
|
|
452
|
-
|
415
|
+
// This function will update the height of the textarea if necessary
|
416
|
+
function update() {
|
417
|
+
|
418
|
+
// Get curated content from the textarea.
|
419
|
+
var textareaContent = $textarea.val().replace(/&/g,'&').replace(/ /g, ' ').replace(/<|>/g, '>').replace(/\n/g, '<br />');
|
420
|
+
|
421
|
+
// Compare curated content with curated twin.
|
422
|
+
var twinContent = $twin.html().replace(/<br>/ig,'<br />');
|
423
|
+
|
424
|
+
if(textareaContent+' ' != twinContent){
|
425
|
+
|
426
|
+
// Add an extra white space so new rows are added when you are at the end of a row.
|
427
|
+
$twin.html(textareaContent+' ');
|
428
|
+
|
429
|
+
// Change textarea height if twin plus the height of one line differs more than 3 pixel from textarea height
|
430
|
+
if(Math.abs($twin.height() + lineHeight - $textarea.height()) > 3){
|
431
|
+
|
432
|
+
var goalheight = $twin.height()+lineHeight;
|
433
|
+
if(goalheight >= maxheight) {
|
434
|
+
setHeightAndOverflow(maxheight,'auto');
|
435
|
+
} else if(goalheight <= minheight) {
|
436
|
+
setHeightAndOverflow(minheight,'hidden');
|
437
|
+
} else {
|
438
|
+
setHeightAndOverflow(goalheight,'hidden');
|
439
|
+
}
|
440
|
+
|
441
|
+
}
|
442
|
+
|
443
|
+
}
|
444
|
+
|
445
|
+
}
|
446
|
+
|
447
|
+
// Hide scrollbars
|
448
|
+
$textarea.css({'overflow':'hidden'});
|
449
|
+
|
450
|
+
// Update textarea size on keyup, change, cut and paste
|
451
|
+
$textarea.bind('keyup change cut paste', function(){
|
452
|
+
update();
|
453
|
+
});
|
454
|
+
|
455
|
+
// Compact textarea on blur
|
456
|
+
// Lets animate this....
|
457
|
+
$textarea.bind('blur',function(){
|
458
|
+
if($twin.height() < maxheight){
|
459
|
+
if($twin.height() > minheight) {
|
460
|
+
$textarea.height($twin.height());
|
461
|
+
} else {
|
462
|
+
$textarea.height(minheight);
|
463
|
+
}
|
464
|
+
}
|
465
|
+
});
|
466
|
+
|
467
|
+
// And this line is to catch the browser paste event
|
468
|
+
$textarea.live('input paste',function(e){ setTimeout( update, 250); });
|
469
|
+
|
470
|
+
// Run update once when elastic is initialized
|
471
|
+
update();
|
472
|
+
|
473
|
+
});
|
453
474
|
|
454
475
|
}
|
455
476
|
});
|
@@ -52,14 +52,14 @@ textarea {
|
|
52
52
|
/* Missatges Flotants */
|
53
53
|
|
54
54
|
.purr {
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
55
|
+
position: fixed;
|
56
|
+
width: 324px;
|
57
|
+
top: 20px;
|
58
|
+
right: 15px;
|
59
|
+
padding: 20px;
|
60
|
+
background-color: #000000;
|
61
|
+
color: #FFFFFF;
|
62
|
+
border: 2px solid #AAA;
|
63
63
|
-moz-border-radius: 10px;
|
64
64
|
-webkit-border-radius: 10px;
|
65
65
|
-o-border-radius: 10px;
|
@@ -67,13 +67,13 @@ textarea {
|
|
67
67
|
-khtml-border-radius: 10px;
|
68
68
|
border-radius: 10px;
|
69
69
|
}
|
70
|
-
.purr:hover .close
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
70
|
+
.purr:hover .close {
|
71
|
+
position: absolute;
|
72
|
+
top: 5px;
|
73
|
+
right: 3px;
|
74
|
+
display: block;
|
75
|
+
width: 25px;
|
76
|
+
height: 25px;
|
77
|
+
text-indent: -9999px;
|
78
|
+
background: url("/images/close-button.gif") no-repeat;
|
79
79
|
}
|
metadata
CHANGED
@@ -1,62 +1,89 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: best_in_place
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- 9
|
10
|
-
version: 0.1.9
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Bernat Farrero
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-10-26 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
22
15
|
name: rails
|
23
|
-
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &84765280 !ruby/object:Gem::Requirement
|
25
17
|
none: false
|
26
|
-
requirements:
|
18
|
+
requirements:
|
27
19
|
- - ~>
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
hash: 7
|
30
|
-
segments:
|
31
|
-
- 3
|
32
|
-
- 0
|
33
|
-
- 0
|
20
|
+
- !ruby/object:Gem::Version
|
34
21
|
version: 3.0.0
|
35
22
|
type: :runtime
|
36
|
-
|
37
|
-
|
38
|
-
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *84765280
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rspec-rails
|
27
|
+
requirement: &84764870 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 2.7.0
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *84764870
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: nokogiri
|
38
|
+
requirement: &84764560 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 1.5.0
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *84764560
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: capybara
|
49
|
+
requirement: &84763970 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.0.1
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *84763970
|
58
|
+
description: BestInPlace is a jQuery script and a Rails 3 helper that provide the
|
59
|
+
method best_in_place to display any object field easily editable for the user by
|
60
|
+
just clicking on it. It supports input data, text data, boolean data and custom
|
61
|
+
dropdown data. It works with RESTful controllers.
|
62
|
+
email:
|
39
63
|
- bernat@itnig.net
|
40
64
|
executables: []
|
41
|
-
|
42
65
|
extensions: []
|
43
|
-
|
44
66
|
extra_rdoc_files: []
|
45
|
-
|
46
|
-
files:
|
67
|
+
files:
|
47
68
|
- .gitignore
|
69
|
+
- .rspec
|
70
|
+
- .travis.yml
|
48
71
|
- Gemfile
|
49
|
-
- Gemfile.lock
|
50
72
|
- README.md
|
51
73
|
- Rakefile
|
52
74
|
- best_in_place.gemspec
|
53
75
|
- lib/best_in_place.rb
|
76
|
+
- lib/best_in_place/helper.rb
|
77
|
+
- lib/best_in_place/test_helpers.rb
|
54
78
|
- lib/best_in_place/version.rb
|
55
79
|
- lib/generators/best_in_place/setup_generator.rb
|
56
80
|
- public/javascripts/best_in_place.js
|
57
81
|
- public/javascripts/jquery-1.4.4.js
|
58
82
|
- public/javascripts/jquery.purr.js
|
59
|
-
-
|
83
|
+
- spec/helpers/best_in_place_spec.rb
|
84
|
+
- spec/integration/double_init_spec.rb
|
85
|
+
- spec/integration/js_spec.rb
|
86
|
+
- spec/spec_helper.rb
|
60
87
|
- test_app/Gemfile
|
61
88
|
- test_app/Gemfile.lock
|
62
89
|
- test_app/README
|
@@ -68,6 +95,7 @@ files:
|
|
68
95
|
- test_app/app/models/user.rb
|
69
96
|
- test_app/app/views/layouts/application.html.erb
|
70
97
|
- test_app/app/views/users/_form.html.erb
|
98
|
+
- test_app/app/views/users/double_init.html.erb
|
71
99
|
- test_app/app/views/users/index.html.erb
|
72
100
|
- test_app/app/views/users/new.html.erb
|
73
101
|
- test_app/app/views/users/show.html.erb
|
@@ -105,7 +133,6 @@ files:
|
|
105
133
|
- test_app/public/javascripts/best_in_place.js
|
106
134
|
- test_app/public/javascripts/jquery-1.4.4.min.js
|
107
135
|
- test_app/public/javascripts/jquery.purr.js
|
108
|
-
- test_app/public/javascripts/jquery.rest_in_place.js
|
109
136
|
- test_app/public/javascripts/rails.js
|
110
137
|
- test_app/public/robots.txt
|
111
138
|
- test_app/public/stylesheets/.gitkeep
|
@@ -119,39 +146,35 @@ files:
|
|
119
146
|
- test_app/test/unit/helpers/users_helper_test.rb
|
120
147
|
- test_app/test/unit/user_test.rb
|
121
148
|
- test_app/vendor/plugins/.gitkeep
|
122
|
-
has_rdoc: true
|
123
149
|
homepage: http://github.com/bernat/best_in_place
|
124
150
|
licenses: []
|
125
|
-
|
126
151
|
post_install_message:
|
127
152
|
rdoc_options: []
|
128
|
-
|
129
|
-
require_paths:
|
153
|
+
require_paths:
|
130
154
|
- lib
|
131
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
155
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
132
156
|
none: false
|
133
|
-
requirements:
|
134
|
-
- -
|
135
|
-
- !ruby/object:Gem::Version
|
136
|
-
|
137
|
-
segments:
|
157
|
+
requirements:
|
158
|
+
- - ! '>='
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
161
|
+
segments:
|
138
162
|
- 0
|
139
|
-
|
140
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
163
|
+
hash: 982211869
|
164
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
141
165
|
none: false
|
142
|
-
requirements:
|
143
|
-
- -
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
|
146
|
-
segments:
|
166
|
+
requirements:
|
167
|
+
- - ! '>='
|
168
|
+
- !ruby/object:Gem::Version
|
169
|
+
version: '0'
|
170
|
+
segments:
|
147
171
|
- 0
|
148
|
-
|
172
|
+
hash: 982211869
|
149
173
|
requirements: []
|
150
|
-
|
151
174
|
rubyforge_project: best_in_place
|
152
|
-
rubygems_version: 1.
|
175
|
+
rubygems_version: 1.8.10
|
153
176
|
signing_key:
|
154
177
|
specification_version: 3
|
155
|
-
summary: It makes any field in place editable by clicking on it, it works for inputs,
|
178
|
+
summary: It makes any field in place editable by clicking on it, it works for inputs,
|
179
|
+
textareas, select dropdowns and checkboxes
|
156
180
|
test_files: []
|
157
|
-
|