* @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
(data, options)
| 3363 | * @returns {Object} The data object, properly modified |
| 3364 | */ |
| 3365 | function preventOverflow(data, options) { |
| 3366 | var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper); |
| 3367 | |
| 3368 | // If offsetParent is the reference element, we really want to |
| 3369 | // go one step up and use the next offsetParent as reference to |
| 3370 | // avoid to make this modifier completely useless and look like broken |
| 3371 | if (data.instance.reference === boundariesElement) { |
| 3372 | boundariesElement = getOffsetParent(boundariesElement); |
| 3373 | } |
| 3374 | |
| 3375 | // NOTE: DOM access here |
| 3376 | // resets the popper's position so that the document size can be calculated excluding |
| 3377 | // the size of the popper element itself |
| 3378 | var transformProp = getSupportedPropertyName('transform'); |
| 3379 | var popperStyles = data.instance.popper.style; // assignment to help minification |
| 3380 | var top = popperStyles.top, |
| 3381 | left = popperStyles.left, |
| 3382 | transform = popperStyles[transformProp]; |
| 3383 | |
| 3384 | popperStyles.top = ''; |
| 3385 | popperStyles.left = ''; |
| 3386 | popperStyles[transformProp] = ''; |
| 3387 | |
| 3388 | var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed); |
| 3389 | |
| 3390 | // NOTE: DOM access here |
| 3391 | // restores the original style properties after the offsets have been computed |
| 3392 | popperStyles.top = top; |
| 3393 | popperStyles.left = left; |
| 3394 | popperStyles[transformProp] = transform; |
| 3395 | |
| 3396 | options.boundaries = boundaries; |
| 3397 | |
| 3398 | var order = options.priority; |
| 3399 | var popper = data.offsets.popper; |
| 3400 | |
| 3401 | var check = { |
| 3402 | primary: function primary(placement) { |
| 3403 | var value = popper[placement]; |
| 3404 | if (popper[placement] < boundaries[placement] && !options.escapeWithReference) { |
| 3405 | value = Math.max(popper[placement], boundaries[placement]); |
| 3406 | } |
| 3407 | return defineProperty({}, placement, value); |
| 3408 | }, |
| 3409 | secondary: function secondary(placement) { |
| 3410 | var mainSide = placement === 'right' ? 'left' : 'top'; |
| 3411 | var value = popper[mainSide]; |
| 3412 | if (popper[placement] > boundaries[placement] && !options.escapeWithReference) { |
| 3413 | value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height)); |
| 3414 | } |
| 3415 | return defineProperty({}, mainSide, value); |
| 3416 | } |
| 3417 | }; |
| 3418 | |
| 3419 | order.forEach(function (placement) { |
| 3420 | var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary'; |
| 3421 | popper = _extends({}, popper, check[side](placement)); |
| 3422 | }); |
nothing calls this directly
no test coverage detected