best_in_place 3.0.2 → 3.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e5e84415483a33f06ae8ad58a61c1659b185568e
4
- data.tar.gz: eb2b9be33ed3f859f29222028b4143ec05b8c582
3
+ metadata.gz: 84ce49122f38b9152cae6c9ce661307dd0f3d528
4
+ data.tar.gz: ad3e88ba32e9c656706661ef05e807f9fdfc7fb3
5
5
  SHA512:
6
- metadata.gz: 5403e603dd30cd6d28be3e39ba6bec7a2c407918a7b8759da50712fcdce2fd9af5b59e69eacde956d21086c6ccbbee7980aa1fe2d1d0dbeaeb2c1f8c68269e92
7
- data.tar.gz: ea7dc137ed0816109d9debb3b7782349d6fcf7a587c66725eab2e6ddc3a5ac1006dba2170e2c8ca7a6e8a58b990c86dcb530d104d6f85c79b043f8f2b818971f
6
+ metadata.gz: 1502b356495066e3c08541b068e8af62bd58bcc0c32d0ff84b5fdb570ffdd663fb9fa864ea2f78c77326ff0d359cf42b9819402a5052bf1245a5f47c19e11993
7
+ data.tar.gz: db75bf52797e26f7bb11253b4cadaaaede87ec84d46dfe736bfead6960469c76bc10fa5fb7284f211241f48da035f63d792a1197a8d2d79cb84ab458eb31d3a5
@@ -1,5 +1,8 @@
1
1
  #Changelog
2
2
 
3
+ - v.3.0.3 :
4
+ - Pass all callback arguments on $.ajax
5
+
3
6
  - v.3.0.0 :
4
7
  - Expect syntax for spec
5
8
  - Deprecated option[:path] in favor of option[:url]
data/README.md CHANGED
@@ -76,7 +76,7 @@ Params:
76
76
 
77
77
  Options:
78
78
 
79
- - **:type** It can be only [:input, :textarea, :select, :checkbox, :date (>= 1.0.4)] or if undefined it defaults to :input.
79
+ - **:as** It can be only [:input, :textarea, :select, :checkbox, :date] or if undefined it defaults to :input.
80
80
  - **:collection**: If you are using the :select type then you must specify the collection of values it takes as a hash where values represent the display text and keys are the option's value when selected. If you are using the :checkbox type you can specify the two values it can take, or otherwise they will default to Yes and No.
81
81
  - **:url**: URL to which the updating action will be sent. If not defined it defaults to the :object path.
82
82
  - **:place_holder**: The nil param defines the content displayed in case no value is defined for that field. It can be something like "click me to edit".
@@ -92,7 +92,6 @@ Options:
92
92
  - **:display_as**: A **model** method which will be called in order to display this field. Cannot be used when using `display_with`.
93
93
  - **:display_with**: A **helper** method or proc will be called in order to display this field. Cannot be used with `display_as`.
94
94
  - **:helper_options**: A hash of parameters to be sent to the helper method specified by `display_with`.
95
- - **:as**: Used for overriding the default params key used for the object (the data-object attribute). Useful for e.g. STI scenarios where best_in_place should post to a common controller for different models.
96
95
  - **:data**: Hash of custom data attributes to be added to span. Can be used to provide data to the ajax:success callback.
97
96
  - **:class**: Additional classes to apply to the best_in_place span. Accepts either a string or Array of strings
98
97
  - **:value**: Customize the starting value of the inline input (defaults to to the field's value)
@@ -120,11 +119,11 @@ condition, is satisfied. Specifically:
120
119
 
121
120
  Say we have something like
122
121
 
123
- <%= best_in_place_if condition, @user, :name, :type => :input %>
122
+ <%= best_in_place_if condition, @user, :name, :as => :input %>
124
123
 
125
124
  In case *condition* is satisfied, the outcome will be just the same as:
126
125
 
127
- <%= best_in_place @user, :name, :type => :input %>
126
+ <%= best_in_place @user, :name, :as => :input %>
128
127
 
129
128
  Otherwise, we will have the same outcome as:
130
129
 
@@ -140,36 +139,36 @@ Examples (code in the views):
140
139
 
141
140
  ### Input
142
141
 
143
- <%= best_in_place @user, :name, :type => :input %>
142
+ <%= best_in_place @user, :name, :as => :input %>
144
143
 
145
- <%= best_in_place @user, :name, :type => :input, :nil => "Click me to add content!" %>
144
+ <%= best_in_place @user, :name, :as => :input, :nil => "Click me to add content!" %>
146
145
 
147
146
  ### Textarea
148
147
 
149
- <%= best_in_place @user, :description, :type => :textarea %>
148
+ <%= best_in_place @user, :description, :as => :textarea %>
150
149
 
151
- <%= best_in_place @user, :favorite_books, :type => :textarea, :ok_button => 'Save', :cancel_button => 'Cancel' %>
150
+ <%= best_in_place @user, :favorite_books, :as => :textarea, :ok_button => 'Save', :cancel_button => 'Cancel' %>
152
151
 
153
152
  ### Select
154
153
 
155
- <%= best_in_place @user, :country, :type => :select, :collection => {"1" => "Spain", "2" => "Italy", "3" => "Germany", "4" => "France"} %>
156
- <%= best_in_place @user, :country, :type => :select, :collection => { es: 'Spain', it: 'Italy', de: 'Germany', fr: 'France' } %>
157
- <%= best_in_place @user, :country, :type => :select, :collection => %w(Spain Italy Germany France) %>
158
- <%= best_in_place @user, :country, :type => :select, :collection => [[1, 'Spain'], [3, 'Germany'], [2, 'Italy'], [4, 'France']] %>
154
+ <%= best_in_place @user, :country, :as => :select, :collection => {"1" => "Spain", "2" => "Italy", "3" => "Germany", "4" => "France"} %>
155
+ <%= best_in_place @user, :country, :as => :select, :collection => { es: 'Spain', it: 'Italy', de: 'Germany', fr: 'France' } %>
156
+ <%= best_in_place @user, :country, :as => :select, :collection => %w(Spain Italy Germany France) %>
157
+ <%= best_in_place @user, :country, :as => :select, :collection => [[1, 'Spain'], [3, 'Germany'], [2, 'Italy'], [4, 'France']] %>
159
158
 
160
159
  Of course it can take an instance or global variable for the collection, just remember the structure is a hash.
161
160
  The value will always be converted to a string for display.
162
161
 
163
162
  ### Checkbox
164
163
 
165
- <%= best_in_place @user, :receive_emails, :type => :checkbox, :collection => ["No, thanks", "Yes, of course!"] %>
164
+ <%= best_in_place @user, :receive_emails, :as => :checkbox, :collection => ["No, thanks", "Yes, of course!"] %>
166
165
 
167
166
  The first value is always the negative boolean value and the second the positive. Structure: `["false value", "true value"]`.
168
167
  If not defined, it will default to *Yes* and *No* options.
169
168
 
170
169
  ### Date
171
170
 
172
- <%= best_in_place @user, :birth_date, :type => :date %>
171
+ <%= best_in_place @user, :birth_date, :as => :date %>
173
172
 
174
173
  With the :date type the input field will be initialized as a datepicker input.
175
174
  In order to provide custom options to the datepicker initialization you must
@@ -206,7 +205,7 @@ the :json format. This is a simple example showing an update action using it:
206
205
  As of best in place 1.0.3 you can use custom methods in your model in order to
207
206
  decide how a certain field has to be displayed. You can write something like:
208
207
 
209
- = best_in_place @user, :description, :type => :textarea, :display_as => :mk_description
208
+ = best_in_place @user, :description, :as => :textarea, :display_as => :mk_description
210
209
 
211
210
  Then instead of using `@user.description` to show the actual value, best in
212
211
  place will call `@user.mk_description`. This can be used for any kind of
@@ -286,7 +285,7 @@ In the view, we'd do:
286
285
  th= size
287
286
  - flavours.each do |flavour|
288
287
  - v = @ice_cream.get_stock(flavour: flavour, size: size)
289
- td= best_in_place v, :to_i, type: :input, url: set_stock_ice_cream_path(flavour: flavour, size: size)
288
+ td= best_in_place v, :to_i, as: :input, url: set_stock_ice_cream_path(flavour: flavour, size: size)
290
289
 
291
290
  Now we need a route to which send the stock updates:
292
291
 
@@ -106,8 +106,8 @@ BestInPlaceEditor.prototype = {
106
106
  "type": BestInPlaceEditor.defaults.ajaxMethod,
107
107
  "dataType": BestInPlaceEditor.defaults.ajaxDataType,
108
108
  "data": editor.requestData(),
109
- "success": function (data) {
110
- editor.loadSuccessCallback(data);
109
+ "success": function (data, status, xhr) {
110
+ editor.loadSuccessCallback(data, status, xhr);
111
111
  },
112
112
  "error": function (request, error) {
113
113
  editor.loadErrorCallback(request, error);
@@ -120,15 +120,11 @@ BestInPlaceEditor.prototype = {
120
120
  this.previousCollectionValue = value;
121
121
 
122
122
  // search for the text for the span
123
- var key, val, _i, _len, _ref, a;
124
- for (_i = 0, a = this.values, _len = a.length; _i < _len; _i++) {
125
- _ref = a[_i], key = _ref[0], val = _ref[1];
126
- if (String(value) === String(key)) editor.element.html(val);
127
- };
123
+ editor.element.html(this.arrayToObject(this.values)[value]);
128
124
  break;
129
125
 
130
126
  case "checkbox":
131
- editor.element.html(this.values[value]);
127
+ editor.element.html(this.arrayToObject(this.values)[value]);
132
128
  break;
133
129
 
134
130
  default:
@@ -240,6 +236,19 @@ BestInPlaceEditor.prototype = {
240
236
  alert(BestInPlaceEditor.defaults.locales[''].uninitializedForm);
241
237
  },
242
238
 
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
+
243
252
  // Trim and Strips HTML from text
244
253
  sanitizeValue: function (s) {
245
254
  'use strict';
@@ -273,7 +282,7 @@ BestInPlaceEditor.prototype = {
273
282
 
274
283
  // Handlers ////////////////////////////////////////////////////////////////
275
284
 
276
- loadSuccessCallback: function (data) {
285
+ loadSuccessCallback: function (data, status, xhr) {
277
286
  'use strict';
278
287
  data = jQuery.trim(data);
279
288
  //Update original content with current text.
@@ -289,13 +298,11 @@ BestInPlaceEditor.prototype = {
289
298
  this.element.data('bip-original-content', this.element.text());
290
299
  this.element.html(response.display_as);
291
300
  }
292
-
293
- this.element.trigger(jQuery.Event("best_in_place:success"), data);
294
- this.element.trigger(jQuery.Event("ajax:success"), data);
295
- } else {
296
- this.element.trigger(jQuery.Event("best_in_place:success"));
297
- this.element.trigger(jQuery.Event("ajax:success"));
298
301
  }
302
+
303
+ this.element.trigger(jQuery.Event("best_in_place:success"), [data, status, xhr]);
304
+ this.element.trigger(jQuery.Event("ajax:success"), [data, status, xhr]);
305
+
299
306
  // Binding back after being clicked
300
307
  jQuery(this.activator).bind('click', {editor: this}, this.clickHandler);
301
308
  this.element.trigger(jQuery.Event("best_in_place:deactivate"));
@@ -392,7 +399,9 @@ BestInPlaceEditor.forms = {
392
399
  if (this.cancelButton) {
393
400
  this.element.find("input[type='button']").bind('click', {editor: this}, BestInPlaceEditor.forms.input.cancelButtonHandler);
394
401
  }
395
- this.element.find("input[type='text']").bind('blur', {editor: this}, BestInPlaceEditor.forms.input.inputBlurHandler);
402
+ if (!this.okButton) {
403
+ this.element.find("input[type='text']").bind('blur', {editor: this}, BestInPlaceEditor.forms.input.inputBlurHandler);
404
+ }
396
405
  this.element.find("input[type='text']").bind('keyup', {editor: this}, BestInPlaceEditor.forms.input.keyupHandler);
397
406
  this.blurTimer = null;
398
407
  this.userClicked = false;
@@ -459,15 +468,14 @@ BestInPlaceEditor.forms = {
459
468
  select_elt = jQuery(document.createElement('select'))
460
469
  .attr('class', this.inner_class !== null ? this.inner_class : ''),
461
470
  currentCollectionValue = this.collectionValue,
462
- a, key, value, _i, _len, _ref;
463
- for (_i = 0, a = this.values, _len = a.length; _i < _len; _i++) {
464
- _ref = a[_i], key = _ref[0], value = _ref[1];
471
+ key, value,
472
+ a = this.arrayToObject(this.values);
473
+ for (key in a) {
474
+ value = a[key];
465
475
  var option_elt = jQuery(document.createElement('option'))
466
476
  .val(key)
467
477
  .html(value);
468
- if (String(key) === String(currentCollectionValue)) {
469
- option_elt.attr('selected', 'selected');
470
- };
478
+ if (String(key) === String(currentCollectionValue)) option_elt.attr('selected', 'selected');
471
479
  select_elt.append(option_elt);
472
480
  };
473
481
  output.append(select_elt);
@@ -50,7 +50,7 @@ module BestInPlace
50
50
  if yield
51
51
  return true
52
52
  else
53
- sleep(0.1)
53
+ sleep(0.2)
54
54
  next
55
55
  end
56
56
  end
@@ -1,3 +1,3 @@
1
1
  module BestInPlace
2
- VERSION = '3.0.2'
2
+ VERSION = '3.0.3'
3
3
  end
@@ -149,6 +149,8 @@ describe "JS behaviour", :js => true do
149
149
 
150
150
  bip_text @user, :email, "new@email.com"
151
151
 
152
+ expect(find('#email')).to have_content('new@email.com')
153
+
152
154
  visit user_path(@user)
153
155
  expect(find('#email')).to have_content('new@email.com')
154
156
  end
@@ -193,6 +195,8 @@ describe "JS behaviour", :js => true do
193
195
 
194
196
  bip_select @user, :country, "France"
195
197
 
198
+ expect(find('#country')).to have_content('France')
199
+
196
200
  visit user_path(@user)
197
201
 
198
202
  expect(find('#country')).to have_content('France')
@@ -215,6 +219,8 @@ describe "JS behaviour", :js => true do
215
219
 
216
220
  bip_text @user, :birth_date, (today - 1.days)
217
221
 
222
+ expect(find('#birth_date')).to have_content(today - 1.days)
223
+
218
224
  visit user_path(@user)
219
225
 
220
226
  expect(find('#birth_date')).to have_content(today - 1.days)
@@ -234,6 +240,8 @@ describe "JS behaviour", :js => true do
234
240
  JS
235
241
  wait_for_ajax
236
242
 
243
+ expect(find('#birth_date')).to have_content(today.beginning_of_month.strftime('%d-%m-%Y'))
244
+
237
245
  visit user_path(@user)
238
246
 
239
247
  expect(find('#birth_date')).to have_content(today.beginning_of_month)
@@ -265,6 +273,8 @@ describe "JS behaviour", :js => true do
265
273
 
266
274
  bip_bool @user, :receive_email
267
275
 
276
+ expect(find('#receive_email')).to have_content('Yes of course')
277
+
268
278
  visit user_path(@user)
269
279
 
270
280
  expect(find('#receive_email')).to have_content('Yes of course')
@@ -279,6 +289,8 @@ describe "JS behaviour", :js => true do
279
289
 
280
290
  bip_bool @user, :receive_email_image
281
291
 
292
+ expect(find('#receive_email_image')).to have_xpath("//img[contains(@src,'yes.png')]")
293
+
282
294
  visit user_path(@user)
283
295
 
284
296
  expect(find('#receive_email_image')).to have_xpath("//img[contains(@src,'yes.png')]")
@@ -300,6 +312,8 @@ describe "JS behaviour", :js => true do
300
312
  find("##{id} input[type='submit']").click
301
313
  wait_for_ajax
302
314
 
315
+ expect(find('#favorite_color')).to have_content('Blue')
316
+
303
317
  visit user_path(@user)
304
318
 
305
319
  expect(find('#favorite_color')).to have_content('Blue')
@@ -350,7 +364,8 @@ describe "JS behaviour", :js => true do
350
364
  execute_script <<-JS
351
365
  $("##{id} input[name='favorite_color']").blur();
352
366
  JS
353
- wait_for_ajax
367
+ sleep 0.5
368
+ expect(page).to have_css("##{id} input[type='submit']")
354
369
 
355
370
  visit user_path(@user)
356
371
 
@@ -371,6 +386,8 @@ describe "JS behaviour", :js => true do
371
386
  execute_script("$('##{id} input[name=\"favorite_color\"]').blur()")
372
387
  wait_for_ajax
373
388
 
389
+ expect(find('#favorite_color')).to have_content('Blue')
390
+
374
391
  visit user_path(@user)
375
392
 
376
393
  expect(find('#favorite_color')).to have_content('Blue')
@@ -789,6 +806,9 @@ describe "JS behaviour", :js => true do
789
806
  visit double_init_user_path(@user)
790
807
 
791
808
  bip_area @user, :description, "A <a href=\"http://google.es\">link in this text</a> not sanitized."
809
+
810
+ expect(page).to have_link("link in this text", :href => "http://google.es")
811
+
792
812
  visit double_init_user_path(@user)
793
813
 
794
814
  expect(page).to have_link("link in this text", :href => "http://google.es")
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.2
4
+ version: 3.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bernat Farrero
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-20 00:00:00.000000000 Z
11
+ date: 2015-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionpack