truly-ui
Version:
Web Components for Desktop Applications.
73 lines • 9.68 kB
JavaScript
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==