@bsachref/ng-form
Version:
A dynamic form component for Angular using PrimeNG or Angular Material
113 lines • 15.2 kB
JavaScript
import { CommonModule } from '@angular/common';
import { ChangeDetectionStrategy, Component, input, output, } from '@angular/core';
import { ReactiveFormsModule, FormsModule, Validators, } from '@angular/forms';
import { BehaviorSubject } from 'rxjs';
import { ValidationMessagesComponent } from './validation-messages/validation-messages.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
export class BaseFormsComponent {
fb;
cdr;
formName = input.required();
controls = input.required();
formSubmit = output();
form;
formChanges$ = new BehaviorSubject(false);
constructor(fb, cdr) {
this.fb = fb;
this.cdr = cdr;
}
ngOnInit() {
this.initializeForm();
}
initializeForm() {
const formControls = {};
this.controls().forEach((control) => {
formControls[control.name] = [
control.value ?? '',
this.getValidators(control),
];
});
this.form = this.fb.group(formControls);
this.controls().forEach((control) => {
const formControl = this.form.get(control.name);
if (formControl) {
formControl.valueChanges.subscribe((value) => {
// Only update validators if the value actually changes
if (formControl.value !== value) {
this.updateValidators(formControl, value);
}
});
}
});
this.formChanges$.subscribe(() => this.cdr.markForCheck());
}
getValidators(control) {
const validators = [];
if (control.validators) {
control.validators.forEach((validator) => {
if (validator.required)
validators.push(Validators.required);
if (validator.minlength)
validators.push(Validators.minLength(validator.minlength));
if (validator.maxlength)
validators.push(Validators.maxLength(validator.maxlength));
if (validator.pattern)
validators.push(Validators.pattern(validator.pattern));
if (validator.email)
validators.push(Validators.email);
if (validator.custom)
validators.push(validator.custom);
});
}
return validators;
}
updateValidators(control, value) {
const requiresValidation = this.shouldRequireValidation(value);
// Check if the validators need to be updated
const hasRequiredValidator = control.hasValidator(Validators.required);
if (requiresValidation && !hasRequiredValidator) {
control.addValidators(Validators.required);
control.updateValueAndValidity();
}
else if (!requiresValidation && hasRequiredValidator) {
control.removeValidators(Validators.required);
control.updateValueAndValidity();
}
this.formChanges$.next(true);
}
shouldRequireValidation(value) {
return value !== null && value !== '';
}
onSubmit() {
this.form.markAllAsTouched();
this.form.markAsDirty();
this.form.updateValueAndValidity();
if (this.form.valid) {
this.formSubmit.emit(this.form.value);
this.form.reset();
}
else {
console.error('Form Invalid');
}
this.formChanges$.next(true);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BaseFormsComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.13", type: BaseFormsComponent, isStandalone: true, selector: "base-forms", inputs: { formName: { classPropertyName: "formName", publicName: "formName", isSignal: true, isRequired: true, transformFunction: null }, controls: { classPropertyName: "controls", publicName: "controls", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { formSubmit: "formSubmit" }, ngImport: i0, template: '', isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: FormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BaseFormsComponent, decorators: [{
type: Component,
args: [{
selector: 'base-forms',
standalone: true,
imports: [
CommonModule,
ReactiveFormsModule,
FormsModule,
ValidationMessagesComponent,
],
template: '',
changeDetection: ChangeDetectionStrategy.OnPush,
}]
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9uZ0Zvcm0vc3JjL2FwcC9iYXNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLFdBQVcsRUFJWCxVQUFVLEdBRVgsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDOzs7QUFlbEcsTUFBTSxPQUFPLGtCQUFrQjtJQVNqQjtJQUNBO0lBVFosUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQVUsQ0FBQztJQUNwQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBdUIsQ0FBQztJQUNqRCxVQUFVLEdBQUcsTUFBTSxFQUF1QixDQUFDO0lBRTNDLElBQUksQ0FBYTtJQUNQLFlBQVksR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUU3RCxZQUNZLEVBQWUsRUFDZixHQUFzQjtRQUR0QixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsUUFBRyxHQUFILEdBQUcsQ0FBbUI7SUFDL0IsQ0FBQztJQUVKLFFBQVE7UUFDTixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVTLGNBQWM7UUFDdEIsTUFBTSxZQUFZLEdBQTJCLEVBQUUsQ0FBQztRQUVoRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbEMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FB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WixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDaEQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIGlucHV0LFxuICBvdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgRm9ybXNNb2R1bGUsXG4gIEZvcm1Hcm91cCxcbiAgRm9ybUJ1aWxkZXIsXG4gIFZhbGlkYXRvckZuLFxuICBWYWxpZGF0b3JzLFxuICBBYnN0cmFjdENvbnRyb2wsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvbk1lc3NhZ2VzQ29tcG9uZW50IH0gZnJvbSAnLi92YWxpZGF0aW9uLW1lc3NhZ2VzL3ZhbGlkYXRpb24tbWVzc2FnZXMuY29tcG9uZW50JztcbmltcG9ydCB7IEZvcm1Db250cm9sQ29uZmlnIH0gZnJvbSAnLi4vcHVibGljLWFwaSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Jhc2UtZm9ybXMnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgVmFsaWRhdGlvbk1lc3NhZ2VzQ29tcG9uZW50LFxuICBdLFxuICB0ZW1wbGF0ZTogJycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBCYXNlRm9ybXNDb21wb25lbnQge1xuICBmb3JtTmFtZSA9IGlucHV0LnJlcXVpcmVkPHN0cmluZz4oKTtcbiAgY29udHJvbHMgPSBpbnB1dC5yZXF1aXJlZDxGb3JtQ29udHJvbENvbmZpZ1tdPigpO1xuICBmb3JtU3VibWl0ID0gb3V0cHV0PFJlY29yZDxzdHJpbmcsIGFueT4+KCk7XG5cbiAgZm9ybSE6IEZvcm1Hcm91cDtcbiAgcHJvdGVjdGVkIGZvcm1DaGFuZ2VzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJvdGVjdGVkIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVGb3JtKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5pdGlhbGl6ZUZvcm0oKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybUNvbnRyb2xzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG5cbiAgICB0aGlzLmNvbnRyb2xzKCkuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgZm9ybUNvbnRyb2xzW2NvbnRyb2wubmFtZV0gPSBbXG4gICAgICAgIGNvbnRyb2wudmFsdWUgPz8gJycsXG4gICAgICAgIHRoaXMuZ2V0VmFsaWRhdG9ycyhjb250cm9sKSxcbiAgICAgIF07XG4gICAgfSk7XG5cbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKGZvcm1Db250cm9scyk7XG5cbiAgICB0aGlzLmNvbnRyb2xzKCkuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGNvbnRyb2wubmFtZSk7XG4gICAgICBpZiAoZm9ybUNvbnRyb2wpIHtcbiAgICAgICAgZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSB2YWxpZGF0b3JzIGlmIHRoZSB2YWx1ZSBhY3R1YWxseSBjaGFuZ2VzXG4gICAgICAgICAgaWYgKGZvcm1Db250cm9sLnZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWxpZGF0b3JzKGZvcm1Db250cm9sLCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZm9ybUNoYW5nZXMkLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0VmFsaWRhdG9ycyhjb250cm9sOiBGb3JtQ29udHJvbENvbmZpZyk6IFZhbGlkYXRvckZuW10ge1xuICAgIGNvbnN0IHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBbXTtcblxuICAgIGlmIChjb250cm9sLnZhbGlkYXRvcnMpIHtcbiAgICAgIGNvbnRyb2wudmFsaWRhdG9ycy5mb3JFYWNoKCh2YWxpZGF0b3IpID0+IHtcbiAgICAgICAgaWYgKHZhbGlkYXRvci5yZXF1aXJlZCkgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICBpZiAodmFsaWRhdG9yLm1pbmxlbmd0aClcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgodmFsaWRhdG9yLm1pbmxlbmd0aCkpO1xuICAgICAgICBpZiAodmFsaWRhdG9yLm1heGxlbmd0aClcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXhMZW5ndGgodmFsaWRhdG9yLm1heGxlbmd0aCkpO1xuICAgICAgICBpZiAodmFsaWRhdG9yLnBhdHRlcm4pXG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucGF0dGVybih2YWxpZGF0b3IucGF0dGVybikpO1xuICAgICAgICBpZiAodmFsaWRhdG9yLmVtYWlsKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5lbWFpbCk7XG4gICAgICAgIGlmICh2YWxpZGF0b3IuY3VzdG9tKSB2YWxpZGF0b3JzLnB1c2godmFsaWRhdG9yLmN1c3RvbSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdG9ycztcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVWYWxpZGF0b3JzKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHJlcXVpcmVzVmFsaWRhdGlvbiA9IHRoaXMuc2hvdWxkUmVxdWlyZVZhbGlkYXRpb24odmFsdWUpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHZhbGlkYXRvcnMgbmVlZCB0byBiZSB1cGRhdGVkXG4gICAgY29uc3QgaGFzUmVxdWlyZWRWYWxpZGF0b3IgPSBjb250cm9sLmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKTtcblxuICAgIGlmIChyZXF1aXJlc1ZhbGlkYXRpb24gJiYgIWhhc1JlcXVpcmVkVmFsaWRhdG9yKSB7XG4gICAgICBjb250cm9sLmFkZFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9IGVsc2UgaWYgKCFyZXF1aXJlc1ZhbGlkYXRpb24gJiYgaGFzUmVxdWlyZWRWYWxpZGF0b3IpIHtcbiAgICAgIGNvbnRyb2wucmVtb3ZlVmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH1cblxuICAgIHRoaXMuZm9ybUNoYW5nZXMkLm5leHQodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvdWxkUmVxdWlyZVZhbGlkYXRpb24odmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gJyc7XG4gIH1cblxuICBvblN1Ym1pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgIHRoaXMuZm9ybS5tYXJrQXNEaXJ0eSgpO1xuICAgIHRoaXMuZm9ybS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG5cbiAgICBpZiAodGhpcy5mb3JtLnZhbGlkKSB7XG4gICAgICB0aGlzLmZvcm1TdWJtaXQuZW1pdCh0aGlzLmZvcm0udmFsdWUpO1xuICAgICAgdGhpcy5mb3JtLnJlc2V0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Zvcm0gSW52YWxpZCcpO1xuICAgIH1cblxuICAgIHRoaXMuZm9ybUNoYW5nZXMkLm5leHQodHJ1ZSk7XG4gIH1cbn0iXX0=