blob: ed09be240ffa1d03c4ad9cd5650a1e03d4614a2d [file] [log] [blame]
/*!
* Angular Material Design
* https://github.com/angular/material
* @license MIT
* v1.0.0-master-19c11fd
*/
!function(e,t,n){"use strict";function o(e,o,i,r,l,a){function d(l,d){var s=t.element("<md-select-value><span></span></md-select-value>");if(s.append('<span class="md-select-icon" aria-hidden="true"></span>'),s.addClass("md-select-value"),s[0].hasAttribute("id")||s.attr("id","select_value_label_"+o.nextUid()),l.find("md-content").length||l.append(t.element("<md-content>").append(l.contents())),d.mdOnOpen&&(l.find("md-content").prepend(t.element('<div> <md-progress-circular md-mode="{{progressMode}}" ng-hide="$$loadingAsyncDone"></md-progress-circular></div>')),l.find("md-option").attr("ng-show","$$loadingAsyncDone")),d.name){var c=t.element('<select class="md-visually-hidden">');c.attr({name:"."+d.name,"ng-model":d.ngModel,"aria-hidden":"true",tabindex:"-1"});var u=l.find("md-option");t.forEach(u,function(e){var n=t.element("<option>"+e.innerHTML+"</option>");e.hasAttribute("ng-value")?n.attr("ng-value",e.getAttribute("ng-value")):e.hasAttribute("value")&&n.attr("value",e.getAttribute("value")),c.append(n)}),l.parent().append(c)}var p=t.isDefined(d.multiple)?"multiple":"",f='<div class="md-select-menu-container" aria-hidden="true"><md-select-menu {0}>{1}</md-select-menu></div>';return f=o.supplant(f,[p,l.html()]),l.empty().append(s),l.append(f),d.tabindex=d.tabindex||"0",function(l,d,s,c){function u(){var e=d.attr("aria-label")||d.attr("placeholder");!e&&k&&k.label&&(e=k.label.text()),$=e,r.expect(d,"aria-label",e)}function p(){O&&(E=E||O.find("md-select-menu").controller("mdSelectMenu"),w.setLabelText(E.selectedLabels()))}function f(){if($){var e=E.selectedLabels({mode:"aria"});d.attr("aria-label",e.length?$+": "+e:$)}}function m(){k&&k.setHasValue(E.selectedLabels().length>0||(d[0].validity||{}).badInput)}function h(){if(O=t.element(d[0].querySelector(".md-select-menu-container")),D=l,d.attr("md-container-class")){var e=O[0].getAttribute("class")+" "+d.attr("md-container-class");O[0].setAttribute("class",e)}E=O.find("md-select-menu").controller("mdSelectMenu"),E.init(C,s.ngModel),d.on("$destroy",function(){O.remove()})}function g(e){var n=[32,13,38,40];if(-1!=n.indexOf(e.keyCode))e.preventDefault(),v(e);else if(e.keyCode<=90&&e.keyCode>=31){e.preventDefault();var o=E.optNodeForKeyboardSearch(e);if(!o)return;var i=t.element(o).controller("mdOption");E.isMultiple||E.deselect(Object.keys(E.selected)[0]),E.select(i.hashKey,i.value),E.refreshViewValue()}}function v(){D.isOpen=!0,d.attr("aria-expanded","true"),e.show({scope:D,preserveScope:!0,skipCompile:!0,element:O,target:d[0],selectCtrl:w,preserveElement:!0,hasBackdrop:!0,loadingAsync:s.mdOnOpen?l.$eval(s.mdOnOpen)||!0:!1})["finally"](function(){D.isOpen=!1,d.focus(),d.attr("aria-expanded","false"),C.$setTouched()})}var b,$,y=!0,k=c[0],w=c[1],C=c[2],M=c[3],x=d.find("md-select-value"),S=t.isDefined(s.readonly);if(k){var A=k.isErrorGetter||function(){return C.$invalid&&C.$touched};if(k.input)throw new Error("<md-input-container> can only have *one* child <input>, <textarea> or <select> element!");k.input=d,k.label||r.expect(d,"aria-label",d.attr("placeholder")),l.$watch(A,k.setInvalid)}var O,D,E;if(h(),i(d),s.name&&M){var T=d.parent()[0].querySelector('select[name=".'+s.name+'"]');o.nextTick(function(){var e=t.element(T).controller("ngModel");e&&M.$removeControl(e)})}M&&o.nextTick(function(){M.$setPristine()});var R=C.$render;C.$render=function(){R(),p(),f(),m()},s.$observe("placeholder",C.$render),w.setLabelText=function(e){w.setIsPlaceholder(!e);var t=s.placeholder||(k&&k.label?k.label.text():"");e=e||t||"";var n=x.children().eq(0);n.html(e)},w.setIsPlaceholder=function(e){e?(x.addClass("md-select-placeholder"),k&&k.label&&k.label.addClass("md-placeholder")):(x.removeClass("md-select-placeholder"),k&&k.label&&k.label.removeClass("md-placeholder"))},S||(d.on("focus",function(e){k&&k.element.hasClass("md-input-has-value")&&k.setFocused(!0)}),o.nextTick(function(){d.on("blur",function(){y&&(y=!1,C.$setUntouched()),D.isOpen||(k&&k.setFocused(!1),m())})})),w.triggerClose=function(){a(s.mdOnClose)(l)},l.$$postDigest(function(){u(),p(),f()}),l.$watch(E.selectedLabels,p);var B;s.$observe("ngMultiple",function(e){B&&B();var t=a(e);B=l.$watch(function(){return t(l)},function(e,t){(e!==n||t!==n)&&(e?d.attr("multiple","multiple"):d.removeAttr("multiple"),d.attr("aria-multiselectable",e?"true":"false"),O&&(E.setMultiple(e),R=C.$render,C.$render=function(){R(),p(),f(),m()},C.$render()))})}),s.$observe("disabled",function(e){t.isString(e)&&(e=!0),(b===n||b!==e)&&(b=e,e?(d.attr({tabindex:-1,"aria-disabled":"true"}),d.off("click",v),d.off("keydown",g)):(d.attr({tabindex:s.tabindex,"aria-disabled":"false"}),d.on("click",v),d.on("keydown",g)))}),s.disabled||s.ngDisabled||(d.attr({tabindex:s.tabindex,"aria-disabled":"false"}),d.on("click",v),d.on("keydown",g));var V={role:"listbox","aria-expanded":"false","aria-multiselectable":s.multiple===n||s.ngMultiple?"false":"true"};d[0].hasAttribute("id")||(V.id="select_"+o.nextUid());var P="select_container_"+o.nextUid();O.attr("id",P),V["aria-owns"]=P,d.attr(V),l.$on("$destroy",function(){e.destroy()["finally"](function(){k&&(k.setFocused(!1),k.setHasValue(!1),k.input=null),C.$setTouched()})})}}return{restrict:"E",require:["^?mdInputContainer","mdSelect","ngModel","?^form"],compile:d,controller:function(){}}}function i(e,o,i){function r(e,n,r,l){function a(e){(13==e.keyCode||32==e.keyCode)&&d(e)}function d(n){var i=o.getClosest(n.target,"md-option"),r=i&&t.element(i).data("$mdOptionController");if(i&&r){if(i.hasAttribute("disabled"))return n.stopImmediatePropagation(),!1;var l=s.hashGetter(r.value),a=t.isDefined(s.selected[l]);e.$apply(function(){s.isMultiple?a?s.deselect(l):s.select(l,r.value):a||(s.deselect(Object.keys(s.selected)[0]),s.select(l,r.value)),s.refreshViewValue()})}}var s=l[0];i(n),n.on("click",d),n.on("keypress",a)}function l(i,r,l){function a(){var e=c.ngModel.$modelValue||c.ngModel.$viewValue||[];if(t.isArray(e)){var n=Object.keys(c.selected),o=e.map(c.hashGetter),i=n.filter(function(e){return-1===o.indexOf(e)});i.forEach(c.deselect),o.forEach(function(t,n){c.select(t,e[n])})}}function d(){var e=c.ngModel.$viewValue||c.ngModel.$modelValue;Object.keys(c.selected).forEach(c.deselect),c.select(c.hashGetter(e),e)}var c=this;c.isMultiple=t.isDefined(r.multiple),c.selected={},c.options={},i.$watchCollection(function(){return c.options},function(){c.ngModel.$render()});var u,p;c.setMultiple=function(e){function n(e,n){return t.isArray(e||n||[])}var o=c.ngModel;p=p||o.$isEmpty,c.isMultiple=e,u&&u(),c.isMultiple?(o.$validators["md-multiple"]=n,o.$render=a,i.$watchCollection(c.modelBinding,function(e){n(e)&&a(e),c.ngModel.$setPristine()}),o.$isEmpty=function(e){return!e||0===e.length}):(delete o.$validators["md-multiple"],o.$render=d)};var f,m,h,g="",v=300;c.optNodeForKeyboardSearch=function(e){f&&clearTimeout(f),f=setTimeout(function(){f=n,g="",h=n,m=n},v),g+=String.fromCharCode(e.keyCode);var o=new RegExp("^"+g,"i");m||(m=l.find("md-option"),h=new Array(m.length),t.forEach(m,function(e,t){h[t]=e.textContent.trim()}));for(var i=0;i<h.length;++i)if(o.test(h[i]))return m[i]},c.init=function(n,o){if(c.ngModel=n,c.modelBinding=o,n.$options&&n.$options.trackBy){var r={},l=e(n.$options.trackBy);c.hashGetter=function(e,t){return r.$value=e,l(t||i,r)}}else c.hashGetter=function(e){return t.isObject(e)?"object_"+(e.$$mdSelectId||(e.$$mdSelectId=++s)):e};c.setMultiple(c.isMultiple)},c.selectedLabels=function(e){e=e||{};var t=e.mode||"html",n=o.nodesToArray(l[0].querySelectorAll("md-option[selected]"));if(n.length){var i;return"html"==t?i=function(e){return e.innerHTML}:"aria"==t&&(i=function(e){return e.hasAttribute("aria-label")?e.getAttribute("aria-label"):e.textContent}),n.map(i).join(", ")}return""},c.select=function(e,t){var n=c.options[e];n&&n.setSelected(!0),c.selected[e]=t},c.deselect=function(e){var t=c.options[e];t&&t.setSelected(!1),delete c.selected[e]},c.addOption=function(e,n){if(t.isDefined(c.options[e]))throw new Error('Duplicate md-option values are not allowed in a select. Duplicate value "'+n.value+'" found.');c.options[e]=n,t.isDefined(c.selected[e])&&(c.select(e,n.value),c.refreshViewValue())},c.removeOption=function(e){delete c.options[e]},c.refreshViewValue=function(){var e,n=[];for(var o in c.selected)(e=c.options[o])?n.push(e.value):n.push(c.selected[o]);var i=c.ngModel.$options&&c.ngModel.$options.trackBy,r=c.isMultiple?n:n[0],l=c.ngModel.$modelValue;(i?t.equals(l,r):l==r)||(c.ngModel.$setViewValue(r),c.ngModel.$render())}}return l.$inject=["$scope","$attrs","$element"],{restrict:"E",require:["mdSelectMenu"],scope:!0,controller:l,link:{pre:r}}}function r(e,n){function o(e,n){return e.append(t.element('<div class="md-text">').append(e.contents())),e.attr("tabindex",n.tabindex||"0"),i}function i(o,i,r,l){function a(e,t,n){if(!c.hashGetter)return void(n||o.$$postDigest(function(){a(e,t,!0)}));var i=c.hashGetter(t,o),r=c.hashGetter(e,o);s.hashKey=r,s.value=e,c.removeOption(i,s),c.addOption(r,s)}function d(){var e={role:"option","aria-selected":"false"};i[0].hasAttribute("id")||(e.id="select_option_"+n.nextUid()),i.attr(e)}var s=l[0],c=l[1];t.isDefined(r.ngValue)?o.$watch(r.ngValue,a):t.isDefined(r.value)?a(r.value):o.$watch(function(){return i.text()},a),r.$observe("disabled",function(e){e?i.attr("tabindex","-1"):i.attr("tabindex","0")}),o.$$postDigest(function(){r.$observe("selected",function(e){t.isDefined(e)&&("string"==typeof e&&(e=!0),e?(c.isMultiple||c.deselect(Object.keys(c.selected)[0]),c.select(s.hashKey,s.value)):c.deselect(s.hashKey),c.refreshViewValue())})}),e.attach(o,i),d(),o.$on("$destroy",function(){c.removeOption(s.hashKey,s)})}function r(e){this.selected=!1,this.setSelected=function(t){t&&!this.selected?e.attr({selected:"selected","aria-selected":"true"}):!t&&this.selected&&(e.removeAttr("selected"),e.attr("aria-selected","false")),this.selected=t}}return r.$inject=["$element"],{restrict:"E",require:["mdOption","^^mdSelectMenu"],controller:r,compile:o}}function l(){function e(e,n){var o=e.find("label");o.length||(o=t.element("<label>"),e.prepend(o)),o.addClass("md-container-ignore"),n.label&&o.text(n.label)}return{restrict:"E",compile:e}}function a(e){function o(e,o,s,c,u,p,f,m,h){function g(e,t,n){function o(){return f(t,{addClass:"md-leave"}).start()}function i(){t.removeClass("md-active"),t.attr("aria-hidden","true"),t[0].style.display="none",b(n),!n.$destroy&&n.restoreFocus&&n.target.focus()}return n=n||{},n.cleanupInteraction(),n.cleanupResizing(),n.hideBackdrop(),n.$destroy===!0?i():o().then(i)}function v(i,r,l){function a(e,t,n){return n.parent.append(t),u(function(e,n){try{f(t,{removeClass:"md-leave",duration:0}).start().then(d).then(e)}catch(o){n(o)}})}function d(){return u(function(e){if(l.isRemoved)return u.reject(!1);var t=$(i,r,l);t.container.element.css(k.toCss(t.container.styles)),t.dropDown.element.css(k.toCss(t.dropDown.styles)),p(function(){r.addClass("md-active"),t.dropDown.element.css(k.toCss({transform:""})),v(l.focusedNode),e()})})}function g(e,t,n){return n.disableParentScroll&&!s.getClosest(n.target,"MD-DIALOG")?n.restoreScroll=s.disableScrollAround(n.element,n.parent):n.disableParentScroll=!1,n.hasBackdrop&&(n.backdrop=s.createBackdrop(e,"md-select-backdrop md-click-catcher"),m.enter(n.backdrop,h[0].body,null,{duration:0})),function(){n.backdrop&&n.backdrop.remove(),n.disableParentScroll&&n.restoreScroll(),delete n.restoreScroll}}function v(e){e&&!e.hasAttribute("disabled")&&e.focus()}function b(e,n){var o=r.find("md-select-menu");if(!n.target)throw new Error(s.supplant(y,[n.target]));t.extend(n,{isRemoved:!1,target:t.element(n.target),parent:t.element(n.parent),selectEl:o,contentEl:r.find("md-content"),optionNodes:o[0].getElementsByTagName("md-option")})}function w(){var e=function(e,t,n){return function(){if(!n.isRemoved){var o=$(e,t,n),i=o.container,r=o.dropDown;i.element.css(k.toCss(i.styles)),r.element.css(k.toCss(r.styles))}}}(i,r,l),n=t.element(c);return n.on("resize",e),n.on("orientationchange",e),function(){n.off("resize",e),n.off("orientationchange",e)}}function C(){l.loadingAsync&&!l.isRemoved&&(i.$$loadingAsyncDone=!1,i.progressMode="indeterminate",u.when(l.loadingAsync).then(function(){i.$$loadingAsyncDone=!0,i.progressMode="",delete l.loadingAsync}).then(function(){p(d)}))}function M(){function t(t){t.preventDefault(),t.stopPropagation(),l.restoreFocus=!1,s.nextTick(e.hide,!0)}function i(t){var n=o.KEY_CODE;switch(t.preventDefault(),t.stopPropagation(),t.keyCode){case n.UP_ARROW:return c();case n.DOWN_ARROW:return d();case n.SPACE:case n.ENTER:var i=s.getClosest(t.target,"md-option");i&&(p.triggerHandler({type:"click",target:i}),t.preventDefault()),u(t);break;case n.TAB:case n.ESCAPE:t.stopPropagation(),t.preventDefault(),l.restoreFocus=!0,s.nextTick(e.hide,!0);break;default:if(t.keyCode>=31&&t.keyCode<=90){var r=p.controller("mdSelectMenu").optNodeForKeyboardSearch(t);l.focusedNode=r||l.focusedNode,r&&r.focus()}}}function a(e){var t,o=s.nodesToArray(l.optionNodes),i=o.indexOf(l.focusedNode);do-1===i?i=0:"next"===e&&i<o.length-1?i++:"prev"===e&&i>0&&i--,t=o[i],t.hasAttribute("disabled")&&(t=n);while(!t&&i<o.length-1&&i>0);t&&t.focus(),l.focusedNode=t}function d(){a("next")}function c(){a("prev")}function u(t){function n(){var e=!1;if(t&&t.currentTarget.children.length>0){var n=t.currentTarget.children[0],o=n.scrollHeight>n.clientHeight;if(o&&n.children.length>0){var i=t.pageX-t.currentTarget.getBoundingClientRect().left;i>n.querySelector("md-option").offsetWidth&&(e=!0)}}return e}if(!(t&&"click"==t.type&&t.currentTarget!=p[0]||n())){var o=s.getClosest(t.target,"md-option");o&&o.hasAttribute&&!o.hasAttribute("disabled")&&(t.preventDefault(),t.stopPropagation(),f.isMultiple||(l.restoreFocus=!0,s.nextTick(function(){e.hide(f.ngModel.$viewValue)},!0)))}}if(!l.isRemoved){var p=l.selectEl,f=p.controller("mdSelectMenu")||{};return r.addClass("md-clickable"),l.backdrop&&l.backdrop.on("click",t),p.on("keydown",i),p.on("click",u),function(){l.backdrop&&l.backdrop.off("click",t),p.off("keydown",i),p.off("click",u),r.removeClass("md-clickable"),l.isRemoved=!0}}}return C(),b(i,l),l.hideBackdrop=g(i,r,l),a(i,r,l).then(function(e){return r.attr("aria-hidden","false"),l.alreadyOpen=!0,l.cleanupInteraction=M(),l.cleanupResizing=w(),e},l.hideBackdrop)}function b(e){var t=e.selectCtrl;if(t){var n=e.selectEl.controller("mdSelectMenu");t.setLabelText(n.selectedLabels()),t.triggerClose()}}function $(e,n,o){var u,p=n[0],f=o.target[0].children[0],m=h[0].body,g=o.selectEl[0],v=o.contentEl[0],b=m.getBoundingClientRect(),$=f.getBoundingClientRect(),y=!1,k={left:b.left+d,top:d,bottom:b.height-d,right:b.width-d-(s.floatingScrollbars()?16:0)},w={top:$.top-k.top,left:$.left-k.left,right:k.right-($.left+$.width),bottom:k.bottom-($.top+$.height)},C=b.width-2*d,M=g.querySelector("md-option[selected]"),x=g.getElementsByTagName("md-option"),S=g.getElementsByTagName("md-optgroup"),A=a(n,v),O=i(o.loadingAsync);u=O?v.firstElementChild||v:M?M:S.length?S[0]:x.length?x[0]:v.firstElementChild||v,v.offsetWidth>C?v.style["max-width"]=C+"px":v.style.maxWidth=null,y&&(v.style["min-width"]=$.width+"px"),A&&g.classList.add("md-overflow");var D=u;"MD-OPTGROUP"===(D.tagName||"").toUpperCase()&&(D=x[0]||v.firstElementChild||v,u=D),o.focusedNode=D,p.style.display="block";var E=g.getBoundingClientRect(),T=l(u);if(u){var R=c.getComputedStyle(u);T.paddingLeft=parseInt(R.paddingLeft,10)||0,T.paddingRight=parseInt(R.paddingRight,10)||0}if(A){var B=v.offsetHeight/2;v.scrollTop=T.top+T.height/2-B,w.top<B?v.scrollTop=Math.min(T.top,v.scrollTop+B-w.top):w.bottom<B&&(v.scrollTop=Math.max(T.top+T.height-E.height,v.scrollTop-B+w.bottom))}var V,P,L,N;y?(V=$.left,P=$.top+$.height,L="50% 0",P+E.height>k.bottom&&(P=$.top-E.height,L="50% 100%")):(V=$.left+T.left-T.paddingLeft+2,P=Math.floor($.top+$.height/2-T.height/2-T.top+v.scrollTop)+2,L=T.left+$.width/2+"px "+(T.top+T.height/2-v.scrollTop)+"px 0px",N=Math.min($.width+T.paddingLeft+T.paddingRight,C));var j=p.getBoundingClientRect(),I=Math.round(100*Math.min($.width/E.width,1))/100,F=Math.round(100*Math.min($.height/E.height,1))/100;return{container:{element:t.element(p),styles:{left:Math.floor(r(k.left,V,k.right-j.width)),top:Math.floor(r(k.top,P,k.bottom-j.height)),"min-width":N}},dropDown:{element:t.element(g),styles:{transformOrigin:L,transform:o.alreadyOpen?"":s.supplant("scale({0},{1})",[I,F])}}}}var y="$mdSelect.show() expected a target element in options.target but got '{0}'!",k=s.dom.animator;return{parent:"body",themable:!0,onShow:v,onRemove:g,hasBackdrop:!0,disableParentScroll:!0}}function i(e){return e&&t.isFunction(e.then)}function r(e,t,n){return Math.max(e,Math.min(t,n))}function l(e){return e?{left:e.offsetLeft,top:e.offsetTop,width:e.offsetWidth,height:e.offsetHeight}:{left:0,top:0,width:0,height:0}}function a(e,t){var n=!1;try{var o=e[0].style.display;e[0].style.display="block",n=t.scrollHeight>t.offsetHeight,e[0].style.display=o}finally{}return n}return o.$inject=["$mdSelect","$mdConstant","$mdUtil","$window","$q","$$rAF","$animateCss","$animate","$document"],e("$mdSelect").setDefaults({methods:["target"],options:o})}var d=8,s=0;t.module("material.components.select",["material.core","material.components.backdrop"]).directive("mdSelect",o).directive("mdSelectMenu",i).directive("mdOption",r).directive("mdOptgroup",l).provider("$mdSelect",a),o.$inject=["$mdSelect","$mdUtil","$mdTheming","$mdAria","$compile","$parse"],i.$inject=["$parse","$mdUtil","$mdTheming"],r.$inject=["$mdButtonInkRipple","$mdUtil"],a.$inject=["$$interimElementProvider"]}(window,window.angular);