utils.ts
1.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// @ts-nocheck
import type { PlacementAndWidth } from './type';
export function findPageElement(startEl : UniElement | null, className: string|null = null) : UniElement | null {
let currentEl : UniElement | null = startEl;
if(className != null && currentEl?.classList?.contains(className) == true) {
return currentEl;
}
while (currentEl != null && currentEl.parentElement != null) {
currentEl = currentEl.parentElement;
if(className != null && currentEl?.classList?.contains(className) == true) {
return currentEl;
}
// if(className != null && currentEl?.classList?.contains('l-popover__wrapper') == true) {
// return null;
// }
}
return currentEl;
};
export function previousSibling(startEl : UniElement | null) : UniElement | null {
let currentEl : UniElement | null = startEl;
while (currentEl != null) {
currentEl = currentEl.previousSibling;
if (currentEl != null && !['#text', '#comment'].includes(currentEl.nodeName)) {
return currentEl;
}
}
return null
}
export function calculateWidthAndAdjustPlacement(
placement : string,
availableLeft : number,
availableRight : number,
popoverWidth : number): PlacementAndWidth{
let finalPlacement : string = placement;
let finalWidth : number = popoverWidth;
if (['left', 'right'].some((dir) : boolean => placement.startsWith(dir))) {
const isLeft = placement.startsWith('left');
const availableSpace = isLeft ? availableLeft : availableRight;
const oppositeSpace = isLeft ? availableRight : availableLeft;
if (availableSpace >= popoverWidth) {
finalWidth = popoverWidth;
} else if (oppositeSpace >= popoverWidth) {
finalWidth = popoverWidth;
finalPlacement = placement.replace(isLeft ? 'left' : 'right', isLeft ? 'right' : 'left');
} else if (availableSpace < 64 && finalWidth > 64) {
finalPlacement = 'bottom';
finalWidth = popoverWidth;
} else {
finalWidth = availableSpace;
}
}
return {
placement: finalPlacement,
finalWidth
} as PlacementAndWidth
}