effective_bootstrap 0.5.18 → 0.5.19
Sign up to get free protection for your applications and to get access to all the features.
- 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
|