ngx-modialog-7
Version:
Modal / Dialog for Angular
274 lines • 17.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/components/base-dynamic-component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Subject } from 'rxjs';
import { filter } from 'rxjs/operators';
import { createComponent } from '../framework/createComponent';
/** @type {?} */
var BROWSER_PREFIX = ['webkit', 'moz', 'MS', 'o', ''];
/**
* @param {?} eventName
* @param {?} element
* @param {?} cb
* @return {?}
*/
function register(eventName, element, cb) {
BROWSER_PREFIX.forEach((/**
* @param {?} p
* @return {?}
*/
function (p) {
element.addEventListener(p ? p + eventName : eventName.toLowerCase(), cb, false);
}));
}
/**
* A base class for supporting dynamic components.
* There are 3 main support areas:
* 1 - Easy wrapper for dynamic styling via CSS classes and inline styles.
* 2 - Easy wrapper for interception of transition/animation end events.
* 3 - Easy wrapper for component creation and injection.
*
* Dynamic css is done via direct element manipulation (via renderer), it does not use change detection
* or binding. This is to allow better control over animation.
*
* Animation support is limited, only transition/keyframes END even are notified.
* The animation support is needed since currently the angular animation module is limited as well and
* does not support CSS animation that are not pre-parsed and are not in the styles metadata of a component.
*
* Capabilities: Add/Remove styls, Add/Remove classes, listen to animation/transition end event,
* add components
*/
var /**
* A base class for supporting dynamic components.
* There are 3 main support areas:
* 1 - Easy wrapper for dynamic styling via CSS classes and inline styles.
* 2 - Easy wrapper for interception of transition/animation end events.
* 3 - Easy wrapper for component creation and injection.
*
* Dynamic css is done via direct element manipulation (via renderer), it does not use change detection
* or binding. This is to allow better control over animation.
*
* Animation support is limited, only transition/keyframes END even are notified.
* The animation support is needed since currently the angular animation module is limited as well and
* does not support CSS animation that are not pre-parsed and are not in the styles metadata of a component.
*
* Capabilities: Add/Remove styls, Add/Remove classes, listen to animation/transition end event,
* add components
*/
BaseDynamicComponent = /** @class */ (function () {
function BaseDynamicComponent(el, renderer) {
this.el = el;
this.renderer = renderer;
}
/**
* @return {?}
*/
BaseDynamicComponent.prototype.activateAnimationListener = /**
* @return {?}
*/
function () {
var _this = this;
if (this.animationEnd) {
return;
}
this.animationEnd = new Subject();
this.animationEnd$ = this.animationEnd.asObservable();
register('TransitionEnd', this.el.nativeElement, (/**
* @param {?} e
* @return {?}
*/
function (e) { return _this.onEnd(e); }));
register('AnimationEnd', this.el.nativeElement, (/**
* @param {?} e
* @return {?}
*/
function (e) { return _this.onEnd(e); }));
};
/**
* Set a specific inline style on the overlay host element.
* @param prop The style key
* @param value The value, undefined to remove
*/
/**
* Set a specific inline style on the overlay host element.
* @template THIS
* @this {THIS}
* @param {?} prop The style key
* @param {?} value The value, undefined to remove
* @return {THIS}
*/
BaseDynamicComponent.prototype.setStyle = /**
* Set a specific inline style on the overlay host element.
* @template THIS
* @this {THIS}
* @param {?} prop The style key
* @param {?} value The value, undefined to remove
* @return {THIS}
*/
function (prop, value) {
(/** @type {?} */ (this)).renderer.setStyle((/** @type {?} */ (this)).el.nativeElement, prop, value);
return (/** @type {?} */ (this));
};
/**
* @return {?}
*/
BaseDynamicComponent.prototype.forceReflow = /**
* @return {?}
*/
function () {
this.el.nativeElement.offsetWidth;
};
/**
* @param {?} css
* @param {?=} forceReflow
* @return {?}
*/
BaseDynamicComponent.prototype.addClass = /**
* @param {?} css
* @param {?=} forceReflow
* @return {?}
*/
function (css, forceReflow) {
var _this = this;
if (forceReflow === void 0) { forceReflow = false; }
css.split(' ')
.forEach((/**
* @param {?} c
* @return {?}
*/
function (c) { return _this.renderer.addClass(_this.el.nativeElement, c); }));
if (forceReflow) {
this.forceReflow();
}
};
/**
* @param {?} css
* @param {?=} forceReflow
* @return {?}
*/
BaseDynamicComponent.prototype.removeClass = /**
* @param {?} css
* @param {?=} forceReflow
* @return {?}
*/
function (css, forceReflow) {
var _this = this;
if (forceReflow === void 0) { forceReflow = false; }
css.split(' ')
.forEach((/**
* @param {?} c
* @return {?}
*/
function (c) { return _this.renderer.removeClass(_this.el.nativeElement, c); }));
if (forceReflow) {
this.forceReflow();
}
};
/**
* @return {?}
*/
BaseDynamicComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
if (this.animationEnd && !this.animationEnd.closed) {
this.animationEnd.complete();
}
};
/**
* @return {?}
*/
BaseDynamicComponent.prototype.myAnimationEnd$ = /**
* @return {?}
*/
function () {
var _this = this;
return this.animationEnd$.pipe(filter((/**
* @param {?} e
* @return {?}
*/
function (e) { return e.target === _this.el.nativeElement; })));
};
/**
* Add a component, supply a view container ref.
* Note: The components vcRef will result in a sibling.
*/
/**
* Add a component, supply a view container ref.
* Note: The components vcRef will result in a sibling.
* @protected
* @template T
* @param {?} instructions
* @return {?}
*/
BaseDynamicComponent.prototype._addComponent = /**
* Add a component, supply a view container ref.
* Note: The components vcRef will result in a sibling.
* @protected
* @template T
* @param {?} instructions
* @return {?}
*/
function (instructions) {
/** @type {?} */
var cmpRef = createComponent(instructions);
cmpRef.changeDetectorRef.detectChanges();
return cmpRef;
};
/**
* @private
* @param {?} event
* @return {?}
*/
BaseDynamicComponent.prototype.onEnd = /**
* @private
* @param {?} event
* @return {?}
*/
function (event) {
if (!this.animationEnd.closed) {
this.animationEnd.next(event);
}
};
return BaseDynamicComponent;
}());
/**
* A base class for supporting dynamic components.
* There are 3 main support areas:
* 1 - Easy wrapper for dynamic styling via CSS classes and inline styles.
* 2 - Easy wrapper for interception of transition/animation end events.
* 3 - Easy wrapper for component creation and injection.
*
* Dynamic css is done via direct element manipulation (via renderer), it does not use change detection
* or binding. This is to allow better control over animation.
*
* Animation support is limited, only transition/keyframes END even are notified.
* The animation support is needed since currently the angular animation module is limited as well and
* does not support CSS animation that are not pre-parsed and are not in the styles metadata of a component.
*
* Capabilities: Add/Remove styls, Add/Remove classes, listen to animation/transition end event,
* add components
*/
export { BaseDynamicComponent };
if (false) {
/** @type {?} */
BaseDynamicComponent.prototype.animationEnd$;
/**
* @type {?}
* @protected
*/
BaseDynamicComponent.prototype.animationEnd;
/**
* @type {?}
* @protected
*/
BaseDynamicComponent.prototype.el;
/**
* @type {?}
* @protected
*/
BaseDynamicComponent.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1keW5hbWljLWNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1tb2RpYWxvZy03LyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvYmFzZS1keW5hbWljLWNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBUXhDLE9BQU8sRUFBRSxlQUFlLEVBQXVCLE1BQU0sOEJBQThCLENBQUM7O0lBRTlFLGNBQWMsR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7Ozs7Ozs7QUFFdkQsU0FBUyxRQUFRLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ3RDLGNBQWMsQ0FBQyxPQUFPOzs7O0lBQUMsVUFBQSxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkYsQ0FBQyxFQUFDLENBQUM7QUFDTCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQkQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUtFLDhCQUFzQixFQUFjLEVBQ2QsUUFBbUI7UUFEbkIsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVc7SUFDekMsQ0FBQzs7OztJQUVELHdEQUF5Qjs7O0lBQXpCO1FBQUEsaUJBUUM7UUFQQyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBb0MsQ0FBQztRQUNwRSxJQUFJLENBQUMsYUFBYSxHQUFHLElB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QyxNQUFNLEVBQUU7WUFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDL0I7SUFDSCxDQUFDO0lBRUgsMkJBQUM7QUFBRCxDQUFDLEFBaEZELElBZ0ZDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUEvRUMsNkNBQTREOzs7OztJQUU1RCw0Q0FBa0U7Ozs7O0lBRXRELGtDQUF3Qjs7Ozs7SUFDeEIsd0NBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50UmVmLFxuICBFbGVtZW50UmVmLFxuICBPbkRlc3Ryb3ksXG4gIFJlbmRlcmVyMlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgY3JlYXRlQ29tcG9uZW50LCBDcmVhdGVDb21wb25lbnRBcmdzIH0gZnJvbSAnLi4vZnJhbWV3b3JrL2NyZWF0ZUNvbXBvbmVudCc7XG5cbmNvbnN0IEJST1dTRVJfUFJFRklYID0gWyd3ZWJraXQnLCAnbW96JywgJ01TJywgJ28nLCAnJ107XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyKGV2ZW50TmFtZSwgZWxlbWVudCwgY2IpIHtcbiAgQlJPV1NFUl9QUkVGSVguZm9yRWFjaChwID0+IHtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIocCA/IHAgKyBldmVudE5hbWUgOiBldmVudE5hbWUudG9Mb3dlckNhc2UoKSwgY2IsIGZhbHNlKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQSBiYXNlIGNsYXNzIGZvciBzdXBwb3J0aW5nIGR5bmFtaWMgY29tcG9uZW50cy5cbiAqIFRoZXJlIGFyZSAzIG1haW4gc3VwcG9ydCBhcmVhczpcbiAqIDEgLSBFYXN5IHdyYXBwZXIgZm9yIGR5bmFtaWMgc3R5bGluZyB2aWEgQ1NTIGNsYXNzZXMgYW5kIGlubGluZSBzdHlsZXMuXG4gKiAyIC0gRWFzeSB3cmFwcGVyIGZvciBpbnRlcmNlcHRpb24gb2YgdHJhbnNpdGlvbi9hbmltYXRpb24gZW5kIGV2ZW50cy5cbiAqIDMgLSBFYXN5IHdyYXBwZXIgZm9yIGNvbXBvbmVudCBjcmVhdGlvbiBhbmQgaW5qZWN0aW9uLlxuICpcbiAqIER5bmFtaWMgY3NzIGlzIGRvbmUgdmlhIGRpcmVjdCBlbGVtZW50IG1hbmlwdWxhdGlvbiAodmlhIHJlbmRlcmVyKSwgaXQgZG9lcyBub3QgdXNlIGNoYW5nZSBkZXRlY3Rpb25cbiAqIG9yIGJpbmRpbmcuIFRoaXMgaXMgdG8gYWxsb3cgYmV0dGVyIGNvbnRyb2wgb3ZlciBhbmltYXRpb24uXG4gKlxuICogQW5pbWF0aW9uIHN1cHBvcnQgaXMgbGltaXRlZCwgb25seSB0cmFuc2l0aW9uL2tleWZyYW1lcyBFTkQgZXZlbiBhcmUgbm90aWZpZWQuXG4gKiBUaGUgYW5pbWF0aW9uIHN1cHBvcnQgaXMgbmVlZGVkIHNpbmNlIGN1cnJlbnRseSB0aGUgYW5ndWxhciBhbmltYXRpb24gbW9kdWxlIGlzIGxpbWl0ZWQgYXMgd2VsbCBhbmRcbiAqIGRvZXMgbm90IHN1cHBvcnQgQ1NTIGFuaW1hdGlvbiB0aGF0IGFyZSBub3QgcHJlLXBhcnNlZCBhbmQgYXJlIG5vdCBpbiB0aGUgc3R5bGVzIG1ldGFkYXRhIG9mIGEgY29tcG9uZW50LlxuICpcbiAqIENhcGFiaWxpdGllczogQWRkL1JlbW92ZSBzdHlscywgQWRkL1JlbW92ZSBjbGFzc2VzLCBsaXN0ZW4gdG8gYW5pbWF0aW9uL3RyYW5zaXRpb24gZW5kIGV2ZW50LFxuICogYWRkIGNvbXBvbmVudHNcbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VEeW5hbWljQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgYW5pbWF0aW9uRW5kJDogT2JzZXJ2YWJsZTxUcmFuc2l0aW9uRXZlbnQgfCBBbmltYXRpb25FdmVudD47XG5cbiAgcHJvdGVjdGVkIGFuaW1hdGlvbkVuZDogU3ViamVjdDxUcmFuc2l0aW9uRXZlbnQgfCBBbmltYXRpb25FdmVudD47XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGVsOiBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xuICB9XG5cbiAgYWN0aXZhdGVBbmltYXRpb25MaXN0ZW5lcigpIHtcbiAgICBpZiAodGhpcy5hbmltYXRpb25FbmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hbmltYXRpb25FbmQgPSBuZXcgU3ViamVjdDxUcmFuc2l0aW9uRXZlbnQgfCBBbmltYXRpb25FdmVudD4oKTtcbiAgICB0aGlzLmFuaW1hdGlvbkVuZCQgPSB0aGlzLmFuaW1hdGlvbkVuZC5hc09ic2VydmFibGUoKTtcbiAgICByZWdpc3RlcignVHJhbnNpdGlvbkVuZCcsIHRoaXMuZWwubmF0aXZlRWxlbWVudCwgKGU6IFRyYW5zaXRpb25FdmVudCkgPT4gdGhpcy5vbkVuZChlKSk7XG4gICAgcmVnaXN0ZXIoJ0FuaW1hdGlvbkVuZCcsIHRoaXMuZWwubmF0aXZlRWxlbWVudCwgKGU6IEFuaW1hdGlvbkV2ZW50KSA9PiB0aGlzLm9uRW5kKGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBzcGVjaWZpYyBpbmxpbmUgc3R5bGUgb24gdGhlIG92ZXJsYXkgaG9zdCBlbGVtZW50LlxuICAgKiBAcGFyYW0gcHJvcCBUaGUgc3R5bGUga2V5XG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUsIHVuZGVmaW5lZCB0byByZW1vdmVcbiAgICovXG4gIHNldFN0eWxlKHByb3A6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCBwcm9wLCB2YWx1ZSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBmb3JjZVJlZmxvdygpIHtcbiAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gIH1cblxuICBhZGRDbGFzcyhjc3M6IHN0cmluZywgZm9yY2VSZWZsb3c6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIGNzcy5zcGxpdCgnICcpXG4gICAgICAuZm9yRWFjaChjID0+IHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCBjKSk7XG4gICAgaWYgKGZvcmNlUmVmbG93KSB7XG4gICAgICB0aGlzLmZvcmNlUmVmbG93KCk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlQ2xhc3MoY3NzOiBzdHJpbmcsIGZvcmNlUmVmbG93OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjc3Muc3BsaXQoJyAnKVxuICAgICAgLmZvckVhY2goYyA9PiB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgYykpO1xuICAgIGlmIChmb3JjZVJlZmxvdykge1xuICAgICAgdGhpcy5mb3JjZVJlZmxvdygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFuaW1hdGlvbkVuZCAmJiAhdGhpcy5hbmltYXRpb25FbmQuY2xvc2VkKSB7XG4gICAgICB0aGlzLmFuaW1hdGlvbkVuZC5jb21wbGV0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIG15QW5pbWF0aW9uRW5kJCgpOiBPYnNlcnZhYmxlPEFuaW1hdGlvbkV2ZW50IHwgVHJhbnNpdGlvbkV2ZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuYW5pbWF0aW9uRW5kJC5waXBlKFxuICAgICAgZmlsdGVyKGUgPT4gZS50YXJnZXQgPT09IHRoaXMuZWwubmF0aXZlRWxlbWVudClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGNvbXBvbmVudCwgc3VwcGx5IGEgdmlldyBjb250YWluZXIgcmVmLlxuICAgKiBOb3RlOiBUaGUgY29tcG9uZW50cyB2Y1JlZiB3aWxsIHJlc3VsdCBpbiBhIHNpYmxpbmcuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2FkZENvbXBvbmVudDxUPihpbnN0cnVjdGlvbnM6IENyZWF0ZUNvbXBvbmVudEFyZ3MpOiBDb21wb25lbnRSZWY8VD4ge1xuICAgIGNvbnN0IGNtcFJlZiA9IGNyZWF0ZUNvbXBvbmVudChpbnN0cnVjdGlvbnMpO1xuICAgIGNtcFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICByZXR1cm4gY21wUmVmO1xuICB9XG5cblxuICBwcml2YXRlIG9uRW5kKGV2ZW50OiBUcmFuc2l0aW9uRXZlbnQgfCBBbmltYXRpb25FdmVudCk6IHZvaWQge1xuXG4gICAgaWYgKCF0aGlzLmFuaW1hdGlvbkVuZC5jbG9zZWQpIHtcbiAgICAgIHRoaXMuYW5pbWF0aW9uRW5kLm5leHQoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG59XG4iXX0=