@kamranbaylarov/one-select 1.1.0 → 1.1.1

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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # 🎯 OneSelect - jQuery Multi-Select Dropdown Component
2
2
 
3
- **Version:** 1.2.0 | **Author:** Kamran Baylarov
3
+ **Version:** 1.1.1 | **Author:** Kamran Baylarov
4
4
 
5
5
  A powerful, flexible, and feature-rich multi-select dropdown component for jQuery.
6
6
 
@@ -40,7 +40,8 @@ OneSelect is a powerful **jQuery-based** plugin that provides multi-select funct
40
40
  - 🎪 **Multiple Instances** - Independent selects on same page
41
41
  - 🌪 **Click Outside** - Close dropdown when clicking outside (default: true)
42
42
  - 📍 **Smart Positioning** - Dropdown positioned with `position: fixed` using viewport coordinates
43
- - 🔀 **Horizontal Scroll Detection** - Automatically closes on any horizontal scroll to prevent misalignment
43
+ - 🔀 **Horizontal Scroll Detection** - Automatically closes on horizontal scroll (Apple devices: 100px threshold, others: immediate)
44
+ - 🍎 **Cross-Platform** - Smart device detection for Apple touchpad/mouse compatibility
44
45
 
45
46
  ---
46
47
 
@@ -149,7 +150,7 @@ $('#mySelect').oneSelect({
149
150
  | `searchPlaceholder` | String | `'Search...'` | Search input placeholder text |
150
151
  | `searchUrl` | String/null | `null` | URL for AJAX search (GET request with `q` parameter) |
151
152
  | `searchDebounceDelay` | Number | `300` | Delay in milliseconds for search debounce |
152
- | `closeOnScroll` | Boolean | `false` | Close dropdown on page scroll |
153
+ | `closeOnScroll` | Boolean | `false` | Close dropdown on **vertical** page scroll (horizontal scroll has independent behavior) |
153
154
  | `closeOnOutside` | Boolean | `true` | Close dropdown when clicking outside |
154
155
  | `submitForm` | Boolean | `false` | Submit form on OK click |
155
156
  | `submitOnOutside` | Boolean | `false` | Submit form on outside click |
package/js/one-select.js CHANGED
@@ -459,6 +459,15 @@
459
459
  attachEvents: function() {
460
460
  var self = this;
461
461
 
462
+ // Detect Apple device (macOS/iOS)
463
+ var isAppleDevice = navigator.platform.toUpperCase().indexOf('MAC') >= 0 ||
464
+ navigator.platform.toUpperCase().indexOf('IPHONE') >= 0 ||
465
+ navigator.platform.toUpperCase().indexOf('IPAD') >= 0 ||
466
+ navigator.userAgent.indexOf('Macintosh') !== -1;
467
+
468
+ // Set threshold based on device (100px for Apple, 0 for others)
469
+ var horizontalScrollThreshold = isAppleDevice ? 100 : 0;
470
+
462
471
  this.trigger.on('click', function(e) {
463
472
  e.stopPropagation();
464
473
  self.toggle();
@@ -513,13 +522,14 @@
513
522
 
514
523
  // Global horizontal scroll handler - close dropdown on any horizontal scroll
515
524
  // Listen for wheel events with horizontal delta
525
+ // This is independent of closeOnScroll setting
516
526
  $(document).on('wheel.onescroll', function(e) {
517
527
  if (!self.wrapper.hasClass('open')) {
518
528
  return;
519
529
  }
520
530
 
521
- // Check if horizontal scrolling (deltaX != 0)
522
- if (e.originalEvent && Math.abs(e.originalEvent.deltaX) > 0) {
531
+ // Check if horizontal scrolling (deltaX > threshold)
532
+ if (e.originalEvent && Math.abs(e.originalEvent.deltaX) > horizontalScrollThreshold) {
523
533
  self.close();
524
534
  }
525
535
  });
@@ -4,4 +4,4 @@
4
4
  * https://github.com/KamranBeylarov/one-select
5
5
  * Licensed under MIT
6
6
  */
7
- !function(e){"use strict";"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof module&&module.exports?module.exports=function(t,n){return void 0===n&&(n="undefined"!=typeof window?require("jquery"):require("jquery")(t)),e(n),n}:e(window.jQuery||window.$)}(function(e){"use strict";var t={},n="oneSelect";function i(t,n){var i;return function(){var a=this,o=arguments;clearTimeout(i),i=setTimeout(function(){t.apply(a,o)},n)}}var a=function(e,n){this.element=e,this.$element=e(e),this.instanceId="ones-"+Math.random().toString(36).substr(2,9);var i=this.readDataAttributes();this.settings=e.extend({},o.defaults,n,i),this.init()};o.defaults={placeholder:"Select options...",selectAllText:"Select All",okText:"OK",cancelText:"Cancel",data:[],value:null,showCheckbox:!0,showBadges:!1,showBadgesExternal:null,showSearch:!1,searchPlaceholder:"Search...",searchUrl:null,searchDebounceDelay:300,closeOnScroll:!1,closeOnOutside:!0,submitForm:!1,submitOnOutside:!1,formId:null,name:null,multiple:!0,ajax:null,autoLoad:!0,beforeLoad:null,afterLoad:null,onLoadError:null,onChange:null,onSelect:null,onOk:null,onCancel:null},o.prototype={readDataAttributes:function(){var t=this,n={},i={"ones-placeholder":"placeholder","ones-select-all-text":"selectAllText","ones-ok-text":"okText","ones-cancel-text":"cancelText","ones-data":"data","ones-value":"value","ones-name":"name","ones-multiple":"multiple","ones-show-checkbox":"showCheckbox","ones-show-badges":"showBadges","ones-show-badges-external":"showBadgesExternal","ones-show-search":"showSearch","ones-search-placeholder":"searchPlaceholder","ones-search-url":"searchUrl","ones-search-debounce-delay":"searchDebounceDelay","ones-close-on-scroll":"closeOnScroll","ones-close-on-outside":"closeOnOutside","ones-submit-form":"submitForm","ones-submit-on-outside":"submitOnOutside","ones-form-id":"formId","ones-auto-load":"autoLoad"};return e.each(i,function(i,a){var o=t.$element.data(i);if(void 0!==o)if("data"===a||"value"===a)if("string"==typeof o)try{n[a]=JSON.parse(o)}catch(e){console.warn("OneSelect: Invalid JSON for "+i,o),n[a]=o}else n[a]=o;else if("multiple"===a||"showCheckbox"===a||"showBadges"===a||"showSearch"===a||"closeOnScroll"===a||"closeOnOutside"===a||"submitForm"===a||"submitOnOutside"===a||"autoLoad"===a)n[a]="string"==typeof o?"true"===o||"1"===o:!!o;else if("searchDebounceDelay"===a)n[a]="string"==typeof o?parseInt(o,10)||300:o||300;else n[a]=o});var a=this.$element.data("ones-ajax");if(a)"string"==typeof a?try{n.ajax=JSON.parse(a)}catch(e){console.warn("OneSelect: Invalid JSON for ones-ajax",a)}:n.ajax=a;return n},init:function(){t[this.instanceId]=this,null!==this.settings.value&&void 0!==this.settings.value?Array.isArray(this.settings.value)||(this.settings.value=[this.settings.value]):this.settings.value=[],this.wrapper=this.createWrapper(),this.trigger=this.createTrigger(),this.dropdown=this.createDropdown(),this.searchInput=this.createSearchInput(),this.optionsContainer=this.createOptionsContainer(),this.buttons=this.createButtons(),this.build(),this.attachEvents(),this.settings.ajax&&this.settings.autoLoad&&this.loadData()},build:function(){this.settings.showSearch&&this.dropdown.append(this.searchInput),this.dropdown.append(this.optionsContainer),this.dropdown.append(this.buttons),this.wrapper.append(this.trigger),this.$element.append(this.wrapper),e("body").append(this.dropdown),this.renderOptions(),this.updateTriggerText(),this.updateHiddenInputs()},updateHiddenInputs:function(){if(this.settings.name){var t=this.settings.formId?e("#"+this.settings.formId):this.$element.closest("form"),n=t.length?t:this.wrapper;n.find('input.cms-hidden-input[data-cms-input="'+this.settings.name+'"]').remove();var i=this.settings.name;this.settings.multiple&&-1===i.indexOf("[")&&(i+="[]");for(var a=this.getSelectedValues(),o=this,s=0;s<a.length;s++)n.append(e('<input type="hidden" class="cms-hidden-input">').attr("name",i).attr("value",a[s]).attr("data-cms-input",this.settings.name).attr("data-cms-value",a[s]))}},createWrapper:function(){return e('<div class="cms-wrapper"></div>')},createTrigger:function(){return e('<div class="cms-trigger"><span class="cms-selected-text cms-placeholder">'+this.settings.placeholder+"</span></div>")},createDropdown:function(){return e('<div class="cms-dropdown"></div>')},createSearchInput:function(){return e('<div class="cms-search-wrapper"><input type="text" class="cms-search-input" placeholder="'+this.settings.searchPlaceholder+'" /></div>')},createOptionsContainer:function(){return e('<div class="cms-options-container"></div>')},createButtons:function(){var t=e('<div class="cms-buttons"></div>');return this.okBtn=e('<button class="cms-btn cms-btn-ok">'+this.settings.okText+"</button>"),this.cancelBtn=e('<button class="cms-btn cms-btn-cancel">'+this.settings.cancelText+"</button>"),t.append(this.okBtn),t.append(this.cancelBtn),t},renderOptions:function(){this.optionsContainer.empty();var t=this.createOption("select-all",this.settings.selectAllText,!1);this.optionsContainer.append(t);var n=this;e.each(this.settings.data,function(e,t){var i=e,a=t,o=-1!==e.inArray(i,n.settings.value),s=n.createOption(i,a,o);n.optionsContainer.append(s)}),this.updateSelectAllState()},createOption:function(e,t,n){var i="cms-option";this.settings.showCheckbox||(i+=" cms-hide-checkbox"),n&&"select-all"!==e&&(i+=" selected");var a=e('<div class="'+i+'" data-value="'+e+'"></div>'),o=e('<input type="checkbox" value="'+e+'"'+(n?" checked":"")+">"),s=e("<label>"+t+"</label>");return a.append(o),a.append(s),a},filterOptions:function(t){var n=this.optionsContainer.find('.cms-option:not([data-value="select-all"])');""===t?n.show():n.each(function(){var n=e(this),i=n.find("label").text().toLowerCase();-1!==i.indexOf(t)?n.show():n.hide()})},performAjaxSearch:function(t){var n=this;this.optionsContainer.addClass("cms-loading"),e.ajax({url:this.settings.searchUrl,method:"GET",data:{q:t},dataType:"json",success:function(t){var i=t;"object"==typeof t&&t.data?i=t.data:"object"==typeof t&&t.results&&(i=t.results),n.updateSearchResults(i||[]),n.optionsContainer.removeClass("cms-loading")},error:function(e,t,i){console.error("OneSelect: Search error",i),n.optionsContainer.removeClass("cms-loading"),n.settings.onLoadError&&n.settings.onLoadError.call(n,e,t,i)}})},updateSearchResults:function(t){this.optionsContainer.find('.cms-option:not([data-value="select-all"])').remove();var n=this;e.each(t,function(e,t){var i=e,a=t,o=-1!==e.inArray(i,n.settings.value),s=n.createOption(i,a,o);n.optionsContainer.append(s)}),this.updateSelectAllState()},attachEvents:function(){var t=this;this.trigger.on("click",function(e){e.stopPropagation(),t.toggle()}),this.settings.showSearch&&(this.settings.searchUrl?(e=".search-input",n=i(function(e){t.performAjaxSearch(e)},t.settings.searchDebounceDelay),t.searchInput.find(".cms-search-input").on("keyup",function(){var t=e(this).val();t.length>0?n(t):t.filterOptions("")})):t.searchInput.find(".cms-search-input").on("keyup",function(){var e=e(this).val().toLowerCase();t.filterOptions(e)})),e(window).on("resize.cms",function(){t.wrapper.hasClass("open")&&t.updateDropdownPosition()}),this.settings.closeOnScroll?e(window).on("scroll.cms",function(){t.wrapper.hasClass("open")&&t.close()}):e(window).on("scroll.cms",function(){t.wrapper.hasClass("open")&&t.updateDropdownPosition()}),e(document).on("wheel.onescroll",function(e){!t.wrapper.hasClass("open")||e.originalEvent&&0!==Math.abs(e.originalEvent.deltaX)||t.close()}),t._detectHorizontalScroll=function(){if(t.wrapper.hasClass("open")){if(window.scrollX!==t._lastWindowScrollX){if(t._lastWindowScrollX=window.scrollX,t._lastWindowScrollX>0)return void t.close()}for(var e=document.querySelectorAll("*"),n=0;n<e.length;n++){var i=e[n],a=function(e){return e===document?"document":e===document.documentElement?"html":e===document.body?"body":e.tagName+"-"+(e.id||e.className||Math.random().toString(36).substr(2,9))}(i);if(void 0!==t._elementScrollPositions[a]){var o=i.scrollLeft;if(o!==t._elementScrollPositions[a])return void t.close()}}}},t._elementScrollPositions={},t._lastWindowScrollX=window.scrollX,t._elementScrollPositions={},t._lastWindowScrollX=window.scrollX;for(var o=t.open.bind(t),s=t.close.bind(t),a=function(e){return e===document?"document":e===document.documentElement?"html":e===document.body?"body":e.tagName+"-"+(e.id||e.className||Math.random().toString(36).substr(2,9))},o=function(){t._elementScrollPositions={},t._lastWindowScrollX=window.scrollX;for(var e=document.querySelectorAll("*"),n=0;n<e.length;n++){var i=e[n];i.scrollWidth>i.clientWidth||i.scrollHeight>i.clientHeight?t._elementScrollPositions[a(i)]=i.scrollLeft:void 0}t._horizontalScrollInterval&&(clearInterval(t._horizontalScrollInterval),t._horizontalScrollInterval=null),t._horizontalScrollInterval=setInterval(function(){t._detectHorizontalScroll()},50),o()},t.close=function(){t._horizontalScrollInterval&&(clearInterval(t._horizontalScrollInterval),t._horizontalScrollInterval=null),t._elementScrollPositions={},s()},e(window).on("click.ones",function(e){if(t.settings.closeOnOutside&&t.wrapper.hasClass("open")){0===e(e.target).closest(".cms-wrapper").length&&0===e(e.target).closest(".cms-dropdown").length&&(t.settings.submitOnOutside&&(t.updateTriggerText(),t.settings.onOk&&t.settings.onOk.call(t,t.getSelectedValues(),t.getSelectedLabels()),t.submitForm()),t.close())}}),this.optionsContainer.on("click",".cms-option",function(e){e.stopPropagation();var n=e(this),i=n.find('input[type="checkbox"]');e(e.target).is('input[type="checkbox"]')||(i.prop("checked",!i.prop("checked")),t.handleOptionChange(n))}),this.optionsContainer.on("change",'input[type="checkbox"]',function(e){e.stopPropagation();var n=e(e.target).closest(".cms-option");t.handleOptionChange(n)}),this.okBtn.on("click",function(e){e.stopPropagation(),t.handleOk()}),this.cancelBtn.on("click",function(e){e.stopPropagation(),t.handleCancel()})},handleOptionChange:function(e){var t=e.data("value");if("select-all"===t){var n=e.find('input[type="checkbox"]');this.handleSelectAll(n.prop("checked"))}else{var i=e.find('input[type="checkbox"]');i.prop("checked")?e.addClass("selected"):e.removeClass("selected");var a=this;setTimeout(function(){a.updateSelectAllState(),a.updateTriggerText()},0)}this.updateHiddenInputs(),this.settings.onChange&&this.settings.onChange.call(this,this.getSelectedValues(),this.getSelectedLabels()),this.settings.onSelect&&this.settings.onSelect.call(this,this.getSelectedValues())},handleSelectAll:function(e){var t=this;this.optionsContainer.find('.cms-option:not([data-value="select-all"])').each(function(){var n=e(this);n.find('input[type="checkbox"]').prop("checked",e),e?n.addClass("selected"):n.removeClass("selected")}),this.updateSelectAllState(),this.updateTriggerText(),this.updateHiddenInputs()},updateSelectAllState:function(){var e=this.optionsContainer.find('.cms-option:not([data-value="select-all"]) input[type="checkbox"]'),t=e.filter(":checked"),n=e.length,i=t.length,a=this.optionsContainer.find('.cms-option[data-value="select-all"] input[type="checkbox"]');a.prop("indeterminate",!1),a.prop("checked",!1),0===i||i===n&&n>0?a.prop("checked",!0):a.prop("indeterminate",!0)},getSelectedValues:function(){var t=[];return this.optionsContainer.find('.cms-option:not([data-value="select-all"]) input[type="checkbox"]:checked').each(function(){var n=e(this).val();isNaN(n)&&""!==n||(n=Number(n)),t.push(n)}),t},getSelectedLabels:function(){var t=[];return this.optionsContainer.find('.cms-option:not([data-value="select-all"]) input[type="checkbox"]:checked').siblings("label").each(function(){t.push(e(this).text())}),t},updateTriggerText:function(){var e=this.getSelectedLabels(),t=this.getSelectedValues(),n=this.trigger.find(".cms-selected-text");0===e.length?n.empty().text(this.settings.placeholder).addClass("cms-placeholder"):this.settings.showBadges?(n.empty().removeClass("cms-placeholder");var i=this;e.each(t,function(e,t){var a=i,o=e('<span class="cms-badge"></span>'),s=e("<span></span>").text(t[e]),r=e('<button type="button" class="cms-badge-remove">&times;</button>');r.on("click",function(e){e.stopPropagation(),i.unselect(t)}),o.append(s),o.append(r),n.append(o)})):n.empty().removeClass("cms-placeholder"),n.text(e.length+" items selected"),this.updateExternalBadges(t,e)},updateExternalBadges:function(t,n){if(this.settings.showBadgesExternal){var i=e("#"+this.settings.showBadgesExternal);if(0!==i.length){if(i.empty(),0===t.length)return;var a=this;e.each(t,function(e,t){var o=a,s=e('<span class="cms-badge"></span>'),r=e("<span></span>").text(n[e]),l=e('<button type="button" class="cms-badge-remove">&times;</button>');l.on("click",function(e){e.preventDefault(),e.stopPropagation(),a.unselect(t)}),s.append(r),s.append(l),i.append(s)})}}},toggle:function(){this.wrapper.hasClass("open")?this.close():this.open()},open:function(){e(".cms-wrapper.open").not(this.wrapper).removeClass("open"),e(".cms-dropdown.open").not(this.dropdown).removeClass("open"),this.updateDropdownPosition(),this.wrapper.addClass("open"),this.dropdown.addClass("open")},updateDropdownPosition:function(){var e=this.wrapper[0].getBoundingClientRect(),t=this.wrapper.outerWidth();this.dropdown.css({position:"fixed",top:e.bottom+"px",left:e.left+"px",width:t+"px"})},close:function(){this.wrapper.removeClass("open"),this.dropdown.removeClass("open")},handleOk:function(){this.updateTriggerText();var e=this.getSelectedValues(),t=this.getSelectedLabels();this.settings.onOk&&this.settings.onOk.call(this,e,t),this.settings.submitForm&&this.submitForm(),this.close()},submitForm:function(){var e=null;if(this.settings.formId?(e=e("#"+this.settings.formId),0===e.length&&console.warn('OneSelect: Form with ID "'+this.settings.formId+'" not found')):(e=this.$element.closest("form"),0===e.length&&console.warn("OneSelect: No parent form found")),0!==e.length&&e[0].submit()},handleCancel:function(){this.settings.value=[],this.optionsContainer.find('input[type="checkbox"]').prop("checked",!1),this.optionsContainer.find(".cms-option").removeClass("selected"),this.updateSelectAllState(),this.updateTriggerText(),this.updateHiddenInputs(),this.settings.onCancel&&this.settings.onCancel.call(this),this.settings.submitForm&&this.submitForm(),this.close()},setValue:function(e){this.settings.value=e||[],this.renderOptions(),this.updateTriggerText(),this.updateHiddenInputs()},getValue:function(){return this.getSelectedValues()},updateData:function(e){this.settings.data=e||[],this.settings.value=[],this.renderOptions(),this.updateTriggerText(),this.updateHiddenInputs()},loadData:function(t,n,i){var a=this,o=t||this.settings.ajax;if(o&&o.url){if(this.settings.beforeLoad&&this.settings.beforeLoad.call(this),this.trigger.find(".cms-selected-text").text("Loading..."),!o.url)return void console.error("OneSelect: Ajax configuration or url is missing");var s=e.extend(!0,{url:o.url,method:o.method||"GET",data:o.data||{},dataType:o.dataType||"json",success:function(e){var t=e;"object"==typeof e&&e.data?t=e.data:"object"==typeof e&&e.results&&(t=e.results),a.settings.data=t||[],a.renderOptions(),a.updateTriggerText(),a.settings.afterLoad&&a.settings.afterLoad.call(a,t,e),n&&n.call(a,t,e)},error:function(e,t,n){a.trigger.find(".cms-selected-text").text("Error loading data"),a.settings.onLoadError&&a.settings.onLoadError.call(a,e,t,n),i&&i.call(a,e,t,n)}},o);o.success&&(s.success=function(e){o.success(e),t(e)}),o.error&&(s.error=function(e,t,n){o.error(e,t,n),t(e,t,n)}),e.ajax(s)}else console.error("OneSelect: Ajax configuration or url is missing")},reload:function(){this.settings.ajax?this.loadData():console.warn("OneSelect: No ajax configuration found")},select:function(e){var t=this.optionsContainer.find('.cms-option:not([data-value="select-all"]) input[type="checkbox"][value="'+e+'"]');t.length&&(t.prop("checked",!0),t.closest(".cms-option").addClass("selected"),this.updateSelectAllState(),this.updateTriggerText(),this.updateHiddenInputs())},unselect:function(e){var t=this.optionsContainer.find('.cms-option:not([data-value="select-all"]) input[type="checkbox"][value="'+e+'"]');t.length&&(t.prop("checked",!1),t.closest(".cms-option").removeClass("selected"),this.updateSelectAllState(),this.updateTriggerText(),this.updateHiddenInputs())},selectAll:function(){this.handleSelectAll(!0)},unselectAll:function(){this.handleSelectAll(!1)},toggleSelection:function(e){var t=this.optionsContainer.find('.cms-option:not([data-value="select-all"]) input[type="checkbox"][value="'+e+'"]');if(t.length){var n=t.prop("checked");t.prop("checked",!n);var i=t.closest(".cms-option");n?i.removeClass("selected"):i.addClass("selected"),this.updateSelectAllState(),this.updateTriggerText(),this.updateHiddenInputs()}},getInstanceId:function(){return this.instanceId},destroy:function(){delete t[this.instanceId],e(window).off(".cms"),e(window).off(".ones"),e(document).off(".onescroll"),this.trigger.off(),this.okBtn.off(),this.cancelBtn.off(),this.optionsContainer.off(),this._horizontalScrollInterval&&(clearInterval(this._horizontalScrollInterval),this._horizontalScrollInterval=null),e('input.cms-hidden-input[data-cms-input="'+this.settings.name+'"]').remove(),this.wrapper.remove(),this.dropdown.remove(),this.$element.removeData(n)}},o.getInstance=function(e){return t[e]||null},o.getAllInstances=function(){return t},e.fn[n]=function(t){var i=arguments,a=this;return this.each(function(){var o=e(this),s=o.data(n);s||"object"!=typeof t&&t||(s=new o(this,t),o.data(n,s)),"string"==typeof t&&("value"===t?void 0!==i[1]?(s.setValue(i[1]),a=o):a=s.getValue():"getValues"===t?a=s.getSelectedValues():"getLabels"===t?a=s.getSelectedLabels():"getInstanceId"===t?a=s.getInstanceId():"updateData"===t?s.updateData(i[1]):"loadData"===t?s.loadData(i[1],i[2],i[3]):"reload"===t?s.reload():"select"===t?s.select(i[1]):"unselect"===t?s.unselect(i[1]):"selectAll"===t?s.selectAll():"unselectAll"===t?s.unselectAll():"toggleSelection"===t?s.toggleSelection(i[1]):"open"===t?s.open():"close"===t?s.close():"destroy"===t&&s.destroy())}),a},e.fn[n].Constructor=o,e.fn[n].getInstance=o.getInstance,e.fn[n].getAllInstances=o.getAllInstances});
7
+ !function(e){"use strict";"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof module&&module.exports?module.exports=function(t,n){return void 0===n&&(n="undefined"!=typeof window?require("jquery"):require("jquery")(t)),e(n),n}:e(window.jQuery||window.$)}(function(e){"use strict";var t={},n="oneSelect";function i(t,n){var i;return function(){var a=this,o=arguments;clearTimeout(i),i=setTimeout(function(){t.apply(a,o)},n)}}var a=function(e,n){this.element=e,this.$element=e(e),this.instanceId="ones-"+Math.random().toString(36).substr(2,9);var i=this.readDataAttributes();this.settings=e.extend({},o.defaults,n,i),this.init()};o.defaults={placeholder:"Select options...",selectAllText:"Select All",okText:"OK",cancelText:"Cancel",data:[],value:null,showCheckbox:!0,showBadges:!1,showBadgesExternal:null,showSearch:!1,searchPlaceholder:"Search...",searchUrl:null,searchDebounceDelay:300,closeOnScroll:!1,closeOnOutside:!0,submitForm:!1,submitOnOutside:!1,formId:null,name:null,multiple:!0,ajax:null,autoLoad:!0,beforeLoad:null,afterLoad:null,onLoadError:null,onChange:null,onSelect:null,onOk:null,onCancel:null},o.prototype={readDataAttributes:function(){var t=this,n={},i={"ones-placeholder":"placeholder","ones-select-all-text":"selectAllText","ones-ok-text":"okText","ones-cancel-text":"cancelText","ones-data":"data","ones-value":"value","ones-name":"name","ones-multiple":"multiple","ones-show-checkbox":"showCheckbox","ones-show-badges":"showBadges","ones-show-badges-external":"showBadgesExternal","ones-show-search":"showSearch","ones-search-placeholder":"searchPlaceholder","ones-search-url":"searchUrl","ones-search-debounce-delay":"searchDebounceDelay","ones-close-on-scroll":"closeOnScroll","ones-close-on-outside":"closeOnOutside","ones-submit-form":"submitForm","ones-submit-on-outside":"submitOnOutside","ones-form-id":"formId","ones-auto-load":"autoLoad"};return e.each(i,function(i,a){var o=t.$element.data(i);if(void 0!==o)if("data"===a||"value"===a)if("string"==typeof o)try{n[a]=JSON.parse(o)}catch(e){console.warn("OneSelect: Invalid JSON for "+i,o),n[a]=o}else n[a]=o;else if("multiple"===a||"showCheckbox"===a||"showBadges"===a||"showSearch"===a||"closeOnScroll"===a||"closeOnOutside"===a||"submitForm"===a||"submitOnOutside"===a||"autoLoad"===a)n[a]="string"==typeof o?"true"===o||"1"===o:!!o;else if("searchDebounceDelay"===a)n[a]="string"==typeof o?parseInt(o,10)||300:o||300;else n[a]=o});var a=this.$element.data("ones-ajax");if(a)"string"==typeof a?try{n.ajax=JSON.parse(a)}catch(e){console.warn("OneSelect: Invalid JSON for ones-ajax",a)}:n.ajax=a;return n},init:function(){t[this.instanceId]=this,null!==this.settings.value&&void 0!==this.settings.value?Array.isArray(this.settings.value)||(this.settings.value=[this.settings.value]):this.settings.value=[],this.wrapper=this.createWrapper(),this.trigger=this.createTrigger(),this.dropdown=this.createDropdown(),this.searchInput=this.createSearchInput(),this.optionsContainer=this.createOptionsContainer(),this.buttons=this.createButtons(),this.build(),this.attachEvents(),this.settings.ajax&&this.settings.autoLoad&&this.loadData()},build:function(){this.settings.showSearch&&this.dropdown.append(this.searchInput),this.dropdown.append(this.optionsContainer),this.dropdown.append(this.buttons),this.wrapper.append(this.trigger),this.$element.append(this.wrapper),e("body").append(this.dropdown),this.renderOptions(),this.updateTriggerText(),this.updateHiddenInputs()},updateHiddenInputs:function(){if(this.settings.name){var t=this.settings.formId?e("#"+this.settings.formId):this.$element.closest("form"),n=t.length?t:this.wrapper;n.find('input.cms-hidden-input[data-cms-input="'+this.settings.name+'"]').remove();var i=this.settings.name;this.settings.multiple&&-1===i.indexOf("[")&&(i+="[]");for(var a=this.getSelectedValues(),o=this,s=0;s<a.length;s++)n.append(e('<input type="hidden" class="cms-hidden-input">').attr("name",i).attr("value",a[s]).attr("data-cms-input",this.settings.name).attr("data-cms-value",a[s]))}},createWrapper:function(){return e('<div class="cms-wrapper"></div>')},createTrigger:function(){return e('<div class="cms-trigger"><span class="cms-selected-text cms-placeholder">'+this.settings.placeholder+"</span></div>")},createDropdown:function(){return e('<div class="cms-dropdown"></div>')},createSearchInput:function(){return e('<div class="cms-search-wrapper"><input type="text" class="cms-search-input" placeholder="'+this.settings.searchPlaceholder+'" /></div>')},createOptionsContainer:function(){return e('<div class="cms-options-container"></div>')},createButtons:function(){var t=e('<div class="cms-buttons"></div>');return this.okBtn=e('<button class="cms-btn cms-btn-ok">'+this.settings.okText+"</button>"),this.cancelBtn=e('<button class="cms-btn cms-btn-cancel">'+this.settings.cancelText+"</button>"),t.append(this.okBtn),t.append(this.cancelBtn),t},renderOptions:function(){this.optionsContainer.empty();var t=this.createOption("select-all",this.settings.selectAllText,!1);this.optionsContainer.append(t);var n=this;e.each(this.settings.data,function(e,t){var i=e,a=t,o=-1!==e.inArray(i,n.settings.value),s=n.createOption(i,a,o);n.optionsContainer.append(s)}),this.updateSelectAllState()},createOption:function(e,t,n){var i="cms-option";this.settings.showCheckbox||(i+=" cms-hide-checkbox"),n&&"select-all"!==e&&(i+=" selected");var a=e('<div class="'+i+'" data-value="'+e+'"></div>'),o=e('<input type="checkbox" value="'+e+'"'+(n?" checked":"")+">"),s=e("<label>"+t+"</label>");return a.append(o),a.append(s),a},filterOptions:function(t){var n=this.optionsContainer.find('.cms-option:not([data-value="select-all"])');""===t?n.show():n.each(function(){var n=e(this),i=n.find("label").text().toLowerCase();-1!==i.indexOf(t)?n.show():n.hide()})},performAjaxSearch:function(t){var n=this;this.optionsContainer.addClass("cms-loading"),e.ajax({url:this.settings.searchUrl,method:"GET",data:{q:t},dataType:"json",success:function(t){var i=t;"object"==typeof t&&t.data?i=t.data:"object"==typeof t&&t.results&&(i=t.results),n.updateSearchResults(i||[]),n.optionsContainer.removeClass("cms-loading")},error:function(e,t,i){console.error("OneSelect: Search error",i),n.optionsContainer.removeClass("cms-loading"),n.settings.onLoadError&&n.settings.onLoadError.call(n,e,t,i)}})},updateSearchResults:function(t){this.optionsContainer.find('.cms-option:not([data-value="select-all"])').remove();var n=this;e.each(t,function(e,t){var i=e,a=t,o=-1!==e.inArray(i,n.settings.value),s=n.createOption(i,a,o);n.optionsContainer.append(s)}),this.updateSelectAllState()},attachEvents:function(){var t=this,n=navigator.platform.toUpperCase().indexOf("MAC")>=0||navigator.platform.toUpperCase().indexOf("IPHONE")>=0||navigator.platform.toUpperCase().indexOf("IPAD")>=0||navigator.userAgent.indexOf("Macintosh")!==-1,a=n?100:0;this.trigger.on("click",function(e){e.stopPropagation(),t.toggle()}),this.settings.showSearch&&(this.settings.searchUrl?(e=".search-input",n=i(function(e){t.performAjaxSearch(e)},t.settings.searchDebounceDelay),t.searchInput.find(".cms-search-input").on("keyup",function(){var t=e(this).val();t.length>0?n(t):t.filterOptions("")})):t.searchInput.find(".cms-search-input").on("keyup",function(){var e=e(this).val().toLowerCase();t.filterOptions(e)})),e(window).on("resize.cms",function(){t.wrapper.hasClass("open")&&t.updateDropdownPosition()}),this.settings.closeOnScroll?e(window).on("scroll.cms",function(){t.wrapper.hasClass("open")&&t.close()}):e(window).on("scroll.cms",function(){t.wrapper.hasClass("open")&&t.updateDropdownPosition()}),e(document).on("wheel.onescroll",function(e){!t.wrapper.hasClass("open")||e.originalEvent&&Math.abs(e.originalEvent.deltaX)<=a||t.close()}),t._detectHorizontalScroll=function(){if(t.wrapper.hasClass("open")){if(window.scrollX!==t._lastWindowScrollX){if(t._lastWindowScrollX=window.scrollX,t._lastWindowScrollX>0)return void t.close()}for(var e=document.querySelectorAll("*"),n=0;n<e.length;n++){var i=e[n],o=function(e){return e===document?"document":e===document.documentElement?"html":e===document.body?"body":e.tagName+"-"+(e.id||e.className||Math.random().toString(36).substr(2,9))}(i);if(void 0!==t._elementScrollPositions[o]){var s=i.scrollLeft;if(s!==t._elementScrollPositions[o])return void t.close()}}}},t._elementScrollPositions={},t._lastWindowScrollX=window.scrollX,t._elementScrollPositions={},t._lastWindowScrollX=window.scrollX;for(var o=t.open.bind(t),s=t.close.bind(t),a=function(e){return e===document?"document":e===document.documentElement?"html":e===document.body?"body":e.tagName+"-"+(e.id||e.className||Math.random().toString(36).substr(2,9))},o=function(){t._elementScrollPositions={},t._lastWindowScrollX=window.scrollX;for(var e=document.querySelectorAll("*"),n=0;n<e.length;n++){var i=e[n];i.scrollWidth>i.clientWidth||i.scrollHeight>i.clientHeight?t._elementScrollPositions[a(i)]=i.scrollLeft:void 0}t._horizontalScrollInterval&&(clearInterval(t._horizontalScrollInterval),t._horizontalScrollInterval=null),t._horizontalScrollInterval=setInterval(function(){t._detectHorizontalScroll()},50),o()},t.close=function(){t._horizontalScrollInterval&&(clearInterval(t._horizontalScrollInterval),t._horizontalScrollInterval=null),t._elementScrollPositions={},s()},e(window).on("click.ones",function(e){if(t.settings.closeOnOutside&&t.wrapper.hasClass("open")){0===e(e.target).closest(".cms-wrapper").length&&0===e(e.target).closest(".cms-dropdown").length&&(t.settings.submitOnOutside&&(t.updateTriggerText(),t.settings.onOk&&t.settings.onOk.call(t,t.getSelectedValues(),t.getSelectedLabels()),t.submitForm()),t.close())}}),this.optionsContainer.on("click",".cms-option",function(e){e.stopPropagation();var n=e(this),i=n.find('input[type="checkbox"]');e(e.target).is('input[type="checkbox"]')||(i.prop("checked",!i.prop("checked")),t.handleOptionChange(n))}),this.optionsContainer.on("change",'input[type="checkbox"]',function(e){e.stopPropagation();var n=e(e.target).closest(".cms-option");t.handleOptionChange(n)}),this.okBtn.on("click",function(e){e.stopPropagation(),t.handleOk()}),this.cancelBtn.on("click",function(e){e.stopPropagation(),t.handleCancel()})},handleOptionChange:function(e){var t=e.data("value");if("select-all"===t){var n=e.find('input[type="checkbox"]');this.handleSelectAll(n.prop("checked"))}else{var i=e.find('input[type="checkbox"]');i.prop("checked")?e.addClass("selected"):e.removeClass("selected");var a=this;setTimeout(function(){a.updateSelectAllState(),a.updateTriggerText()},0)}this.updateHiddenInputs(),this.settings.onChange&&this.settings.onChange.call(this,this.getSelectedValues(),this.getSelectedLabels()),this.settings.onSelect&&this.settings.onSelect.call(this,this.getSelectedValues())},handleSelectAll:function(e){var t=this;this.optionsContainer.find('.cms-option:not([data-value="select-all"])').each(function(){var n=e(this);n.find('input[type="checkbox"]').prop("checked",e),e?n.addClass("selected"):n.removeClass("selected")}),this.updateSelectAllState(),this.updateTriggerText(),this.updateHiddenInputs()},updateSelectAllState:function(){var e=this.optionsContainer.find('.cms-option:not([data-value="select-all"]) input[type="checkbox"]'),t=e.filter(":checked"),n=e.length,i=t.length,a=this.optionsContainer.find('.cms-option[data-value="select-all"] input[type="checkbox"]');a.prop("indeterminate",!1),a.prop("checked",!1),0===i||i===n&&n>0?a.prop("checked",!0):a.prop("indeterminate",!0)},getSelectedValues:function(){var t=[];return this.optionsContainer.find('.cms-option:not([data-value="select-all"]) input[type="checkbox"]:checked').each(function(){var n=e(this).val();isNaN(n)&&""!==n||(n=Number(n)),t.push(n)}),t},getSelectedLabels:function(){var t=[];return this.optionsContainer.find('.cms-option:not([data-value="select-all"]) input[type="checkbox"]:checked').siblings("label").each(function(){t.push(e(this).text())}),t},updateTriggerText:function(){var e=this.getSelectedLabels(),t=this.getSelectedValues(),n=this.trigger.find(".cms-selected-text");0===e.length?n.empty().text(this.settings.placeholder).addClass("cms-placeholder"):this.settings.showBadges?(n.empty().removeClass("cms-placeholder");var i=this;e.each(t,function(e,t){var a=i,o=e('<span class="cms-badge"></span>'),s=e("<span></span>").text(t[e]),r=e('<button type="button" class="cms-badge-remove">&times;</button>');r.on("click",function(e){e.stopPropagation(),i.unselect(t)}),o.append(s),o.append(r),n.append(o)})):n.empty().removeClass("cms-placeholder"),n.text(e.length+" items selected"),this.updateExternalBadges(t,e)},updateExternalBadges:function(t,n){if(this.settings.showBadgesExternal){var i=e("#"+this.settings.showBadgesExternal);if(0!==i.length){if(i.empty(),0===t.length)return;var a=this;e.each(t,function(e,t){var o=a,s=e('<span class="cms-badge"></span>'),r=e("<span></span>").text(n[e]),l=e('<button type="button" class="cms-badge-remove">&times;</button>');l.on("click",function(e){e.preventDefault(),e.stopPropagation(),a.unselect(t)}),s.append(r),s.append(l),i.append(s)})}}},toggle:function(){this.wrapper.hasClass("open")?this.close():this.open()},open:function(){e(".cms-wrapper.open").not(this.wrapper).removeClass("open"),e(".cms-dropdown.open").not(this.dropdown).removeClass("open"),this.updateDropdownPosition(),this.wrapper.addClass("open"),this.dropdown.addClass("open")},updateDropdownPosition:function(){var e=this.wrapper[0].getBoundingClientRect(),t=this.wrapper.outerWidth();this.dropdown.css({position:"fixed",top:e.bottom+"px",left:e.left+"px",width:t+"px"})},close:function(){this.wrapper.removeClass("open"),this.dropdown.removeClass("open")},handleOk:function(){this.updateTriggerText();var e=this.getSelectedValues(),t=this.getSelectedLabels();this.settings.onOk&&this.settings.onOk.call(this,e,t),this.settings.submitForm&&this.submitForm(),this.close()},submitForm:function(){var e=null;if(this.settings.formId?(e=e("#"+this.settings.formId),0===e.length&&console.warn('OneSelect: Form with ID "'+this.settings.formId+'" not found')):(e=this.$element.closest("form"),0===e.length&&console.warn("OneSelect: No parent form found")),0!==e.length&&e[0].submit()},handleCancel:function(){this.settings.value=[],this.optionsContainer.find('input[type="checkbox"]').prop("checked",!1),this.optionsContainer.find(".cms-option").removeClass("selected"),this.updateSelectAllState(),this.updateTriggerText(),this.updateHiddenInputs(),this.settings.onCancel&&this.settings.onCancel.call(this),this.settings.submitForm&&this.submitForm(),this.close()},setValue:function(e){this.settings.value=e||[],this.renderOptions(),this.updateTriggerText(),this.updateHiddenInputs()},getValue:function(){return this.getSelectedValues()},updateData:function(e){this.settings.data=e||[],this.settings.value=[],this.renderOptions(),this.updateTriggerText(),this.updateHiddenInputs()},loadData:function(t,n,i){var a=this,o=t||this.settings.ajax;if(o&&o.url){if(this.settings.beforeLoad&&this.settings.beforeLoad.call(this),this.trigger.find(".cms-selected-text").text("Loading..."),!o.url)return void console.error("OneSelect: Ajax configuration or url is missing");var s=e.extend(!0,{url:o.url,method:o.method||"GET",data:o.data||{},dataType:o.dataType||"json",success:function(e){var t=e;"object"==typeof e&&e.data?t=e.data:"object"==typeof e&&e.results&&(t=e.results),a.settings.data=t||[],a.renderOptions(),a.updateTriggerText(),a.settings.afterLoad&&a.settings.afterLoad.call(a,t,e),n&&n.call(a,t,e)},error:function(e,t,n){a.trigger.find(".cms-selected-text").text("Error loading data"),a.settings.onLoadError&&a.settings.onLoadError.call(a,e,t,n),i&&i.call(a,e,t,n)}},o);o.success&&(s.success=function(e){o.success(e),t(e)}),o.error&&(s.error=function(e,t,n){o.error(e,t,n),t(e,t,n)}),e.ajax(s)}else console.error("OneSelect: Ajax configuration or url is missing")},reload:function(){this.settings.ajax?this.loadData():console.warn("OneSelect: No ajax configuration found")},select:function(e){var t=this.optionsContainer.find('.cms-option:not([data-value="select-all"]) input[type="checkbox"][value="'+e+'"]');t.length&&(t.prop("checked",!0),t.closest(".cms-option").addClass("selected"),this.updateSelectAllState(),this.updateTriggerText(),this.updateHiddenInputs())},unselect:function(e){var t=this.optionsContainer.find('.cms-option:not([data-value="select-all"]) input[type="checkbox"][value="'+e+'"]');t.length&&(t.prop("checked",!1),t.closest(".cms-option").removeClass("selected"),this.updateSelectAllState(),this.updateTriggerText(),this.updateHiddenInputs())},selectAll:function(){this.handleSelectAll(!0)},unselectAll:function(){this.handleSelectAll(!1)},toggleSelection:function(e){var t=this.optionsContainer.find('.cms-option:not([data-value="select-all"]) input[type="checkbox"][value="'+e+'"]');if(t.length){var n=t.prop("checked");t.prop("checked",!n);var i=t.closest(".cms-option");n?i.removeClass("selected"):i.addClass("selected"),this.updateSelectAllState(),this.updateTriggerText(),this.updateHiddenInputs()}},getInstanceId:function(){return this.instanceId},destroy:function(){delete t[this.instanceId],e(window).off(".cms"),e(window).off(".ones"),e(document).off(".onescroll"),this.trigger.off(),this.okBtn.off(),this.cancelBtn.off(),this.optionsContainer.off(),this._horizontalScrollInterval&&(clearInterval(this._horizontalScrollInterval),this._horizontalScrollInterval=null),e('input.cms-hidden-input[data-cms-input="'+this.settings.name+'"]').remove(),this.wrapper.remove(),this.dropdown.remove(),this.$element.removeData(n)}},o.getInstance=function(e){return t[e]||null},o.getAllInstances=function(){return t},e.fn[n]=function(t){var i=arguments,a=this;return this.each(function(){var o=e(this),s=o.data(n);s||"object"!=typeof t&&t||(s=new o(this,t),o.data(n,s)),"string"==typeof t&&("value"===t?void 0!==i[1]?(s.setValue(i[1]),a=o):a=s.getValue():"getValues"===t?a=s.getSelectedValues():"getLabels"===t?a=s.getSelectedLabels():"getInstanceId"===t?a=s.getInstanceId():"updateData"===t?s.updateData(i[1]):"loadData"===t?s.loadData(i[1],i[2],i[3]):"reload"===t?s.reload():"select"===t?s.select(i[1]):"unselect"===t?s.unselect(i[1]):"selectAll"===t?s.selectAll():"unselectAll"===t?s.unselectAll():"toggleSelection"===t?s.toggleSelection(i[1]):"open"===t?s.open():"close"===t?s.close():"destroy"===t&&s.destroy())}),a},e.fn[n].Constructor=o,e.fn[n].getInstance=o.getInstance,e.fn[n].getAllInstances=o.getAllInstances});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kamranbaylarov/one-select",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "A powerful, flexible, and feature-rich multi-select dropdown component for jQuery",
5
5
  "main": "js/one-select.js",
6
6
  "scripts": {