best_in_place 3.0.3 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Appraisals +3 -1
- data/CHANGELOG.md +6 -4
- data/README.md +23 -10
- data/gemfiles/rails_3.2.gemfile +1 -0
- data/gemfiles/rails_4.0.gemfile +1 -0
- data/lib/assets/javascripts/best_in_place.js +23 -26
- data/lib/best_in_place.rb +2 -1
- data/lib/best_in_place/helper.rb +38 -60
- data/lib/best_in_place/version.rb +1 -1
- data/spec/helper_spec.rb +39 -9
- data/spec/integration/js_spec.rb +28 -1
- data/spec/internal/app/models/user.rb +1 -0
- data/spec/internal/app/views/users/show.html.erb +8 -2
- data/spec/internal/config/initializers/countries.rb +1 -1
- data/vendor/assets/javascripts/jquery.purr.js +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 69cca3a71a33da7518f1fb792624d505c10e9018
|
4
|
+
data.tar.gz: 9782236c6e4508607b856b0690ef29abaef84780
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9d5d31fa17f831062346c9b21e9eac994cf948fe551d2c5699dc43c69ae508421374a4281cf58e3ef1860504a6e80736ff2cbf7665e05e3961359d2757a79d3c
|
7
|
+
data.tar.gz: 5b4d5c558752d542e434060724909c356defa96932105e17d8b63d440562f1858a286714f131e68e97789d1f947b4b669b258bbbce65b6424ac2eb1e1704edf2
|
data/Appraisals
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
appraise "rails-3.2" do
|
2
2
|
gem 'rails', github: "rails/rails", branch: '3-2-stable'
|
3
3
|
gem 'strong_parameters'
|
4
|
+
gem 'test-unit'
|
4
5
|
end
|
5
6
|
|
6
7
|
appraise "rails-4.0" do
|
7
8
|
gem "rails", github: "rails/rails", branch: '4-0-stable'
|
9
|
+
gem 'test-unit'
|
8
10
|
end
|
9
11
|
|
10
12
|
appraise "rails-4.1" do
|
@@ -18,4 +20,4 @@ end
|
|
18
20
|
appraise "rails-edge" do
|
19
21
|
gem "rails", github: "rails/rails"
|
20
22
|
gem 'arel', github: 'rails/arel'
|
21
|
-
end
|
23
|
+
end
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
#Changelog
|
2
|
+
- unreleased
|
3
|
+
- add option[:skip_blur] to play nice with wysiwhtml5
|
2
4
|
|
3
5
|
- v.3.0.3 :
|
4
6
|
- Pass all callback arguments on $.ajax
|
@@ -15,14 +17,14 @@
|
|
15
17
|
- Support all supported version of actionpack/rails
|
16
18
|
- Dropped dependency on jquery gem
|
17
19
|
- Namespaced all data attributes to avoid conflict.
|
18
|
-
- Jquery-ui datepicker was extracted to best_in_place.jquery-ui.js
|
20
|
+
- Jquery-ui datepicker was extracted to best_in_place.jquery-ui.js
|
19
21
|
- Added BestInPlaceEditor.defaults
|
20
22
|
- Deprecated opts[:sanitize] in favor of option[:raw]
|
21
|
-
- You have to require jquery.purr before best_in_place.purr
|
22
|
-
- You have to require jquery-ui.datepicker before best_in_place.jquery-ui
|
23
|
+
- You have to require jquery.purr before best_in_place.purr
|
24
|
+
- You have to require jquery-ui.datepicker before best_in_place.jquery-ui
|
23
25
|
- Added opts[:value] to set custom original-value
|
24
26
|
- You can override the default container
|
25
|
-
|
27
|
+
|
26
28
|
- v.2x : glitch in the Matrix
|
27
29
|
|
28
30
|
- v.1.1.0 Changed $ by jQuery for compatibility (thanks @tschmitz), new
|
data/README.md
CHANGED
@@ -11,8 +11,6 @@ Javascript file to the application it allows all the fields with the proper defi
|
|
11
11
|
|
12
12
|
The editor works by PUTting the updated value to the server and GETting the updated record afterwards to display the updated value.
|
13
13
|
|
14
|
-
[**SEE DEMO**](http://bipapp.heroku.com/)
|
15
|
-
|
16
14
|
---
|
17
15
|
|
18
16
|
##Installation
|
@@ -87,7 +85,7 @@ Options:
|
|
87
85
|
- **:cancel_button**: (Inputs and textareas only) If set to a string, then a Cancel button will be shown with the string as its label.
|
88
86
|
- **:cancel_button_class**: (Inputs and textareas only) Specifies any extra classes to set on the Cancel button.
|
89
87
|
- **:sanitize**: True by default. If set to false the input/textarea will accept html tags.
|
90
|
-
- **:html_attrs**: Hash of html arguments such as maxlength, default-value, etc. that will be set on the rendered input **not** the best_in_place span.
|
88
|
+
- **:html_attrs**: Hash of html arguments such as maxlength, default-value, etc. that will be set on the rendered input **not** the best_in_place span.
|
91
89
|
- **:inner_class**: Class that is set to the rendered input.
|
92
90
|
- **:display_as**: A **model** method which will be called in order to display this field. Cannot be used when using `display_with`.
|
93
91
|
- **:display_with**: A **helper** method or proc will be called in order to display this field. Cannot be used with `display_as`.
|
@@ -97,9 +95,10 @@ Options:
|
|
97
95
|
- **:value**: Customize the starting value of the inline input (defaults to to the field's value)
|
98
96
|
- **:id**: The HTML id of the best_in_place span. If not specified one is automatically generated.
|
99
97
|
- **:param**: If you wish to specific the object explicitly use this option.
|
100
|
-
- **:confirm**: If set to true displays a confirmation message when abandoning changes (pressing the escape key)
|
98
|
+
- **:confirm**: If set to true displays a confirmation message when abandoning changes (pressing the escape key).
|
99
|
+
- **:skip_blur**: If set to true, blurring the input will not cause changes to be abandoned in textareas.
|
101
100
|
|
102
|
-
HTML Options:
|
101
|
+
HTML Options:
|
103
102
|
|
104
103
|
If you provide an option that is not explicitly a best_in_place option it will be passed through when creating the best_in_place span.
|
105
104
|
|
@@ -141,7 +140,7 @@ Examples (code in the views):
|
|
141
140
|
|
142
141
|
<%= best_in_place @user, :name, :as => :input %>
|
143
142
|
|
144
|
-
<%= best_in_place @user, :name, :as => :input, :
|
143
|
+
<%= best_in_place @user, :name, :as => :input, :place_holder => "Click me to add content!" %>
|
145
144
|
|
146
145
|
### Textarea
|
147
146
|
|
@@ -161,10 +160,15 @@ The value will always be converted to a string for display.
|
|
161
160
|
|
162
161
|
### Checkbox
|
163
162
|
|
164
|
-
<%= best_in_place @user, :receive_emails, :
|
163
|
+
<%= best_in_place @user, :receive_emails, as: :checkbox, collection: ["No, thanks", "Yes, of course!"] %>
|
164
|
+
<%= best_in_place @user, :receive_emails, as: :checkbox, collection: {false: "Nope", true: "Yep"} %>
|
165
165
|
|
166
|
-
|
166
|
+
If you use array as a collection, the first value is always the negative boolean value and the second the positive. Structure: `["false value", "true value"]`.
|
167
167
|
If not defined, it will default to *Yes* and *No* options.
|
168
|
+
Default true and false values are stored in locales
|
169
|
+
|
170
|
+
t(:'best_in_place.yes', default: 'Yes')
|
171
|
+
t(:'best_in_place.no', default: 'No')
|
168
172
|
|
169
173
|
### Date
|
170
174
|
|
@@ -243,8 +247,8 @@ then bind to that class.
|
|
243
247
|
<%= best_in_place @user, :name, :classes => 'highlight_on_success' %>
|
244
248
|
<%= best_in_place @user, :mail, :classes => 'bounce_on_success' %>
|
245
249
|
|
246
|
-
$('.highlight_on_success').bind("ajax:success", function(){$(this).closest('tr').effect('highlight')
|
247
|
-
$('.bounce_on_success').bind("ajax:success", function(){$(this).closest('tr').effect('bounce')
|
250
|
+
$('.highlight_on_success').bind("ajax:success", function(){$(this).closest('tr').effect('highlight');});
|
251
|
+
$('.bounce_on_success').bind("ajax:success", function(){$(this).closest('tr').effect('bounce');});
|
248
252
|
|
249
253
|
### Providing data to the callback
|
250
254
|
|
@@ -328,6 +332,15 @@ And finally we need a controller:
|
|
328
332
|
|
329
333
|
And this is how it is done!
|
330
334
|
|
335
|
+
## Configuration
|
336
|
+
|
337
|
+
You can configure some global options for best_in_place. Currently these options are available:
|
338
|
+
|
339
|
+
BestInPlace.configure do |config|
|
340
|
+
config.container = :div
|
341
|
+
config.skip_blur = true
|
342
|
+
end
|
343
|
+
|
331
344
|
|
332
345
|
## Notification
|
333
346
|
|
data/gemfiles/rails_3.2.gemfile
CHANGED
data/gemfiles/rails_4.0.gemfile
CHANGED
@@ -120,11 +120,11 @@ BestInPlaceEditor.prototype = {
|
|
120
120
|
this.previousCollectionValue = value;
|
121
121
|
|
122
122
|
// search for the text for the span
|
123
|
-
editor.element.html(
|
123
|
+
$.each(this.values, function(index, arr){ if (String(arr[0]) === String(value)) editor.element.html(arr[1]); });
|
124
124
|
break;
|
125
125
|
|
126
126
|
case "checkbox":
|
127
|
-
editor.element.html(
|
127
|
+
$.each(this.values, function(index, arr){ if (String(arr[0]) === String(value)) editor.element.html(arr[1]); });
|
128
128
|
break;
|
129
129
|
|
130
130
|
default:
|
@@ -140,6 +140,7 @@ BestInPlaceEditor.prototype = {
|
|
140
140
|
}
|
141
141
|
|
142
142
|
editor.element.data('bipValue', value);
|
143
|
+
editor.element.attr('data-bip-value', value);
|
143
144
|
|
144
145
|
editor.element.trigger(jQuery.Event("best_in_place:update"));
|
145
146
|
|
@@ -173,6 +174,7 @@ BestInPlaceEditor.prototype = {
|
|
173
174
|
self.okButtonClass = self.okButtonClass || $parent.data("bipOkButtonClass");
|
174
175
|
self.cancelButton = self.cancelButton || $parent.data("bipCancelButton");
|
175
176
|
self.cancelButtonClass = self.cancelButtonClass || $parent.data("bipCancelButtonClass");
|
177
|
+
self.skipBlur = self.skipBlur || $parent.data("bipSkipBlur");
|
176
178
|
});
|
177
179
|
|
178
180
|
// Load own attributes (overrides all others)
|
@@ -186,18 +188,19 @@ BestInPlaceEditor.prototype = {
|
|
186
188
|
self.okButtonClass = self.element.data("bipOkButtonClass") || self.okButtonClass || BestInPlaceEditor.defaults.okButtonClass;
|
187
189
|
self.cancelButton = self.element.data("bipCancelButton") || self.cancelButton;
|
188
190
|
self.cancelButtonClass = self.element.data("bipCancelButtonClass") || self.cancelButtonClass || BestInPlaceEditor.defaults.cancelButtonClass;
|
189
|
-
|
191
|
+
self.skipBlur = self.element.data("bipSkipBlur") || self.skipBlur || BestInPlaceEditor.defaults.skipBlur;
|
192
|
+
|
190
193
|
// Fix for default values of 0
|
191
194
|
if (self.element.data("bipPlaceholder") == null) {
|
192
195
|
self.placeHolder = BestInPlaceEditor.defaults.locales[''].placeHolder;
|
193
196
|
} else {
|
194
197
|
self.placeHolder = self.element.data("bipPlaceholder");
|
195
198
|
}
|
196
|
-
|
199
|
+
|
197
200
|
self.inner_class = self.element.data("bipInnerClass");
|
198
201
|
self.html_attrs = self.element.data("bipHtmlAttrs");
|
199
202
|
self.original_content = self.element.data("bipOriginalContent") || self.original_content;
|
200
|
-
|
203
|
+
|
201
204
|
// if set the input won't be satinized
|
202
205
|
self.display_raw = self.element.data("bip-raw");
|
203
206
|
|
@@ -220,6 +223,7 @@ BestInPlaceEditor.prototype = {
|
|
220
223
|
'use strict';
|
221
224
|
// TODO add placeholder for select and checkbox
|
222
225
|
if (this.element.html() === "") {
|
226
|
+
this.element.addClass('bip-placeholder');
|
223
227
|
this.element.html(this.placeHolder);
|
224
228
|
}
|
225
229
|
},
|
@@ -236,19 +240,6 @@ BestInPlaceEditor.prototype = {
|
|
236
240
|
alert(BestInPlaceEditor.defaults.locales[''].uninitializedForm);
|
237
241
|
},
|
238
242
|
|
239
|
-
arrayToObject: function(list, values) {
|
240
|
-
if (list == null) return {};
|
241
|
-
var result = {};
|
242
|
-
for (var i = 0, length = list.length; i < length; i++) {
|
243
|
-
if (values) {
|
244
|
-
result[list[i]] = values[i];
|
245
|
-
} else {
|
246
|
-
result[list[i][0]] = list[i][1];
|
247
|
-
}
|
248
|
-
}
|
249
|
-
return result;
|
250
|
-
},
|
251
|
-
|
252
243
|
// Trim and Strips HTML from text
|
253
244
|
sanitizeValue: function (s) {
|
254
245
|
'use strict';
|
@@ -299,6 +290,7 @@ BestInPlaceEditor.prototype = {
|
|
299
290
|
this.element.html(response.display_as);
|
300
291
|
}
|
301
292
|
}
|
293
|
+
this.element.toggleClass('bip-placeholder', this.isPlaceHolder());
|
302
294
|
|
303
295
|
this.element.trigger(jQuery.Event("best_in_place:success"), [data, status, xhr]);
|
304
296
|
this.element.trigger(jQuery.Event("ajax:success"), [data, status, xhr]);
|
@@ -469,15 +461,17 @@ BestInPlaceEditor.forms = {
|
|
469
461
|
.attr('class', this.inner_class !== null ? this.inner_class : ''),
|
470
462
|
currentCollectionValue = this.collectionValue,
|
471
463
|
key, value,
|
472
|
-
a = this.
|
473
|
-
|
474
|
-
|
464
|
+
a = this.values;
|
465
|
+
|
466
|
+
$.each(a, function(index, arr){
|
467
|
+
key = arr[0];
|
468
|
+
value = arr[1];
|
475
469
|
var option_elt = jQuery(document.createElement('option'))
|
476
470
|
.val(key)
|
477
471
|
.html(value);
|
478
472
|
if (String(key) === String(currentCollectionValue)) option_elt.attr('selected', 'selected');
|
479
473
|
select_elt.append(option_elt);
|
480
|
-
};
|
474
|
+
});
|
481
475
|
output.append(select_elt);
|
482
476
|
|
483
477
|
this.element.html(output);
|
@@ -493,9 +487,9 @@ BestInPlaceEditor.forms = {
|
|
493
487
|
var e = document.createEvent("MouseEvents");
|
494
488
|
e.initMouseEvent("mousedown", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
|
495
489
|
this.element.find("select")[0].dispatchEvent(e);
|
496
|
-
}
|
490
|
+
}
|
497
491
|
catch(e) {
|
498
|
-
// browser doesn't support this, e.g. IE8
|
492
|
+
// browser doesn't support this, e.g. IE8
|
499
493
|
}
|
500
494
|
},
|
501
495
|
|
@@ -569,7 +563,9 @@ BestInPlaceEditor.forms = {
|
|
569
563
|
this.element.find("input[type='button']").bind('click', {editor: this}, BestInPlaceEditor.forms.textarea.cancelButtonHandler);
|
570
564
|
}
|
571
565
|
|
572
|
-
this.
|
566
|
+
if (!this.skipBlur) {
|
567
|
+
this.element.find("textarea").bind('blur', {editor: this}, BestInPlaceEditor.forms.textarea.blurHandler);
|
568
|
+
}
|
573
569
|
this.element.find("textarea").bind('keyup', {editor: this}, BestInPlaceEditor.forms.textarea.keyupHandler);
|
574
570
|
this.blurTimer = null;
|
575
571
|
this.userClicked = false;
|
@@ -631,7 +627,8 @@ BestInPlaceEditor.defaults = {
|
|
631
627
|
ajaxMethod: "put", //TODO Change to patch when support to 3.2 is dropped
|
632
628
|
ajaxDataType: 'text',
|
633
629
|
okButtonClass: '',
|
634
|
-
cancelButtonClass: ''
|
630
|
+
cancelButtonClass: '',
|
631
|
+
skipBlur: false
|
635
632
|
};
|
636
633
|
|
637
634
|
// Default locale
|
data/lib/best_in_place.rb
CHANGED
data/lib/best_in_place/helper.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module BestInPlace
|
2
2
|
module Helper
|
3
3
|
def best_in_place(object, field, opts = {})
|
4
|
-
|
4
|
+
|
5
5
|
best_in_place_assert_arguments(opts)
|
6
6
|
type = opts[:as] || :input
|
7
7
|
field = field.to_s
|
@@ -20,11 +20,8 @@ module BestInPlace
|
|
20
20
|
if opts[:collection] or type == :checkbox
|
21
21
|
collection = opts[:collection]
|
22
22
|
value = value.to_s
|
23
|
-
collection = if collection.blank?
|
24
|
-
|
25
|
-
else
|
26
|
-
best_in_place_collection_builder(type, collection)
|
27
|
-
end
|
23
|
+
collection = best_in_place_default_collection if collection.blank?
|
24
|
+
collection = best_in_place_collection_builder(type, collection)
|
28
25
|
display_value = collection.flat_map{|a| a[0].to_s == value ? a[1] : nil }.compact[0]
|
29
26
|
collection = collection.to_json
|
30
27
|
options[:data]['bip-collection'] = html_escape(collection)
|
@@ -49,6 +46,8 @@ module BestInPlace
|
|
49
46
|
options[:data]['bip-cancel-button-class'] = opts[:cancel_button_class].presence
|
50
47
|
options[:data]['bip-original-content'] = html_escape(opts[:value] || value).presence
|
51
48
|
|
49
|
+
options[:data]['bip-skip-blur'] = opts.has_key?(:skip_blur) ? opts[:skip_blur].presence : BestInPlace.skip_blur
|
50
|
+
|
52
51
|
options[:data]['bip-url'] = url_for(opts[:url] || object)
|
53
52
|
|
54
53
|
options[:data]['bip-confirm'] = opts[:confirm].presence
|
@@ -133,68 +132,47 @@ module BestInPlace
|
|
133
132
|
end
|
134
133
|
end
|
135
134
|
|
136
|
-
def best_in_place_deprecated_options(
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
if deprecated_option = args.delete(:classes)
|
153
|
-
args[:class] = deprecated_option
|
154
|
-
ActiveSupport::Deprecation.warn('[Best_in_place] :classes is deprecated in favor of :class ')
|
135
|
+
def best_in_place_deprecated_options(opts)
|
136
|
+
deprecations = [
|
137
|
+
{from: :path, to: :url},
|
138
|
+
{from: :object_name, to: :param},
|
139
|
+
{from: :type, to: :as},
|
140
|
+
{from: :classes, to: :class},
|
141
|
+
{from: :nil, to: :place_holder},
|
142
|
+
{from: :use_confirm, to: :confirm},
|
143
|
+
{from: :sanitize, to: :raw}
|
144
|
+
]
|
145
|
+
|
146
|
+
deprecations.each do |deprecation|
|
147
|
+
if deprecated_option = opts.delete(deprecation[:from])
|
148
|
+
opts[deprecation[:from]] = deprecated_option
|
149
|
+
ActiveSupport::Deprecation.warn("[Best_in_place] :#{deprecation[:from]} is deprecated in favor of :#{deprecation[:to]} ")
|
150
|
+
end
|
155
151
|
end
|
152
|
+
end
|
156
153
|
|
157
|
-
|
158
|
-
|
159
|
-
ActiveSupport::Deprecation.warn('[Best_in_place] :nil is deprecated in favor of :place_holder ')
|
160
|
-
end
|
154
|
+
def best_in_place_collection_builder(type, collection)
|
155
|
+
return Array(collection) if collection.is_a?(Hash)
|
161
156
|
|
162
|
-
if
|
163
|
-
|
164
|
-
|
157
|
+
if type == :checkbox
|
158
|
+
best_in_place_collection_checkbox(collection)
|
159
|
+
else # :select
|
160
|
+
best_in_place_collection_select(collection)
|
165
161
|
end
|
162
|
+
end
|
166
163
|
|
167
|
-
|
168
|
-
|
169
|
-
|
164
|
+
def best_in_place_collection_checkbox(collection)
|
165
|
+
if collection.length == 2
|
166
|
+
[['false', collection[0]], ['true', collection[1]]]
|
167
|
+
else
|
168
|
+
fail ArgumentError, '[Best_in_place] :collection array should have 2 values'
|
170
169
|
end
|
171
170
|
end
|
172
171
|
|
173
|
-
def
|
174
|
-
collection
|
175
|
-
|
176
|
-
|
177
|
-
if collection.length == 2
|
178
|
-
{'false' => collection[0], 'true' => collection[1]}.stringify_keys
|
179
|
-
else
|
180
|
-
fail ArgumentError, '[Best_in_place] :collection array should have 2 values'
|
181
|
-
end
|
182
|
-
else # :select
|
183
|
-
case collection[0]
|
184
|
-
when Array
|
185
|
-
collection
|
186
|
-
else
|
187
|
-
if collection[0].length == 2
|
188
|
-
collection.to_a
|
189
|
-
else
|
190
|
-
collection.each_with_index.map{|a,i| [i+1,a]}
|
191
|
-
end
|
192
|
-
end
|
193
|
-
end
|
194
|
-
else
|
195
|
-
collection.to_a
|
196
|
-
end
|
197
|
-
collection
|
172
|
+
def best_in_place_collection_select(collection)
|
173
|
+
return Array(collection) if collection[0].is_a?(Array) || collection[0].length == 2
|
174
|
+
|
175
|
+
collection.each_with_index.map { |a, i| [i+1, a] }
|
198
176
|
end
|
199
177
|
|
200
178
|
def best_in_place_default_collection
|
data/spec/helper_spec.rb
CHANGED
@@ -31,6 +31,12 @@ describe BestInPlace::Helper, type: :helper do
|
|
31
31
|
expect(span).not_to be_empty
|
32
32
|
end
|
33
33
|
|
34
|
+
it "should show deprecation warning" do
|
35
|
+
expect(ActiveSupport::Deprecation).to receive(:warn).with("[Best_in_place] :path is deprecated in favor of :url ")
|
36
|
+
|
37
|
+
helper.best_in_place @user, :name, path: "http://example.com"
|
38
|
+
end
|
39
|
+
|
34
40
|
it "should not allow both display_as and display_with option" do
|
35
41
|
expect { helper.best_in_place(@user, :money, :display_with => :number_to_currency, :display_as => :custom) }.to raise_error(ArgumentError)
|
36
42
|
end
|
@@ -141,7 +147,7 @@ describe BestInPlace::Helper, type: :helper do
|
|
141
147
|
span = nk.css("span")
|
142
148
|
expect(span.text).to eq("")
|
143
149
|
end
|
144
|
-
|
150
|
+
|
145
151
|
end
|
146
152
|
|
147
153
|
it "should have the given inner_class" do
|
@@ -320,7 +326,7 @@ describe BestInPlace::Helper, type: :helper do
|
|
320
326
|
end
|
321
327
|
|
322
328
|
it "should have the default data-bip-collection" do
|
323
|
-
expect(@span.attribute("data-bip-collection").value).to eq("
|
329
|
+
expect(@span.attribute("data-bip-collection").value).to eq("[[\"true\",\"Yes\"],[\"false\",\"No\"]]")
|
324
330
|
end
|
325
331
|
|
326
332
|
it "should render the current option as No" do
|
@@ -355,8 +361,8 @@ describe BestInPlace::Helper, type: :helper do
|
|
355
361
|
expect(@span.text).to eq("Net")
|
356
362
|
end
|
357
363
|
|
358
|
-
it
|
359
|
-
expect(@span.attribute(
|
364
|
+
it 'should render the proper data-bip-collection' do
|
365
|
+
expect(@span.attribute('data-bip-collection').value).to eq([['false', @good_collection[0]], ['true', @good_collection[1]]].to_json)
|
360
366
|
end
|
361
367
|
|
362
368
|
it "should raise an argument error on bad collection" do
|
@@ -480,24 +486,24 @@ describe BestInPlace::Helper, type: :helper do
|
|
480
486
|
end
|
481
487
|
|
482
488
|
end
|
483
|
-
|
489
|
+
|
484
490
|
describe "with html parameters" do
|
485
491
|
before do
|
486
492
|
@attrs = {tabindex: 1, width: "300px", height: "24px"}
|
487
493
|
nk = Nokogiri::HTML.parse(helper.best_in_place @user, :name, @attrs)
|
488
494
|
@span = nk.css("span")
|
489
495
|
end
|
490
|
-
|
496
|
+
|
491
497
|
it 'should pass through html attributes to the best_in_place span' do
|
492
498
|
expect(@attrs.select {|key, value| @span.attribute(key.to_s) }).to eq(@attrs)
|
493
499
|
end
|
494
|
-
|
500
|
+
|
495
501
|
it 'should have the proper values set' do
|
496
502
|
expect(@attrs.map {|key, value| @span.attribute(key.to_s).value }).to eq(@attrs.map {|key, value| value.to_s })
|
497
503
|
end
|
498
|
-
|
504
|
+
|
499
505
|
end
|
500
|
-
|
506
|
+
|
501
507
|
end
|
502
508
|
|
503
509
|
context 'custom container' do
|
@@ -521,6 +527,30 @@ describe BestInPlace::Helper, type: :helper do
|
|
521
527
|
BestInPlace.container = @old_container
|
522
528
|
end
|
523
529
|
end
|
530
|
+
|
531
|
+
context '.configure' do
|
532
|
+
describe 'skip_blur' do
|
533
|
+
before(:each) do
|
534
|
+
@old_skip_blur = BestInPlace.skip_blur
|
535
|
+
@user.save
|
536
|
+
BestInPlace.skip_blur = true
|
537
|
+
end
|
538
|
+
|
539
|
+
after(:each) do
|
540
|
+
BestInPlace.skip_blur = @old_skip_blur
|
541
|
+
end
|
542
|
+
|
543
|
+
it 'should override blur globally' do
|
544
|
+
nk = Nokogiri::HTML.parse(helper.best_in_place(@user, :name))
|
545
|
+
expect(nk.css("span").attribute("data-bip-skip-blur").value).to eq("true")
|
546
|
+
end
|
547
|
+
|
548
|
+
it 'should use helper params' do
|
549
|
+
nk = Nokogiri::HTML.parse(helper.best_in_place(@user, :name, skip_blur: false))
|
550
|
+
expect(nk.css("span").attribute("data-bip-skip-blur")).to be_nil
|
551
|
+
end
|
552
|
+
end
|
553
|
+
end
|
524
554
|
end
|
525
555
|
|
526
556
|
describe "#best_in_place_if" do
|
data/spec/integration/js_spec.rb
CHANGED
@@ -111,6 +111,17 @@ describe "JS behaviour", :js => true do
|
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
114
|
+
it 'should update the DOM when a field value changes' do
|
115
|
+
@user.save!
|
116
|
+
visit user_path(@user)
|
117
|
+
|
118
|
+
expect(find('#receive_email')).to have_content('No thanks')
|
119
|
+
|
120
|
+
bip_bool @user, :receive_email
|
121
|
+
|
122
|
+
expect(page).to have_selector('#receive_email span[data-bip-value=true]')
|
123
|
+
end
|
124
|
+
|
114
125
|
it "should be able to update last but one item in list" do
|
115
126
|
@user.save!
|
116
127
|
@user2 = User.create :name => "Test",
|
@@ -193,7 +204,7 @@ describe "JS behaviour", :js => true do
|
|
193
204
|
|
194
205
|
expect(find('#country')).to have_content('Italy')
|
195
206
|
|
196
|
-
bip_select @user, :country,
|
207
|
+
bip_select @user, :country, 'France'
|
197
208
|
|
198
209
|
expect(find('#country')).to have_content('France')
|
199
210
|
|
@@ -264,6 +275,22 @@ describe "JS behaviour", :js => true do
|
|
264
275
|
expect(find('#birth_date')).to have_content(today.beginning_of_month.strftime('%d-%m-%Y'))
|
265
276
|
end
|
266
277
|
|
278
|
+
it "should be able to use bip_bool to change the default boolean values" do
|
279
|
+
@user.save!
|
280
|
+
visit user_path(@user)
|
281
|
+
|
282
|
+
|
283
|
+
expect(find('#receive_email_default')).to have_content('No')
|
284
|
+
|
285
|
+
bip_bool @user, :receive_email_default
|
286
|
+
|
287
|
+
expect(find('#receive_email_default')).to have_content('Yes')
|
288
|
+
|
289
|
+
visit user_path(@user)
|
290
|
+
|
291
|
+
expect(find('#receive_email_default')).to have_content('Yes')
|
292
|
+
end
|
293
|
+
|
267
294
|
it "should be able to use bip_bool to change a boolean value" do
|
268
295
|
@user.save!
|
269
296
|
visit user_path(@user)
|
@@ -17,6 +17,7 @@ class User < ActiveRecord::Base
|
|
17
17
|
|
18
18
|
alias_attribute :money_custom, :money
|
19
19
|
alias_attribute :money_value, :money
|
20
|
+
alias_attribute :receive_email_default, :receive_email
|
20
21
|
alias_attribute :receive_email_image, :receive_email
|
21
22
|
alias_attribute :description_simple, :description
|
22
23
|
|
@@ -52,10 +52,16 @@
|
|
52
52
|
<%= best_in_place @user, :country, as: :select, :collection => @countries, :inner_class => :some_class %>
|
53
53
|
</td>
|
54
54
|
</tr>
|
55
|
+
<tr>
|
56
|
+
<td>Receive newsletter? (default display)</td>
|
57
|
+
<td id="receive_email_default">
|
58
|
+
<%= best_in_place @user, :receive_email_default, as: :checkbox %>
|
59
|
+
</td>
|
60
|
+
</tr>
|
55
61
|
<tr>
|
56
62
|
<td>Receive newsletter?</td>
|
57
63
|
<td id="receive_email">
|
58
|
-
<%= best_in_place @user, :receive_email, as: :checkbox, collection:
|
64
|
+
<%= best_in_place @user, :receive_email, as: :checkbox, collection: ['No thanks', 'Yes of course'] %>
|
59
65
|
</td>
|
60
66
|
</tr>
|
61
67
|
<tr>
|
@@ -137,7 +143,7 @@
|
|
137
143
|
<%= best_in_place @user, :zero_field, place_holder: 0 %>
|
138
144
|
</td>
|
139
145
|
</tr>
|
140
|
-
|
146
|
+
|
141
147
|
</table>
|
142
148
|
<br/>
|
143
149
|
<hr/>
|
@@ -1,4 +1,4 @@
|
|
1
|
-
COUNTRIES_HASH = { 1 => 'Spain',
|
1
|
+
COUNTRIES_HASH = { 1 => 'Spain', 3 => 'Germany', 2 => 'Italy', 4 => 'France' }
|
2
2
|
COUNTRIES_HASH_STRING_KEYS = { es: 'Spain', it: 'Italy', de: 'Germany', fr: 'France' }
|
3
3
|
COUNTRIES_ARRAY = %w(Spain Italy Germany France)
|
4
4
|
COUNTRIES_ARRAY_OF_ARRAYS = [[1, 'Spain'], [3, 'Germany'], [2, 'Italy'], [4, 'France']]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: best_in_place
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bernat Farrero
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-01
|
11
|
+
date: 2015-12-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionpack
|
@@ -158,7 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
158
158
|
version: '0'
|
159
159
|
requirements: []
|
160
160
|
rubyforge_project:
|
161
|
-
rubygems_version: 2.
|
161
|
+
rubygems_version: 2.4.8
|
162
162
|
signing_key:
|
163
163
|
specification_version: 4
|
164
164
|
summary: It makes any field in place editable by clicking on it, it works for inputs,
|