@taiga-ui/core
Version:
Core library for creating Angular components and applications using Taiga UI
41 lines • 8.54 kB
JavaScript
import { DOCUMENT } from '@angular/common';
import { inject, Injectable } from '@angular/core';
import { WA_WINDOW } from '@ng-web-apis/common';
import { tuiCloseWatcher, tuiTypedFromEvent, tuiZonefull } from '@taiga-ui/cdk/observables';
import { tuiContainsOrAfter, tuiGetActualTarget, tuiInjectElement, tuiIsElement, } from '@taiga-ui/cdk/utils/dom';
import { tuiGetViewportWidth } from '@taiga-ui/core/utils';
import { filter, map, merge, Observable, switchMap, take } from 'rxjs';
import * as i0 from "@angular/core";
const SCROLLBAR_PLACEHOLDER = 17;
class TuiDialogCloseService extends Observable {
constructor() {
super((subscriber) => merge(this.esc$, this.mousedown$, tuiCloseWatcher().pipe(tuiZonefull())).subscribe(subscriber));
this.win = inject(WA_WINDOW);
this.doc = inject(DOCUMENT);
this.el = tuiInjectElement();
this.esc$ = tuiTypedFromEvent(this.doc, 'keydown').pipe(filter((event) => {
const target = tuiGetActualTarget(event);
return (
// @ts-ignore
typeof CloseWatcher === 'undefined' &&
event.key?.toLowerCase() === 'escape' &&
!event.defaultPrevented &&
(this.el.contains(target) || this.isOutside(target)));
}));
this.mousedown$ = tuiTypedFromEvent(this.doc, 'mousedown').pipe(filter((event) => tuiGetViewportWidth(this.win) - event.clientX > SCROLLBAR_PLACEHOLDER &&
this.isOutside(tuiGetActualTarget(event))), switchMap(() => tuiTypedFromEvent(this.doc, 'mouseup').pipe(take(1), map(tuiGetActualTarget), filter((target) => this.isOutside(target)))));
}
isOutside(target) {
return (tuiIsElement(target) &&
(!tuiContainsOrAfter(this.el, target) ||
// TODO: Drop 'new' attribute in v5
(target === this.el && !this.el.hasAttribute('new'))));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiDialogCloseService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiDialogCloseService }); }
}
export { TuiDialogCloseService };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiDialogCloseService, decorators: [{
type: Injectable
}], ctorParameters: function () { return []; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLWNsb3NlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL2NvbXBvbmVudHMvZGlhbG9nL2RpYWxvZy1jbG9zZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUFDLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRixPQUFPLEVBQ0gsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsWUFBWSxHQUNmLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDekQsT0FBTyxFQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFDLE1BQU0sTUFBTSxDQUFDOztBQUVyRSxNQUFNLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztBQUVqQyxNQUNhLHFCQUFzQixTQUFRLFVBQW1CO0lBa0MxRDtRQUNJLEtBQUssQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQ2pCLEtBQUssQ0FDRCxJQUFJLENBQUMsSUFBSSxFQUNULElBQUksQ0FBQyxVQUFVLEVBQ2YsZUFBZSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQ3hDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUMxQixDQUFDO1FBeENXLFFBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEIsUUFBRyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QixPQUFFLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUV4QixTQUFJLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQy9ELE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2IsTUFBTSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFekMsT0FBTztZQUNILGFBQWE7WUFDYixPQUFPLFlBQVksS0FBSyxXQUFXO2dCQUNuQyxLQUFLLENBQUMsR0FBRyxFQUFFLFdBQVcsRUFBRSxLQUFLLFFBQVE7Z0JBQ3JDLENBQUMsS0FBSyxDQUFDLGdCQUFnQjtnQkFDdkIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQ3ZELENBQUM7UUFDTixDQUFDLENBQUMsQ0FDTCxDQUFDO1FBRWUsZUFBVSxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUN2RSxNQUFNLENBQ0YsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNOLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxHQUFHLHFCQUFxQjtZQUNyRSxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQ2hELEVBQ0QsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUNYLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUN2QyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEVBQ3ZCLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUM3QyxDQUNKLENBQ0osQ0FBQztJQVVGLENBQUM7SUFFTyxTQUFTLENBQUMsTUFBbUI7UUFDakMsT0FBTyxDQUNILFlBQVksQ0FBQyxNQUFNLENBQUM7WUFDcEIsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDO2dCQUNqQyxtQ0FBbUM7Z0JBQ25DLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQzVELENBQUM7SUFDTixDQUFDOytHQW5EUSxxQkFBcUI7bUhBQXJCLHFCQUFxQjs7U0FBckIscUJBQXFCOzRGQUFyQixxQkFBcUI7a0JBRGpDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RPQ1VNRU5UfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtpbmplY3QsIEluamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtXQV9XSU5ET1d9IGZyb20gJ0BuZy13ZWItYXBpcy9jb21tb24nO1xuaW1wb3J0IHt0dWlDbG9zZVdhdGNoZXIsIHR1aVR5cGVkRnJvbUV2ZW50LCB0dWlab25lZnVsbH0gZnJvbSAnQHRhaWdhLXVpL2Nkay9vYnNlcnZhYmxlcyc7XG5pbXBvcnQge1xuICAgIHR1aUNvbnRhaW5zT3JBZnRlcixcbiAgICB0dWlHZXRBY3R1YWxUYXJnZXQsXG4gICAgdHVpSW5qZWN0RWxlbWVudCxcbiAgICB0dWlJc0VsZW1lbnQsXG59IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvZG9tJztcbmltcG9ydCB7dHVpR2V0Vmlld3BvcnRXaWR0aH0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHtmaWx0ZXIsIG1hcCwgbWVyZ2UsIE9ic2VydmFibGUsIHN3aXRjaE1hcCwgdGFrZX0gZnJvbSAncnhqcyc7XG5cbmNvbnN0IFNDUk9MTEJBUl9QTEFDRUhPTERFUiA9IDE3O1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVHVpRGlhbG9nQ2xvc2VTZXJ2aWNlIGV4dGVuZHMgT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSB3aW4gPSBpbmplY3QoV0FfV0lORE9XKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRvYyA9IGluamVjdChET0NVTUVOVCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBlbCA9IHR1aUluamVjdEVsZW1lbnQoKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXNjJCA9IHR1aVR5cGVkRnJvbUV2ZW50KHRoaXMuZG9jLCAna2V5ZG93bicpLnBpcGUoXG4gICAgICAgIGZpbHRlcigoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHR1aUdldEFjdHVhbFRhcmdldChldmVudCk7XG5cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHR5cGVvZiBDbG9zZVdhdGNoZXIgPT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgICAgZXZlbnQua2V5Py50b0xvd2VyQ2FzZSgpID09PSAnZXNjYXBlJyAmJlxuICAgICAgICAgICAgICAgICFldmVudC5kZWZhdWx0UHJldmVudGVkICYmXG4gICAgICAgICAgICAgICAgKHRoaXMuZWwuY29udGFpbnModGFyZ2V0KSB8fCB0aGlzLmlzT3V0c2lkZSh0YXJnZXQpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSksXG4gICAgKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgbW91c2Vkb3duJCA9IHR1aVR5cGVkRnJvbUV2ZW50KHRoaXMuZG9jLCAnbW91c2Vkb3duJykucGlwZShcbiAgICAgICAgZmlsdGVyKFxuICAgICAgICAgICAgKGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgIHR1aUdldFZpZXdwb3J0V2lkdGgodGhpcy53aW4pIC0gZXZlbnQuY2xpZW50WCA+IFNDUk9MTEJBUl9QTEFDRUhPTERFUiAmJlxuICAgICAgICAgICAgICAgIHRoaXMuaXNPdXRzaWRlKHR1aUdldEFjdHVhbFRhcmdldChldmVudCkpLFxuICAgICAgICApLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgICAgICAgIHR1aVR5cGVkRnJvbUV2ZW50KHRoaXMuZG9jLCAnbW91c2V1cCcpLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgICAgICAgICBtYXAodHVpR2V0QWN0dWFsVGFyZ2V0KSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKHRhcmdldCkgPT4gdGhpcy5pc091dHNpZGUodGFyZ2V0KSksXG4gICAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKHN1YnNjcmliZXIpID0+XG4gICAgICAgICAgICBtZXJnZShcbiAgICAgICAgICAgICAgICB0aGlzLmVzYyQsXG4gICAgICAgICAgICAgICAgdGhpcy5tb3VzZWRvd24kLFxuICAgICAgICAgICAgICAgIHR1aUNsb3NlV2F0Y2hlcigpLnBpcGUodHVpWm9uZWZ1bGwoKSksXG4gICAgICAgICAgICApLnN1YnNjcmliZShzdWJzY3JpYmVyKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzT3V0c2lkZSh0YXJnZXQ6IEV2ZW50VGFyZ2V0KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0dWlJc0VsZW1lbnQodGFyZ2V0KSAmJlxuICAgICAgICAgICAgKCF0dWlDb250YWluc09yQWZ0ZXIodGhpcy5lbCwgdGFyZ2V0KSB8fFxuICAgICAgICAgICAgICAgIC8vIFRPRE86IERyb3AgJ25ldycgYXR0cmlidXRlIGluIHY1XG4gICAgICAgICAgICAgICAgKHRhcmdldCA9PT0gdGhpcy5lbCAmJiAhdGhpcy5lbC5oYXNBdHRyaWJ1dGUoJ25ldycpKSlcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=