-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdropdown-submenu.min.js
10 lines (10 loc) · 6.68 KB
/
dropdown-submenu.min.js
1
2
3
4
5
6
7
8
9
10
/*
* Dropdown Submenu Plugin for jQuery
*
* Turn a select with optgroup ordenation into a fancy dropdown menu with floating submenu for each grouped options.
*
* @version 1.2
* https://www.carlesrever.com/dropdown-submenu-jquery
*
*/
!function(e){function t(t){d(t,e(t).val())!=e(t).attr("data-dropdown-changes-control")&&n(t)}function n(t){if(!o(t))return!1;var n=e(t).parent().parent(),s=r(t);e(n).removeClass("dropdown-submenu-flag dropdown-submenu-open is-disabled is-hidden"),s.watchDisabled&&e(t).attr("disabled")&&e(n).addClass("is-disabled"),s.watchHidden&&e(t).attr("hidden")&&e(n).addClass("is-hidden"),e(".dropdown-field",n).remove(),l(t),c(t)}function s(t,n){e(t).css("width",e(n).outerWidth())}function a(t){maybe_ancestor=e(".dropdown-selected",t).parent().closest("li"),e(t).has(maybe_ancestor).length&&e(maybe_ancestor).addClass("dropdown-ancestor-selected")}function d(t,n){var s=e(t).clone();e("cloned").find("option:selected").prop("selected",!1);var a=e(s).html();s=null;var d=r(t);return d.watchDisabled&&(a+="disabled:"+(e(t).attr("disabled")?"1":"0")),d.watchHidden&&(a+="hidden:"+(e(t).attr("hidden")?"1":"0")),d.watchSelectClasses&&(classes=e(t).attr("class"),classes=classes.replace("dropdown-submenu-tuned",""),""!=classes&&(a+="classes:"+classes)),function(e){for(var t=0,n=0;n<e.length;n++){var s=e.charCodeAt(n);t=(t<<5)-t+s,t&=t}return t}(a+n)}function o(t){return"SELECT"==e(t).prop("tagName")&&e(t).hasClass("dropdown-submenu-tuned")}function r(t){var n=e(t).attr("data-dropdown-submenu-id");return p[n]?p[n]:def_settings}function i(t){text="Unknown",e(t).attr("data-html-option")&&""!=e(t).attr("data-html-option")?text=e(t).attr("data-html-option"):"OPTGROUP"==e(t).prop("tagName")?text=e(t).attr("label"):text=e(t).text();try{try_text=decodeURIComponent(text),text=try_text}catch(e){console.error(e)}return icon="",e(t).attr("data-icon")&&""!=e(t).attr("data-icon")&&(icon='<span class="icon"><img src="'+e(t).attr("data-icon")+'" /></span>'),icon+text}function c(t){var n=e(t).attr("data-dropdown-submenu-id");u[n]={object:t,currentValue:e(t).val(),watchChangeVal:p[n].watchChangeVal,minScreenWidth:p[n].minScreenWidth}}function l(t){var n=r(t),o=e(t).val(),c=e(t).parent().parent();s(c,t);var l=e("<div/>",{class:"dropdown-field"}).appendTo(c);n.watchSelectClasses&&(classes=e(t).attr("class"),classes=classes.replace("dropdown-submenu-tuned",""),""!=classes&&e(l).addClass(classes));var p=e("<div/>",{class:"dropdown-field-watch"}).appendTo(l);e("<div/>",{html:i(e(":selected",t)),class:"content"}).appendTo(p),e("<div/>",{class:"dropdown-arrow"}).appendTo(p),list=e("<ul/>",{class:"dropdown-main-list"}),e(t).children().each(function(t,s){if("OPTGROUP"==e(s).prop("tagName")){child_list=e("<ul/>",{class:"dropdown-submenu"}),e(s).children().each(function(t,s){var a="dropdown-submenu-item"+(e(s).val()==o?" dropdown-selected":"");n.copyOptionClasses&&e(s).attr("class")&&(a+=" "+e(s).attr("class")),e("<li/>",{html:i(s),"data-value":e(s).val(),class:a}).appendTo(child_list)});a="dropdown-main-item dropdown-has-childs";n.copyOptionClasses&&e(s).attr("class")&&(a+=" "+e(s).attr("class")),ancor=e("<li/>",{class:a}).appendTo(list),e("<div/>",{html:i(s),class:"content"}).appendTo(ancor),e("<div/>",{class:"dropdown-arrow"}).appendTo(ancor),e(child_list).appendTo(ancor)}if("OPTION"==e(s).prop("tagName")){var a="dropdown-main-item dropdown-no-childs"+(e(s).val()==o?" dropdown-selected":"");n.copyOptionClasses&&e(s).attr("class")&&(a+=" "+e(s).attr("class")),e("<li/>",{html:i(s),"data-value":e(s).val(),class:a}).appendTo(list)}}),e(list).appendTo(l),a(l);var h=d(t,o);e(t).attr("data-dropdown-changes-control",h),e(window).resize(function(){var t=e(window).width();jQuery(u).each(function(n,s){if(void 0!==s&&0!=s){var a=e(s.object).parent().parent();s.minScreenWidth>t?e(a).addClass("not-fit").removeClass("fits-well"):e(a).addClass("fits-well").removeClass("not-fit")}})}),e(".dropdown-no-childs, .dropdown-submenu-item").mouseover(function(){e(".dropdown-selected",c).removeClass("accent-hover"),e(this).addClass("accent-hover")}).mouseout(function(){e(this).removeClass("accent-hover"),e(".dropdown-selected",c).addClass("accent-hover")}),e(".dropdown-field-watch",c).mousedown(function(t){if("1"==t.which){if(e(c).hasClass("is-disabled"))return!1;e(c).toggleClass("dropdown-submenu-open"),e(".dropdown-submenu-open").not(c).removeClass("dropdown-submenu-open")}}),e(".dropdown-field, .dropdown-has-childs",c).click(function(){return!1}),e(".dropdown-submenu-item, .dropdown-no-childs",c).click(function(){var n=e(this).attr("data-value"),s="dropdown-field-watch "+e(this).attr("class");s=(s=(s=s.replace("dropdown-submenu-item","")).replace("dropdown-selected","")).replace("accent-hover",""),e(".dropdown-selected, .dropdown-ancestor-selected",c).removeClass("dropdown-selected dropdown-ancestor-selected"),e(this).addClass("dropdown-selected"),a(c);var o=d(t,n);return e(t).attr("data-dropdown-changes-control",o),e(".dropdown-field-watch .content",c).html(e(this).html()),e(".dropdown-field-watch",c).attr("class",s),e("select",c).val(n),e(c).removeClass("dropdown-submenu-open"),e("select",c).trigger("change"),!1})}var p=[],u=[];e.fn.dropdownSubmenu=function(a){var d={minScreenWidth:500,watchDisabled:!0,watchSelectClasses:!0,watchHidden:!0,watchChangeVal:!1,copyOptionClasses:!0,wrapClass:"dropdown-submenu-wrapper",tuneClass:"dropdown-submenu-skin",customClass:""},r=0,i="";return"string"==typeof a&&(i=a,a={}),this.filter("select").each(function(){if(""==i){if(o(this))return n(this),!0;var u=this,h=e.extend(d,a);p[++r]=h;var w=h.wrapClass+" "+h.tuneClass+" "+h.customClass;h.minScreenWidth>e(window).width()?w+=" not-fit":w+=" fits-well",h.watchDisabled&&(w+=e(this).attr("disabled")?" is-disabled":""),h.watchHidden&&(w+=e(this).attr("hidden")?" is-hidden":""),e(this).addClass("dropdown-submenu-tuned").attr("data-dropdown-submenu-id",r).wrap('<div class="'+w+'"><div class="dropdown-submenu-hidden"></div></div>'),c(this);var m=new MutationObserver(function(){t(u)});m.observe(this,{attributes:!0,childList:!1,subtree:!1}),l(this)}else if("refresh"==i)n(this);else if("refresh-width"==i){if(!o(this))return!1;s(v=e(this).parent().parent(),this)}else if("destroy"==i){if(!o(this))return!1;var v=e(this).parent().parent();void 0!==m&&!1!==m&&m.disconnect(),e(".dropdown-field",v).remove(),e(this).removeClass("dropdown-submenu-tuned").unwrap("div").unwrap("div")}else console.error("[dropdown-submenu] Unknown action: "+i)}),this},e(document).on("change","select.dropdown-submenu-tuned",function(){t(this)}),setInterval(function(){jQuery(u).each(function(n,s){void 0!==s&&0!=s&&s.watchChangeVal&&e(s.object).val()!=s.currentValue&&t(s.object)})},100),e(document).on("click",function(){e(".dropdown-submenu-open").removeClass("dropdown-submenu-open")})}(jQuery);