slim-select 2.0.2 → 2.2.0

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.
Files changed (66) hide show
  1. package/README.md +8 -0
  2. package/dist/index.d.ts +1 -1
  3. package/dist/render.d.ts +10 -3
  4. package/dist/select.d.ts +6 -6
  5. package/dist/settings.d.ts +0 -3
  6. package/dist/slimselect.cjs.js +202 -67
  7. package/dist/slimselect.css +1 -1
  8. package/dist/slimselect.css.map +1 -1
  9. package/dist/slimselect.es.js +202 -67
  10. package/dist/slimselect.global.js +202 -67
  11. package/dist/slimselect.js +202 -67
  12. package/dist/slimselect.min.js +1 -1
  13. package/dist/slimselect.umd.js +202 -67
  14. package/dist/slimselect.umd.min.js +1 -1
  15. package/dist/store.d.ts +5 -0
  16. package/docs/assets/data.js +7 -3
  17. package/docs/assets/home.css +1 -1
  18. package/docs/assets/home.js +1 -1
  19. package/docs/assets/index.css +1 -1
  20. package/docs/assets/index.js +7 -7
  21. package/docs/assets/index2.js +119 -35
  22. package/docs/assets/index3.js +39 -23
  23. package/docs/assets/index4.js +1 -1
  24. package/docs/assets/index5.js +147 -9
  25. package/docs/assets/install.js +4 -4
  26. package/docs/assets/selects.js +1 -1
  27. package/package.json +11 -3
  28. package/src/docs/app.vue +6 -5
  29. package/src/docs/{images → assets/images}/check-mark.svg +0 -0
  30. package/src/docs/{images → assets/images}/chrome.svg +0 -0
  31. package/src/docs/{images → assets/images}/firefox.svg +0 -0
  32. package/src/docs/{images → assets/images}/github.png +0 -0
  33. package/src/docs/{images → assets/images}/ie.svg +0 -0
  34. package/src/docs/{images → assets/images}/npm.png +0 -0
  35. package/src/docs/{images → assets/images}/opera.svg +0 -0
  36. package/src/docs/{images → assets/images}/safari.svg +0 -0
  37. package/src/docs/assets/scss/misc.scss +7 -0
  38. package/src/docs/env.d.ts +1 -0
  39. package/src/docs/pages/data.vue +4 -0
  40. package/src/docs/pages/events/addable.vue +22 -6
  41. package/src/docs/pages/events/before_after_change.vue +15 -1
  42. package/src/docs/pages/events/search.vue +31 -16
  43. package/src/docs/pages/frameworks/vue.vue +375 -7
  44. package/src/docs/pages/home.vue +104 -57
  45. package/src/docs/pages/methods/get_data.vue +2 -1
  46. package/src/docs/pages/methods/open_close.vue +1 -1
  47. package/src/docs/pages/settings/closable.vue +128 -0
  48. package/src/docs/pages/settings/index.vue +6 -3
  49. package/src/docs/pages/settings/select_all.vue +88 -0
  50. package/src/slim-select/index.ts +4 -2
  51. package/src/slim-select/render.ts +247 -59
  52. package/src/slim-select/rollup.config.mjs +5 -0
  53. package/src/slim-select/select.ts +48 -31
  54. package/src/slim-select/settings.ts +0 -4
  55. package/src/slim-select/slimselect.scss +112 -11
  56. package/src/slim-select/store.ts +19 -1
  57. package/src/vue/README.md +48 -0
  58. package/src/vue/dist/slimselectvue.es.js +1752 -0
  59. package/src/vue/dist/slimselectvue.global.js +1755 -0
  60. package/src/vue/dist/slimselectvue.ssr.js +1754 -0
  61. package/src/vue/hello.ts +5 -0
  62. package/src/vue/package.json +28 -0
  63. package/src/vue/rollup.config.mjs +44 -0
  64. package/src/vue/slimselect.vue +39 -5
  65. package/src/vue/tsconfig.json +14 -0
  66. package/src/docs/pages/settings/select_by_group.vue +0 -46
@@ -54,6 +54,8 @@ var SlimSelect = (function () {
54
54
  constructor(optgroup) {
55
55
  this.id = !optgroup.id || optgroup.id === '' ? generateID() : optgroup.id;
56
56
  this.label = optgroup.label || '';
57
+ this.selectAll = optgroup.selectAll === undefined ? false : optgroup.selectAll;
58
+ this.closable = optgroup.closable || 'off';
57
59
  this.options = [];
58
60
  if (optgroup.options) {
59
61
  for (const o of optgroup.options) {
@@ -200,6 +202,14 @@ var SlimSelect = (function () {
200
202
  });
201
203
  return selectedIDs;
202
204
  }
205
+ getOptgroupByID(id) {
206
+ for (let dataObj of this.data) {
207
+ if (dataObj instanceof Optgroup && dataObj.id === id) {
208
+ return dataObj;
209
+ }
210
+ }
211
+ return null;
212
+ }
203
213
  getOptionByID(id) {
204
214
  let options = this.filter((opt) => {
205
215
  return opt.id === id;
@@ -234,7 +244,7 @@ var SlimSelect = (function () {
234
244
  }
235
245
  });
236
246
  if (optOptions.length > 0) {
237
- dataSearch.push(new Optgroup({ id: dataObj.id, label: dataObj.label, options: optOptions }));
247
+ dataSearch.push(new Optgroup(dataObj));
238
248
  }
239
249
  }
240
250
  }
@@ -275,11 +285,18 @@ var SlimSelect = (function () {
275
285
  list: 'ss-list',
276
286
  optgroup: 'ss-optgroup',
277
287
  optgroupLabel: 'ss-optgroup-label',
278
- optgroupSelectable: 'ss-optgroup-selectable',
288
+ optgroupLabelText: 'ss-optgroup-label-text',
289
+ optgroupActions: 'ss-optgroup-actions',
290
+ optgroupSelectAll: 'ss-selectall',
291
+ optgroupSelectAllBox: 'M60,10 L10,10 L10,90 L90,90 L90,50',
292
+ optgroupSelectAllCheck: 'M30,45 L50,70 L90,10',
293
+ optgroupClosable: 'ss-closable',
279
294
  option: 'ss-option',
280
- optionSelected: 'ss-option-selected',
281
295
  optionDelete: 'M10,10 L90,90 M10,90 L90,10',
282
296
  highlighted: 'ss-highlighted',
297
+ open: 'ss-open',
298
+ close: 'ss-close',
299
+ selected: 'ss-selected',
283
300
  error: 'ss-error',
284
301
  disabled: 'ss-disabled',
285
302
  hide: 'ss-hide',
@@ -289,8 +306,6 @@ var SlimSelect = (function () {
289
306
  this.callbacks = callbacks;
290
307
  this.main = this.mainDiv();
291
308
  this.content = this.contentDiv();
292
- this.renderValues();
293
- this.renderOptions(this.store.getData());
294
309
  this.settings.contentLocation.appendChild(this.content.main);
295
310
  }
296
311
  enable() {
@@ -398,7 +413,21 @@ var SlimSelect = (function () {
398
413
  if (!this.settings.isEnabled) {
399
414
  return;
400
415
  }
401
- this.callbacks.setSelected(['']);
416
+ let shouldDelete = true;
417
+ const before = this.store.getSelectedOptions();
418
+ const after = [];
419
+ if (this.callbacks.beforeChange) {
420
+ shouldDelete = this.callbacks.beforeChange(after, before) === true;
421
+ }
422
+ if (shouldDelete) {
423
+ this.callbacks.setSelected(['']);
424
+ if (this.settings.closeOnSelect) {
425
+ this.callbacks.close();
426
+ }
427
+ if (this.callbacks.afterChange) {
428
+ this.callbacks.afterChange(after);
429
+ }
430
+ }
402
431
  };
403
432
  const deselectSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
404
433
  deselectSvg.setAttribute('viewBox', '0 0 100 100');
@@ -704,23 +733,48 @@ var SlimSelect = (function () {
704
733
  this.content.search.input.focus();
705
734
  return;
706
735
  }
736
+ const runFinish = (oo) => {
737
+ let newOption = new Option(oo);
738
+ this.callbacks.addOption(newOption);
739
+ if (this.settings.isMultiple) {
740
+ let values = this.store.getSelected();
741
+ values.push(newOption.value);
742
+ this.callbacks.setSelected(values);
743
+ }
744
+ else {
745
+ this.callbacks.setSelected([newOption.value]);
746
+ }
747
+ this.callbacks.search('');
748
+ if (this.settings.closeOnSelect) {
749
+ setTimeout(() => {
750
+ this.callbacks.close();
751
+ }, 100);
752
+ }
753
+ };
707
754
  const addableValue = this.callbacks.addable(inputValue);
708
- if (typeof addableValue === 'string') {
709
- this.callbacks.addOption(new Option({
755
+ if (addableValue instanceof Promise) {
756
+ addableValue.then((value) => {
757
+ if (typeof value === 'string') {
758
+ runFinish({
759
+ text: value,
760
+ value: value,
761
+ });
762
+ }
763
+ else {
764
+ runFinish(value);
765
+ }
766
+ });
767
+ }
768
+ else if (typeof addableValue === 'string') {
769
+ runFinish({
710
770
  text: addableValue,
711
771
  value: addableValue,
712
- }));
772
+ });
713
773
  }
714
774
  else {
715
- this.callbacks.addOption(new Option(addableValue));
716
- }
717
- this.callbacks.setSelected([inputValue]);
718
- this.callbacks.search('');
719
- if (this.settings.closeOnSelect) {
720
- setTimeout(() => {
721
- this.callbacks.close();
722
- }, 100);
775
+ runFinish(addableValue);
723
776
  }
777
+ return;
724
778
  };
725
779
  main.appendChild(addable);
726
780
  searchReturn.addable = {
@@ -764,25 +818,23 @@ var SlimSelect = (function () {
764
818
  }
765
819
  for (let i = 0; i < options.length; i++) {
766
820
  if (options[i].classList.contains(this.classes.highlighted)) {
767
- options[i].classList.remove(this.classes.highlighted);
768
- if (dir === 'down') {
769
- if (i + 1 < options.length) {
770
- options[i + 1].classList.add(this.classes.highlighted);
771
- this.ensureElementInView(this.content.list, options[i + 1]);
772
- }
773
- else {
774
- options[0].classList.add(this.classes.highlighted);
775
- this.ensureElementInView(this.content.list, options[0]);
821
+ const prevOption = options[i];
822
+ prevOption.classList.remove(this.classes.highlighted);
823
+ const prevParent = prevOption.parentElement;
824
+ if (prevParent && prevParent.classList.contains(this.classes.open)) {
825
+ const optgroupLabel = prevParent.querySelector('.' + this.classes.optgroupLabel);
826
+ if (optgroupLabel) {
827
+ optgroupLabel.click();
776
828
  }
777
829
  }
778
- else {
779
- if (i - 1 >= 0) {
780
- options[i - 1].classList.add(this.classes.highlighted);
781
- this.ensureElementInView(this.content.list, options[i - 1]);
782
- }
783
- else {
784
- options[options.length - 1].classList.add(this.classes.highlighted);
785
- this.ensureElementInView(this.content.list, options[options.length - 1]);
830
+ let selectOption = options[dir === 'down' ? (i + 1 < options.length ? i + 1 : 0) : i - 1 >= 0 ? i - 1 : options.length - 1];
831
+ selectOption.classList.add(this.classes.highlighted);
832
+ this.ensureElementInView(this.content.list, selectOption);
833
+ const selectParent = selectOption.parentElement;
834
+ if (selectParent && selectParent.classList.contains(this.classes.close)) {
835
+ const optgroupLabel = selectParent.querySelector('.' + this.classes.optgroupLabel);
836
+ if (optgroupLabel) {
837
+ optgroupLabel.click();
786
838
  }
787
839
  }
788
840
  return;
@@ -827,18 +879,95 @@ var SlimSelect = (function () {
827
879
  optgroupEl.classList.add(this.classes.optgroup);
828
880
  const optgroupLabel = document.createElement('div');
829
881
  optgroupLabel.classList.add(this.classes.optgroupLabel);
830
- optgroupLabel.innerHTML = d.label;
831
- if (this.settings.selectByGroup && this.settings.isMultiple) {
832
- optgroupLabel.classList.add(this.classes.optgroupSelectable);
882
+ optgroupEl.appendChild(optgroupLabel);
883
+ const optgroupLabelText = document.createElement('div');
884
+ optgroupLabelText.classList.add(this.classes.optgroupLabelText);
885
+ optgroupLabelText.textContent = d.label;
886
+ optgroupLabel.appendChild(optgroupLabelText);
887
+ const optgroupActions = document.createElement('div');
888
+ optgroupActions.classList.add(this.classes.optgroupActions);
889
+ optgroupLabel.appendChild(optgroupActions);
890
+ if (this.settings.isMultiple && d.selectAll) {
891
+ const selectAll = document.createElement('div');
892
+ selectAll.classList.add(this.classes.optgroupSelectAll);
893
+ let allSelected = true;
894
+ for (const o of d.options) {
895
+ if (!o.selected) {
896
+ allSelected = false;
897
+ break;
898
+ }
899
+ }
900
+ if (allSelected) {
901
+ selectAll.classList.add(this.classes.selected);
902
+ }
903
+ const selectAllText = document.createElement('span');
904
+ selectAllText.textContent = 'Select All';
905
+ selectAll.appendChild(selectAllText);
906
+ const selectAllSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
907
+ selectAllSvg.setAttribute('viewBox', '0 0 100 100');
908
+ selectAll.appendChild(selectAllSvg);
909
+ const selectAllBox = document.createElementNS('http://www.w3.org/2000/svg', 'path');
910
+ selectAllBox.setAttribute('d', this.classes.optgroupSelectAllBox);
911
+ selectAllSvg.appendChild(selectAllBox);
912
+ const selectAllCheck = document.createElementNS('http://www.w3.org/2000/svg', 'path');
913
+ selectAllCheck.setAttribute('d', this.classes.optgroupSelectAllCheck);
914
+ selectAllSvg.appendChild(selectAllCheck);
915
+ selectAll.addEventListener('click', (e) => {
916
+ e.preventDefault();
917
+ e.stopPropagation();
918
+ const currentSelected = this.store.getSelected();
919
+ if (allSelected) {
920
+ const newSelected = currentSelected.filter((s) => {
921
+ for (const o of d.options) {
922
+ if (s === o.value) {
923
+ return false;
924
+ }
925
+ }
926
+ return true;
927
+ });
928
+ this.callbacks.setSelected(newSelected);
929
+ return;
930
+ }
931
+ else {
932
+ const newSelected = currentSelected.concat(d.options.map((o) => o.value));
933
+ this.callbacks.setSelected(newSelected);
934
+ }
935
+ });
936
+ optgroupActions.appendChild(selectAll);
937
+ }
938
+ if (d.closable !== 'off') {
939
+ const optgroupClosable = document.createElement('div');
940
+ optgroupClosable.classList.add(this.classes.optgroupClosable);
941
+ const optgroupClosableSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
942
+ optgroupClosableSvg.setAttribute('viewBox', '0 0 100 100');
943
+ optgroupClosableSvg.classList.add(this.classes.arrow);
944
+ optgroupClosable.appendChild(optgroupClosableSvg);
945
+ const optgroupClosableArrow = document.createElementNS('http://www.w3.org/2000/svg', 'path');
946
+ optgroupClosableArrow.setAttribute('d', this.classes.arrow);
947
+ optgroupClosableSvg.appendChild(optgroupClosableArrow);
948
+ if (d.closable === 'open') {
949
+ optgroupEl.classList.add(this.classes.open);
950
+ optgroupClosableArrow.setAttribute('d', this.classes.arrowOpen);
951
+ }
952
+ else if (d.closable === 'close') {
953
+ optgroupEl.classList.add(this.classes.close);
954
+ optgroupClosableArrow.setAttribute('d', this.classes.arrowClose);
955
+ }
833
956
  optgroupLabel.addEventListener('click', (e) => {
834
957
  e.preventDefault();
835
958
  e.stopPropagation();
836
- for (const childEl of optgroupEl.children) {
837
- if (childEl.className.indexOf(this.classes.option) !== -1) {
838
- childEl.click();
839
- }
959
+ if (optgroupEl.classList.contains(this.classes.close)) {
960
+ optgroupEl.classList.remove(this.classes.close);
961
+ optgroupEl.classList.add(this.classes.open);
962
+ optgroupClosableArrow.setAttribute('d', this.classes.arrowOpen);
963
+ }
964
+ else {
965
+ optgroupEl.classList.remove(this.classes.open);
966
+ optgroupEl.classList.add(this.classes.close);
967
+ optgroupClosableArrow.setAttribute('d', this.classes.arrowClose);
840
968
  }
841
969
  });
970
+ optgroupActions.appendChild(optgroupClosable);
842
971
  }
843
972
  optgroupEl.appendChild(optgroupLabel);
844
973
  for (const o of d.options) {
@@ -890,10 +1019,10 @@ var SlimSelect = (function () {
890
1019
  optionEl.classList.add(this.classes.hide);
891
1020
  }
892
1021
  if (option.selected) {
893
- optionEl.classList.add(this.classes.optionSelected);
1022
+ optionEl.classList.add(this.classes.selected);
894
1023
  }
895
1024
  else {
896
- optionEl.classList.remove(this.classes.optionSelected);
1025
+ optionEl.classList.remove(this.classes.selected);
897
1026
  }
898
1027
  optionEl.addEventListener('click', (e) => {
899
1028
  e.preventDefault();
@@ -1076,7 +1205,9 @@ var SlimSelect = (function () {
1076
1205
  }
1077
1206
  observeWrapper(mutations) {
1078
1207
  if (this.onSelectChange) {
1208
+ this.changeListen(false);
1079
1209
  this.onSelectChange(this.getData());
1210
+ this.changeListen(true);
1080
1211
  }
1081
1212
  }
1082
1213
  addObserver() {
@@ -1084,15 +1215,12 @@ var SlimSelect = (function () {
1084
1215
  this.disconnectObserver();
1085
1216
  this.observer = null;
1086
1217
  }
1087
- this.observer = new MutationObserver(this.observeWrapper);
1218
+ this.observer = new MutationObserver(this.observeWrapper.bind(this));
1088
1219
  }
1089
1220
  connectObserver() {
1090
1221
  if (this.observer) {
1091
1222
  this.observer.observe(this.select, {
1092
- attributes: true,
1093
1223
  childList: true,
1094
- characterData: true,
1095
- subtree: true,
1096
1224
  });
1097
1225
  }
1098
1226
  }
@@ -1116,8 +1244,10 @@ var SlimSelect = (function () {
1116
1244
  }
1117
1245
  getDataFromOptgroup(optgroup) {
1118
1246
  let data = {
1119
- id: '',
1247
+ id: (optgroup.dataset ? optgroup.dataset.id : false) || '',
1120
1248
  label: optgroup.label,
1249
+ selectAll: optgroup.dataset ? optgroup.dataset.selectall === 'true' : false,
1250
+ closable: optgroup.dataset ? optgroup.dataset.closable : 'off',
1121
1251
  options: [],
1122
1252
  };
1123
1253
  const options = optgroup.childNodes;
@@ -1128,6 +1258,22 @@ var SlimSelect = (function () {
1128
1258
  }
1129
1259
  return data;
1130
1260
  }
1261
+ getDataFromOption(option) {
1262
+ return {
1263
+ id: (option.dataset ? option.dataset.id : false) || '',
1264
+ value: option.value,
1265
+ text: option.text,
1266
+ html: option.innerHTML,
1267
+ selected: option.selected,
1268
+ display: option.style.display === 'none' ? false : true,
1269
+ disabled: option.disabled,
1270
+ mandatory: option.dataset ? option.dataset.mandatory === 'true' : false,
1271
+ placeholder: option.dataset.placeholder === 'true',
1272
+ class: option.className,
1273
+ style: option.style.cssText,
1274
+ data: option.dataset,
1275
+ };
1276
+ }
1131
1277
  getSelectedValues() {
1132
1278
  let values = [];
1133
1279
  const options = this.select.childNodes;
@@ -1152,22 +1298,6 @@ var SlimSelect = (function () {
1152
1298
  }
1153
1299
  return values;
1154
1300
  }
1155
- getDataFromOption(option) {
1156
- return {
1157
- id: (option.dataset ? option.dataset.id : false) || generateID(),
1158
- value: option.value,
1159
- text: option.text,
1160
- html: option.innerHTML,
1161
- selected: option.selected,
1162
- display: option.style.display === 'none' ? false : true,
1163
- disabled: option.disabled,
1164
- mandatory: option.dataset ? option.dataset.mandatory === 'true' : false,
1165
- placeholder: option.dataset.placeholder === 'true',
1166
- class: option.className,
1167
- style: option.style.cssText,
1168
- data: option.dataset,
1169
- };
1170
- }
1171
1301
  setSelected(value) {
1172
1302
  const options = this.select.childNodes;
1173
1303
  for (const o of options) {
@@ -1222,6 +1352,12 @@ var SlimSelect = (function () {
1222
1352
  const optgroupEl = document.createElement('optgroup');
1223
1353
  optgroupEl.id = optgroup.id;
1224
1354
  optgroupEl.label = optgroup.label;
1355
+ if (optgroup.selectAll) {
1356
+ optgroupEl.dataset.selectAll = 'true';
1357
+ }
1358
+ if (optgroup.closable !== 'off') {
1359
+ optgroupEl.dataset.closable = optgroup.closable;
1360
+ }
1225
1361
  if (optgroup.options) {
1226
1362
  for (const o of optgroup.options) {
1227
1363
  optgroupEl.appendChild(this.createOption(o));
@@ -1278,8 +1414,6 @@ var SlimSelect = (function () {
1278
1414
  this.isOpen = false;
1279
1415
  this.triggerFocus = true;
1280
1416
  this.intervalMove = null;
1281
- this.mainHeight = 30;
1282
- this.contentHeight = 0;
1283
1417
  if (!settings) {
1284
1418
  settings = {};
1285
1419
  }
@@ -1301,7 +1435,6 @@ var SlimSelect = (function () {
1301
1435
  this.allowDeselect = settings.allowDeselect !== undefined ? settings.allowDeselect : false;
1302
1436
  this.hideSelected = settings.hideSelected !== undefined ? settings.hideSelected : false;
1303
1437
  this.showOptionTooltips = settings.showOptionTooltips !== undefined ? settings.showOptionTooltips : false;
1304
- this.selectByGroup = settings.selectByGroup !== undefined ? settings.selectByGroup : false;
1305
1438
  this.minSelected = settings.minSelected || 0;
1306
1439
  this.maxSelected = settings.maxSelected || 1000;
1307
1440
  this.timeoutDelay = settings.timeoutDelay || 200;
@@ -1408,6 +1541,8 @@ var SlimSelect = (function () {
1408
1541
  afterChange: this.events.afterChange,
1409
1542
  };
1410
1543
  this.render = new Render(this.settings, this.store, callbacks);
1544
+ this.render.renderValues();
1545
+ this.render.renderOptions(this.store.getData());
1411
1546
  if (this.selectEl.parentNode) {
1412
1547
  this.selectEl.parentNode.insertBefore(this.render.main.main, this.selectEl.nextSibling);
1413
1548
  }