UNPKG

truly-ui

Version:

Web Components for Desktop Applications.

73 lines 9.68 kB
import { Injectable } from '@angular/core'; import { ComponentPortal } from '@angular/cdk/portal'; import { fromEvent, Subscription } from 'rxjs'; import { TlContextMenuComponent } from '../context-menu'; import { filter } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "@angular/cdk/overlay"; export class ContextMenuService { constructor(overlayPositionBuilder, overlay) { this.overlayPositionBuilder = overlayPositionBuilder; this.overlay = overlay; this.subscription = new Subscription(); } create(event, elementRef, itemsMenu, context) { this.close(); event.preventDefault(); const coords = { x: event.x, y: event.y }; const positionStrategy = this.overlay.position() .flexibleConnectedTo({ x: coords.x, y: coords.y }) .withPositions([ { originX: 'end', originY: 'bottom', overlayX: 'start', overlayY: 'top', }, { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'bottom', } ]); this.overlayRef = this.overlay.create({ positionStrategy, scrollStrategy: this.overlay.scrollStrategies.close() }); const menuPortal = new ComponentPortal(TlContextMenuComponent); this.menuRef = this.overlayRef.attach(menuPortal); this.menuRef.instance.init(itemsMenu, context); this.listenBackDropClick(); this.listenSelect(); } listenBackDropClick() { if (this.menuRef) { this.subscription = fromEvent(document, 'click') .pipe(filter(eventClick => { const clickTarget = eventClick.target; return !!this.overlayRef && !this.overlayRef.overlayElement.contains(clickTarget); })).subscribe(() => this.close()); } } listenSelect() { if (this.menuRef) { this.subscription.add(this.menuRef.instance.select.subscribe(() => { this.close(); })); } } close() { this.subscription.unsubscribe(); if (this.overlayRef) { this.overlayRef.dispose(); this.overlayRef = null; } } } /** @nocollapse */ ContextMenuService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ContextMenuService, deps: [{ token: i1.OverlayPositionBuilder }, { token: i1.Overlay }], target: i0.ɵɵFactoryTarget.Injectable }); /** @nocollapse */ ContextMenuService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ContextMenuService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ContextMenuService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.OverlayPositionBuilder }, { type: i1.Overlay }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dG1lbnUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL2NvbnRleHRtZW51L3NlcnZpY2VzL2NvbnRleHRtZW51LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUEyQixVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7QUFFOUUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXZELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBR3RDLE1BQU0sT0FBTyxrQkFBa0I7SUFNN0IsWUFBb0Isc0JBQThDLEVBQzlDLE9BQWdCO1FBRGhCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUg1QixpQkFBWSxHQUFpQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBR2pCLENBQUM7SUFJeEMsTUFBTSxDQUFFLEtBQWlCLEVBQUUsVUFBc0IsRUFBRSxTQUFpQyxFQUFFLE9BQVE7UUFDNUYsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2IsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxQyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO2FBQzdDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUNqRCxhQUFhLENBQUM7WUFDYjtnQkFDRSxPQUFPLEVBQUUsS0FBSztnQkFDZCxPQUFPLEVBQUUsUUFBUTtnQkFDakIsUUFBUSxFQUFFLE9BQU87Z0JBQ2pCLFFBQVEsRUFBRSxLQUFLO2FBQ2hCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsUUFBUSxFQUFFLE9BQU87Z0JBQ2pCLFFBQVEsRUFBRSxRQUFRO2FBQ25CO1NBQ0YsQ0FBQyxDQUFDO1FBQ0wsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUNwQyxnQkFBZ0I7WUFDaEIsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFO1NBQ3RELENBQUMsQ0FBQztRQUNILE1BQU0sVUFBVSxHQUFHLElBQUksZUFBZSxDQUFFLHNCQUFzQixDQUFFLENBQUM7UUFDakUsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBRSxVQUFVLENBQUUsQ0FBQztRQUNwRCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBRSxDQUFDO1FBRWpELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBYSxRQUFRLEVBQUUsT0FBTyxDQUFDO2lCQUN6RCxJQUFJLENBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUNsQixNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsTUFBcUIsQ0FBQztnQkFDckQsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNwRixDQUFDLENBQUMsQ0FDSCxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUNuQztJQUNILENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNoRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ0w7SUFDSCxDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7U0FDeEI7SUFDSCxDQUFDOzttSUFyRVUsa0JBQWtCO3VJQUFsQixrQkFBa0I7NEZBQWxCLGtCQUFrQjtrQkFEOUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50UmVmLCBFbGVtZW50UmVmLCBJbmplY3RhYmxlLCBPbkRlc3Ryb3l9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtPdmVybGF5LCBPdmVybGF5UG9zaXRpb25CdWlsZGVyLCBPdmVybGF5UmVmfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQge0NvbXBvbmVudFBvcnRhbH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQge2Zyb21FdmVudCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7VGxDb250ZXh0TWVudUNvbXBvbmVudH0gZnJvbSAnLi4vY29udGV4dC1tZW51JztcbmltcG9ydCB7Q29udGV4dE1lbnVJbnRlcmZhY2V9IGZyb20gJy4uL2ludGVyZmFjZXMvY29udGV4dC1tZW51LmludGVyZmFjZSc7XG5pbXBvcnQge2ZpbHRlcn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ29udGV4dE1lbnVTZXJ2aWNlIHtcblxuICBwcml2YXRlIG1lbnVSZWY6IENvbXBvbmVudFJlZjxUbENvbnRleHRNZW51Q29tcG9uZW50PjtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgb3ZlcmxheVBvc2l0aW9uQnVpbGRlcjogT3ZlcmxheVBvc2l0aW9uQnVpbGRlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5KSB7fVxuXG4gIHByaXZhdGUgb3ZlcmxheVJlZjogT3ZlcmxheVJlZjtcblxuICBjcmVhdGUoIGV2ZW50OiBNb3VzZUV2ZW50LCBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBpdGVtc01lbnU6IENvbnRleHRNZW51SW50ZXJmYWNlW10sIGNvbnRleHQ/ICkge1xuICAgIHRoaXMuY2xvc2UoKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGNvb3JkcyA9IHsgeDogZXZlbnQueCwgeTogZXZlbnQueSB9O1xuICAgIGNvbnN0IHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLm92ZXJsYXkucG9zaXRpb24oKVxuICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8oeyB4OiBjb29yZHMueCwgeTogY29vcmRzLnkgfSlcbiAgICAgIC53aXRoUG9zaXRpb25zKFtcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJyxcbiAgICAgICAgfVxuICAgICAgXSk7XG4gICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZSh7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5LFxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLmNsb3NlKClcbiAgICB9KTtcbiAgICBjb25zdCBtZW51UG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbCggVGxDb250ZXh0TWVudUNvbXBvbmVudCApO1xuICAgIHRoaXMubWVudVJlZiA9IHRoaXMub3ZlcmxheVJlZi5hdHRhY2goIG1lbnVQb3J0YWwgKTtcbiAgICB0aGlzLm1lbnVSZWYuaW5zdGFuY2UuaW5pdCggaXRlbXNNZW51LCBjb250ZXh0ICk7XG5cbiAgICB0aGlzLmxpc3RlbkJhY2tEcm9wQ2xpY2soKTtcbiAgICB0aGlzLmxpc3RlblNlbGVjdCgpO1xuICB9XG5cbiAgbGlzdGVuQmFja0Ryb3BDbGljaygpIHtcbiAgICBpZiAodGhpcy5tZW51UmVmKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IGZyb21FdmVudDxNb3VzZUV2ZW50Pihkb2N1bWVudCwgJ2NsaWNrJylcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKGV2ZW50Q2xpY2sgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2xpY2tUYXJnZXQgPSBldmVudENsaWNrLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIHJldHVybiAhIXRoaXMub3ZlcmxheVJlZiAmJiAhdGhpcy5vdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50LmNvbnRhaW5zKGNsaWNrVGFyZ2V0KTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jbG9zZSgpKTtcbiAgICB9XG4gIH1cblxuICBsaXN0ZW5TZWxlY3QoKSB7XG4gICAgaWYgKHRoaXMubWVudVJlZikge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMubWVudVJlZi5pbnN0YW5jZS5zZWxlY3Quc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgfSkpO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlKCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgaWYgKHRoaXMub3ZlcmxheVJlZikge1xuICAgICAgdGhpcy5vdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMub3ZlcmxheVJlZiA9IG51bGw7XG4gICAgfVxuICB9XG5cbn1cbiJdfQ==