From 982d89d2b9d663ed92d41743f63069d0c8a4aac0 Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Wed, 9 Feb 2022 15:18:12 +0000 Subject: [PATCH] feat(getposition): support desired-place-list (by priority) --- src/utils/getPosition.js | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/utils/getPosition.js b/src/utils/getPosition.js index cdd776301..f2e482cdf 100755 --- a/src/utils/getPosition.js +++ b/src/utils/getPosition.js @@ -76,24 +76,30 @@ export default function(e, target, node, place, desiredPlace, effect, offset) { outsideLeft(p) || outsideRight(p) || outsideTop(p) || outsideBottom(p); const inside = p => !outside(p); - const placesList = ['top', 'bottom', 'left', 'right']; - const insideList = []; - for (let i = 0; i < 4; i++) { - const p = placesList[i]; - if (inside(p)) { - insideList.push(p); + const placeIsInside = { + top: inside('top'), + bottom: inside('bottom'), + left: inside('left'), + right: inside('right') + }; + + function firstInside() { + const allPlaces = desiredPlace + .split(',') + .concat(place, ['top', 'bottom', 'left', 'right']); + for (const d of allPlaces) { + if (placeIsInside[d]) return d; } + return null; } + const chosen = firstInside(); + let isNewState = false; let newPlace; - const shouldUpdatePlace = desiredPlace !== place; - if (inside(desiredPlace) && shouldUpdatePlace) { - isNewState = true; - newPlace = desiredPlace; - } else if (insideList.length > 0 && outside(desiredPlace) && outside(place)) { + if (chosen && chosen !== place) { isNewState = true; - newPlace = insideList[0]; + newPlace = chosen; } if (isNewState) {