ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
188 lines • 14.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
/**
* @license
* Copyright Alibaba.com All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
// tslint:disable no-any
import { Inject, Injectable, Optional } from '@angular/core';
import { Subject } from 'rxjs';
import { filter, mapTo } from 'rxjs/operators';
import { NZ_CONFIG } from './config';
import * as i0 from "@angular/core";
import * as i1 from "./config";
/** @type {?} */
var isDefined = (/**
* @param {?=} value
* @return {?}
*/
function (value) {
return value !== undefined;
});
var ɵ0 = isDefined;
var NzConfigService = /** @class */ (function () {
function NzConfigService(defaultConfig) {
this.configUpdated$ = new Subject();
this.config = defaultConfig || {};
}
/**
* @template T
* @param {?} componentName
* @return {?}
*/
NzConfigService.prototype.getConfigForComponent = /**
* @template T
* @param {?} componentName
* @return {?}
*/
function (componentName) {
return this.config[componentName];
};
/**
* @param {?} componentName
* @return {?}
*/
NzConfigService.prototype.getConfigChangeEventForComponent = /**
* @param {?} componentName
* @return {?}
*/
function (componentName) {
return this.configUpdated$.pipe(filter((/**
* @param {?} n
* @return {?}
*/
function (n) { return n === componentName; })), mapTo(undefined));
};
/**
* @template T
* @param {?} componentName
* @param {?} value
* @return {?}
*/
NzConfigService.prototype.set = /**
* @template T
* @param {?} componentName
* @param {?} value
* @return {?}
*/
function (componentName, value) {
this.config[componentName] = tslib_1.__assign({}, this.config[componentName], value);
this.configUpdated$.next(componentName);
};
NzConfigService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
NzConfigService.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NZ_CONFIG,] }] }
]; };
/** @nocollapse */ NzConfigService.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function NzConfigService_Factory() { return new NzConfigService(i0.ɵɵinject(i1.NZ_CONFIG, 8)); }, token: NzConfigService, providedIn: "root" });
return NzConfigService;
}());
export { NzConfigService };
if (false) {
/**
* @type {?}
* @private
*/
NzConfigService.prototype.configUpdated$;
/**
* Global config holding property.
* @type {?}
* @private
*/
NzConfigService.prototype.config;
}
// tslint:disable:no-invalid-this
// tslint:disable:no-any
/** @type {?} */
var lowercaseFirstLetter = (/**
* @param {?} s
* @return {?}
*/
function (s) {
return s.charAt(0).toLowerCase() + s.slice(1);
});
var ɵ1 = lowercaseFirstLetter;
/** @type {?} */
export var trimComponentName = (/**
* @param {?} componentName
* @return {?}
*/
function (componentName) {
return (/** @type {?} */ (lowercaseFirstLetter(componentName
.replace('Nz', '')
.replace(/(Component|Directive|Service|ContainerComponent)$/g, '')
.toLowerCase())));
});
/**
* This decorator is used to decorate properties. If a property is decorated, it would try to load default value from
* config.
* @template T
* @param {?=} innerDefaultValue
* @return {?}
*/
// tslint:disable-next-line:typedef
export function WithConfig(innerDefaultValue) {
return (/**
* @param {?} target
* @param {?} propName
* @param {?=} originalDescriptor
* @return {?}
*/
function ConfigDecorator(target, propName, originalDescriptor) {
/** @type {?} */
var privatePropName = "$$__assignedValue__" + propName;
/** @type {?} */
var componentName = (/** @type {?} */ (trimComponentName(target.constructor.name)));
if (Object.prototype.hasOwnProperty.call(target, privatePropName)) {
console.warn("The prop \"" + privatePropName + "\" is already exist, it will be override by " + componentName + " decorator.");
}
Object.defineProperty(target, privatePropName, {
configurable: true,
writable: true,
enumerable: false
});
return {
get: /**
* @return {?}
*/
function () {
/** @type {?} */
var originalValue = originalDescriptor && originalDescriptor.get ? originalDescriptor.get.bind(this)() : this[privatePropName];
if (isDefined(originalValue)) {
return originalValue;
}
/** @type {?} */
var componentConfig = this.nzConfigService.getConfigForComponent(componentName) || {};
/** @type {?} */
var configValue = componentConfig[propName];
return isDefined(configValue) ? configValue : innerDefaultValue;
},
set: /**
* @param {?=} value
* @return {?}
*/
function (value) {
if (originalDescriptor && originalDescriptor.set) {
originalDescriptor.set.bind(this)(value);
}
else {
this[privatePropName] = value;
}
},
configurable: true,
enumerable: true
};
});
}
export { ɵ0, ɵ1 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkL2NvcmUvIiwic291cmNlcyI6WyJjb25maWcvY29uZmlnLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQVVBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFL0MsT0FBTyxFQUF5QixTQUFTLEVBQUUsTUFBTSxVQUFVLENBQUM7Ozs7SUFFdEQsU0FBUzs7OztBQUFHLFVBQVMsS0FBVztJQUNwQyxPQUFPLEtBQUssS0FBSyxTQUFTLENBQUM7QUFDN0IsQ0FBQyxDQUFBOztBQUVEO0lBU0UseUJBQTJDLGFBQXdCO1FBTDNELG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQWtCLENBQUM7UUFNckQsSUFBSSxDQUFDLE1BQU0sR0FBRyxhQUFhLElBQUksRUFBRSxDQUFDO0lBQ3BDLENBQUM7Ozs7OztJQUVELCtDQUFxQjs7Ozs7SUFBckIsVUFBNkMsYUFBZ0I7UUFDM0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7Ozs7O0lBRUQsMERBQWdDOzs7O0lBQWhDLFVBQWlDLGFBQTBCO1FBQ3pELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQzdCLE1BQU07Ozs7UUFBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsS0FBSyxhQUFhLEVBQW5CLENBQW1CLEVBQUMsRUFDaEMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUNqQixDQUFDO0lBQ0osQ0FBQzs7Ozs7OztJQUVELDZCQUFHOzs7Ozs7SUFBSCxVQUEyQixhQUFnQixFQUFFLEtBQWtCO1FBQzdELElBQUksQ0FB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akIsQ0FBQztJQUNKLENBQUMsRUFBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuLy8gdHNsaW50OmRpc2FibGUgbm8tYW55XG5cbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgZmlsdGVyLCBtYXBUbyB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTnpDb25maWcsIE56Q29uZmlnS2V5LCBOWl9DT05GSUcgfSBmcm9tICcuL2NvbmZpZyc7XG5cbmNvbnN0IGlzRGVmaW5lZCA9IGZ1bmN0aW9uKHZhbHVlPzogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkO1xufTtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgTnpDb25maWdTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBjb25maWdVcGRhdGVkJCA9IG5ldyBTdWJqZWN0PGtleW9mIE56Q29uZmlnPigpO1xuXG4gIC8qKiBHbG9iYWwgY29uZmlnIGhvbGRpbmcgcHJvcGVydHkuICovXG4gIHByaXZhdGUgY29uZmlnOiBOekNvbmZpZztcblxuICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBASW5qZWN0KE5aX0NPTkZJRykgZGVmYXVsdENvbmZpZz86IE56Q29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSBkZWZhdWx0Q29uZmlnIHx8IHt9O1xuICB9XG5cbiAgZ2V0Q29uZmlnRm9yQ29tcG9uZW50PFQgZXh0ZW5kcyBOekNvbmZpZ0tleT4oY29tcG9uZW50TmFtZTogVCk6IE56Q29uZmlnW1RdIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWdbY29tcG9uZW50TmFtZV07XG4gIH1cblxuICBnZXRDb25maWdDaGFuZ2VFdmVudEZvckNvbXBvbmVudChjb21wb25lbnROYW1lOiBOekNvbmZpZ0tleSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ1VwZGF0ZWQkLnBpcGUoXG4gICAgICBmaWx0ZXIobiA9PiBuID09PSBjb21wb25lbnROYW1lKSxcbiAgICAgIG1hcFRvKHVuZGVmaW5lZClcbiAgICApO1xuICB9XG5cbiAgc2V0PFQgZXh0ZW5kcyBOekNvbmZpZ0tleT4oY29tcG9uZW50TmFtZTogVCwgdmFsdWU6IE56Q29uZmlnW1RdKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWdbY29tcG9uZW50TmFtZV0gPSB7IC4uLnRoaXMuY29uZmlnW2NvbXBvbmVudE5hbWVdLCAuLi52YWx1ZSB9O1xuICAgIHRoaXMuY29uZmlnVXBkYXRlZCQubmV4dChjb21wb25lbnROYW1lKTtcbiAgfVxufVxuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1pbnZhbGlkLXRoaXNcbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG5jb25zdCBsb3dlcmNhc2VGaXJzdExldHRlciA9IChzOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gcy5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHMuc2xpY2UoMSk7XG59O1xuXG5leHBvcnQgY29uc3QgdHJpbUNvbXBvbmVudE5hbWUgPSAoY29tcG9uZW50TmFtZTogc3RyaW5nKTogTnpDb25maWdLZXkgPT4ge1xuICByZXR1cm4gbG93ZXJjYXNlRmlyc3RMZXR0ZXIoXG4gICAgY29tcG9uZW50TmFtZVxuICAgICAgLnJlcGxhY2UoJ056JywgJycpXG4gICAgICAucmVwbGFjZSgvKENvbXBvbmVudHxEaXJlY3RpdmV8U2VydmljZXxDb250YWluZXJDb21wb25lbnQpJC9nLCAnJylcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICkgYXMgTnpDb25maWdLZXk7XG59O1xuXG4vKipcbiAqIFRoaXMgZGVjb3JhdG9yIGlzIHVzZWQgdG8gZGVjb3JhdGUgcHJvcGVydGllcy4gSWYgYSBwcm9wZXJ0eSBpcyBkZWNvcmF0ZWQsIGl0IHdvdWxkIHRyeSB0byBsb2FkIGRlZmF1bHQgdmFsdWUgZnJvbVxuICogY29uZmlnLlxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHlwZWRlZlxuZXhwb3J0IGZ1bmN0aW9uIFdpdGhDb25maWc8VD4oaW5uZXJEZWZhdWx0VmFsdWU/OiBUKSB7XG4gIHJldHVybiBmdW5jdGlvbiBDb25maWdEZWNvcmF0b3IodGFyZ2V0OiBhbnksIHByb3BOYW1lOiBhbnksIG9yaWdpbmFsRGVzY3JpcHRvcj86IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPFQ+KTogYW55IHtcbiAgICBjb25zdCBwcml2YXRlUHJvcE5hbWUgPSBgJCRfX2Fzc2lnbmVkVmFsdWVfXyR7cHJvcE5hbWV9YDtcbiAgICBjb25zdCBjb21wb25lbnROYW1lID0gdHJpbUNvbXBvbmVudE5hbWUodGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUpIGFzIE56Q29uZmlnS2V5O1xuXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIHByaXZhdGVQcm9wTmFtZSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFRoZSBwcm9wIFwiJHtwcml2YXRlUHJvcE5hbWV9XCIgaXMgYWxyZWFkeSBleGlzdCwgaXQgd2lsbCBiZSBvdmVycmlkZSBieSAke2NvbXBvbmVudE5hbWV9IGRlY29yYXRvci5gXG4gICAgICApO1xuICAgIH1cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByaXZhdGVQcm9wTmFtZSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGdldCgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxWYWx1ZSA9XG4gICAgICAgICAgb3JpZ2luYWxEZXNjcmlwdG9yICYmIG9yaWdpbmFsRGVzY3JpcHRvci5nZXQgPyBvcmlnaW5hbERlc2NyaXB0b3IuZ2V0LmJpbmQodGhpcykoKSA6IHRoaXNbcHJpdmF0ZVByb3BOYW1lXTtcblxuICAgICAgICBpZiAoaXNEZWZpbmVkKG9yaWdpbmFsVmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIG9yaWdpbmFsVmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21wb25lbnRDb25maWcgPSB0aGlzLm56Q29uZmlnU2VydmljZS5nZXRDb25maWdGb3JDb21wb25lbnQoY29tcG9uZW50TmFtZSkgfHwge307XG4gICAgICAgIGNvbnN0IGNvbmZpZ1ZhbHVlID0gY29tcG9uZW50Q29uZmlnW3Byb3BOYW1lXTtcblxuICAgICAgICByZXR1cm4gaXNEZWZpbmVkKGNvbmZpZ1ZhbHVlKSA/IGNvbmZpZ1ZhbHVlIDogaW5uZXJEZWZhdWx0VmFsdWU7XG4gICAgICB9LFxuICAgICAgc2V0KHZhbHVlPzogVCk6IHZvaWQge1xuICAgICAgICBpZiAob3JpZ2luYWxEZXNjcmlwdG9yICYmIG9yaWdpbmFsRGVzY3JpcHRvci5zZXQpIHtcbiAgICAgICAgICBvcmlnaW5hbERlc2NyaXB0b3Iuc2V0LmJpbmQodGhpcykodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXNbcHJpdmF0ZVByb3BOYW1lXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgIH07XG4gIH07XG59XG4iXX0=