UNPKG

@yoyoboot/l-52abp-ng

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.1.13.

89 lines 13.8 kB
import { ChangeDetectionStrategy, Component, Inject, Input, } from '@angular/core'; import { SampleComponentBaseDirective } from '../component-base'; import { YOYO_CONFIG } from '../common'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class ValidationMessagesComponent extends SampleComponentBaseDirective { constructor(injector, cdr, appConfig) { super(injector); this.cdr = cdr; this.appConfig = appConfig; this._formCtrlInited = false; /** 所有异常 */ this.errorSource = {}; /** 页面异常信息 */ this.viewErrors = []; this.updateErrorSource(); } ngOnChanges(changes) { if (changes.customErrors) { this.updateErrorSource(); } if (changes.formCtrl && changes.formCtrl.currentValue && !this._formCtrlInited) { this._formCtrlInited = true; const self = this; self.updateViewError(); changes.formCtrl.currentValue.valueChanges.subscribe((res) => { self.updateViewError(); }); } } /** 更新所有定义的错误 */ updateErrorSource() { if (!this.customErrors || this.customErrors.length === 0) { this.appConfig.standartErrors.forEach((item) => { this.errorSource[item.error] = item; }); return; } const standarts = this.appConfig.standartErrors.filter(stdErr => !this.customErrors.every(customErr => customErr.error === stdErr.error)); standarts.concat(this.customErrors) .forEach((item) => { this.errorSource[item.error] = item; }); } /** 更新视图错误 */ updateViewError() { if (this.formCtrl.invalid && (this.formCtrl.dirty || this.formCtrl.touched)) { const tmpViewErrors = []; // tslint:disable-next-line: forin for (const key in this.formCtrl.errors) { const formError = this.formCtrl.errors[key]; if (!formError) { continue; } const error = this.errorSource[key]; if (!error) { continue; } const errorRequirement = formError[error.errorProperty]; tmpViewErrors.push(!!errorRequirement ? this.l(error.localizationKey) + ' ' + errorRequirement : this.l(error.localizationKey)); } const newError = tmpViewErrors.join(','); const oldError = this.viewErrors.join(','); if (newError !== oldError) { this.viewErrors = tmpViewErrors; this.cdr.detectChanges(); } } } } ValidationMessagesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: ValidationMessagesComponent, deps: [{ token: i0.Injector }, { token: i0.ChangeDetectorRef }, { token: YOYO_CONFIG }], target: i0.ɵɵFactoryTarget.Component }); ValidationMessagesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.13", type: ValidationMessagesComponent, selector: "validation-messages", inputs: { formCtrl: "formCtrl", customErrors: "customErrors" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<!--<span *ngIf=\"formCtrl&&formCtrl.invalid && (formCtrl.dirty || formCtrl.touched)\">-->\n<!-- <ng-container *ngFor=\"let errorDef of errorDefsInternal\">-->\n<!-- <span *ngIf=\"getErrorDefinitionIsInValid(errorDef)\">-->\n<!-- {{getErrorDefinitionMessage(errorDef)}}-->\n<!-- </span>-->\n<!-- </ng-container>-->\n<!--</span>-->\n\n<ng-container *ngFor=\"let error of viewErrors\">\n <div>\n {{error}}\n </div>\n</ng-container>\n", styles: [""], directives: [{ type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: ValidationMessagesComponent, decorators: [{ type: Component, args: [{ selector: 'validation-messages', templateUrl: './validation-messages.component.html', styleUrls: ['./validation-messages.component.less'], changeDetection: ChangeDetectionStrategy.OnPush, }] }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{ type: Inject, args: [YOYO_CONFIG] }] }]; }, propDecorators: { formCtrl: [{ type: Input }], customErrors: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1tZXNzYWdlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9sLTUyYWJwLW5nL3NyYy92YWxpZGF0aW9uLW1lc3NhZ2VzL3ZhbGlkYXRpb24tbWVzc2FnZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbC01MmFicC1uZy9zcmMvdmFsaWRhdGlvbi1tZXNzYWdlcy92YWxpZGF0aW9uLW1lc3NhZ2VzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULE1BQU0sRUFFTixLQUFLLEdBSU4sTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakUsT0FBTyxFQUFlLFdBQVcsRUFBYSxNQUFNLFdBQVcsQ0FBQzs7O0FBU2hFLE1BQU0sT0FBTywyQkFBNEIsU0FBUSw0QkFBNEI7SUFhM0UsWUFDRSxRQUFrQixFQUNYLEdBQXNCLEVBQ0QsU0FBc0I7UUFFbEQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBSFQsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDRCxjQUFTLEdBQVQsU0FBUyxDQUFhO1FBYjVDLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBS2hDLFdBQVc7UUFDWCxnQkFBVyxHQUFRLEVBQUUsQ0FBQztRQUN0QixhQUFhO1FBQ2IsZUFBVSxHQUFhLEVBQUUsQ0FBQztRQVF4QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQTZEO1FBQ3ZFLElBQUksT0FBTyxDQUFDLFlBQVksRUFBRTtZQUN4QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUMxQjtRQUNELElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksSUFB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LGFBQWEsRUFBRSxDQUFDO2FBQzFCO1NBQ0Y7SUFDSCxDQUFDOzt5SEFoRlUsMkJBQTJCLDJFQWdCNUIsV0FBVzs2R0FoQlYsMkJBQTJCLHVLQ3JCeEMsbWNBYUE7NEZEUWEsMkJBQTJCO2tCQU52QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxxQkFBcUI7b0JBQy9CLFdBQVcsRUFBRSxzQ0FBc0M7b0JBQ25ELFNBQVMsRUFBRSxDQUFDLHNDQUFzQyxDQUFDO29CQUNuRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDaEQ7OzBCQWlCSSxNQUFNOzJCQUFDLFdBQVc7NENBWFosUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEluamVjdCxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZSxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFNhbXBsZUNvbXBvbmVudEJhc2VEaXJlY3RpdmUgfSBmcm9tICcuLi9jb21wb25lbnQtYmFzZSc7XG5pbXBvcnQgeyBJWW95b0NvbmZpZywgWU9ZT19DT05GSUcsIElFcnJvckRlZiB9IGZyb20gJy4uL2NvbW1vbic7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsaWRhdGlvbi1tZXNzYWdlcycsXG4gIHRlbXBsYXRlVXJsOiAnLi92YWxpZGF0aW9uLW1lc3NhZ2VzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdmFsaWRhdGlvbi1tZXNzYWdlcy5jb21wb25lbnQubGVzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbk1lc3NhZ2VzQ29tcG9uZW50IGV4dGVuZHMgU2FtcGxlQ29tcG9uZW50QmFzZURpcmVjdGl2ZVxuICBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG5cbiAgcHJpdmF0ZSBfZm9ybUN0cmxJbml0ZWQgPSBmYWxzZTtcbiAgLyoqIOihqOWNleaOp+S7tiAqL1xuICBASW5wdXQoKSBmb3JtQ3RybDogRm9ybUNvbnRyb2w7XG4gIC8qKiDoh6rlrprkuYnplJnor68gKi9cbiAgQElucHV0KCkgY3VzdG9tRXJyb3JzOiBJRXJyb3JEZWZbXTtcbiAgLyoqIOaJgOacieW8guW4uCAqL1xuICBlcnJvclNvdXJjZTogYW55ID0ge307XG4gIC8qKiDpobXpnaLlvILluLjkv6Hmga8gKi9cbiAgdmlld0Vycm9yczogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQEluamVjdChZT1lPX0NPTkZJRykgcHVibGljIGFwcENvbmZpZzogSVlveW9Db25maWcsXG4gICkge1xuICAgIHN1cGVyKGluamVjdG9yKTtcbiAgICB0aGlzLnVwZGF0ZUVycm9yU291cmNlKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiB7IFtQIGluIGtleW9mIHRoaXNdPzogU2ltcGxlQ2hhbmdlIH0gJiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXMuY3VzdG9tRXJyb3JzKSB7XG4gICAgICB0aGlzLnVwZGF0ZUVycm9yU291cmNlKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmZvcm1DdHJsICYmIGNoYW5nZXMuZm9ybUN0cmwuY3VycmVudFZhbHVlICYmICF0aGlzLl9mb3JtQ3RybEluaXRlZCkge1xuICAgICAgdGhpcy5fZm9ybUN0cmxJbml0ZWQgPSB0cnVlO1xuICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICBzZWxmLnVwZGF0ZVZpZXdFcnJvcigpO1xuICAgICAgY2hhbmdlcy5mb3JtQ3RybC5jdXJyZW50VmFsdWUudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgIHNlbGYudXBkYXRlVmlld0Vycm9yKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiog5pu05paw5omA5pyJ5a6a5LmJ55qE6ZSZ6K+vICovXG4gIHByaXZhdGUgdXBkYXRlRXJyb3JTb3VyY2UoKSB7XG4gICAgaWYgKCF0aGlzLmN1c3RvbUVycm9ycyB8fCB0aGlzLmN1c3RvbUVycm9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuYXBwQ29uZmlnLnN0YW5kYXJ0RXJyb3JzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgdGhpcy5lcnJvclNvdXJjZVtpdGVtLmVycm9yXSA9IGl0ZW07XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFuZGFydHMgPSB0aGlzLmFwcENvbmZpZy5zdGFuZGFydEVycm9ycy5maWx0ZXIoc3RkRXJyID0+ICF0aGlzLmN1c3RvbUVycm9ycy5ldmVyeShjdXN0b21FcnIgPT4gY3VzdG9tRXJyLmVycm9yID09PSBzdGRFcnIuZXJyb3IpKTtcbiAgICBzdGFuZGFydHMuY29uY2F0KHRoaXMuY3VzdG9tRXJyb3JzKVxuICAgICAgLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgdGhpcy5lcnJvclNvdXJjZVtpdGVtLmVycm9yXSA9IGl0ZW07XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKiDmm7TmlrDop4blm77plJnor68gKi9cbiAgcHJpdmF0ZSB1cGRhdGVWaWV3RXJyb3IoKSB7XG4gICAgaWYgKHRoaXMuZm9ybUN0cmwuaW52YWxpZCAmJiAodGhpcy5mb3JtQ3RybC5kaXJ0eSB8fCB0aGlzLmZvcm1DdHJsLnRvdWNoZWQpKSB7XG4gICAgICBjb25zdCB0bXBWaWV3RXJyb3JzID0gW107XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGZvcmluXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmZvcm1DdHJsLmVycm9ycykge1xuICAgICAgICBjb25zdCBmb3JtRXJyb3IgPSB0aGlzLmZvcm1DdHJsLmVycm9yc1trZXldO1xuICAgICAgICBpZiAoIWZvcm1FcnJvcikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVycm9yOiBJRXJyb3JEZWYgPSB0aGlzLmVycm9yU291cmNlW2tleV07XG4gICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVycm9yUmVxdWlyZW1lbnQgPSBmb3JtRXJyb3JbZXJyb3IuZXJyb3JQcm9wZXJ0eV07XG4gICAgICAgIHRtcFZpZXdFcnJvcnMucHVzaChcbiAgICAgICAgICAhIWVycm9yUmVxdWlyZW1lbnQgPyB0aGlzLmwoZXJyb3IubG9jYWxpemF0aW9uS2V5KSArICcgJyArIGVycm9yUmVxdWlyZW1lbnQgOiB0aGlzLmwoZXJyb3IubG9jYWxpemF0aW9uS2V5KSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3RXJyb3IgPSB0bXBWaWV3RXJyb3JzLmpvaW4oJywnKTtcbiAgICAgIGNvbnN0IG9sZEVycm9yID0gdGhpcy52aWV3RXJyb3JzLmpvaW4oJywnKTtcbiAgICAgIGlmIChuZXdFcnJvciAhPT0gb2xkRXJyb3IpIHtcbiAgICAgICAgdGhpcy52aWV3RXJyb3JzID0gdG1wVmlld0Vycm9ycztcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPCEtLTxzcGFuICpuZ0lmPVwiZm9ybUN0cmwmJmZvcm1DdHJsLmludmFsaWQgJiYgKGZvcm1DdHJsLmRpcnR5IHx8IGZvcm1DdHJsLnRvdWNoZWQpXCI+LS0+XG48IS0tICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlcnJvckRlZiBvZiBlcnJvckRlZnNJbnRlcm5hbFwiPi0tPlxuPCEtLSAgICA8c3BhbiAqbmdJZj1cImdldEVycm9yRGVmaW5pdGlvbklzSW5WYWxpZChlcnJvckRlZilcIj4tLT5cbjwhLS0gICAgICB7e2dldEVycm9yRGVmaW5pdGlvbk1lc3NhZ2UoZXJyb3JEZWYpfX0tLT5cbjwhLS0gICAgPC9zcGFuPi0tPlxuPCEtLSAgPC9uZy1jb250YWluZXI+LS0+XG48IS0tPC9zcGFuPi0tPlxuXG48bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlcnJvciBvZiB2aWV3RXJyb3JzXCI+XG4gIDxkaXY+XG4gICAge3tlcnJvcn19XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG4iXX0=