blob: 1ce8a81f8bb8b7535d6adaf9261cde92e0b5f3aa [file] [log] [blame]
/*!
* Angular Material Design
* https://github.com/angular/material
* @license MIT
* v1.0.0-master-19c11fd
*/
!function(t,e,i){"use strict";function n(t,i){function n(n,o){return n.append(i.processTemplate(s)),function(i,n,s,o){n.addClass("md-chip"),t(n),o&&e.element(n[0].querySelector(".md-chip-content")).on("blur",function(){o.selectedChip=-1})}}var s=i.processTemplate(d);return{restrict:"E",require:"^?mdChips",compile:n}}function s(t){function e(e,i,n,s){i.on("click",function(t){e.$apply(function(){s.removeChip(e.$$replacedScope.$index)})}),t(function(){i.attr({tabindex:-1,"aria-hidden":!0}),i.find("button").attr("tabindex","-1")})}return{restrict:"A",require:"^mdChips",scope:!1,link:e}}function o(t){function e(e,i,n){var s=e.$parent.$mdChipsCtrl,o=s.parent.$new(!1,s.parent);o.$$replacedScope=e,o.$chip=e.$chip,o.$index=e.$index,o.$mdChipsCtrl=s;var r=s.$scope.$eval(n.mdChipTransclude);i.html(r),t(i.contents())(o)}return{restrict:"EA",terminal:!0,link:e,scope:!1}}function r(t,e,i,n,s){this.$timeout=s,this.$mdConstant=e,this.$scope=t,this.parent=t.$parent,this.$log=i,this.$element=n,this.ngModelCtrl=null,this.userInputNgModelCtrl=null,this.userInputElement=null,this.items=[],this.selectedChip=-1,this.hasAutocomplete=!1,this.deleteHint="Press delete to remove this chip.",this.deleteButtonLabel="Remove",this.chipBuffer="",this.useOnAppend=!1,this.useTransformChip=!1,this.useOnAdd=!1,this.useOnRemove=!1,this.useOnSelect=!1}function c(t,e,i,n,s){function o(o,r){function p(t){if(r.ngModel){var e=h[0].querySelector(t);return e&&e.outerHTML}}var h=r.$mdUserTemplate;r.$mdUserTemplate=null;var d=p("md-chips>*[md-chip-remove]")||c.remove,l=p("md-chips>md-chip-template")||c["default"],a=p("md-chips>md-autocomplete")||p("md-chips>input")||c.input,m=h.find("md-chip");return h[0].querySelector("md-chip-template>*[md-chip-remove]")&&n.warn("invalid placement of md-chip-remove within md-chip-template."),function(n,o,p,h){e.initOptionalProperties(n,r),t(o);var u=h[0];if(u.chipContentsTemplate=l,u.chipRemoveTemplate=d,u.chipInputTemplate=a,o.attr({"aria-hidden":!0,tabindex:-1}).on("focus",function(){u.onFocus()}),r.ngModel&&(u.configureNgModel(o.controller("ngModel")),p.mdTransformChip&&u.useTransformChipExpression(),p.mdOnAppend&&u.useOnAppendExpression(),p.mdOnAdd&&u.useOnAddExpression(),p.mdOnRemove&&u.useOnRemoveExpression(),p.mdOnSelect&&u.useOnSelectExpression(),a!=c.input&&n.$watch("$mdChipsCtrl.readonly",function(t){t||e.nextTick(function(){0===a.indexOf("<md-autocomplete")&&u.configureAutocomplete(o.find("md-autocomplete").controller("mdAutocomplete")),u.configureUserInput(o.find("input"))})}),e.nextTick(function(){var t=o.find("input");t&&t.toggleClass("md-input",!0)})),m.length>0){var C=i(m.clone())(n.$parent);s(function(){o.find("md-chips-wrap").prepend(C)})}}}function r(){return{chips:e.processTemplate(l),input:e.processTemplate(a),"default":e.processTemplate(m),remove:e.processTemplate(u)}}var c=r();return{template:function(t,e){return e.$mdUserTemplate=t.clone(),c.chips},require:["mdChips"],restrict:"E",controller:"MdChipsCtrl",controllerAs:"$mdChipsCtrl",bindToController:!0,compile:o,scope:{readonly:"=readonly",placeholder:"@",secondaryPlaceholder:"@",transformChip:"&mdTransformChip",onAppend:"&mdOnAppend",onAdd:"&mdOnAdd",onRemove:"&mdOnRemove",onSelect:"&mdOnSelect",deleteHint:"@",deleteButtonLabel:"@",separatorKeys:"=?mdSeparatorKeys",requireMatch:"=?mdRequireMatch"}}}function p(){this.selectedItem=null,this.searchText=""}function h(t,e){function i(i,n){return function(i,s,o,r){e.initOptionalProperties(i,n),t(s),s.attr("tabindex","-1")}}return{template:function(t,e){return C},restrict:"E",controller:"MdContactChipsCtrl",controllerAs:"$mdContactChipsCtrl",bindToController:!0,compile:i,scope:{contactQuery:"&mdContacts",placeholder:"@",secondaryPlaceholder:"@",contactName:"@mdContactName",contactImage:"@mdContactImage",contactEmail:"@mdContactEmail",contacts:"=ngModel",requireMatch:"=?mdRequireMatch",highlightFlags:"@?mdHighlightFlags"}}}e.module("material.components.chips",["material.core","material.components.autocomplete"]),e.module("material.components.chips").directive("mdChip",n);var d=' <span ng-if="!$mdChipsCtrl.readonly" class="md-visually-hidden"> {{$mdChipsCtrl.deleteHint}} </span>';n.$inject=["$mdTheming","$mdUtil"],e.module("material.components.chips").directive("mdChipRemove",s),s.$inject=["$timeout"],e.module("material.components.chips").directive("mdChipTransclude",o),o.$inject=["$compile"],e.module("material.components.chips").controller("MdChipsCtrl",r),r.$inject=["$scope","$mdConstant","$log","$element","$timeout"],r.prototype.inputKeydown=function(t){var e=this.getChipBuffer();if(!(this.hasAutocomplete&&t.isDefaultPrevented&&t.isDefaultPrevented())){if(t.keyCode===this.$mdConstant.KEY_CODE.BACKSPACE){if(e)return;return t.preventDefault(),t.stopPropagation(),void(this.items.length&&this.selectAndFocusChipSafe(this.items.length-1))}if((!this.separatorKeys||this.separatorKeys.length<1)&&(this.separatorKeys=[this.$mdConstant.KEY_CODE.ENTER]),-1!==this.separatorKeys.indexOf(t.keyCode)){if(this.hasAutocomplete&&this.requireMatch||!e)return;t.preventDefault(),this.appendChip(e),this.resetChipBuffer()}}},r.prototype.chipKeydown=function(t){if(!this.getChipBuffer())switch(t.keyCode){case this.$mdConstant.KEY_CODE.BACKSPACE:case this.$mdConstant.KEY_CODE.DELETE:if(this.selectedChip<0)return;t.preventDefault(),this.removeAndSelectAdjacentChip(this.selectedChip);break;case this.$mdConstant.KEY_CODE.LEFT_ARROW:t.preventDefault(),this.selectedChip<0&&(this.selectedChip=this.items.length),this.items.length&&this.selectAndFocusChipSafe(this.selectedChip-1);break;case this.$mdConstant.KEY_CODE.RIGHT_ARROW:t.preventDefault(),this.selectAndFocusChipSafe(this.selectedChip+1);break;case this.$mdConstant.KEY_CODE.ESCAPE:case this.$mdConstant.KEY_CODE.TAB:if(this.selectedChip<0)return;t.preventDefault(),this.onFocus()}},r.prototype.getPlaceholder=function(){var t=this.items.length&&(""==this.secondaryPlaceholder||this.secondaryPlaceholder);return t?this.placeholder:this.secondaryPlaceholder},r.prototype.removeAndSelectAdjacentChip=function(t){var i=this.getAdjacentChipIndex(t);this.removeChip(t),this.$timeout(e.bind(this,function(){this.selectAndFocusChipSafe(i)}))},r.prototype.resetSelectedChip=function(){this.selectedChip=-1},r.prototype.getAdjacentChipIndex=function(t){var e=this.items.length-1;return 0==e?-1:t==e?t-1:t},r.prototype.appendChip=function(t){if(this.useTransformChip&&this.transformChip){var i=this.transformChip({$chip:t});e.isDefined(i)&&(t=i)}if(e.isObject(t)){var n=this.items.some(function(i){return e.equals(t,i)});if(n)return}if(!(null==t||this.items.indexOf(t)+1)){var s=this.items.push(t);this.useOnAdd&&this.onAdd&&this.onAdd({$chip:t,$index:s})}},r.prototype.useOnAppendExpression=function(){this.$log.warn("md-on-append is deprecated; please use md-transform-chip or md-on-add instead"),this.useTransformChip&&this.transformChip||(this.useTransformChip=!0,this.transformChip=this.onAppend)},r.prototype.useTransformChipExpression=function(){this.useTransformChip=!0},r.prototype.useOnAddExpression=function(){this.useOnAdd=!0},r.prototype.useOnRemoveExpression=function(){this.useOnRemove=!0},r.prototype.useOnSelectExpression=function(){this.useOnSelect=!0},r.prototype.getChipBuffer=function(){return this.userInputElement?this.userInputNgModelCtrl?this.userInputNgModelCtrl.$viewValue:this.userInputElement[0].value:this.chipBuffer},r.prototype.resetChipBuffer=function(){this.userInputElement?this.userInputNgModelCtrl?(this.userInputNgModelCtrl.$setViewValue(""),this.userInputNgModelCtrl.$render()):this.userInputElement[0].value="":this.chipBuffer=""},r.prototype.removeChip=function(t){var e=this.items.splice(t,1);e&&e.length&&this.useOnRemove&&this.onRemove&&this.onRemove({$chip:e[0],$index:t})},r.prototype.removeChipAndFocusInput=function(t){this.removeChip(t),this.onFocus()},r.prototype.selectAndFocusChipSafe=function(t){return this.items.length?t===this.items.length?this.onFocus():(t=Math.max(t,0),t=Math.min(t,this.items.length-1),this.selectChip(t),void this.focusChip(t)):(this.selectChip(-1),void this.onFocus())},r.prototype.selectChip=function(t){t>=-1&&t<=this.items.length?(this.selectedChip=t,this.useOnSelect&&this.onSelect&&this.onSelect({$chip:this.items[this.selectedChip]})):this.$log.warn("Selected Chip index out of bounds; ignoring.")},r.prototype.selectAndFocusChip=function(t){this.selectChip(t),-1!=t&&this.focusChip(t)},r.prototype.focusChip=function(t){this.$element[0].querySelector('md-chip[index="'+t+'"] .md-chip-content').focus()},r.prototype.configureNgModel=function(t){this.ngModelCtrl=t;var e=this;t.$render=function(){e.items=e.ngModelCtrl.$viewValue}},r.prototype.onFocus=function(){var t=this.$element[0].querySelector("input");t&&t.focus(),this.resetSelectedChip()},r.prototype.onInputFocus=function(){this.inputHasFocus=!0,this.resetSelectedChip()},r.prototype.onInputBlur=function(){this.inputHasFocus=!1},r.prototype.configureUserInput=function(t){this.userInputElement=t;var i=t.controller("ngModel");i!=this.ngModelCtrl&&(this.userInputNgModelCtrl=i);var n=this.$scope,s=this,o=function(t,i){n.$evalAsync(e.bind(s,i,t))};t.attr({tabindex:0}).on("keydown",function(t){o(t,s.inputKeydown)}).on("focus",function(t){o(t,s.onInputFocus)}).on("blur",function(t){o(t,s.onInputBlur)})},r.prototype.configureAutocomplete=function(t){t&&(this.hasAutocomplete=!0,t.registerSelectedItemWatcher(e.bind(this,function(t){t&&(this.appendChip(t),this.resetChipBuffer())})),this.$element.find("input").on("focus",e.bind(this,this.onInputFocus)).on("blur",e.bind(this,this.onInputBlur)))},r.prototype.hasFocus=function(){return this.inputHasFocus||this.selectedChip>=0},e.module("material.components.chips").directive("mdChips",c);var l=' <md-chips-wrap ng-if="!$mdChipsCtrl.readonly || $mdChipsCtrl.items.length > 0" ng-keydown="$mdChipsCtrl.chipKeydown($event)" ng-class="{ \'md-focused\': $mdChipsCtrl.hasFocus(), \'md-readonly\': !$mdChipsCtrl.ngModelCtrl }" class="md-chips"> <md-chip ng-repeat="$chip in $mdChipsCtrl.items" index="{{$index}}" ng-class="{\'md-focused\': $mdChipsCtrl.selectedChip == $index, \'md-readonly\': $mdChipsCtrl.readonly}"> <div class="md-chip-content" tabindex="-1" aria-hidden="true" ng-focus="!$mdChipsCtrl.readonly && $mdChipsCtrl.selectChip($index)" md-chip-transclude="$mdChipsCtrl.chipContentsTemplate"></div> <div ng-if="!$mdChipsCtrl.readonly" class="md-chip-remove-container" md-chip-transclude="$mdChipsCtrl.chipRemoveTemplate"></div> </md-chip> <div ng-if="!$mdChipsCtrl.readonly && $mdChipsCtrl.ngModelCtrl" class="md-chip-input-container" md-chip-transclude="$mdChipsCtrl.chipInputTemplate"></div> </div> </md-chips-wrap>',a=' <input class="md-input" tabindex="0" placeholder="{{$mdChipsCtrl.getPlaceholder()}}" aria-label="{{$mdChipsCtrl.getPlaceholder()}}" ng-model="$mdChipsCtrl.chipBuffer" ng-focus="$mdChipsCtrl.onInputFocus()" ng-blur="$mdChipsCtrl.onInputBlur()" ng-keydown="$mdChipsCtrl.inputKeydown($event)">',m=" <span>{{$chip}}</span>",u=' <button class="md-chip-remove" ng-if="!$mdChipsCtrl.readonly" ng-click="$mdChipsCtrl.removeChipAndFocusInput($$replacedScope.$index)" type="button" aria-hidden="true" tabindex="-1"> <md-icon md-svg-icon="md-close"></md-icon> <span class="md-visually-hidden"> {{$mdChipsCtrl.deleteButtonLabel}} </span> </button>';c.$inject=["$mdTheming","$mdUtil","$compile","$log","$timeout"],e.module("material.components.chips").controller("MdContactChipsCtrl",p),p.prototype.queryContact=function(t){var i=this.contactQuery({$query:t});return this.filterSelected?i.filter(e.bind(this,this.filterSelectedContacts)):i},p.prototype.itemName=function(t){return t[this.contactName]},p.prototype.filterSelectedContacts=function(t){return-1==this.contacts.indexOf(t)},e.module("material.components.chips").directive("mdContactChips",h);var C=' <md-chips class="md-contact-chips" ng-model="$mdContactChipsCtrl.contacts" md-require-match="$mdContactChipsCtrl.requireMatch" md-autocomplete-snap> <md-autocomplete md-menu-class="md-contact-chips-suggestions" md-selected-item="$mdContactChipsCtrl.selectedItem" md-search-text="$mdContactChipsCtrl.searchText" md-items="item in $mdContactChipsCtrl.queryContact($mdContactChipsCtrl.searchText)" md-item-text="$mdContactChipsCtrl.itemName(item)" md-no-cache="true" md-autoselect placeholder="{{$mdContactChipsCtrl.contacts.length == 0 ? $mdContactChipsCtrl.placeholder : $mdContactChipsCtrl.secondaryPlaceholder}}"> <div class="md-contact-suggestion"> <img ng-src="{{item[$mdContactChipsCtrl.contactImage]}}" alt="{{item[$mdContactChipsCtrl.contactName]}}" ng-if="item[$mdContactChipsCtrl.contactImage]" /> <span class="md-contact-name" md-highlight-text="$mdContactChipsCtrl.searchText" md-highlight-flags="{{$mdContactChipsCtrl.highlightFlags}}"> {{item[$mdContactChipsCtrl.contactName]}} </span> <span class="md-contact-email" >{{item[$mdContactChipsCtrl.contactEmail]}}</span> </div> </md-autocomplete> <md-chip-template> <div class="md-contact-avatar"> <img ng-src="{{$chip[$mdContactChipsCtrl.contactImage]}}" alt="{{$chip[$mdContactChipsCtrl.contactName]}}" ng-if="$chip[$mdContactChipsCtrl.contactImage]" /> </div> <div class="md-contact-name"> {{$chip[$mdContactChipsCtrl.contactName]}} </div> </md-chip-template> </md-chips>';h.$inject=["$mdTheming","$mdUtil"]}(window,window.angular);