import { Input, Component, ElementRef, AfterViewInit, HostListener, ViewChild, HostBinding, Renderer } from '@angular/core'; import { throttleable } from '../../utils'; import { PositionHelper } from './position.helper'; import { PlacementTypes } from './placement.type'; import { StyleTypes } from './style.type'; import { AlignmentTypes } from './alignment.type'; @Component({ selector: 'swui-tooltip-content', template: `
` }) export class TooltipContentComponent implements AfterViewInit { @Input() host: any; @Input() showCaret: boolean; @Input() type: StyleTypes; @Input() placement: PlacementTypes; @Input() alignment: AlignmentTypes; @Input() spacing: number; @Input() cssClass: string; @ViewChild('caretElm') caretElm; @HostBinding('class') get cssClasses(): string { let clz = 'swui-tooltip-content'; clz += ` position-${this.placement}`; clz += ` type-${this.type}`; clz += ` ${this.cssClass}`; return clz; } constructor( public element: ElementRef, private renderer: Renderer) { } ngAfterViewInit(): void { setTimeout(this.position.bind(this)); } position(): void { const nativeElm = this.element.nativeElement; const hostDim = this.host.nativeElement.getBoundingClientRect(); // if no dims were found, never show if(!hostDim.height && !hostDim.width) return; const elmDim = nativeElm.getBoundingClientRect(); this.checkFlip(hostDim, elmDim); this.positionContent(nativeElm, hostDim, elmDim); if(this.showCaret) { this.positionCaret(hostDim, elmDim); } // animate its entry setTimeout(() => this.renderer.setElementClass(nativeElm, 'animate', true), 1); } positionContent(nativeElm, hostDim, elmDim): void { const { top, left } = PositionHelper.positionContent( this.placement, elmDim, hostDim, this.spacing, this.alignment); this.renderer.setElementStyle(nativeElm, 'top', `${top}px`); this.renderer.setElementStyle(nativeElm, 'left', `${left}px`); } positionCaret(hostDim, elmDim): void { const caretElm = this.caretElm.nativeElement; const caretDimensions = caretElm.getBoundingClientRect(); const { top, left } = PositionHelper.positionCaret( this.placement, elmDim, hostDim, caretDimensions, this.alignment); this.renderer.setElementStyle(caretElm, 'top', `${top}px`); this.renderer.setElementStyle(caretElm, 'left', `${left}px`); } checkFlip(hostDim, elmDim): void { this.placement = PositionHelper.determinePlacement( this.placement, elmDim, hostDim, this.spacing, this.alignment); } @HostListener('window:resize') @throttleable(100) onWindowResize(): void { this.position(); } }