From 2a884c6175306df720787ed4a94a7a797b0f5395 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Wed, 10 Feb 2016 18:30:15 +0100 Subject: [PATCH] feat(autocomplete): support readonly attribute Fixes #5507 Closes #7107 --- .../autocomplete/autocomplete.spec.js | 50 +++++++++++++++++++ .../autocomplete/js/autocompleteController.js | 2 + .../autocomplete/js/autocompleteDirective.js | 2 + 3 files changed, 54 insertions(+) diff --git a/src/components/autocomplete/autocomplete.spec.js b/src/components/autocomplete/autocomplete.spec.js index 5778beebf5d..f237ed84736 100644 --- a/src/components/autocomplete/autocomplete.spec.js +++ b/src/components/autocomplete/autocomplete.spec.js @@ -119,6 +119,56 @@ describe('', function() { element.remove(); })); + it('should allow allow using ng-readonly', inject(function() { + var scope = createScope(null, {inputId: 'custom-input-id'}); + var template = '\ + \ + {{item.display}}\ + '; + var element = compile(template, scope); + var input = element.find('input'); + + scope.readonly = true; + scope.$digest(); + + expect(input.attr('readonly')).toBe('readonly'); + + scope.readonly = false; + scope.$digest(); + + expect(input.attr('readonly')).toBeUndefined(); + + element.remove(); + })); + + it('should allow allow using an empty readonly attribute', inject(function() { + var scope = createScope(null, {inputId: 'custom-input-id'}); + var template = '\ + \ + {{item.display}}\ + '; + var element = compile(template, scope); + var input = element.find('input'); + + expect(input.attr('readonly')).toBe('readonly'); + + element.remove(); + })); + it('should allow you to set an input id with floating label', inject(function() { var scope = createScope(null, {inputId: 'custom-input-id'}); var template = '\ diff --git a/src/components/autocomplete/js/autocompleteController.js b/src/components/autocomplete/js/autocompleteController.js index 194f9845186..f9473fcdb52 100644 --- a/src/components/autocomplete/js/autocompleteController.js +++ b/src/components/autocomplete/js/autocompleteController.js @@ -36,6 +36,7 @@ function MdAutocompleteCtrl ($scope, $element, $mdUtil, $mdConstant, $mdTheming, ctrl.id = $mdUtil.nextUid(); ctrl.isDisabled = null; ctrl.isRequired = null; + ctrl.isReadonly = null; ctrl.hasNotFound = false; //-- public methods @@ -166,6 +167,7 @@ function MdAutocompleteCtrl ($scope, $element, $mdUtil, $mdConstant, $mdTheming, var wait = parseInt($scope.delay, 10) || 0; $attrs.$observe('disabled', function (value) { ctrl.isDisabled = $mdUtil.parseAttributeBoolean(value, false); }); $attrs.$observe('required', function (value) { ctrl.isRequired = $mdUtil.parseAttributeBoolean(value, false); }); + $attrs.$observe('readonly', function (value) { ctrl.isReadonly = $mdUtil.parseAttributeBoolean(value, false); }); $scope.$watch('searchText', wait ? $mdUtil.debounce(handleSearchText, wait) : handleSearchText); $scope.$watch('selectedItem', selectedItemChange); angular.element($window).on('resize', positionDropdown); diff --git a/src/components/autocomplete/js/autocompleteDirective.js b/src/components/autocomplete/js/autocompleteDirective.js index 1373d1c2d10..084aebb7343 100644 --- a/src/components/autocomplete/js/autocompleteDirective.js +++ b/src/components/autocomplete/js/autocompleteDirective.js @@ -237,6 +237,7 @@ function MdAutocomplete () { name="{{inputName}}"\ autocomplete="off"\ ng-required="$mdAutocompleteCtrl.isRequired"\ + ng-readonly="$mdAutocompleteCtrl.isReadonly"\ ng-minlength="inputMinlength"\ ng-maxlength="inputMaxlength"\ ng-disabled="$mdAutocompleteCtrl.isDisabled"\ @@ -263,6 +264,7 @@ function MdAutocomplete () { autocomplete="off"\ ng-required="$mdAutocompleteCtrl.isRequired"\ ng-disabled="$mdAutocompleteCtrl.isDisabled"\ + ng-readonly="$mdAutocompleteCtrl.isReadonly"\ ng-model="$mdAutocompleteCtrl.scope.searchText"\ ng-keydown="$mdAutocompleteCtrl.keydown($event)"\ ng-blur="$mdAutocompleteCtrl.blur()"\