slim-select 2.2.0 → 2.2.2
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.
- package/dist/helpers.d.ts +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/select.d.ts +1 -1
- package/dist/slimselect.cjs.js +62 -40
- package/dist/slimselect.es.js +62 -40
- package/dist/slimselect.global.js +62 -40
- package/dist/slimselect.js +62 -40
- package/dist/slimselect.min.js +1 -1
- package/dist/slimselect.umd.js +62 -40
- package/dist/slimselect.umd.min.js +1 -1
- package/package.json +1 -3
- package/src/slim-select/helpers.ts +4 -0
- package/src/slim-select/index.ts +26 -2
- package/src/slim-select/render.ts +5 -3
- package/src/slim-select/select.ts +12 -3
- package/src/vue/dist/slim-select/helpers.d.ts +5 -0
- package/src/vue/dist/slim-select/index.d.ts +45 -0
- package/src/vue/dist/slim-select/render.d.ts +116 -0
- package/src/vue/dist/slim-select/select.d.ts +33 -0
- package/src/vue/dist/slim-select/settings.d.ts +30 -0
- package/src/vue/dist/slim-select/store.d.ts +76 -0
- package/src/vue/dist/slimselectvue.es.js +114 -43
- package/src/vue/dist/slimselectvue.global.js +114 -43
- package/src/vue/dist/slimselectvue.ssr.js +114 -43
- package/src/vue/dist/vue/hello.d.ts +2 -0
- package/src/vue/dist/vue/slimselect.vue.d.ts +309 -0
- package/src/vue/package.json +2 -3
- package/src/vue/slimselect.vue +66 -2
- package/src/vue/tsconfig.json +3 -3
- package/tsconfig.json +9 -2
- package/.github/FUNDING.yml +0 -12
- package/.github/ISSUE_TEMPLATE/issue-report.md +0 -14
- package/.vscode/extensions.json +0 -3
- package/.vscode/settings.json +0 -17
- package/docs/404.html +0 -42
- package/docs/CNAME +0 -1
- package/docs/assets/check-mark.svg +0 -6
- package/docs/assets/data.js +0 -63
- package/docs/assets/home.css +0 -1
- package/docs/assets/home.js +0 -1
- package/docs/assets/index.css +0 -1
- package/docs/assets/index.js +0 -16
- package/docs/assets/index2.js +0 -358
- package/docs/assets/index3.js +0 -142
- package/docs/assets/index4.js +0 -60
- package/docs/assets/index5.js +0 -149
- package/docs/assets/install.js +0 -34
- package/docs/assets/selects.js +0 -55
- package/docs/favicon.ico +0 -0
- package/docs/index.html +0 -36
- package/public/404.html +0 -42
- package/public/CNAME +0 -1
- package/public/favicon.ico +0 -0
- package/slimselect.gif +0 -0
- package/src/docs/app.vue +0 -228
- package/src/docs/assets/images/check-mark.svg +0 -6
- package/src/docs/assets/images/chrome.svg +0 -22
- package/src/docs/assets/images/firefox.svg +0 -58
- package/src/docs/assets/images/github.png +0 -0
- package/src/docs/assets/images/ie.svg +0 -11
- package/src/docs/assets/images/npm.png +0 -0
- package/src/docs/assets/images/opera.svg +0 -15
- package/src/docs/assets/images/safari.svg +0 -22
- package/src/docs/assets/scss/_variables.scss +0 -26
- package/src/docs/assets/scss/alert.scss +0 -12
- package/src/docs/assets/scss/animations.scss +0 -8
- package/src/docs/assets/scss/button.scss +0 -21
- package/src/docs/assets/scss/index.scss +0 -8
- package/src/docs/assets/scss/input.scss +0 -3
- package/src/docs/assets/scss/layout.scss +0 -250
- package/src/docs/assets/scss/misc.scss +0 -162
- package/src/docs/assets/scss/prism.scss +0 -157
- package/src/docs/env.d.ts +0 -13
- package/src/docs/main.ts +0 -27
- package/src/docs/pages/data.vue +0 -134
- package/src/docs/pages/events/addable.vue +0 -95
- package/src/docs/pages/events/before_after_change.vue +0 -154
- package/src/docs/pages/events/before_after_open_close.vue +0 -122
- package/src/docs/pages/events/error.vue +0 -59
- package/src/docs/pages/events/index.vue +0 -33
- package/src/docs/pages/events/search.vue +0 -169
- package/src/docs/pages/events/search_filter.vue +0 -45
- package/src/docs/pages/frameworks/index.vue +0 -18
- package/src/docs/pages/frameworks/vue.vue +0 -407
- package/src/docs/pages/home.vue +0 -241
- package/src/docs/pages/install.vue +0 -105
- package/src/docs/pages/methods/destroy.vue +0 -66
- package/src/docs/pages/methods/enable_disable.vue +0 -70
- package/src/docs/pages/methods/get_data.vue +0 -82
- package/src/docs/pages/methods/get_selected.vue +0 -78
- package/src/docs/pages/methods/index.vue +0 -36
- package/src/docs/pages/methods/open_close.vue +0 -63
- package/src/docs/pages/methods/search.vue +0 -62
- package/src/docs/pages/methods/set_data.vue +0 -106
- package/src/docs/pages/methods/set_selected.vue +0 -70
- package/src/docs/pages/selects.vue +0 -213
- package/src/docs/pages/settings/always_open.vue +0 -88
- package/src/docs/pages/settings/closable.vue +0 -128
- package/src/docs/pages/settings/close_on_select.vue +0 -69
- package/src/docs/pages/settings/content_location.vue +0 -64
- package/src/docs/pages/settings/content_position.vue +0 -86
- package/src/docs/pages/settings/css.vue +0 -73
- package/src/docs/pages/settings/data_attributes.vue +0 -39
- package/src/docs/pages/settings/deselect.vue +0 -69
- package/src/docs/pages/settings/display.vue +0 -88
- package/src/docs/pages/settings/hide_selected.vue +0 -73
- package/src/docs/pages/settings/html.vue +0 -86
- package/src/docs/pages/settings/index.vue +0 -76
- package/src/docs/pages/settings/mandatory.vue +0 -91
- package/src/docs/pages/settings/min_max.vue +0 -61
- package/src/docs/pages/settings/open_position.vue +0 -60
- package/src/docs/pages/settings/placeholder.vue +0 -72
- package/src/docs/pages/settings/search.vue +0 -140
- package/src/docs/pages/settings/select.vue +0 -32
- package/src/docs/pages/settings/select_all.vue +0 -88
- package/src/docs/pages/settings/show_tooltip.vue +0 -44
- package/src/docs/pages/settings/styles.vue +0 -51
- package/src/docs/router.ts +0 -50
|
@@ -44,11 +44,50 @@ function debounce(func, wait = 50, immediate = false) {
|
|
|
44
44
|
}
|
|
45
45
|
};
|
|
46
46
|
}
|
|
47
|
+
function isEqual(a, b) {
|
|
48
|
+
return JSON.stringify(a) === JSON.stringify(b);
|
|
49
|
+
}
|
|
47
50
|
function kebabCase(str) {
|
|
48
51
|
const result = str.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g, (match) => '-' + match.toLowerCase());
|
|
49
52
|
return str[0] === str[0].toUpperCase() ? result.substring(1) : result;
|
|
50
53
|
}
|
|
51
54
|
|
|
55
|
+
class Settings {
|
|
56
|
+
constructor(settings) {
|
|
57
|
+
this.id = '';
|
|
58
|
+
this.style = '';
|
|
59
|
+
this.class = [];
|
|
60
|
+
this.isMultiple = false;
|
|
61
|
+
this.isOpen = false;
|
|
62
|
+
this.triggerFocus = true;
|
|
63
|
+
this.intervalMove = null;
|
|
64
|
+
if (!settings) {
|
|
65
|
+
settings = {};
|
|
66
|
+
}
|
|
67
|
+
this.id = 'ss-' + generateID();
|
|
68
|
+
this.style = settings.style || '';
|
|
69
|
+
this.class = settings.class || [];
|
|
70
|
+
this.isEnabled = settings.isEnabled !== undefined ? settings.isEnabled : true;
|
|
71
|
+
this.alwaysOpen = settings.alwaysOpen !== undefined ? settings.alwaysOpen : false;
|
|
72
|
+
this.showSearch = settings.showSearch !== undefined ? settings.showSearch : true;
|
|
73
|
+
this.searchPlaceholder = settings.searchPlaceholder || 'Search';
|
|
74
|
+
this.searchText = settings.searchText || 'No Results';
|
|
75
|
+
this.searchingText = settings.searchingText || 'Searching...';
|
|
76
|
+
this.searchHighlight = settings.searchHighlight !== undefined ? settings.searchHighlight : false;
|
|
77
|
+
this.closeOnSelect = settings.closeOnSelect !== undefined ? settings.closeOnSelect : true;
|
|
78
|
+
this.contentLocation = settings.contentLocation || document.body;
|
|
79
|
+
this.contentPosition = settings.contentPosition || 'absolute';
|
|
80
|
+
this.openPosition = settings.openPosition || 'auto';
|
|
81
|
+
this.placeholderText = settings.placeholderText || 'Select Value';
|
|
82
|
+
this.allowDeselect = settings.allowDeselect !== undefined ? settings.allowDeselect : false;
|
|
83
|
+
this.hideSelected = settings.hideSelected !== undefined ? settings.hideSelected : false;
|
|
84
|
+
this.showOptionTooltips = settings.showOptionTooltips !== undefined ? settings.showOptionTooltips : false;
|
|
85
|
+
this.minSelected = settings.minSelected || 0;
|
|
86
|
+
this.maxSelected = settings.maxSelected || 1000;
|
|
87
|
+
this.timeoutDelay = settings.timeoutDelay || 200;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
52
91
|
class Optgroup {
|
|
53
92
|
constructor(optgroup) {
|
|
54
93
|
this.id = !optgroup.id || optgroup.id === '' ? generateID() : optgroup.id;
|
|
@@ -942,9 +981,12 @@ class Render {
|
|
|
942
981
|
optgroupClosableSvg.classList.add(this.classes.arrow);
|
|
943
982
|
optgroupClosable.appendChild(optgroupClosableSvg);
|
|
944
983
|
const optgroupClosableArrow = document.createElementNS('http://www.w3.org/2000/svg', 'path');
|
|
945
|
-
optgroupClosableArrow.setAttribute('d', this.classes.arrow);
|
|
946
984
|
optgroupClosableSvg.appendChild(optgroupClosableArrow);
|
|
947
|
-
if (d.
|
|
985
|
+
if (d.options.some((o) => o.selected)) {
|
|
986
|
+
optgroupClosable.classList.add(this.classes.open);
|
|
987
|
+
optgroupClosableArrow.setAttribute('d', this.classes.arrowOpen);
|
|
988
|
+
}
|
|
989
|
+
else if (d.closable === 'open') {
|
|
948
990
|
optgroupEl.classList.add(this.classes.open);
|
|
949
991
|
optgroupClosableArrow.setAttribute('d', this.classes.arrowOpen);
|
|
950
992
|
}
|
|
@@ -1191,16 +1233,19 @@ class Select {
|
|
|
1191
1233
|
}
|
|
1192
1234
|
addValueChangeListener(func) {
|
|
1193
1235
|
this.onValueChange = func;
|
|
1194
|
-
this.select.addEventListener('change', this.valueChange.bind(this)
|
|
1236
|
+
this.select.addEventListener('change', this.valueChange.bind(this), {
|
|
1237
|
+
passive: true,
|
|
1238
|
+
});
|
|
1195
1239
|
}
|
|
1196
1240
|
removeValueChangeListener() {
|
|
1197
1241
|
this.onValueChange = undefined;
|
|
1198
1242
|
this.select.removeEventListener('change', this.valueChange.bind(this));
|
|
1199
1243
|
}
|
|
1200
1244
|
valueChange(ev) {
|
|
1201
|
-
if (this.onValueChange) {
|
|
1245
|
+
if (this.listen && this.onValueChange) {
|
|
1202
1246
|
this.onValueChange(this.getSelectedValues());
|
|
1203
1247
|
}
|
|
1248
|
+
return true;
|
|
1204
1249
|
}
|
|
1205
1250
|
observeWrapper(mutations) {
|
|
1206
1251
|
if (this.onSelectChange) {
|
|
@@ -1345,6 +1390,7 @@ class Select {
|
|
|
1345
1390
|
this.select.appendChild(this.createOption(d));
|
|
1346
1391
|
}
|
|
1347
1392
|
}
|
|
1393
|
+
this.select.dispatchEvent(new Event('change'));
|
|
1348
1394
|
this.changeListen(true);
|
|
1349
1395
|
}
|
|
1350
1396
|
createOptgroup(optgroup) {
|
|
@@ -1404,42 +1450,6 @@ class Select {
|
|
|
1404
1450
|
}
|
|
1405
1451
|
}
|
|
1406
1452
|
|
|
1407
|
-
class Settings {
|
|
1408
|
-
constructor(settings) {
|
|
1409
|
-
this.id = '';
|
|
1410
|
-
this.style = '';
|
|
1411
|
-
this.class = [];
|
|
1412
|
-
this.isMultiple = false;
|
|
1413
|
-
this.isOpen = false;
|
|
1414
|
-
this.triggerFocus = true;
|
|
1415
|
-
this.intervalMove = null;
|
|
1416
|
-
if (!settings) {
|
|
1417
|
-
settings = {};
|
|
1418
|
-
}
|
|
1419
|
-
this.id = 'ss-' + generateID();
|
|
1420
|
-
this.style = settings.style || '';
|
|
1421
|
-
this.class = settings.class || [];
|
|
1422
|
-
this.isEnabled = settings.isEnabled !== undefined ? settings.isEnabled : true;
|
|
1423
|
-
this.alwaysOpen = settings.alwaysOpen !== undefined ? settings.alwaysOpen : false;
|
|
1424
|
-
this.showSearch = settings.showSearch !== undefined ? settings.showSearch : true;
|
|
1425
|
-
this.searchPlaceholder = settings.searchPlaceholder || 'Search';
|
|
1426
|
-
this.searchText = settings.searchText || 'No Results';
|
|
1427
|
-
this.searchingText = settings.searchingText || 'Searching...';
|
|
1428
|
-
this.searchHighlight = settings.searchHighlight !== undefined ? settings.searchHighlight : false;
|
|
1429
|
-
this.closeOnSelect = settings.closeOnSelect !== undefined ? settings.closeOnSelect : true;
|
|
1430
|
-
this.contentLocation = settings.contentLocation || document.body;
|
|
1431
|
-
this.contentPosition = settings.contentPosition || 'absolute';
|
|
1432
|
-
this.openPosition = settings.openPosition || 'auto';
|
|
1433
|
-
this.placeholderText = settings.placeholderText || 'Select Value';
|
|
1434
|
-
this.allowDeselect = settings.allowDeselect !== undefined ? settings.allowDeselect : false;
|
|
1435
|
-
this.hideSelected = settings.hideSelected !== undefined ? settings.hideSelected : false;
|
|
1436
|
-
this.showOptionTooltips = settings.showOptionTooltips !== undefined ? settings.showOptionTooltips : false;
|
|
1437
|
-
this.minSelected = settings.minSelected || 0;
|
|
1438
|
-
this.maxSelected = settings.maxSelected || 1000;
|
|
1439
|
-
this.timeoutDelay = settings.timeoutDelay || 200;
|
|
1440
|
-
}
|
|
1441
|
-
}
|
|
1442
|
-
|
|
1443
1453
|
class SlimSelect {
|
|
1444
1454
|
constructor(config) {
|
|
1445
1455
|
this.events = {
|
|
@@ -1572,6 +1582,7 @@ class SlimSelect {
|
|
|
1572
1582
|
return this.store.getData();
|
|
1573
1583
|
}
|
|
1574
1584
|
setData(data) {
|
|
1585
|
+
const selected = this.store.getSelected();
|
|
1575
1586
|
const err = this.store.validateDataArray(data);
|
|
1576
1587
|
if (err) {
|
|
1577
1588
|
if (this.events.error) {
|
|
@@ -1584,23 +1595,34 @@ class SlimSelect {
|
|
|
1584
1595
|
this.select.updateOptions(dataClean);
|
|
1585
1596
|
this.render.renderValues();
|
|
1586
1597
|
this.render.renderOptions(dataClean);
|
|
1598
|
+
if (this.events.afterChange && !isEqual(selected, this.store.getSelected())) {
|
|
1599
|
+
this.events.afterChange(this.store.getSelectedOptions());
|
|
1600
|
+
}
|
|
1587
1601
|
}
|
|
1588
1602
|
getSelected() {
|
|
1589
1603
|
return this.store.getSelected();
|
|
1590
1604
|
}
|
|
1591
1605
|
setSelected(value) {
|
|
1606
|
+
const selected = this.store.getSelected();
|
|
1592
1607
|
this.store.setSelectedBy('value', Array.isArray(value) ? value : [value]);
|
|
1593
1608
|
const data = this.store.getData();
|
|
1594
1609
|
this.select.updateOptions(data);
|
|
1595
1610
|
this.render.renderValues();
|
|
1596
1611
|
this.render.renderOptions(data);
|
|
1612
|
+
if (this.events.afterChange && !isEqual(selected, this.store.getSelected())) {
|
|
1613
|
+
this.events.afterChange(this.store.getSelectedOptions());
|
|
1614
|
+
}
|
|
1597
1615
|
}
|
|
1598
1616
|
addOption(option) {
|
|
1617
|
+
const selected = this.store.getSelected();
|
|
1599
1618
|
this.store.addOption(option);
|
|
1600
1619
|
const data = this.store.getData();
|
|
1601
1620
|
this.select.updateOptions(data);
|
|
1602
1621
|
this.render.renderValues();
|
|
1603
1622
|
this.render.renderOptions(data);
|
|
1623
|
+
if (this.events.afterChange && !isEqual(selected, this.store.getSelected())) {
|
|
1624
|
+
this.events.afterChange(this.store.getSelectedOptions());
|
|
1625
|
+
}
|
|
1604
1626
|
}
|
|
1605
1627
|
open() {
|
|
1606
1628
|
if (!this.settings.isEnabled || this.settings.isOpen) {
|
|
@@ -1686,6 +1708,13 @@ class SlimSelect {
|
|
|
1686
1708
|
var script = defineComponent({
|
|
1687
1709
|
name: 'SlimSelect',
|
|
1688
1710
|
props: {
|
|
1711
|
+
modelValue: {
|
|
1712
|
+
type: [String, Array, undefined],
|
|
1713
|
+
},
|
|
1714
|
+
multiple: {
|
|
1715
|
+
type: Boolean,
|
|
1716
|
+
default: false,
|
|
1717
|
+
},
|
|
1689
1718
|
data: {
|
|
1690
1719
|
type: Array,
|
|
1691
1720
|
},
|
|
@@ -1696,6 +1725,7 @@ var script = defineComponent({
|
|
|
1696
1725
|
type: Object,
|
|
1697
1726
|
},
|
|
1698
1727
|
},
|
|
1728
|
+
emits: ['update:modelValue'],
|
|
1699
1729
|
data() {
|
|
1700
1730
|
return {
|
|
1701
1731
|
slim: null,
|
|
@@ -1714,7 +1744,24 @@ var script = defineComponent({
|
|
|
1714
1744
|
if (this.events) {
|
|
1715
1745
|
config.events = this.events;
|
|
1716
1746
|
}
|
|
1747
|
+
if (!config.events) {
|
|
1748
|
+
config.events = {};
|
|
1749
|
+
}
|
|
1750
|
+
const ogAfterChange = config.events.afterChange;
|
|
1751
|
+
config.events.afterChange = (newVal) => {
|
|
1752
|
+
const value = this.multiple ? newVal.map((option) => option.value) : newVal[0].value;
|
|
1753
|
+
if (this.value !== value) {
|
|
1754
|
+
this.value = value;
|
|
1755
|
+
}
|
|
1756
|
+
if (config.events && ogAfterChange) {
|
|
1757
|
+
ogAfterChange(newVal);
|
|
1758
|
+
}
|
|
1759
|
+
};
|
|
1717
1760
|
this.slim = new SlimSelect(config);
|
|
1761
|
+
let selected = this.$props.multiple ? this.slim.getSelected() : this.slim.getSelected()[0];
|
|
1762
|
+
if (this.value !== selected) {
|
|
1763
|
+
this.value = selected;
|
|
1764
|
+
}
|
|
1718
1765
|
},
|
|
1719
1766
|
beforeUnmount() {
|
|
1720
1767
|
if (this.slim) {
|
|
@@ -1731,6 +1778,27 @@ var script = defineComponent({
|
|
|
1731
1778
|
deep: true,
|
|
1732
1779
|
},
|
|
1733
1780
|
},
|
|
1781
|
+
computed: {
|
|
1782
|
+
value: {
|
|
1783
|
+
get() {
|
|
1784
|
+
const multi = this.$props.multiple;
|
|
1785
|
+
const val = this.$props.modelValue;
|
|
1786
|
+
if (val === undefined) {
|
|
1787
|
+
return multi ? [] : '';
|
|
1788
|
+
}
|
|
1789
|
+
if (multi && typeof val === 'string') {
|
|
1790
|
+
return [val];
|
|
1791
|
+
}
|
|
1792
|
+
if (!multi && Array.isArray(val)) {
|
|
1793
|
+
return val[0];
|
|
1794
|
+
}
|
|
1795
|
+
return multi ? [] : '';
|
|
1796
|
+
},
|
|
1797
|
+
set(value) {
|
|
1798
|
+
this.$emit('update:modelValue', value);
|
|
1799
|
+
},
|
|
1800
|
+
},
|
|
1801
|
+
},
|
|
1734
1802
|
methods: {
|
|
1735
1803
|
getSlimSelect() {
|
|
1736
1804
|
return this.slim;
|
|
@@ -1738,12 +1806,15 @@ var script = defineComponent({
|
|
|
1738
1806
|
},
|
|
1739
1807
|
});
|
|
1740
1808
|
|
|
1741
|
-
const _hoisted_1 =
|
|
1809
|
+
const _hoisted_1 = ["multiple"];
|
|
1742
1810
|
|
|
1743
1811
|
function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
1744
|
-
return (openBlock(), createElementBlock("select",
|
|
1812
|
+
return (openBlock(), createElementBlock("select", {
|
|
1813
|
+
multiple: _ctx.multiple,
|
|
1814
|
+
ref: "slim"
|
|
1815
|
+
}, [
|
|
1745
1816
|
renderSlot(_ctx.$slots, "default")
|
|
1746
|
-
],
|
|
1817
|
+
], 8 /* PROPS */, _hoisted_1))
|
|
1747
1818
|
}
|
|
1748
1819
|
|
|
1749
1820
|
script.render = render;
|
|
@@ -45,11 +45,50 @@ var SlimSelectVue = (function (vue) {
|
|
|
45
45
|
}
|
|
46
46
|
};
|
|
47
47
|
}
|
|
48
|
+
function isEqual(a, b) {
|
|
49
|
+
return JSON.stringify(a) === JSON.stringify(b);
|
|
50
|
+
}
|
|
48
51
|
function kebabCase(str) {
|
|
49
52
|
const result = str.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g, (match) => '-' + match.toLowerCase());
|
|
50
53
|
return str[0] === str[0].toUpperCase() ? result.substring(1) : result;
|
|
51
54
|
}
|
|
52
55
|
|
|
56
|
+
class Settings {
|
|
57
|
+
constructor(settings) {
|
|
58
|
+
this.id = '';
|
|
59
|
+
this.style = '';
|
|
60
|
+
this.class = [];
|
|
61
|
+
this.isMultiple = false;
|
|
62
|
+
this.isOpen = false;
|
|
63
|
+
this.triggerFocus = true;
|
|
64
|
+
this.intervalMove = null;
|
|
65
|
+
if (!settings) {
|
|
66
|
+
settings = {};
|
|
67
|
+
}
|
|
68
|
+
this.id = 'ss-' + generateID();
|
|
69
|
+
this.style = settings.style || '';
|
|
70
|
+
this.class = settings.class || [];
|
|
71
|
+
this.isEnabled = settings.isEnabled !== undefined ? settings.isEnabled : true;
|
|
72
|
+
this.alwaysOpen = settings.alwaysOpen !== undefined ? settings.alwaysOpen : false;
|
|
73
|
+
this.showSearch = settings.showSearch !== undefined ? settings.showSearch : true;
|
|
74
|
+
this.searchPlaceholder = settings.searchPlaceholder || 'Search';
|
|
75
|
+
this.searchText = settings.searchText || 'No Results';
|
|
76
|
+
this.searchingText = settings.searchingText || 'Searching...';
|
|
77
|
+
this.searchHighlight = settings.searchHighlight !== undefined ? settings.searchHighlight : false;
|
|
78
|
+
this.closeOnSelect = settings.closeOnSelect !== undefined ? settings.closeOnSelect : true;
|
|
79
|
+
this.contentLocation = settings.contentLocation || document.body;
|
|
80
|
+
this.contentPosition = settings.contentPosition || 'absolute';
|
|
81
|
+
this.openPosition = settings.openPosition || 'auto';
|
|
82
|
+
this.placeholderText = settings.placeholderText || 'Select Value';
|
|
83
|
+
this.allowDeselect = settings.allowDeselect !== undefined ? settings.allowDeselect : false;
|
|
84
|
+
this.hideSelected = settings.hideSelected !== undefined ? settings.hideSelected : false;
|
|
85
|
+
this.showOptionTooltips = settings.showOptionTooltips !== undefined ? settings.showOptionTooltips : false;
|
|
86
|
+
this.minSelected = settings.minSelected || 0;
|
|
87
|
+
this.maxSelected = settings.maxSelected || 1000;
|
|
88
|
+
this.timeoutDelay = settings.timeoutDelay || 200;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
53
92
|
class Optgroup {
|
|
54
93
|
constructor(optgroup) {
|
|
55
94
|
this.id = !optgroup.id || optgroup.id === '' ? generateID() : optgroup.id;
|
|
@@ -943,9 +982,12 @@ var SlimSelectVue = (function (vue) {
|
|
|
943
982
|
optgroupClosableSvg.classList.add(this.classes.arrow);
|
|
944
983
|
optgroupClosable.appendChild(optgroupClosableSvg);
|
|
945
984
|
const optgroupClosableArrow = document.createElementNS('http://www.w3.org/2000/svg', 'path');
|
|
946
|
-
optgroupClosableArrow.setAttribute('d', this.classes.arrow);
|
|
947
985
|
optgroupClosableSvg.appendChild(optgroupClosableArrow);
|
|
948
|
-
if (d.
|
|
986
|
+
if (d.options.some((o) => o.selected)) {
|
|
987
|
+
optgroupClosable.classList.add(this.classes.open);
|
|
988
|
+
optgroupClosableArrow.setAttribute('d', this.classes.arrowOpen);
|
|
989
|
+
}
|
|
990
|
+
else if (d.closable === 'open') {
|
|
949
991
|
optgroupEl.classList.add(this.classes.open);
|
|
950
992
|
optgroupClosableArrow.setAttribute('d', this.classes.arrowOpen);
|
|
951
993
|
}
|
|
@@ -1192,16 +1234,19 @@ var SlimSelectVue = (function (vue) {
|
|
|
1192
1234
|
}
|
|
1193
1235
|
addValueChangeListener(func) {
|
|
1194
1236
|
this.onValueChange = func;
|
|
1195
|
-
this.select.addEventListener('change', this.valueChange.bind(this)
|
|
1237
|
+
this.select.addEventListener('change', this.valueChange.bind(this), {
|
|
1238
|
+
passive: true,
|
|
1239
|
+
});
|
|
1196
1240
|
}
|
|
1197
1241
|
removeValueChangeListener() {
|
|
1198
1242
|
this.onValueChange = undefined;
|
|
1199
1243
|
this.select.removeEventListener('change', this.valueChange.bind(this));
|
|
1200
1244
|
}
|
|
1201
1245
|
valueChange(ev) {
|
|
1202
|
-
if (this.onValueChange) {
|
|
1246
|
+
if (this.listen && this.onValueChange) {
|
|
1203
1247
|
this.onValueChange(this.getSelectedValues());
|
|
1204
1248
|
}
|
|
1249
|
+
return true;
|
|
1205
1250
|
}
|
|
1206
1251
|
observeWrapper(mutations) {
|
|
1207
1252
|
if (this.onSelectChange) {
|
|
@@ -1346,6 +1391,7 @@ var SlimSelectVue = (function (vue) {
|
|
|
1346
1391
|
this.select.appendChild(this.createOption(d));
|
|
1347
1392
|
}
|
|
1348
1393
|
}
|
|
1394
|
+
this.select.dispatchEvent(new Event('change'));
|
|
1349
1395
|
this.changeListen(true);
|
|
1350
1396
|
}
|
|
1351
1397
|
createOptgroup(optgroup) {
|
|
@@ -1405,42 +1451,6 @@ var SlimSelectVue = (function (vue) {
|
|
|
1405
1451
|
}
|
|
1406
1452
|
}
|
|
1407
1453
|
|
|
1408
|
-
class Settings {
|
|
1409
|
-
constructor(settings) {
|
|
1410
|
-
this.id = '';
|
|
1411
|
-
this.style = '';
|
|
1412
|
-
this.class = [];
|
|
1413
|
-
this.isMultiple = false;
|
|
1414
|
-
this.isOpen = false;
|
|
1415
|
-
this.triggerFocus = true;
|
|
1416
|
-
this.intervalMove = null;
|
|
1417
|
-
if (!settings) {
|
|
1418
|
-
settings = {};
|
|
1419
|
-
}
|
|
1420
|
-
this.id = 'ss-' + generateID();
|
|
1421
|
-
this.style = settings.style || '';
|
|
1422
|
-
this.class = settings.class || [];
|
|
1423
|
-
this.isEnabled = settings.isEnabled !== undefined ? settings.isEnabled : true;
|
|
1424
|
-
this.alwaysOpen = settings.alwaysOpen !== undefined ? settings.alwaysOpen : false;
|
|
1425
|
-
this.showSearch = settings.showSearch !== undefined ? settings.showSearch : true;
|
|
1426
|
-
this.searchPlaceholder = settings.searchPlaceholder || 'Search';
|
|
1427
|
-
this.searchText = settings.searchText || 'No Results';
|
|
1428
|
-
this.searchingText = settings.searchingText || 'Searching...';
|
|
1429
|
-
this.searchHighlight = settings.searchHighlight !== undefined ? settings.searchHighlight : false;
|
|
1430
|
-
this.closeOnSelect = settings.closeOnSelect !== undefined ? settings.closeOnSelect : true;
|
|
1431
|
-
this.contentLocation = settings.contentLocation || document.body;
|
|
1432
|
-
this.contentPosition = settings.contentPosition || 'absolute';
|
|
1433
|
-
this.openPosition = settings.openPosition || 'auto';
|
|
1434
|
-
this.placeholderText = settings.placeholderText || 'Select Value';
|
|
1435
|
-
this.allowDeselect = settings.allowDeselect !== undefined ? settings.allowDeselect : false;
|
|
1436
|
-
this.hideSelected = settings.hideSelected !== undefined ? settings.hideSelected : false;
|
|
1437
|
-
this.showOptionTooltips = settings.showOptionTooltips !== undefined ? settings.showOptionTooltips : false;
|
|
1438
|
-
this.minSelected = settings.minSelected || 0;
|
|
1439
|
-
this.maxSelected = settings.maxSelected || 1000;
|
|
1440
|
-
this.timeoutDelay = settings.timeoutDelay || 200;
|
|
1441
|
-
}
|
|
1442
|
-
}
|
|
1443
|
-
|
|
1444
1454
|
class SlimSelect {
|
|
1445
1455
|
constructor(config) {
|
|
1446
1456
|
this.events = {
|
|
@@ -1573,6 +1583,7 @@ var SlimSelectVue = (function (vue) {
|
|
|
1573
1583
|
return this.store.getData();
|
|
1574
1584
|
}
|
|
1575
1585
|
setData(data) {
|
|
1586
|
+
const selected = this.store.getSelected();
|
|
1576
1587
|
const err = this.store.validateDataArray(data);
|
|
1577
1588
|
if (err) {
|
|
1578
1589
|
if (this.events.error) {
|
|
@@ -1585,23 +1596,34 @@ var SlimSelectVue = (function (vue) {
|
|
|
1585
1596
|
this.select.updateOptions(dataClean);
|
|
1586
1597
|
this.render.renderValues();
|
|
1587
1598
|
this.render.renderOptions(dataClean);
|
|
1599
|
+
if (this.events.afterChange && !isEqual(selected, this.store.getSelected())) {
|
|
1600
|
+
this.events.afterChange(this.store.getSelectedOptions());
|
|
1601
|
+
}
|
|
1588
1602
|
}
|
|
1589
1603
|
getSelected() {
|
|
1590
1604
|
return this.store.getSelected();
|
|
1591
1605
|
}
|
|
1592
1606
|
setSelected(value) {
|
|
1607
|
+
const selected = this.store.getSelected();
|
|
1593
1608
|
this.store.setSelectedBy('value', Array.isArray(value) ? value : [value]);
|
|
1594
1609
|
const data = this.store.getData();
|
|
1595
1610
|
this.select.updateOptions(data);
|
|
1596
1611
|
this.render.renderValues();
|
|
1597
1612
|
this.render.renderOptions(data);
|
|
1613
|
+
if (this.events.afterChange && !isEqual(selected, this.store.getSelected())) {
|
|
1614
|
+
this.events.afterChange(this.store.getSelectedOptions());
|
|
1615
|
+
}
|
|
1598
1616
|
}
|
|
1599
1617
|
addOption(option) {
|
|
1618
|
+
const selected = this.store.getSelected();
|
|
1600
1619
|
this.store.addOption(option);
|
|
1601
1620
|
const data = this.store.getData();
|
|
1602
1621
|
this.select.updateOptions(data);
|
|
1603
1622
|
this.render.renderValues();
|
|
1604
1623
|
this.render.renderOptions(data);
|
|
1624
|
+
if (this.events.afterChange && !isEqual(selected, this.store.getSelected())) {
|
|
1625
|
+
this.events.afterChange(this.store.getSelectedOptions());
|
|
1626
|
+
}
|
|
1605
1627
|
}
|
|
1606
1628
|
open() {
|
|
1607
1629
|
if (!this.settings.isEnabled || this.settings.isOpen) {
|
|
@@ -1687,6 +1709,13 @@ var SlimSelectVue = (function (vue) {
|
|
|
1687
1709
|
var script = vue.defineComponent({
|
|
1688
1710
|
name: 'SlimSelect',
|
|
1689
1711
|
props: {
|
|
1712
|
+
modelValue: {
|
|
1713
|
+
type: [String, Array, undefined],
|
|
1714
|
+
},
|
|
1715
|
+
multiple: {
|
|
1716
|
+
type: Boolean,
|
|
1717
|
+
default: false,
|
|
1718
|
+
},
|
|
1690
1719
|
data: {
|
|
1691
1720
|
type: Array,
|
|
1692
1721
|
},
|
|
@@ -1697,6 +1726,7 @@ var SlimSelectVue = (function (vue) {
|
|
|
1697
1726
|
type: Object,
|
|
1698
1727
|
},
|
|
1699
1728
|
},
|
|
1729
|
+
emits: ['update:modelValue'],
|
|
1700
1730
|
data() {
|
|
1701
1731
|
return {
|
|
1702
1732
|
slim: null,
|
|
@@ -1715,7 +1745,24 @@ var SlimSelectVue = (function (vue) {
|
|
|
1715
1745
|
if (this.events) {
|
|
1716
1746
|
config.events = this.events;
|
|
1717
1747
|
}
|
|
1748
|
+
if (!config.events) {
|
|
1749
|
+
config.events = {};
|
|
1750
|
+
}
|
|
1751
|
+
const ogAfterChange = config.events.afterChange;
|
|
1752
|
+
config.events.afterChange = (newVal) => {
|
|
1753
|
+
const value = this.multiple ? newVal.map((option) => option.value) : newVal[0].value;
|
|
1754
|
+
if (this.value !== value) {
|
|
1755
|
+
this.value = value;
|
|
1756
|
+
}
|
|
1757
|
+
if (config.events && ogAfterChange) {
|
|
1758
|
+
ogAfterChange(newVal);
|
|
1759
|
+
}
|
|
1760
|
+
};
|
|
1718
1761
|
this.slim = new SlimSelect(config);
|
|
1762
|
+
let selected = this.$props.multiple ? this.slim.getSelected() : this.slim.getSelected()[0];
|
|
1763
|
+
if (this.value !== selected) {
|
|
1764
|
+
this.value = selected;
|
|
1765
|
+
}
|
|
1719
1766
|
},
|
|
1720
1767
|
beforeUnmount() {
|
|
1721
1768
|
if (this.slim) {
|
|
@@ -1732,6 +1779,27 @@ var SlimSelectVue = (function (vue) {
|
|
|
1732
1779
|
deep: true,
|
|
1733
1780
|
},
|
|
1734
1781
|
},
|
|
1782
|
+
computed: {
|
|
1783
|
+
value: {
|
|
1784
|
+
get() {
|
|
1785
|
+
const multi = this.$props.multiple;
|
|
1786
|
+
const val = this.$props.modelValue;
|
|
1787
|
+
if (val === undefined) {
|
|
1788
|
+
return multi ? [] : '';
|
|
1789
|
+
}
|
|
1790
|
+
if (multi && typeof val === 'string') {
|
|
1791
|
+
return [val];
|
|
1792
|
+
}
|
|
1793
|
+
if (!multi && Array.isArray(val)) {
|
|
1794
|
+
return val[0];
|
|
1795
|
+
}
|
|
1796
|
+
return multi ? [] : '';
|
|
1797
|
+
},
|
|
1798
|
+
set(value) {
|
|
1799
|
+
this.$emit('update:modelValue', value);
|
|
1800
|
+
},
|
|
1801
|
+
},
|
|
1802
|
+
},
|
|
1735
1803
|
methods: {
|
|
1736
1804
|
getSlimSelect() {
|
|
1737
1805
|
return this.slim;
|
|
@@ -1739,12 +1807,15 @@ var SlimSelectVue = (function (vue) {
|
|
|
1739
1807
|
},
|
|
1740
1808
|
});
|
|
1741
1809
|
|
|
1742
|
-
const _hoisted_1 =
|
|
1810
|
+
const _hoisted_1 = ["multiple"];
|
|
1743
1811
|
|
|
1744
1812
|
function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
1745
|
-
return (vue.openBlock(), vue.createElementBlock("select",
|
|
1813
|
+
return (vue.openBlock(), vue.createElementBlock("select", {
|
|
1814
|
+
multiple: _ctx.multiple,
|
|
1815
|
+
ref: "slim"
|
|
1816
|
+
}, [
|
|
1746
1817
|
vue.renderSlot(_ctx.$slots, "default")
|
|
1747
|
-
],
|
|
1818
|
+
], 8 /* PROPS */, _hoisted_1))
|
|
1748
1819
|
}
|
|
1749
1820
|
|
|
1750
1821
|
script.render = render;
|