UNPKG

1.75 kBJavaScriptView Raw
1/* eslint-disable ember/no-jquery */
2import $ from 'jquery';
3
4export default function findTooltip(selector, { targetSelector } = {}) {
5
6 if (!selector) { // In case of passing null, undefined, etc
7 selector = '.ember-tooltip, .ember-popover';
8 }
9
10 /* We .find() tooltips from $body instead of using ember-test-helper's
11 find() method because tooltips and popovers are often rendered as
12 children of <body> instead of children of the $targetElement */
13 let $tooltips = $(document.body).find(selector);
14 const tooltipElements = $tooltips.toArray().
15 map((el) => getActualTooltip(el, targetSelector)).
16 filter((el) => el);
17 $tooltips = $(tooltipElements);
18
19 if ($tooltips.length && !$tooltips.hasClass('ember-tooltip') && !$tooltips.hasClass('ember-popover')) {
20 throw Error(`getTooltipFromBody(): returned an element that is not a tooltip`);
21 } else if ($tooltips.length > 1) {
22 console.warn(`getTooltipFromBody(): Multiple tooltips were found. Consider passing { selector: '.specific-tooltip-class' }`);
23 }
24
25 return $tooltips;
26}
27
28function getActualTooltip(tooltip, targetSelector) {
29 let $tooltip = $(tooltip);
30
31 if ($tooltip.hasClass('ember-tooltip-base')) {
32 /* If what we find is the actually the tooltip component's element, we can
33 * look up the intended tooltip by the element referenced by its target
34 * element's aria-describedby attribute.
35 */
36 const $target = $tooltip.closest('.ember-tooltip-target, .ember-popover-target');
37
38 // If a targetSelector is specified, filter by it
39 if (!$target.length || (targetSelector && !$target.is(targetSelector))) {
40 return null;
41 }
42
43 $tooltip = $(document.body).find(`#${$target.attr('aria-describedby')}`);
44 }
45
46 return $tooltip[0];
47}