effective_form_inputs 0.9.1 → 0.9.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 302d7d81e88d9f434d633d20a3dd00fec344248c
4
- data.tar.gz: f844591e1be8f56d3c6f9a8c2592e3ace75c6e21
3
+ metadata.gz: 8b0698583fd3fbc2109b3e032ce406a4f5e3859a
4
+ data.tar.gz: a0b8c25ac30aeab92a33a33a6edd07fabeda7505
5
5
  SHA512:
6
- metadata.gz: e8be1c61e8fe4bdfab9f5b53cfc2babd4eb9786c437acc3c3841b1f2cb93590e9ea3d84a5afb01d589274809770f85f84077bdadb7e1adff6e36172ed366a909
7
- data.tar.gz: 5241cc03fc907342228b1012f405f7f5e48d1ebff8fdd9591706f404c8e6cf56d535ce7398a4753985ce2a8af5d605e5680160c48e608cf2705e4c0d081299c1
6
+ metadata.gz: 3cffb5fc00558a5918c750b07b4e5b724eb97ce44c76da8118c7e4e7e9b534fe51dc620a9d90e3d228216f2a91828eab69d35944c3c8d9a769ce17e10e7d2e4f
7
+ data.tar.gz: fe69fd6459d23126ee871d54d23f60078de897cfbf713a89e6ac5654aa4a4531479d4a960f5f6cadb78563941a21562d1c09172435e8387110581d42def47852
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Select2 4.0.1
2
+ * Select2 4.0.3
3
3
  * https://select2.github.io
4
4
  *
5
5
  * Released under the MIT license
@@ -606,9 +606,23 @@ S2.define('select2/utils',[
606
606
 
607
607
  Observable.prototype.trigger = function (event) {
608
608
  var slice = Array.prototype.slice;
609
+ var params = slice.call(arguments, 1);
609
610
 
610
611
  this.listeners = this.listeners || {};
611
612
 
613
+ // Params should always come in as an array
614
+ if (params == null) {
615
+ params = [];
616
+ }
617
+
618
+ // If there are no arguments to the event, use a temporary object
619
+ if (params.length === 0) {
620
+ params.push({});
621
+ }
622
+
623
+ // Set the `_type` of the first object to the event
624
+ params[0]._type = event;
625
+
612
626
  if (event in this.listeners) {
613
627
  this.invoke(this.listeners[event], slice.call(arguments, 1));
614
628
  }
@@ -842,6 +856,25 @@ S2.define('select2/results',[
842
856
  return sorter(data);
843
857
  };
844
858
 
859
+ Results.prototype.highlightFirstItem = function () {
860
+ var $options = this.$results
861
+ .find('.select2-results__option[aria-selected]');
862
+
863
+ var $selected = $options.filter('[aria-selected=true]');
864
+
865
+ // Check if there are any selected options
866
+ if ($selected.length > 0) {
867
+ // If there are selected options, highlight the first
868
+ $selected.first().trigger('mouseenter');
869
+ } else {
870
+ // If there are no selected options, highlight the first option
871
+ // in the dropdown
872
+ $options.first().trigger('mouseenter');
873
+ }
874
+
875
+ this.ensureHighlightVisible();
876
+ };
877
+
845
878
  Results.prototype.setClasses = function () {
846
879
  var self = this;
847
880
 
@@ -869,17 +902,6 @@ S2.define('select2/results',[
869
902
  }
870
903
  });
871
904
 
872
- var $selected = $options.filter('[aria-selected=true]');
873
-
874
- // Check if there are any selected options
875
- if ($selected.length > 0) {
876
- // If there are selected options, highlight the first
877
- $selected.first().trigger('mouseenter');
878
- } else {
879
- // If there are no selected options, highlight the first option
880
- // in the dropdown
881
- $options.first().trigger('mouseenter');
882
- }
883
905
  });
884
906
  };
885
907
 
@@ -990,6 +1012,7 @@ S2.define('select2/results',[
990
1012
 
991
1013
  if (container.isOpen()) {
992
1014
  self.setClasses();
1015
+ self.highlightFirstItem();
993
1016
  }
994
1017
  });
995
1018
 
@@ -1012,6 +1035,7 @@ S2.define('select2/results',[
1012
1035
  }
1013
1036
 
1014
1037
  self.setClasses();
1038
+ self.highlightFirstItem();
1015
1039
  });
1016
1040
 
1017
1041
  container.on('unselect', function () {
@@ -1020,6 +1044,7 @@ S2.define('select2/results',[
1020
1044
  }
1021
1045
 
1022
1046
  self.setClasses();
1047
+ self.highlightFirstItem();
1023
1048
  });
1024
1049
 
1025
1050
  container.on('open', function () {
@@ -1142,11 +1167,7 @@ S2.define('select2/results',[
1142
1167
  this.$results.on('mousewheel', function (e) {
1143
1168
  var top = self.$results.scrollTop();
1144
1169
 
1145
- var bottom = (
1146
- self.$results.get(0).scrollHeight -
1147
- self.$results.scrollTop() +
1148
- e.deltaY
1149
- );
1170
+ var bottom = self.$results.get(0).scrollHeight - top + e.deltaY;
1150
1171
 
1151
1172
  var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0;
1152
1173
  var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height();
@@ -1501,6 +1522,12 @@ S2.define('select2/selection/single',[
1501
1522
  // User exits the container
1502
1523
  });
1503
1524
 
1525
+ container.on('focus', function (evt) {
1526
+ if (!container.isOpen()) {
1527
+ self.$selection.focus();
1528
+ }
1529
+ });
1530
+
1504
1531
  container.on('selection:update', function (params) {
1505
1532
  self.update(params.data);
1506
1533
  });
@@ -3332,7 +3359,7 @@ S2.define('select2/data/array',[
3332
3359
  var $existingOption = $existing.filter(onlyItem(item));
3333
3360
 
3334
3361
  var existingData = this.item($existingOption);
3335
- var newData = $.extend(true, {}, existingData, item);
3362
+ var newData = $.extend(true, {}, item, existingData);
3336
3363
 
3337
3364
  var $newOption = this.option(newData);
3338
3365
 
@@ -3440,13 +3467,21 @@ S2.define('select2/data/ajax',[
3440
3467
 
3441
3468
  callback(results);
3442
3469
  }, function () {
3443
- // TODO: Handle AJAX errors
3470
+ // Attempt to detect if a request was aborted
3471
+ // Only works if the transport exposes a status property
3472
+ if ($request.status && $request.status === '0') {
3473
+ return;
3474
+ }
3475
+
3476
+ self.trigger('results:message', {
3477
+ message: 'errorLoading'
3478
+ });
3444
3479
  });
3445
3480
 
3446
3481
  self._request = $request;
3447
3482
  }
3448
3483
 
3449
- if (this.ajaxOptions.delay && params.term !== '') {
3484
+ if (this.ajaxOptions.delay && params.term != null) {
3450
3485
  if (this._queryTimeout) {
3451
3486
  window.clearTimeout(this._queryTimeout);
3452
3487
  }
@@ -3472,6 +3507,12 @@ S2.define('select2/data/tags',[
3472
3507
  this.createTag = createTag;
3473
3508
  }
3474
3509
 
3510
+ var insertTag = options.get('insertTag');
3511
+
3512
+ if (insertTag !== undefined) {
3513
+ this.insertTag = insertTag;
3514
+ }
3515
+
3475
3516
  decorated.call(this, $element, options);
3476
3517
 
3477
3518
  if ($.isArray(tags)) {
@@ -3603,6 +3644,29 @@ S2.define('select2/data/tokenizer',[
3603
3644
  Tokenizer.prototype.query = function (decorated, params, callback) {
3604
3645
  var self = this;
3605
3646
 
3647
+ function createAndSelect (data) {
3648
+ // Normalize the data object so we can use it for checks
3649
+ var item = self._normalizeItem(data);
3650
+
3651
+ // Check if the data object already exists as a tag
3652
+ // Select it if it doesn't
3653
+ var $existingOptions = self.$element.find('option').filter(function () {
3654
+ return $(this).val() === item.id;
3655
+ });
3656
+
3657
+ // If an existing option wasn't found for it, create the option
3658
+ if (!$existingOptions.length) {
3659
+ var $option = self.option(item);
3660
+ $option.attr('data-select2-tag', true);
3661
+
3662
+ self._removeOldTags();
3663
+ self.addOptions([$option]);
3664
+ }
3665
+
3666
+ // Select the item, now that we know there is an option for it
3667
+ select(item);
3668
+ }
3669
+
3606
3670
  function select (data) {
3607
3671
  self.trigger('select', {
3608
3672
  data: data
@@ -3611,7 +3675,7 @@ S2.define('select2/data/tokenizer',[
3611
3675
 
3612
3676
  params.term = params.term || '';
3613
3677
 
3614
- var tokenData = this.tokenizer(params, this.options, select);
3678
+ var tokenData = this.tokenizer(params, this.options, createAndSelect);
3615
3679
 
3616
3680
  if (tokenData.term !== params.term) {
3617
3681
  // Replace the search term if we have the search box
@@ -3876,6 +3940,12 @@ S2.define('select2/dropdown/search',[
3876
3940
  self.$search.val('');
3877
3941
  });
3878
3942
 
3943
+ container.on('focus', function () {
3944
+ if (container.isOpen()) {
3945
+ self.$search.focus();
3946
+ }
3947
+ });
3948
+
3879
3949
  container.on('results:all', function (params) {
3880
3950
  if (params.query.term == null || params.query.term === '') {
3881
3951
  var showSearch = self.showSearch(params);
@@ -4171,7 +4241,6 @@ S2.define('select2/dropdown/attachBody',[
4171
4241
 
4172
4242
  var newDirection = null;
4173
4243
 
4174
- var position = this.$container.position();
4175
4244
  var offset = this.$container.offset();
4176
4245
 
4177
4246
  offset.bottom = offset.top + this.$container.outerHeight(false);
@@ -4200,14 +4269,20 @@ S2.define('select2/dropdown/attachBody',[
4200
4269
  top: container.bottom
4201
4270
  };
4202
4271
 
4203
- // Fix positioning with static parents
4204
- if (this.$dropdownParent[0].style.position !== 'static') {
4205
- var parentOffset = this.$dropdownParent.offset();
4272
+ // Determine what the parent element is to use for calciulating the offset
4273
+ var $offsetParent = this.$dropdownParent;
4206
4274
 
4207
- css.top -= parentOffset.top;
4208
- css.left -= parentOffset.left;
4275
+ // For statically positoned elements, we need to get the element
4276
+ // that is determining the offset
4277
+ if ($offsetParent.css('position') === 'static') {
4278
+ $offsetParent = $offsetParent.offsetParent();
4209
4279
  }
4210
4280
 
4281
+ var parentOffset = $offsetParent.offset();
4282
+
4283
+ css.top -= parentOffset.top;
4284
+ css.left -= parentOffset.left;
4285
+
4211
4286
  if (!isCurrentlyAbove && !isCurrentlyBelow) {
4212
4287
  newDirection = 'below';
4213
4288
  }
@@ -4220,7 +4295,7 @@ S2.define('select2/dropdown/attachBody',[
4220
4295
 
4221
4296
  if (newDirection == 'above' ||
4222
4297
  (isCurrentlyAbove && newDirection !== 'below')) {
4223
- css.top = container.top - dropdown.height;
4298
+ css.top = container.top - parentOffset.top - dropdown.height;
4224
4299
  }
4225
4300
 
4226
4301
  if (newDirection != null) {
@@ -4242,6 +4317,7 @@ S2.define('select2/dropdown/attachBody',[
4242
4317
 
4243
4318
  if (this.options.get('dropdownAutoWidth')) {
4244
4319
  css.minWidth = css.width;
4320
+ css.position = 'relative';
4245
4321
  css.width = 'auto';
4246
4322
  }
4247
4323
 
@@ -4308,12 +4384,22 @@ S2.define('select2/dropdown/selectOnClose',[
4308
4384
 
4309
4385
  decorated.call(this, container, $container);
4310
4386
 
4311
- container.on('close', function () {
4312
- self._handleSelectOnClose();
4387
+ container.on('close', function (params) {
4388
+ self._handleSelectOnClose(params);
4313
4389
  });
4314
4390
  };
4315
4391
 
4316
- SelectOnClose.prototype._handleSelectOnClose = function () {
4392
+ SelectOnClose.prototype._handleSelectOnClose = function (_, params) {
4393
+ if (params && params.originalSelect2Event != null) {
4394
+ var event = params.originalSelect2Event;
4395
+
4396
+ // Don't select an item if the close event was triggered from a select or
4397
+ // unselect event
4398
+ if (event._type === 'select' || event._type === 'unselect') {
4399
+ return;
4400
+ }
4401
+ }
4402
+
4317
4403
  var $highlightedResults = this.getHighlightedResults();
4318
4404
 
4319
4405
  // Only select highlighted results
@@ -4366,7 +4452,10 @@ S2.define('select2/dropdown/closeOnSelect',[
4366
4452
  return;
4367
4453
  }
4368
4454
 
4369
- this.trigger('close', {});
4455
+ this.trigger('close', {
4456
+ originalEvent: originalEvent,
4457
+ originalSelect2Event: evt
4458
+ });
4370
4459
  };
4371
4460
 
4372
4461
  return CloseOnSelect;
@@ -4474,7 +4563,7 @@ S2.define('select2/defaults',[
4474
4563
  }
4475
4564
 
4476
4565
  Defaults.prototype.apply = function (options) {
4477
- options = $.extend({}, this.defaults, options);
4566
+ options = $.extend(true, {}, this.defaults, options);
4478
4567
 
4479
4568
  if (options.dataAdapter == null) {
4480
4569
  if (options.ajax != null) {
@@ -5038,6 +5127,7 @@ S2.define('select2/core',[
5038
5127
  id = Utils.generateChars(4);
5039
5128
  }
5040
5129
 
5130
+ id = id.replace(/(:|\.|\[|\]|,)/g, '');
5041
5131
  id = 'select2-' + id;
5042
5132
 
5043
5133
  return id;
@@ -5119,10 +5209,15 @@ S2.define('select2/core',[
5119
5209
  });
5120
5210
  });
5121
5211
 
5122
- this._sync = Utils.bind(this._syncAttributes, this);
5212
+ this.$element.on('focus.select2', function (evt) {
5213
+ self.trigger('focus', evt);
5214
+ });
5215
+
5216
+ this._syncA = Utils.bind(this._syncAttributes, this);
5217
+ this._syncS = Utils.bind(this._syncSubtree, this);
5123
5218
 
5124
5219
  if (this.$element[0].attachEvent) {
5125
- this.$element[0].attachEvent('onpropertychange', this._sync);
5220
+ this.$element[0].attachEvent('onpropertychange', this._syncA);
5126
5221
  }
5127
5222
 
5128
5223
  var observer = window.MutationObserver ||
@@ -5132,14 +5227,30 @@ S2.define('select2/core',[
5132
5227
 
5133
5228
  if (observer != null) {
5134
5229
  this._observer = new observer(function (mutations) {
5135
- $.each(mutations, self._sync);
5230
+ $.each(mutations, self._syncA);
5231
+ $.each(mutations, self._syncS);
5136
5232
  });
5137
5233
  this._observer.observe(this.$element[0], {
5138
5234
  attributes: true,
5235
+ childList: true,
5139
5236
  subtree: false
5140
5237
  });
5141
5238
  } else if (this.$element[0].addEventListener) {
5142
- this.$element[0].addEventListener('DOMAttrModified', self._sync, false);
5239
+ this.$element[0].addEventListener(
5240
+ 'DOMAttrModified',
5241
+ self._syncA,
5242
+ false
5243
+ );
5244
+ this.$element[0].addEventListener(
5245
+ 'DOMNodeInserted',
5246
+ self._syncS,
5247
+ false
5248
+ );
5249
+ this.$element[0].addEventListener(
5250
+ 'DOMNodeRemoved',
5251
+ self._syncS,
5252
+ false
5253
+ );
5143
5254
  }
5144
5255
  };
5145
5256
 
@@ -5284,6 +5395,46 @@ S2.define('select2/core',[
5284
5395
  }
5285
5396
  };
5286
5397
 
5398
+ Select2.prototype._syncSubtree = function (evt, mutations) {
5399
+ var changed = false;
5400
+ var self = this;
5401
+
5402
+ // Ignore any mutation events raised for elements that aren't options or
5403
+ // optgroups. This handles the case when the select element is destroyed
5404
+ if (
5405
+ evt && evt.target && (
5406
+ evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP'
5407
+ )
5408
+ ) {
5409
+ return;
5410
+ }
5411
+
5412
+ if (!mutations) {
5413
+ // If mutation events aren't supported, then we can only assume that the
5414
+ // change affected the selections
5415
+ changed = true;
5416
+ } else if (mutations.addedNodes && mutations.addedNodes.length > 0) {
5417
+ for (var n = 0; n < mutations.addedNodes.length; n++) {
5418
+ var node = mutations.addedNodes[n];
5419
+
5420
+ if (node.selected) {
5421
+ changed = true;
5422
+ }
5423
+ }
5424
+ } else if (mutations.removedNodes && mutations.removedNodes.length > 0) {
5425
+ changed = true;
5426
+ }
5427
+
5428
+ // Only re-pull the data if we think there is a change
5429
+ if (changed) {
5430
+ this.dataAdapter.current(function (currentData) {
5431
+ self.trigger('selection:update', {
5432
+ data: currentData
5433
+ });
5434
+ });
5435
+ }
5436
+ };
5437
+
5287
5438
  /**
5288
5439
  * Override the trigger method to automatically trigger pre-events when
5289
5440
  * there are events that can be prevented.
@@ -5430,7 +5581,7 @@ S2.define('select2/core',[
5430
5581
  this.$container.remove();
5431
5582
 
5432
5583
  if (this.$element[0].detachEvent) {
5433
- this.$element[0].detachEvent('onpropertychange', this._sync);
5584
+ this.$element[0].detachEvent('onpropertychange', this._syncA);
5434
5585
  }
5435
5586
 
5436
5587
  if (this._observer != null) {
@@ -5438,10 +5589,15 @@ S2.define('select2/core',[
5438
5589
  this._observer = null;
5439
5590
  } else if (this.$element[0].removeEventListener) {
5440
5591
  this.$element[0]
5441
- .removeEventListener('DOMAttrModified', this._sync, false);
5592
+ .removeEventListener('DOMAttrModified', this._syncA, false);
5593
+ this.$element[0]
5594
+ .removeEventListener('DOMNodeInserted', this._syncS, false);
5595
+ this.$element[0]
5596
+ .removeEventListener('DOMNodeRemoved', this._syncS, false);
5442
5597
  }
5443
5598
 
5444
- this._sync = null;
5599
+ this._syncA = null;
5600
+ this._syncS = null;
5445
5601
 
5446
5602
  this.$element.off('.select2');
5447
5603
  this.$element.attr('tabindex', this.$element.data('old-tabindex'));
@@ -5514,6 +5670,7 @@ S2.define('jquery.select2',[
5514
5670
  return this;
5515
5671
  } else if (typeof options === 'string') {
5516
5672
  var ret;
5673
+ var args = Array.prototype.slice.call(arguments, 1);
5517
5674
 
5518
5675
  this.each(function () {
5519
5676
  var instance = $(this).data('select2');
@@ -5525,8 +5682,6 @@ S2.define('jquery.select2',[
5525
5682
  );
5526
5683
  }
5527
5684
 
5528
- var args = Array.prototype.slice.call(arguments, 1);
5529
-
5530
5685
  ret = instance[options].apply(instance, args);
5531
5686
  });
5532
5687
 
@@ -184,6 +184,8 @@
184
184
  margin: 0;
185
185
  padding: 0 5px;
186
186
  width: 100%; }
187
+ .select2-container--default .select2-selection--multiple .select2-selection__rendered li {
188
+ list-style: none; }
187
189
  .select2-container--default .select2-selection--multiple .select2-selection__placeholder {
188
190
  color: #999;
189
191
  margin-top: 5px;
@@ -1,3 +1,3 @@
1
1
  module EffectiveFormInputs
2
- VERSION = '0.9.1'.freeze
2
+ VERSION = '0.9.2'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_form_inputs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code and Effect
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-12 00:00:00.000000000 Z
11
+ date: 2016-09-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails