v-accordion
Version:
vAccordion - AngularJS multi-level accordion component
64 lines (51 loc) • 1.76 kB
JavaScript
// vPaneHeader directive
angular.module('vAccordion.directives')
.directive('vPaneHeader', vPaneHeaderDirective);
function vPaneHeaderDirective () {
return {
restrict: 'E',
require: ['^vPane', '^vAccordion'],
transclude: true,
template: '<div ng-transclude></div>',
scope: {},
link: function (scope, iElement, iAttrs, ctrls) {
iAttrs.$set('role', 'tab');
iAttrs.$set('tabindex', '0');
var paneCtrl = ctrls[0],
accordionCtrl = ctrls[1];
var isInactive = angular.isDefined(iAttrs.inactive);
function onClick () {
if (isInactive) { return false; }
scope.$apply(function () { paneCtrl.toggle(); });
}
function onKeydown (event) {
if (event.keyCode === 32 || event.keyCode === 13) {
scope.$apply(function () { paneCtrl.toggle(); });
event.preventDefault();
} else if (event.keyCode === 39 || event.keyCode === 40) {
scope.$apply(function () { accordionCtrl.focusNext(); });
event.preventDefault();
} else if (event.keyCode === 37 || event.keyCode === 38) {
scope.$apply(function () { accordionCtrl.focusPrevious(); });
event.preventDefault();
}
}
function onFocus () {
paneCtrl.focusPane();
}
function onBlur () {
paneCtrl.blurPane();
}
iElement[0].onfocus = onFocus;
iElement[0].onblur = onBlur;
iElement.bind('click', onClick);
iElement.bind('keydown', onKeydown);
scope.$on('$destroy', function () {
iElement.unbind('click', onClick);
iElement.unbind('keydown', onKeydown);
iElement[0].onfocus = null;
iElement[0].onblur = null;
});
}
};
}