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