@fovestta2/web-angular 1.0.24 → 1.0.26

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.
@@ -1007,15 +1007,45 @@ class FvFileSelectorComponent {
1007
1007
  }
1008
1008
  // Subscribe to value changes
1009
1009
  this.subscription = this.control.valueChanges.subscribe((value) => {
1010
+ this.handleValue(value);
1010
1011
  this.validateValue(value);
1011
1012
  this.valueChange.emit(value);
1012
1013
  });
1013
1014
  // Validate initial value
1014
- if (this.control.value) {
1015
- this.selectedFile = this.control.value;
1016
- }
1015
+ this.handleValue(this.control.value);
1017
1016
  this.validateValue(this.control.value);
1018
1017
  }
1018
+ handleValue(value) {
1019
+ if (!value) {
1020
+ this.selectedFile = null;
1021
+ return;
1022
+ }
1023
+ if (typeof value === 'string') {
1024
+ // Handle API URL/String
1025
+ const name = value.split('/').pop() || 'Document';
1026
+ // Guess type from extension
1027
+ const ext = name.split('.').pop()?.toLowerCase() || '';
1028
+ let type = 'application/octet-stream';
1029
+ if (ext === 'pdf')
1030
+ type = 'application/pdf';
1031
+ if (['png', 'jpg', 'jpeg', 'gif'].includes(ext))
1032
+ type = `image/${ext}`;
1033
+ if (['xls', 'xlsx'].includes(ext))
1034
+ type = 'application/vnd.ms-excel';
1035
+ if (['doc', 'docx'].includes(ext))
1036
+ type = 'application/msword';
1037
+ this.selectedFile = {
1038
+ file: new File([''], name, { type }),
1039
+ name: name,
1040
+ size: 0,
1041
+ type: type
1042
+ };
1043
+ }
1044
+ else {
1045
+ // Assume it's a FileInfo object
1046
+ this.selectedFile = value;
1047
+ }
1048
+ }
1019
1049
  ngOnDestroy() {
1020
1050
  this.subscription?.unsubscribe();
1021
1051
  }
@@ -1180,12 +1210,30 @@ class FvImageSelectorComponent {
1180
1210
  if (!this.control)
1181
1211
  return;
1182
1212
  this.subscription = this.control.valueChanges.subscribe((value) => {
1213
+ this.handleValue(value);
1183
1214
  this.validateValue(value);
1184
1215
  this.valueChange.emit(value);
1185
1216
  });
1186
- if (this.control.value) {
1187
- this.selectedImage = this.control.value;
1188
- this.validateValue(this.control.value);
1217
+ this.handleValue(this.control.value);
1218
+ this.validateValue(this.control.value);
1219
+ }
1220
+ handleValue(value) {
1221
+ if (!value) {
1222
+ this.selectedImage = null;
1223
+ return;
1224
+ }
1225
+ if (typeof value === 'string') {
1226
+ const name = value.split('/').pop() || 'Image';
1227
+ this.selectedImage = {
1228
+ file: new File([''], name, { type: 'image/jpeg' }),
1229
+ url: this.sanitizer.bypassSecurityTrustUrl(value),
1230
+ width: 0,
1231
+ height: 0,
1232
+ size: 0
1233
+ };
1234
+ }
1235
+ else {
1236
+ this.selectedImage = value;
1189
1237
  }
1190
1238
  }
1191
1239
  ngOnDestroy() {
@@ -2736,6 +2784,7 @@ class FvDocumentFieldComponent {
2736
2784
  showPreview = false;
2737
2785
  previewUrl = null;
2738
2786
  subscription;
2787
+ fileInfo = null;
2739
2788
  constructor(sanitizer) {
2740
2789
  this.sanitizer = sanitizer;
2741
2790
  }
@@ -2745,14 +2794,45 @@ class FvDocumentFieldComponent {
2745
2794
  return;
2746
2795
  }
2747
2796
  this.subscription = this.control.valueChanges.subscribe((value) => {
2797
+ this.handleValue(value);
2748
2798
  this.validateValue(value);
2749
2799
  this.valueChange.emit(value);
2750
2800
  });
2751
2801
  // Initial validation
2802
+ this.handleValue(this.control.value);
2752
2803
  if (this.control.value) {
2753
2804
  this.validateValue(this.control.value);
2754
2805
  }
2755
2806
  }
2807
+ handleValue(value) {
2808
+ if (!value) {
2809
+ this.fileInfo = null;
2810
+ return;
2811
+ }
2812
+ if (typeof value === 'string') {
2813
+ const name = value.split('/').pop() || 'Document';
2814
+ // Guess type from extension
2815
+ const ext = name.split('.').pop()?.toLowerCase() || '';
2816
+ let type = 'application/octet-stream';
2817
+ if (ext === 'pdf')
2818
+ type = 'application/pdf';
2819
+ if (['png', 'jpg', 'jpeg', 'gif'].includes(ext))
2820
+ type = `image/${ext}`;
2821
+ if (['xls', 'xlsx'].includes(ext))
2822
+ type = 'application/vnd.ms-excel';
2823
+ if (['doc', 'docx'].includes(ext))
2824
+ type = 'application/msword';
2825
+ this.fileInfo = {
2826
+ file: value, // Store the URL string as file property if strict typing allows, or cast. Interface says file: File | Blob | string. Perfect.
2827
+ name: name,
2828
+ size: 0,
2829
+ type: type
2830
+ };
2831
+ }
2832
+ else {
2833
+ this.fileInfo = value;
2834
+ }
2835
+ }
2756
2836
  ngOnDestroy() {
2757
2837
  this.subscription?.unsubscribe();
2758
2838
  }
@@ -2812,7 +2892,7 @@ class FvDocumentFieldComponent {
2812
2892
  }
2813
2893
  }
2814
2894
  viewFile() {
2815
- const fileInfo = this.control.value;
2895
+ const fileInfo = this.fileInfo;
2816
2896
  if (!fileInfo)
2817
2897
  return;
2818
2898
  const type = fileInfo.type || '';
@@ -2844,7 +2924,7 @@ class FvDocumentFieldComponent {
2844
2924
  this.previewUrl = null;
2845
2925
  }
2846
2926
  downloadFile() {
2847
- const fileInfo = this.control.value;
2927
+ const fileInfo = this.fileInfo;
2848
2928
  if (!fileInfo)
2849
2929
  return;
2850
2930
  let url;
@@ -2867,7 +2947,7 @@ class FvDocumentFieldComponent {
2867
2947
  }
2868
2948
  }
2869
2949
  getFileIcon() {
2870
- const fileInfo = this.control?.value;
2950
+ const fileInfo = this.fileInfo;
2871
2951
  if (!fileInfo)
2872
2952
  return 'description';
2873
2953
  const type = fileInfo.type || '';
@@ -2896,11 +2976,11 @@ class FvDocumentFieldComponent {
2896
2976
  return errorMessages[this.errorMessage] || this.errorMessage;
2897
2977
  }
2898
2978
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FvDocumentFieldComponent, deps: [{ token: i1$1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
2899
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: FvDocumentFieldComponent, isStandalone: true, selector: "fv-document-field", inputs: { label: "label", placeholder: "placeholder", schema: "schema", control: "control", disabled: "disabled", accept: "accept", maxSize: "maxSize" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"fv-document-field-container\">\r\n <label *ngIf=\"label\" class=\"fv-document-field-label\">\r\n {{ label }}\r\n <span *ngIf=\"isRequired()\" class=\"required-asterisk\">*</span>\r\n </label>\r\n\r\n <input #fileInput type=\"file\" [accept]=\"accept\" (change)=\"onFileSelected($event)\" style=\"display: none\" />\r\n\r\n <div *ngIf=\"!control.value; else fileUploaded\" class=\"fv-upload-btn-wrapper\">\r\n <button type=\"button\" class=\"fv-upload-button\" [disabled]=\"disabled\" (click)=\"openFileDialog()\">\r\n <span class=\"fv-upload-text\">{{ placeholder }}</span>\r\n <span class=\"fv-upload-icon-section\">\r\n <svg viewBox=\"0 0 24 24\" class=\"upload-icon\">\r\n <path d=\"M9 16h6v-6h4l-7-7-7 7h4zm-4 2h14v2H5z\" fill=\"currentColor\" />\r\n </svg>\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <ng-template #fileUploaded>\r\n <div class=\"fv-preview-row\">\r\n <div class=\"fv-preview-wrapper\" (click)=\"viewFile()\" style=\"cursor: pointer;\">\r\n <div class=\"fv-file-icon-preview\" [ngClass]=\"getFileIcon()\">\r\n <span class=\"material-icons\">{{ getFileIcon() }}</span>\r\n </div>\r\n </div>\r\n <span class=\"fv-filename\" (click)=\"viewFile()\" style=\"cursor: pointer;\">{{ control.value?.name }}</span>\r\n <button type=\"button\" class=\"fv-trash-btn\" (click)=\"removeFile()\" [disabled]=\"disabled\">\r\n <svg viewBox=\"0 0 24 24\" class=\"trash-icon\">\r\n <path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\" />\r\n </svg>\r\n </button>\r\n </div>\r\n </ng-template>\r\n\r\n <div *ngIf=\"errorMessage && control?.touched\" class=\"fv-document-error-message\">\r\n \u26A0 {{ getErrorMessage() }}\r\n </div>\r\n</div>\r\n\r\n<!-- Preview Overlay/Modal for Image -->\r\n<div *ngIf=\"showPreview\" class=\"fv-preview-overlay\" (click)=\"closePreview()\">\r\n <div class=\"fv-preview-content\" (click)=\"$event.stopPropagation()\">\r\n <img [src]=\"previewUrl\" alt=\"Preview\" />\r\n <div class=\"fv-preview-actions\">\r\n <button type=\"button\" class=\"fv-download-btn\" (click)=\"downloadFile()\">Download</button>\r\n <button type=\"button\" class=\"fv-close-btn\" (click)=\"closePreview()\">Close</button>\r\n </div>\r\n </div>\r\n</div>", styles: ["@import\"https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap\";.fv-document-field-container{display:flex;flex-direction:column;margin-bottom:16px;width:fit-content;max-width:100%;font-family:Poppins,sans-serif}.fv-document-field-label{font-size:14px;font-weight:600;color:#151d48;margin-bottom:6px;display:block}.required-asterisk{color:#e74c3c;font-weight:700}.fv-upload-button{display:flex;align-items:center;border:1px solid #dcdcdc;border-radius:8px;background:#fff;padding:0;cursor:pointer;overflow:hidden;width:100px;height:34px;transition:all .2s ease}.fv-upload-button:hover:not(:disabled){border-color:#bbb;box-shadow:0 2px 4px #0000000d}.fv-upload-button:disabled{cursor:not-allowed;background-color:#f9f9f9;opacity:.7}.fv-upload-text{flex:1;padding:0 16px;font-size:14px;color:#1f2b41;text-align:left;font-weight:500}.fv-upload-icon-section{background:#f4f5f7;padding:0 10px;border-left:1px solid #dcdcdc;display:flex;align-items:center;justify-content:center;color:#333;height:100%}.upload-icon{width:20px;height:20px}.fv-preview-row{display:flex;align-items:center;gap:8px;padding:8px 0;width:100px;box-sizing:border-box}.fv-preview-wrapper{position:relative;width:40px;height:40px}.fv-file-icon-preview{width:40px;height:40px;border-radius:8px;background:#f4f5f7;display:flex;align-items:center;justify-content:center;color:#3498db;border:1px solid #dcdcdc}.fv-file-icon-preview.picture_as_pdf{color:#e74c3c;background:#fdf2f2}.fv-file-icon-preview.image{color:#3498db;background:#f1f8fe}.fv-file-icon-preview.table_view{color:#27ae60;background:#f1f9f4}.material-icons{font-size:24px}.fv-filename{flex:1;font-size:14px;color:#666;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:300px}.fv-trash-btn{background:none;border:none;cursor:pointer;padding:6px;border-radius:50%;transition:background .2s;display:flex}.fv-trash-btn:hover:not(:disabled){background:#fee}.trash-icon{width:22px;height:22px;fill:red}.fv-document-error-message{margin-top:4px;font-size:12px;color:#e74c3c}.fv-preview-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#000c;display:flex;justify-content:center;align-items:center;z-index:10000}.fv-preview-content{position:relative;background:#fff;padding:24px;border-radius:12px;max-width:90vw;max-height:90vh;display:flex;flex-direction:column;align-items:center}.fv-preview-content img{max-width:100%;max-height:70vh;object-fit:contain;border-radius:4px;margin-bottom:20px}.fv-preview-actions{display:flex;gap:16px}.fv-preview-actions button{padding:10px 24px;border-radius:6px;border:none;cursor:pointer;font-weight:500;transition:background .2s}.fv-download-btn{background:#3498db;color:#fff}.fv-download-btn:hover{background:#2980b9}.fv-close-btn{background:#f0f0f0;color:#333}.fv-close-btn:hover{background:#e0e0e0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }] });
2979
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: FvDocumentFieldComponent, isStandalone: true, selector: "fv-document-field", inputs: { label: "label", placeholder: "placeholder", schema: "schema", control: "control", disabled: "disabled", accept: "accept", maxSize: "maxSize" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"fv-document-field-container\">\r\n <label *ngIf=\"label\" class=\"fv-document-field-label\">\r\n {{ label }}\r\n <span *ngIf=\"isRequired()\" class=\"required-asterisk\">*</span>\r\n </label>\r\n\r\n <input #fileInput type=\"file\" [accept]=\"accept\" (change)=\"onFileSelected($event)\" style=\"display: none\" />\r\n\r\n <div *ngIf=\"!fileInfo; else fileUploaded\" class=\"fv-upload-btn-wrapper\">\r\n <button type=\"button\" class=\"fv-upload-button\" [disabled]=\"disabled\" (click)=\"openFileDialog()\">\r\n <span class=\"fv-upload-text\">{{ placeholder }}</span>\r\n <span class=\"fv-upload-icon-section\">\r\n <svg viewBox=\"0 0 24 24\" class=\"upload-icon\">\r\n <path d=\"M9 16h6v-6h4l-7-7-7 7h4zm-4 2h14v2H5z\" fill=\"currentColor\" />\r\n </svg>\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <ng-template #fileUploaded>\r\n <div class=\"fv-preview-row\">\r\n <div class=\"fv-preview-wrapper\" (click)=\"viewFile()\" style=\"cursor: pointer;\">\r\n <div class=\"fv-file-icon-preview\" [ngClass]=\"getFileIcon()\">\r\n <span class=\"material-icons\">{{ getFileIcon() }}</span>\r\n </div>\r\n </div>\r\n <span class=\"fv-filename\" (click)=\"viewFile()\" style=\"cursor: pointer;\">{{ fileInfo?.name }}</span>\r\n <button type=\"button\" class=\"fv-trash-btn\" (click)=\"removeFile()\" [disabled]=\"disabled\">\r\n <svg viewBox=\"0 0 24 24\" class=\"trash-icon\">\r\n <path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\" />\r\n </svg>\r\n </button>\r\n </div>\r\n </ng-template>\r\n\r\n <div *ngIf=\"errorMessage && control?.touched\" class=\"fv-document-error-message\">\r\n \u26A0 {{ getErrorMessage() }}\r\n </div>\r\n</div>\r\n\r\n<!-- Preview Overlay/Modal for Image -->\r\n<div *ngIf=\"showPreview\" class=\"fv-preview-overlay\" (click)=\"closePreview()\">\r\n <div class=\"fv-preview-content\" (click)=\"$event.stopPropagation()\">\r\n <img [src]=\"previewUrl\" alt=\"Preview\" />\r\n <div class=\"fv-preview-actions\">\r\n <button type=\"button\" class=\"fv-download-btn\" (click)=\"downloadFile()\">Download</button>\r\n <button type=\"button\" class=\"fv-close-btn\" (click)=\"closePreview()\">Close</button>\r\n </div>\r\n </div>\r\n</div>", styles: ["@import\"https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap\";.fv-document-field-container{display:flex;flex-direction:column;margin-bottom:16px;width:fit-content;max-width:100%;font-family:Poppins,sans-serif}.fv-document-field-label{font-size:14px;font-weight:600;color:#151d48;margin-bottom:6px;display:block}.required-asterisk{color:#e74c3c;font-weight:700}.fv-upload-button{display:flex;align-items:center;border:1px solid #dcdcdc;border-radius:8px;background:#fff;padding:0;cursor:pointer;overflow:hidden;width:100px;height:34px;transition:all .2s ease}.fv-upload-button:hover:not(:disabled){border-color:#bbb;box-shadow:0 2px 4px #0000000d}.fv-upload-button:disabled{cursor:not-allowed;background-color:#f9f9f9;opacity:.7}.fv-upload-text{flex:1;padding:0 16px;font-size:14px;color:#1f2b41;text-align:left;font-weight:500}.fv-upload-icon-section{background:#f4f5f7;padding:0 10px;border-left:1px solid #dcdcdc;display:flex;align-items:center;justify-content:center;color:#333;height:100%}.upload-icon{width:20px;height:20px}.fv-preview-row{display:flex;align-items:center;gap:8px;padding:8px 0;width:100px;box-sizing:border-box}.fv-preview-wrapper{position:relative;width:40px;height:40px}.fv-file-icon-preview{width:40px;height:40px;border-radius:8px;background:#f4f5f7;display:flex;align-items:center;justify-content:center;color:#3498db;border:1px solid #dcdcdc}.fv-file-icon-preview.picture_as_pdf{color:#e74c3c;background:#fdf2f2}.fv-file-icon-preview.image{color:#3498db;background:#f1f8fe}.fv-file-icon-preview.table_view{color:#27ae60;background:#f1f9f4}.material-icons{font-size:24px}.fv-filename{flex:1;font-size:14px;color:#666;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:300px}.fv-trash-btn{background:none;border:none;cursor:pointer;padding:6px;border-radius:50%;transition:background .2s;display:flex}.fv-trash-btn:hover:not(:disabled){background:#fee}.trash-icon{width:22px;height:22px;fill:red}.fv-document-error-message{margin-top:4px;font-size:12px;color:#e74c3c}.fv-preview-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#000c;display:flex;justify-content:center;align-items:center;z-index:10000}.fv-preview-content{position:relative;background:#fff;padding:24px;border-radius:12px;max-width:90vw;max-height:90vh;display:flex;flex-direction:column;align-items:center}.fv-preview-content img{max-width:100%;max-height:70vh;object-fit:contain;border-radius:4px;margin-bottom:20px}.fv-preview-actions{display:flex;gap:16px}.fv-preview-actions button{padding:10px 24px;border-radius:6px;border:none;cursor:pointer;font-weight:500;transition:background .2s}.fv-download-btn{background:#3498db;color:#fff}.fv-download-btn:hover{background:#2980b9}.fv-close-btn{background:#f0f0f0;color:#333}.fv-close-btn:hover{background:#e0e0e0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }] });
2900
2980
  }
2901
2981
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FvDocumentFieldComponent, decorators: [{
2902
2982
  type: Component,
2903
- args: [{ standalone: true, imports: [CommonModule, ReactiveFormsModule], selector: 'fv-document-field', template: "<div class=\"fv-document-field-container\">\r\n <label *ngIf=\"label\" class=\"fv-document-field-label\">\r\n {{ label }}\r\n <span *ngIf=\"isRequired()\" class=\"required-asterisk\">*</span>\r\n </label>\r\n\r\n <input #fileInput type=\"file\" [accept]=\"accept\" (change)=\"onFileSelected($event)\" style=\"display: none\" />\r\n\r\n <div *ngIf=\"!control.value; else fileUploaded\" class=\"fv-upload-btn-wrapper\">\r\n <button type=\"button\" class=\"fv-upload-button\" [disabled]=\"disabled\" (click)=\"openFileDialog()\">\r\n <span class=\"fv-upload-text\">{{ placeholder }}</span>\r\n <span class=\"fv-upload-icon-section\">\r\n <svg viewBox=\"0 0 24 24\" class=\"upload-icon\">\r\n <path d=\"M9 16h6v-6h4l-7-7-7 7h4zm-4 2h14v2H5z\" fill=\"currentColor\" />\r\n </svg>\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <ng-template #fileUploaded>\r\n <div class=\"fv-preview-row\">\r\n <div class=\"fv-preview-wrapper\" (click)=\"viewFile()\" style=\"cursor: pointer;\">\r\n <div class=\"fv-file-icon-preview\" [ngClass]=\"getFileIcon()\">\r\n <span class=\"material-icons\">{{ getFileIcon() }}</span>\r\n </div>\r\n </div>\r\n <span class=\"fv-filename\" (click)=\"viewFile()\" style=\"cursor: pointer;\">{{ control.value?.name }}</span>\r\n <button type=\"button\" class=\"fv-trash-btn\" (click)=\"removeFile()\" [disabled]=\"disabled\">\r\n <svg viewBox=\"0 0 24 24\" class=\"trash-icon\">\r\n <path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\" />\r\n </svg>\r\n </button>\r\n </div>\r\n </ng-template>\r\n\r\n <div *ngIf=\"errorMessage && control?.touched\" class=\"fv-document-error-message\">\r\n \u26A0 {{ getErrorMessage() }}\r\n </div>\r\n</div>\r\n\r\n<!-- Preview Overlay/Modal for Image -->\r\n<div *ngIf=\"showPreview\" class=\"fv-preview-overlay\" (click)=\"closePreview()\">\r\n <div class=\"fv-preview-content\" (click)=\"$event.stopPropagation()\">\r\n <img [src]=\"previewUrl\" alt=\"Preview\" />\r\n <div class=\"fv-preview-actions\">\r\n <button type=\"button\" class=\"fv-download-btn\" (click)=\"downloadFile()\">Download</button>\r\n <button type=\"button\" class=\"fv-close-btn\" (click)=\"closePreview()\">Close</button>\r\n </div>\r\n </div>\r\n</div>", styles: ["@import\"https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap\";.fv-document-field-container{display:flex;flex-direction:column;margin-bottom:16px;width:fit-content;max-width:100%;font-family:Poppins,sans-serif}.fv-document-field-label{font-size:14px;font-weight:600;color:#151d48;margin-bottom:6px;display:block}.required-asterisk{color:#e74c3c;font-weight:700}.fv-upload-button{display:flex;align-items:center;border:1px solid #dcdcdc;border-radius:8px;background:#fff;padding:0;cursor:pointer;overflow:hidden;width:100px;height:34px;transition:all .2s ease}.fv-upload-button:hover:not(:disabled){border-color:#bbb;box-shadow:0 2px 4px #0000000d}.fv-upload-button:disabled{cursor:not-allowed;background-color:#f9f9f9;opacity:.7}.fv-upload-text{flex:1;padding:0 16px;font-size:14px;color:#1f2b41;text-align:left;font-weight:500}.fv-upload-icon-section{background:#f4f5f7;padding:0 10px;border-left:1px solid #dcdcdc;display:flex;align-items:center;justify-content:center;color:#333;height:100%}.upload-icon{width:20px;height:20px}.fv-preview-row{display:flex;align-items:center;gap:8px;padding:8px 0;width:100px;box-sizing:border-box}.fv-preview-wrapper{position:relative;width:40px;height:40px}.fv-file-icon-preview{width:40px;height:40px;border-radius:8px;background:#f4f5f7;display:flex;align-items:center;justify-content:center;color:#3498db;border:1px solid #dcdcdc}.fv-file-icon-preview.picture_as_pdf{color:#e74c3c;background:#fdf2f2}.fv-file-icon-preview.image{color:#3498db;background:#f1f8fe}.fv-file-icon-preview.table_view{color:#27ae60;background:#f1f9f4}.material-icons{font-size:24px}.fv-filename{flex:1;font-size:14px;color:#666;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:300px}.fv-trash-btn{background:none;border:none;cursor:pointer;padding:6px;border-radius:50%;transition:background .2s;display:flex}.fv-trash-btn:hover:not(:disabled){background:#fee}.trash-icon{width:22px;height:22px;fill:red}.fv-document-error-message{margin-top:4px;font-size:12px;color:#e74c3c}.fv-preview-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#000c;display:flex;justify-content:center;align-items:center;z-index:10000}.fv-preview-content{position:relative;background:#fff;padding:24px;border-radius:12px;max-width:90vw;max-height:90vh;display:flex;flex-direction:column;align-items:center}.fv-preview-content img{max-width:100%;max-height:70vh;object-fit:contain;border-radius:4px;margin-bottom:20px}.fv-preview-actions{display:flex;gap:16px}.fv-preview-actions button{padding:10px 24px;border-radius:6px;border:none;cursor:pointer;font-weight:500;transition:background .2s}.fv-download-btn{background:#3498db;color:#fff}.fv-download-btn:hover{background:#2980b9}.fv-close-btn{background:#f0f0f0;color:#333}.fv-close-btn:hover{background:#e0e0e0}\n"] }]
2983
+ args: [{ standalone: true, imports: [CommonModule, ReactiveFormsModule], selector: 'fv-document-field', template: "<div class=\"fv-document-field-container\">\r\n <label *ngIf=\"label\" class=\"fv-document-field-label\">\r\n {{ label }}\r\n <span *ngIf=\"isRequired()\" class=\"required-asterisk\">*</span>\r\n </label>\r\n\r\n <input #fileInput type=\"file\" [accept]=\"accept\" (change)=\"onFileSelected($event)\" style=\"display: none\" />\r\n\r\n <div *ngIf=\"!fileInfo; else fileUploaded\" class=\"fv-upload-btn-wrapper\">\r\n <button type=\"button\" class=\"fv-upload-button\" [disabled]=\"disabled\" (click)=\"openFileDialog()\">\r\n <span class=\"fv-upload-text\">{{ placeholder }}</span>\r\n <span class=\"fv-upload-icon-section\">\r\n <svg viewBox=\"0 0 24 24\" class=\"upload-icon\">\r\n <path d=\"M9 16h6v-6h4l-7-7-7 7h4zm-4 2h14v2H5z\" fill=\"currentColor\" />\r\n </svg>\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <ng-template #fileUploaded>\r\n <div class=\"fv-preview-row\">\r\n <div class=\"fv-preview-wrapper\" (click)=\"viewFile()\" style=\"cursor: pointer;\">\r\n <div class=\"fv-file-icon-preview\" [ngClass]=\"getFileIcon()\">\r\n <span class=\"material-icons\">{{ getFileIcon() }}</span>\r\n </div>\r\n </div>\r\n <span class=\"fv-filename\" (click)=\"viewFile()\" style=\"cursor: pointer;\">{{ fileInfo?.name }}</span>\r\n <button type=\"button\" class=\"fv-trash-btn\" (click)=\"removeFile()\" [disabled]=\"disabled\">\r\n <svg viewBox=\"0 0 24 24\" class=\"trash-icon\">\r\n <path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\" />\r\n </svg>\r\n </button>\r\n </div>\r\n </ng-template>\r\n\r\n <div *ngIf=\"errorMessage && control?.touched\" class=\"fv-document-error-message\">\r\n \u26A0 {{ getErrorMessage() }}\r\n </div>\r\n</div>\r\n\r\n<!-- Preview Overlay/Modal for Image -->\r\n<div *ngIf=\"showPreview\" class=\"fv-preview-overlay\" (click)=\"closePreview()\">\r\n <div class=\"fv-preview-content\" (click)=\"$event.stopPropagation()\">\r\n <img [src]=\"previewUrl\" alt=\"Preview\" />\r\n <div class=\"fv-preview-actions\">\r\n <button type=\"button\" class=\"fv-download-btn\" (click)=\"downloadFile()\">Download</button>\r\n <button type=\"button\" class=\"fv-close-btn\" (click)=\"closePreview()\">Close</button>\r\n </div>\r\n </div>\r\n</div>", styles: ["@import\"https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap\";.fv-document-field-container{display:flex;flex-direction:column;margin-bottom:16px;width:fit-content;max-width:100%;font-family:Poppins,sans-serif}.fv-document-field-label{font-size:14px;font-weight:600;color:#151d48;margin-bottom:6px;display:block}.required-asterisk{color:#e74c3c;font-weight:700}.fv-upload-button{display:flex;align-items:center;border:1px solid #dcdcdc;border-radius:8px;background:#fff;padding:0;cursor:pointer;overflow:hidden;width:100px;height:34px;transition:all .2s ease}.fv-upload-button:hover:not(:disabled){border-color:#bbb;box-shadow:0 2px 4px #0000000d}.fv-upload-button:disabled{cursor:not-allowed;background-color:#f9f9f9;opacity:.7}.fv-upload-text{flex:1;padding:0 16px;font-size:14px;color:#1f2b41;text-align:left;font-weight:500}.fv-upload-icon-section{background:#f4f5f7;padding:0 10px;border-left:1px solid #dcdcdc;display:flex;align-items:center;justify-content:center;color:#333;height:100%}.upload-icon{width:20px;height:20px}.fv-preview-row{display:flex;align-items:center;gap:8px;padding:8px 0;width:100px;box-sizing:border-box}.fv-preview-wrapper{position:relative;width:40px;height:40px}.fv-file-icon-preview{width:40px;height:40px;border-radius:8px;background:#f4f5f7;display:flex;align-items:center;justify-content:center;color:#3498db;border:1px solid #dcdcdc}.fv-file-icon-preview.picture_as_pdf{color:#e74c3c;background:#fdf2f2}.fv-file-icon-preview.image{color:#3498db;background:#f1f8fe}.fv-file-icon-preview.table_view{color:#27ae60;background:#f1f9f4}.material-icons{font-size:24px}.fv-filename{flex:1;font-size:14px;color:#666;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:300px}.fv-trash-btn{background:none;border:none;cursor:pointer;padding:6px;border-radius:50%;transition:background .2s;display:flex}.fv-trash-btn:hover:not(:disabled){background:#fee}.trash-icon{width:22px;height:22px;fill:red}.fv-document-error-message{margin-top:4px;font-size:12px;color:#e74c3c}.fv-preview-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#000c;display:flex;justify-content:center;align-items:center;z-index:10000}.fv-preview-content{position:relative;background:#fff;padding:24px;border-radius:12px;max-width:90vw;max-height:90vh;display:flex;flex-direction:column;align-items:center}.fv-preview-content img{max-width:100%;max-height:70vh;object-fit:contain;border-radius:4px;margin-bottom:20px}.fv-preview-actions{display:flex;gap:16px}.fv-preview-actions button{padding:10px 24px;border-radius:6px;border:none;cursor:pointer;font-weight:500;transition:background .2s}.fv-download-btn{background:#3498db;color:#fff}.fv-download-btn:hover{background:#2980b9}.fv-close-btn{background:#f0f0f0;color:#333}.fv-close-btn:hover{background:#e0e0e0}\n"] }]
2904
2984
  }], ctorParameters: () => [{ type: i1$1.DomSanitizer }], propDecorators: { label: [{
2905
2985
  type: Input
2906
2986
  }], placeholder: [{
@@ -3227,7 +3307,7 @@ class AddUpdateFormComponent {
3227
3307
  initialValue = this.formatMonthYearValue(initialValue);
3228
3308
  }
3229
3309
  groupConfig[column.name] = [
3230
- { value: initialValue, disabled: column.disabled || false },
3310
+ { value: initialValue, disabled: (typeof column.disabled === 'boolean' ? column.disabled : false) },
3231
3311
  ];
3232
3312
  });
3233
3313
  const group = this.fb.group(groupConfig);
@@ -3286,6 +3366,12 @@ class AddUpdateFormComponent {
3286
3366
  return 'Invalid format';
3287
3367
  return 'Invalid field';
3288
3368
  }
3369
+ isFieldDisabled(column, group) {
3370
+ if (typeof column.disabled === 'function') {
3371
+ return column.disabled(group);
3372
+ }
3373
+ return column.disabled || false;
3374
+ }
3289
3375
  initializeForm() {
3290
3376
  this.submitted = false;
3291
3377
  const formGroupConfig = {};
@@ -3303,7 +3389,7 @@ class AddUpdateFormComponent {
3303
3389
  initialValue = this.formatMonthYearValue(initialValue);
3304
3390
  }
3305
3391
  formGroupConfig[column.name] = [
3306
- { value: initialValue, disabled: column.disabled || false },
3392
+ { value: initialValue, disabled: (typeof column.disabled === 'boolean' ? column.disabled : false) },
3307
3393
  null, // We'll set validators after form creation
3308
3394
  ];
3309
3395
  // If it's a file field with an existing value, set the preview
@@ -3750,7 +3836,7 @@ class AddUpdateFormComponent {
3750
3836
  type="text"
3751
3837
  [control]="control"
3752
3838
  [schema]="getSchema(column)"
3753
- [disabled]="column.disabled || false"
3839
+ [disabled]="isFieldDisabled(column, group)"
3754
3840
  [readonly]="false"
3755
3841
  [allowAlphabetsOnly]="column.allowAlphabetsOnly || false"
3756
3842
  [maxLength]="column.maxLength || null"
@@ -3767,7 +3853,7 @@ class AddUpdateFormComponent {
3767
3853
  [placeholder]="column.placeholder || ''"
3768
3854
  [control]="control"
3769
3855
  [schema]="getSchema(column)"
3770
- [disabled]="column.disabled || false"
3856
+ [disabled]="isFieldDisabled(column, group)"
3771
3857
  (valueChange)="handleFieldChange(column.name, $event, control)"
3772
3858
  >
3773
3859
  </fv-email-field>
@@ -3781,7 +3867,7 @@ class AddUpdateFormComponent {
3781
3867
  [placeholder]="column.placeholder || ''"
3782
3868
  [control]="control"
3783
3869
  [schema]="getSchema(column)"
3784
- [disabled]="column.disabled || false"
3870
+ [disabled]="isFieldDisabled(column, group)"
3785
3871
  (valueChange)="handleFieldChange(column.name, $event, control)"
3786
3872
  >
3787
3873
  </fv-password-field>
@@ -3795,7 +3881,7 @@ class AddUpdateFormComponent {
3795
3881
  [placeholder]="column.placeholder || ''"
3796
3882
  [control]="control"
3797
3883
  [schema]="getSchema(column)"
3798
- [disabled]="column.disabled || false"
3884
+ [disabled]="isFieldDisabled(column, group)"
3799
3885
  (valueChange)="handleFieldChange(column.name, $event, control)"
3800
3886
  >
3801
3887
  </fv-number-field>
@@ -3810,7 +3896,7 @@ class AddUpdateFormComponent {
3810
3896
  [options]="column.options || []"
3811
3897
  [control]="control"
3812
3898
  [schema]="getSchema(column)"
3813
- [disabled]="column.disabled || false"
3899
+ [disabled]="isFieldDisabled(column, group)"
3814
3900
  (valueChange)="handleFieldChange(column.name, $event, control)"
3815
3901
  >
3816
3902
  </fv-dropdown>
@@ -3822,7 +3908,7 @@ class AddUpdateFormComponent {
3822
3908
  <fv-checkbox
3823
3909
  [label]="column.label"
3824
3910
  [control]="control"
3825
- [disabled]="column.disabled || false"
3911
+ [disabled]="isFieldDisabled(column, group)"
3826
3912
  (valueChange)="handleFieldChange(column.name, $event, control)"
3827
3913
  >
3828
3914
  </fv-checkbox>
@@ -3833,7 +3919,7 @@ class AddUpdateFormComponent {
3833
3919
  [label]="column.label"
3834
3920
  [options]="column.options || []"
3835
3921
  [control]="control"
3836
- [disabled]="column.disabled || false"
3922
+ [disabled]="isFieldDisabled(column, group)"
3837
3923
  [layout]="column.layout || 'vertical'"
3838
3924
  (valueChange)="handleFieldChange(column.name, $event, control)"
3839
3925
  >
@@ -3845,7 +3931,7 @@ class AddUpdateFormComponent {
3845
3931
  [label]="column.label"
3846
3932
  [control]="control"
3847
3933
  [schema]="getSchema(column)"
3848
- [disabled]="column.disabled || false"
3934
+ [disabled]="isFieldDisabled(column, group)"
3849
3935
  (valueChange)="handleFieldChange(column.name, $event, control)"
3850
3936
  >
3851
3937
  </fv-date-field>
@@ -3858,7 +3944,7 @@ class AddUpdateFormComponent {
3858
3944
  [label]="column.label"
3859
3945
  [control]="control"
3860
3946
  [schema]="getSchema(column)"
3861
- [disabled]="column.disabled || false"
3947
+ [disabled]="isFieldDisabled(column, group)"
3862
3948
  (valueChange)="handleMonthYearChange(column.name, $event, control)"
3863
3949
  >
3864
3950
  </fv-month-year-field>
@@ -3872,7 +3958,7 @@ class AddUpdateFormComponent {
3872
3958
  [placeholder]="column.placeholder || ''"
3873
3959
  [control]="control"
3874
3960
  [schema]="getSchema(column)"
3875
- [disabled]="column.disabled || false"
3961
+ [disabled]="isFieldDisabled(column, group)"
3876
3962
  (valueChange)="handleFieldChange(column.name, $event, control)"
3877
3963
  >
3878
3964
  </fv-rich-text-editor>
@@ -3885,7 +3971,7 @@ class AddUpdateFormComponent {
3885
3971
  [placeholder]="column.placeholder || 'Select image'"
3886
3972
  [control]="control"
3887
3973
  [schema]="getSchema(column)"
3888
- [disabled]="column.disabled || false"
3974
+ [disabled]="isFieldDisabled(column, group)"
3889
3975
  (valueChange)="onFileChange($event, column.name)"
3890
3976
  >
3891
3977
  </fv-image-selector>
@@ -3898,7 +3984,7 @@ class AddUpdateFormComponent {
3898
3984
  [accept]="column.accept || '*/*'"
3899
3985
  [control]="control"
3900
3986
  [schema]="getSchema(column)"
3901
- [disabled]="column.disabled || false"
3987
+ [disabled]="isFieldDisabled(column, group)"
3902
3988
  (valueChange)="onFileChange($event, column.name)"
3903
3989
  >
3904
3990
  </fv-file-selector>
@@ -3914,38 +4000,38 @@ class AddUpdateFormComponent {
3914
4000
  [options]="column.options ? mapSearchOptions(column.options) : []"
3915
4001
  [control]="control"
3916
4002
  [schema]="getSchema(column)"
3917
- [disabled]="column.disabled || false"
4003
+ [disabled]="isFieldDisabled(column, group)"
3918
4004
  (valueChange)="handleFieldChange(column.name, $event, control)"
3919
4005
  >
3920
4006
  </fv-name-code>
3921
4007
  </ng-container>
3922
4008
 
3923
4009
  <ng-container *ngIf="column.type === 'phone' && !column.hidden">
3924
- <fv-phone-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-phone-field>
4010
+ <fv-phone-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="isFieldDisabled(column, group)"></fv-phone-field>
3925
4011
  </ng-container>
3926
4012
 
3927
4013
  <ng-container *ngIf="column.type === 'uan' && !column.hidden">
3928
- <fv-uan-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-uan-field>
4014
+ <fv-uan-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="isFieldDisabled(column, group)"></fv-uan-field>
3929
4015
  </ng-container>
3930
4016
 
3931
4017
  <ng-container *ngIf="column.type === 'pf' && !column.hidden">
3932
- <fv-pf-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-pf-field>
4018
+ <fv-pf-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="isFieldDisabled(column, group)"></fv-pf-field>
3933
4019
  </ng-container>
3934
4020
 
3935
4021
  <ng-container *ngIf="column.type === 'esi' && !column.hidden">
3936
- <fv-esi-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-esi-field>
4022
+ <fv-esi-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="isFieldDisabled(column, group)"></fv-esi-field>
3937
4023
  </ng-container>
3938
4024
 
3939
4025
  <ng-container *ngIf="column.type === 'ifsc' && !column.hidden">
3940
- <fv-ifsc-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-ifsc-field>
4026
+ <fv-ifsc-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="isFieldDisabled(column, group)"></fv-ifsc-field>
3941
4027
  </ng-container>
3942
4028
 
3943
4029
  <ng-container *ngIf="column.type === 'micr' && !column.hidden">
3944
- <fv-micr-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-micr-field>
4030
+ <fv-micr-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="isFieldDisabled(column, group)"></fv-micr-field>
3945
4031
  </ng-container>
3946
4032
 
3947
4033
  <ng-container *ngIf="column.type === 'iban' && !column.hidden">
3948
- <fv-iban-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-iban-field>
4034
+ <fv-iban-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="isFieldDisabled(column, group)"></fv-iban-field>
3949
4035
  </ng-container>
3950
4036
 
3951
4037
  <ng-container *ngIf="column.type === 'service-period' && !column.hidden">
@@ -3965,7 +4051,7 @@ class AddUpdateFormComponent {
3965
4051
  [accept]="column.accept || 'application/pdf,image/*'"
3966
4052
  [control]="control"
3967
4053
  [schema]="getSchema(column)"
3968
- [disabled]="column.disabled || false"
4054
+ [disabled]="isFieldDisabled(column, group)"
3969
4055
  (valueChange)="handleFieldChange(column.name, $event, control)"
3970
4056
  >
3971
4057
  </fv-document-field>
@@ -3977,7 +4063,7 @@ class AddUpdateFormComponent {
3977
4063
  [placeholder]="column.placeholder || '--:--'"
3978
4064
  [control]="control"
3979
4065
  [schema]="getSchema(column)"
3980
- [disabled]="column.disabled || false"
4066
+ [disabled]="isFieldDisabled(column, group)"
3981
4067
  (valueChange)="handleFieldChange(column.name, $event, control)"
3982
4068
  >
3983
4069
  </fv-time-field>
@@ -4099,7 +4185,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4099
4185
  type="text"
4100
4186
  [control]="control"
4101
4187
  [schema]="getSchema(column)"
4102
- [disabled]="column.disabled || false"
4188
+ [disabled]="isFieldDisabled(column, group)"
4103
4189
  [readonly]="false"
4104
4190
  [allowAlphabetsOnly]="column.allowAlphabetsOnly || false"
4105
4191
  [maxLength]="column.maxLength || null"
@@ -4116,7 +4202,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4116
4202
  [placeholder]="column.placeholder || ''"
4117
4203
  [control]="control"
4118
4204
  [schema]="getSchema(column)"
4119
- [disabled]="column.disabled || false"
4205
+ [disabled]="isFieldDisabled(column, group)"
4120
4206
  (valueChange)="handleFieldChange(column.name, $event, control)"
4121
4207
  >
4122
4208
  </fv-email-field>
@@ -4130,7 +4216,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4130
4216
  [placeholder]="column.placeholder || ''"
4131
4217
  [control]="control"
4132
4218
  [schema]="getSchema(column)"
4133
- [disabled]="column.disabled || false"
4219
+ [disabled]="isFieldDisabled(column, group)"
4134
4220
  (valueChange)="handleFieldChange(column.name, $event, control)"
4135
4221
  >
4136
4222
  </fv-password-field>
@@ -4144,7 +4230,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4144
4230
  [placeholder]="column.placeholder || ''"
4145
4231
  [control]="control"
4146
4232
  [schema]="getSchema(column)"
4147
- [disabled]="column.disabled || false"
4233
+ [disabled]="isFieldDisabled(column, group)"
4148
4234
  (valueChange)="handleFieldChange(column.name, $event, control)"
4149
4235
  >
4150
4236
  </fv-number-field>
@@ -4159,7 +4245,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4159
4245
  [options]="column.options || []"
4160
4246
  [control]="control"
4161
4247
  [schema]="getSchema(column)"
4162
- [disabled]="column.disabled || false"
4248
+ [disabled]="isFieldDisabled(column, group)"
4163
4249
  (valueChange)="handleFieldChange(column.name, $event, control)"
4164
4250
  >
4165
4251
  </fv-dropdown>
@@ -4171,7 +4257,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4171
4257
  <fv-checkbox
4172
4258
  [label]="column.label"
4173
4259
  [control]="control"
4174
- [disabled]="column.disabled || false"
4260
+ [disabled]="isFieldDisabled(column, group)"
4175
4261
  (valueChange)="handleFieldChange(column.name, $event, control)"
4176
4262
  >
4177
4263
  </fv-checkbox>
@@ -4182,7 +4268,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4182
4268
  [label]="column.label"
4183
4269
  [options]="column.options || []"
4184
4270
  [control]="control"
4185
- [disabled]="column.disabled || false"
4271
+ [disabled]="isFieldDisabled(column, group)"
4186
4272
  [layout]="column.layout || 'vertical'"
4187
4273
  (valueChange)="handleFieldChange(column.name, $event, control)"
4188
4274
  >
@@ -4194,7 +4280,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4194
4280
  [label]="column.label"
4195
4281
  [control]="control"
4196
4282
  [schema]="getSchema(column)"
4197
- [disabled]="column.disabled || false"
4283
+ [disabled]="isFieldDisabled(column, group)"
4198
4284
  (valueChange)="handleFieldChange(column.name, $event, control)"
4199
4285
  >
4200
4286
  </fv-date-field>
@@ -4207,7 +4293,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4207
4293
  [label]="column.label"
4208
4294
  [control]="control"
4209
4295
  [schema]="getSchema(column)"
4210
- [disabled]="column.disabled || false"
4296
+ [disabled]="isFieldDisabled(column, group)"
4211
4297
  (valueChange)="handleMonthYearChange(column.name, $event, control)"
4212
4298
  >
4213
4299
  </fv-month-year-field>
@@ -4221,7 +4307,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4221
4307
  [placeholder]="column.placeholder || ''"
4222
4308
  [control]="control"
4223
4309
  [schema]="getSchema(column)"
4224
- [disabled]="column.disabled || false"
4310
+ [disabled]="isFieldDisabled(column, group)"
4225
4311
  (valueChange)="handleFieldChange(column.name, $event, control)"
4226
4312
  >
4227
4313
  </fv-rich-text-editor>
@@ -4234,7 +4320,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4234
4320
  [placeholder]="column.placeholder || 'Select image'"
4235
4321
  [control]="control"
4236
4322
  [schema]="getSchema(column)"
4237
- [disabled]="column.disabled || false"
4323
+ [disabled]="isFieldDisabled(column, group)"
4238
4324
  (valueChange)="onFileChange($event, column.name)"
4239
4325
  >
4240
4326
  </fv-image-selector>
@@ -4247,7 +4333,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4247
4333
  [accept]="column.accept || '*/*'"
4248
4334
  [control]="control"
4249
4335
  [schema]="getSchema(column)"
4250
- [disabled]="column.disabled || false"
4336
+ [disabled]="isFieldDisabled(column, group)"
4251
4337
  (valueChange)="onFileChange($event, column.name)"
4252
4338
  >
4253
4339
  </fv-file-selector>
@@ -4263,38 +4349,38 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4263
4349
  [options]="column.options ? mapSearchOptions(column.options) : []"
4264
4350
  [control]="control"
4265
4351
  [schema]="getSchema(column)"
4266
- [disabled]="column.disabled || false"
4352
+ [disabled]="isFieldDisabled(column, group)"
4267
4353
  (valueChange)="handleFieldChange(column.name, $event, control)"
4268
4354
  >
4269
4355
  </fv-name-code>
4270
4356
  </ng-container>
4271
4357
 
4272
4358
  <ng-container *ngIf="column.type === 'phone' && !column.hidden">
4273
- <fv-phone-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-phone-field>
4359
+ <fv-phone-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="isFieldDisabled(column, group)"></fv-phone-field>
4274
4360
  </ng-container>
4275
4361
 
4276
4362
  <ng-container *ngIf="column.type === 'uan' && !column.hidden">
4277
- <fv-uan-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-uan-field>
4363
+ <fv-uan-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="isFieldDisabled(column, group)"></fv-uan-field>
4278
4364
  </ng-container>
4279
4365
 
4280
4366
  <ng-container *ngIf="column.type === 'pf' && !column.hidden">
4281
- <fv-pf-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-pf-field>
4367
+ <fv-pf-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="isFieldDisabled(column, group)"></fv-pf-field>
4282
4368
  </ng-container>
4283
4369
 
4284
4370
  <ng-container *ngIf="column.type === 'esi' && !column.hidden">
4285
- <fv-esi-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-esi-field>
4371
+ <fv-esi-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="isFieldDisabled(column, group)"></fv-esi-field>
4286
4372
  </ng-container>
4287
4373
 
4288
4374
  <ng-container *ngIf="column.type === 'ifsc' && !column.hidden">
4289
- <fv-ifsc-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-ifsc-field>
4375
+ <fv-ifsc-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="isFieldDisabled(column, group)"></fv-ifsc-field>
4290
4376
  </ng-container>
4291
4377
 
4292
4378
  <ng-container *ngIf="column.type === 'micr' && !column.hidden">
4293
- <fv-micr-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-micr-field>
4379
+ <fv-micr-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="isFieldDisabled(column, group)"></fv-micr-field>
4294
4380
  </ng-container>
4295
4381
 
4296
4382
  <ng-container *ngIf="column.type === 'iban' && !column.hidden">
4297
- <fv-iban-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-iban-field>
4383
+ <fv-iban-field [label]="column.label" [control]="control" [schema]="getSchema(column)" [disabled]="isFieldDisabled(column, group)"></fv-iban-field>
4298
4384
  </ng-container>
4299
4385
 
4300
4386
  <ng-container *ngIf="column.type === 'service-period' && !column.hidden">
@@ -4314,7 +4400,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4314
4400
  [accept]="column.accept || 'application/pdf,image/*'"
4315
4401
  [control]="control"
4316
4402
  [schema]="getSchema(column)"
4317
- [disabled]="column.disabled || false"
4403
+ [disabled]="isFieldDisabled(column, group)"
4318
4404
  (valueChange)="handleFieldChange(column.name, $event, control)"
4319
4405
  >
4320
4406
  </fv-document-field>
@@ -4326,7 +4412,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4326
4412
  [placeholder]="column.placeholder || '--:--'"
4327
4413
  [control]="control"
4328
4414
  [schema]="getSchema(column)"
4329
- [disabled]="column.disabled || false"
4415
+ [disabled]="isFieldDisabled(column, group)"
4330
4416
  (valueChange)="handleFieldChange(column.name, $event, control)"
4331
4417
  >
4332
4418
  </fv-time-field>