select.min.js 12 KB

1
  1. !function(t){"use strict";var e=function(i,n,s){s&&(s.stopPropagation(),s.preventDefault()),this.$element=t(i),this.$newElement=null,this.$button=null,this.$menu=null,this.options=t.extend({},t.fn.selectpicker.defaults,this.$element.data(),"object"==typeof n&&n),null==this.options.title&&(this.options.title=this.$element.attr("title")),this.val=e.prototype.val,this.render=e.prototype.render,this.refresh=e.prototype.refresh,this.setStyle=e.prototype.setStyle,this.selectAll=e.prototype.selectAll,this.deselectAll=e.prototype.deselectAll,this.init()};e.prototype={constructor:e,init:function(){this.$element.hide(),this.multiple=this.$element.prop("multiple");var e=this.$element.attr("id");if(this.$newElement=this.createView(),this.$element.after(this.$newElement),this.$menu=this.$newElement.find("> .dropdown-menu"),this.$button=this.$newElement.find("> button"),void 0!==e){var i=this;this.$button.attr("data-id",e),t('label[for="'+e+'"]').click(function(){i.$button.focus()})}this.checkDisabled(),this.checkTabIndex(),this.clickListener(),this.render(),this.liHeight(),this.setStyle(),this.setWidth(),this.options.container&&this.selectPosition(),this.$menu.data("this",this),this.$newElement.data("this",this)},createDropdown:function(){var e=this.multiple?" show-tick":"",i=this.options.header?'<h3 class="popover-title">'+this.options.header+'<button type="button" class="close" aria-hidden="true">&times;</button></h3>':"",n="<div class='btn-group bootstrap-select"+e+"'><button type='button' class='btn btn-sm form-control dropdown-toggle' data-toggle='dropdown'><div class='filter-option pull-left'></div>&nbsp;<div class='caret'></div></button><div class='dropdown-menu open'>"+i+"<ul class='dropdown-menu inner' role='menu'></ul></div></div>";return t(n)},createView:function(){var t=this.createDropdown(),e=this.createLi();return t.find("ul").append(e),t},reloadLi:function(){this.destroyLi();var t=this.createLi();this.$menu.find("ul").append(t)},destroyLi:function(){this.$menu.find("li").remove()},createLi:function(){var e=this,i=[],n="";return this.$element.find("option").each(function(){var n=t(this),s=n.attr("class")||"",o=n.attr("style")||"",a=n.data("content")?n.data("content"):n.html(),l=void 0!==n.data("subtext")?'<small class="muted">'+n.data("subtext")+"</small>":"",d=void 0!==n.data("icon")?'<i class="glyphicon '+n.data("icon")+'"></i> ':"";if(""!==d&&(n.is(":disabled")||n.parent().is(":disabled"))&&(d="<span>"+d+"</span>"),n.data("content")||(a=d+'<span class="text">'+a+l+"</span>"),e.options.hideDisabled&&(n.is(":disabled")||n.parent().is(":disabled")))i.push('<a style="min-height: 0; padding: 0"></a>');else if(n.parent().is("optgroup")&&1!=n.data("divider"))if(0==n.index()){var h=n.parent().attr("label"),r=void 0!==n.parent().data("subtext")?'<small class="muted">'+n.parent().data("subtext")+"</small>":"",c=n.parent().data("icon")?'<i class="'+n.parent().data("icon")+'"></i> ':"";h=c+'<span class="text">'+h+r+"</span>",i.push(0!=n[0].index?'<div class="div-contain"><div class="divider"></div></div><dt>'+h+"</dt>"+e.createA(a,"opt "+s,o):"<dt>"+h+"</dt>"+e.createA(a,"opt "+s,o))}else i.push(e.createA(a,"opt "+s,o));else i.push(1==n.data("divider")?'<div class="div-contain"><div class="divider"></div></div>':1==t(this).data("hidden")?"":e.createA(a,s,o))}),t.each(i,function(t,e){n+="<li rel="+t+">"+e+"</li>"}),this.multiple||0!=this.$element.find("option:selected").length||e.options.title||this.$element.find("option").eq(0).prop("selected",!0).attr("selected","selected"),t(n)},createA:function(t,e,i){return'<a tabindex="0" class="'+e+'" style="'+i+'">'+t+'<i class="fa fa-check check-mark"></i></a>'},render:function(){var e=this;this.$element.find("option").each(function(i){e.setDisabled(i,t(this).is(":disabled")||t(this).parent().is(":disabled")),e.setSelected(i,t(this).is(":selected"))});var i=this.$element.find("option:selected").map(function(){var i,n=t(this),s=n.data("icon")&&e.options.showIcon?'<i class="glyphicon '+n.data("icon")+'"></i> ':"";return i=e.options.showSubtext&&n.attr("data-subtext")&&!e.multiple?' <small class="muted">'+n.data("subtext")+"</small>":"",n.data("content")&&e.options.showContent?n.data("content"):void 0!=n.attr("title")?n.attr("title"):s+n.html()+i}).toArray(),n=this.multiple?i.join(", "):i[0];if(e.multiple&&e.options.selectedTextFormat.indexOf("count")>-1){var s=e.options.selectedTextFormat.split(">"),o=this.options.hideDisabled?":not([disabled])":"";(s.length>1&&i.length>s[1]||1==s.length&&i.length>=2)&&(n=e.options.countSelectedText.replace("{0}",i.length).replace("{1}",this.$element.find('option:not([data-divider="true"]):not([data-hidden="true"])'+o).length))}n||(n=void 0!=e.options.title?e.options.title:e.options.noneSelectedText),e.$newElement.find(".filter-option").html(n)},setStyle:function(t,e){this.$element.attr("class")&&this.$newElement.addClass(this.$element.attr("class").replace(/selectpicker|mobile-device/gi,""));var i=t?t:this.options.style;"add"==e?this.$button.addClass(i):"remove"==e?this.$button.removeClass(i):(this.$button.removeClass(this.options.style),this.$button.addClass(i))},liHeight:function(){var t=this.$newElement.clone();t.appendTo("body");var e=t.addClass("open").find("> .dropdown-menu"),i=e.find("li > a").outerHeight(),n=this.options.header?e.find(".popover-title").outerHeight():0;t.remove(),this.$newElement.data("liHeight",i).data("headerHeight",n)},setSize:function(){var e,i,n,s=this,o=this.$menu,a=o.find(".inner"),l=(a.find("li > a"),this.$newElement.outerHeight()),d=this.$newElement.data("liHeight"),h=this.$newElement.data("headerHeight"),r=o.find("li .divider").outerHeight(!0),c=parseInt(o.css("padding-top"))+parseInt(o.css("padding-bottom"))+parseInt(o.css("border-top-width"))+parseInt(o.css("border-bottom-width")),p=this.options.hideDisabled?":not(.disabled)":"",u=t(window),m=c+parseInt(o.css("margin-top"))+parseInt(o.css("margin-bottom"))+2,f=function(){i=s.$newElement.offset().top-u.scrollTop(),n=u.height()-i-l};if(f(),this.options.header&&o.css("padding-top",0),"auto"==this.options.size){var v=function(){var t;f(),e=n-m,s.$newElement.toggleClass("dropup",i>n&&e-m<o.height()&&s.options.dropupAuto),s.$newElement.hasClass("dropup")&&(e=i-m),t=o.find("li").length+o.find("dt").length>3?3*d+m-2:0,o.css({"max-height":e+"px",overflow:"hidden","min-height":t+"px"}),a.css({"max-height":e-h-c+"px","overflow-y":"auto","min-height":t-c+"px"})};v(),t(window).resize(v),t(window).scroll(v)}else if(this.options.size&&"auto"!=this.options.size&&o.find("li"+p).length>this.options.size){var b=o.find("li"+p+" > *").filter(":not(.div-contain)").slice(0,this.options.size).last().parent().index(),w=o.find("li").slice(0,b+1).find(".div-contain").length;e=d*this.options.size+w*r+c,this.$newElement.toggleClass("dropup",i>n&&e<o.height()&&this.options.dropupAuto),o.css({"max-height":e+h+"px",overflow:"hidden"}),a.css({"max-height":e-c+"px","overflow-y":"auto"})}},setWidth:function(){if("auto"==this.options.width){this.$menu.css("min-width","0");var t=this.$newElement.clone().appendTo("body"),e=t.find("> .dropdown-menu").css("width");t.remove(),this.$newElement.css("width",e)}else"fit"==this.options.width?(this.$menu.css("min-width",""),this.$newElement.css("width","").addClass("fit-width")):this.options.width?(this.$menu.css("min-width",""),this.$newElement.css("width",this.options.width)):(this.$menu.css("min-width",""),this.$newElement.css("width",""));this.$newElement.hasClass("fit-width")&&"fit"!==this.options.width&&this.$newElement.removeClass("fit-width")},selectPosition:function(){var e,i,n=this,s="<div />",o=t(s),a=function(t){o.addClass(t.attr("class")).toggleClass("dropup",t.hasClass("dropup")),e=t.offset(),i=t.hasClass("dropup")?0:t[0].offsetHeight,o.css({top:e.top+i,left:e.left,width:t[0].offsetWidth,position:"absolute"})};this.$newElement.on("click",function(){a(t(this)),o.appendTo(n.options.container),o.toggleClass("open",!t(this).hasClass("open")),o.append(n.$menu)}),t(window).resize(function(){a(n.$newElement)}),t(window).on("scroll",function(){a(n.$newElement)}),t("html").on("click",function(e){t(e.target).closest(n.$newElement).length<1&&o.removeClass("open")})},mobile:function(){this.$element.addClass("mobile-device").appendTo(this.$newElement),this.options.container&&this.$menu.hide()},refresh:function(){this.reloadLi(),this.render(),this.setWidth(),this.setStyle(),this.checkDisabled()},setSelected:function(t,e){this.$menu.find("li").eq(t).toggleClass("selected",e)},setDisabled:function(t,e){e?this.$menu.find("li").eq(t).addClass("disabled").find("a").attr("href","#").attr("tabindex",-1):this.$menu.find("li").eq(t).removeClass("disabled").find("a").removeAttr("href").attr("tabindex",0)},isDisabled:function(){return this.$element.is(":disabled")},checkDisabled:function(){var t=this;this.isDisabled()?(this.$button.addClass("disabled"),this.$button.attr("tabindex","-1")):this.$button.hasClass("disabled")&&(this.$button.removeClass("disabled"),this.$button.removeAttr("tabindex")),this.$button.click(function(){return!t.isDisabled()})},checkTabIndex:function(){if(this.$element.is("[tabindex]")){var t=this.$element.attr("tabindex");this.$button.attr("tabindex",t)}},clickListener:function(){var e=this;t("body").on("touchstart.dropdown",".dropdown-menu",function(t){t.stopPropagation()}),this.$newElement.on("click",function(){e.setSize()}),this.$menu.on("click","li a",function(i){var n=t(this).parent().index(),s=(t(this).parent(),e.$element.val());if(e.multiple&&i.stopPropagation(),i.preventDefault(),!e.isDisabled()&&!t(this).parent().hasClass("disabled")){var o=e.$element.find("option"),a=o.eq(n);if(e.multiple){var l=a.prop("selected");a.prop("selected",!l)}else o.prop("selected",!1),a.prop("selected",!0);e.$button.focus(),s!=e.$element.val()&&e.$element.change()}}),this.$menu.on("click","li.disabled a, li dt, li .div-contain, h3.popover-title",function(t){t.target==this&&(t.preventDefault(),t.stopPropagation(),e.$button.focus())}),this.$element.change(function(){e.render()})},val:function(t){return void 0!=t?(this.$element.val(t),this.$element.change(),this.$element):this.$element.val()},selectAll:function(){this.$element.find("option").prop("selected",!0).attr("selected","selected"),this.render()},deselectAll:function(){this.$element.find("option").prop("selected",!1).removeAttr("selected"),this.render()},keydown:function(e){var i,n,s,o,a,l,d,h,r,c;if(i=t(this),s=i.parent(),c=s.data("this"),c.options.container&&(s=c.$menu),n=t("[role=menu] li:not(.divider):visible a",s),n.length){if(/(38|40)/.test(e.keyCode))o=n.index(n.filter(":focus")),l=n.parent(":not(.disabled)").first().index(),d=n.parent(":not(.disabled)").last().index(),a=n.eq(o).parent().nextAll(":not(.disabled)").eq(0).index(),h=n.eq(o).parent().prevAll(":not(.disabled)").eq(0).index(),r=n.eq(a).parent().prevAll(":not(.disabled)").eq(0).index(),38==e.keyCode&&(o!=r&&o>h&&(o=h),l>o&&(o=l)),40==e.keyCode&&(o!=r&&a>o&&(o=a),o>d&&(o=d),-1==o&&(o=0)),n.eq(o).focus();else{var p={48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",71:"g",72:"h",73:"i",74:"j",75:"k",76:"l",77:"m",78:"n",79:"o",80:"p",81:"q",82:"r",83:"s",84:"t",85:"u",86:"v",87:"w",88:"x",89:"y",90:"z",96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9"},u=[];n.each(function(){t(this).parent().is(":not(.disabled)")&&t.trim(t(this).text().toLowerCase()).substring(0,1)==p[e.keyCode]&&u.push(t(this).parent().index())});var m=t(document).data("keycount");m++,t(document).data("keycount",m);var f=t.trim(t(":focus").text().toLowerCase()).substring(0,1);f!=p[e.keyCode]?(m=1,t(document).data("keycount",m)):m>=u.length&&t(document).data("keycount",0),n.eq(u[m-1]).focus()}/(13|32)/.test(e.keyCode)&&(e.preventDefault(),t(":focus").click(),t(document).data("keycount",0))}},hide:function(){this.$newElement.hide()},show:function(){this.$newElement.show()},destroy:function(){this.$newElement.remove(),this.$element.remove()}},t.fn.selectpicker=function(i,n){var s,o=arguments,a=this.each(function(){if(t(this).is("select")){var a=t(this),l=a.data("selectpicker"),d="object"==typeof i&&i;if(l){if(d)for(var h in d)l.options[h]=d[h]}else a.data("selectpicker",l=new e(this,d,n));if("string"==typeof i){var r=i;l[r]instanceof Function?([].shift.apply(o),s=l[r].apply(l,o)):s=l.options[r]}}});return void 0!=s?s:a},t.fn.selectpicker.defaults={style:null,size:"auto",title:null,selectedTextFormat:"values",noneSelectedText:"Nothing selected",countSelectedText:"{0} of {1} selected",width:!1,container:!1,hideDisabled:!1,showSubtext:!1,showIcon:!0,showContent:!0,dropupAuto:!0,header:!1},t(document).data("keycount",0).on("keydown","[data-toggle=dropdown], [role=menu]",e.prototype.keydown)}(window.jQuery);