UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

89 lines 13.9 kB
import { HorizontalAlignment, Util, VerticalAlignment } from './../utilities'; import { scaleInVerTop, scaleOutVerTop } from '../../../animations/main'; /** * Positions the element based on the directions and start point passed in trough PositionSettings. * It is possible to either pass a start point or an HTMLElement as a positioning base. */ export class ConnectedPositioningStrategy { constructor(settings) { this._defaultSettings = { // default Point(0, 0) in getPointFromPositionsSettings target: null, horizontalDirection: HorizontalAlignment.Right, verticalDirection: VerticalAlignment.Bottom, horizontalStartPoint: HorizontalAlignment.Left, verticalStartPoint: VerticalAlignment.Bottom, openAnimation: scaleInVerTop, closeAnimation: scaleOutVerTop, minSize: { width: 0, height: 0 } }; this.settings = Object.assign({}, this._defaultSettings, settings); } /** * Obtains the ClientRect objects for the required elements - target and element to position * @returns target and element ClientRect objects */ calculateElementRectangles(contentElement) { return { targetRect: Util.getTargetRect(this.settings), elementRect: contentElement.getBoundingClientRect() }; } /** @inheritdoc */ position(contentElement, size, document, initialCall) { const rects = this.calculateElementRectangles(contentElement); this.setStyle(contentElement, rects.targetRect, rects.elementRect, {}); } /** * @inheritdoc * Creates clone of this position strategy * @returns clone of this position strategy */ clone() { return Util.cloneInstance(this); } /** * Sets element's style which effectively positions provided element according * to provided position settings * @param element Element to position * @param targetRect Bounding rectangle of strategy target * @param elementRect Bounding rectangle of the element */ setStyle(element, targetRect, elementRect, connectedFit) { const horizontalOffset = connectedFit.horizontalOffset ? connectedFit.horizontalOffset : 0; const verticalOffset = connectedFit.verticalOffset ? connectedFit.verticalOffset : 0; const startPoint = { x: targetRect.right + targetRect.width * this.settings.horizontalStartPoint + horizontalOffset, y: targetRect.bottom + targetRect.height * this.settings.verticalStartPoint + verticalOffset }; const wrapperRect = element.parentElement.getBoundingClientRect(); // clean up styles - if auto position strategy is chosen we may pass here several times element.style.right = ''; element.style.left = ''; element.style.bottom = ''; element.style.top = ''; switch (this.settings.horizontalDirection) { case HorizontalAlignment.Left: element.style.right = `${Math.round(wrapperRect.right - startPoint.x)}px`; break; case HorizontalAlignment.Center: element.style.left = `${Math.round(startPoint.x - wrapperRect.left - elementRect.width / 2)}px`; break; case HorizontalAlignment.Right: element.style.left = `${Math.round(startPoint.x - wrapperRect.left)}px`; break; } switch (this.settings.verticalDirection) { case VerticalAlignment.Top: element.style.bottom = `${Math.round(wrapperRect.bottom - startPoint.y)}px`; break; case VerticalAlignment.Middle: element.style.top = `${Math.round(startPoint.y - wrapperRect.top - elementRect.height / 2)}px`; break; case VerticalAlignment.Bottom: element.style.top = `${Math.round(startPoint.y - wrapperRect.top)}px`; break; } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdGVkLXBvc2l0aW9uaW5nLXN0cmF0ZWd5LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9vdmVybGF5L3Bvc2l0aW9uL2Nvbm5lY3RlZC1wb3NpdGlvbmluZy1zdHJhdGVneS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0wsbUJBQW1CLEVBSW5CLElBQUksRUFDSixpQkFBaUIsRUFDbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR3pFOzs7R0FHRztBQUNILE1BQU0sT0FBTyw0QkFBNEI7SUFnQnZDLFlBQVksUUFBMkI7UUFmL0IscUJBQWdCLEdBQXFCO1lBQzNDLHVEQUF1RDtZQUN2RCxNQUFNLEVBQUUsSUFBSTtZQUNaLG1CQUFtQixFQUFFLG1CQUFtQixDQUFDLEtBQUs7WUFDOUMsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUMsTUFBTTtZQUMzQyxvQkFBb0IsRUFBRSxtQkFBbUIsQ0FBQyxJQUFJO1lBQzlDLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDLE1BQU07WUFDNUMsYUFBYSxFQUFFLGFBQWE7WUFDNUIsY0FBYyxFQUFFLGNBQWM7WUFDOUIsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFO1NBQ2pDLENBQUM7UUFNQSxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ08sMEJBQTBCLENBQUMsY0FBYztRQUMvQyxPQUFPO1lBQ0gsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUM3QyxXQUFXLEVBQUUsY0FBYyxD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WUFDUixLQUFLLGlCQUFpQixDQUFDLE1BQU07Z0JBQzNCLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUMvRixNQUFNO1lBQ1IsS0FBSyxpQkFBaUIsQ0FBQyxNQUFNO2dCQUMzQixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztnQkFDdEUsTUFBTTtTQUNUO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSVBvc2l0aW9uU3RyYXRlZ3kgfSBmcm9tICcuL0lQb3NpdGlvblN0cmF0ZWd5JztcbmltcG9ydCB7XG4gIEhvcml6b250YWxBbGlnbm1lbnQsXG4gIFBvaW50LFxuICBQb3NpdGlvblNldHRpbmdzLFxuICBTaXplLFxuICBVdGlsLFxuICBWZXJ0aWNhbEFsaWdubWVudFxufSBmcm9tICcuLy4uL3V0aWxpdGllcyc7XG5pbXBvcnQgeyBzY2FsZUluVmVyVG9wLCBzY2FsZU91dFZlclRvcCB9IGZyb20gJy4uLy4uLy4uL2FuaW1hdGlvbnMvbWFpbic7XG5pbXBvcnQgeyBDb25uZWN0ZWRGaXQgfSBmcm9tICcuLi91dGlsaXRpZXMnO1xuXG4vKipcbiAqIFBvc2l0aW9ucyB0aGUgZWxlbWVudCBiYXNlZCBvbiB0aGUgZGlyZWN0aW9ucyBhbmQgc3RhcnQgcG9pbnQgcGFzc2VkIGluIHRyb3VnaCBQb3NpdGlvblNldHRpbmdzLlxuICogSXQgaXMgcG9zc2libGUgdG8gZWl0aGVyIHBhc3MgYSBzdGFydCBwb2ludCBvciBhbiBIVE1MRWxlbWVudCBhcyBhIHBvc2l0aW9uaW5nIGJhc2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0ZWRQb3NpdGlvbmluZ1N0cmF0ZWd5IGltcGxlbWVudHMgSVBvc2l0aW9uU3RyYXRlZ3kge1xuICBwcml2YXRlIF9kZWZhdWx0U2V0dGluZ3M6IFBvc2l0aW9uU2V0dGluZ3MgPSB7XG4gICAgLy8gZGVmYXVsdCBQb2ludCgwLCAwKSBpbiBnZXRQb2ludEZyb21Qb3NpdGlvbnNTZXR0aW5nc1xuICAgIHRhcmdldDogbnVsbCxcbiAgICBob3Jpem9udGFsRGlyZWN0aW9uOiBIb3Jpem9udGFsQWxpZ25tZW50LlJpZ2h0LFxuICAgIHZlcnRpY2FsRGlyZWN0aW9uOiBWZXJ0aWNhbEFsaWdubWVudC5Cb3R0b20sXG4gICAgaG9yaXpvbnRhbFN0YXJ0UG9pbnQ6IEhvcml6b250YWxBbGlnbm1lbnQuTGVmdCxcbiAgICB2ZXJ0aWNhbFN0YXJ0UG9pbnQ6IFZlcnRpY2FsQWxpZ25tZW50LkJvdHRvbSxcbiAgICBvcGVuQW5pbWF0aW9uOiBzY2FsZUluVmVyVG9wLFxuICAgIGNsb3NlQW5pbWF0aW9uOiBzY2FsZU91dFZlclRvcCxcbiAgICBtaW5TaXplOiB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfVxuICB9O1xuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwdWJsaWMgc2V0dGluZ3M6IFBvc2l0aW9uU2V0dGluZ3M7XG5cbiAgY29uc3RydWN0b3Ioc2V0dGluZ3M/OiBQb3NpdGlvblNldHRpbmdzKSB7XG4gICAgdGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2RlZmF1bHRTZXR0aW5ncywgc2V0dGluZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGFpbnMgdGhlIENsaWVudFJlY3Qgb2JqZWN0cyBmb3IgdGhlIHJlcXVpcmVkIGVsZW1lbnRzIC0gdGFyZ2V0IGFuZCBlbGVtZW50IHRvIHBvc2l0aW9uXG4gICAqIEByZXR1cm5zIHRhcmdldCBhbmQgZWxlbWVudCBDbGllbnRSZWN0IG9iamVjdHNcbiAgICovXG4gIHByb3RlY3RlZCBjYWxjdWxhdGVFbGVtZW50UmVjdGFuZ2xlcyhjb250ZW50RWxlbWVudCk6IHsgdGFyZ2V0UmVjdDogQ2xpZW50UmVjdCwgZWxlbWVudFJlY3Q6IENsaWVudFJlY3QgfSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAgIHRhcmdldFJlY3Q6IFV0aWwuZ2V0VGFyZ2V0UmVjdCh0aGlzLnNldHRpbmdzKSxcbiAgICAgICAgICBlbGVtZW50UmVjdDogY29udGVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgYXMgQ2xpZW50UmVjdFxuICAgICAgfTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwb3NpdGlvbihjb250ZW50RWxlbWVudDogSFRNTEVsZW1lbnQsIHNpemU6IFNpemUsIGRvY3VtZW50PzogRG9jdW1lbnQsIGluaXRpYWxDYWxsPzogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHJlY3RzID0gIHRoaXMuY2FsY3VsYXRlRWxlbWVudFJlY3RhbmdsZXMoY29udGVudEVsZW1lbnQpO1xuICAgIHRoaXMuc2V0U3R5bGUoY29udGVudEVsZW1lbnQsIHJlY3RzLnRhcmdldFJlY3QsIHJlY3RzLmVsZW1lbnRSZWN0LCB7fSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICogQ3JlYXRlcyBjbG9uZSBvZiB0aGlzIHBvc2l0aW9uIHN0cmF0ZWd5XG4gICAqIEByZXR1cm5zIGNsb25lIG9mIHRoaXMgcG9zaXRpb24gc3RyYXRlZ3lcbiAgICovXG4gIGNsb25lKCk6IElQb3NpdGlvblN0cmF0ZWd5IHtcbiAgICByZXR1cm4gVXRpbC5jbG9uZUluc3RhbmNlKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgZWxlbWVudCdzIHN0eWxlIHdoaWNoIGVmZmVjdGl2ZWx5IHBvc2l0aW9ucyBwcm92aWRlZCBlbGVtZW50IGFjY29yZGluZ1xuICAgKiB0byBwcm92aWRlZCBwb3NpdGlvbiBzZXR0aW5nc1xuICAgKiBAcGFyYW0gZWxlbWVudCBFbGVtZW50IHRvIHBvc2l0aW9uXG4gICAqIEBwYXJhbSB0YXJnZXRSZWN0IEJvdW5kaW5nIHJlY3RhbmdsZSBvZiBzdHJhdGVneSB0YXJnZXRcbiAgICogQHBhcmFtIGVsZW1lbnRSZWN0IEJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgZWxlbWVudFxuICAgKi9cbiAgcHJvdGVjdGVkIHNldFN0eWxlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0YXJnZXRSZWN0OiBDbGllbnRSZWN0LCBlbGVtZW50UmVjdDogQ2xpZW50UmVjdCwgY29ubmVjdGVkRml0OiBDb25uZWN0ZWRGaXQpIHtcbiAgICAgIGNvbnN0IGhvcml6b250YWxPZmZzZXQgPSBjb25uZWN0ZWRGaXQuaG9yaXpvbnRhbE9mZnNldCA/IGNvbm5lY3RlZEZpdC5ob3Jpem9udGFsT2Zmc2V0IDogMDtcbiAgICAgIGNvbnN0IHZlcnRpY2FsT2Zmc2V0ID0gY29ubmVjdGVkRml0LnZlcnRpY2FsT2Zmc2V0ID8gY29ubmVjdGVkRml0LnZlcnRpY2FsT2Zmc2V0IDogMDtcbiAgICBjb25zdCBzdGFydFBvaW50OiBQb2ludCA9IHtcbiAgICAgIHg6IHRhcmdldFJlY3QucmlnaHQgKyB0YXJnZXRSZWN0LndpZHRoICogdGhpcy5zZXR0aW5ncy5ob3Jpem9udGFsU3RhcnRQb2ludCArIGhvcml6b250YWxPZmZzZXQsXG4gICAgICB5OiB0YXJnZXRSZWN0LmJvdHRvbSArIHRhcmdldFJlY3QuaGVpZ2h0ICogdGhpcy5zZXR0aW5ncy52ZXJ0aWNhbFN0YXJ0UG9pbnQgKyB2ZXJ0aWNhbE9mZnNldFxuICAgIH07XG4gICAgY29uc3Qgd3JhcHBlclJlY3Q6IENsaWVudFJlY3QgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAvLyAgY2xlYW4gdXAgc3R5bGVzIC0gaWYgYXV0byBwb3NpdGlvbiBzdHJhdGVneSBpcyBjaG9zZW4gd2UgbWF5IHBhc3MgaGVyZSBzZXZlcmFsIHRpbWVzXG4gICAgZWxlbWVudC5zdHlsZS5yaWdodCA9ICcnO1xuICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9ICcnO1xuICAgIGVsZW1lbnQuc3R5bGUuYm90dG9tID0gJyc7XG4gICAgZWxlbWVudC5zdHlsZS50b3AgPSAnJztcblxuICAgIHN3aXRjaCAodGhpcy5zZXR0aW5ncy5ob3Jpem9udGFsRGlyZWN0aW9uKSB7XG4gICAgICBjYXNlIEhvcml6b250YWxBbGlnbm1lbnQuTGVmdDpcbiAgICAgICAgZWxlbWVudC5zdHlsZS5yaWdodCA9IGAke01hdGgucm91bmQod3JhcHBlclJlY3QucmlnaHQgLSBzdGFydFBvaW50LngpfXB4YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEhvcml6b250YWxBbGlnbm1lbnQuQ2VudGVyOlxuICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSBgJHtNYXRoLnJvdW5kKHN0YXJ0UG9pbnQueCAtIHdyYXBwZXJSZWN0LmxlZnQgLSBlbGVtZW50UmVjdC53aWR0aCAvIDIpfXB4YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEhvcml6b250YWxBbGlnbm1lbnQuUmlnaHQ6XG4gICAgICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9IGAke01hdGgucm91bmQoc3RhcnRQb2ludC54IC0gd3JhcHBlclJlY3QubGVmdCl9cHhgO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRoaXMuc2V0dGluZ3MudmVydGljYWxEaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgVmVydGljYWxBbGlnbm1lbnQuVG9wOlxuICAgICAgICBlbGVtZW50LnN0eWxlLmJvdHRvbSA9IGAke01hdGgucm91bmQod3JhcHBlclJlY3QuYm90dG9tIC0gc3RhcnRQb2ludC55KX1weGA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWZXJ0aWNhbEFsaWdubWVudC5NaWRkbGU6XG4gICAgICAgIGVsZW1lbnQuc3R5bGUudG9wID0gYCR7TWF0aC5yb3VuZChzdGFydFBvaW50LnkgLSB3cmFwcGVyUmVjdC50b3AgLSBlbGVtZW50UmVjdC5oZWlnaHQgLyAyKX1weGA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWZXJ0aWNhbEFsaWdubWVudC5Cb3R0b206XG4gICAgICAgIGVsZW1lbnQuc3R5bGUudG9wID0gYCR7TWF0aC5yb3VuZChzdGFydFBvaW50LnkgLSB3cmFwcGVyUmVjdC50b3ApfXB4YDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG4iXX0=