| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553 |
- import { Injector, ElementRef, TemplateRef, EventEmitter, Injectable, ComponentFactoryResolver, NgZone, ApplicationRef } from '@angular/core';
- import { listenToTriggersV2, registerOutsideClick, registerEscClick } from 'ngx-bootstrap/utils';
- import { PositioningService } from 'ngx-bootstrap/positioning';
- /**
- * @fileoverview added by tsickle
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
- */
- /**
- * @template T
- */
- var /**
- * @template T
- */
- BsComponentRef = /** @class */ (function () {
- function BsComponentRef() {
- }
- return BsComponentRef;
- }());
- /**
- * @fileoverview added by tsickle
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
- */
- /**
- * @copyright Valor Software
- * @copyright Angular ng-bootstrap team
- */
- var ContentRef = /** @class */ (function () {
- function ContentRef(
- /* tslint:disable-next-line: no-any */
- nodes, viewRef,
- /* tslint:disable-next-line: no-any */
- componentRef) {
- this.nodes = nodes;
- this.viewRef = viewRef;
- this.componentRef = componentRef;
- }
- return ContentRef;
- }());
- /**
- * @fileoverview added by tsickle
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
- */
- /**
- * @template T
- */
- var /**
- * @template T
- */
- ComponentLoader = /** @class */ (function () {
- /**
- * Do not use this directly, it should be instanced via
- * `ComponentLoadFactory.attach`
- * @internal
- */
- // tslint:disable-next-line
- function ComponentLoader(_viewContainerRef, _renderer, _elementRef, _injector, _componentFactoryResolver, _ngZone, _applicationRef, _posService) {
- this._viewContainerRef = _viewContainerRef;
- this._renderer = _renderer;
- this._elementRef = _elementRef;
- this._injector = _injector;
- this._componentFactoryResolver = _componentFactoryResolver;
- this._ngZone = _ngZone;
- this._applicationRef = _applicationRef;
- this._posService = _posService;
- this.onBeforeShow = new EventEmitter();
- /* tslint:disable-next-line: no-any*/
- this.onShown = new EventEmitter();
- /* tslint:disable-next-line: no-any*/
- this.onBeforeHide = new EventEmitter();
- this.onHidden = new EventEmitter();
- this._providers = [];
- this._isHiding = false;
- /**
- * A selector used if container element was not found
- */
- this.containerDefaultSelector = 'body';
- this._listenOpts = {};
- this._globalListener = Function.prototype;
- }
- Object.defineProperty(ComponentLoader.prototype, "isShown", {
- get: /**
- * @return {?}
- */
- function () {
- if (this._isHiding) {
- return false;
- }
- return !!this._componentRef;
- },
- enumerable: true,
- configurable: true
- });
- /**
- * @param {?} compType
- * @return {?}
- */
- ComponentLoader.prototype.attach = /**
- * @param {?} compType
- * @return {?}
- */
- function (compType) {
- this._componentFactory = this._componentFactoryResolver
- .resolveComponentFactory(compType);
- return this;
- };
- // todo: add behaviour: to target element, `body`, custom element
- // todo: add behaviour: to target element, `body`, custom element
- /**
- * @param {?=} container
- * @return {?}
- */
- ComponentLoader.prototype.to =
- // todo: add behaviour: to target element, `body`, custom element
- /**
- * @param {?=} container
- * @return {?}
- */
- function (container) {
- this.container = container || this.container;
- return this;
- };
- /**
- * @param {?=} opts
- * @return {?}
- */
- ComponentLoader.prototype.position = /**
- * @param {?=} opts
- * @return {?}
- */
- function (opts) {
- this.attachment = opts.attachment || this.attachment;
- /* tslint:disable-next-line: no-unnecessary-type-assertion */
- this._elementRef = ((/** @type {?} */ (opts.target))) || this._elementRef;
- return this;
- };
- /**
- * @param {?} provider
- * @return {?}
- */
- ComponentLoader.prototype.provide = /**
- * @param {?} provider
- * @return {?}
- */
- function (provider) {
- this._providers.push(provider);
- return this;
- };
- // todo: appendChild to element or document.querySelector(this.container)
- // todo: appendChild to element or document.querySelector(this.container)
- /**
- * @param {?=} opts
- * @return {?}
- */
- ComponentLoader.prototype.show =
- // todo: appendChild to element or document.querySelector(this.container)
- /**
- * @param {?=} opts
- * @return {?}
- */
- function (opts) {
- if (opts === void 0) { opts = {}; }
- this._subscribePositioning();
- this._innerComponent = null;
- if (!this._componentRef) {
- this.onBeforeShow.emit();
- this._contentRef = this._getContentRef(opts.content, opts.context, opts.initialState);
- /** @type {?} */
- var injector = Injector.create({
- providers: this._providers,
- parent: this._injector
- });
- this._componentRef = this._componentFactory.create(injector, this._contentRef.nodes);
- this._applicationRef.attachView(this._componentRef.hostView);
- // this._componentRef = this._viewContainerRef
- // .createComponent(this._componentFactory, 0, injector, this._contentRef.nodes);
- this.instance = this._componentRef.instance;
- Object.assign(this._componentRef.instance, opts);
- if (this.container instanceof ElementRef) {
- this.container.nativeElement.appendChild(this._componentRef.location.nativeElement);
- }
- if (typeof this.container === 'string' && typeof document !== 'undefined') {
- /** @type {?} */
- var selectedElement = document.querySelector(this.container) ||
- document.querySelector(this.containerDefaultSelector);
- selectedElement.appendChild(this._componentRef.location.nativeElement);
- }
- if (!this.container &&
- this._elementRef &&
- this._elementRef.nativeElement.parentElement) {
- this._elementRef.nativeElement.parentElement.appendChild(this._componentRef.location.nativeElement);
- }
- // we need to manually invoke change detection since events registered
- // via
- // Renderer::listen() are not picked up by change detection with the
- // OnPush strategy
- if (this._contentRef.componentRef) {
- this._innerComponent = this._contentRef.componentRef.instance;
- this._contentRef.componentRef.changeDetectorRef.markForCheck();
- this._contentRef.componentRef.changeDetectorRef.detectChanges();
- }
- this._componentRef.changeDetectorRef.markForCheck();
- this._componentRef.changeDetectorRef.detectChanges();
- this.onShown.emit(this._componentRef.instance);
- }
- this._registerOutsideClick();
- return this._componentRef;
- };
- /**
- * @return {?}
- */
- ComponentLoader.prototype.hide = /**
- * @return {?}
- */
- function () {
- if (!this._componentRef) {
- return this;
- }
- this._posService.deletePositionElement(this._componentRef.location);
- this.onBeforeHide.emit(this._componentRef.instance);
- /** @type {?} */
- var componentEl = this._componentRef.location.nativeElement;
- componentEl.parentNode.removeChild(componentEl);
- if (this._contentRef.componentRef) {
- this._contentRef.componentRef.destroy();
- }
- this._componentRef.destroy();
- if (this._viewContainerRef && this._contentRef.viewRef) {
- this._viewContainerRef.remove(this._viewContainerRef.indexOf(this._contentRef.viewRef));
- }
- if (this._contentRef.viewRef) {
- this._contentRef.viewRef.destroy();
- }
- this._contentRef = null;
- this._componentRef = null;
- this._removeGlobalListener();
- this.onHidden.emit();
- return this;
- };
- /**
- * @return {?}
- */
- ComponentLoader.prototype.toggle = /**
- * @return {?}
- */
- function () {
- if (this.isShown) {
- this.hide();
- return;
- }
- this.show();
- };
- /**
- * @return {?}
- */
- ComponentLoader.prototype.dispose = /**
- * @return {?}
- */
- function () {
- if (this.isShown) {
- this.hide();
- }
- this._unsubscribePositioning();
- if (this._unregisterListenersFn) {
- this._unregisterListenersFn();
- }
- };
- /**
- * @param {?} listenOpts
- * @return {?}
- */
- ComponentLoader.prototype.listen = /**
- * @param {?} listenOpts
- * @return {?}
- */
- function (listenOpts) {
- var _this = this;
- this.triggers = listenOpts.triggers || this.triggers;
- this._listenOpts.outsideClick = listenOpts.outsideClick;
- this._listenOpts.outsideEsc = listenOpts.outsideEsc;
- listenOpts.target = listenOpts.target || this._elementRef.nativeElement;
- /** @type {?} */
- var hide = (this._listenOpts.hide = (/**
- * @return {?}
- */
- function () {
- return listenOpts.hide ? listenOpts.hide() : void _this.hide();
- }));
- /** @type {?} */
- var show = (this._listenOpts.show = (/**
- * @param {?} registerHide
- * @return {?}
- */
- function (registerHide) {
- listenOpts.show ? listenOpts.show(registerHide) : _this.show(registerHide);
- registerHide();
- }));
- /** @type {?} */
- var toggle = (/**
- * @param {?} registerHide
- * @return {?}
- */
- function (registerHide) {
- _this.isShown ? hide() : show(registerHide);
- });
- this._unregisterListenersFn = listenToTriggersV2(this._renderer, {
- target: listenOpts.target,
- triggers: listenOpts.triggers,
- show: show,
- hide: hide,
- toggle: toggle
- });
- return this;
- };
- /**
- * @return {?}
- */
- ComponentLoader.prototype._removeGlobalListener = /**
- * @return {?}
- */
- function () {
- if (this._globalListener) {
- this._globalListener();
- this._globalListener = null;
- }
- };
- /**
- * @param {?} vRef
- * @param {?} template
- * @return {?}
- */
- ComponentLoader.prototype.attachInline = /**
- * @param {?} vRef
- * @param {?} template
- * @return {?}
- */
- function (vRef,
- /* tslint:disable-next-line: no-any*/
- template) {
- this._inlineViewRef = vRef.createEmbeddedView(template);
- return this;
- };
- /**
- * @return {?}
- */
- ComponentLoader.prototype._registerOutsideClick = /**
- * @return {?}
- */
- function () {
- var _this = this;
- if (!this._componentRef || !this._componentRef.location) {
- return;
- }
- // why: should run after first event bubble
- if (this._listenOpts.outsideClick) {
- /** @type {?} */
- var target_1 = this._componentRef.location.nativeElement;
- setTimeout((/**
- * @return {?}
- */
- function () {
- _this._globalListener = registerOutsideClick(_this._renderer, {
- targets: [target_1, _this._elementRef.nativeElement],
- outsideClick: _this._listenOpts.outsideClick,
- hide: (/**
- * @return {?}
- */
- function () { return _this._listenOpts.hide(); })
- });
- }));
- }
- if (this._listenOpts.outsideEsc) {
- /** @type {?} */
- var target = this._componentRef.location.nativeElement;
- this._globalListener = registerEscClick(this._renderer, {
- targets: [target, this._elementRef.nativeElement],
- outsideEsc: this._listenOpts.outsideEsc,
- hide: (/**
- * @return {?}
- */
- function () { return _this._listenOpts.hide(); })
- });
- }
- };
- /**
- * @return {?}
- */
- ComponentLoader.prototype.getInnerComponent = /**
- * @return {?}
- */
- function () {
- return this._innerComponent;
- };
- /**
- * @private
- * @return {?}
- */
- ComponentLoader.prototype._subscribePositioning = /**
- * @private
- * @return {?}
- */
- function () {
- var _this = this;
- if (this._zoneSubscription || !this.attachment) {
- return;
- }
- this.onShown.subscribe((/**
- * @return {?}
- */
- function () {
- _this._posService.position({
- element: _this._componentRef.location,
- target: _this._elementRef,
- attachment: _this.attachment,
- appendToBody: _this.container === 'body'
- });
- }));
- this._zoneSubscription = this._ngZone.onStable.subscribe((/**
- * @return {?}
- */
- function () {
- if (!_this._componentRef) {
- return;
- }
- _this._posService.calcPosition();
- }));
- };
- /**
- * @private
- * @return {?}
- */
- ComponentLoader.prototype._unsubscribePositioning = /**
- * @private
- * @return {?}
- */
- function () {
- if (!this._zoneSubscription) {
- return;
- }
- this._zoneSubscription.unsubscribe();
- this._zoneSubscription = null;
- };
- /**
- * @private
- * @param {?} content
- * @param {?=} context
- * @param {?=} initialState
- * @return {?}
- */
- ComponentLoader.prototype._getContentRef = /**
- * @private
- * @param {?} content
- * @param {?=} context
- * @param {?=} initialState
- * @return {?}
- */
- function (
- /* tslint:disable-next-line: no-any*/
- content,
- /* tslint:disable-next-line: no-any*/
- context,
- /* tslint:disable-next-line: no-any*/
- initialState) {
- if (!content) {
- return new ContentRef([]);
- }
- if (content instanceof TemplateRef) {
- if (this._viewContainerRef) {
- /** @type {?} */
- var _viewRef = this._viewContainerRef
- .createEmbeddedView(content, context);
- _viewRef.markForCheck();
- return new ContentRef([_viewRef.rootNodes], _viewRef);
- }
- /** @type {?} */
- var viewRef = content.createEmbeddedView({});
- this._applicationRef.attachView(viewRef);
- return new ContentRef([viewRef.rootNodes], viewRef);
- }
- if (typeof content === 'function') {
- /** @type {?} */
- var contentCmptFactory = this._componentFactoryResolver.resolveComponentFactory(content);
- /** @type {?} */
- var modalContentInjector = Injector.create({
- providers: this._providers,
- parent: this._injector
- });
- /** @type {?} */
- var componentRef = contentCmptFactory.create(modalContentInjector);
- Object.assign(componentRef.instance, initialState);
- this._applicationRef.attachView(componentRef.hostView);
- return new ContentRef([[componentRef.location.nativeElement]], componentRef.hostView, componentRef);
- }
- return new ContentRef([[this._renderer.createText("" + content)]]);
- };
- return ComponentLoader;
- }());
- /**
- * @fileoverview added by tsickle
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
- */
- var ComponentLoaderFactory = /** @class */ (function () {
- function ComponentLoaderFactory(_componentFactoryResolver, _ngZone, _injector, _posService, _applicationRef) {
- this._componentFactoryResolver = _componentFactoryResolver;
- this._ngZone = _ngZone;
- this._injector = _injector;
- this._posService = _posService;
- this._applicationRef = _applicationRef;
- }
- /**
- *
- * @param _elementRef
- * @param _viewContainerRef
- * @param _renderer
- */
- /**
- *
- * @template T
- * @param {?} _elementRef
- * @param {?} _viewContainerRef
- * @param {?} _renderer
- * @return {?}
- */
- ComponentLoaderFactory.prototype.createLoader = /**
- *
- * @template T
- * @param {?} _elementRef
- * @param {?} _viewContainerRef
- * @param {?} _renderer
- * @return {?}
- */
- function (_elementRef, _viewContainerRef, _renderer) {
- return new ComponentLoader(_viewContainerRef, _renderer, _elementRef, this._injector, this._componentFactoryResolver, this._ngZone, this._applicationRef, this._posService);
- };
- ComponentLoaderFactory.decorators = [
- { type: Injectable }
- ];
- /** @nocollapse */
- ComponentLoaderFactory.ctorParameters = function () { return [
- { type: ComponentFactoryResolver },
- { type: NgZone },
- { type: Injector },
- { type: PositioningService },
- { type: ApplicationRef }
- ]; };
- return ComponentLoaderFactory;
- }());
- export { BsComponentRef, ComponentLoader, ComponentLoaderFactory, ContentRef };
- //# sourceMappingURL=ngx-bootstrap-component-loader.js.map
|