UNPKG

@dotglitch/ngx-common

Version:

Angular components and utilities that are commonly used.

153 lines 18.2 kB
import { Directive, HostListener, Input, TemplateRef } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { MenuComponent, getPosition } from '@dotglitch/ngx-common/core'; import { firstValueFrom } from 'rxjs'; import { ulid } from 'ulidx'; import { TooltipComponent, calcTooltipBounds } from './tooltip.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/material/dialog"; export class TooltipDirective { constructor(dialog, viewContainer) { this.dialog = dialog; this.viewContainer = viewContainer; /** * Configuration for opening the app menu */ this.config = {}; /** * Arbitrary data to pass into the template */ this.data = {}; this.isCursorOverTarget = false; this.dialogIsOpen = false; } ngAfterViewInit() { const el = this.viewContainer.element.nativeElement; this.config?.triggers?.forEach(t => { el.addEventListener(t, () => { if (t == "click") this.config.stayOpen = true; this.open(); }); }); } async open() { if (!this.dialogIsOpen) { const el = this.viewContainer.element.nativeElement; this.dialogIsOpen = true; await openTooltip(this.dialog, this.template, this.data, el, this.config); this.dialogIsOpen = false; } } async onPointerEnter(evt) { // If the template is not a template ref, do nothing. if (!(this.template instanceof TemplateRef)) return; if (Array.isArray(this.config?.triggers) && !this.config.triggers.includes("hover")) { return; } this.isCursorOverTarget = true; setTimeout(async () => { // If the cursor moved away in the time if (!this.isCursorOverTarget) return; this.open(); }, this.config.delay ?? 250); } async onPointerLeave(evt) { this.isCursorOverTarget = false; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TooltipDirective, deps: [{ token: i1.MatDialog }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: TooltipDirective, isStandalone: true, selector: "[ngx-tooltip]", inputs: { template: ["ngx-tooltip", "template"], config: ["ngx-tooltip-config", "config"], data: ["ngx-tooltip-context", "data"] }, host: { listeners: { "pointerenter": "onPointerEnter($event)", "pointerleave": "onPointerLeave($event)" } }, providers: [ MatDialog ], ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TooltipDirective, decorators: [{ type: Directive, args: [{ selector: '[ngx-tooltip]', providers: [ MatDialog ], standalone: true }] }], ctorParameters: () => [{ type: i1.MatDialog }, { type: i0.ViewContainerRef }], propDecorators: { template: [{ type: Input, args: ["ngx-tooltip"] }], config: [{ type: Input, args: ["ngx-tooltip-config"] }], data: [{ type: Input, args: ["ngx-tooltip-context"] }], onPointerEnter: [{ type: HostListener, args: ['pointerenter', ['$event']] }], onPointerLeave: [{ type: HostListener, args: ['pointerleave', ['$event']] }] } }); // Helper to open the context menu without using the directive. export const openTooltip = async (dialog, template, data, el, config, focusTrap = false, matPopupOptions) => { const component = Array.isArray(template) ? MenuComponent : template; const rect = await calcTooltipBounds(component, data, matPopupOptions); const ownerCords = el.getBoundingClientRect(); const cords = getPosition(el, config, rect); const specificId = ulid(); return firstValueFrom(dialog.open(TooltipComponent, { autoFocus: focusTrap, restoreFocus: focusTrap, data: { dialog, data: data, template: template, config: config, matPopupOptions, ownerCords: ownerCords, selfCords: cords, id: specificId }, panelClass: ["ngx-tooltip", 'ngx-' + specificId].concat(config?.customClass || []), position: cords, hasBackdrop: false, ...matPopupOptions }) .afterClosed()); }; export class DropdownDirective extends TooltipDirective { constructor() { super(...arguments); /** * Configuration for opening the app menu */ this._config = {}; } ngOnInit() { // Set default values this._config.position = this._config.position ?? "bottom"; this._config.alignment = this._config.alignment ?? "start"; this._config.stayOpen = this._config.stayOpen ?? true; this.config = this._config; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DropdownDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: DropdownDirective, isStandalone: true, selector: "[ngx-dropdown],[ngx-dropdown-config]", inputs: { template: ["ngx-dropdown", "template"], _config: ["ngx-dropdown-config", "_config"] }, providers: [ MatDialog ], usesInheritance: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DropdownDirective, decorators: [{ type: Directive, args: [{ selector: '[ngx-dropdown],[ngx-dropdown-config]', providers: [ MatDialog ], standalone: true }] }], propDecorators: { template: [{ type: Input, args: ["ngx-dropdown"] }], _config: [{ type: Input, args: ["ngx-dropdown-config"] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vdG9vbHRpcC90b29sdGlwLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUEwQixNQUFNLGVBQWUsQ0FBQztBQUNwRyxPQUFPLEVBQUUsU0FBUyxFQUFtQixNQUFNLDBCQUEwQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQVksV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbEYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7QUFVMUUsTUFBTSxPQUFPLGdCQUFnQjtJQW1CekIsWUFDWSxNQUFpQixFQUNqQixhQUErQjtRQUQvQixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2pCLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQWYzQzs7V0FFRztRQUMwQixXQUFNLEdBQW1CLEVBQUUsQ0FBQztRQUV6RDs7V0FFRztRQUMyQixTQUFJLEdBQVEsRUFBRSxDQUFDO1FBRXJDLHVCQUFrQixHQUFHLEtBQUssQ0FBQztRQUMzQixpQkFBWSxHQUFHLEtBQUssQ0FBQztJQU03QixDQUFDO0lBRUQsZUFBZTtRQUNYLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGFBQTRCLENBQUM7UUFFbkUsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQy9CLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFO2dCQUN4QixJQUFJ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LENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDL0IsQ0FBQzsrR0FuQlEsaUJBQWlCO21HQUFqQixpQkFBaUIsb0xBTGY7WUFDUCxTQUFTO1NBQ1o7OzRGQUdRLGlCQUFpQjtrQkFQN0IsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsc0NBQXNDO29CQUNoRCxTQUFTLEVBQUU7d0JBQ1AsU0FBUztxQkFDWjtvQkFDRCxVQUFVLEVBQUUsSUFBSTtpQkFDbkI7OEJBTW1DLFFBQVE7c0JBQXZDLEtBQUs7dUJBQUMsY0FBYztnQkFLUyxPQUFPO3NCQUFwQyxLQUFLO3VCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSG9zdExpc3RlbmVyLCBJbnB1dCwgVGVtcGxhdGVSZWYsIFR5cGUsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nQ29uZmlnIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1lbnVDb21wb25lbnQsIE1lbnVJdGVtLCBnZXRQb3NpdGlvbiB9IGZyb20gJ0Bkb3RnbGl0Y2gvbmd4LWNvbW1vbi9jb3JlJztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB1bGlkIH0gZnJvbSAndWxpZHgnO1xuaW1wb3J0IHsgVG9vbHRpcENvbXBvbmVudCwgY2FsY1Rvb2x0aXBCb3VuZHMgfSBmcm9tICcuL3Rvb2x0aXAuY29tcG9uZW50JztcbmltcG9ydCB7IFRvb2x0aXBPcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW25neC10b29sdGlwXScsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIE1hdERpYWxvZ1xuICAgIF0sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBUb29sdGlwRGlyZWN0aXZlIHtcblxuICAgIC8qKlxuICAgICAqL1xuICAgIEBJbnB1dChcIm5neC10b29sdGlwXCIpIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgVHlwZTxhbnk+IHwgTWVudUl0ZW1bXTtcblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYXRpb24gZm9yIG9wZW5pbmcgdGhlIGFwcCBtZW51XG4gICAgICovXG4gICAgQElucHV0KFwibmd4LXRvb2x0aXAtY29uZmlnXCIpIGNvbmZpZzogVG9vbHRpcE9wdGlvbnMgPSB7fTtcblxuICAgIC8qKlxuICAgICAqIEFyYml0cmFyeSBkYXRhIHRvIHBhc3MgaW50byB0aGUgdGVtcGxhdGVcbiAgICAgKi9cbiAgICBASW5wdXQoXCJuZ3gtdG9vbHRpcC1jb250ZXh0XCIpIGRhdGE6IGFueSA9IHt9O1xuXG4gICAgcHJpdmF0ZSBpc0N1cnNvck92ZXJUYXJnZXQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGRpYWxvZ0lzT3BlbiA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgICAgIHByaXZhdGUgdmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZlxuICAgICkge1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLnZpZXdDb250YWluZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIHRoaXMuY29uZmlnPy50cmlnZ2Vycz8uZm9yRWFjaCh0ID0+IHtcbiAgICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIodCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0ID09IFwiY2xpY2tcIilcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RheU9wZW4gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgb3BlbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRpYWxvZ0lzT3Blbikge1xuICAgICAgICAgICAgY29uc3QgZWwgPSB0aGlzLnZpZXdDb250YWluZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgdGhpcy5kaWFsb2dJc09wZW4gPSB0cnVlO1xuICAgICAgICAgICAgYXdhaXQgb3BlblRvb2x0aXAodGhpcy5kaWFsb2csIHRoaXMudGVtcGxhdGUsIHRoaXMuZGF0YSwgZWwsIHRoaXMuY29uZmlnKTtcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nSXNPcGVuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdwb2ludGVyZW50ZXInLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBhc3luYyBvblBvaW50ZXJFbnRlcihldnQ6IFBvaW50ZXJFdmVudCkge1xuICAgICAgICAvLyBJZiB0aGUgdGVtcGxhdGUgaXMgbm90IGEgdGVtcGxhdGUgcmVmLCBkbyBub3RoaW5nLlxuICAgICAgICBpZiAoISh0aGlzLnRlbXBsYXRlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuY29uZmlnPy50cmlnZ2VycykgJiYgIXRoaXMuY29uZmlnLnRyaWdnZXJzLmluY2x1ZGVzKFwiaG92ZXJcIikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNDdXJzb3JPdmVyVGFyZ2V0ID0gdHJ1ZTtcblxuICAgICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBjdXJzb3IgbW92ZWQgYXdheSBpbiB0aGUgdGltZVxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzQ3Vyc29yT3ZlclRhcmdldClcbiAgICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICB9LCB0aGlzLmNvbmZpZy5kZWxheSA/PyAyNTApO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3BvaW50ZXJsZWF2ZScsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIGFzeW5jIG9uUG9pbnRlckxlYXZlKGV2dDogUG9pbnRlckV2ZW50KSB7XG4gICAgICAgIHRoaXMuaXNDdXJzb3JPdmVyVGFyZ2V0ID0gZmFsc2U7XG4gICAgfVxufVxuXG4vLyBIZWxwZXIgdG8gb3BlbiB0aGUgY29udGV4dCBtZW51IHdpdGhvdXQgdXNpbmcgdGhlIGRpcmVjdGl2ZS5cbmV4cG9ydCBjb25zdCBvcGVuVG9vbHRpcCA9IGFzeW5jIChcbiAgICBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IFR5cGU8YW55PiB8IE1lbnVJdGVtW10sXG4gICAgZGF0YTogYW55LFxuICAgIGVsOiBIVE1MRWxlbWVudCxcbiAgICBjb25maWc/OiBUb29sdGlwT3B0aW9ucyxcbiAgICBmb2N1c1RyYXAgPSBmYWxzZSxcbiAgICBtYXRQb3B1cE9wdGlvbnM/OiBNYXREaWFsb2dDb25maWc8YW55PlxuKSA9PiB7XG5cbiAgICBjb25zdCBjb21wb25lbnQgPSBBcnJheS5pc0FycmF5KHRlbXBsYXRlKSA/IE1lbnVDb21wb25lbnQgOiB0ZW1wbGF0ZTtcbiAgICBjb25zdCByZWN0ID0gYXdhaXQgY2FsY1Rvb2x0aXBCb3VuZHMoY29tcG9uZW50LCBkYXRhLCBtYXRQb3B1cE9wdGlvbnMpO1xuICAgIGNvbnN0IG93bmVyQ29yZHMgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBjb3JkcyA9IGdldFBvc2l0aW9uKGVsLCBjb25maWcsIHJlY3QpO1xuICAgIGNvbnN0IHNwZWNpZmljSWQgPSB1bGlkKCk7XG5cbiAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgIGRpYWxvZy5vcGVuKFRvb2x0aXBDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGF1dG9Gb2N1czogZm9jdXNUcmFwLFxuICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmb2N1c1RyYXAsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZGlhbG9nLFxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlLFxuICAgICAgICAgICAgICAgIGNvbmZpZzogY29uZmlnLFxuICAgICAgICAgICAgICAgIG1hdFBvcHVwT3B0aW9ucyxcbiAgICAgICAgICAgICAgICBvd25lckNvcmRzOiBvd25lckNvcmRzLFxuICAgICAgICAgICAgICAgIHNlbGZDb3JkczogY29yZHMsXG4gICAgICAgICAgICAgICAgaWQ6IHNwZWNpZmljSWRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYW5lbENsYXNzOiBbXCJuZ3gtdG9vbHRpcFwiLCAnbmd4LScgKyBzcGVjaWZpY0lkXS5jb25jYXQoY29uZmlnPy5jdXN0b21DbGFzcyB8fCBbXSksXG4gICAgICAgICAgICBwb3NpdGlvbjogY29yZHMsXG4gICAgICAgICAgICBoYXNCYWNrZHJvcDogZmFsc2UsXG4gICAgICAgICAgICAuLi5tYXRQb3B1cE9wdGlvbnNcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5hZnRlckNsb3NlZCgpXG4gICAgKTtcbn07XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW25neC1kcm9wZG93bl0sW25neC1kcm9wZG93bi1jb25maWddJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgTWF0RGlhbG9nXG4gICAgXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIERyb3Bkb3duRGlyZWN0aXZlIGV4dGVuZHMgVG9vbHRpcERpcmVjdGl2ZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGl0ZW1zIHRoYXQgd2lsbCBiZSBib3VuZCB0byB0aGUgbWVudSB0aGF0IHBvcHNcbiAgICAgKiB1cCB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgZWxlbWVudC5cbiAgICAgKi9cbiAgICBASW5wdXQoXCJuZ3gtZHJvcGRvd25cIikgb3ZlcnJpZGUgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCBUeXBlPGFueT4gfCBNZW51SXRlbVtdO1xuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJhdGlvbiBmb3Igb3BlbmluZyB0aGUgYXBwIG1lbnVcbiAgICAgKi9cbiAgICBASW5wdXQoXCJuZ3gtZHJvcGRvd24tY29uZmlnXCIpIF9jb25maWc6IFRvb2x0aXBPcHRpb25zID0ge307XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgLy8gU2V0IGRlZmF1bHQgdmFsdWVzXG4gICAgICAgIHRoaXMuX2NvbmZpZy5wb3NpdGlvbiA9IHRoaXMuX2NvbmZpZy5wb3NpdGlvbiA/PyBcImJvdHRvbVwiO1xuICAgICAgICB0aGlzLl9jb25maWcuYWxpZ25tZW50ID0gdGhpcy5fY29uZmlnLmFsaWdubWVudCA/PyBcInN0YXJ0XCI7XG4gICAgICAgIHRoaXMuX2NvbmZpZy5zdGF5T3BlbiA9IHRoaXMuX2NvbmZpZy5zdGF5T3BlbiA/PyB0cnVlO1xuXG4gICAgICAgIHRoaXMuY29uZmlnID0gdGhpcy5fY29uZmlnO1xuICAgIH1cbn1cbiJdfQ==