UNPKG

ohayolibs

Version:

Ohayo is a set of essential modules for ohayojp.

65 lines (58 loc) 2.36 kB
import { ConnectionPositionPair, Overlay, OverlayRef } from '@angular/cdk/overlay'; import { ComponentPortal } from '@angular/cdk/portal'; import { ElementRef, Injectable } from '@angular/core'; import { Subject, Subscription } from 'rxjs'; import { ReuseTcomponentsontextMenuComponent } from './reuse-tab-context-menu.component'; import { ReuseContextCloseEvent, ReuseContextEvent, ReuseContextI18n, ReuseCustomContextMenu } from './reuse-tab.interfaces'; @Injectable() export class ReuseTcomponentsontextService { private ref: OverlayRef | null; i18n: ReuseContextI18n; show: Subject<ReuseContextEvent> = new Subject<ReuseContextEvent>(); close: Subject<ReuseContextCloseEvent> = new Subject<ReuseContextCloseEvent>(); constructor(private overlay: Overlay) { } remove(): void { if (!this.ref) return; this.ref.detach(); this.ref.dispose(); this.ref = null; } open(context: ReuseContextEvent): void { this.remove(); const { event, item, customContextMenu } = context; const fakeElement = new ElementRef({ getBoundingClientRect: (): ClientRect => ({ bottom: event.clientY, height: 0, left: event.clientX, right: event.clientX, top: event.clientY, width: 0, }), }); const positions = [ new ConnectionPositionPair({ originX: 'start', originY: 'bottom' }, { overlayX: 'start', overlayY: 'top' }), new ConnectionPositionPair({ originX: 'start', originY: 'top' }, { overlayX: 'start', overlayY: 'bottom' }), ]; const positionStrategy = this.overlay.position().flexibleConnectedTo(fakeElement).withPositions(positions); this.ref = this.overlay.create({ positionStrategy, panelClass: 'reuse-tab__cm', scrollStrategy: this.overlay.scrollStrategies.close(), }); const comp = this.ref.attach(new ComponentPortal(ReuseTcomponentsontextMenuComponent)); const instance = comp.instance; instance.i18n = this.i18n; instance.item = { ...item }; instance.customContextMenu = customContextMenu as ReuseCustomContextMenu[]; instance.event = event; const sub$ = new Subscription(); sub$.add( instance.close.subscribe((res: ReuseContextCloseEvent) => { this.close.next(res); this.remove(); }), ); comp.onDestroy(() => sub$.unsubscribe()); } }