truly-ui
Version:
Web Components for Desktop Applications.
72 lines • 13.8 kB
JavaScript
import { Component } from '@angular/core';
import * as stringFormat from 'string-format';
import * as i0 from "@angular/core";
import * as i1 from "../i18n/i18n.service";
import * as i2 from "@angular/common";
const format = stringFormat;
export class TlMessageValidationComponent {
constructor(element, i18n, changes) {
this.element = element;
this.i18n = i18n;
this.changes = changes;
this.errors = {};
this.control = null;
this.width = '';
this.messages = [];
this.keyErrors = {
required: Function(),
minlength: Function(),
cnpj: Function(),
cpf: Function(),
email: Function(),
pattern: Function(),
invalidPasswordRuleDigits: Function(),
invalidPasswordRuleUppercase: Function(),
invalidPasswordRuleSpecial: Function(),
invalidPasswordRuleLowerCase: Function(),
};
}
init(formControl, width) {
this.control = formControl;
this.width = width;
this.changes.detectChanges();
}
setMessages() {
this.messages = [];
this.setKeyErrors();
if (this.control && this.control.errors) {
Object.keys(this.control.errors).forEach((key) => {
if (this.keyErrors[key]) {
this.keyErrors[key]();
}
else {
this.messages.push(this.control.errors[key]);
}
});
}
}
setKeyErrors() {
this.keyErrors = {
required: () => this.messages.push(this.i18n.getLocale().Validators.fieldRequired),
minlength: () => {
const requiredLength = this.control.errors['minlength']['requiredLength'];
this.messages.push(format(this.i18n.getLocale().Validators.invalidMinLength, requiredLength));
},
cnpj: () => this.messages.push(this.i18n.getLocale().Validators.invalidCNPJ),
cpf: () => this.messages.push(this.i18n.getLocale().Validators.invalidCPF),
invalidPasswordRuleDigits: () => this.messages.push(this.i18n.getLocale().Validators.invalidPasswordRuleDigits),
invalidPasswordRuleUppercase: () => this.messages.push(this.i18n.getLocale().Validators.invalidPasswordRuleUppercase),
invalidPasswordRuleSpecial: () => this.messages.push(this.i18n.getLocale().Validators.invalidPasswordRuleSpecial),
invalidPasswordRuleLowerCase: () => this.messages.push(this.i18n.getLocale().Validators.invalidPasswordRuleLowerCase),
email: () => this.messages.push(format(this.i18n.getLocale().Validators.invalidEmail)),
pattern: () => this.messages.push(this.i18n.getLocale().Validators.patternNotMatch)
};
}
}
/** @nocollapse */ TlMessageValidationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlMessageValidationComponent, deps: [{ token: i0.ElementRef }, { token: i1.I18nService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ TlMessageValidationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlMessageValidationComponent, selector: "tl-messagevalidation", ngImport: i0, template: "<div *ngIf=\"control?.errors\" [style.width]=\"width\" class=\"ui-wrapper-messages\">\n <ul>\n <li *ngFor=\"let item of messages\"><i class=\"ion-android-cancel\"></i>{{item}}</li>\n </ul>\n</div>\n", styles: [".ui-wrapper-messages{background:rgba(247,113,113,.9);border-left:1px solid #F77171;border-right:1px solid #F77171;animation-name:creating;animation-duration:.2s;z-index:1000}.ui-wrapper-messages>ul{padding:0;list-style-type:none;margin:0}.ui-wrapper-messages>ul li{color:#fff;padding:5px 10px;font-family:Segoe UI,Lato,\"sans-serif\",Arial;font-size:14px}.ui-wrapper-messages>ul li i{font-size:14px;padding-right:5px}@keyframes creating{0%{opacity:0;transform:translateY(0)}25%{opacity:.25;transform:translateY(.25)}50%{opacity:.5;transform:translateY(.5)}75%{opacity:.75;transform:translateY(.75)}to{opacity:1;transform:translateY(1)}}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlMessageValidationComponent, decorators: [{
type: Component,
args: [{ selector: 'tl-messagevalidation', template: "<div *ngIf=\"control?.errors\" [style.width]=\"width\" class=\"ui-wrapper-messages\">\n <ul>\n <li *ngFor=\"let item of messages\"><i class=\"ion-android-cancel\"></i>{{item}}</li>\n </ul>\n</div>\n", styles: [".ui-wrapper-messages{background:rgba(247,113,113,.9);border-left:1px solid #F77171;border-right:1px solid #F77171;animation-name:creating;animation-duration:.2s;z-index:1000}.ui-wrapper-messages>ul{padding:0;list-style-type:none;margin:0}.ui-wrapper-messages>ul li{color:#fff;padding:5px 10px;font-family:Segoe UI,Lato,\"sans-serif\",Arial;font-size:14px}.ui-wrapper-messages>ul li i{font-size:14px;padding-right:5px}@keyframes creating{0%{opacity:0;transform:translateY(0)}25%{opacity:.25;transform:translateY(.25)}50%{opacity:.5;transform:translateY(.5)}75%{opacity:.75;transform:translateY(.75)}to{opacity:1;transform:translateY(1)}}\n"] }]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.I18nService }, { type: i0.ChangeDetectorRef }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZXZhbGlkYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJ1bHktdWkvc3JjL2NvbXBvbmVudHMvbWVzc2FnZXZhbGlkYXRpb24vbWVzc2FnZXZhbGlkYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJ1bHktdWkvc3JjL2NvbXBvbmVudHMvbWVzc2FnZXZhbGlkYXRpb24vbWVzc2FnZXZhbGlkYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFFekUsT0FBTyxLQUFLLFlBQVksTUFBTSxlQUFlLENBQUM7Ozs7QUFFOUMsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDO0FBTzVCLE1BQU0sT0FBTyw0QkFBNEI7SUF1QnZDLFlBQW9CLE9BQW1CLEVBQVUsSUFBaUIsRUFBVSxPQUEwQjtRQUFsRixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBYTtRQUFVLFlBQU8sR0FBUCxPQUFPLENBQW1CO1FBckI5RixXQUFNLEdBQUcsRUFBRSxDQUFDO1FBRWIsWUFBTyxHQUFHLElBQUksQ0FBQztRQUVmLFVBQUssR0FBRyxFQUFFLENBQUM7UUFFWCxhQUFRLEdBQUcsRUFBRSxDQUFDO1FBRWIsY0FBUyxHQUFHO1lBQ2xCLFFBQVEsRUFBRSxRQUFRLEVBQUU7WUFDcEIsU0FBUyxFQUFFLFFBQVEsRUFBRTtZQUNyQixJQUFJLEVBQUUsUUFBUSxFQUFFO1lBQ2hCLEdBQUcsRUFBRSxRQUFRLEVBQUU7WUFDZixLQUFLLEVBQUUsUUFBUSxFQUFFO1lBQ2pCLE9BQU8sRUFBRSxRQUFRLEVBQUU7WUFDbkIseUJBQXlCLEVBQUUsUUFBUSxFQUFFO1lBQ3JDLDRCQUE0QixFQUFFLFFBQVEsRUFBRTtZQUN4QywwQkFBMEIsRUFBRSxRQUFR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LEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdEYsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztTQUNwRixDQUFDO0lBQ0osQ0FBQzs7NklBN0RVLDRCQUE0QjtpSUFBNUIsNEJBQTRCLDREQ1h6Qyw2TUFLQTs0RkRNYSw0QkFBNEI7a0JBTHhDLFNBQVM7K0JBQ0Usc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi9pMThuL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgKiBhcyBzdHJpbmdGb3JtYXQgZnJvbSAnc3RyaW5nLWZvcm1hdCc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5jb25zdCBmb3JtYXQgPSBzdHJpbmdGb3JtYXQ7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RsLW1lc3NhZ2V2YWxpZGF0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21lc3NhZ2V2YWxpZGF0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbWVzc2FnZXZhbGlkYXRpb24uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVGxNZXNzYWdlVmFsaWRhdGlvbkNvbXBvbmVudCB7XG5cbiAgcHJpdmF0ZSBlcnJvcnMgPSB7fTtcblxuICBwdWJsaWMgY29udHJvbCA9IG51bGw7XG5cbiAgcHVibGljIHdpZHRoID0gJyc7XG5cbiAgcHVibGljIG1lc3NhZ2VzID0gW107XG5cbiAgcHJpdmF0ZSBrZXlFcnJvcnMgPSB7XG4gICAgcmVxdWlyZWQ6IEZ1bmN0aW9uKCksXG4gICAgbWlubGVuZ3RoOiBGdW5jdGlvbigpLFxuICAgIGNucGo6IEZ1bmN0aW9uKCksXG4gICAgY3BmOiBGdW5jdGlvbigpLFxuICAgIGVtYWlsOiBGdW5jdGlvbigpLFxuICAgIHBhdHRlcm46IEZ1bmN0aW9uKCksXG4gICAgaW52YWxpZFBhc3N3b3JkUnVsZURpZ2l0czogRnVuY3Rpb24oKSxcbiAgICBpbnZhbGlkUGFzc3dvcmRSdWxlVXBwZXJjYXNlOiBGdW5jdGlvbigpLFxuICAgIGludmFsaWRQYXNzd29yZFJ1bGVTcGVjaWFsOiBGdW5jdGlvbigpLFxuICAgIGludmFsaWRQYXNzd29yZFJ1bGVMb3dlckNhc2U6IEZ1bmN0aW9uKCksXG4gIH07XG5cbiAgY29uc3RydWN0b3IoIHB1YmxpYyBlbGVtZW50OiBFbGVtZW50UmVmLCBwcml2YXRlIGkxOG46IEkxOG5TZXJ2aWNlLCBwcml2YXRlIGNoYW5nZXM6IENoYW5nZURldGVjdG9yUmVmICkgeyB9XG5cbiAgaW5pdCggZm9ybUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgd2lkdGg6IHN0cmluZyApIHtcbiAgICB0aGlzLmNvbnRyb2wgPSBmb3JtQ29udHJvbDtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5jaGFuZ2VzLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHNldE1lc3NhZ2VzKCkge1xuICAgIHRoaXMubWVzc2FnZXMgPSBbXTtcbiAgICB0aGlzLnNldEtleUVycm9ycygpO1xuICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmVycm9ycykge1xuICAgICAgT2JqZWN0LmtleXModGhpcy5jb250cm9sLmVycm9ycykuZm9yRWFjaCgoIGtleSApID0+IHtcbiAgICAgICAgaWYgKHRoaXMua2V5RXJyb3JzW2tleV0pIHtcbiAgICAgICAgICB0aGlzLmtleUVycm9yc1trZXldKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlcy5wdXNoKCB0aGlzLmNvbnRyb2wuZXJyb3JzW2tleV0gKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2V0S2V5RXJyb3JzKCkge1xuICAgIHRoaXMua2V5RXJyb3JzID0ge1xuICAgICAgcmVxdWlyZWQ6ICgpID0+IHRoaXMubWVzc2FnZXMucHVzaCh0aGlzLmkxOG4uZ2V0TG9jYWxlKCkuVmFsaWRhdG9ycy5maWVsZFJlcXVpcmVkKSxcbiAgICAgIG1pbmxlbmd0aDogKCkgPT4ge1xuICAgICAgICBjb25zdCByZXF1aXJlZExlbmd0aCA9IHRoaXMuY29udHJvbC5lcnJvcnNbJ21pbmxlbmd0aCddWydyZXF1aXJlZExlbmd0aCddO1xuICAgICAgICB0aGlzLm1lc3NhZ2VzLnB1c2goZm9ybWF0KHRoaXMuaTE4bi5nZXRMb2NhbGUoKS5WYWxpZGF0b3JzLmludmFsaWRNaW5MZW5ndGgsIHJlcXVpcmVkTGVuZ3RoKSk7XG4gICAgICB9LFxuICAgICAgY25wajogKCkgPT4gdGhpcy5tZXNzYWdlcy5wdXNoKCB0aGlzLmkxOG4uZ2V0TG9jYWxlKCkuVmFsaWRhdG9ycy5pbnZhbGlkQ05QSiApLFxuICAgICAgY3BmOiAoKSA9PiB0aGlzLm1lc3NhZ2VzLnB1c2goIHRoaXMuaTE4bi5nZXRMb2NhbGUoKS5WYWxpZGF0b3JzLmludmFsaWRDUEYgKSxcbiAgICAgIGludmFsaWRQYXNzd29yZFJ1bGVEaWdpdHM6ICgpID0+IHRoaXMubWVzc2FnZXMucHVzaCh0aGlzLmkxOG4uZ2V0TG9jYWxlKCkuVmFsaWRhdG9ycy5pbnZhbGlkUGFzc3dvcmRSdWxlRGlnaXRzKSxcbiAgICAgIGludmFsaWRQYXNzd29yZFJ1bGVVcHBlcmNhc2U6ICgpID0+IHRoaXMubWVzc2FnZXMucHVzaCh0aGlzLmkxOG4uZ2V0TG9jYWxlKCkuVmFsaWRhdG9ycy5pbnZhbGlkUGFzc3dvcmRSdWxlVXBwZXJjYXNlKSxcbiAgICAgIGludmFsaWRQYXNzd29yZFJ1bGVTcGVjaWFsOiAoKSA9PiB0aGlzLm1lc3NhZ2VzLnB1c2godGhpcy5pMThuLmdldExvY2FsZSgpLlZhbGlkYXRvcnMuaW52YWxpZFBhc3N3b3JkUnVsZVNwZWNpYWwpLFxuICAgICAgaW52YWxpZFBhc3N3b3JkUnVsZUxvd2VyQ2FzZTogKCkgPT4gdGhpcy5tZXNzYWdlcy5wdXNoKHRoaXMuaTE4bi5nZXRMb2NhbGUoKS5WYWxpZGF0b3JzLmludmFsaWRQYXNzd29yZFJ1bGVMb3dlckNhc2UpLFxuICAgICAgZW1haWw6ICgpID0+IHRoaXMubWVzc2FnZXMucHVzaChmb3JtYXQodGhpcy5pMThuLmdldExvY2FsZSgpLlZhbGlkYXRvcnMuaW52YWxpZEVtYWlsKSksXG4gICAgICBwYXR0ZXJuOiAoKSA9PiB0aGlzLm1lc3NhZ2VzLnB1c2godGhpcy5pMThuLmdldExvY2FsZSgpLlZhbGlkYXRvcnMucGF0dGVybk5vdE1hdGNoKVxuICAgIH07XG4gIH1cblxufVxuIiwiPGRpdiAqbmdJZj1cImNvbnRyb2w/LmVycm9yc1wiIFtzdHlsZS53aWR0aF09XCJ3aWR0aFwiIGNsYXNzPVwidWktd3JhcHBlci1tZXNzYWdlc1wiPlxuICA8dWw+XG4gICAgPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIG1lc3NhZ2VzXCI+PGkgY2xhc3M9XCJpb24tYW5kcm9pZC1jYW5jZWxcIj48L2k+e3tpdGVtfX08L2xpPlxuICA8L3VsPlxuPC9kaXY+XG4iXX0=