47 lines
2 KiB
JavaScript
47 lines
2 KiB
JavaScript
|
import getVariation from "./getVariation.js";
|
||
|
import { variationPlacements, basePlacements, placements as allPlacements } from "../enums.js";
|
||
|
import detectOverflow from "./detectOverflow.js";
|
||
|
import getBasePlacement from "./getBasePlacement.js";
|
||
|
export default function computeAutoPlacement(state, options) {
|
||
|
if (options === void 0) {
|
||
|
options = {};
|
||
|
}
|
||
|
|
||
|
var _options = options,
|
||
|
placement = _options.placement,
|
||
|
boundary = _options.boundary,
|
||
|
rootBoundary = _options.rootBoundary,
|
||
|
padding = _options.padding,
|
||
|
flipVariations = _options.flipVariations,
|
||
|
_options$allowedAutoP = _options.allowedAutoPlacements,
|
||
|
allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;
|
||
|
var variation = getVariation(placement);
|
||
|
var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {
|
||
|
return getVariation(placement) === variation;
|
||
|
}) : basePlacements;
|
||
|
var allowedPlacements = placements.filter(function (placement) {
|
||
|
return allowedAutoPlacements.indexOf(placement) >= 0;
|
||
|
});
|
||
|
|
||
|
if (allowedPlacements.length === 0) {
|
||
|
allowedPlacements = placements;
|
||
|
|
||
|
if (process.env.NODE_ENV !== "production") {
|
||
|
console.error(['Popper: The `allowedAutoPlacements` option did not allow any', 'placements. Ensure the `placement` option matches the variation', 'of the allowed placements.', 'For example, "auto" cannot be used to allow "bottom-start".', 'Use "auto-start" instead.'].join(' '));
|
||
|
}
|
||
|
} // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...
|
||
|
|
||
|
|
||
|
var overflows = allowedPlacements.reduce(function (acc, placement) {
|
||
|
acc[placement] = detectOverflow(state, {
|
||
|
placement: placement,
|
||
|
boundary: boundary,
|
||
|
rootBoundary: rootBoundary,
|
||
|
padding: padding
|
||
|
})[getBasePlacement(placement)];
|
||
|
return acc;
|
||
|
}, {});
|
||
|
return Object.keys(overflows).sort(function (a, b) {
|
||
|
return overflows[a] - overflows[b];
|
||
|
});
|
||
|
}
|