diff --git a/src/dropdown/dropdown.js b/src/dropdown/dropdown.js index 1e666f2a7f..a6d066182f 100644 --- a/src/dropdown/dropdown.js +++ b/src/dropdown/dropdown.js @@ -343,316 +343,3 @@ angular.module('ui.bootstrap.dropdown', ['ui.bootstrap.position']) } }; }); - -/* Deprecated dropdown below */ - -angular.module('ui.bootstrap.dropdown') - -.value('$dropdownSuppressWarning', false) - -.service('dropdownService', ['$log', '$dropdownSuppressWarning', 'uibDropdownService', function($log, $dropdownSuppressWarning, uibDropdownService) { - if (!$dropdownSuppressWarning) { - $log.warn('dropdownService is now deprecated. Use uibDropdownService instead.'); - } - - angular.extend(this, uibDropdownService); -}]) - -.controller('DropdownController', ['$scope', '$element', '$attrs', '$parse', 'uibDropdownConfig', 'uibDropdownService', '$animate', '$uibPosition', '$document', '$compile', '$templateRequest', '$log', '$dropdownSuppressWarning', function($scope, $element, $attrs, $parse, dropdownConfig, uibDropdownService, $animate, $position, $document, $compile, $templateRequest, $log, $dropdownSuppressWarning) { - if (!$dropdownSuppressWarning) { - $log.warn('DropdownController is now deprecated. Use UibDropdownController instead.'); - } - - var self = this, - scope = $scope.$new(), // create a child scope so we are not polluting original one - templateScope, - openClass = dropdownConfig.openClass, - getIsOpen, - setIsOpen = angular.noop, - toggleInvoker = $attrs.onToggle ? $parse($attrs.onToggle) : angular.noop, - appendToBody = false, - keynavEnabled =false, - selectedOption = null; - - - $element.addClass('dropdown'); - - this.init = function() { - if ($attrs.isOpen) { - getIsOpen = $parse($attrs.isOpen); - setIsOpen = getIsOpen.assign; - - $scope.$watch(getIsOpen, function(value) { - scope.isOpen = !!value; - }); - } - - appendToBody = angular.isDefined($attrs.dropdownAppendToBody); - keynavEnabled = angular.isDefined($attrs.uibKeyboardNav); - - if (appendToBody && self.dropdownMenu) { - $document.find('body').append(self.dropdownMenu); - $element.on('$destroy', function handleDestroyEvent() { - self.dropdownMenu.remove(); - }); - } - }; - - this.toggle = function(open) { - return scope.isOpen = arguments.length ? !!open : !scope.isOpen; - }; - - // Allow other directives to watch status - this.isOpen = function() { - return scope.isOpen; - }; - - scope.getToggleElement = function() { - return self.toggleElement; - }; - - scope.getAutoClose = function() { - return $attrs.autoClose || 'always'; //or 'outsideClick' or 'disabled' - }; - - scope.getElement = function() { - return $element; - }; - - scope.isKeynavEnabled = function() { - return keynavEnabled; - }; - - scope.focusDropdownEntry = function(keyCode) { - var elems = self.dropdownMenu ? //If append to body is used. - (angular.element(self.dropdownMenu).find('a')) : - (angular.element($element).find('ul').eq(0).find('a')); - - switch (keyCode) { - case (40): { - if (!angular.isNumber(self.selectedOption)) { - self.selectedOption = 0; - } else { - self.selectedOption = (self.selectedOption === elems.length -1 ? - self.selectedOption : - self.selectedOption + 1); - } - break; - } - case (38): { - if (!angular.isNumber(self.selectedOption)) { - self.selectedOption = elems.length - 1; - } else { - self.selectedOption = self.selectedOption === 0 ? - 0 : self.selectedOption - 1; - } - break; - } - } - elems[self.selectedOption].focus(); - }; - - scope.getDropdownElement = function() { - return self.dropdownMenu; - }; - - scope.focusToggleElement = function() { - if (self.toggleElement) { - self.toggleElement[0].focus(); - } - }; - - scope.$watch('isOpen', function(isOpen, wasOpen) { - if (appendToBody && self.dropdownMenu) { - var pos = $position.positionElements($element, self.dropdownMenu, 'bottom-left', true); - var css = { - top: pos.top + 'px', - display: isOpen ? 'block' : 'none' - }; - - var rightalign = self.dropdownMenu.hasClass('dropdown-menu-right'); - if (!rightalign) { - css.left = pos.left + 'px'; - css.right = 'auto'; - } else { - css.left = 'auto'; - css.right = (window.innerWidth - (pos.left + $element.prop('offsetWidth'))) + 'px'; - } - - self.dropdownMenu.css(css); - } - - $animate[isOpen ? 'addClass' : 'removeClass']($element, openClass).then(function() { - if (angular.isDefined(isOpen) && isOpen !== wasOpen) { - toggleInvoker($scope, { open: !!isOpen }); - } - }); - - if (isOpen) { - if (self.dropdownMenuTemplateUrl) { - $templateRequest(self.dropdownMenuTemplateUrl).then(function(tplContent) { - templateScope = scope.$new(); - $compile(tplContent.trim())(templateScope, function(dropdownElement) { - var newEl = dropdownElement; - self.dropdownMenu.replaceWith(newEl); - self.dropdownMenu = newEl; - }); - }); - } - - scope.focusToggleElement(); - uibDropdownService.open(scope); - } else { - if (self.dropdownMenuTemplateUrl) { - if (templateScope) { - templateScope.$destroy(); - } - var newEl = angular.element(''); - self.dropdownMenu.replaceWith(newEl); - self.dropdownMenu = newEl; - } - - uibDropdownService.close(scope); - self.selectedOption = null; - } - - if (angular.isFunction(setIsOpen)) { - setIsOpen($scope, isOpen); - } - }); - - $scope.$on('$locationChangeSuccess', function() { - if (scope.getAutoClose() !== 'disabled') { - scope.isOpen = false; - } - }); - - var offDestroy = $scope.$on('$destroy', function() { - scope.$destroy(); - }); - scope.$on('$destroy', offDestroy); -}]) - -.directive('dropdown', ['$log', '$dropdownSuppressWarning', function($log, $dropdownSuppressWarning) { - return { - controller: 'DropdownController', - link: function(scope, element, attrs, dropdownCtrl) { - if (!$dropdownSuppressWarning) { - $log.warn('dropdown is now deprecated. Use uib-dropdown instead.'); - } - - dropdownCtrl.init(); - } - }; -}]) - -.directive('dropdownMenu', ['$log', '$dropdownSuppressWarning', function($log, $dropdownSuppressWarning) { - return { - restrict: 'AC', - require: '?^dropdown', - link: function(scope, element, attrs, dropdownCtrl) { - if (!dropdownCtrl || angular.isDefined(attrs.dropdownNested)) { - return; - } - - if (!$dropdownSuppressWarning) { - $log.warn('dropdown-menu is now deprecated. Use uib-dropdown-menu instead.'); - } - - element.addClass('dropdown-menu'); - - var tplUrl = attrs.templateUrl; - if (tplUrl) { - dropdownCtrl.dropdownMenuTemplateUrl = tplUrl; - } - - if (!dropdownCtrl.dropdownMenu) { - dropdownCtrl.dropdownMenu = element; - } - } - }; -}]) - -.directive('keyboardNav', ['$log', '$dropdownSuppressWarning', function($log, $dropdownSuppressWarning) { - return { - restrict: 'A', - require: '?^dropdown', - link: function(scope, element, attrs, dropdownCtrl) { - if (!$dropdownSuppressWarning) { - $log.warn('keyboard-nav is now deprecated. Use uib-keyboard-nav instead.'); - } - - element.bind('keydown', function(e) { - if ([38, 40].indexOf(e.which) !== -1) { - e.preventDefault(); - e.stopPropagation(); - - var elems = dropdownCtrl.dropdownMenu.find('a'); - - switch (e.which) { - case (40): { // Down - if (!angular.isNumber(dropdownCtrl.selectedOption)) { - dropdownCtrl.selectedOption = 0; - } else { - dropdownCtrl.selectedOption = dropdownCtrl.selectedOption === elems.length -1 ? - dropdownCtrl.selectedOption : dropdownCtrl.selectedOption + 1; - } - break; - } - case (38): { // Up - if (!angular.isNumber(dropdownCtrl.selectedOption)) { - dropdownCtrl.selectedOption = elems.length - 1; - } else { - dropdownCtrl.selectedOption = dropdownCtrl.selectedOption === 0 ? - 0 : dropdownCtrl.selectedOption - 1; - } - break; - } - } - elems[dropdownCtrl.selectedOption].focus(); - } - }); - } - }; -}]) - -.directive('dropdownToggle', ['$log', '$dropdownSuppressWarning', function($log, $dropdownSuppressWarning) { - return { - require: '?^dropdown', - link: function(scope, element, attrs, dropdownCtrl) { - if (!$dropdownSuppressWarning) { - $log.warn('dropdown-toggle is now deprecated. Use uib-dropdown-toggle instead.'); - } - - if (!dropdownCtrl) { - return; - } - - element.addClass('dropdown-toggle'); - - dropdownCtrl.toggleElement = element; - - var toggleDropdown = function(event) { - event.preventDefault(); - - if (!element.hasClass('disabled') && !attrs.disabled) { - scope.$apply(function() { - dropdownCtrl.toggle(); - }); - } - }; - - element.bind('click', toggleDropdown); - - // WAI-ARIA - element.attr({ 'aria-haspopup': true, 'aria-expanded': false }); - scope.$watch(dropdownCtrl.isOpen, function(isOpen) { - element.attr('aria-expanded', !!isOpen); - }); - - scope.$on('$destroy', function() { - element.unbind('click', toggleDropdown); - }); - } - }; -}]); diff --git a/src/dropdown/test/dropdown.spec.js b/src/dropdown/test/dropdown.spec.js index 6d6a87d7d8..357a33677c 100644 --- a/src/dropdown/test/dropdown.spec.js +++ b/src/dropdown/test/dropdown.spec.js @@ -685,43 +685,3 @@ describe('dropdownToggle', function() { }); }); }); - -/* Deprecation tests below */ - -describe('dropdown deprecation', function() { - beforeEach(module('ngAnimateMock')); - beforeEach(module('ui.bootstrap.dropdown')); - - it('should suppress warning', function() { - module(function($provide) { - $provide.value('$dropdownSuppressWarning', true); - }); - - inject(function($compile, $log, $rootScope) { - spyOn($log, 'warn'); - var element = $compile('
  • ')($rootScope); - $rootScope.$digest(); - expect($log.warn.calls.count()).toBe(0); - }); - }); - - it('should give warning by default', inject(function($compile, $log, $rootScope) { - spyOn($log, 'warn'); - var element = $compile('
  • ')($rootScope); - $rootScope.$digest(); - expect($log.warn.calls.count()).toBe(3); - expect($log.warn.calls.argsFor(0)).toEqual(['DropdownController is now deprecated. Use UibDropdownController instead.']); - expect($log.warn.calls.argsFor(1)).toEqual(['dropdown-toggle is now deprecated. Use uib-dropdown-toggle instead.']); - expect($log.warn.calls.argsFor(2)).toEqual(['dropdown is now deprecated. Use uib-dropdown instead.']); - })); - - it('should give warning by default for keyboardNav', inject(function($compile, $log, $rootScope) { - spyOn($log, 'warn'); - var element = $compile('
  • ')($rootScope); - $rootScope.$digest(); - expect($log.warn.calls.count()).toBe(3); - expect($log.warn.calls.argsFor(0)).toEqual(['DropdownController is now deprecated. Use UibDropdownController instead.']); - expect($log.warn.calls.argsFor(1)).toEqual(['keyboard-nav is now deprecated. Use uib-keyboard-nav instead.']); - expect($log.warn.calls.argsFor(2)).toEqual(['dropdown is now deprecated. Use uib-dropdown instead.']); - })); -});