UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

110 lines 14.6 kB
import { Directive, ElementRef, HostListener, Renderer2 } from '@angular/core'; import { forEach } from 'lodash-es'; import * as i0 from "@angular/core"; /** * A directive to determine if a dropdown should open to the top or as usual to the bottom. * It starts by checking the available space on the closese parent container with the class * `inner-scroll`, fallback to the `window.innerHeight` if no parent is found. * This directive has a direct dependency to the bootstrap dropdown (!) * * Preconditions: * - Bootstrap dropdown is used * - Bootstrap dropdown is not used with container="body" * - Bootstrap dropdown is used like it is intended and documented for e.g. * ```html * <div dropdown class="dropdown"> * <button class="dropdown-toggle" dropdownToggle>Toggle</button> * <ul class="dropdown-menu" *dropdownMenu> * <!-- Content here --> * </ul> * </div> * ``` * * ```html * <div dropdown c8yBsDropdownDirection class="dropdown"> * <button class="dropdown-toggle" dropdownToggle>Toggle</button> * <ul class="dropdown-menu" *dropdownMenu> * <!-- Content here --> * </ul> * </div> * ``` * Make use of the bootstrap dropdown as usual and additionally add the direction directive to it. */ export class DropdownDirectionDirective { constructor(elementRef, renderer) { this.elementRef = elementRef; this.renderer = renderer; this.MARGIN_BOTTOM = 10; this.VISIBILITY = 'visibility'; this.DROPUP = 'dropup'; this.MENUHEIGHT = 278; this.MAX_ANCESTOR_SEARCH_ITERATIONS = 15; } onClick() { const open = this.elementRef.nativeElement.classList.contains('open'); if (open) { let menu; let toggle; forEach(this.elementRef.nativeElement.children, (element) => { if (element.classList.contains('dropdown-menu')) { menu = element; } if (element.classList.contains('dropdown-toggle') || element.hasAttribute('dropdownToggle')) { toggle = element; } }); if (menu && toggle) { this.renderer.setStyle(menu, this.VISIBILITY, 'hidden'); this.shouldDropup(menu, toggle); this.renderer.removeStyle(menu, this.VISIBILITY); } } } shouldDropup(container, position) { const containerHeight = container.getBoundingClientRect().height; const positionTopOffset = position.getBoundingClientRect().top; const containerDropPosition = positionTopOffset - container.scrollTop; let layoutViewport; let currentElement = container; let foundScrollableAncestor = false; let iterationsCount = 0; while (currentElement.parentElement && iterationsCount < this.MAX_ANCESTOR_SEARCH_ITERATIONS) { currentElement = currentElement.parentElement; if (currentElement.classList.contains('inner-scroll')) { layoutViewport = currentElement.clientHeight; foundScrollableAncestor = true; break; } iterationsCount++; } if (!foundScrollableAncestor) { layoutViewport = window.innerHeight; } const sum = Math.max(containerHeight, containerDropPosition) + this.MARGIN_BOTTOM; const remainingSpaceAboveTrigger = positionTopOffset; // Check if the dropdown menu's height is greater than the remaining space if (this.MENUHEIGHT > remainingSpaceAboveTrigger) { // Open the dropdown downwards this.renderer.removeClass(this.elementRef.nativeElement, this.DROPUP); } else if (sum >= layoutViewport) { // Open the dropdown upwards this.renderer.addClass(this.elementRef.nativeElement, this.DROPUP); } else if (this.elementRef.nativeElement.classList.contains(this.DROPUP)) { // Open the dropdown downwards this.renderer.removeClass(this.elementRef.nativeElement, this.DROPUP); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DropdownDirectionDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: DropdownDirectionDirective, selector: "[dropdown][c8yBsDropdownDirection],[dropdown][c8yDropdownDirection]", host: { listeners: { "click": "onClick()" } }, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DropdownDirectionDirective, decorators: [{ type: Directive, args: [{ selector: '[dropdown][c8yBsDropdownDirection],[dropdown][c8yDropdownDirection]' }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { onClick: [{ type: HostListener, args: ['click'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tZGlyZWN0aW9uLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvY29tbW9uL2Ryb3Bkb3duLWRpcmVjdGlvbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDOztBQUVwQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUdILE1BQU0sT0FBTywwQkFBMEI7SUFPckMsWUFDVSxVQUFzQixFQUN0QixRQUFtQjtRQURuQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFSWixrQkFBYSxHQUFXLEVBQUUsQ0FBQztRQUMzQixlQUFVLEdBQVcsWUFBWSxDQUFDO1FBQ2xDLFdBQU0sR0FBVyxRQUFRLENBQUM7UUFDMUIsZUFBVSxHQUFXLEdBQUcsQ0FBQztRQUN6QixtQ0FBOEIsR0FBRyxFQUFFLENBQUM7SUFLbEQsQ0FBQztJQUdKLE9BQU87UUFDTCxNQUFNLElBQUksR0FBWSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRS9FLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxJQUFJLElBQWlCLENBQUM7WUFDdEIsSUFBSSxNQUFtQixDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFvQixFQUFFLEVBQUU7Z0JBQ3ZFLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztvQkFDaEQsSUFBSSxHQUFHLE9BQU8sQ0FBQztnQkFDakIsQ0FB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QTFCLDBCQUEwQjs7NEZBQTFCLDBCQUEwQjtrQkFEdEMsU0FBUzttQkFBQyxFQUFFLFFBQVEsRUFBRSxxRUFBcUUsRUFBRTt1R0FjNUYsT0FBTztzQkFETixZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmb3JFYWNoIH0gZnJvbSAnbG9kYXNoLWVzJztcblxuLyoqXG4gKiBBIGRpcmVjdGl2ZSB0byBkZXRlcm1pbmUgaWYgYSBkcm9wZG93biBzaG91bGQgb3BlbiB0byB0aGUgdG9wIG9yIGFzIHVzdWFsIHRvIHRoZSBib3R0b20uXG4gKiBJdCBzdGFydHMgYnkgY2hlY2tpbmcgdGhlIGF2YWlsYWJsZSBzcGFjZSBvbiB0aGUgY2xvc2VzZSBwYXJlbnQgY29udGFpbmVyIHdpdGggdGhlIGNsYXNzXG4gKiBgaW5uZXItc2Nyb2xsYCwgZmFsbGJhY2sgdG8gdGhlIGB3aW5kb3cuaW5uZXJIZWlnaHRgIGlmIG5vIHBhcmVudCBpcyBmb3VuZC5cbiAqIFRoaXMgZGlyZWN0aXZlIGhhcyBhIGRpcmVjdCBkZXBlbmRlbmN5IHRvIHRoZSBib290c3RyYXAgZHJvcGRvd24gKCEpXG4gKlxuICogUHJlY29uZGl0aW9uczpcbiAqICAtIEJvb3RzdHJhcCBkcm9wZG93biBpcyB1c2VkXG4gKiAgLSBCb290c3RyYXAgZHJvcGRvd24gaXMgbm90IHVzZWQgd2l0aCBjb250YWluZXI9XCJib2R5XCJcbiAqICAtIEJvb3RzdHJhcCBkcm9wZG93biBpcyB1c2VkIGxpa2UgaXQgaXMgaW50ZW5kZWQgYW5kIGRvY3VtZW50ZWQgZm9yIGUuZy5cbiAqIGBgYGh0bWxcbiAqIDxkaXYgZHJvcGRvd24gY2xhc3M9XCJkcm9wZG93blwiPlxuICogIDxidXR0b24gY2xhc3M9XCJkcm9wZG93bi10b2dnbGVcIiBkcm9wZG93blRvZ2dsZT5Ub2dnbGU8L2J1dHRvbj5cbiAqICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgKmRyb3Bkb3duTWVudT5cbiAqICAgIDwhLS0gQ29udGVudCBoZXJlIC0tPlxuICogIDwvdWw+XG4gKiA8L2Rpdj5cbiAqIGBgYFxuICpcbiAqIGBgYGh0bWxcbiAqIDxkaXYgZHJvcGRvd24gYzh5QnNEcm9wZG93bkRpcmVjdGlvbiBjbGFzcz1cImRyb3Bkb3duXCI+XG4gKiAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLXRvZ2dsZVwiIGRyb3Bkb3duVG9nZ2xlPlRvZ2dsZTwvYnV0dG9uPlxuICogIDx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiAqZHJvcGRvd25NZW51PlxuICogICAgPCEtLSBDb250ZW50IGhlcmUgLS0+XG4gKiAgPC91bD5cbiAqIDwvZGl2PlxuICogYGBgXG4gKiBNYWtlIHVzZSBvZiB0aGUgYm9vdHN0cmFwIGRyb3Bkb3duIGFzIHVzdWFsIGFuZCBhZGRpdGlvbmFsbHkgYWRkIHRoZSBkaXJlY3Rpb24gZGlyZWN0aXZlIHRvIGl0LlxuICovXG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tkcm9wZG93bl1bYzh5QnNEcm9wZG93bkRpcmVjdGlvbl0sW2Ryb3Bkb3duXVtjOHlEcm9wZG93bkRpcmVjdGlvbl0nIH0pXG5leHBvcnQgY2xhc3MgRHJvcGRvd25EaXJlY3Rpb25EaXJlY3RpdmUge1xuICBwcml2YXRlIHJlYWRvbmx5IE1BUkdJTl9CT1RUT006IG51bWJlciA9IDEwO1xuICBwcml2YXRlIHJlYWRvbmx5IFZJU0lCSUxJVFk6IHN0cmluZyA9ICd2aXNpYmlsaXR5JztcbiAgcHJpdmF0ZSByZWFkb25seSBEUk9QVVA6IHN0cmluZyA9ICdkcm9wdXAnO1xuICBwcml2YXRlIHJlYWRvbmx5IE1FTlVIRUlHSFQ6IG51bWJlciA9IDI3ODtcbiAgcHJpdmF0ZSByZWFkb25seSBNQVhfQU5DRVNUT1JfU0VBUkNIX0lURVJBVElPTlMgPSAxNTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyXG4gICkge31cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycpXG4gIG9uQ2xpY2soKSB7XG4gICAgY29uc3Qgb3BlbjogYm9vbGVhbiA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnb3BlbicpO1xuXG4gICAgaWYgKG9wZW4pIHtcbiAgICAgIGxldCBtZW51OiBIVE1MRWxlbWVudDtcbiAgICAgIGxldCB0b2dnbGU6IEhUTUxFbGVtZW50O1xuICAgICAgZm9yRWFjaCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jaGlsZHJlbiwgKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZHJvcGRvd24tbWVudScpKSB7XG4gICAgICAgICAgbWVudSA9IGVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkcm9wZG93bi10b2dnbGUnKSB8fFxuICAgICAgICAgIGVsZW1lbnQuaGFzQXR0cmlidXRlKCdkcm9wZG93blRvZ2dsZScpXG4gICAgICAgICkge1xuICAgICAgICAgIHRvZ2dsZSA9IGVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKG1lbnUgJiYgdG9nZ2xlKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUobWVudSwgdGhpcy5WSVNJQklMSVRZLCAnaGlkZGVuJyk7XG4gICAgICAgIHRoaXMuc2hvdWxkRHJvcHVwKG1lbnUsIHRvZ2dsZSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlU3R5bGUobWVudSwgdGhpcy5WSVNJQklMSVRZKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzaG91bGREcm9wdXAoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcG9zaXRpb246IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgY29udGFpbmVySGVpZ2h0OiBudW1iZXIgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuXG4gICAgY29uc3QgcG9zaXRpb25Ub3BPZmZzZXQ6IG51bWJlciA9IHBvc2l0aW9uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICBjb25zdCBjb250YWluZXJEcm9wUG9zaXRpb246IG51bWJlciA9IHBvc2l0aW9uVG9wT2Zmc2V0IC0gY29udGFpbmVyLnNjcm9sbFRvcDtcblxuICAgIGxldCBsYXlvdXRWaWV3cG9ydDogbnVtYmVyO1xuICAgIGxldCBjdXJyZW50RWxlbWVudCA9IGNvbnRhaW5lcjtcbiAgICBsZXQgZm91bmRTY3JvbGxhYmxlQW5jZXN0b3IgPSBmYWxzZTtcbiAgICBsZXQgaXRlcmF0aW9uc0NvdW50ID0gMDtcbiAgICB3aGlsZSAoY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudCAmJiBpdGVyYXRpb25zQ291bnQgPCB0aGlzLk1BWF9BTkNFU1RPUl9TRUFSQ0hfSVRFUkFUSU9OUykge1xuICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnaW5uZXItc2Nyb2xsJykpIHtcbiAgICAgICAgbGF5b3V0Vmlld3BvcnQgPSBjdXJyZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICAgIGZvdW5kU2Nyb2xsYWJsZUFuY2VzdG9yID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpdGVyYXRpb25zQ291bnQrKztcbiAgICB9XG4gICAgaWYgKCFmb3VuZFNjcm9sbGFibGVBbmNlc3Rvcikge1xuICAgICAgbGF5b3V0Vmlld3BvcnQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgfVxuICAgIGNvbnN0IHN1bSA9IE1hdGgubWF4KGNvbnRhaW5lckhlaWdodCwgY29udGFpbmVyRHJvcFBvc2l0aW9uKSArIHRoaXMuTUFSR0lOX0JPVFRPTTtcblxuICAgIGNvbnN0IHJlbWFpbmluZ1NwYWNlQWJvdmVUcmlnZ2VyID0gcG9zaXRpb25Ub3BPZmZzZXQ7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZHJvcGRvd24gbWVudSdzIGhlaWdodCBpcyBncmVhdGVyIHRoYW4gdGhlIHJlbWFpbmluZyBzcGFjZVxuICAgIGlmICh0aGlzLk1FTlVIRUlHSFQgPiByZW1haW5pbmdTcGFjZUFib3ZlVHJpZ2dlcikge1xuICAgICAgLy8gT3BlbiB0aGUgZHJvcGRvd24gZG93bndhcmRzXG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLkRST1BVUCk7XG4gICAgfSBlbHNlIGlmIChzdW0gPj0gbGF5b3V0Vmlld3BvcnQpIHtcbiAgICAgIC8vIE9wZW4gdGhlIGRyb3Bkb3duIHVwd2FyZHNcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuRFJPUFVQKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyh0aGlzLkRST1BVUCkpIHtcbiAgICAgIC8vIE9wZW4gdGhlIGRyb3Bkb3duIGRvd253YXJkc1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5EUk9QVVApO1xuICAgIH1cbiAgfVxufVxuIl19