effective_bootstrap 0.5.18 → 0.5.19
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 +4 -4
- data/README.md +50 -1
- data/app/assets/javascripts/effective_bootstrap/form.js.coffee +0 -1
- data/app/assets/javascripts/effective_select/initialize.js.coffee +0 -8
- data/app/assets/javascripts/effective_select/overrides.js.coffee +16 -4
- data/app/assets/javascripts/effective_select/select2.js +218 -81
- data/app/assets/stylesheets/effective_select/select2.css +5 -5
- data/app/models/effective/form_inputs/collection_input.rb +13 -5
- data/app/models/effective/form_inputs/select.rb +9 -1
- data/lib/effective_bootstrap/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4f7f93ac632e2060593e064b4e0b640a2c064787bb6a2f0569d38de2057a5a75
|
4
|
+
data.tar.gz: c4201bcf5c82f3ff3f7dcf7473c736a9cac8b855bd227400306eac1a9d77de85
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d5d12260fe772a88223c8f13a31a69611c209a5961ff93c273363890df964c5498ecc41ae989e1b3eb418a02444d3c87c380009ca8892701fe510caafbd3941c
|
7
|
+
data.tar.gz: 15570606ec1fda4c61a3091f5caffe511986ec05a278de4ee500d2debe7152bce3a5bd82118a5994560dfc5da357d03198aa491f2b56234e62b4530a7233aad1
|
data/README.md
CHANGED
@@ -510,7 +510,56 @@ $(document).on 'change', '.something', (event) ->
|
|
510
510
|
|
511
511
|
### AJAX Support
|
512
512
|
|
513
|
-
|
513
|
+
Provide the `ajax_url: ` method to use AJAX remote data source.
|
514
|
+
|
515
|
+
In your form:
|
516
|
+
|
517
|
+
```ruby
|
518
|
+
= f.input :user_id, User.all, ajax_url: users_select2_ajax_index_path
|
519
|
+
```
|
520
|
+
|
521
|
+
In your `routes.rb`:
|
522
|
+
|
523
|
+
```ruby
|
524
|
+
resources :select2_ajax, only: [] do
|
525
|
+
get :users, on: :collection
|
526
|
+
end
|
527
|
+
```
|
528
|
+
|
529
|
+
In your controller:
|
530
|
+
|
531
|
+
```ruby
|
532
|
+
class Select2AjaxController < ApplicationController
|
533
|
+
def users
|
534
|
+
# Collection
|
535
|
+
collection = User.all
|
536
|
+
|
537
|
+
# Search
|
538
|
+
if (term = params[:term]).present?
|
539
|
+
collection = collection.where('name ILIKE ?', "%#{term}%").or(collection.where('id::TEXT LIKE ?', "%#{term}%"))
|
540
|
+
end
|
541
|
+
|
542
|
+
# Paginate
|
543
|
+
per_page = 20
|
544
|
+
page = (params[:page] || 1).to_i
|
545
|
+
last = (collection.reselect(:id).count.to_f / per_page).ceil
|
546
|
+
more = page < last
|
547
|
+
|
548
|
+
offset = [(page - 1), 0].max * per_page
|
549
|
+
collection = collection.limit(per_page).offset(offset)
|
550
|
+
|
551
|
+
# Results
|
552
|
+
results = collection.map { |user| { id: user.to_param, text: user.to_s } }
|
553
|
+
|
554
|
+
respond_to do |format|
|
555
|
+
format.js do
|
556
|
+
render json: { results: results, pagination: { more: more } }
|
557
|
+
end
|
558
|
+
end
|
559
|
+
end
|
560
|
+
|
561
|
+
end
|
562
|
+
```
|
514
563
|
|
515
564
|
## Custom select_or_text_field
|
516
565
|
|
@@ -4,7 +4,6 @@ this.EffectiveForm ||= new class
|
|
4
4
|
remote_form_commit: '' # String containing the last params[:commit]
|
5
5
|
remote_form_payload: '' # String containing html from server side render of this form
|
6
6
|
remote_form_flash: '' # Array of Arrays
|
7
|
-
remote_form_refresh_datatables: '' # Array of Strings. effective_datatables inline_crud.js uses this
|
8
7
|
|
9
8
|
validate: (form) ->
|
10
9
|
valid = form.checkValidity()
|
@@ -50,12 +50,4 @@ $(document).on 'change', "select.effective_select.polymorphic", (event) ->
|
|
50
50
|
$select.siblings("input[type='hidden'][name$='_type]']").val(value.split('_')[0] || '')
|
51
51
|
$select.siblings("input[type='hidden'][name$='_id]']").val(value.split('_')[1] || '')
|
52
52
|
|
53
|
-
# Keep the order of selected tags
|
54
|
-
# Fixes https://github.com/select2/select2/issues/3106
|
55
|
-
$(document).on 'select2:select', 'select', (event) ->
|
56
|
-
$el = $(event.params.data.element)
|
57
|
-
|
58
|
-
if $el.closest('select').hasClass('tags-input')
|
59
|
-
$(this).append($el.detach()).trigger('change')
|
60
|
-
true
|
61
53
|
|
@@ -1,6 +1,17 @@
|
|
1
|
+
# Keep the order of selected tags
|
2
|
+
# Fixes https://github.com/select2/select2/issues/3106
|
3
|
+
$(document).on 'select2:select', 'select', (event) ->
|
4
|
+
$el = $(event.params.data.element)
|
5
|
+
|
6
|
+
if $el.closest('select').hasClass('tags-input')
|
7
|
+
$(this).append($el.detach()).trigger('change')
|
8
|
+
|
9
|
+
true
|
10
|
+
|
1
11
|
# Disable dropdown opening when clicking the clear button
|
2
12
|
# http://stackoverflow.com/questions/29618382/disable-dropdown-opening-on-select2-clear
|
3
13
|
$(document).on 'select2:unselecting', (event) -> $(event.target).data('state', 'unselected')
|
14
|
+
|
4
15
|
$(document).on 'select2:open', (event) ->
|
5
16
|
$select = $(event.target)
|
6
17
|
|
@@ -10,9 +21,11 @@ $(document).on 'select2:open', (event) ->
|
|
10
21
|
|
11
22
|
# For tabbing through
|
12
23
|
# https://stackoverflow.com/questions/20989458/select2-open-dropdown-on-focus
|
13
|
-
$(document).on '
|
14
|
-
$
|
15
|
-
|
24
|
+
$(document).on 'focus', '.select2-selection.select2-selection--single', (event) ->
|
25
|
+
$(event.currentTarget).closest('.select2-container').siblings('select:enabled').select2('open')
|
26
|
+
|
27
|
+
$(document).on 'select2:closing', (event) ->
|
28
|
+
$(event.target).data('select2').$selection.one('focus focusin', (event) -> event.stopPropagation())
|
16
29
|
|
17
30
|
# effective_select custom reinitialization functionality
|
18
31
|
# This is a custom event intended to be manually triggered when the underlying options change
|
@@ -23,7 +36,6 @@ $(document).on 'select2:focus', (event) ->
|
|
23
36
|
# $(document).on 'change', "select[name$='[something_id]']", (event) ->
|
24
37
|
# ...add/remove/disable this select field's options...
|
25
38
|
# $(event.target).select2().trigger('select2:reinitialize')
|
26
|
-
|
27
39
|
$(document).on 'select2:reinitialize', (event) ->
|
28
40
|
$select = $(event.target)
|
29
41
|
|
@@ -1,11 +1,11 @@
|
|
1
1
|
/*!
|
2
|
-
* Select2 4.0.
|
2
|
+
* Select2 4.0.7
|
3
3
|
* https://select2.github.io
|
4
4
|
*
|
5
5
|
* Released under the MIT license
|
6
6
|
* https://github.com/select2/select2/blob/master/LICENSE.md
|
7
7
|
*/
|
8
|
-
(function (factory) {
|
8
|
+
;(function (factory) {
|
9
9
|
if (typeof define === 'function' && define.amd) {
|
10
10
|
// AMD. Register as an anonymous module.
|
11
11
|
define(['jquery'], factory);
|
@@ -574,10 +574,10 @@ S2.define('select2/utils',[
|
|
574
574
|
DecoratedClass.prototype = new ctr();
|
575
575
|
|
576
576
|
for (var m = 0; m < superMethods.length; m++) {
|
577
|
-
|
577
|
+
var superMethod = superMethods[m];
|
578
578
|
|
579
|
-
|
580
|
-
|
579
|
+
DecoratedClass.prototype[superMethod] =
|
580
|
+
SuperClass.prototype[superMethod];
|
581
581
|
}
|
582
582
|
|
583
583
|
var calledMethod = function (methodName) {
|
@@ -772,6 +772,68 @@ S2.define('select2/utils',[
|
|
772
772
|
$element.append($nodes);
|
773
773
|
};
|
774
774
|
|
775
|
+
// Cache objects in Utils.__cache instead of $.data (see #4346)
|
776
|
+
Utils.__cache = {};
|
777
|
+
|
778
|
+
var id = 0;
|
779
|
+
Utils.GetUniqueElementId = function (element) {
|
780
|
+
// Get a unique element Id. If element has no id,
|
781
|
+
// creates a new unique number, stores it in the id
|
782
|
+
// attribute and returns the new id.
|
783
|
+
// If an id already exists, it simply returns it.
|
784
|
+
|
785
|
+
var select2Id = element.getAttribute('data-select2-id');
|
786
|
+
if (select2Id == null) {
|
787
|
+
// If element has id, use it.
|
788
|
+
if (element.id) {
|
789
|
+
select2Id = element.id;
|
790
|
+
element.setAttribute('data-select2-id', select2Id);
|
791
|
+
} else {
|
792
|
+
element.setAttribute('data-select2-id', ++id);
|
793
|
+
select2Id = id.toString();
|
794
|
+
}
|
795
|
+
}
|
796
|
+
return select2Id;
|
797
|
+
};
|
798
|
+
|
799
|
+
Utils.StoreData = function (element, name, value) {
|
800
|
+
// Stores an item in the cache for a specified element.
|
801
|
+
// name is the cache key.
|
802
|
+
var id = Utils.GetUniqueElementId(element);
|
803
|
+
if (!Utils.__cache[id]) {
|
804
|
+
Utils.__cache[id] = {};
|
805
|
+
}
|
806
|
+
|
807
|
+
Utils.__cache[id][name] = value;
|
808
|
+
};
|
809
|
+
|
810
|
+
Utils.GetData = function (element, name) {
|
811
|
+
// Retrieves a value from the cache by its key (name)
|
812
|
+
// name is optional. If no name specified, return
|
813
|
+
// all cache items for the specified element.
|
814
|
+
// and for a specified element.
|
815
|
+
var id = Utils.GetUniqueElementId(element);
|
816
|
+
if (name) {
|
817
|
+
if (Utils.__cache[id]) {
|
818
|
+
if (Utils.__cache[id][name] != null) {
|
819
|
+
return Utils.__cache[id][name];
|
820
|
+
}
|
821
|
+
return $(element).data(name); // Fallback to HTML5 data attribs.
|
822
|
+
}
|
823
|
+
return $(element).data(name); // Fallback to HTML5 data attribs.
|
824
|
+
} else {
|
825
|
+
return Utils.__cache[id];
|
826
|
+
}
|
827
|
+
};
|
828
|
+
|
829
|
+
Utils.RemoveData = function (element) {
|
830
|
+
// Removes all cached items for a specified element.
|
831
|
+
var id = Utils.GetUniqueElementId(element);
|
832
|
+
if (Utils.__cache[id] != null) {
|
833
|
+
delete Utils.__cache[id];
|
834
|
+
}
|
835
|
+
};
|
836
|
+
|
775
837
|
return Utils;
|
776
838
|
});
|
777
839
|
|
@@ -907,7 +969,7 @@ S2.define('select2/results',[
|
|
907
969
|
$options.each(function () {
|
908
970
|
var $option = $(this);
|
909
971
|
|
910
|
-
var item =
|
972
|
+
var item = Utils.GetData(this, 'data');
|
911
973
|
|
912
974
|
// id needs to be converted to a string when comparing
|
913
975
|
var id = '' + item.id;
|
@@ -1012,7 +1074,7 @@ S2.define('select2/results',[
|
|
1012
1074
|
this.template(data, option);
|
1013
1075
|
}
|
1014
1076
|
|
1015
|
-
|
1077
|
+
Utils.StoreData(option, 'data', data);
|
1016
1078
|
|
1017
1079
|
return option;
|
1018
1080
|
};
|
@@ -1053,7 +1115,10 @@ S2.define('select2/results',[
|
|
1053
1115
|
}
|
1054
1116
|
|
1055
1117
|
self.setClasses();
|
1056
|
-
|
1118
|
+
|
1119
|
+
if (self.options.get('scrollAfterSelect')) {
|
1120
|
+
self.highlightFirstItem();
|
1121
|
+
}
|
1057
1122
|
});
|
1058
1123
|
|
1059
1124
|
container.on('unselect', function () {
|
@@ -1062,7 +1127,10 @@ S2.define('select2/results',[
|
|
1062
1127
|
}
|
1063
1128
|
|
1064
1129
|
self.setClasses();
|
1065
|
-
|
1130
|
+
|
1131
|
+
if (self.options.get('scrollAfterSelect')) {
|
1132
|
+
self.highlightFirstItem();
|
1133
|
+
}
|
1066
1134
|
});
|
1067
1135
|
|
1068
1136
|
container.on('open', function () {
|
@@ -1098,7 +1166,7 @@ S2.define('select2/results',[
|
|
1098
1166
|
return;
|
1099
1167
|
}
|
1100
1168
|
|
1101
|
-
var data = $highlighted
|
1169
|
+
var data = Utils.GetData($highlighted[0], 'data');
|
1102
1170
|
|
1103
1171
|
if ($highlighted.attr('aria-selected') == 'true') {
|
1104
1172
|
self.trigger('close', {});
|
@@ -1116,8 +1184,9 @@ S2.define('select2/results',[
|
|
1116
1184
|
|
1117
1185
|
var currentIndex = $options.index($highlighted);
|
1118
1186
|
|
1119
|
-
// If we are already at
|
1120
|
-
|
1187
|
+
// If we are already at the top, don't move further
|
1188
|
+
// If no options, currentIndex will be -1
|
1189
|
+
if (currentIndex <= 0) {
|
1121
1190
|
return;
|
1122
1191
|
}
|
1123
1192
|
|
@@ -1210,7 +1279,7 @@ S2.define('select2/results',[
|
|
1210
1279
|
function (evt) {
|
1211
1280
|
var $this = $(this);
|
1212
1281
|
|
1213
|
-
var data =
|
1282
|
+
var data = Utils.GetData(this, 'data');
|
1214
1283
|
|
1215
1284
|
if ($this.attr('aria-selected') === 'true') {
|
1216
1285
|
if (self.options.get('multiple')) {
|
@@ -1233,7 +1302,7 @@ S2.define('select2/results',[
|
|
1233
1302
|
|
1234
1303
|
this.$results.on('mouseenter', '.select2-results__option[aria-selected]',
|
1235
1304
|
function (evt) {
|
1236
|
-
var data =
|
1305
|
+
var data = Utils.GetData(this, 'data');
|
1237
1306
|
|
1238
1307
|
self.getHighlightedResults()
|
1239
1308
|
.removeClass('select2-results__option--highlighted');
|
@@ -1348,8 +1417,8 @@ S2.define('select2/selection/base',[
|
|
1348
1417
|
|
1349
1418
|
this._tabindex = 0;
|
1350
1419
|
|
1351
|
-
if (this.$element
|
1352
|
-
this._tabindex = this.$element
|
1420
|
+
if (Utils.GetData(this.$element[0], 'old-tabindex') != null) {
|
1421
|
+
this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex');
|
1353
1422
|
} else if (this.$element.attr('tabindex') != null) {
|
1354
1423
|
this._tabindex = this.$element.attr('tabindex');
|
1355
1424
|
}
|
@@ -1408,8 +1477,10 @@ S2.define('select2/selection/base',[
|
|
1408
1477
|
self.$selection.removeAttr('aria-activedescendant');
|
1409
1478
|
self.$selection.removeAttr('aria-owns');
|
1410
1479
|
|
1411
|
-
|
1412
|
-
|
1480
|
+
window.setTimeout(function () {
|
1481
|
+
self.$selection.focus();
|
1482
|
+
}, 0);
|
1483
|
+
|
1413
1484
|
self._detachCloseHandler(container);
|
1414
1485
|
});
|
1415
1486
|
|
@@ -1457,7 +1528,7 @@ S2.define('select2/selection/base',[
|
|
1457
1528
|
return;
|
1458
1529
|
}
|
1459
1530
|
|
1460
|
-
var $element =
|
1531
|
+
var $element = Utils.GetData(this, 'element');
|
1461
1532
|
|
1462
1533
|
$element.select2('close');
|
1463
1534
|
});
|
@@ -1518,7 +1589,10 @@ S2.define('select2/selection/single',[
|
|
1518
1589
|
|
1519
1590
|
var id = container.id + '-container';
|
1520
1591
|
|
1521
|
-
this.$selection.find('.select2-selection__rendered')
|
1592
|
+
this.$selection.find('.select2-selection__rendered')
|
1593
|
+
.attr('id', id)
|
1594
|
+
.attr('role', 'textbox')
|
1595
|
+
.attr('aria-readonly', 'true');
|
1522
1596
|
this.$selection.attr('aria-labelledby', id);
|
1523
1597
|
|
1524
1598
|
this.$selection.on('mousedown', function (evt) {
|
@@ -1545,14 +1619,12 @@ S2.define('select2/selection/single',[
|
|
1545
1619
|
self.$selection.focus();
|
1546
1620
|
}
|
1547
1621
|
});
|
1548
|
-
|
1549
|
-
container.on('selection:update', function (params) {
|
1550
|
-
self.update(params.data);
|
1551
|
-
});
|
1552
1622
|
};
|
1553
1623
|
|
1554
1624
|
SingleSelection.prototype.clear = function () {
|
1555
|
-
this.$selection.find('.select2-selection__rendered')
|
1625
|
+
var $rendered = this.$selection.find('.select2-selection__rendered');
|
1626
|
+
$rendered.empty();
|
1627
|
+
$rendered.removeAttr('title'); // clear tooltip on empty
|
1556
1628
|
};
|
1557
1629
|
|
1558
1630
|
SingleSelection.prototype.display = function (data, container) {
|
@@ -1578,7 +1650,7 @@ S2.define('select2/selection/single',[
|
|
1578
1650
|
var formatted = this.display(selection, $rendered);
|
1579
1651
|
|
1580
1652
|
$rendered.empty().append(formatted);
|
1581
|
-
$rendered.
|
1653
|
+
$rendered.attr('title', selection.title || selection.text);
|
1582
1654
|
};
|
1583
1655
|
|
1584
1656
|
return SingleSelection;
|
@@ -1630,7 +1702,7 @@ S2.define('select2/selection/multiple',[
|
|
1630
1702
|
var $remove = $(this);
|
1631
1703
|
var $selection = $remove.parent();
|
1632
1704
|
|
1633
|
-
var data = $selection
|
1705
|
+
var data = Utils.GetData($selection[0], 'data');
|
1634
1706
|
|
1635
1707
|
self.trigger('unselect', {
|
1636
1708
|
originalEvent: evt,
|
@@ -1641,7 +1713,9 @@ S2.define('select2/selection/multiple',[
|
|
1641
1713
|
};
|
1642
1714
|
|
1643
1715
|
MultipleSelection.prototype.clear = function () {
|
1644
|
-
this.$selection.find('.select2-selection__rendered')
|
1716
|
+
var $rendered = this.$selection.find('.select2-selection__rendered');
|
1717
|
+
$rendered.empty();
|
1718
|
+
$rendered.removeAttr('title');
|
1645
1719
|
};
|
1646
1720
|
|
1647
1721
|
MultipleSelection.prototype.display = function (data, container) {
|
@@ -1679,9 +1753,9 @@ S2.define('select2/selection/multiple',[
|
|
1679
1753
|
var formatted = this.display(selection, $selection);
|
1680
1754
|
|
1681
1755
|
$selection.append(formatted);
|
1682
|
-
$selection.
|
1756
|
+
$selection.attr('title', selection.title || selection.text);
|
1683
1757
|
|
1684
|
-
$selection
|
1758
|
+
Utils.StoreData($selection[0], 'data', selection);
|
1685
1759
|
|
1686
1760
|
$selections.push($selection);
|
1687
1761
|
}
|
@@ -1746,8 +1820,9 @@ S2.define('select2/selection/placeholder',[
|
|
1746
1820
|
|
1747
1821
|
S2.define('select2/selection/allowClear',[
|
1748
1822
|
'jquery',
|
1749
|
-
'../keys'
|
1750
|
-
|
1823
|
+
'../keys',
|
1824
|
+
'../utils'
|
1825
|
+
], function ($, KEYS, Utils) {
|
1751
1826
|
function AllowClear () { }
|
1752
1827
|
|
1753
1828
|
AllowClear.prototype.bind = function (decorated, container, $container) {
|
@@ -1789,10 +1864,22 @@ S2.define('select2/selection/allowClear',[
|
|
1789
1864
|
|
1790
1865
|
evt.stopPropagation();
|
1791
1866
|
|
1792
|
-
var data = $clear
|
1867
|
+
var data = Utils.GetData($clear[0], 'data');
|
1868
|
+
|
1869
|
+
var previousVal = this.$element.val();
|
1870
|
+
this.$element.val(this.placeholder.id);
|
1871
|
+
|
1872
|
+
var unselectData = {
|
1873
|
+
data: data
|
1874
|
+
};
|
1875
|
+
this.trigger('clear', unselectData);
|
1876
|
+
if (unselectData.prevented) {
|
1877
|
+
this.$element.val(previousVal);
|
1878
|
+
return;
|
1879
|
+
}
|
1793
1880
|
|
1794
1881
|
for (var d = 0; d < data.length; d++) {
|
1795
|
-
|
1882
|
+
unselectData = {
|
1796
1883
|
data: data[d]
|
1797
1884
|
};
|
1798
1885
|
|
@@ -1802,11 +1889,12 @@ S2.define('select2/selection/allowClear',[
|
|
1802
1889
|
|
1803
1890
|
// If the event was prevented, don't clear it out.
|
1804
1891
|
if (unselectData.prevented) {
|
1892
|
+
this.$element.val(previousVal);
|
1805
1893
|
return;
|
1806
1894
|
}
|
1807
1895
|
}
|
1808
1896
|
|
1809
|
-
this.$element.
|
1897
|
+
this.$element.trigger('change');
|
1810
1898
|
|
1811
1899
|
this.trigger('toggle', {});
|
1812
1900
|
};
|
@@ -1829,12 +1917,14 @@ S2.define('select2/selection/allowClear',[
|
|
1829
1917
|
return;
|
1830
1918
|
}
|
1831
1919
|
|
1920
|
+
var removeAll = this.options.get('translations').get('removeAllItems');
|
1921
|
+
|
1832
1922
|
var $remove = $(
|
1833
|
-
'<span class="select2-selection__clear">' +
|
1923
|
+
'<span class="select2-selection__clear" title="' + removeAll() +'">' +
|
1834
1924
|
'×' +
|
1835
1925
|
'</span>'
|
1836
1926
|
);
|
1837
|
-
$remove
|
1927
|
+
Utils.StoreData($remove[0], 'data', data);
|
1838
1928
|
|
1839
1929
|
this.$selection.find('.select2-selection__rendered').prepend($remove);
|
1840
1930
|
};
|
@@ -1925,7 +2015,7 @@ S2.define('select2/selection/search',[
|
|
1925
2015
|
.prev('.select2-selection__choice');
|
1926
2016
|
|
1927
2017
|
if ($previousChoice.length > 0) {
|
1928
|
-
var item = $previousChoice
|
2018
|
+
var item = Utils.GetData($previousChoice[0], 'data');
|
1929
2019
|
|
1930
2020
|
self.searchRemoveChoice(item);
|
1931
2021
|
|
@@ -2019,7 +2109,13 @@ S2.define('select2/selection/search',[
|
|
2019
2109
|
|
2020
2110
|
this.resizeSearch();
|
2021
2111
|
if (searchHadFocus) {
|
2022
|
-
this.$
|
2112
|
+
var isTagInput = this.$element.find('[data-select2-tag]').length;
|
2113
|
+
if (isTagInput) {
|
2114
|
+
// fix IE11 bug where tag input lost focus
|
2115
|
+
this.$element.focus();
|
2116
|
+
} else {
|
2117
|
+
this.$search.focus();
|
2118
|
+
}
|
2023
2119
|
}
|
2024
2120
|
};
|
2025
2121
|
|
@@ -2077,10 +2173,12 @@ S2.define('select2/selection/eventRelay',[
|
|
2077
2173
|
'close', 'closing',
|
2078
2174
|
'select', 'selecting',
|
2079
2175
|
'unselect', 'unselecting',
|
2080
|
-
'
|
2176
|
+
'clear', 'clearing'
|
2081
2177
|
];
|
2082
2178
|
|
2083
|
-
var preventableEvents = [
|
2179
|
+
var preventableEvents = [
|
2180
|
+
'opening', 'closing', 'selecting', 'unselecting', 'clearing'
|
2181
|
+
];
|
2084
2182
|
|
2085
2183
|
decorated.call(this, container, $container);
|
2086
2184
|
|
@@ -2413,6 +2511,7 @@ S2.define('select2/diacritics',[
|
|
2413
2511
|
'\u019F': 'O',
|
2414
2512
|
'\uA74A': 'O',
|
2415
2513
|
'\uA74C': 'O',
|
2514
|
+
'\u0152': 'OE',
|
2416
2515
|
'\u01A2': 'OI',
|
2417
2516
|
'\uA74E': 'OO',
|
2418
2517
|
'\u0222': 'OU',
|
@@ -2822,6 +2921,7 @@ S2.define('select2/diacritics',[
|
|
2822
2921
|
'\uA74B': 'o',
|
2823
2922
|
'\uA74D': 'o',
|
2824
2923
|
'\u0275': 'o',
|
2924
|
+
'\u0153': 'oe',
|
2825
2925
|
'\u01A3': 'oi',
|
2826
2926
|
'\u0223': 'ou',
|
2827
2927
|
'\uA74F': 'oo',
|
@@ -2990,8 +3090,9 @@ S2.define('select2/diacritics',[
|
|
2990
3090
|
'\u03CD': '\u03C5',
|
2991
3091
|
'\u03CB': '\u03C5',
|
2992
3092
|
'\u03B0': '\u03C5',
|
2993
|
-
'\
|
2994
|
-
'\u03C2': '\u03C3'
|
3093
|
+
'\u03CE': '\u03C9',
|
3094
|
+
'\u03C2': '\u03C3',
|
3095
|
+
'\u2019': '\''
|
2995
3096
|
};
|
2996
3097
|
|
2997
3098
|
return diacritics;
|
@@ -3159,7 +3260,7 @@ S2.define('select2/data/select',[
|
|
3159
3260
|
// Remove anything added to child elements
|
3160
3261
|
this.$element.find('*').each(function () {
|
3161
3262
|
// Remove any custom data set by Select2
|
3162
|
-
|
3263
|
+
Utils.RemoveData(this);
|
3163
3264
|
});
|
3164
3265
|
};
|
3165
3266
|
|
@@ -3232,7 +3333,7 @@ S2.define('select2/data/select',[
|
|
3232
3333
|
normalizedData.element = option;
|
3233
3334
|
|
3234
3335
|
// Override the option's data with the combined data
|
3235
|
-
|
3336
|
+
Utils.StoreData(option, 'data', normalizedData);
|
3236
3337
|
|
3237
3338
|
return $option;
|
3238
3339
|
};
|
@@ -3240,7 +3341,7 @@ S2.define('select2/data/select',[
|
|
3240
3341
|
SelectAdapter.prototype.item = function ($option) {
|
3241
3342
|
var data = {};
|
3242
3343
|
|
3243
|
-
data =
|
3344
|
+
data = Utils.GetData($option[0], 'data');
|
3244
3345
|
|
3245
3346
|
if (data != null) {
|
3246
3347
|
return data;
|
@@ -3278,13 +3379,13 @@ S2.define('select2/data/select',[
|
|
3278
3379
|
data = this._normalizeItem(data);
|
3279
3380
|
data.element = $option[0];
|
3280
3381
|
|
3281
|
-
|
3382
|
+
Utils.StoreData($option[0], 'data', data);
|
3282
3383
|
|
3283
3384
|
return data;
|
3284
3385
|
};
|
3285
3386
|
|
3286
3387
|
SelectAdapter.prototype._normalizeItem = function (item) {
|
3287
|
-
if (
|
3388
|
+
if (item !== Object(item)) {
|
3288
3389
|
item = {
|
3289
3390
|
id: item,
|
3290
3391
|
text: item
|
@@ -3488,7 +3589,8 @@ S2.define('select2/data/ajax',[
|
|
3488
3589
|
}, function () {
|
3489
3590
|
// Attempt to detect if a request was aborted
|
3490
3591
|
// Only works if the transport exposes a status property
|
3491
|
-
if (
|
3592
|
+
if ('status' in $request &&
|
3593
|
+
($request.status === 0 || $request.status === '0')) {
|
3492
3594
|
return;
|
3493
3595
|
}
|
3494
3596
|
|
@@ -3887,7 +3989,7 @@ S2.define('select2/dropdown',[
|
|
3887
3989
|
};
|
3888
3990
|
|
3889
3991
|
Dropdown.prototype.position = function ($dropdown, $container) {
|
3890
|
-
// Should be
|
3992
|
+
// Should be implemented in subclasses
|
3891
3993
|
};
|
3892
3994
|
|
3893
3995
|
Dropdown.prototype.destroy = function () {
|
@@ -3960,6 +4062,7 @@ S2.define('select2/dropdown/search',[
|
|
3960
4062
|
self.$search.attr('tabindex', -1);
|
3961
4063
|
|
3962
4064
|
self.$search.val('');
|
4065
|
+
self.$search.blur();
|
3963
4066
|
});
|
3964
4067
|
|
3965
4068
|
container.on('focus', function () {
|
@@ -4225,14 +4328,14 @@ S2.define('select2/dropdown/attachBody',[
|
|
4225
4328
|
|
4226
4329
|
var $watchers = this.$container.parents().filter(Utils.hasScroll);
|
4227
4330
|
$watchers.each(function () {
|
4228
|
-
|
4331
|
+
Utils.StoreData(this, 'select2-scroll-position', {
|
4229
4332
|
x: $(this).scrollLeft(),
|
4230
4333
|
y: $(this).scrollTop()
|
4231
4334
|
});
|
4232
4335
|
});
|
4233
4336
|
|
4234
4337
|
$watchers.on(scrollEvent, function (ev) {
|
4235
|
-
var position =
|
4338
|
+
var position = Utils.GetData(this, 'select2-scroll-position');
|
4236
4339
|
$(this).scrollTop(position.y);
|
4237
4340
|
});
|
4238
4341
|
|
@@ -4291,10 +4394,10 @@ S2.define('select2/dropdown/attachBody',[
|
|
4291
4394
|
top: container.bottom
|
4292
4395
|
};
|
4293
4396
|
|
4294
|
-
// Determine what the parent element is to use for
|
4397
|
+
// Determine what the parent element is to use for calculating the offset
|
4295
4398
|
var $offsetParent = this.$dropdownParent;
|
4296
4399
|
|
4297
|
-
// For statically
|
4400
|
+
// For statically positioned elements, we need to get the element
|
4298
4401
|
// that is determining the offset
|
4299
4402
|
if ($offsetParent.css('position') === 'static') {
|
4300
4403
|
$offsetParent = $offsetParent.offsetParent();
|
@@ -4397,8 +4500,8 @@ S2.define('select2/dropdown/minimumResultsForSearch',[
|
|
4397
4500
|
});
|
4398
4501
|
|
4399
4502
|
S2.define('select2/dropdown/selectOnClose',[
|
4400
|
-
|
4401
|
-
], function () {
|
4503
|
+
'../utils'
|
4504
|
+
], function (Utils) {
|
4402
4505
|
function SelectOnClose () { }
|
4403
4506
|
|
4404
4507
|
SelectOnClose.prototype.bind = function (decorated, container, $container) {
|
@@ -4429,7 +4532,7 @@ S2.define('select2/dropdown/selectOnClose',[
|
|
4429
4532
|
return;
|
4430
4533
|
}
|
4431
4534
|
|
4432
|
-
var data = $highlightedResults
|
4535
|
+
var data = Utils.GetData($highlightedResults[0], 'data');
|
4433
4536
|
|
4434
4537
|
// Don't re-select already selected resulte
|
4435
4538
|
if (
|
@@ -4470,7 +4573,7 @@ S2.define('select2/dropdown/closeOnSelect',[
|
|
4470
4573
|
var originalEvent = evt.originalEvent;
|
4471
4574
|
|
4472
4575
|
// Don't close if the control key is being held
|
4473
|
-
if (originalEvent && originalEvent.ctrlKey) {
|
4576
|
+
if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) {
|
4474
4577
|
return;
|
4475
4578
|
}
|
4476
4579
|
|
@@ -4524,6 +4627,9 @@ S2.define('select2/i18n/en',[],function () {
|
|
4524
4627
|
},
|
4525
4628
|
searching: function () {
|
4526
4629
|
return 'Searching…';
|
4630
|
+
},
|
4631
|
+
removeAllItems: function () {
|
4632
|
+
return 'Remove all items';
|
4527
4633
|
}
|
4528
4634
|
};
|
4529
4635
|
});
|
@@ -4895,6 +5001,7 @@ S2.define('select2/defaults',[
|
|
4895
5001
|
maximumSelectionLength: 0,
|
4896
5002
|
minimumResultsForSearch: 0,
|
4897
5003
|
selectOnClose: false,
|
5004
|
+
scrollAfterSelect: false,
|
4898
5005
|
sorter: function (data) {
|
4899
5006
|
return data;
|
4900
5007
|
},
|
@@ -4917,7 +5024,7 @@ S2.define('select2/defaults',[
|
|
4917
5024
|
|
4918
5025
|
var convertedData = Utils._convertData(data);
|
4919
5026
|
|
4920
|
-
$.extend(this.defaults, convertedData);
|
5027
|
+
$.extend(true, this.defaults, convertedData);
|
4921
5028
|
};
|
4922
5029
|
|
4923
5030
|
var defaults = new Defaults();
|
@@ -4982,7 +5089,7 @@ S2.define('select2/options',[
|
|
4982
5089
|
$e.prop('disabled', this.options.disabled);
|
4983
5090
|
$e.prop('multiple', this.options.multiple);
|
4984
5091
|
|
4985
|
-
if ($e
|
5092
|
+
if (Utils.GetData($e[0], 'select2Tags')) {
|
4986
5093
|
if (this.options.debug && window.console && console.warn) {
|
4987
5094
|
console.warn(
|
4988
5095
|
'Select2: The `data-select2-tags` attribute has been changed to ' +
|
@@ -4991,11 +5098,11 @@ S2.define('select2/options',[
|
|
4991
5098
|
);
|
4992
5099
|
}
|
4993
5100
|
|
4994
|
-
$e
|
4995
|
-
$e
|
5101
|
+
Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags'));
|
5102
|
+
Utils.StoreData($e[0], 'tags', true);
|
4996
5103
|
}
|
4997
5104
|
|
4998
|
-
if ($e
|
5105
|
+
if (Utils.GetData($e[0], 'ajaxUrl')) {
|
4999
5106
|
if (this.options.debug && window.console && console.warn) {
|
5000
5107
|
console.warn(
|
5001
5108
|
'Select2: The `data-ajax-url` attribute has been changed to ' +
|
@@ -5004,21 +5111,45 @@ S2.define('select2/options',[
|
|
5004
5111
|
);
|
5005
5112
|
}
|
5006
5113
|
|
5007
|
-
$e.attr('ajax--url', $e
|
5008
|
-
$e
|
5114
|
+
$e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl'));
|
5115
|
+
Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl'));
|
5009
5116
|
}
|
5010
5117
|
|
5011
5118
|
var dataset = {};
|
5012
5119
|
|
5120
|
+
function upperCaseLetter(_, letter) {
|
5121
|
+
return letter.toUpperCase();
|
5122
|
+
}
|
5123
|
+
|
5124
|
+
// Pre-load all of the attributes which are prefixed with `data-`
|
5125
|
+
for (var attr = 0; attr < $e[0].attributes.length; attr++) {
|
5126
|
+
var attributeName = $e[0].attributes[attr].name;
|
5127
|
+
var prefix = 'data-';
|
5128
|
+
|
5129
|
+
if (attributeName.substr(0, prefix.length) == prefix) {
|
5130
|
+
// Get the contents of the attribute after `data-`
|
5131
|
+
var dataName = attributeName.substring(prefix.length);
|
5132
|
+
|
5133
|
+
// Get the data contents from the consistent source
|
5134
|
+
// This is more than likely the jQuery data helper
|
5135
|
+
var dataValue = Utils.GetData($e[0], dataName);
|
5136
|
+
|
5137
|
+
// camelCase the attribute name to match the spec
|
5138
|
+
var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter);
|
5139
|
+
|
5140
|
+
// Store the data attribute contents into the dataset since
|
5141
|
+
dataset[camelDataName] = dataValue;
|
5142
|
+
}
|
5143
|
+
}
|
5144
|
+
|
5013
5145
|
// Prefer the element's `dataset` attribute if it exists
|
5014
5146
|
// jQuery 1.x does not correctly handle data attributes with multiple dashes
|
5015
5147
|
if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {
|
5016
|
-
dataset = $.extend(true, {}, $e[0].dataset,
|
5017
|
-
} else {
|
5018
|
-
dataset = $e.data();
|
5148
|
+
dataset = $.extend(true, {}, $e[0].dataset, dataset);
|
5019
5149
|
}
|
5020
5150
|
|
5021
|
-
|
5151
|
+
// Prefer our internal data cache if it exists
|
5152
|
+
var data = $.extend(true, {}, Utils.GetData($e[0]), dataset);
|
5022
5153
|
|
5023
5154
|
data = Utils._convertData(data);
|
5024
5155
|
|
@@ -5055,8 +5186,8 @@ S2.define('select2/core',[
|
|
5055
5186
|
'./keys'
|
5056
5187
|
], function ($, Options, Utils, KEYS) {
|
5057
5188
|
var Select2 = function ($element, options) {
|
5058
|
-
if ($element
|
5059
|
-
$element
|
5189
|
+
if (Utils.GetData($element[0], 'select2') != null) {
|
5190
|
+
Utils.GetData($element[0], 'select2').destroy();
|
5060
5191
|
}
|
5061
5192
|
|
5062
5193
|
this.$element = $element;
|
@@ -5072,7 +5203,7 @@ S2.define('select2/core',[
|
|
5072
5203
|
// Set up the tabindex
|
5073
5204
|
|
5074
5205
|
var tabindex = $element.attr('tabindex') || 0;
|
5075
|
-
$element
|
5206
|
+
Utils.StoreData($element[0], 'old-tabindex', tabindex);
|
5076
5207
|
$element.attr('tabindex', '-1');
|
5077
5208
|
|
5078
5209
|
// Set up containers and adapters
|
@@ -5133,6 +5264,9 @@ S2.define('select2/core',[
|
|
5133
5264
|
// Synchronize any monitored attributes
|
5134
5265
|
this._syncAttributes();
|
5135
5266
|
|
5267
|
+
Utils.StoreData($element[0], 'select2', this);
|
5268
|
+
|
5269
|
+
// Ensure backwards compatibility with $element.data('select2').
|
5136
5270
|
$element.data('select2', this);
|
5137
5271
|
};
|
5138
5272
|
|
@@ -5370,12 +5504,11 @@ S2.define('select2/core',[
|
|
5370
5504
|
var key = evt.which;
|
5371
5505
|
|
5372
5506
|
if (self.isOpen()) {
|
5373
|
-
if (key === KEYS.ESC || key === KEYS.
|
5374
|
-
(key === KEYS.UP && evt.altKey)) {
|
5507
|
+
if (key === KEYS.ESC || (key === KEYS.UP && evt.altKey)) {
|
5375
5508
|
self.close();
|
5376
5509
|
|
5377
5510
|
evt.preventDefault();
|
5378
|
-
} else if (key === KEYS.ENTER) {
|
5511
|
+
} else if (key === KEYS.ENTER || key === KEYS.TAB) {
|
5379
5512
|
self.trigger('results:select', {});
|
5380
5513
|
|
5381
5514
|
evt.preventDefault();
|
@@ -5467,7 +5600,8 @@ S2.define('select2/core',[
|
|
5467
5600
|
'open': 'opening',
|
5468
5601
|
'close': 'closing',
|
5469
5602
|
'select': 'selecting',
|
5470
|
-
'unselect': 'unselecting'
|
5603
|
+
'unselect': 'unselecting',
|
5604
|
+
'clear': 'clearing'
|
5471
5605
|
};
|
5472
5606
|
|
5473
5607
|
if (args === undefined) {
|
@@ -5622,10 +5756,12 @@ S2.define('select2/core',[
|
|
5622
5756
|
this._syncS = null;
|
5623
5757
|
|
5624
5758
|
this.$element.off('.select2');
|
5625
|
-
this.$element.attr('tabindex',
|
5759
|
+
this.$element.attr('tabindex',
|
5760
|
+
Utils.GetData(this.$element[0], 'old-tabindex'));
|
5626
5761
|
|
5627
5762
|
this.$element.removeClass('select2-hidden-accessible');
|
5628
5763
|
this.$element.attr('aria-hidden', 'false');
|
5764
|
+
Utils.RemoveData(this.$element[0]);
|
5629
5765
|
this.$element.removeData('select2');
|
5630
5766
|
|
5631
5767
|
this.dataAdapter.destroy();
|
@@ -5653,7 +5789,7 @@ S2.define('select2/core',[
|
|
5653
5789
|
|
5654
5790
|
this.$container.addClass('select2-container--' + this.options.get('theme'));
|
5655
5791
|
|
5656
|
-
$container
|
5792
|
+
Utils.StoreData($container[0], 'element', this.$element);
|
5657
5793
|
|
5658
5794
|
return $container;
|
5659
5795
|
};
|
@@ -5673,8 +5809,9 @@ S2.define('jquery.select2',[
|
|
5673
5809
|
'jquery-mousewheel',
|
5674
5810
|
|
5675
5811
|
'./select2/core',
|
5676
|
-
'./select2/defaults'
|
5677
|
-
|
5812
|
+
'./select2/defaults',
|
5813
|
+
'./select2/utils'
|
5814
|
+
], function ($, _, Select2, Defaults, Utils) {
|
5678
5815
|
if ($.fn.select2 == null) {
|
5679
5816
|
// All methods that should return the element
|
5680
5817
|
var thisMethods = ['open', 'close', 'destroy'];
|
@@ -5695,7 +5832,7 @@ S2.define('jquery.select2',[
|
|
5695
5832
|
var args = Array.prototype.slice.call(arguments, 1);
|
5696
5833
|
|
5697
5834
|
this.each(function () {
|
5698
|
-
var instance =
|
5835
|
+
var instance = Utils.GetData(this, 'select2');
|
5699
5836
|
|
5700
5837
|
if (instance == null && window.console && console.error) {
|
5701
5838
|
console.error(
|
@@ -118,12 +118,14 @@
|
|
118
118
|
.select2-hidden-accessible {
|
119
119
|
border: 0 !important;
|
120
120
|
clip: rect(0 0 0 0) !important;
|
121
|
+
-webkit-clip-path: inset(50%) !important;
|
122
|
+
clip-path: inset(50%) !important;
|
121
123
|
height: 1px !important;
|
122
|
-
margin: -1px !important;
|
123
124
|
overflow: hidden !important;
|
124
125
|
padding: 0 !important;
|
125
126
|
position: absolute !important;
|
126
|
-
width: 1px !important;
|
127
|
+
width: 1px !important;
|
128
|
+
white-space: nowrap !important; }
|
127
129
|
|
128
130
|
.select2-container--default .select2-selection--single {
|
129
131
|
background-color: #fff;
|
@@ -420,9 +422,7 @@
|
|
420
422
|
color: #555; }
|
421
423
|
|
422
424
|
.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
|
423
|
-
float: right;
|
424
|
-
|
425
|
-
.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
|
425
|
+
float: right;
|
426
426
|
margin-left: 5px;
|
427
427
|
margin-right: auto; }
|
428
428
|
|
@@ -103,13 +103,21 @@ module Effective
|
|
103
103
|
# Apply ActsAsArchived behavior. That's all for now.
|
104
104
|
def translate(collection)
|
105
105
|
return collection unless object.respond_to?(:new_record?)
|
106
|
-
return collection unless collection.respond_to?(:klass)
|
106
|
+
return collection unless collection.respond_to?(:klass)
|
107
107
|
|
108
|
-
if
|
109
|
-
collection.
|
110
|
-
|
111
|
-
|
108
|
+
if collection.klass.respond_to?(:acts_as_archived?)
|
109
|
+
collection = if object.new_record?
|
110
|
+
collection.unarchived
|
111
|
+
else
|
112
|
+
collection.unarchived.or(collection.archived.where(collection.klass.primary_key => value))
|
113
|
+
end
|
112
114
|
end
|
115
|
+
|
116
|
+
if respond_to?(:ajax?) && ajax? # effective_select
|
117
|
+
collection = collection.where(collection.klass.primary_key => value)
|
118
|
+
end
|
119
|
+
|
120
|
+
collection
|
113
121
|
end
|
114
122
|
|
115
123
|
def assign_options_collection_methods!
|
@@ -43,6 +43,7 @@ module Effective
|
|
43
43
|
template: js_template,
|
44
44
|
containerClass: ('hide-disabled' if hide_disabled?),
|
45
45
|
dropdownClass: ('hide-disabled' if hide_disabled?),
|
46
|
+
ajax: ({ url: ajax_url, dataType: 'json', delay: 250 } if ajax?)
|
46
47
|
}.compact
|
47
48
|
end
|
48
49
|
|
@@ -82,6 +83,10 @@ module Effective
|
|
82
83
|
options_collection
|
83
84
|
end
|
84
85
|
|
86
|
+
def ajax?
|
87
|
+
ajax_url.present?
|
88
|
+
end
|
89
|
+
|
85
90
|
private
|
86
91
|
|
87
92
|
def include_null
|
@@ -103,7 +108,6 @@ module Effective
|
|
103
108
|
|
104
109
|
def multiple?
|
105
110
|
return @multiple unless @multiple.nil?
|
106
|
-
|
107
111
|
@multiple = options.key?(:multiple) ? options.delete(:multiple) : (tags? || name.to_s.ends_with?('_ids'))
|
108
112
|
end
|
109
113
|
|
@@ -132,6 +136,10 @@ module Effective
|
|
132
136
|
@js_template = options.delete(:template)
|
133
137
|
end
|
134
138
|
|
139
|
+
def ajax_url
|
140
|
+
@ajax_url ||= (options.delete(:ajax_url) || options.delete(:ajax) || options.delete(:url))
|
141
|
+
end
|
142
|
+
|
135
143
|
end
|
136
144
|
end
|
137
145
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: effective_bootstrap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.19
|
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: 2019-06-
|
11
|
+
date: 2019-06-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|