@fovestta2/web-angular 1.0.26 → 1.0.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -53,8 +53,9 @@ export class FvNumberFieldComponent {
53
53
  return;
54
54
  const result = Validator.validate(value, this.schema);
55
55
  this.errorMessage = result.errorKey;
56
+ const customMessage = result.message;
56
57
  if (!result.isValid && result.errorKey) {
57
- this.control.setErrors({ [result.errorKey]: true });
58
+ this.control.setErrors({ [result.errorKey]: true, message: customMessage });
58
59
  }
59
60
  else {
60
61
  this.control.setErrors(null);
@@ -75,10 +76,14 @@ export class FvNumberFieldComponent {
75
76
  getErrorMessage() {
76
77
  if (!this.errorMessage)
77
78
  return '';
79
+ if (this.control?.errors?.['message']) {
80
+ return this.control.errors['message'];
81
+ }
78
82
  const errorMessages = {
79
83
  ERR_REQUIRED: 'This field is required',
80
84
  ERR_NUMERIC_INVALID: 'Please enter a valid number',
81
85
  ERR_RANGE_INVALID: 'Number is out of range',
86
+ ERR_DUPLICATE: 'This value already exists',
82
87
  };
83
88
  return errorMessages[this.errorMessage] || this.errorMessage;
84
89
  }
@@ -113,4 +118,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
113
118
  }], focus: [{
114
119
  type: Output
115
120
  }] } });
116
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnYtbnVtYmVyLWZpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Z2LWNvbnRyb2xzL3NyYy9saWIvZnYtbnVtYmVyLWZpZWxkL2Z2LW51bWJlci1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mdi1jb250cm9scy9zcmMvbGliL2Z2LW51bWJlci1maWVsZC9mdi1udW1iZXItZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sR0FHUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFlLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEUsT0FBTyxFQUFFLFNBQVMsRUFBb0IsTUFBTSw4QkFBOEIsQ0FBQzs7OztBQVMzRSxNQUFNLE9BQU8sc0JBQXNCO0lBQ3hCLEtBQUssR0FBVyxFQUFFLENBQUM7SUFDbkIsV0FBVyxHQUFXLEVBQUUsQ0FBQztJQUN6QixNQUFNLENBQW9CO0lBQzFCLE9BQU8sQ0FBZTtJQUN0QixRQUFRLEdBQVksS0FBSyxDQUFDO0lBQzFCLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFDMUIsR0FBRyxDQUFPO0lBQ1YsR0FBRyxDQUFPO0lBQ1YsSUFBSSxHQUFXLENBQUMsQ0FBQztJQUVoQixXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQUN6QyxJQUFJLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUNoQyxLQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUUzQyxZQUFZLEdBQWtCLElBQUksQ0FBQztJQUMzQixZQUFZLENBQWdCO0lBRXBDLFFBQVE7UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8s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LG1CQUFtQixFQUFFLDZCQUE2QjtZQUNsRCxpQkFBaUIsRUFBRSx3QkFBd0I7U0FDNUMsQ0FBQztRQUVGLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQy9ELENBQUM7d0dBN0ZVLHNCQUFzQjs0RkFBdEIsc0JBQXNCLHVWQ3RCbkMsaXFCQWFNLDIxQ0RLTSxZQUFZLGtJQUFFLG1CQUFtQjs7NEZBSWhDLHNCQUFzQjtrQkFQbEMsU0FBUzsrQkFDRSxpQkFBaUIsY0FDZixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLENBQUM7OEJBS25DLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLEtBQUs7c0JBQWQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBWYWxpZGF0b3IsIFZhbGlkYXRpb25TY2hlbWEgfSBmcm9tICdAZm92ZXN0dGEyL3ZhbGlkYXRpb24tZW5naW5lJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZnYtbnVtYmVyLWZpZWxkJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9mdi1udW1iZXItZmllbGQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9mdi1udW1iZXItZmllbGQuY29tcG9uZW50LmNzcycsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGdk51bWJlckZpZWxkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XHJcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBzY2hlbWEhOiBWYWxpZGF0aW9uU2NoZW1hO1xyXG4gIEBJbnB1dCgpIGNvbnRyb2whOiBGb3JtQ29udHJvbDtcclxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgbWluPzogYW55O1xyXG4gIEBJbnB1dCgpIG1heD86IGFueTtcclxuICBASW5wdXQoKSBzdGVwOiBudW1iZXIgPSAxO1xyXG5cclxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcclxuICBAT3V0cHV0KCkgYmx1ciA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgZm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIGVycm9yTWVzc2FnZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNvbnRyb2wpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRnZOdW1iZXJGaWVsZDogY29udHJvbCBpcyByZXF1aXJlZCcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnNjaGVtYSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ0Z2TnVtYmVyRmllbGQ6IHNjaGVtYSBpcyBub3QgcHJvdmlkZWQnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5jb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGVWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnZhbGlkYXRlVmFsdWUodGhpcy5jb250cm9sLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snZGlzYWJsZWQnXSAmJiB0aGlzLmNvbnRyb2wpIHtcclxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgICB0aGlzLmNvbnRyb2wuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jb250cm9sLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmFsaWRhdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc2NoZW1hKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gVmFsaWRhdG9yLnZhbGlkYXRlKHZhbHVlLCB0aGlzLnNjaGVtYSk7XHJcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9IHJlc3VsdC5lcnJvcktleTtcclxuXHJcbiAgICBpZiAoIXJlc3VsdC5pc1ZhbGlkICYmIHJlc3VsdC5lcnJvcktleSkge1xyXG4gICAgICB0aGlzLmNvbnRyb2wuc2V0RXJyb3JzKHsgW3Jlc3VsdC5lcnJvcktleV06IHRydWUgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNvbnRyb2wuc2V0RXJyb3JzKG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25CbHVyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLnNjaGVtYSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRlVmFsdWUodGhpcy5jb250cm9sLnZhbHVlKTtcclxuICAgIH1cclxuICAgIHRoaXMuYmx1ci5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBvbkZvY3VzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5mb2N1cy5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBpc1JlcXVpcmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5zY2hlbWE/LnJ1bGVzPy5zb21lKFxyXG4gICAgICAgIChyKSA9PiByLm5hbWUgPT09ICdyZXF1aXJlZCcgJiYgci5wYXJhbXM/LlsnZW5hYmxlZCddXHJcbiAgICAgICkgfHwgZmFsc2VcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRFcnJvck1lc3NhZ2UoKTogc3RyaW5nIHtcclxuICAgIGlmICghdGhpcy5lcnJvck1lc3NhZ2UpIHJldHVybiAnJztcclxuXHJcbiAgICBjb25zdCBlcnJvck1lc3NhZ2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gICAgICBFUlJfUkVRVUlSRUQ6ICdUaGlzIGZpZWxkIGlzIHJlcXVpcmVkJyxcclxuICAgICAgRVJSX05VTUVSSUNfSU5WQUxJRDogJ1BsZWFzZSBlbnRlciBhIHZhbGlkIG51bWJlcicsXHJcbiAgICAgIEVSUl9SQU5HRV9JTlZBTElEOiAnTnVtYmVyIGlzIG91dCBvZiByYW5nZScsXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBlcnJvck1lc3NhZ2VzW3RoaXMuZXJyb3JNZXNzYWdlXSB8fCB0aGlzLmVycm9yTWVzc2FnZTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImZ2LW51bWJlci1maWVsZC1jb250YWluZXJcIj5cclxuICA8bGFiZWwgKm5nSWY9XCJsYWJlbFwiIGNsYXNzPVwiZnYtbGFiZWxcIj5cclxuICAgIHt7IGxhYmVsIH19XHJcbiAgICA8c3BhbiAqbmdJZj1cImlzUmVxdWlyZWQoKVwiIGNsYXNzPVwiZnYtcmVxdWlyZWQtYXN0ZXJpc2tcIj4qPC9zcGFuPlxyXG4gIDwvbGFiZWw+XHJcblxyXG4gIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIiBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIiBbcmVhZG9ubHldPVwicmVhZG9ubHlcIiBbbWluXT1cIm1pblwiIFttYXhdPVwibWF4XCJcclxuICAgIFtzdGVwXT1cInN0ZXBcIiAoYmx1cik9XCJvbkJsdXIoKVwiIChmb2N1cyk9XCJvbkZvY3VzKClcIiBjbGFzcz1cImZ2LWlucHV0XCJcclxuICAgIFtjbGFzcy5mdi1pbnB1dC1lcnJvcl09XCJlcnJvck1lc3NhZ2UgJiYgY29udHJvbD8udG91Y2hlZFwiIFtjbGFzcy5mdi1pbnB1dC1kaXNhYmxlZF09XCJkaXNhYmxlZFwiIC8+XHJcblxyXG4gIDxzcGFuICpuZ0lmPVwiZXJyb3JNZXNzYWdlICYmIGNvbnRyb2w/LnRvdWNoZWRcIiBjbGFzcz1cImZ2LWVycm9yLW1lc3NhZ2VcIj5cclxuICAgIHt7IGdldEVycm9yTWVzc2FnZSgpIH19XHJcbiAgPC9zcGFuPlxyXG48L2Rpdj4iXX0=
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnYtbnVtYmVyLWZpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Z2LWNvbnRyb2xzL3NyYy9saWIvZnYtbnVtYmVyLWZpZWxkL2Z2LW51bWJlci1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mdi1jb250cm9scy9zcmMvbGliL2Z2LW51bWJlci1maWVsZC9mdi1udW1iZXItZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sR0FHUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFlLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEUsT0FBTyxFQUFFLFNBQVMsRUFBb0IsTUFBTSw4QkFBOEIsQ0FBQzs7OztBQVMzRSxNQUFNLE9BQU8sc0JBQXNCO0lBQ3hCLEtBQUssR0FBVyxFQUFFLENBQUM7SUFDbkIsV0FBVyxHQUFXLEVBQUUsQ0FBQztJQUN6QixNQUFNLENBQW9CO0lBQzFCLE9BQU8sQ0FBZTtJQUN0QixRQUFRLEdBQVksS0FBSyxDQUFDO0lBQzFCLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFDMUIsR0FBRyxDQUFPO0lBQ1YsR0FBRyxDQUFPO0lBQ1YsSUFBSSxHQUFXLENBQUMsQ0FBQztJQUVoQixXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQUN6QyxJQUFJLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUNoQyxLQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUUzQyxZQUFZLEdBQWtCLElBQUksQ0FBQztJQUMzQixZQUFZLENBQWdCO0lBRXBDLFFBQVE7UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8s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LEVBQUUsQ0FBQztRQUVsQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBMkI7WUFDNUMsWUFBWSxFQUFFLHdCQUF3QjtZQUN0QyxtQkFBbUIsRUFBRSw2QkFBNkI7WUFDbEQsaUJBQWlCLEVBQUUsd0JBQXdCO1lBQzNDLGFBQWEsRUFBRSwyQkFBMkI7U0FDM0MsQ0FBQztRQUVGLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQy9ELENBQUM7d0dBbkdVLHNCQUFzQjs0RkFBdEIsc0JBQXNCLHVWQ3RCbkMsaXFCQWFNLDIxQ0RLTSxZQUFZLGtJQUFFLG1CQUFtQjs7NEZBSWhDLHNCQUFzQjtrQkFQbEMsU0FBUzsrQkFDRSxpQkFBaUIsY0FDZixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLENBQUM7OEJBS25DLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLEtBQUs7c0JBQWQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBWYWxpZGF0b3IsIFZhbGlkYXRpb25TY2hlbWEgfSBmcm9tICdAZm92ZXN0dGEyL3ZhbGlkYXRpb24tZW5naW5lJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZnYtbnVtYmVyLWZpZWxkJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9mdi1udW1iZXItZmllbGQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9mdi1udW1iZXItZmllbGQuY29tcG9uZW50LmNzcycsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGdk51bWJlckZpZWxkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XHJcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBzY2hlbWEhOiBWYWxpZGF0aW9uU2NoZW1hO1xyXG4gIEBJbnB1dCgpIGNvbnRyb2whOiBGb3JtQ29udHJvbDtcclxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgbWluPzogYW55O1xyXG4gIEBJbnB1dCgpIG1heD86IGFueTtcclxuICBASW5wdXQoKSBzdGVwOiBudW1iZXIgPSAxO1xyXG5cclxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcclxuICBAT3V0cHV0KCkgYmx1ciA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgZm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIGVycm9yTWVzc2FnZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNvbnRyb2wpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRnZOdW1iZXJGaWVsZDogY29udHJvbCBpcyByZXF1aXJlZCcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnNjaGVtYSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ0Z2TnVtYmVyRmllbGQ6IHNjaGVtYSBpcyBub3QgcHJvdmlkZWQnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5jb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGVWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnZhbGlkYXRlVmFsdWUodGhpcy5jb250cm9sLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snZGlzYWJsZWQnXSAmJiB0aGlzLmNvbnRyb2wpIHtcclxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgICB0aGlzLmNvbnRyb2wuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jb250cm9sLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmFsaWRhdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc2NoZW1hKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gVmFsaWRhdG9yLnZhbGlkYXRlKHZhbHVlLCB0aGlzLnNjaGVtYSk7XHJcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9IHJlc3VsdC5lcnJvcktleTtcclxuICAgIGNvbnN0IGN1c3RvbU1lc3NhZ2UgPSByZXN1bHQubWVzc2FnZTtcclxuXHJcbiAgICBpZiAoIXJlc3VsdC5pc1ZhbGlkICYmIHJlc3VsdC5lcnJvcktleSkge1xyXG4gICAgICB0aGlzLmNvbnRyb2wuc2V0RXJyb3JzKHsgW3Jlc3VsdC5lcnJvcktleV06IHRydWUsIG1lc3NhZ2U6IGN1c3RvbU1lc3NhZ2UgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNvbnRyb2wuc2V0RXJyb3JzKG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25CbHVyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLnNjaGVtYSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRlVmFsdWUodGhpcy5jb250cm9sLnZhbHVlKTtcclxuICAgIH1cclxuICAgIHRoaXMuYmx1ci5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBvbkZvY3VzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5mb2N1cy5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBpc1JlcXVpcmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5zY2hlbWE/LnJ1bGVzPy5zb21lKFxyXG4gICAgICAgIChyKSA9PiByLm5hbWUgPT09ICdyZXF1aXJlZCcgJiYgci5wYXJhbXM/LlsnZW5hYmxlZCddXHJcbiAgICAgICkgfHwgZmFsc2VcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRFcnJvck1lc3NhZ2UoKTogc3RyaW5nIHtcclxuICAgIGlmICghdGhpcy5lcnJvck1lc3NhZ2UpIHJldHVybiAnJztcclxuXHJcbiAgICBpZiAodGhpcy5jb250cm9sPy5lcnJvcnM/LlsnbWVzc2FnZSddKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbnRyb2wuZXJyb3JzWydtZXNzYWdlJ107XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZXJyb3JNZXNzYWdlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcclxuICAgICAgRVJSX1JFUVVJUkVEOiAnVGhpcyBmaWVsZCBpcyByZXF1aXJlZCcsXHJcbiAgICAgIEVSUl9OVU1FUklDX0lOVkFMSUQ6ICdQbGVhc2UgZW50ZXIgYSB2YWxpZCBudW1iZXInLFxyXG4gICAgICBFUlJfUkFOR0VfSU5WQUxJRDogJ051bWJlciBpcyBvdXQgb2YgcmFuZ2UnLFxyXG4gICAgICBFUlJfRFVQTElDQVRFOiAnVGhpcyB2YWx1ZSBhbHJlYWR5IGV4aXN0cycsXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBlcnJvck1lc3NhZ2VzW3RoaXMuZXJyb3JNZXNzYWdlXSB8fCB0aGlzLmVycm9yTWVzc2FnZTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImZ2LW51bWJlci1maWVsZC1jb250YWluZXJcIj5cclxuICA8bGFiZWwgKm5nSWY9XCJsYWJlbFwiIGNsYXNzPVwiZnYtbGFiZWxcIj5cclxuICAgIHt7IGxhYmVsIH19XHJcbiAgICA8c3BhbiAqbmdJZj1cImlzUmVxdWlyZWQoKVwiIGNsYXNzPVwiZnYtcmVxdWlyZWQtYXN0ZXJpc2tcIj4qPC9zcGFuPlxyXG4gIDwvbGFiZWw+XHJcblxyXG4gIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIiBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIiBbcmVhZG9ubHldPVwicmVhZG9ubHlcIiBbbWluXT1cIm1pblwiIFttYXhdPVwibWF4XCJcclxuICAgIFtzdGVwXT1cInN0ZXBcIiAoYmx1cik9XCJvbkJsdXIoKVwiIChmb2N1cyk9XCJvbkZvY3VzKClcIiBjbGFzcz1cImZ2LWlucHV0XCJcclxuICAgIFtjbGFzcy5mdi1pbnB1dC1lcnJvcl09XCJlcnJvck1lc3NhZ2UgJiYgY29udHJvbD8udG91Y2hlZFwiIFtjbGFzcy5mdi1pbnB1dC1kaXNhYmxlZF09XCJkaXNhYmxlZFwiIC8+XHJcblxyXG4gIDxzcGFuICpuZ0lmPVwiZXJyb3JNZXNzYWdlICYmIGNvbnRyb2w/LnRvdWNoZWRcIiBjbGFzcz1cImZ2LWVycm9yLW1lc3NhZ2VcIj5cclxuICAgIHt7IGdldEVycm9yTWVzc2FnZSgpIH19XHJcbiAgPC9zcGFuPlxyXG48L2Rpdj4iXX0=
@@ -59,8 +59,9 @@ class FvEntryFieldComponent {
59
59
  return;
60
60
  const result = Validator.validate(value, this.schema);
61
61
  this.errorMessage = result.errorKey;
62
+ const customMessage = result.message;
62
63
  if (!result.isValid && result.errorKey) {
63
- this.control.setErrors({ [result.errorKey]: true });
64
+ this.control.setErrors({ [result.errorKey]: true, message: customMessage });
64
65
  }
65
66
  else {
66
67
  this.control.setErrors(null);
@@ -101,12 +102,17 @@ class FvEntryFieldComponent {
101
102
  getErrorMessage() {
102
103
  if (!this.errorMessage)
103
104
  return '';
105
+ // If there is a custom message in the control errors, use it
106
+ if (this.control?.errors?.['message']) {
107
+ return this.control.errors['message'];
108
+ }
104
109
  // You can implement a translation service here
105
110
  const errorMessages = {
106
111
  ERR_REQUIRED: 'This field is required',
107
112
  ERR_MIN_LENGTH: 'Value is too short',
108
113
  ERR_MAX_LENGTH: 'Value is too long',
109
114
  ERR_REGEX_MISMATCH: 'Invalid format',
115
+ ERR_DUPLICATE: 'This value already exists',
110
116
  };
111
117
  return errorMessages[this.errorMessage] || this.errorMessage;
112
118
  }
@@ -473,8 +479,9 @@ class FvNumberFieldComponent {
473
479
  return;
474
480
  const result = Validator.validate(value, this.schema);
475
481
  this.errorMessage = result.errorKey;
482
+ const customMessage = result.message;
476
483
  if (!result.isValid && result.errorKey) {
477
- this.control.setErrors({ [result.errorKey]: true });
484
+ this.control.setErrors({ [result.errorKey]: true, message: customMessage });
478
485
  }
479
486
  else {
480
487
  this.control.setErrors(null);
@@ -495,10 +502,14 @@ class FvNumberFieldComponent {
495
502
  getErrorMessage() {
496
503
  if (!this.errorMessage)
497
504
  return '';
505
+ if (this.control?.errors?.['message']) {
506
+ return this.control.errors['message'];
507
+ }
498
508
  const errorMessages = {
499
509
  ERR_REQUIRED: 'This field is required',
500
510
  ERR_NUMERIC_INVALID: 'Please enter a valid number',
501
511
  ERR_RANGE_INVALID: 'Number is out of range',
512
+ ERR_DUPLICATE: 'This value already exists',
502
513
  };
503
514
  return errorMessages[this.errorMessage] || this.errorMessage;
504
515
  }
@@ -712,8 +723,9 @@ class FvDropdownComponent {
712
723
  return;
713
724
  const result = Validator.validate(value, this.schema);
714
725
  this.errorMessage = result.errorKey;
726
+ const customMessage = result.message;
715
727
  if (!result.isValid && result.errorKey) {
716
- this.control.setErrors({ [result.errorKey]: true });
728
+ this.control.setErrors({ [result.errorKey]: true, message: customMessage });
717
729
  }
718
730
  else {
719
731
  this.control.setErrors(null);
@@ -936,9 +948,13 @@ class FvDropdownComponent {
936
948
  getErrorMessage() {
937
949
  if (!this.errorMessage)
938
950
  return '';
951
+ if (this.control?.errors?.['message']) {
952
+ return this.control.errors['message'];
953
+ }
939
954
  const errorMessages = {
940
955
  ERR_REQUIRED: 'This field is required',
941
956
  ERR_INVALID_VALUE: 'Invalid selection',
957
+ ERR_DUPLICATE: 'This selection already exists',
942
958
  };
943
959
  return errorMessages[this.errorMessage] || this.errorMessage;
944
960
  }
@@ -1633,6 +1649,7 @@ class FvNameCodeComponent {
1633
1649
  if (this.control.disabled !== this.disabled) {
1634
1650
  this.setDisabledState(this.control.disabled);
1635
1651
  }
1652
+ this.validateValue(this.control.value);
1636
1653
  }
1637
1654
  }
1638
1655
  filterOptions(term) {
@@ -1697,6 +1714,7 @@ class FvNameCodeComponent {
1697
1714
  this.searchControl.setValue('', { emitEvent: false });
1698
1715
  }
1699
1716
  }
1717
+ this.validateValue(value);
1700
1718
  }
1701
1719
  registerOnChange(fn) {
1702
1720
  this.onChange = fn;
@@ -1713,6 +1731,20 @@ class FvNameCodeComponent {
1713
1731
  this.searchControl.enable({ emitEvent: false });
1714
1732
  }
1715
1733
  }
1734
+ errorMessage = null;
1735
+ validateValue(value) {
1736
+ if (!this.schema || !this.control)
1737
+ return;
1738
+ const result = Validator.validate(value, this.schema);
1739
+ this.errorMessage = result.errorKey;
1740
+ const customMessage = result.message;
1741
+ if (!result.isValid && result.errorKey) {
1742
+ this.control.setErrors({ [result.errorKey]: true, message: customMessage });
1743
+ }
1744
+ else {
1745
+ this.control.setErrors(null);
1746
+ }
1747
+ }
1716
1748
  isInvalid() {
1717
1749
  if (this.control) {
1718
1750
  return this.control.invalid && (this.control.dirty || this.control.touched);
@@ -1725,24 +1757,21 @@ class FvNameCodeComponent {
1725
1757
  getErrorMessage() {
1726
1758
  if (!this.control || !this.control.errors || !this.schema)
1727
1759
  return '';
1728
- for (const errorKey of this.schema.errorPriority) {
1729
- if (this.control.hasError(errorKey)) {
1730
- const rule = this.schema.rules.find(r => r.name === (errorKey === 'required' ? 'required' : errorKey));
1731
- if (rule)
1732
- return this.getReadableError(rule.errorKey || '');
1733
- }
1760
+ if (this.control.errors['message']) {
1761
+ return this.control.errors['message'];
1762
+ }
1763
+ if (this.errorMessage) {
1764
+ const map = {
1765
+ 'ERR_REQUIRED': 'This field is required',
1766
+ 'ERR_MIN_LENGTH': 'Value is too short',
1767
+ 'ERR_DUPLICATE': 'This value already exists',
1768
+ };
1769
+ return map[this.errorMessage] || this.errorMessage;
1734
1770
  }
1735
1771
  if (this.control.hasError('required'))
1736
1772
  return 'This field is required';
1737
1773
  return 'Invalid value';
1738
1774
  }
1739
- getReadableError(key) {
1740
- const map = {
1741
- 'ERR_REQUIRED': 'This field is required',
1742
- 'ERR_MIN_LENGTH': 'Value is too short',
1743
- };
1744
- return map[key] || 'Invalid value';
1745
- }
1746
1775
  onClickOutside(event) {
1747
1776
  const clickedInside = event.target.closest('.fv-name-code-container');
1748
1777
  if (!clickedInside) {
@@ -2502,8 +2531,9 @@ class FvEmailFieldComponent {
2502
2531
  return;
2503
2532
  const result = Validator.validate(value, this.schema);
2504
2533
  this.errorMessage = result.errorKey;
2534
+ const customMessage = result.message;
2505
2535
  if (!result.isValid && result.errorKey) {
2506
- this.control.setErrors({ [result.errorKey]: true });
2536
+ this.control.setErrors({ [result.errorKey]: true, message: customMessage });
2507
2537
  }
2508
2538
  else {
2509
2539
  this.control.setErrors(null);
@@ -2524,10 +2554,14 @@ class FvEmailFieldComponent {
2524
2554
  getErrorMessage() {
2525
2555
  if (!this.errorMessage)
2526
2556
  return '';
2557
+ if (this.control?.errors?.['message']) {
2558
+ return this.control.errors['message'];
2559
+ }
2527
2560
  const errorMessages = {
2528
2561
  ERR_REQUIRED: 'Email is required',
2529
2562
  ERR_EMAIL_INVALID: 'Invalid email format',
2530
2563
  ERR_REGEX_MISMATCH: 'Invalid email format',
2564
+ ERR_DUPLICATE: 'Email already exists',
2531
2565
  };
2532
2566
  return errorMessages[this.errorMessage] || this.errorMessage;
2533
2567
  }
@@ -3210,6 +3244,7 @@ class AddUpdateFormComponent {
3210
3244
  name: 'required',
3211
3245
  params: { enabled: true },
3212
3246
  errorKey: 'ERR_REQUIRED',
3247
+ message: v.message
3213
3248
  });
3214
3249
  errorPriority.push('required');
3215
3250
  break;
@@ -3220,6 +3255,7 @@ class AddUpdateFormComponent {
3220
3255
  pattern: '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$',
3221
3256
  },
3222
3257
  errorKey: 'ERR_REGEX_MISMATCH',
3258
+ message: v.message
3223
3259
  });
3224
3260
  errorPriority.push('regex');
3225
3261
  break;
@@ -3228,6 +3264,7 @@ class AddUpdateFormComponent {
3228
3264
  name: 'minLength',
3229
3265
  params: { value: v.value },
3230
3266
  errorKey: 'ERR_MIN_LENGTH',
3267
+ message: v.message
3231
3268
  });
3232
3269
  errorPriority.push('minLength');
3233
3270
  break;
@@ -3236,6 +3273,7 @@ class AddUpdateFormComponent {
3236
3273
  name: 'maxLength',
3237
3274
  params: { value: v.value },
3238
3275
  errorKey: 'ERR_MAX_LENGTH',
3276
+ message: v.message
3239
3277
  });
3240
3278
  errorPriority.push('maxLength');
3241
3279
  break;
@@ -3244,6 +3282,7 @@ class AddUpdateFormComponent {
3244
3282
  name: 'regex',
3245
3283
  params: { pattern: v.value },
3246
3284
  errorKey: 'ERR_REGEX_MISMATCH',
3285
+ message: v.message
3247
3286
  });
3248
3287
  errorPriority.push('regex');
3249
3288
  break;
@@ -3266,6 +3305,7 @@ class AddUpdateFormComponent {
3266
3305
  name: 'min',
3267
3306
  params: { value: v.value },
3268
3307
  errorKey: 'ERR_MIN_VALUE',
3308
+ message: v.message
3269
3309
  });
3270
3310
  errorPriority.push('min');
3271
3311
  break;
@@ -3274,9 +3314,19 @@ class AddUpdateFormComponent {
3274
3314
  name: 'max',
3275
3315
  params: { value: v.value },
3276
3316
  errorKey: 'ERR_MAX_VALUE',
3317
+ message: v.message
3277
3318
  });
3278
3319
  errorPriority.push('max');
3279
3320
  break;
3321
+ case 'duplicate':
3322
+ rules.push({
3323
+ name: 'duplicate',
3324
+ params: { existingValues: v.value },
3325
+ errorKey: v.errorKey || 'ERR_DUPLICATE',
3326
+ message: v.message
3327
+ });
3328
+ errorPriority.push('duplicate');
3329
+ break;
3280
3330
  }
3281
3331
  });
3282
3332
  }
@@ -3364,6 +3414,8 @@ class AddUpdateFormComponent {
3364
3414
  return `Maximum value is ${errors['max'].max}`;
3365
3415
  if (errors['pattern'])
3366
3416
  return 'Invalid format';
3417
+ if (errors['duplicate'])
3418
+ return column?.validations?.find(v => v.type === 'duplicate')?.message || `${column?.label} already exists`;
3367
3419
  return 'Invalid field';
3368
3420
  }
3369
3421
  isFieldDisabled(column, group) {
@@ -3639,6 +3691,15 @@ class AddUpdateFormComponent {
3639
3691
  });
3640
3692
  }
3641
3693
  break;
3694
+ case 'duplicate':
3695
+ validators.push((control) => {
3696
+ const value = control.value;
3697
+ if (!value || !validation.value || !Array.isArray(validation.value))
3698
+ return null;
3699
+ const isDuplicate = validation.value.some((existing) => String(existing).toLowerCase().trim() === String(value).toLowerCase().trim());
3700
+ return isDuplicate ? { duplicate: true } : null;
3701
+ });
3702
+ break;
3642
3703
  }
3643
3704
  });
3644
3705
  return validators;
@@ -3772,6 +3833,8 @@ class AddUpdateFormComponent {
3772
3833
  return `Maximum value is ${field.errors['max'].max}`;
3773
3834
  if (field.errors['pattern'])
3774
3835
  return 'Invalid format';
3836
+ if (field.errors['duplicate'])
3837
+ return column?.validations?.find(v => v.type === 'duplicate')?.message || `${column?.label} already exists`;
3775
3838
  return 'Invalid field';
3776
3839
  }
3777
3840
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AddUpdateFormComponent, deps: [{ token: i2.FormBuilder }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });