UNPKG

13.2 kBSource Map (JSON)View Raw
1{"version":3,"file":"component-loader.class.js","sourceRoot":"","sources":["../../src/component-loader/component-loader.class.ts"],"names":[],"mappings":"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","sourcesContent":["// todo: add delay support\n// todo: merge events onShow, onShown, etc...\n// todo: add global positioning configuration?\nimport {\n NgZone, ViewContainerRef, ComponentFactoryResolver, Injector, Renderer,\n ElementRef, ComponentRef, ComponentFactory, Type, TemplateRef, EventEmitter,\n Provider, ReflectiveInjector\n} from '@angular/core';\nimport { ContentRef } from './content-ref.class';\nimport { PositioningService, PositioningOptions } from '../positioning';\nimport { listenToTriggers } from '../utils/triggers';\n\nexport interface ListenOptions {\n target?: ElementRef;\n triggers?: string;\n show?: Function;\n hide?: Function;\n toggle?: Function;\n}\n\nexport class ComponentLoader<T> {\n public onBeforeShow: EventEmitter<any> = new EventEmitter();\n public onShown: EventEmitter<any> = new EventEmitter();\n public onBeforeHide: EventEmitter<any> = new EventEmitter();\n public onHidden: EventEmitter<any> = new EventEmitter();\n\n public instance: T;\n public _componentRef: ComponentRef<T>;\n\n private _providers: Provider[] = [];\n private _componentFactory: ComponentFactory<T>;\n private _elementRef: ElementRef;\n private _zoneSubscription: any;\n private _contentRef: ContentRef;\n private _viewContainerRef: ViewContainerRef;\n private _injector: Injector;\n private _renderer: Renderer;\n private _ngZone: NgZone;\n private _componentFactoryResolver: ComponentFactoryResolver;\n private _posService: PositioningService;\n\n private _unregisterListenersFn: Function;\n\n public get isShown(): boolean {\n return !!this._componentRef;\n };\n\n /**\n * Placement of a component. Accepts: \"top\", \"bottom\", \"left\", \"right\"\n */\n private attachment: string;\n\n /**\n * A selector specifying the element the popover should be appended to.\n * Currently only supports \"body\".\n */\n private container: string | ElementRef | any;\n\n /**\n * Specifies events that should trigger. Supports a space separated list of\n * event names.\n */\n private triggers: string;\n\n /**\n * Do not use this directly, it should be instanced via\n * `ComponentLoadFactory.attach`\n * @internal\n * @param _viewContainerRef\n * @param _elementRef\n * @param _injector\n * @param _renderer\n * @param _componentFactoryResolver\n * @param _ngZone\n * @param _posService\n */\n // tslint:disable-next-line\n public constructor(_viewContainerRef: ViewContainerRef, _renderer: Renderer,\n _elementRef: ElementRef,\n _injector: Injector, _componentFactoryResolver: ComponentFactoryResolver,\n _ngZone: NgZone, _posService: PositioningService) {\n this._ngZone = _ngZone;\n this._injector = _injector;\n this._renderer = _renderer;\n this._elementRef = _elementRef;\n this._posService = _posService;\n this._viewContainerRef = _viewContainerRef;\n this._componentFactoryResolver = _componentFactoryResolver;\n }\n\n public attach(compType: Type<T>): ComponentLoader<T> {\n this._componentFactory = this._componentFactoryResolver\n .resolveComponentFactory<T>(compType);\n return this;\n }\n\n // todo: add behaviour: to target element, `body`, custom element\n public to(container?: string): ComponentLoader<T> {\n this.container = container || this.container;\n return this;\n }\n\n public position(opts?: PositioningOptions): ComponentLoader<T> {\n this.attachment = opts.attachment || this.attachment;\n this._elementRef = opts.target as ElementRef || this._elementRef;\n return this;\n }\n\n public provide(provider: Provider): ComponentLoader<T> {\n this._providers.push(provider);\n return this;\n }\n\n public show(opts: {content?: string | TemplateRef<any>, [key:string]: any} = {}): ComponentRef<T> {\n this._subscribePositioning();\n\n if (!this._componentRef) {\n this.onBeforeShow.emit();\n this._contentRef = this._getContentRef(opts.content);\n const injector = ReflectiveInjector.resolveAndCreate(this._providers, this._injector);\n this._componentRef = this._viewContainerRef\n .createComponent(this._componentFactory, 0, injector, this._contentRef.nodes);\n this.instance = this._componentRef.instance;\n\n Object.assign(this._componentRef.instance, opts);\n\n if (this.container === 'body' && typeof document !== 'undefined') {\n document.querySelector(this.container as string)\n .appendChild(this._componentRef.location.nativeElement);\n }\n\n // we need to manually invoke change detection since events registered\n // via\n // Renderer::listen() are not picked up by change detection with the\n // OnPush strategy\n this._componentRef.changeDetectorRef.markForCheck();\n this.onShown.emit(this._componentRef.instance);\n }\n return this._componentRef;\n }\n\n public hide(): ComponentLoader<T> {\n if (this._componentRef) {\n this.onBeforeHide.emit(this._componentRef.instance);\n this._viewContainerRef.remove(this._viewContainerRef.indexOf(this._componentRef.hostView));\n this._componentRef = null;\n\n if (this._contentRef.viewRef) {\n this._viewContainerRef.remove(this._viewContainerRef.indexOf(this._contentRef.viewRef));\n this._contentRef = null;\n }\n\n this._componentRef = null;\n this.onHidden.emit();\n }\n return this;\n }\n\n public toggle(): void {\n if (this.isShown) {\n this.hide();\n return;\n }\n\n this.show();\n }\n\n public dispose(): void {\n if (this.isShown) {\n this.hide();\n }\n\n this._unsubscribePositioning();\n\n if (this._unregisterListenersFn) {\n this._unregisterListenersFn();\n }\n }\n\n public listen(listenOpts: ListenOptions): ComponentLoader<T> {\n this.triggers = listenOpts.triggers || this.triggers;\n\n listenOpts.target = listenOpts.target || this._elementRef;\n listenOpts.show = listenOpts.show || (() => this.show());\n listenOpts.hide = listenOpts.hide || (() => this.hide());\n listenOpts.toggle = listenOpts.toggle || (() => this.isShown\n ? listenOpts.hide()\n : listenOpts.show());\n\n this._unregisterListenersFn = listenToTriggers(\n this._renderer,\n listenOpts.target.nativeElement,\n this.triggers,\n listenOpts.show,\n listenOpts.hide,\n listenOpts.toggle);\n\n return this;\n }\n\n private _subscribePositioning(): void {\n if (this._zoneSubscription || !this.attachment) {\n return;\n }\n\n this._zoneSubscription = this._ngZone\n .onStable.subscribe(() => {\n if (!this._componentRef) {\n return;\n }\n this._posService.position({\n element: this._componentRef.location,\n target: this._elementRef,\n attachment: this.attachment,\n appendToBody: this.container === 'body'\n });\n });\n }\n\n private _unsubscribePositioning(): void {\n if (!this._zoneSubscription) {\n return;\n }\n this._zoneSubscription.unsubscribe();\n this._zoneSubscription = null;\n }\n\n private _getContentRef(content: string | TemplateRef<any>): ContentRef {\n if (!content) {\n return new ContentRef([]);\n }\n\n if (content instanceof TemplateRef) {\n const viewRef = this._viewContainerRef\n .createEmbeddedView<TemplateRef<T>>(content);\n return new ContentRef([viewRef.rootNodes], viewRef);\n }\n\n return new ContentRef([[this._renderer.createText(null, `${content}`)]]);\n }\n}\n\ninterface DecoratorInvocation {\n type: Function;\n args?: any[];\n}\n"]}
\No newline at end of file