swimlane/ngx-ui

View on GitHub
projects/swimlane/ngx-ui/src/lib/utils/position/calculate-vertical-caret/calculate-vertical-caret.util.ts

Summary

Maintainability
C
1 day
Test Coverage
import { Dimensions } from '../dimensions.interface';
import { AlignmentTypes } from '../alignment-types.enum';
import { CARET_OFFSET } from '../caret-offset.constant';
import { verticalPosition } from '../vertical-position/vertical-position.util';

/**
 * Calculate vertical caret position
 *
 * @param elDimensions
 * @param popoverDimensions
 * @param caretDimensions
 * @param alignment
 *
 * @memberOf PositionHelper
 */
export const calculateVerticalCaret = (
  elDimensions: Dimensions,
  popoverDimensions: Dimensions,
  caretDimensions: Dimensions,
  alignment: AlignmentTypes
): number => {
  let result: number;

  if (alignment === AlignmentTypes.top) {
    result = elDimensions.height / 2 - caretDimensions.height / 2 + CARET_OFFSET;
  }

  if (alignment === AlignmentTypes.bottom) {
    result = popoverDimensions.height - elDimensions.height / 2 - caretDimensions.height / 2 - CARET_OFFSET;
  }

  if (alignment === AlignmentTypes.center) {
    result = popoverDimensions.height / 2 - caretDimensions.height / 2;
  }

  const popoverPosition = verticalPosition(elDimensions, popoverDimensions, alignment);
  if (popoverPosition + popoverDimensions.height > window.innerHeight) {
    result += popoverPosition + popoverDimensions.height - window.innerHeight;
  }

  return result;
};