/** * MUI Angular Dropdown Component * @module angular/dropdown */ import angular from 'angular'; const moduleName = 'mui.dropdown'; angular.module(moduleName, []) .directive('muiDropdown', ['$timeout', '$compile', function($timeout, $compile) { return { restrict: 'AE', transclude: true, replace : true, scope: { variant: '@', color: '@', size: '@', open: '=?', ngDisabled: '=' }, template: '
' + '' + ''+ '
', link: function(scope, element, attrs) { var dropdownClass = 'mui-dropdown', menuClass = 'mui-dropdown__menu', openClass = 'mui--is-open', rightClass = 'mui-dropdown__menu--right', isUndef = angular.isUndefined, menuEl, buttonEl; // save references menuEl = angular.element(element[0].querySelector('.' + menuClass)); buttonEl = angular.element(element[0].querySelector('.mui-btn')); menuEl.css('margin-top', '-3px'); // handle is-open if (!isUndef(attrs.open)) scope.open = true; // handle disabled if (!isUndef(attrs.disabled)) { buttonEl.attr('disabled', true); } // handle right-align if (!isUndef(attrs.rightAlign)) menuEl.addClass(rightClass); // handle no-caret if (!isUndef(attrs.noCaret)) buttonEl.html(attrs.label); else buttonEl.html(attrs.label + ' '); function closeDropdownFn() { scope.open = false; scope.$apply(); } function handleKeyDownFn(ev) { // close dropdown on escape key var key = ev.key; if (key === 'Escape' || key === 'Esc') closeDropdownFn(); } // handle menu open scope.$watch('open', function(newValue) { var doc = document; if (newValue === true) { menuEl.addClass(openClass); doc.addEventListener('click', closeDropdownFn); doc.addEventListener('keydown', handleKeyDownFn); } else if (newValue === false) { menuEl.removeClass(openClass); doc.removeEventListener('click', closeDropdownFn); doc.removeEventListener('keydown', handleKeyDownFn); } }); // click handler scope.onClick = function($event) { // exit if disabled if (scope.disabled) return; // prevent form submission $event.preventDefault(); $event.stopPropagation(); // toggle open if (scope.open) scope.open = false; else scope.open = true; }; } }; }]); /** Define module API */ export default moduleName;