Skip to content

Commit 1028137

Browse files
authored
Tooltip/popover placement update (#9457)
* Flexible popover positioning: they appear to the right by default if there is enough space, then fallback to showing on top or the bottom depending on space availability.
1 parent e8a3972 commit 1028137

1 file changed

Lines changed: 30 additions & 3 deletions

File tree

src/NuGetGallery/Scripts/gallery/common.js

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -461,13 +461,40 @@
461461
};
462462

463463
nuget.setPopovers = function () {
464-
var popoverElement = $(this);
465-
var popoverElementDom = this;
464+
setPopoversInternal(this, rightWithVerticalFallback);
465+
}
466+
467+
function rightWithVerticalFallback(popoverElement, ownerElement) {
468+
// Both numbers below are in CSS pixels.
469+
const MinSpaceOnRight = 150;
470+
const MinSpaceOnTop = 100;
471+
472+
const ownerBoundingBox = ownerElement.getBoundingClientRect();
473+
const spaceOnRight = window.innerWidth - ownerBoundingBox.right;
474+
if (spaceOnRight > MinSpaceOnRight) {
475+
return 'right';
476+
}
477+
const spaceOnTop = ownerBoundingBox.top;
478+
if (spaceOnTop > MinSpaceOnTop) {
479+
return 'top';
480+
}
481+
482+
return 'bottom';
483+
}
484+
485+
function setPopoversInternal(element, placement) {
486+
var popoverElement = $(element);
487+
var popoverElementDom = element;
466488
var originalLabel = popoverElementDom.ariaLabel;
467489
var popoverHideTimeMS = 2000;
468490
var popoverFadeTimeMS = 200;
469491

470-
popoverElement.popover({ trigger: 'hover' });
492+
var popoverOptions = { trigger: 'hover', container: 'body' };
493+
if (placement) {
494+
popoverOptions.placement = placement;
495+
}
496+
497+
popoverElement.popover(popoverOptions);
471498
popoverElement.click(popoverShowAndHide);
472499
popoverElement.focus(popoverShowAndHide);
473500
popoverElement.keyup(function (event) {

0 commit comments

Comments
 (0)