UNPKG

@swimlane/ngx-charts

Version:

Declarative Charting Framework for Angular

267 lines 9.42 kB
import { PlacementTypes } from './placement.type'; var caretOffset = 7; function verticalPosition(elDimensions, popoverDimensions, alignment) { if (alignment === 'top') { return elDimensions.top - caretOffset; } if (alignment === 'bottom') { return elDimensions.top + elDimensions.height - popoverDimensions.height + caretOffset; } if (alignment === 'center') { return elDimensions.top + elDimensions.height / 2 - popoverDimensions.height / 2; } return undefined; } function horizontalPosition(elDimensions, popoverDimensions, alignment) { if (alignment === 'left') { return elDimensions.left - caretOffset; } if (alignment === 'right') { return elDimensions.left + elDimensions.width - popoverDimensions.width + caretOffset; } if (alignment === 'center') { return elDimensions.left + elDimensions.width / 2 - popoverDimensions.width / 2; } return undefined; } /** * Position helper for the popover directive. * * @export * @class PositionHelper */ var PositionHelper = /** @class */ (function () { function PositionHelper() { } /** * Calculate vertical alignment position * * @static * @param {any} elDimensions * @param {any} popoverDimensions * @param {any} alignment * @returns {number} * * @memberOf PositionHelper */ PositionHelper.calculateVerticalAlignment = function (elDimensions, popoverDimensions, alignment) { var result = verticalPosition(elDimensions, popoverDimensions, alignment); if (result + popoverDimensions.height > window.innerHeight) { result = window.innerHeight - popoverDimensions.height; } return result; }; /** * Calculate vertical caret position * * @static * @param {any} elDimensions * @param {any} popoverDimensions * @param {any} caretDimensions * @param {any} alignment * @returns {number} * * @memberOf PositionHelper */ PositionHelper.calculateVerticalCaret = function (elDimensions, popoverDimensions, caretDimensions, alignment) { var result; if (alignment === 'top') { result = elDimensions.height / 2 - caretDimensions.height / 2 + caretOffset; } if (alignment === 'bottom') { result = popoverDimensions.height - elDimensions.height / 2 - caretDimensions.height / 2 - caretOffset; } if (alignment === 'center') { result = popoverDimensions.height / 2 - caretDimensions.height / 2; } var popoverPosition = verticalPosition(elDimensions, popoverDimensions, alignment); if (popoverPosition + popoverDimensions.height > window.innerHeight) { result += (popoverPosition + popoverDimensions.height - window.innerHeight); } return result; }; /** * Calculate horz alignment position * * @static * @param {any} elDimensions * @param {any} popoverDimensions * @param {any} alignment * @returns {number} * * @memberOf PositionHelper */ PositionHelper.calculateHorizontalAlignment = function (elDimensions, popoverDimensions, alignment) { var result = horizontalPosition(elDimensions, popoverDimensions, alignment); if (result + popoverDimensions.width > window.innerWidth) { result = window.innerWidth - popoverDimensions.width; } return result; }; /** * Calculate horz caret position * * @static * @param {any} elDimensions * @param {any} popoverDimensions * @param {any} caretDimensions * @param {any} alignment * @returns {number} * * @memberOf PositionHelper */ PositionHelper.calculateHorizontalCaret = function (elDimensions, popoverDimensions, caretDimensions, alignment) { var result; if (alignment === 'left') { result = elDimensions.width / 2 - caretDimensions.width / 2 + caretOffset; } if (alignment === 'right') { result = popoverDimensions.width - elDimensions.width / 2 - caretDimensions.width / 2 - caretOffset; } if (alignment === 'center') { result = popoverDimensions.width / 2 - caretDimensions.width / 2; } var popoverPosition = horizontalPosition(elDimensions, popoverDimensions, alignment); if (popoverPosition + popoverDimensions.width > window.innerWidth) { result += (popoverPosition + popoverDimensions.width - window.innerWidth); } return result; }; /** * Checks if the element's position should be flipped * * @static * @param {any} elDimensions * @param {any} popoverDimensions * @param {any} placement * @param {any} spacing * @returns {boolean} * * @memberOf PositionHelper */ PositionHelper.shouldFlip = function (elDimensions, popoverDimensions, placement, spacing) { var flip = false; if (placement === 'right') { if (elDimensions.left + elDimensions.width + popoverDimensions.width + spacing > window.innerWidth) { flip = true; } } if (placement === 'left') { if (elDimensions.left - popoverDimensions.width - spacing < 0) { flip = true; } } if (placement === 'top') { if (elDimensions.top - popoverDimensions.height - spacing < 0) { flip = true; } } if (placement === 'bottom') { if (elDimensions.top + elDimensions.height + popoverDimensions.height + spacing > window.innerHeight) { flip = true; } } return flip; }; /** * Position caret * * @static * @param {any} placement * @param {any} elmDim * @param {any} hostDim * @param {any} caretDimensions * @param {any} alignment * @returns {*} * * @memberOf PositionHelper */ PositionHelper.positionCaret = function (placement, elmDim, hostDim, caretDimensions, alignment) { var top = 0; var left = 0; if (placement === PlacementTypes.right) { left = -7; top = PositionHelper.calculateVerticalCaret(hostDim, elmDim, caretDimensions, alignment); } else if (placement === PlacementTypes.left) { left = elmDim.width; top = PositionHelper.calculateVerticalCaret(hostDim, elmDim, caretDimensions, alignment); } else if (placement === PlacementTypes.top) { top = elmDim.height; left = PositionHelper.calculateHorizontalCaret(hostDim, elmDim, caretDimensions, alignment); } else if (placement === PlacementTypes.bottom) { top = -7; left = PositionHelper.calculateHorizontalCaret(hostDim, elmDim, caretDimensions, alignment); } return { top: top, left: left }; }; /** * Position content * * @static * @param {any} placement * @param {any} elmDim * @param {any} hostDim * @param {any} spacing * @param {any} alignment * @returns {*} * * @memberOf PositionHelper */ PositionHelper.positionContent = function (placement, elmDim, hostDim, spacing, alignment) { var top = 0; var left = 0; if (placement === PlacementTypes.right) { left = hostDim.left + hostDim.width + spacing; top = PositionHelper.calculateVerticalAlignment(hostDim, elmDim, alignment); } else if (placement === PlacementTypes.left) { left = hostDim.left - elmDim.width - spacing; top = PositionHelper.calculateVerticalAlignment(hostDim, elmDim, alignment); } else if (placement === PlacementTypes.top) { top = hostDim.top - elmDim.height - spacing; left = PositionHelper.calculateHorizontalAlignment(hostDim, elmDim, alignment); } else if (placement === PlacementTypes.bottom) { top = hostDim.top + hostDim.height + spacing; left = PositionHelper.calculateHorizontalAlignment(hostDim, elmDim, alignment); } return { top: top, left: left }; }; /** * Determine placement based on flip * * @static * @param {any} placement * @param {any} elmDim * @param {any} hostDim * @param {any} spacing * @returns {*} * * @memberOf PositionHelper */ PositionHelper.determinePlacement = function (placement, elmDim, hostDim, spacing) { var shouldFlip = PositionHelper.shouldFlip(hostDim, elmDim, placement, spacing); if (shouldFlip) { if (placement === PlacementTypes.right) { return PlacementTypes.left; } else if (placement === PlacementTypes.left) { return PlacementTypes.right; } else if (placement === PlacementTypes.top) { return PlacementTypes.bottom; } else if (placement === PlacementTypes.bottom) { return PlacementTypes.top; } } return placement; }; return PositionHelper; }()); export { PositionHelper }; //# sourceMappingURL=position.js.map