1 | export function findTooltip(selectorOrElement, { targetSelector, multiple = false } = {}) {
|
2 | if (!selectorOrElement) {
|
3 | selectorOrElement = '.ember-tooltip, .ember-popover';
|
4 | }
|
5 |
|
6 | |
7 |
|
8 |
|
9 |
|
10 | const { body } = document;
|
11 | let tooltips = typeof selectorOrElement === 'string' ? body.querySelectorAll(selectorOrElement) : [selectorOrElement];
|
12 |
|
13 | tooltips = [].slice.call(tooltips).map((tooltip) => getActualTooltip(tooltip, targetSelector)).filter((el) => el);
|
14 |
|
15 | if (tooltips.length > 1) {
|
16 | console.warn(`ember-tooltips/test-support/dom/find-tooltip: Multiple tooltips were found. Consider passing a selector '.specific-tooltip-class'`);
|
17 | }
|
18 |
|
19 | if (multiple) {
|
20 | return tooltips;
|
21 | }
|
22 |
|
23 | let tooltip = tooltips[0];
|
24 |
|
25 | if (tooltip && !tooltip.classList.contains('ember-tooltip') && !tooltip.classList.contains('ember-popover')) {
|
26 | throw new Error(`getTooltipFromBody(): returned an element that is not a tooltip`);
|
27 | }
|
28 |
|
29 | return tooltip;
|
30 | }
|
31 |
|
32 | export default findTooltip;
|
33 |
|
34 | function getActualTooltip(tooltip, targetSelector) {
|
35 | if (tooltip && tooltip.classList.contains('ember-tooltip-base')) {
|
36 | |
37 |
|
38 |
|
39 |
|
40 | const target = tooltip.closest('.ember-tooltip-target, .ember-popover-target');
|
41 |
|
42 |
|
43 | if (!target || (targetSelector && !target.matches(targetSelector))) {
|
44 | return null;
|
45 | }
|
46 |
|
47 | tooltip = document.body.querySelector(`#${target.getAttribute('aria-describedby')}`);
|
48 | }
|
49 |
|
50 | return tooltip;
|
51 | }
|