selectr-rails 2.4.1 → 2.4.8
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/lib/selectr/version.rb +1 -1
- data/vendor/assets/javascripts/selectr.js +186 -119
- data/vendor/assets/stylesheets/selectr.css +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2258cacca1a9ebcf44d2ada175c9f350bf941822
|
4
|
+
data.tar.gz: 87ac129a92230aeff537ebfafc75bc6078ac36bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 192f5529e3f8a70e9b0cb1b47f9f8f1d08d517774e389ca1a5d6cdfc9ca1b762a09efd9e6a18fbf20492637b534cc1a5c1b42f55ba026445547b921d5823d6f5
|
7
|
+
data.tar.gz: d3783b9f7da8276321a90d4b4b50768d5b04df40c0f430249e661b7cebd516030831e5d0718f016551d9f59ca1f88e6a1e1dc9bdeffa51dece4cd707a33ffac2
|
data/lib/selectr/version.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/*!
|
2
|
-
* Selectr 2.4.
|
2
|
+
* Selectr 2.4.8
|
3
3
|
* http://mobius.ovh/docs/selectr
|
4
4
|
*
|
5
5
|
* Released under the MIT license
|
@@ -17,90 +17,6 @@
|
|
17
17
|
}(this, function(plugin) {
|
18
18
|
'use strict';
|
19
19
|
|
20
|
-
/**
|
21
|
-
* Default configuration options
|
22
|
-
* @type {Object}
|
23
|
-
*/
|
24
|
-
var defaultConfig = {
|
25
|
-
/**
|
26
|
-
* Emulates browser behaviour by selecting the first option by default
|
27
|
-
* @type {Boolean}
|
28
|
-
*/
|
29
|
-
defaultSelected: true,
|
30
|
-
|
31
|
-
/**
|
32
|
-
* Sets the width of the container
|
33
|
-
* @type {String}
|
34
|
-
*/
|
35
|
-
width: "auto",
|
36
|
-
|
37
|
-
/**
|
38
|
-
* Enables/ disables the container
|
39
|
-
* @type {Boolean}
|
40
|
-
*/
|
41
|
-
disabled: false,
|
42
|
-
|
43
|
-
/**
|
44
|
-
* Enables / disables the search function
|
45
|
-
* @type {Boolean}
|
46
|
-
*/
|
47
|
-
searchable: true,
|
48
|
-
|
49
|
-
/**
|
50
|
-
* Enable disable the clear button
|
51
|
-
* @type {Boolean}
|
52
|
-
*/
|
53
|
-
clearable: false,
|
54
|
-
|
55
|
-
/**
|
56
|
-
* Sort the tags / multiselect options
|
57
|
-
* @type {Boolean}
|
58
|
-
*/
|
59
|
-
sortSelected: false,
|
60
|
-
|
61
|
-
/**
|
62
|
-
* Allow deselecting of select-one options
|
63
|
-
* @type {Boolean}
|
64
|
-
*/
|
65
|
-
allowDeselect: false,
|
66
|
-
|
67
|
-
/**
|
68
|
-
* Close the dropdown when scrolling (@AlexanderReiswich, #11)
|
69
|
-
* @type {Boolean}
|
70
|
-
*/
|
71
|
-
closeOnScroll: false,
|
72
|
-
|
73
|
-
/**
|
74
|
-
* Allow the use of the native dropdown (@jonnyscholes, #14)
|
75
|
-
* @type {Boolean}
|
76
|
-
*/
|
77
|
-
nativeDropdown: false,
|
78
|
-
|
79
|
-
/**
|
80
|
-
* Allow the use of native typing behavior for toggling, searching, selecting
|
81
|
-
* @type {boolean}
|
82
|
-
*/
|
83
|
-
nativeKeyboard: false,
|
84
|
-
|
85
|
-
/**
|
86
|
-
* Set the main placeholder
|
87
|
-
* @type {String}
|
88
|
-
*/
|
89
|
-
placeholder: "Select an option...",
|
90
|
-
|
91
|
-
/**
|
92
|
-
* Allow the tagging feature
|
93
|
-
* @type {Boolean}
|
94
|
-
*/
|
95
|
-
taggable: false,
|
96
|
-
|
97
|
-
/**
|
98
|
-
* Set the tag input placeholder (@labikmartin, #21, #22)
|
99
|
-
* @type {String}
|
100
|
-
*/
|
101
|
-
tagPlaceholder: "Enter a tag..."
|
102
|
-
};
|
103
|
-
|
104
20
|
/**
|
105
21
|
* Event Emitter
|
106
22
|
*/
|
@@ -172,16 +88,18 @@
|
|
172
88
|
*/
|
173
89
|
var util = {
|
174
90
|
extend: function(src, props) {
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
91
|
+
for (var prop in props) {
|
92
|
+
if (props.hasOwnProperty(prop)) {
|
93
|
+
var val = props[prop];
|
94
|
+
if (val && Object.prototype.toString.call(val) === "[object Object]") {
|
95
|
+
src[prop] = src[prop] || {};
|
96
|
+
util.extend(src[prop], val);
|
97
|
+
} else {
|
98
|
+
src[prop] = val;
|
99
|
+
}
|
100
|
+
}
|
181
101
|
}
|
182
|
-
|
183
|
-
}
|
184
|
-
return props;
|
102
|
+
return src;
|
185
103
|
},
|
186
104
|
each: function(a, b, c) {
|
187
105
|
if ("[object Object]" === Object.prototype.toString.call(a)) {
|
@@ -441,7 +359,7 @@
|
|
441
359
|
this.selected = util.createElement("div", {
|
442
360
|
class: "selectr-selected",
|
443
361
|
disabled: this.disabled,
|
444
|
-
tabIndex:
|
362
|
+
tabIndex: 0,
|
445
363
|
"aria-expanded": false
|
446
364
|
});
|
447
365
|
|
@@ -532,7 +450,8 @@
|
|
532
450
|
autocapitalize: "off",
|
533
451
|
spellcheck: "false",
|
534
452
|
role: "textbox",
|
535
|
-
type: "search"
|
453
|
+
type: "search",
|
454
|
+
placeholder: this.config.messages.searchPlaceholder
|
536
455
|
});
|
537
456
|
this.inputClear = util.createElement("button", {
|
538
457
|
class: "selectr-input-clear",
|
@@ -627,6 +546,8 @@
|
|
627
546
|
|
628
547
|
j++;
|
629
548
|
}, this);
|
549
|
+
|
550
|
+
this.el.appendChild(optgroup);
|
630
551
|
} else {
|
631
552
|
option = new Option(opt.text, opt.value, false, opt.hasOwnProperty("selected") && opt.selected === true);
|
632
553
|
|
@@ -707,7 +628,7 @@
|
|
707
628
|
|
708
629
|
if (e.which === 13) {
|
709
630
|
|
710
|
-
if (this.config.taggable && this.input.value.length > 0) {
|
631
|
+
if ( this.noResults || (this.config.taggable && this.input.value.length > 0) ) {
|
711
632
|
return false;
|
712
633
|
}
|
713
634
|
|
@@ -969,8 +890,6 @@
|
|
969
890
|
// Main Lib
|
970
891
|
var Selectr = function(el, config) {
|
971
892
|
|
972
|
-
config = config || {};
|
973
|
-
|
974
893
|
if (!el) {
|
975
894
|
throw new Error("You must supply either a HTMLSelectElement or a CSS3 selector string.");
|
976
895
|
}
|
@@ -1002,6 +921,101 @@
|
|
1002
921
|
|
1003
922
|
if (this.rendered) return;
|
1004
923
|
|
924
|
+
/**
|
925
|
+
* Default configuration options
|
926
|
+
* @type {Object}
|
927
|
+
*/
|
928
|
+
var defaultConfig = {
|
929
|
+
/**
|
930
|
+
* Emulates browser behaviour by selecting the first option by default
|
931
|
+
* @type {Boolean}
|
932
|
+
*/
|
933
|
+
defaultSelected: true,
|
934
|
+
|
935
|
+
/**
|
936
|
+
* Sets the width of the container
|
937
|
+
* @type {String}
|
938
|
+
*/
|
939
|
+
width: "auto",
|
940
|
+
|
941
|
+
/**
|
942
|
+
* Enables/ disables the container
|
943
|
+
* @type {Boolean}
|
944
|
+
*/
|
945
|
+
disabled: false,
|
946
|
+
|
947
|
+
/**
|
948
|
+
* Enables / disables the search function
|
949
|
+
* @type {Boolean}
|
950
|
+
*/
|
951
|
+
searchable: true,
|
952
|
+
|
953
|
+
/**
|
954
|
+
* Enable disable the clear button
|
955
|
+
* @type {Boolean}
|
956
|
+
*/
|
957
|
+
clearable: false,
|
958
|
+
|
959
|
+
/**
|
960
|
+
* Sort the tags / multiselect options
|
961
|
+
* @type {Boolean}
|
962
|
+
*/
|
963
|
+
sortSelected: false,
|
964
|
+
|
965
|
+
/**
|
966
|
+
* Allow deselecting of select-one options
|
967
|
+
* @type {Boolean}
|
968
|
+
*/
|
969
|
+
allowDeselect: false,
|
970
|
+
|
971
|
+
/**
|
972
|
+
* Close the dropdown when scrolling (@AlexanderReiswich, #11)
|
973
|
+
* @type {Boolean}
|
974
|
+
*/
|
975
|
+
closeOnScroll: false,
|
976
|
+
|
977
|
+
/**
|
978
|
+
* Allow the use of the native dropdown (@jonnyscholes, #14)
|
979
|
+
* @type {Boolean}
|
980
|
+
*/
|
981
|
+
nativeDropdown: false,
|
982
|
+
|
983
|
+
/**
|
984
|
+
* Allow the use of native typing behavior for toggling, searching, selecting
|
985
|
+
* @type {boolean}
|
986
|
+
*/
|
987
|
+
nativeKeyboard: false,
|
988
|
+
|
989
|
+
/**
|
990
|
+
* Set the main placeholder
|
991
|
+
* @type {String}
|
992
|
+
*/
|
993
|
+
placeholder: "Select an option...",
|
994
|
+
|
995
|
+
/**
|
996
|
+
* Allow the tagging feature
|
997
|
+
* @type {Boolean}
|
998
|
+
*/
|
999
|
+
taggable: false,
|
1000
|
+
|
1001
|
+
/**
|
1002
|
+
* Set the tag input placeholder (@labikmartin, #21, #22)
|
1003
|
+
* @type {String}
|
1004
|
+
*/
|
1005
|
+
tagPlaceholder: "Enter a tag...",
|
1006
|
+
|
1007
|
+
messages: {
|
1008
|
+
noResults: "No results.",
|
1009
|
+
noOptions: "No options available.",
|
1010
|
+
maxSelections: "A maximum of {max} items can be selected.",
|
1011
|
+
tagDuplicate: "That tag is already in use.",
|
1012
|
+
searchPlaceholder: "Search options..."
|
1013
|
+
}
|
1014
|
+
};
|
1015
|
+
|
1016
|
+
// add instance reference (#87)
|
1017
|
+
this.el.selectr = this;
|
1018
|
+
|
1005
1019
|
// Merge defaults with user set config
|
1006
1020
|
this.config = util.extend(defaultConfig, config);
|
1007
1021
|
|
@@ -1040,6 +1054,8 @@
|
|
1040
1054
|
this.customOption = this.config.hasOwnProperty("renderOption") && typeof this.config.renderOption === "function";
|
1041
1055
|
this.customSelected = this.config.hasOwnProperty("renderSelection") && typeof this.config.renderSelection === "function";
|
1042
1056
|
|
1057
|
+
this.supportsEventPassiveOption = this.detectEventPassiveOption();
|
1058
|
+
|
1043
1059
|
// Enable event emitter
|
1044
1060
|
Events.mixin(this);
|
1045
1061
|
|
@@ -1077,6 +1093,24 @@
|
|
1077
1093
|
return values;
|
1078
1094
|
};
|
1079
1095
|
|
1096
|
+
/**
|
1097
|
+
* Feature detection: addEventListener passive option
|
1098
|
+
* https://dom.spec.whatwg.org/#dom-addeventlisteneroptions-passive
|
1099
|
+
* https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md
|
1100
|
+
*/
|
1101
|
+
Selectr.prototype.detectEventPassiveOption = function () {
|
1102
|
+
var supportsPassiveOption = false;
|
1103
|
+
try {
|
1104
|
+
var opts = Object.defineProperty({}, 'passive', {
|
1105
|
+
get: function() {
|
1106
|
+
supportsPassiveOption = true;
|
1107
|
+
}
|
1108
|
+
});
|
1109
|
+
window.addEventListener('test', null, opts);
|
1110
|
+
} catch (e) {}
|
1111
|
+
return supportsPassiveOption;
|
1112
|
+
}
|
1113
|
+
|
1080
1114
|
/**
|
1081
1115
|
* Attach the required event listeners
|
1082
1116
|
*/
|
@@ -1096,7 +1130,7 @@
|
|
1096
1130
|
if (e.changedTouches[0].target === that.el) {
|
1097
1131
|
that.toggle();
|
1098
1132
|
}
|
1099
|
-
});
|
1133
|
+
}, this.supportsEventPassiveOption ? { passive: true } : false);
|
1100
1134
|
|
1101
1135
|
this.container.addEventListener("click", function(e) {
|
1102
1136
|
if (e.target === that.el) {
|
@@ -1141,20 +1175,30 @@
|
|
1141
1175
|
|
1142
1176
|
}
|
1143
1177
|
|
1144
|
-
//
|
1145
|
-
|
1146
|
-
|
1147
|
-
|
1148
|
-
|
1178
|
+
// Keyboard Support
|
1179
|
+
this.container.addEventListener("keydown", function(e) {
|
1180
|
+
if (e.key === "Escape") {
|
1181
|
+
that.close();
|
1182
|
+
}
|
1183
|
+
|
1184
|
+
if (e.key === "Enter" && that.selected === document.activeElement) {
|
1185
|
+
if (typeof that.el.form.submit !== 'undefined') that.el.form.submit();
|
1186
|
+
}
|
1187
|
+
|
1188
|
+
if ((e.key === " " || e.key === "ArrowUp" || e.key === "ArrowDown") &&
|
1189
|
+
that.selected === document.activeElement) {
|
1190
|
+
setTimeout(function() {
|
1149
1191
|
that.toggle();
|
1192
|
+
}, 200);
|
1150
1193
|
|
1194
|
+
if (that.config.nativeDropdown) {
|
1151
1195
|
// Focus on the native multiselect
|
1152
1196
|
setTimeout(function() {
|
1153
1197
|
that.el.focus();
|
1154
1198
|
}, 200);
|
1155
1199
|
}
|
1156
|
-
}
|
1157
|
-
}
|
1200
|
+
}
|
1201
|
+
});
|
1158
1202
|
|
1159
1203
|
// Non-native dropdown
|
1160
1204
|
this.selected.addEventListener("click", function(e) {
|
@@ -1163,7 +1207,6 @@
|
|
1163
1207
|
that.toggle();
|
1164
1208
|
}
|
1165
1209
|
|
1166
|
-
e.stopPropagation();
|
1167
1210
|
e.preventDefault();
|
1168
1211
|
});
|
1169
1212
|
|
@@ -1353,7 +1396,7 @@
|
|
1353
1396
|
|
1354
1397
|
if (!option) {
|
1355
1398
|
this.value = '';
|
1356
|
-
that.setMessage(
|
1399
|
+
that.setMessage(that.config.messages.tagDuplicate);
|
1357
1400
|
} else {
|
1358
1401
|
that.close();
|
1359
1402
|
clearSearch.call(that);
|
@@ -1502,6 +1545,9 @@
|
|
1502
1545
|
this.container.parentNode.replaceChild(this.el, this.container);
|
1503
1546
|
|
1504
1547
|
this.rendered = false;
|
1548
|
+
|
1549
|
+
// remove reference
|
1550
|
+
delete this.el.selectr;
|
1505
1551
|
};
|
1506
1552
|
|
1507
1553
|
/**
|
@@ -1545,7 +1591,7 @@
|
|
1545
1591
|
}
|
1546
1592
|
|
1547
1593
|
if (this.config.maxSelections && this.tags.length === this.config.maxSelections) {
|
1548
|
-
this.setMessage("
|
1594
|
+
this.setMessage(this.config.messages.maxSelections.replace("{max}", this.config.maxSelections), true);
|
1549
1595
|
return false;
|
1550
1596
|
}
|
1551
1597
|
|
@@ -1588,6 +1634,15 @@
|
|
1588
1634
|
this.emit("selectr.change", option);
|
1589
1635
|
|
1590
1636
|
this.emit("selectr.select", option);
|
1637
|
+
|
1638
|
+
// fire native change event
|
1639
|
+
if ("createEvent" in document) {
|
1640
|
+
var evt = document.createEvent("HTMLEvents");
|
1641
|
+
evt.initEvent("change", true, true);
|
1642
|
+
this.el.dispatchEvent(evt);
|
1643
|
+
} else {
|
1644
|
+
this.el.fireEvent("onchange");
|
1645
|
+
}
|
1591
1646
|
};
|
1592
1647
|
|
1593
1648
|
/**
|
@@ -1637,6 +1692,15 @@
|
|
1637
1692
|
this.emit("selectr.change", null);
|
1638
1693
|
|
1639
1694
|
this.emit("selectr.deselect", option);
|
1695
|
+
|
1696
|
+
// fire native change event
|
1697
|
+
if ("createEvent" in document) {
|
1698
|
+
var evt = document.createEvent("HTMLEvents");
|
1699
|
+
evt.initEvent("change", true, true);
|
1700
|
+
this.el.dispatchEvent(evt);
|
1701
|
+
} else {
|
1702
|
+
this.el.fireEvent("onchange");
|
1703
|
+
}
|
1640
1704
|
};
|
1641
1705
|
|
1642
1706
|
/**
|
@@ -1656,7 +1720,7 @@
|
|
1656
1720
|
}
|
1657
1721
|
|
1658
1722
|
util.each(this.options, function(i, option) {
|
1659
|
-
if (isArray &&
|
1723
|
+
if (isArray && (value.indexOf(option.value) > -1) || option.value === value) {
|
1660
1724
|
this.change(option.idx);
|
1661
1725
|
}
|
1662
1726
|
}, this);
|
@@ -1712,7 +1776,6 @@
|
|
1712
1776
|
*/
|
1713
1777
|
Selectr.prototype.add = function(data, checkDuplicate) {
|
1714
1778
|
if (data) {
|
1715
|
-
|
1716
1779
|
this.data = this.data || [];
|
1717
1780
|
this.items = this.items || [];
|
1718
1781
|
this.options = this.options || [];
|
@@ -1758,14 +1821,14 @@
|
|
1758
1821
|
if (data.selected) {
|
1759
1822
|
this.select(option.idx);
|
1760
1823
|
}
|
1824
|
+
|
1825
|
+
// We may have had an empty select so update
|
1826
|
+
// the placeholder to reflect the changes.
|
1827
|
+
this.setPlaceholder();
|
1761
1828
|
|
1762
1829
|
return option;
|
1763
1830
|
}
|
1764
1831
|
|
1765
|
-
// We may have had an empty select so update
|
1766
|
-
// the placeholder to reflect the changes.
|
1767
|
-
this.setPlaceholder();
|
1768
|
-
|
1769
1832
|
// Recount the pages
|
1770
1833
|
if (this.config.pagination) {
|
1771
1834
|
this.paginate();
|
@@ -1786,7 +1849,7 @@
|
|
1786
1849
|
util.each(o, function(i, opt) {
|
1787
1850
|
if (util.isInt(opt)) {
|
1788
1851
|
options.push(this.getOptionByIndex(opt));
|
1789
|
-
} else if (typeof
|
1852
|
+
} else if (typeof opt === "string") {
|
1790
1853
|
options.push(this.getOptionByValue(opt));
|
1791
1854
|
}
|
1792
1855
|
}, this);
|
@@ -1924,12 +1987,14 @@
|
|
1924
1987
|
// Append results
|
1925
1988
|
if ( !f.childElementCount ) {
|
1926
1989
|
if ( !this.config.taggable ) {
|
1927
|
-
this.
|
1990
|
+
this.noResults = true;
|
1991
|
+
this.setMessage( this.config.messages.noResults );
|
1928
1992
|
}
|
1929
1993
|
} else {
|
1930
1994
|
// Highlight top result (@binary-koan #26)
|
1931
1995
|
var prevEl = this.items[this.navIndex];
|
1932
1996
|
var firstEl = f.querySelector(".selectr-option:not(.excluded)");
|
1997
|
+
this.noResults = false;
|
1933
1998
|
|
1934
1999
|
util.removeClass( prevEl, "active" );
|
1935
2000
|
this.navIndex = firstEl.idx;
|
@@ -2057,6 +2122,7 @@
|
|
2057
2122
|
|
2058
2123
|
util.truncate(this.tree);
|
2059
2124
|
clearSearch.call(this);
|
2125
|
+
this.selected.focus();
|
2060
2126
|
};
|
2061
2127
|
|
2062
2128
|
|
@@ -2188,7 +2254,7 @@
|
|
2188
2254
|
placeholder = placeholder || this.config.placeholder || this.el.getAttribute("placeholder");
|
2189
2255
|
|
2190
2256
|
if (!this.options.length) {
|
2191
|
-
placeholder =
|
2257
|
+
placeholder = this.config.messages.noOptions;
|
2192
2258
|
}
|
2193
2259
|
|
2194
2260
|
this.placeEl.innerHTML = placeholder;
|
@@ -2282,3 +2348,4 @@
|
|
2282
2348
|
|
2283
2349
|
return Selectr;
|
2284
2350
|
}));
|
2351
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: selectr-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.4.
|
4
|
+
version: 2.4.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jesse Chavez
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-01-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|