aboutsummaryrefslogtreecommitdiffstats
path: root/deprecated-workflow-designer/sdc-workflow-designer-ui/src/app/paletx/util/popup.ts
blob: dacbc0b913129e96b28e78e8a2206c0ff3b2ed53 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import {
	Injector,
	TemplateRef,
	ViewRef,
	ViewContainerRef,
	Renderer,
	ComponentRef,
	ComponentFactory,
	ComponentFactoryResolver
} from '@angular/core';

export class ContentRef {
	constructor(public nodes: any[], public viewRef?: ViewRef, public componentRef?: ComponentRef<any>) {
	}
}

export class PopupService<T> {
	private _windowFactory: ComponentFactory<T>;
	private _windowRef: ComponentRef<T>;
	private _contentRef: ContentRef;

	constructor(type: any, private _injector: Injector, private _viewContainerRef: ViewContainerRef, private _renderer: Renderer,
				componentFactoryResolver: ComponentFactoryResolver) {
		this._windowFactory = componentFactoryResolver.resolveComponentFactory<T>(type);
	}

	public open(content?: string | TemplateRef<any>, context?: any): ComponentRef<T> {
		if (!this._windowRef) {
			this._contentRef = this._getContentRef(content, context);
			this._windowRef =
				this._viewContainerRef.createComponent(this._windowFactory, 0, this._injector, this._contentRef.nodes);
		}

		return this._windowRef;
	}

	public close() {
		if (this._windowRef) {
			this._viewContainerRef.remove(this._viewContainerRef.indexOf(this._windowRef.hostView));
			this._windowRef = null;

			if (this._contentRef.viewRef) {
				this._viewContainerRef.remove(this._viewContainerRef.indexOf(this._contentRef.viewRef));
				this._contentRef = null;
			}
		}
	}

	private _getContentRef(content: string | TemplateRef<any>, context?: any): ContentRef {
		if (!content) {
			return new ContentRef([]);
		} else if (content instanceof TemplateRef) {
			const viewRef = this._viewContainerRef.createEmbeddedView(<TemplateRef<T>>content, context);
			return new ContentRef([viewRef.rootNodes], viewRef);
		} else {
			return new ContentRef([[this._renderer.createText(null, `${content}`)]]);
		}
	}
}