autocomplete.min.js 14 KB

1234567
  1. /*!
  2. * Angular Material Design
  3. * https://github.com/angular/material
  4. * @license MIT
  5. * v0.11.3-master-3fe7d76
  6. */
  7. !function(e,t,n){"use strict";function o(e,o,i,l,a,r,c,s,d,p){function h(){i.initOptionalProperties(e,d,{searchText:null,selectedItem:null}),a(o),x(),i.nextTick(function(){v(),g(),$(),o.on("focus",$)})}function f(){function t(){var e=me.scrollContainer.getBoundingClientRect(),t={};e.right>l.right-m&&(t.left=n.right-e.width+"px"),me.$.scrollContainer.css(t)}if(!me)return i.nextTick(f,!1,e);var n=me.wrap.getBoundingClientRect(),o=me.snap.getBoundingClientRect(),l=me.root.getBoundingClientRect(),a=o.bottom-l.top,r=l.bottom-o.top,c=n.left-l.left,s=n.width,d={left:c+"px",minWidth:s+"px",maxWidth:Math.max(n.right-l.left,l.right-n.left)-m+"px"};a>r&&l.height-n.bottom-m<u?(d.top="auto",d.bottom=r+"px",d.maxHeight=Math.min(u,n.top-l.top-m)+"px"):(d.top=a+"px",d.bottom="auto",d.maxHeight=Math.min(u,l.bottom-n.bottom-m)+"px"),me.$.scrollContainer.css(d),i.nextTick(t,!1)}function g(){me.$.root.length&&(a(me.$.scrollContainer),me.$.scrollContainer.detach(),me.$.root.append(me.$.scrollContainer),c.pin&&c.pin(me.$.scrollContainer,s))}function $(){e.autofocus&&me.input.focus()}function x(){var n=parseInt(e.delay,10)||0;d.$observe("disabled",function(e){re.isDisabled=e}),d.$observe("required",function(e){re.isRequired=null!==e}),e.$watch("searchText",n?i.debounce(R,n):R),e.$watch("selectedItem",I),t.element(r).on("resize",f),e.$on("$destroy",C)}function C(){if(t.element(r).off("resize",f),me){var e="ul scroller scrollContainer input".split(" ");t.forEach(e,function(e){me.$[e].remove()})}}function v(){me={main:o[0],scrollContainer:o[0].getElementsByClassName("md-virtual-repeat-container")[0],scroller:o[0].getElementsByClassName("md-virtual-repeat-scroller")[0],ul:o.find("ul")[0],input:o.find("input")[0],wrap:o.find("md-autocomplete-wrap")[0],root:document.body},me.li=me.ul.getElementsByTagName("li"),me.snap=b(),me.$=A(me)}function b(){for(var e=o;e.length;e=e.parent())if(t.isDefined(e.attr("md-autocomplete-snap")))return e[0];return me.wrap}function A(e){var n={};for(var o in e)e.hasOwnProperty(o)&&(n[o]=t.element(e[o]));return n}function T(t,n){!t&&n?(f(),me&&i.nextTick(function(){i.disableScrollAround(me.ul)},!1,e)):t&&!n&&i.nextTick(function(){i.enableScrolling()},!1,e)}function w(){de=!0}function y(){de=!1,re.hidden=_()}function E(){me.input.focus()}function I(t,n){t&&q(t).then(function(o){e.searchText=o,O(t,n)}),t!==n&&k()}function k(){t.isFunction(e.itemChange)&&e.itemChange(B(e.selectedItem))}function M(){t.isFunction(e.textChange)&&e.textChange()}function O(e,t){pe.forEach(function(n){n(e,t)})}function N(e){-1==pe.indexOf(e)&&pe.push(e)}function D(e){var t=pe.indexOf(e);-1!=t&&pe.splice(t,1)}function R(t,n){re.index=V(),t!==n&&q(e.selectedItem).then(function(o){t!==o&&(e.selectedItem=null,t!==n&&M(),G()?le():(re.matches=[],W(!1),ee()))})}function L(){de||(he=!1,re.hidden=_())}function P(e){e&&(de=!1),me.input.blur()}function S(){he=!0,t.isString(e.searchText)||(e.searchText=""),re.hidden=_(),re.hidden||le()}function F(e){switch(e.keyCode){case l.KEY_CODE.DOWN_ARROW:if(re.loading)return;e.stopPropagation(),e.preventDefault(),re.index=Math.min(re.index+1,re.matches.length-1),ne(),ee();break;case l.KEY_CODE.UP_ARROW:if(re.loading)return;e.stopPropagation(),e.preventDefault(),re.index=re.index<0?re.matches.length-1:Math.max(0,re.index-1),ne(),ee();break;case l.KEY_CODE.TAB:case l.KEY_CODE.ENTER:if(re.hidden||re.loading||re.index<0||re.matches.length<1)return;e.stopPropagation(),e.preventDefault(),Q(re.index);break;case l.KEY_CODE.ESCAPE:e.stopPropagation(),e.preventDefault(),X(),P(!0)}}function H(){return t.isNumber(e.minLength)?e.minLength:1}function q(t){function n(t){return t&&e.itemText?e.itemText(B(t)):null}return p.when(n(t)||t)}function B(e){if(!e)return n;var t={};return re.itemName&&(t[re.itemName]=e),t}function V(){return e.autoselect?0:-1}function W(e){re.loading!=e&&(re.loading=e),re.hidden=_()}function _(){return re.loading&&!j()||K()||!he?!0:!U()}function U(){return G()&&j()||ie()}function j(){return re.matches.length?!0:!1}function K(){return re.scope.selectedItem?!0:!1}function Y(){return re.loading&&!K()}function z(){return q(re.matches[re.index])}function G(){return(e.searchText||"").length>=H()}function J(e,t,n){Object.defineProperty(re,e,{get:function(){return n},set:function(e){var o=n;n=e,t(e,o)}})}function Q(t){i.nextTick(function(){q(re.matches[t]).then(function(e){var t=me.$.input.controller("ngModel");t.$setViewValue(e),t.$render()})["finally"](function(){e.selectedItem=re.matches[t],W(!1)})},!1)}function X(){W(!0),re.index=0,re.matches=[],e.searchText="",Q(-1);var t=document.createEvent("CustomEvent");t.initCustomEvent("input",!0,!0,{value:e.searchText}),me.input.dispatchEvent(t),me.input.focus()}function Z(n){function o(t){se[a]=t,(n||"")===(e.searchText||"")&&(re.matches=t,re.hidden=_(),e.selectOnMatch&&ae(),ee(),f())}var l=e.$parent.$eval(ue),a=n.toLowerCase();t.isArray(l)?o(l):l&&(W(!0),i.nextTick(function(){l.success&&l.success(o),l.then&&l.then(o),l["finally"]&&l["finally"](function(){W(!1)})},!0,e))}function ee(){z().then(function(e){re.messages=[te(),e]})}function te(){if(fe===re.matches.length)return"";switch(fe=re.matches.length,re.matches.length){case 0:return"There are no matches available.";case 1:return"There is 1 match available.";default:return"There are "+re.matches.length+" matches available."}}function ne(){if(me.li[0]){var e=me.li[0].offsetHeight,t=e*re.index,n=t+e,o=me.scroller.clientHeight,i=me.scroller.scrollTop;i>t?oe(t):n>i+o&&oe(n-o)}}function oe(e){me.$.scrollContainer.controller("mdVirtualRepeatContainer").scrollTo(e)}function ie(){var e=(re.scope.searchText||"").length;return re.hasNotFound&&!j()&&!re.loading&&e>=H()&&he&&!K()}function le(){var t=e.searchText,n=t.toLowerCase();!e.noCache&&se[n]?(re.matches=se[n],ee()):Z(t),re.hidden=_()}function ae(){var t=e.searchText,n=re.matches,o=n[0];1===n.length&&q(o).then(function(e){t==e&&Q(0)})}var re=this,ce=e.itemsExpr.split(/ in /i),ue=ce[1],me=null,se={},de=!1,pe=[],he=!1,fe=0;return J("hidden",T,!0),re.scope=e,re.parent=e.$parent,re.itemName=ce[0],re.matches=[],re.loading=!1,re.hidden=!0,re.index=null,re.messages=[],re.id=i.nextUid(),re.isDisabled=null,re.isRequired=null,re.hasNotFound=!1,re.keydown=F,re.blur=L,re.focus=S,re.clear=X,re.select=Q,re.listEnter=w,re.listLeave=y,re.mouseUp=E,re.getCurrentDisplayValue=z,re.registerSelectedItemWatcher=N,re.unregisterSelectedItemWatcher=D,re.notFoundVisible=ie,re.loadingIsVisible=Y,h()}function i(){var e=!1;return{controller:"MdAutocompleteCtrl",controllerAs:"$mdAutocompleteCtrl",scope:{inputName:"@mdInputName",inputMinlength:"@mdInputMinlength",inputMaxlength:"@mdInputMaxlength",searchText:"=?mdSearchText",selectedItem:"=?mdSelectedItem",itemsExpr:"@mdItems",itemText:"&mdItemText",placeholder:"@placeholder",noCache:"=?mdNoCache",selectOnMatch:"=?mdSelectOnMatch",itemChange:"&?mdSelectedItemChange",textChange:"&?mdSearchTextChange",minLength:"=?mdMinLength",delay:"=?mdDelay",autofocus:"=?mdAutofocus",floatingLabel:"@?mdFloatingLabel",autoselect:"=?mdAutoselect",menuClass:"@?mdMenuClass",inputId:"@?mdInputId"},link:function(t,n,o,i){i.hasNotFound=e},template:function(t,n){function o(){var e=t.find("md-item-template").detach(),n=e.length?e.html():t.html();return e.length||t.empty(),"<md-autocomplete-parent-scope md-autocomplete-replace>"+n+"</md-autocomplete-parent-scope>"}function i(){var e=t.find("md-not-found").detach(),n=e.length?e.html():"";return n?'<li ng-if="$mdAutocompleteCtrl.notFoundVisible()" md-autocomplete-parent-scope>'+n+"</li>":""}function l(){return n.mdFloatingLabel?' <md-input-container flex ng-if="floatingLabel"> <label>{{floatingLabel}}</label> <input type="search" '+(null!=u?'tabindex="'+u+'"':"")+' id="{{ inputId || \'fl-input-\' + $mdAutocompleteCtrl.id }}" name="{{inputName}}" autocomplete="off" ng-required="$mdAutocompleteCtrl.isRequired" ng-minlength="inputMinlength" ng-maxlength="inputMaxlength" ng-disabled="$mdAutocompleteCtrl.isDisabled" ng-model="$mdAutocompleteCtrl.scope.searchText" ng-keydown="$mdAutocompleteCtrl.keydown($event)" ng-blur="$mdAutocompleteCtrl.blur()" ng-focus="$mdAutocompleteCtrl.focus()" aria-owns="ul-{{$mdAutocompleteCtrl.id}}" aria-label="{{floatingLabel}}" aria-autocomplete="list" aria-haspopup="true" aria-activedescendant="" aria-expanded="{{!$mdAutocompleteCtrl.hidden}}"/> <div md-autocomplete-parent-scope md-autocomplete-replace>'+c+"</div> </md-input-container>":' <input flex type="search" '+(null!=u?'tabindex="'+u+'"':"")+' id="{{ inputId || \'input-\' + $mdAutocompleteCtrl.id }}" name="{{inputName}}" ng-if="!floatingLabel" autocomplete="off" ng-required="$mdAutocompleteCtrl.isRequired" ng-disabled="$mdAutocompleteCtrl.isDisabled" ng-model="$mdAutocompleteCtrl.scope.searchText" ng-keydown="$mdAutocompleteCtrl.keydown($event)" ng-blur="$mdAutocompleteCtrl.blur()" ng-focus="$mdAutocompleteCtrl.focus()" placeholder="{{placeholder}}" aria-owns="ul-{{$mdAutocompleteCtrl.id}}" aria-label="{{placeholder}}" aria-autocomplete="list" aria-haspopup="true" aria-activedescendant="" aria-expanded="{{!$mdAutocompleteCtrl.hidden}}"/> <button type="button" tabindex="-1" ng-if="$mdAutocompleteCtrl.scope.searchText && !$mdAutocompleteCtrl.isDisabled" ng-click="$mdAutocompleteCtrl.clear()"> <md-icon md-svg-icon="md-close"></md-icon> <span class="md-visually-hidden">Clear</span> </button> '}var a=i(),r=o(),c=t.html(),u=n.tabindex;return a&&(e=!0),n.hasOwnProperty("tabindex")&&t.attr("tabindex","-1"),' <md-autocomplete-wrap layout="row" ng-class="{ \'md-whiteframe-z1\': !floatingLabel, \'md-menu-showing\': !$mdAutocompleteCtrl.hidden }" role="listbox"> '+l()+' <md-progress-linear ng-if="$mdAutocompleteCtrl.loadingIsVisible()" md-mode="indeterminate"></md-progress-linear> <md-virtual-repeat-container md-auto-shrink md-auto-shrink-min="1" ng-hide="$mdAutocompleteCtrl.hidden" class="md-autocomplete-suggestions-container md-whiteframe-z1" role="presentation"> <ul class="md-autocomplete-suggestions" ng-class="::menuClass" id="ul-{{$mdAutocompleteCtrl.id}}" ng-mouseenter="$mdAutocompleteCtrl.listEnter()" ng-mouseleave="$mdAutocompleteCtrl.listLeave()" ng-mouseup="$mdAutocompleteCtrl.mouseUp()"> <li md-virtual-repeat="item in $mdAutocompleteCtrl.matches" ng-class="{ selected: $index === $mdAutocompleteCtrl.index }" ng-click="$mdAutocompleteCtrl.select($index)" md-extra-name="$mdAutocompleteCtrl.itemName"> '+r+" </li>"+a+' </ul> </md-virtual-repeat-container> </md-autocomplete-wrap> <aria-status class="md-visually-hidden" role="status" aria-live="assertive"> <p ng-repeat="message in $mdAutocompleteCtrl.messages track by $index" ng-if="message">{{message}}</p> </aria-status>'}}}function l(e,t){function n(n,o,i){function l(e,o){r[o]=n[e],n.$watch(e,function(e){t.nextTick(function(){r[o]=e})})}var a=n.$mdAutocompleteCtrl,r=a.parent.$new(),c=a.itemName;l("$index","$index"),l("item",c),e(o.contents())(r),i.hasOwnProperty("mdAutocompleteReplace")&&(o.after(o.contents()),o.remove())}return{restrict:"AE",link:n,terminal:!0}}function a(e,n,o){function i(i,l){var r=null,c=null,u=o.mdHighlightFlags||"",m=e.$watch(function(e){return{term:i(e),unsafeText:l(e)}},function(e,o){(null===r||e.unsafeText!==o.unsafeText)&&(r=t.element("<div>").text(e.unsafeText).html()),(null===c||e.term!==o.term)&&(c=a(e.term,u)),n.html(r.replace(c,'<span class="highlight">$&</span>'))},!0);n.on("$destroy",function(){m()})}function l(e){return e&&e.replace(/[\\\^\$\*\+\?\.\(\)\|\{}\[\]]/g,"\\$&")}function a(e,t){var n="";return t.indexOf("^")>=1&&(n+="^"),n+=e,t.indexOf("$")>=1&&(n+="$"),new RegExp(l(n),t.replace(/[\$\^]/g,""))}this.init=i}function r(e,t){return{terminal:!0,controller:"MdHighlightCtrl",compile:function(n,o){var i=t(o.mdHighlightText),l=e(n.html());return function(e,t,n,o){o.init(i,l)}}}}t.module("material.components.autocomplete",["material.core","material.components.icon","material.components.virtualRepeat"]),t.module("material.components.autocomplete").controller("MdAutocompleteCtrl",o);var c=41,u=5.5*c,m=8;o.$inject=["$scope","$element","$mdUtil","$mdConstant","$mdTheming","$window","$animate","$rootElement","$attrs","$q"],t.module("material.components.autocomplete").directive("mdAutocomplete",i),t.module("material.components.autocomplete").directive("mdAutocompleteParentScope",l),l.$inject=["$compile","$mdUtil"],t.module("material.components.autocomplete").controller("MdHighlightCtrl",a),a.$inject=["$scope","$element","$attrs"],t.module("material.components.autocomplete").directive("mdHighlightText",r),r.$inject=["$interpolate","$parse"]}(window,window.angular);