UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

136 lines 16.3 kB
import { Component, ContentChild, HostBinding, Input } from '@angular/core'; import { FormControlName, NgModel } from '@angular/forms'; import { BehaviorSubject, merge, Subject } from 'rxjs'; import { debounceTime, filter, takeUntil } from 'rxjs/operators'; import { MessagesComponent } from './messages.component'; import { NgIf } from '@angular/common'; import * as i0 from "@angular/core"; /** * A form group helps to validate an input of a form element. * * ```html * <c8y-form-group [hasWarning]="user.email.length === 0"> * <label translate for="userEmail">Email</label> * <input * id="userEmail" * class="form-control" * type="email" * name="email" * [maxlength]="254" * autocomplete="off" * placeholder="{{'e.g. joe.doe@exmpl.com' | translate}}" * [(ngModel)]="user.email" * email * required * > * <c8y-messages> * <c8y-message *ngIf="user.email.length === 0" translate></c8y-message> * <c8y-message name="required" text="The E-Mail is SUPER required"></c8y-message> * </c8y-messages> * </c8y-form-group> * ``` * * @param status The current status could be error, warning or success. * @param hasError Set this to true to display a error. * @param hasWarning Set this to true to display a warning. * @param hasSuccess Set this to true to display a success. * @param novalidation Set this to true to disable automatic validation by this component. */ export class FormGroupComponent { constructor() { this.hasError = false; this.hasWarning = false; this.hasSuccess = false; this.novalidation = false; this.VALIDATION_DEBOUNCE_MS = 100; this.destroyed$ = new Subject(); } get error() { return this.status === 'error' || this.hasError; } get warning() { return this.status === 'warning' || this.hasWarning; } get success() { return this.status === 'success' || this.hasSuccess; } ngAfterContentInit() { this.initNgModel(); this.initFormControl(); } initNgModel() { if (this.model) { this.observeControl(this.model); } } initFormControl() { if (this.formControlName) { this.observeControl(this.formControlName.control); } } observeControl(control) { this.control = control; this.controlTouched$ = new BehaviorSubject(control.touched); merge(control.valueChanges, control.statusChanges, this.controlTouched$) .pipe(filter(() => (control.dirty || control.touched) && !this.novalidation), debounceTime(this.VALIDATION_DEBOUNCE_MS), takeUntil(this.destroyed$)) .subscribe(() => this.updateErrors(control)); } updateErrors(control) { this.hasError = control.touched && control.status === 'INVALID'; const errors = this.hasError ? control.errors : {}; if (this.customErrorMessage) { this.customErrorMessage.changeVisibility(errors); } else { this.errors = errors; } } ngDoCheck() { if (this.controlTouched$) { if (this.controlTouched$.value !== this.control.touched) { this.controlTouched$.next(this.control.touched); } } } ngOnDestroy() { this.destroyed$.next(); this.destroyed$.complete(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormGroupComponent, isStandalone: true, selector: "c8y-form-group", inputs: { hasError: "hasError", hasWarning: "hasWarning", hasSuccess: "hasSuccess", novalidation: "novalidation", status: "status" }, host: { properties: { "class.has-error": "this.error", "class.has-warning": "this.warning", "class.has-success": "this.success" }, classAttribute: "form-group" }, queries: [{ propertyName: "customErrorMessage", first: true, predicate: MessagesComponent, descendants: true }, { propertyName: "model", first: true, predicate: NgModel, descendants: true, static: true }, { propertyName: "formControlName", first: true, predicate: FormControlName, descendants: true, static: true }], ngImport: i0, template: "<ng-content></ng-content>\n<c8y-messages *ngIf=\"!customErrorMessage\" [show]=\"errors\"></c8y-messages>\n", dependencies: [{ kind: "component", type: MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormGroupComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-form-group', host: { class: 'form-group' }, standalone: true, imports: [MessagesComponent, NgIf], template: "<ng-content></ng-content>\n<c8y-messages *ngIf=\"!customErrorMessage\" [show]=\"errors\"></c8y-messages>\n" }] }], propDecorators: { hasError: [{ type: Input }], hasWarning: [{ type: Input }], hasSuccess: [{ type: Input }], novalidation: [{ type: Input }], status: [{ type: Input }], error: [{ type: HostBinding, args: ['class.has-error'] }], warning: [{ type: HostBinding, args: ['class.has-warning'] }], success: [{ type: HostBinding, args: ['class.has-success'] }], customErrorMessage: [{ type: ContentChild, args: [MessagesComponent, { static: false }] }], model: [{ type: ContentChild, args: [NgModel, { static: true }] }], formControlName: [{ type: ContentChild, args: [FormControlName, { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1ncm91cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL2Zvcm1zL2Zvcm0tZ3JvdXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vY29yZS9mb3Jtcy9mb3JtLWdyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUVaLFdBQVcsRUFDWCxLQUFLLEVBRU4sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFlLGVBQWUsRUFBRSxPQUFPLEVBQW9CLE1BQU0sZ0JBQWdCLENBQUM7QUFDekYsT0FBTyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFFdkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThCRztBQVVILE1BQU0sT0FBTyxrQkFBa0I7SUFUL0I7UUFVVyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQXNCYiwyQkFBc0IsR0FBRyxHQUFHLENBQUM7UUFFdEMsZUFBVSxHQUFrQixJQUFJLE9BQU8sRUFBRSxDQUFDO0tBcURuRDtJQTFFQyxJQUFvQyxLQUFLO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUNsRCxDQUFDO0lBQ0QsSUFBc0MsT0FBTztRQUMzQyxPQUFPLElBQUks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QVk7cUJBQ3BCLGNBQ1csSUFBSSxXQUNQLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDOzhCQUd6QixRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFFOEIsS0FBSztzQkFBeEMsV0FBVzt1QkFBQyxpQkFBaUI7Z0JBR1EsT0FBTztzQkFBNUMsV0FBVzt1QkFBQyxtQkFBbUI7Z0JBR00sT0FBTztzQkFBNUMsV0FBVzt1QkFBQyxtQkFBbUI7Z0JBSW9CLGtCQUFrQjtzQkFBckUsWUFBWTt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ1QsS0FBSztzQkFBN0MsWUFBWTt1QkFBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNVLGVBQWU7c0JBQS9ELFlBQVk7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBEb0NoZWNrLFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtQ29udHJvbE5hbWUsIE5nTW9kZWwsIFZhbGlkYXRpb25FcnJvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIG1lcmdlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTWVzc2FnZXNDb21wb25lbnQgfSBmcm9tICcuL21lc3NhZ2VzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuLyoqXG4gKiBBIGZvcm0gZ3JvdXAgaGVscHMgdG8gdmFsaWRhdGUgYW4gaW5wdXQgb2YgYSBmb3JtIGVsZW1lbnQuXG4gKlxuICogYGBgaHRtbFxuICogIDxjOHktZm9ybS1ncm91cCBbaGFzV2FybmluZ109XCJ1c2VyLmVtYWlsLmxlbmd0aCA9PT0gMFwiPlxuICogICA8bGFiZWwgdHJhbnNsYXRlIGZvcj1cInVzZXJFbWFpbFwiPkVtYWlsPC9sYWJlbD5cbiAqICAgPGlucHV0XG4gKiAgICAgaWQ9XCJ1c2VyRW1haWxcIlxuICogICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAqICAgICB0eXBlPVwiZW1haWxcIlxuICogICAgIG5hbWU9XCJlbWFpbFwiXG4gKiAgICAgW21heGxlbmd0aF09XCIyNTRcIlxuICogICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gKiAgICAgcGxhY2Vob2xkZXI9XCJ7eydlLmcuIGpvZS5kb2VAZXhtcGwuY29tJyB8IHRyYW5zbGF0ZX19XCJcbiAqICAgICBbKG5nTW9kZWwpXT1cInVzZXIuZW1haWxcIlxuICogICAgIGVtYWlsXG4gKiAgICAgcmVxdWlyZWRcbiAqICAgPlxuICogICA8Yzh5LW1lc3NhZ2VzPlxuICogICAgIDxjOHktbWVzc2FnZSAqbmdJZj1cInVzZXIuZW1haWwubGVuZ3RoID09PSAwXCIgdHJhbnNsYXRlPjwvYzh5LW1lc3NhZ2U+XG4gKiAgICAgPGM4eS1tZXNzYWdlIG5hbWU9XCJyZXF1aXJlZFwiIHRleHQ9XCJUaGUgRS1NYWlsIGlzIFNVUEVSIHJlcXVpcmVkXCI+PC9jOHktbWVzc2FnZT5cbiAqICAgPC9jOHktbWVzc2FnZXM+XG4gKiAgPC9jOHktZm9ybS1ncm91cD5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzdGF0dXMgVGhlIGN1cnJlbnQgc3RhdHVzIGNvdWxkIGJlIGVycm9yLCB3YXJuaW5nIG9yIHN1Y2Nlc3MuXG4gKiBAcGFyYW0gaGFzRXJyb3IgU2V0IHRoaXMgdG8gdHJ1ZSB0byBkaXNwbGF5IGEgZXJyb3IuXG4gKiBAcGFyYW0gaGFzV2FybmluZyBTZXQgdGhpcyB0byB0cnVlIHRvIGRpc3BsYXkgYSB3YXJuaW5nLlxuICogQHBhcmFtIGhhc1N1Y2Nlc3MgU2V0IHRoaXMgdG8gdHJ1ZSB0byBkaXNwbGF5IGEgc3VjY2Vzcy5cbiAqIEBwYXJhbSBub3ZhbGlkYXRpb24gU2V0IHRoaXMgdG8gdHJ1ZSB0byBkaXNhYmxlIGF1dG9tYXRpYyB2YWxpZGF0aW9uIGJ5IHRoaXMgY29tcG9uZW50LlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktZm9ybS1ncm91cCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLWdyb3VwLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAnZm9ybS1ncm91cCdcbiAgfSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW01lc3NhZ2VzQ29tcG9uZW50LCBOZ0lmXVxufSlcbmV4cG9ydCBjbGFzcyBGb3JtR3JvdXBDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBEb0NoZWNrLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBoYXNFcnJvciA9IGZhbHNlO1xuICBASW5wdXQoKSBoYXNXYXJuaW5nID0gZmFsc2U7XG4gIEBJbnB1dCgpIGhhc1N1Y2Nlc3MgPSBmYWxzZTtcbiAgQElucHV0KCkgbm92YWxpZGF0aW9uID0gZmFsc2U7XG4gIEBJbnB1dCgpIHN0YXR1czogc3RyaW5nO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuaGFzLWVycm9yJykgZ2V0IGVycm9yKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gJ2Vycm9yJyB8fCB0aGlzLmhhc0Vycm9yO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3MuaGFzLXdhcm5pbmcnKSBnZXQgd2FybmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXMgPT09ICd3YXJuaW5nJyB8fCB0aGlzLmhhc1dhcm5pbmc7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5oYXMtc3VjY2VzcycpIGdldCBzdWNjZXNzKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnIHx8IHRoaXMuaGFzU3VjY2VzcztcbiAgfVxuXG4gIEBDb250ZW50Q2hpbGQoTWVzc2FnZXNDb21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KSBjdXN0b21FcnJvck1lc3NhZ2U6IE1lc3NhZ2VzQ29tcG9uZW50O1xuICBAQ29udGVudENoaWxkKE5nTW9kZWwsIHsgc3RhdGljOiB0cnVlIH0pIG1vZGVsOiBOZ01vZGVsO1xuICBAQ29udGVudENoaWxkKEZvcm1Db250cm9sTmFtZSwgeyBzdGF0aWM6IHRydWUgfSkgZm9ybUNvbnRyb2xOYW1lOiBGb3JtQ29udHJvbE5hbWU7XG5cbiAgZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzO1xuXG4gIHByaXZhdGUgY29udHJvbDogRm9ybUNvbnRyb2wgfCBOZ01vZGVsO1xuICBwcml2YXRlIGNvbnRyb2xUb3VjaGVkJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgVkFMSURBVElPTl9ERUJPVU5DRV9NUyA9IDEwMDtcblxuICBwcml2YXRlIGRlc3Ryb3llZCQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXROZ01vZGVsKCk7XG4gICAgdGhpcy5pbml0Rm9ybUNvbnRyb2woKTtcbiAgfVxuXG4gIGluaXROZ01vZGVsKCkge1xuICAgIGlmICh0aGlzLm1vZGVsKSB7XG4gICAgICB0aGlzLm9ic2VydmVDb250cm9sKHRoaXMubW9kZWwpO1xuICAgIH1cbiAgfVxuXG4gIGluaXRGb3JtQ29udHJvbCgpIHtcbiAgICBpZiAodGhpcy5mb3JtQ29udHJvbE5hbWUpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZUNvbnRyb2wodGhpcy5mb3JtQ29udHJvbE5hbWUuY29udHJvbCk7XG4gICAgfVxuICB9XG5cbiAgb2JzZXJ2ZUNvbnRyb2woY29udHJvbDogRm9ybUNvbnRyb2wgfCBOZ01vZGVsKSB7XG4gICAgdGhpcy5jb250cm9sID0gY29udHJvbDtcbiAgICB0aGlzLmNvbnRyb2xUb3VjaGVkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oY29udHJvbC50b3VjaGVkKTtcbiAgICBtZXJnZShjb250cm9sLnZhbHVlQ2hhbmdlcywgY29udHJvbC5zdGF0dXNDaGFuZ2VzLCB0aGlzLmNvbnRyb2xUb3VjaGVkJClcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKCkgPT4gKGNvbnRyb2wuZGlydHkgfHwgY29udHJvbC50b3VjaGVkKSAmJiAhdGhpcy5ub3ZhbGlkYXRpb24pLFxuICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5WQUxJREFUSU9OX0RFQk9VTkNFX01TKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVFcnJvcnMoY29udHJvbCkpO1xuICB9XG5cbiAgdXBkYXRlRXJyb3JzKGNvbnRyb2w6IEZvcm1Db250cm9sIHwgTmdNb2RlbCkge1xuICAgIHRoaXMuaGFzRXJyb3IgPSBjb250cm9sLnRvdWNoZWQgJiYgY29udHJvbC5zdGF0dXMgPT09ICdJTlZBTElEJztcbiAgICBjb25zdCBlcnJvcnMgPSB0aGlzLmhhc0Vycm9yID8gY29udHJvbC5lcnJvcnMgOiB7fTtcbiAgICBpZiAodGhpcy5jdXN0b21FcnJvck1lc3NhZ2UpIHtcbiAgICAgIHRoaXMuY3VzdG9tRXJyb3JNZXNzYWdlLmNoYW5nZVZpc2liaWxpdHkoZXJyb3JzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgfVxuICB9XG5cbiAgbmdEb0NoZWNrKCkge1xuICAgIGlmICh0aGlzLmNvbnRyb2xUb3VjaGVkJCkge1xuICAgICAgaWYgKHRoaXMuY29udHJvbFRvdWNoZWQkLnZhbHVlICE9PSB0aGlzLmNvbnRyb2wudG91Y2hlZCkge1xuICAgICAgICB0aGlzLmNvbnRyb2xUb3VjaGVkJC5uZXh0KHRoaXMuY29udHJvbC50b3VjaGVkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3llZCQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveWVkJC5jb21wbGV0ZSgpO1xuICB9XG59XG4iLCI8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48Yzh5LW1lc3NhZ2VzICpuZ0lmPVwiIWN1c3RvbUVycm9yTWVzc2FnZVwiIFtzaG93XT1cImVycm9yc1wiPjwvYzh5LW1lc3NhZ2VzPlxuIl19