Skip to content
This repository was archived by the owner on May 29, 2019. It is now read-only.

Commit 8737303

Browse files
SystemDiscwesleycho
authored andcommitted
feat(tooltip): add outsideClick trigger
- Add `outsideClick` trigger support, which allows dismissal of the tooltip/popover on click of any element outside of the tooltip/popover Closes #4419 Closes #4871
1 parent 3ca8b88 commit 8737303

File tree

3 files changed

+55
-3
lines changed

3 files changed

+55
-3
lines changed

Diff for: src/tooltip/docs/readme.md

+3
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,12 @@ provided hide triggers:
4242

4343
- `mouseenter`: `mouseleave`
4444
- `click`: `click`
45+
- `outsideClick`: `outsideClick`
4546
- `focus`: `blur`
4647
- `none`: ``
4748

49+
The `outsideClick` trigger will cause the tooltip to toggle on click, and hide when anything else is clicked.
50+
4851
For any non-supported value, the trigger will be used to both show and hide the
4952
tooltip. Using the 'none' trigger will disable the internal trigger(s), one can
5053
then use the `tooltip-is-open` attribute exclusively to show and hide the tooltip.

Diff for: src/tooltip/test/tooltip.spec.js

+25
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,31 @@ describe('tooltip', function() {
596596
elm.trigger('mouseenter');
597597
expect(tooltipScope.isOpen).toBeFalsy();
598598
}));
599+
600+
it('should toggle on click and hide when anything else is clicked when trigger is set to "outsideClick"', inject(function($compile, $document) {
601+
elm = $compile(angular.element(
602+
'<span uib-tooltip="tooltip text" tooltip-trigger="outsideClick">Selector Text</span>'
603+
))(scope);
604+
scope.$apply();
605+
elmScope = elm.scope();
606+
tooltipScope = elmScope.$$childTail;
607+
608+
// start off
609+
expect(tooltipScope.isOpen).toBeFalsy();
610+
611+
// toggle
612+
trigger(elm, 'click');
613+
expect(tooltipScope.isOpen).toBeTruthy();
614+
trigger(elm, 'click');
615+
expect(tooltipScope.isOpen).toBeFalsy();
616+
617+
// click on, outsideClick off
618+
trigger(elm, 'click');
619+
expect(tooltipScope.isOpen).toBeTruthy();
620+
angular.element($document[0].body).trigger('click');
621+
tooltipScope.$digest();
622+
expect(tooltipScope.isOpen).toBeFalsy();
623+
}));
599624
});
600625

601626
describe('with an append-to-body attribute', function() {

Diff for: src/tooltip/tooltip.js

+27-3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ angular.module('ui.bootstrap.tooltip', ['ui.bootstrap.position', 'ui.bootstrap.s
2323
var triggerMap = {
2424
'mouseenter': 'mouseleave',
2525
'click': 'click',
26+
'outsideClick': 'outsideClick',
2627
'focus': 'blur',
2728
'none': ''
2829
};
@@ -438,13 +439,33 @@ angular.module('ui.bootstrap.tooltip', ['ui.bootstrap.position', 'ui.bootstrap.s
438439
}
439440
}
440441

442+
// hide tooltips/popovers for outsideClick trigger
443+
function bodyHideTooltipBind(e) {
444+
if (!ttScope || !ttScope.isOpen || !tooltip) {
445+
return;
446+
}
447+
// make sure the tooltip/popover link or tool tooltip/popover itself were not clicked
448+
if (!element[0].contains(e.target) && !tooltip[0].contains(e.target)) {
449+
hideTooltipBind();
450+
}
451+
}
452+
441453
var unregisterTriggers = function() {
442454
triggers.show.forEach(function(trigger) {
443-
element.unbind(trigger, showTooltipBind);
455+
if (trigger === 'outsideClick') {
456+
element[0].removeEventListener('click', toggleTooltipBind);
457+
} else {
458+
element[0].removeEventListener(trigger, showTooltipBind);
459+
element[0].removeEventListener(trigger, toggleTooltipBind);
460+
}
444461
});
445462
triggers.hide.forEach(function(trigger) {
446463
trigger.split(' ').forEach(function(hideTrigger) {
447-
element[0].removeEventListener(hideTrigger, hideTooltipBind);
464+
if (trigger === 'outsideClick') {
465+
$document[0].removeEventListener('click', bodyHideTooltipBind);
466+
} else {
467+
element[0].removeEventListener(hideTrigger, hideTooltipBind);
468+
}
448469
});
449470
});
450471
};
@@ -458,7 +479,10 @@ angular.module('ui.bootstrap.tooltip', ['ui.bootstrap.position', 'ui.bootstrap.s
458479
if (triggers.show !== 'none') {
459480
triggers.show.forEach(function(trigger, idx) {
460481
// Using raw addEventListener due to jqLite/jQuery bug - #4060
461-
if (trigger === triggers.hide[idx]) {
482+
if (trigger === 'outsideClick') {
483+
element[0].addEventListener('click', toggleTooltipBind);
484+
$document[0].addEventListener('click', bodyHideTooltipBind);
485+
} else if (trigger === triggers.hide[idx]) {
462486
element[0].addEventListener(trigger, toggleTooltipBind);
463487
} else if (trigger) {
464488
element[0].addEventListener(trigger, showTooltipBind);

0 commit comments

Comments
 (0)