preventOverflow.js
2.04 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
65
66
67
68
69
70
71
import getOffsetParent from '../utils/getOffsetParent';
import getBoundaries from '../utils/getBoundaries';
/**
* @function
* @memberof Modifiers
* @argument {Object} data - The data object generated by `update` method
* @argument {Object} options - Modifiers configuration and options
* @returns {Object} The data object, properly modified
*/
export default function preventOverflow(data, options) {
let boundariesElement =
options.boundariesElement || getOffsetParent(data.instance.popper);
// If offsetParent is the reference element, we really want to
// go one step up and use the next offsetParent as reference to
// avoid to make this modifier completely useless and look like broken
if (data.instance.reference === boundariesElement) {
boundariesElement = getOffsetParent(boundariesElement);
}
const boundaries = getBoundaries(
data.instance.popper,
data.instance.reference,
options.padding,
boundariesElement
);
options.boundaries = boundaries;
const order = options.priority;
let popper = data.offsets.popper;
const check = {
primary(placement) {
let value = popper[placement];
if (
popper[placement] < boundaries[placement] &&
!options.escapeWithReference
) {
value = Math.max(popper[placement], boundaries[placement]);
}
return { [placement]: value };
},
secondary(placement) {
const mainSide = placement === 'right' ? 'left' : 'top';
let value = popper[mainSide];
if (
popper[placement] > boundaries[placement] &&
!options.escapeWithReference
) {
value = Math.min(
popper[mainSide],
boundaries[placement] -
(placement === 'right' ? popper.width : popper.height)
);
}
return { [mainSide]: value };
},
};
order.forEach(placement => {
const side = ['left', 'top'].indexOf(placement) !== -1
? 'primary'
: 'secondary';
popper = { ...popper, ...check[side](placement) };
});
data.offsets.popper = popper;
return data;
}