commons-shared-web-ui 0.0.21 → 0.0.23
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.
- package/fesm2022/commons-shared-web-ui.mjs +7691 -5651
- package/fesm2022/commons-shared-web-ui.mjs.map +1 -1
- package/index.d.ts +2594 -2150
- package/package.json +1 -1
- package/src/lib/modules/form-builder/form-builder.theme.scss +212 -0
- package/src/lib/styles/global.scss +4 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commons-shared-web-ui.mjs","sources":["../../../src/lib/modules/material/material.module.ts","../../../src/lib/modules/alert/components/alert/alert.component.ts","../../../src/lib/modules/alert/components/alert/alert.component.html","../../../src/lib/modules/alert/alert.module.ts","../../../src/lib/modules/button/components/button/button.component.ts","../../../src/lib/modules/button/components/button/button.component.html","../../../src/lib/modules/button/button.module.ts","../../../src/lib/modules/confirmation-modal/components/confirmation-modal/confirmation-modal.component.ts","../../../src/lib/modules/confirmation-modal/components/confirmation-modal/confirmation-modal.component.html","../../../src/lib/modules/button-dropdown/components/button-dropdown/button-dropdown.component.ts","../../../src/lib/modules/button-dropdown/components/button-dropdown/button-dropdown.component.html","../../../src/lib/modules/confirmation-modal/confirmation-modal.module.ts","../../../src/lib/modules/button-dropdown/button-dropdown.module.ts","../../../src/lib/modules/form-components/components/input/input.component.ts","../../../src/lib/modules/form-components/components/input/input.component.html","../../../src/lib/modules/form-components/directives/click-outside.directive.ts","../../../src/lib/modules/form-components/components/dropdown/dropdown.component.ts","../../../src/lib/modules/form-components/components/dropdown/dropdown.component.html","../../../src/lib/modules/form-components/components/checkbox/checkbox.component.ts","../../../src/lib/modules/form-components/components/checkbox/checkbox.component.html","../../../src/lib/modules/form-components/components/radio/radio.component.ts","../../../src/lib/modules/form-components/components/radio/radio.component.html","../../../src/lib/modules/form-components/components/toggle/toggle.component.ts","../../../src/lib/modules/form-components/components/toggle/toggle.component.html","../../../src/lib/modules/form-components/components/datepicker/datepicker.component.ts","../../../src/lib/modules/form-components/components/datepicker/datepicker.component.html","../../../src/lib/modules/form-components/components/search/search.component.ts","../../../src/lib/modules/form-components/components/search/search.component.html","../../../src/lib/modules/filter-sidebar/components/filter-sidebar/filter-sidebar.component.ts","../../../src/lib/modules/filter-sidebar/components/filter-sidebar/filter-sidebar.component.html","../../../src/lib/modules/form-components/form-components.module.ts","../../../src/lib/modules/filter-sidebar/filter-sidebar.module.ts","../../../src/lib/modules/summary-card/components/summary-card/summary-card.component.ts","../../../src/lib/modules/summary-card/components/summary-card/summary-card.component.html","../../../src/lib/modules/summary-card/summary-card.module.ts","../../../src/lib/utils/translation.utils.ts","../../../src/lib/modules/configurable-form/component/configurable-form.component.ts","../../../src/lib/modules/configurable-form/component/configurable-form.component.html","../../../src/lib/modules/configurable-form/configurable-form.module.ts","../../../src/lib/modules/smart-form/services/smart-form-controller.service.ts","../../../src/lib/modules/smart-form/utils/translation.utils.ts","../../../src/lib/modules/smart-form/services/expression.service.ts","../../../src/lib/modules/snackbar/components/snackbar.component.ts","../../../src/lib/modules/snackbar/components/snackbar.component.html","../../../src/lib/modules/snackbar/services/snackbar.service.ts","../../../src/lib/utils/string.utils.ts","../../../src/lib/modules/smart-form/utils/trusted-url.pipe.ts","../../../src/lib/modules/smart-form/components/form-field/form-field.component.ts","../../../src/lib/modules/smart-form/components/form-field/form-field.component.html","../../../src/lib/modules/smart-form/components/form-section/form-section.component.ts","../../../src/lib/modules/smart-form/components/form-section/form-section.component.html","../../../src/lib/modules/smart-form/components/smart-form/smart-form.component.ts","../../../src/lib/modules/smart-form/components/smart-form/smart-form.component.html","../../../src/lib/modules/smart-form/smart-form.module.ts","../../../src/lib/utils/constants.ts","../../../src/lib/modules/side-nav/components/side-nav/side-nav.component.ts","../../../src/lib/modules/side-nav/components/side-nav/side-nav.component.html","../../../src/lib/modules/side-nav/side-nav.module.ts","../../../src/lib/shared-ui.module.ts","../../../src/lib/utils/storage.utils.ts","../../../src/lib/modules/configurable-form/configurable-form.examples.ts","../../../src/lib/modules/pagination/components/pagination/pagination.component.ts","../../../src/lib/modules/pagination/components/pagination/pagination.component.html","../../../src/lib/modules/pagination/pagination.module.ts","../../../src/lib/modules/nav/components/nav/nav.component.ts","../../../src/lib/modules/nav/components/nav/nav.component.html","../../../src/lib/modules/nav/nav.module.ts","../../../src/lib/modules/filter/components/filter/filter.component.ts","../../../src/lib/modules/filter/components/filter/filter.component.html","../../../src/lib/modules/filter/filter.module.ts","../../../src/lib/modules/smart-table/components/smart-table/smart-table.component.ts","../../../src/lib/modules/smart-table/components/smart-table/smart-table.component.html","../../../src/lib/modules/smart-table/smart-table.module.ts","../../../src/lib/modules/smart-table/utils/smart-table.utils.ts","../../../src/lib/modules/smart-form/utils/validation.utils.ts","../../../src/lib/modules/smart-form/smart-form.examples.ts","../../../src/lib/modules/snackbar/snackbar.module.ts","../../../src/public-api.ts","../../../src/commons-shared-web-ui.ts"],"sourcesContent":["import { NgModule } from \"@angular/core\";\nimport { MatCardModule } from '@angular/material/card';\nimport { MatSnackBarModule } from \"@angular/material/snack-bar\";\nimport { MatCheckboxModule } from '@angular/material/checkbox'\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatDialogModule } from \"@angular/material/dialog\";\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from \"@angular/material/button\";\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatNativeDateModule } from \"@angular/material/core\";\nimport { MatInputModule } from '@angular/material/input';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport {MatSliderModule} from '@angular/material/slider';\nimport {MatListModule} from '@angular/material/list';\nimport {MatChipsModule} from '@angular/material/chips';\nimport {MatPaginatorModule} from '@angular/material/paginator';\nimport {MatTableModule} from '@angular/material/table';\nimport {MatExpansionModule} from '@angular/material/expansion';\nimport {CdkAccordionModule} from '@angular/cdk/accordion';\nimport { MatSortModule } from \"@angular/material/sort\";\nimport {MatAutocompleteModule} from '@angular/material/autocomplete';\nimport {MatSlideToggleModule} from '@angular/material/slide-toggle';\nimport {MatButtonToggleModule} from '@angular/material/button-toggle';\n\n@NgModule({\n imports: [\n MatCardModule,\n MatSnackBarModule,\n MatCheckboxModule,\n MatDividerModule,\n MatSelectModule,\n MatRadioModule,\n MatDialogModule,\n MatFormFieldModule,\n MatDatepickerModule,\n MatNativeDateModule,\n MatInputModule,\n MatIconModule,\n MatProgressSpinnerModule,\n MatTabsModule,\n MatButtonModule,\n MatMenuModule,\n MatTabsModule,\n MatProgressBarModule,\n MatTooltipModule,\n MatSliderModule,\n MatListModule,\n MatChipsModule,\n MatSortModule,\n MatAutocompleteModule,\n MatSlideToggleModule,\n MatButtonToggleModule\n ],\n exports: [\n MatCardModule,\n MatSnackBarModule,\n MatCheckboxModule,\n MatDividerModule,\n MatSelectModule,\n MatRadioModule,\n MatDialogModule,\n MatFormFieldModule,\n MatDatepickerModule,\n MatNativeDateModule,\n MatInputModule,\n MatIconModule,\n MatProgressSpinnerModule,\n MatTabsModule,\n MatButtonModule,\n MatMenuModule,\n MatTabsModule,\n MatProgressBarModule,\n MatTooltipModule,\n MatSliderModule,\n MatListModule,\n MatChipsModule,\n MatPaginatorModule,\n MatTableModule,\n MatExpansionModule,\n CdkAccordionModule,\n MatSortModule,\n MatAutocompleteModule,\n MatSlideToggleModule,\n MatButtonToggleModule\n ]\n})\nexport class MaterialModule { }\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { AlertLabels, AlertVariant, IconInput } from '../../alert.models';\r\n\r\n@Component({\r\n selector: 'lib-alert',\r\n templateUrl: './alert.component.html',\r\n styleUrls: ['./alert.component.scss'],\r\n standalone: false\r\n})\r\nexport class AlertComponent implements OnInit {\r\n @Input() variant: AlertVariant = 'info';\r\n @Input() title: string = '';\r\n @Input() message: string = '';\r\n @Input() icon: IconInput = true;\r\n @Input() customIcon: string = ''; // New input for custom class\r\n @Input() labels?: AlertLabels;\r\n\r\n // Customization Inputs\r\n @Input() width?: string;\r\n @Input() height?: string;\r\n @Input() borderRadius?: string;\r\n @Input() padding?: string;\r\n @Input() gap?: string;\r\n @Input() backgroundColor?: string;\r\n @Input() color?: string; // New input for custom text color\r\n @Input() borderColor?: string;\r\n @Input() fontSize?: string;\r\n @Input() fontWeight?: string;\r\n @Input() boxShadow?: string;\r\n\r\n // Granular Border Radius Customization\r\n @Input() borderTopLeftRadius?: string;\r\n @Input() borderTopRightRadius?: string;\r\n @Input() borderBottomLeftRadius?: string;\r\n @Input() borderBottomRightRadius?: string;\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n get isDefaultIcon(): boolean {\r\n return this.icon === true;\r\n }\r\n\r\n get isStringIcon(): boolean {\r\n return typeof this.icon === 'string';\r\n }\r\n\r\n get isObjectIcon(): boolean {\r\n return typeof this.icon === 'object' && this.icon !== null;\r\n }\r\n\r\n get iconString(): string {\r\n return typeof this.icon === 'string' ? this.icon : '';\r\n }\r\n\r\n get isImgIcon(): boolean {\r\n const icon = this.icon;\r\n if (typeof icon === 'string') {\r\n return icon.includes('/') || icon.includes('.') || icon.startsWith('http');\r\n }\r\n return typeof icon === 'object' && icon !== null && icon.type === 'img';\r\n }\r\n\r\n get iconObject(): { type: string; value: string } {\r\n return typeof this.icon === 'object' ? this.icon as any : { type: '', value: '' };\r\n }\r\n\r\n get defaultIconClass(): string {\r\n switch (this.variant) {\r\n case 'success': return 'fa-solid fa-circle-check';\r\n case 'warning':\r\n case 'warning-shadow': return 'fa-solid fa-triangle-exclamation';\r\n case 'error': return 'fa-solid fa-triangle-exclamation';\r\n case 'info':\r\n default: return 'fa-solid fa-circle-info';\r\n }\r\n }\r\n}\r\n","<div class=\"cc-alert\" [ngClass]=\"'cc-alert-' + variant\" [style.width]=\"width\" [style.height]=\"height\"\r\n [style.border-radius]=\"borderRadius\" [style.border-top-left-radius]=\"borderTopLeftRadius\"\r\n [style.border-top-right-radius]=\"borderTopRightRadius\" [style.border-bottom-left-radius]=\"borderBottomLeftRadius\"\r\n [style.border-bottom-right-radius]=\"borderBottomRightRadius\" [style.padding]=\"padding\" [style.gap]=\"gap\"\r\n [style.background-color]=\"backgroundColor\" [style.color]=\"color\" [style.border-color]=\"borderColor\"\r\n [style.font-size]=\"fontSize\" [style.font-weight]=\"fontWeight\" [style.box-shadow]=\"boxShadow\">\r\n\r\n <div class=\"cc-alert-icon\" *ngIf=\"icon\">\r\n <i *ngIf=\"customIcon\" [ngClass]=\"customIcon\"></i>\r\n <i *ngIf=\"!customIcon && isDefaultIcon\" [ngClass]=\"defaultIconClass\"></i>\r\n <i *ngIf=\"!customIcon && isStringIcon && !isImgIcon\" [ngClass]=\"iconString\"></i>\r\n <img *ngIf=\"!customIcon && isStringIcon && isImgIcon\" [src]=\"iconString\"\r\n [attr.alt]=\"labels?.iconAltText || 'alert icon'\" />\r\n <ng-container *ngIf=\"isObjectIcon\">\r\n <i *ngIf=\"iconObject.type === 'fontawesome'\" [ngClass]=\"iconObject.value\"></i>\r\n <span *ngIf=\"iconObject.type === 'material'\" class=\"material-icons\">{{ iconObject.value }}</span>\r\n <img *ngIf=\"iconObject.type === 'img'\" [src]=\"iconObject.value\"\r\n [attr.alt]=\"labels?.iconAltText || 'alert icon'\" />\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"cc-alert-content\">\r\n <div class=\"cc-alert-title\" *ngIf=\"title\">{{ title }}</div>\r\n <div class=\"cc-alert-message\" *ngIf=\"message\">{{ message }}</div>\r\n <ng-content></ng-content>\r\n </div>\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { AlertComponent } from './components/alert/alert.component';\r\n\r\n@NgModule({\r\n declarations: [\r\n AlertComponent\r\n ],\r\n imports: [\r\n CommonModule\r\n ],\r\n exports: [\r\n AlertComponent\r\n ]\r\n})\r\nexport class AlertModule { }\r\n","import { Component, Input, OnInit } from '@angular/core';\r\n\r\nimport { ButtonLabels, ButtonVariant } from '../../button.models';\r\n\r\n@Component({\r\n selector: 'lib-button',\r\n templateUrl: './button.component.html',\r\n styleUrls: ['./button.component.scss'],\r\n standalone: false\r\n})\r\nexport class ButtonComponent implements OnInit {\r\n\r\n @Input() variant: ButtonVariant = 'primary';\r\n @Input() type: 'button' | 'submit' | 'reset' = 'button';\r\n @Input() disabled: boolean = false;\r\n\r\n // Customization Inputs\r\n @Input() width?: string;\r\n @Input() height?: string;\r\n @Input() borderRadius?: string;\r\n @Input() fontSize?: string;\r\n @Input() fontWeight?: string;\r\n @Input() backgroundColor?: string;\r\n @Input() color?: string;\r\n @Input() border?: string;\r\n @Input() icon: boolean | string | { type: 'material' | 'fontawesome' | 'img'; value: string } = '';\r\n @Input() labels?: ButtonLabels;\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n get isDefaultIcon(): boolean {\r\n return this.icon === true;\r\n }\r\n\r\n get isStringIcon(): boolean {\r\n return typeof this.icon === 'string' && this.icon !== '';\r\n }\r\n\r\n get isImgIcon(): boolean {\r\n const icon = this.icon;\r\n if (typeof icon === 'string') {\r\n return icon.includes('/') || icon.includes('.') || icon.startsWith('http');\r\n }\r\n return typeof icon === 'object' && icon !== null && !!icon.value && (icon.type === 'img' || icon.value.includes('/') || icon.value.includes('.') || icon.value.startsWith('http'));\r\n }\r\n\r\n get isObjectIcon(): boolean {\r\n return typeof this.icon === 'object' && this.icon !== null;\r\n }\r\n\r\n get iconString(): string {\r\n return typeof this.icon === 'string' ? this.icon : '';\r\n }\r\n\r\n get iconObject(): { type: string; value: string } {\r\n return typeof this.icon === 'object' ? this.icon as any : { type: '', value: '' };\r\n }\r\n\r\n}\r\n","<button [type]=\"type\" [disabled]=\"disabled\" class=\"cc-btn\" [ngClass]=\"'cc-btn-' + variant\" [style.width]=\"width\"\r\n [style.height]=\"height\" [style.border-radius]=\"borderRadius\" [style.font-size]=\"fontSize\"\r\n [style.font-weight]=\"fontWeight\" [style.background-color]=\"backgroundColor\" [style.color]=\"color\"\r\n [style.border]=\"border\">\r\n <div class=\"cc-btn-icon-wrapper\" *ngIf=\"icon\">\r\n <!-- String Icons -->\r\n <ng-container *ngIf=\"isStringIcon\">\r\n <i *ngIf=\"!isImgIcon\" [ngClass]=\"iconString\" class=\"cc-btn-icon\"></i>\r\n <img *ngIf=\"isImgIcon\" [src]=\"iconString\" [attr.alt]=\"labels?.iconAltText || 'button icon'\"\r\n class=\"cc-btn-icon cc-btn-img-icon\" />\r\n </ng-container>\r\n\r\n <!-- Object Icons -->\r\n <ng-container *ngIf=\"isObjectIcon\">\r\n <i *ngIf=\"iconObject.type === 'fontawesome'\" [ngClass]=\"iconObject.value\" class=\"cc-btn-icon\"></i>\r\n <span *ngIf=\"iconObject.type === 'material'\" class=\"material-icons cc-btn-icon\">{{ iconObject.value }}</span>\r\n <img *ngIf=\"iconObject.type === 'img'\" [src]=\"iconObject.value\" [attr.alt]=\"labels?.iconAltText || 'button icon'\"\r\n class=\"cc-btn-icon cc-btn-img-icon\" />\r\n </ng-container>\r\n </div>\r\n <ng-content></ng-content>\r\n</button>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ButtonComponent } from './components/button/button.component';\r\n\r\n@NgModule({\r\n declarations: [\r\n ButtonComponent\r\n ],\r\n imports: [\r\n CommonModule\r\n ],\r\n exports: [\r\n ButtonComponent\r\n ]\r\n})\r\nexport class ButtonModule { }\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n OnInit,\r\n OnDestroy,\r\n HostListener\r\n} from '@angular/core';\r\nimport { ConfirmationModalConfig } from '../../confirmation-modal.models';\r\n\r\n@Component({\r\n selector: 'cc-confirmation-modal',\r\n templateUrl: './confirmation-modal.component.html',\r\n styleUrls: ['./confirmation-modal.component.scss'],\r\n standalone: false\r\n})\r\nexport class ConfirmationModalComponent implements OnInit, OnDestroy {\r\n @Input() config!: ConfirmationModalConfig;\r\n @Input() isOpen = false;\r\n\r\n @Output() confirm = new EventEmitter<void>();\r\n @Output() cancel = new EventEmitter<void>();\r\n @Output() close = new EventEmitter<void>();\r\n @Output() showCodeSnippet = new EventEmitter<void>();\r\n\r\n // Default configuration\r\n private defaultConfig: Partial<ConfirmationModalConfig> = {\r\n headerTheme: 'dark', // Changed to dark as per new default requirement\r\n width: '560px',\r\n size: 'md',\r\n closeOnBackdrop: true,\r\n closeOnEsc: true,\r\n showCloseButton: true,\r\n cancelButton: {\r\n label: '',\r\n show: true\r\n }\r\n };\r\n\r\n mergedConfig!: ConfirmationModalConfig;\r\n private previousActiveElement: HTMLElement | null = null;\r\n\r\n ngOnInit(): void {\r\n this.updateConfig();\r\n\r\n // Store currently focused element\r\n this.previousActiveElement = document.activeElement as HTMLElement;\r\n\r\n // Prevent body scroll when modal is open\r\n if (this.isOpen) {\r\n this.toggleBodyScroll(true);\r\n }\r\n }\r\n\r\n ngOnChanges(): void {\r\n this.updateConfig();\r\n if (this.isOpen !== undefined) {\r\n this.toggleBodyScroll(this.isOpen);\r\n }\r\n }\r\n\r\n private updateConfig(): void {\r\n // Merge user config with defaults\r\n this.mergedConfig = {\r\n ...this.defaultConfig,\r\n ...this.config,\r\n cancelButton: {\r\n ...this.defaultConfig.cancelButton,\r\n ...this.config.cancelButton\r\n },\r\n confirmButton: {\r\n ...this.config.confirmButton\r\n }\r\n };\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Restore body scroll\r\n this.toggleBodyScroll(false);\r\n\r\n // Restore focus to previous element\r\n if (this.previousActiveElement) {\r\n this.previousActiveElement.focus();\r\n }\r\n }\r\n\r\n private toggleBodyScroll(disable: boolean): void {\r\n if (disable) {\r\n document.body.style.overflow = 'hidden';\r\n } else {\r\n document.body.style.overflow = '';\r\n }\r\n }\r\n\r\n @HostListener('document:keydown.escape', ['$event'])\r\n handleEscape(event: KeyboardEvent): void {\r\n if (this.isOpen && this.mergedConfig.closeOnEsc) {\r\n event.preventDefault();\r\n this.onClose();\r\n }\r\n }\r\n\r\n onBackdropClick(event: MouseEvent): void {\r\n // Only close if clicking directly on backdrop, not modal content\r\n if (\r\n this.mergedConfig.closeOnBackdrop &&\r\n event.target === event.currentTarget\r\n ) {\r\n this.onClose();\r\n }\r\n }\r\n\r\n onConfirm(): void {\r\n if (!this.mergedConfig.confirmButton.disabled &&\r\n !this.mergedConfig.confirmButton.loading) {\r\n this.confirm.emit();\r\n }\r\n }\r\n\r\n onCancel(): void {\r\n this.cancel.emit();\r\n }\r\n\r\n onClose(): void {\r\n this.close.emit();\r\n }\r\n\r\n onShowCodeSnippet(): void {\r\n this.showCodeSnippet.emit();\r\n }\r\n\r\n getModalWidth(): string {\r\n if (this.mergedConfig.size) {\r\n const sizeMap: Record<string, string> = {\r\n sm: '400px',\r\n md: '560px',\r\n lg: '720px'\r\n };\r\n return sizeMap[this.mergedConfig.size];\r\n }\r\n return this.mergedConfig.width || '560px';\r\n }\r\n\r\n getConfirmButtonClass(): string {\r\n const typeMap: Record<string, string> = {\r\n primary: 'cc-btn-primary',\r\n danger: 'cc-btn-danger',\r\n warning: 'cc-btn-warning'\r\n };\r\n return `cc-btn ${typeMap[this.mergedConfig.confirmButton.type]}`;\r\n }\r\n\r\n getHeaderClass(): string {\r\n return `modal-header modal-header--${this.mergedConfig.headerTheme}`;\r\n }\r\n\r\n resolveIconType(icon: any): 'material' | 'custom' | 'img' {\r\n if (typeof icon === 'string') {\r\n if (icon.includes('/') || icon.includes('.') || icon.startsWith('http')) {\r\n return 'img';\r\n }\r\n return 'material';\r\n }\r\n if (icon && typeof icon === 'object') {\r\n if (icon.type === 'custom' || (icon.value && (icon.value.includes('/') || icon.value.includes('.') || icon.value.startsWith('http')))) {\r\n return 'custom';\r\n }\r\n return icon.type || 'material';\r\n }\r\n return 'material';\r\n }\r\n\r\n getIconValue(icon: any): string {\r\n return typeof icon === 'string' ? icon : icon?.value;\r\n }\r\n\r\n getIconColor(icon: any): string | undefined {\r\n return typeof icon === 'object' ? icon.color : undefined;\r\n }\r\n}\r\n","<div *ngIf=\"isOpen\" class=\"cc-modal-backdrop\" (click)=\"onBackdropClick($event)\" role=\"dialog\" [attr.aria-modal]=\"true\"\r\n [attr.aria-labelledby]=\"'modal-title-' + mergedConfig.title\" [attr.aria-label]=\"mergedConfig.ariaLabel\"\r\n [attr.aria-describedby]=\"mergedConfig.ariaDescribedBy\">\r\n\r\n <div class=\"cc-modal-container {{ mergedConfig.customClass }}\" [style.width]=\"getModalWidth()\"\r\n [style.background-color]=\"mergedConfig.backgroundColor\" [style.border-radius]=\"mergedConfig.borderRadius\"\r\n [style.border-top-left-radius]=\"mergedConfig.borderTopLeftRadius\"\r\n [style.border-top-right-radius]=\"mergedConfig.borderTopRightRadius\"\r\n [style.border-bottom-left-radius]=\"mergedConfig.borderBottomLeftRadius\"\r\n [style.border-bottom-right-radius]=\"mergedConfig.borderBottomRightRadius\" (click)=\"$event.stopPropagation()\">\r\n\r\n <!-- Header -->\r\n <div [ngClass]=\"getHeaderClass()\" [style.background-color]=\"mergedConfig.headerBackgroundColor\"\r\n [style.border-bottom]=\"mergedConfig.headerBorderBottom\">\r\n <div class=\"modal-header__content\">\r\n <!-- Icon (Optional) -->\r\n <span *ngIf=\"mergedConfig.icon\" class=\"modal-header__icon\">\r\n <ng-container [ngSwitch]=\"resolveIconType(mergedConfig.icon)\">\r\n <mat-icon *ngSwitchCase=\"'material'\" [style.color]=\"getIconColor(mergedConfig.icon)\">\r\n {{ getIconValue(mergedConfig.icon) }}\r\n </mat-icon>\r\n <img *ngSwitchCase=\"'custom'\" [src]=\"getIconValue(mergedConfig.icon)\"\r\n [attr.alt]=\"mergedConfig.labels?.iconAltText || mergedConfig.title + ' icon'\"\r\n class=\"modal-header__custom-icon\">\r\n <img *ngSwitchCase=\"'img'\" [src]=\"getIconValue(mergedConfig.icon)\"\r\n [attr.alt]=\"mergedConfig.labels?.iconAltText || mergedConfig.title + ' icon'\"\r\n class=\"modal-header__custom-icon\">\r\n </ng-container>\r\n </span>\r\n\r\n <!-- Title -->\r\n <h2 class=\"modal-header__title\" [id]=\"'modal-title-' + mergedConfig.title\"\r\n [style.color]=\"mergedConfig.headerTextColor\">\r\n {{ mergedConfig.title }}\r\n </h2>\r\n </div>\r\n\r\n <!-- Code Snippet Button -->\r\n <button *ngIf=\"mergedConfig.showCodeSnippetButton\" type=\"button\" class=\"modal-header__code-btn\"\r\n (click)=\"onShowCodeSnippet()\" [attr.aria-label]=\"mergedConfig.labels?.codeSnippetAriaLabel\"\r\n [attr.title]=\"mergedConfig.labels?.codeSnippetTitle\">\r\n <mat-icon>code</mat-icon>\r\n </button>\r\n\r\n <!-- Close Button -->\r\n <button *ngIf=\"mergedConfig.showCloseButton\" type=\"button\" class=\"modal-header__close\" (click)=\"onClose()\"\r\n [attr.aria-label]=\"mergedConfig.labels?.closeAriaLabel\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Body (Content Projection) -->\r\n <div class=\"cc-modal-body\" [style.padding]=\"mergedConfig.padding\" [style.color]=\"mergedConfig.bodyTextColor\">\r\n <ng-content></ng-content>\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div class=\"cc-modal-footer\" [style.background-color]=\"mergedConfig.footerBackgroundColor\"\r\n [style.border-top]=\"mergedConfig.footerBorderTop\">\r\n\r\n <ng-container *ngIf=\"!mergedConfig.customFooter\">\r\n <button *ngIf=\"mergedConfig.cancelButton?.show\" type=\"button\" class=\"cc-btn cc-btn-secondary\"\r\n (click)=\"onCancel()\">\r\n {{ mergedConfig.cancelButton?.label }}\r\n </button>\r\n\r\n <button type=\"button\" [ngClass]=\"getConfirmButtonClass()\"\r\n [disabled]=\"mergedConfig.confirmButton.disabled || mergedConfig.confirmButton.loading\"\r\n (click)=\"onConfirm()\">\r\n <span *ngIf=\"mergedConfig.confirmButton.loading\" class=\"cc-btn-spinner\"></span>\r\n {{ mergedConfig.confirmButton.label }}\r\n </button>\r\n </ng-container>\r\n\r\n <ng-content select=\"[cc-modal-footer]\"></ng-content>\r\n </div>\r\n </div>\r\n</div>","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n HostListener,\r\n ElementRef\r\n} from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { DropdownAction } from '../../button-dropdown.models';\r\nimport { ButtonVariant } from '../../../button/button.models';\r\nimport { ConfirmationModalConfig } from '../../../confirmation-modal/confirmation-modal.models';\r\n\r\n@Component({\r\n selector: 'lib-button-dropdown',\r\n templateUrl: './button-dropdown.component.html',\r\n styleUrls: ['./button-dropdown.component.scss'],\r\n standalone: false\r\n})\r\nexport class ButtonDropdownComponent {\r\n @Input() label: string = 'Actions';\r\n @Input() variant: ButtonVariant = 'primary';\r\n @Input() menuTheme: 'light' | 'dark' = 'light';\r\n @Input() icon: string = 'fa fa-chevron-down';\r\n @Input() actions: DropdownAction[] = [];\r\n @Input() data: any = null;\r\n @Input() disabled: boolean = false;\r\n\r\n @Output() apiActionStart = new EventEmitter<DropdownAction>();\r\n @Output() apiActionSuccess = new EventEmitter<{ action: DropdownAction, response: any }>();\r\n @Output() apiActionError = new EventEmitter<{ action: DropdownAction, error: any }>();\r\n @Output() actionClick = new EventEmitter<{ action: DropdownAction, data: any }>();\r\n\r\n isOpen = false;\r\n isConfirmModalOpen = false;\r\n pendingAction: DropdownAction | null = null;\r\n confirmConfig: ConfirmationModalConfig | null = null;\r\n confirmMessage: string = '';\r\n\r\n constructor(\r\n private elementRef: ElementRef,\r\n private router: Router,\r\n private http: HttpClient\r\n ) {}\r\n\r\n @HostListener('document:click', ['$event'])\r\n onClickOutside(event: Event) {\r\n if (!this.elementRef.nativeElement.contains(event.target)) {\r\n this.isOpen = false;\r\n }\r\n }\r\n\r\n toggleDropdown(event: Event) {\r\n if (this.disabled) return;\r\n event.stopPropagation();\r\n this.isOpen = !this.isOpen;\r\n }\r\n\r\n onActionItemClick(action: DropdownAction, event: Event) {\r\n event.stopPropagation();\r\n this.isOpen = false;\r\n\r\n if (action.disabled) return;\r\n\r\n if (action.confirmationNeeded) {\r\n this.pendingAction = action;\r\n \r\n // Smart inference for \"delete\" actions\r\n const isDelete = action.apiMethod === 'DELETE' || \r\n action.variant === 'danger' || \r\n action.color === 'red' || \r\n action.label.toLowerCase().includes('delete');\r\n \r\n // Apply intelligent fallbacks based on action intent\r\n this.confirmMessage = action.confirmationMessage || (isDelete \r\n ? 'Are you sure you want to delete this item? This action cannot be undone.' \r\n : 'Are you sure you want to proceed?');\r\n \r\n this.confirmConfig = {\r\n title: action.confirmationTitle || (isDelete ? 'Confirm Deletion' : 'Please Confirm'),\r\n icon: { type: 'material', value: 'warning', color: isDelete ? '#E63E30' : '#F9C80E' },\r\n confirmButton: {\r\n label: isDelete ? 'Delete' : 'Confirm',\r\n type: isDelete ? 'danger' : 'primary'\r\n },\r\n cancelButton: {\r\n show: true,\r\n label: 'Cancel'\r\n }\r\n };\r\n this.isConfirmModalOpen = true;\r\n } else {\r\n this.executeAction(action);\r\n }\r\n }\r\n\r\n private executeAction(action: DropdownAction) {\r\n this.actionClick.emit({ action, data: this.data });\r\n\r\n if (action.type === 'callback' && action.callback) {\r\n action.callback(this.data);\r\n } else if (action.type === 'route' && action.route) {\r\n this.navigateToRoute(action.route, this.data);\r\n } else if (action.type === 'api' && action.apiUrl) {\r\n this.executeApiCall(action);\r\n }\r\n }\r\n\r\n private navigateToRoute(routePattern: string, rowData: any) {\r\n let finalRoute = routePattern;\r\n // Simple parameter replacement like smart-table: /users/:id -> /users/123\r\n if (rowData) {\r\n Object.keys(rowData).forEach(key => {\r\n finalRoute = finalRoute.replace(`:${key}`, rowData[key]);\r\n });\r\n }\r\n this.router.navigate([finalRoute]);\r\n }\r\n\r\n private executeApiCall(action: DropdownAction) {\r\n this.apiActionStart.emit(action);\r\n \r\n let url = action.apiUrl!;\r\n if (this.data) {\r\n Object.keys(this.data).forEach(key => {\r\n url = url.replace(`:${key}`, this.data[key]);\r\n });\r\n }\r\n\r\n const method = (action.apiMethod || 'GET').toUpperCase();\r\n let request$;\r\n\r\n if (method === 'GET') request$ = this.http.get(url);\r\n else if (method === 'POST') request$ = this.http.post(url, action.apiPayload || this.data);\r\n else if (method === 'PUT') request$ = this.http.put(url, action.apiPayload || this.data);\r\n else if (method === 'DELETE') request$ = this.http.delete(url);\r\n else if (method === 'PATCH') request$ = this.http.patch(url, action.apiPayload || this.data);\r\n else request$ = this.http.get(url); // fallback\r\n\r\n request$.subscribe({\r\n next: (res) => this.apiActionSuccess.emit({ action, response: res }),\r\n error: (err) => this.apiActionError.emit({ action, error: err })\r\n });\r\n }\r\n\r\n invokePendingAction() {\r\n if (this.pendingAction) {\r\n this.executeAction(this.pendingAction);\r\n }\r\n this.closeConfirmModal();\r\n }\r\n\r\n closeConfirmModal() {\r\n this.isConfirmModalOpen = false;\r\n this.pendingAction = null;\r\n this.confirmConfig = null;\r\n this.confirmMessage = '';\r\n }\r\n}\r\n","<div class=\"cc-btn-dropdown-container\">\r\n <!-- Main Toggle Button -->\r\n <lib-button \r\n [variant]=\"variant\" \r\n [disabled]=\"disabled\"\r\n (click)=\"toggleDropdown($event)\">\r\n <span class=\"cc-btn-dropdown-content\">\r\n {{ label }}\r\n <i *ngIf=\"icon\" [class]=\"icon\" class=\"cc-btn-dropdown-icon\"></i>\r\n </span>\r\n </lib-button>\r\n\r\n <!-- Dropdown Menu -->\r\n <div class=\"cc-dropdown-menu\" [ngClass]=\"'cc-dropdown-menu--' + menuTheme\" *ngIf=\"isOpen\">\r\n <button \r\n type=\"button\" \r\n class=\"cc-dropdown-item\" \r\n *ngFor=\"let action of actions\"\r\n [disabled]=\"action.disabled\"\r\n [ngClass]=\"action.variant ? 'cc-dropdown-item--' + action.variant : (action.color === 'red' || action.color === 'danger') ? 'cc-dropdown-item--danger' : ''\"\r\n [style.color]=\"action.color && !action.variant && action.color !== 'red' && action.color !== 'danger' ? action.color : null\"\r\n (click)=\"onActionItemClick(action, $event)\">\r\n <i *ngIf=\"action.icon\" [class]=\"action.icon\" class=\"cc-dropdown-item-icon\"></i>\r\n <span>{{ action.label }}</span>\r\n </button>\r\n <div class=\"cc-dropdown-empty\" *ngIf=\"!actions || actions.length === 0\">\r\n No actions available\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Confirmation Modal for Critical Actions -->\r\n<cc-confirmation-modal \r\n *ngIf=\"isConfirmModalOpen\"\r\n [isOpen]=\"isConfirmModalOpen\" \r\n [config]=\"confirmConfig!\"\r\n (confirm)=\"invokePendingAction()\"\r\n (close)=\"closeConfirmModal()\"\r\n (cancel)=\"closeConfirmModal()\">\r\n <p>{{ confirmMessage }}</p>\r\n</cc-confirmation-modal>\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ConfirmationModalComponent } from './components/confirmation-modal/confirmation-modal.component';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\n@NgModule({\r\n declarations: [\r\n ConfirmationModalComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n MatIconModule, // For material icons support\r\n FormsModule // For ngModel in user examples (although mostly projected content, user might need it)\r\n ],\r\n exports: [\r\n ConfirmationModalComponent\r\n ]\r\n})\r\nexport class ConfirmationModalModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { RouterModule } from '@angular/router';\r\nimport { ButtonDropdownComponent } from './components/button-dropdown/button-dropdown.component';\r\nimport { ButtonModule } from '../button/button.module';\r\nimport { ConfirmationModalModule } from '../confirmation-modal/confirmation-modal.module';\r\n\r\n@NgModule({\r\n declarations: [\r\n ButtonDropdownComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n RouterModule,\r\n ButtonModule,\r\n ConfirmationModalModule\r\n ],\r\n exports: [\r\n ButtonDropdownComponent\r\n ]\r\n})\r\nexport class ButtonDropdownModule { }\r\n","import { Component, Input, Output, EventEmitter, forwardRef, OnInit, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { InputConfig, InputType, InputLabels } from './input.models';\r\n\r\n@Component({\r\n selector: 'lib-input',\r\n templateUrl: './input.component.html',\r\n styleUrls: ['./input.component.scss'],\r\n standalone: false,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => InputComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class InputComponent implements ControlValueAccessor, OnInit, OnChanges {\r\n @Input() config?: InputConfig;\r\n @Input() labels?: InputLabels;\r\n @Input() type: InputType = 'text';\r\n @Input() label: string = '';\r\n @Input() placeholder: string = '';\r\n @Input() disabled: boolean = false;\r\n @Input() required: boolean = false;\r\n @Input() readonly: boolean = false;\r\n @Input() clearable: boolean = true;\r\n @Input() maxLength?: number;\r\n @Input() minLength?: number;\r\n @Input() min?: number | string;\r\n @Input() max?: number | string;\r\n @Input() pattern?: string;\r\n @Input() errorMessage: string = '';\r\n @Input() helperText: string = '';\r\n @Input() rows: number = 3;\r\n @Input() prefixIcon?: any;\r\n @Input() suffixIcon?: any;\r\n @Input() value: any = '';\r\n\r\n // Style inputs\r\n @Input() width?: string;\r\n @Input() height?: string;\r\n @Input() borderRadius?: string;\r\n @Input() fontSize?: string;\r\n\r\n @Input() gap?: string;\r\n @Input() fontFamily?: string;\r\n @Input() labelColor?: string;\r\n @Input() labelFontSize?: string;\r\n @Input() labelFontWeight?: string;\r\n\r\n @Input() backgroundColor?: string;\r\n @Input() borderColor?: string;\r\n @Input() borderWidth?: string;\r\n @Input() padding?: string;\r\n @Input() fontWeight?: string;\r\n @Input() color?: string;\r\n @Input() placeholderColor?: string;\r\n @Input() focusBorderColor?: string;\r\n @Input() errorColor?: string;\r\n @Input() disabledBackgroundColor?: string;\r\n @Input() disabledColor?: string;\r\n @Input() boxShadow?: string;\r\n\r\n @Output() valueChange = new EventEmitter<any>();\r\n @Output() inputBlur = new EventEmitter<void>();\r\n @Output() inputFocus = new EventEmitter<void>();\r\n\r\n showPassword = false;\r\n focused = false;\r\n onChange: (value: any) => void = () => { };\r\n onTouched: () => void = () => { };\r\n\r\n ngOnInit(): void {\r\n this.updateFromConfig();\r\n this.updateFromLabels();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['config']) {\r\n this.updateFromConfig();\r\n }\r\n if (changes['labels']) {\r\n this.updateFromLabels();\r\n }\r\n }\r\n\r\n private updateFromConfig(): void {\r\n if (this.config) {\r\n this.type = this.config.type ?? this.type;\r\n this.label = this.config.label ?? this.label;\r\n this.placeholder = this.config.placeholder ?? this.placeholder;\r\n this.disabled = this.config.disabled ?? this.disabled;\r\n this.required = this.config.required ?? this.required;\r\n this.readonly = this.config.readonly ?? this.readonly;\r\n this.maxLength = this.config.maxLength ?? this.maxLength;\r\n this.minLength = this.config.minLength ?? this.minLength;\r\n this.min = this.config.min ?? this.min;\r\n this.max = this.config.max ?? this.max;\r\n this.pattern = this.config.pattern ?? this.pattern;\r\n this.errorMessage = this.config.errorMessage ?? this.errorMessage;\r\n this.helperText = this.config.helperText ?? this.helperText;\r\n this.rows = this.config.rows ?? this.rows;\r\n this.prefixIcon = this.config.prefixIcon ?? this.prefixIcon;\r\n this.suffixIcon = this.config.suffixIcon ?? this.suffixIcon;\r\n\r\n // Style inputs\r\n this.width = this.config.width ?? this.width;\r\n this.height = this.config.height ?? this.height;\r\n this.borderRadius = this.config.borderRadius ?? this.borderRadius;\r\n this.fontSize = this.config.fontSize ?? this.fontSize;\r\n this.gap = this.config.gap ?? this.gap;\r\n this.fontFamily = this.config.fontFamily ?? this.fontFamily;\r\n this.labelColor = this.config.labelColor ?? this.labelColor;\r\n this.labelFontSize = this.config.labelFontSize ?? this.labelFontSize;\r\n this.labelFontWeight = this.config.labelFontWeight ?? this.labelFontWeight;\r\n this.backgroundColor = this.config.backgroundColor ?? this.backgroundColor;\r\n this.borderColor = this.config.borderColor ?? this.borderColor;\r\n this.borderWidth = this.config.borderWidth ?? this.borderWidth;\r\n this.padding = this.config.padding ?? this.padding;\r\n this.fontWeight = this.config.fontWeight ?? this.fontWeight;\r\n this.color = this.config.color ?? this.color;\r\n this.placeholderColor = this.config.placeholderColor ?? this.placeholderColor;\r\n this.focusBorderColor = this.config.focusBorderColor ?? this.focusBorderColor;\r\n this.errorColor = this.config.errorColor ?? this.errorColor;\r\n this.disabledBackgroundColor = this.config.disabledBackgroundColor ?? this.disabledBackgroundColor;\r\n this.disabledColor = this.config.disabledColor ?? this.disabledColor;\r\n this.boxShadow = this.config.boxShadow ?? this.boxShadow;\r\n\r\n if (this.config.value !== undefined) {\r\n this.value = this.config.value;\r\n }\r\n }\r\n }\r\n\r\n private updateFromLabels(): void {\r\n if (this.labels) {\r\n this.label = this.labels.label || this.label;\r\n this.placeholder = this.labels.placeholder || this.placeholder;\r\n this.errorMessage = this.labels.errorMessage || this.errorMessage;\r\n this.helperText = this.labels.helperText || this.helperText;\r\n }\r\n }\r\n\r\n get requiredMarker(): string {\r\n return this.labels?.requiredMarker || '*';\r\n }\r\n\r\n writeValue(value: any): void {\r\n this.value = value;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n onInputChange(event: any): void {\r\n const value = event.target.value;\r\n this.value = this.type === 'number' ? (value ? Number(value) : null) : value;\r\n this.onChange(this.value);\r\n this.valueChange.emit(this.value);\r\n }\r\n\r\n onBlur(): void {\r\n this.focused = false;\r\n this.onTouched();\r\n this.inputBlur.emit();\r\n }\r\n\r\n onFocus(): void {\r\n this.focused = true;\r\n this.inputFocus.emit();\r\n }\r\n\r\n togglePasswordVisibility(): void {\r\n this.showPassword = !this.showPassword;\r\n }\r\n\r\n getIconType(icon: any): 'material' | 'fontawesome' | 'img' | 'none' {\r\n if (!icon) return 'none';\r\n if (typeof icon === 'string') {\r\n if (icon.includes('/') || icon.includes('.') || icon.startsWith('http')) {\r\n return 'img';\r\n }\r\n return 'material';\r\n }\r\n return icon.type || 'material';\r\n }\r\n\r\n getIconValue(icon: any): string {\r\n if (typeof icon === 'string') return icon;\r\n return icon?.value || '';\r\n }\r\n\r\n get inputType(): string {\r\n if (this.type === 'password' && this.showPassword) {\r\n return 'text';\r\n }\r\n return this.type === 'textarea' ? 'text' : this.type;\r\n }\r\n\r\n private getStyleValue(value: string | undefined): string | undefined {\r\n return value ? `${value}` : undefined;\r\n }\r\n\r\n get wrapperStyles(): { [key: string]: string | undefined } {\r\n return {\r\n 'width': this.getStyleValue(this.width),\r\n '--cc-input-label-gap': this.getStyleValue(this.gap),\r\n '--cc-input-font-family': this.getStyleValue(this.fontFamily)\r\n };\r\n }\r\n\r\n get labelStyles(): { [key: string]: string | undefined } {\r\n return {\r\n '--cc-input-label-color': this.getStyleValue(this.labelColor),\r\n '--cc-input-label-font-size': this.getStyleValue(this.labelFontSize),\r\n '--cc-input-label-font-weight': this.getStyleValue(this.labelFontWeight)\r\n };\r\n }\r\n\r\n get fieldStyles(): { [key: string]: string | undefined } {\r\n return {\r\n '--cc-input-bg': this.getStyleValue(this.backgroundColor),\r\n '--cc-input-border-radius': this.getStyleValue(this.borderRadius),\r\n '--cc-input-border-color': this.getStyleValue(this.borderColor),\r\n '--cc-input-border-width': this.getStyleValue(this.borderWidth),\r\n '--cc-input-height': this.getStyleValue(this.height),\r\n '--cc-input-padding': this.getStyleValue(this.padding),\r\n '--cc-input-font-size': this.getStyleValue(this.fontSize),\r\n '--cc-input-font-weight': this.getStyleValue(this.fontWeight),\r\n '--cc-input-color': this.getStyleValue(this.color),\r\n '--cc-input-placeholder-color': this.getStyleValue(this.placeholderColor),\r\n '--cc-input-focus-border-color': this.getStyleValue(this.focusBorderColor),\r\n '--cc-input-error-color': this.getStyleValue(this.errorColor),\r\n '--cc-input-disabled-bg': this.getStyleValue(this.disabledBackgroundColor),\r\n '--cc-input-disabled-color': this.getStyleValue(this.disabledColor),\r\n 'box-shadow': this.getStyleValue(this.boxShadow)\r\n };\r\n }\r\n}\r\n\r\n","<div class=\"cc-input-container\" [ngStyle]=\"wrapperStyles\">\r\n <label *ngIf=\"label\" class=\"cc-input-label\" [ngStyle]=\"labelStyles\">\r\n {{ label }}\r\n <span *ngIf=\"required\" class=\"cc-required\">{{ requiredMarker }}</span>\r\n </label>\r\n\r\n <div class=\"cc-input-wrapper\" [class.focused]=\"focused\" [class.disabled]=\"disabled\" [class.error]=\"errorMessage\"\r\n [ngStyle]=\"fieldStyles\">\r\n\r\n <!-- Prefix Icon -->\r\n <span class=\"cc-input-prefix\" *ngIf=\"prefixIcon\">\r\n <span class=\"material-icons\" *ngIf=\"getIconType(prefixIcon) === 'material'\">{{ getIconValue(prefixIcon)\r\n }}</span>\r\n <i *ngIf=\"getIconType(prefixIcon) === 'fontawesome'\" [class]=\"getIconValue(prefixIcon)\"></i>\r\n <img *ngIf=\"getIconType(prefixIcon) === 'img'\" [src]=\"getIconValue(prefixIcon)\" class=\"cc-icon-img\"\r\n [attr.alt]=\"labels?.prefixAltText || 'prefix'\" />\r\n </span>\r\n\r\n <!-- Input -->\r\n <input *ngIf=\"type !== 'textarea'\" class=\"cc-input-element\" [type]=\"inputType\" [value]=\"value\"\r\n [placeholder]=\"placeholder\" [disabled]=\"disabled\" [required]=\"required\" [readonly]=\"readonly\"\r\n [maxLength]=\"maxLength || 524288\" [minLength]=\"minLength || 0\" [min]=\"min\" [max]=\"max\" [pattern]=\"pattern\"\r\n (input)=\"onInputChange($event)\" (blur)=\"onBlur()\" (focus)=\"onFocus()\" [attr.aria-invalid]=\"!!errorMessage\"\r\n [attr.aria-describedby]=\"helperText ? 'helper-text' : null\" />\r\n\r\n <!-- Textarea -->\r\n <textarea *ngIf=\"type === 'textarea'\" class=\"cc-input-element cc-textarea\" [value]=\"value\"\r\n [placeholder]=\"placeholder\" [disabled]=\"disabled\" [required]=\"required\" [readonly]=\"readonly\"\r\n [maxLength]=\"maxLength || 524288\" [minLength]=\"minLength || 0\" [rows]=\"rows\" (input)=\"onInputChange($event)\"\r\n (blur)=\"onBlur()\" (focus)=\"onFocus()\" [attr.aria-invalid]=\"!!errorMessage\"></textarea>\r\n\r\n <!-- Suffix Icon / Password Toggle -->\r\n <span class=\"cc-input-suffix\">\r\n <button *ngIf=\"type === 'password'\" type=\"button\" class=\"cc-icon-btn\" (click)=\"togglePasswordVisibility()\"\r\n [attr.aria-label]=\"labels?.passwordToggleAriaLabel\">\r\n <span class=\"material-icons\">{{ showPassword ? 'visibility_off' : 'visibility' }}</span>\r\n </button>\r\n\r\n <ng-container *ngIf=\"suffixIcon && type !== 'password'\">\r\n <span class=\"material-icons\" *ngIf=\"getIconType(suffixIcon) === 'material'\">{{ getIconValue(suffixIcon)\r\n }}</span>\r\n <i *ngIf=\"getIconType(suffixIcon) === 'fontawesome'\" [class]=\"getIconValue(suffixIcon)\"></i>\r\n <img *ngIf=\"getIconType(suffixIcon) === 'img'\" [src]=\"getIconValue(suffixIcon)\" class=\"cc-icon-img\"\r\n [attr.alt]=\"labels?.suffixAltText || 'suffix'\" />\r\n </ng-container>\r\n </span>\r\n </div>\r\n\r\n <div class=\"cc-helper-text\" *ngIf=\"helperText\" id=\"helper-text\">{{ helperText }}</div>\r\n <div class=\"cc-error-message\" *ngIf=\"errorMessage\">{{ errorMessage }}</div>\r\n</div>","import { Directive, ElementRef, Output, EventEmitter, HostListener } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[libClickOutside]',\r\n standalone: false\r\n})\r\nexport class ClickOutsideDirective {\r\n @Output() libClickOutside = new EventEmitter<void>();\r\n\r\n constructor(private elementRef: ElementRef) { }\r\n\r\n @HostListener('document:click', ['$event.target'])\r\n public onClick(target: any): void {\r\n const clickedInside = this.elementRef.nativeElement.contains(target);\r\n if (!clickedInside) {\r\n this.libClickOutside.emit();\r\n }\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, forwardRef, OnInit, OnChanges, SimpleChanges, HostListener, ViewChild, ElementRef } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';\r\nimport { DropdownOption, DropdownConfig, DropdownLabels } from './dropdown.models';\r\n\r\n@Component({\r\n selector: 'lib-dropdown',\r\n templateUrl: './dropdown.component.html',\r\n styleUrls: ['./dropdown.component.scss'],\r\n standalone: false,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DropdownComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class DropdownComponent implements ControlValueAccessor, OnInit, OnChanges {\r\n @Input() config?: DropdownConfig;\r\n @Input() labels?: DropdownLabels;\r\n @Input() options: DropdownOption[] = [];\r\n @Input() placeholder: string = '';\r\n @Input() label: string = '';\r\n @Input() multiple: boolean = false;\r\n @Input() searchable: boolean = false;\r\n @Input() clearable: boolean = false;\r\n @Input() disabled: boolean = false;\r\n @Input() required: boolean = false;\r\n @Input() errorMessage: string = '';\r\n\r\n // Configurable styles\r\n @Input() width?: string;\r\n @Input() height?: string;\r\n @Input() borderRadius?: string;\r\n @Input() fontSize?: string;\r\n\r\n // Additional style inputs inferred from template/getters\r\n @Input() gap?: string;\r\n @Input() fontFamily?: string;\r\n @Input() labelColor?: string;\r\n @Input() labelFontSize?: string;\r\n @Input() labelFontWeight?: string;\r\n\r\n @Input() backgroundColor?: string;\r\n @Input() borderColor?: string;\r\n @Input() borderWidth?: string;\r\n @Input() padding?: string;\r\n @Input() fontWeight?: string;\r\n @Input() color?: string;\r\n @Input() placeholderColor?: string;\r\n @Input() focusBorderColor?: string;\r\n @Input() errorColor?: string;\r\n @Input() disabledBackgroundColor?: string;\r\n @Input() disabledColor?: string;\r\n @Input() boxShadow?: string;\r\n\r\n @Output() selectionChange = new EventEmitter<any>();\r\n\r\n @ViewChild(CdkVirtualScrollViewport) viewport?: CdkVirtualScrollViewport;\r\n @ViewChild('searchInput') searchInput?: ElementRef;\r\n\r\n filteredOptions: DropdownOption[] = [];\r\n searchTerm: string = '';\r\n value: any = null;\r\n isOpen = false;\r\n focusedIndex = -1;\r\n\r\n onChange: (value: any) => void = () => { };\r\n onTouched: () => void = () => { };\r\n\r\n ngOnInit(): void {\r\n this.updateFromConfig();\r\n this.updateFromLabels();\r\n this.filteredOptions = [...this.options];\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['config']) {\r\n this.updateFromConfig();\r\n }\r\n if (changes['labels']) {\r\n this.updateFromLabels();\r\n }\r\n if (changes['config'] || changes['options']) {\r\n this.filteredOptions = [...this.options];\r\n }\r\n }\r\n\r\n private updateFromConfig(): void {\r\n if (this.config) {\r\n this.options = this.config.options || this.options;\r\n this.placeholder = this.config.placeholder ?? this.placeholder;\r\n this.label = this.config.label ?? this.label;\r\n this.multiple = this.config.multiple ?? this.multiple;\r\n this.searchable = this.config.searchable ?? this.searchable;\r\n this.clearable = this.config.clearable ?? this.clearable;\r\n this.disabled = this.config.disabled ?? this.disabled;\r\n this.required = this.config.required ?? this.required;\r\n this.errorMessage = this.config.errorMessage ?? this.errorMessage;\r\n this.width = this.config.width ?? this.width;\r\n this.height = this.config.height ?? this.height;\r\n this.borderRadius = this.config.borderRadius ?? this.borderRadius;\r\n this.fontSize = this.config.fontSize ?? this.fontSize;\r\n this.gap = this.config.gap ?? this.gap;\r\n this.fontFamily = this.config.fontFamily ?? this.fontFamily;\r\n this.labelColor = this.config.labelColor ?? this.labelColor;\r\n this.labelFontSize = this.config.labelFontSize ?? this.labelFontSize;\r\n this.labelFontWeight = this.config.labelFontWeight ?? this.labelFontWeight;\r\n this.backgroundColor = this.config.backgroundColor ?? this.backgroundColor;\r\n this.borderColor = this.config.borderColor ?? this.borderColor;\r\n this.borderWidth = this.config.borderWidth ?? this.borderWidth;\r\n this.padding = this.config.padding ?? this.padding;\r\n this.fontWeight = this.config.fontWeight ?? this.fontWeight;\r\n this.color = this.config.color ?? this.color;\r\n this.placeholderColor = this.config.placeholderColor ?? this.placeholderColor;\r\n this.focusBorderColor = this.config.focusBorderColor ?? this.focusBorderColor;\r\n this.errorColor = this.config.errorColor ?? this.errorColor;\r\n this.disabledBackgroundColor = this.config.disabledBackgroundColor ?? this.disabledBackgroundColor;\r\n this.disabledColor = this.config.disabledColor ?? this.disabledColor;\r\n this.boxShadow = this.config.boxShadow ?? this.boxShadow;\r\n }\r\n }\r\n\r\n private updateFromLabels(): void {\r\n if (this.labels) {\r\n this.label = this.labels.label || this.label;\r\n this.placeholder = this.labels.placeholder || this.placeholder;\r\n this.errorMessage = this.labels.errorMessage || this.errorMessage;\r\n }\r\n }\r\n\r\n get requiredMarker(): string {\r\n return this.labels?.requiredMarker || '*';\r\n }\r\n\r\n get searchPlaceholder(): string {\r\n return this.labels?.searchPlaceholder || 'Search...';\r\n }\r\n\r\n get selectedSuffix(): string {\r\n return this.labels?.selectedSuffix || 'selected';\r\n }\r\n\r\n get clearAriaLabel(): string {\r\n return this.labels?.clearAriaLabel || 'Clear selection';\r\n }\r\n\r\n writeValue(value: any): void {\r\n this.value = value;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n toggle(): void {\r\n if (this.disabled) return;\r\n this.isOpen = !this.isOpen;\r\n if (this.isOpen) {\r\n this.focusedIndex = -1;\r\n setTimeout(() => {\r\n if (this.searchable && this.searchInput) {\r\n this.searchInput.nativeElement.focus();\r\n } else if (this.viewport) {\r\n this.viewport.elementRef.nativeElement.focus();\r\n }\r\n });\r\n } else {\r\n this.onTouched();\r\n }\r\n }\r\n\r\n close(): void {\r\n if (this.isOpen) {\r\n this.isOpen = false;\r\n this.onTouched();\r\n }\r\n }\r\n\r\n selectOption(option: DropdownOption): void {\r\n if (option.disabled) return;\r\n\r\n if (this.multiple) {\r\n const currentValues = Array.isArray(this.value) ? [...this.value] : [];\r\n const index = currentValues.indexOf(option.value);\r\n if (index > -1) {\r\n currentValues.splice(index, 1);\r\n } else {\r\n currentValues.push(option.value);\r\n }\r\n this.value = currentValues;\r\n } else {\r\n this.value = option.value;\r\n this.close();\r\n }\r\n\r\n this.onChange(this.value);\r\n this.selectionChange.emit(this.value);\r\n }\r\n\r\n isSelected(option: DropdownOption): boolean {\r\n if (this.multiple) {\r\n return Array.isArray(this.value) && this.value.includes(option.value);\r\n }\r\n return this.value === option.value;\r\n }\r\n\r\n onSearch(term: string): void {\r\n this.searchTerm = term;\r\n if (!term) {\r\n this.filteredOptions = [...this.options];\r\n } else {\r\n this.filteredOptions = this.options.filter(option =>\r\n option.label.toLowerCase().includes(term.toLowerCase())\r\n );\r\n }\r\n this.focusedIndex = -1;\r\n }\r\n\r\n clearSelection(event?: Event): void {\r\n if (event) {\r\n event.stopPropagation();\r\n }\r\n this.value = this.multiple ? [] : null;\r\n this.onChange(this.value);\r\n this.selectionChange.emit(this.value);\r\n }\r\n\r\n getIconType(icon: any): 'material' | 'fontawesome' | 'img' | 'none' {\r\n if (!icon) return 'none';\r\n if (typeof icon === 'string') {\r\n if (icon.includes('/') || icon.includes('.') || icon.startsWith('http')) {\r\n return 'img';\r\n }\r\n return 'material';\r\n }\r\n return icon.type || 'material';\r\n }\r\n\r\n getIconValue(icon: any): string {\r\n if (typeof icon === 'string') return icon;\r\n return icon?.value || '';\r\n }\r\n\r\n getSelectedLabel(): string {\r\n if (this.multiple) {\r\n const count = Array.isArray(this.value) ? this.value.length : 0;\r\n return count > 0 ? `${count} ${this.selectedSuffix}` : '';\r\n }\r\n\r\n if (!this.value) return '';\r\n const selected = this.options.find(opt => opt.value === this.value);\r\n return selected?.label || '';\r\n }\r\n\r\n hasValue(): boolean {\r\n if (this.multiple) {\r\n return Array.isArray(this.value) && this.value.length > 0;\r\n }\r\n return this.value !== null && this.value !== undefined && this.value !== '';\r\n }\r\n\r\n @HostListener('keydown', ['$event'])\r\n handleKeyboardEvent(event: KeyboardEvent): void {\r\n if (this.disabled) return;\r\n\r\n if (event.key === 'Escape') {\r\n this.close();\r\n return;\r\n }\r\n\r\n if (!this.isOpen && (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown')) {\r\n this.toggle();\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n if (!this.isOpen) return;\r\n\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n this.focusedIndex = Math.min(this.focusedIndex + 1, this.filteredOptions.length - 1);\r\n this.scrollToIndex(this.focusedIndex);\r\n event.preventDefault();\r\n break;\r\n case 'ArrowUp':\r\n this.focusedIndex = Math.max(this.focusedIndex - 1, 0);\r\n this.scrollToIndex(this.focusedIndex);\r\n event.preventDefault();\r\n break;\r\n case 'Enter':\r\n if (this.focusedIndex > -1) {\r\n this.selectOption(this.filteredOptions[this.focusedIndex]);\r\n }\r\n event.preventDefault();\r\n break;\r\n }\r\n }\r\n\r\n scrollToIndex(index: number): void {\r\n if (this.viewport) {\r\n this.viewport.scrollToIndex(index);\r\n }\r\n }\r\n\r\n private getStyleValue(value: string | undefined): string | undefined {\r\n return value ? `${value}` : undefined;\r\n }\r\n\r\n get wrapperStyles(): { [key: string]: string | undefined } {\r\n return {\r\n 'width': this.getStyleValue(this.width),\r\n '--cc-dropdown-label-gap': this.getStyleValue(this.gap),\r\n '--cc-dropdown-font-family': this.getStyleValue(this.fontFamily)\r\n };\r\n }\r\n\r\n get labelStyles(): { [key: string]: string | undefined } {\r\n return {\r\n '--cc-dropdown-label-color': this.getStyleValue(this.labelColor),\r\n '--cc-dropdown-font-size': this.getStyleValue(this.labelFontSize),\r\n '--cc-dropdown-font-weight': this.getStyleValue(this.labelFontWeight)\r\n };\r\n }\r\n\r\n get fieldStyles(): { [key: string]: string | undefined } {\r\n return {\r\n '--cc-dropdown-bg': this.getStyleValue(this.backgroundColor),\r\n '--cc-dropdown-border-radius': this.getStyleValue(this.borderRadius),\r\n '--cc-dropdown-border-color': this.getStyleValue(this.borderColor),\r\n '--cc-dropdown-border-width': this.getStyleValue(this.borderWidth),\r\n '--cc-dropdown-height': this.getStyleValue(this.height),\r\n '--cc-dropdown-padding': this.getStyleValue(this.padding),\r\n '--cc-dropdown-font-size': this.getStyleValue(this.fontSize),\r\n '--cc-dropdown-font-weight': this.getStyleValue(this.fontWeight),\r\n '--cc-dropdown-color': this.getStyleValue(this.color),\r\n '--cc-dropdown-placeholder-color': this.getStyleValue(this.placeholderColor),\r\n '--cc-dropdown-focus-border-color': this.getStyleValue(this.focusBorderColor),\r\n '--cc-dropdown-error-color': this.getStyleValue(this.errorColor),\r\n '--cc-dropdown-disabled-bg': this.getStyleValue(this.disabledBackgroundColor),\r\n '--cc-dropdown-disabled-color': this.getStyleValue(this.disabledColor),\r\n 'box-shadow': this.getStyleValue(this.boxShadow)\r\n };\r\n }\r\n}\r\n","<div class=\"cc-dropdown-wrapper\" [ngStyle]=\"wrapperStyles\" libClickOutside (libClickOutside)=\"close()\">\r\n <!-- Label -->\r\n <label *ngIf=\"label\" class=\"cc-dropdown-label\" [ngStyle]=\"labelStyles\">\r\n {{ label }}\r\n <span *ngIf=\"required\" class=\"cc-required\">{{ requiredMarker }}</span>\r\n </label>\r\n\r\n <!-- Trigger -->\r\n <div class=\"cc-dropdown-trigger\" [class.disabled]=\"disabled\" [class.open]=\"isOpen\" [class.error]=\"errorMessage\"\r\n (click)=\"toggle()\" tabindex=\"0\" (keydown)=\"handleKeyboardEvent($event)\" [ngStyle]=\"fieldStyles\">\r\n\r\n <div class=\"cc-selected-value\" *ngIf=\"hasValue()\">\r\n {{ multiple ? value.length + ' ' + selectedSuffix : getSelectedLabel() }}\r\n </div>\r\n <div class=\"cc-placeholder\" *ngIf=\"!hasValue()\">{{ placeholder }}</div>\r\n\r\n <div class=\"cc-actions\">\r\n <span *ngIf=\"clearable && hasValue() && !disabled\" class=\"cc-clear-btn\" (click)=\"clearSelection($event)\"\r\n [attr.aria-label]=\"clearAriaLabel\">\r\n <span class=\"material-icons\">close</span>\r\n </span>\r\n <span class=\"cc-arrow material-icons\">expand_more</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Dropdown Menu -->\r\n <div class=\"cc-dropdown-menu\" *ngIf=\"isOpen\">\r\n <!-- Search -->\r\n <div class=\"cc-search-container\" *ngIf=\"searchable\">\r\n <input type=\"text\" #searchInput [placeholder]=\"searchPlaceholder\"\r\n (input)=\"onSearch($any($event.target).value)\" (click)=\"$event.stopPropagation()\"\r\n class=\"cc-dropdown-search-input\" />\r\n </div>\r\n\r\n <!-- Options Virtual Scroll -->\r\n <cdk-virtual-scroll-viewport itemSize=\"40\" class=\"cc-virtual-scroll\"\r\n [style.height.px]=\"filteredOptions.length * 40 > 240 ? 240 : (filteredOptions.length * 40 || 40)\">\r\n\r\n <div *cdkVirtualFor=\"let option of filteredOptions; let i = index\" class=\"cc-option\"\r\n [class.selected]=\"isSelected(option)\" [class.focused]=\"i === focusedIndex\"\r\n [class.disabled]=\"option.disabled\" (click)=\"selectOption(option)\">\r\n\r\n <!-- Multi-select checkbox visual -->\r\n <span class=\"cc-multi-check\" *ngIf=\"multiple\">\r\n <span class=\"material-icons\" *ngIf=\"isSelected(option)\">check_box</span>\r\n <span class=\"material-icons\" *ngIf=\"!isSelected(option)\">check_box_outline_blank</span>\r\n </span>\r\n\r\n <!-- Icon -->\r\n <span class=\"cc-option-icon-wrapper\" *ngIf=\"option.icon\">\r\n <span class=\"material-icons\" *ngIf=\"getIconType(option.icon) === 'material'\">{{\r\n getIconValue(option.icon) }}</span>\r\n <i *ngIf=\"getIconType(option.icon) === 'fontawesome'\" [class]=\"getIconValue(option.icon)\"></i>\r\n <img *ngIf=\"getIconType(option.icon) === 'img'\" [src]=\"getIconValue(option.icon)\"\r\n class=\"cc-option-img\" alt=\"icon\" />\r\n </span>\r\n\r\n <span class=\"cc-option-label\">{{ option.label }}</span>\r\n\r\n <!-- Single-select check visual -->\r\n <span class=\"cc-single-check\" *ngIf=\"!multiple && isSelected(option)\">\r\n <span class=\"material-icons\">check</span>\r\n </span>\r\n </div>\r\n\r\n <div *ngIf=\"filteredOptions.length === 0\" class=\"cc-no-results\">{{ labels?.noResultsFound || 'No results\r\n found' }}</div>\r\n </cdk-virtual-scroll-viewport>\r\n </div>\r\n\r\n <!-- Error Message -->\r\n <div class=\"cc-error-message\" *ngIf=\"errorMessage\">{{ errorMessage }}</div>\r\n</div>","import { Component, Input, Output, EventEmitter, forwardRef, OnInit, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { CheckboxConfig, CheckboxOption, CheckboxLabels } from './checkbox.models';\r\n\r\n@Component({\r\n selector: 'lib-checkbox',\r\n templateUrl: './checkbox.component.html',\r\n styleUrls: ['./checkbox.component.scss'],\r\n standalone: false,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => CheckboxComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class CheckboxComponent implements ControlValueAccessor, OnInit, OnChanges {\r\n @Input() config: CheckboxConfig = {};\r\n @Input() labels?: CheckboxLabels;\r\n @Input() label: string = '';\r\n @Input() checked: boolean = false;\r\n @Input() disabled: boolean = false;\r\n @Input() required: boolean = false;\r\n @Input() indeterminate: boolean = false;\r\n @Input() options: CheckboxOption[] = [];\r\n @Input() labelPosition: 'before' | 'after' = 'after';\r\n @Input() color: string = '#007bff';\r\n @Input() borderRadius: string = '4px';\r\n @Input() value: any = null;\r\n @Input() errorMessage: string = '';\r\n\r\n // Style inputs\r\n @Input() width?: string;\r\n @Input() height?: string;\r\n @Input() fontSize?: string;\r\n @Input() fontWeight?: string;\r\n @Input() labelColor?: string;\r\n @Input() labelFontSize?: string;\r\n @Input() labelFontWeight?: string;\r\n @Input() gap?: string;\r\n @Input() fontFamily?: string;\r\n @Input() backgroundColor?: string;\r\n @Input() borderColor?: string;\r\n @Input() borderWidth?: string;\r\n @Input() padding?: string;\r\n @Input() placeholderColor?: string;\r\n @Input() focusBorderColor?: string;\r\n @Input() errorColor?: string;\r\n @Input() disabledBackgroundColor?: string;\r\n @Input() disabledColor?: string;\r\n @Input() boxShadow?: string;\r\n\r\n @Input() size?: string;\r\n @Input() checkedColor?: string;\r\n @Input() uncheckedColor?: string;\r\n @Input() groupLabelColor?: string;\r\n @Input() groupLabelFontSize?: string;\r\n @Input() groupLabelFontWeight?: string;\r\n\r\n @Output() checkedChange = new EventEmitter<any>();\r\n\r\n onChange: (value: any) => void = () => { };\r\n onTouched: () => void = () => { };\r\n\r\n ngOnInit(): void {\r\n this.updateFromConfig();\r\n this.updateFromLabels();\r\n\r\n if (this.isGroup) {\r\n this.value = this.options\r\n .filter(opt => opt.checked)\r\n .map(opt => opt.value);\r\n } else {\r\n this.value = this.checked;\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['config']) {\r\n this.updateFromConfig();\r\n }\r\n if (changes['labels']) {\r\n this.updateFromLabels();\r\n }\r\n }\r\n\r\n private updateFromConfig(): void {\r\n if (this.config) {\r\n this.label = this.config.label ?? this.label;\r\n this.checked = this.config.checked ?? this.checked;\r\n this.disabled = this.config.disabled ?? this.disabled;\r\n this.required = this.config.required ?? this.required;\r\n this.indeterminate = this.config.indeterminate ?? this.indeterminate;\r\n this.options = this.config.options || this.options;\r\n this.labelPosition = this.config.labelPosition ?? this.labelPosition;\r\n this.color = this.config.color ?? this.color;\r\n this.borderRadius = this.config.borderRadius ?? this.borderRadius;\r\n this.size = this.config.size ?? this.size;\r\n this.checkedColor = this.config.checkedColor ?? this.checkedColor;\r\n this.uncheckedColor = this.config.uncheckedColor ?? this.uncheckedColor;\r\n this.groupLabelColor = this.config.groupLabelColor ?? this.groupLabelColor;\r\n this.groupLabelFontSize = this.config.groupLabelFontSize ?? this.groupLabelFontSize;\r\n this.groupLabelFontWeight = this.config.groupLabelFontWeight ?? this.groupLabelFontWeight;\r\n this.labelFontSize = this.config.labelFontSize ?? this.labelFontSize;\r\n this.labelFontWeight = this.config.labelFontWeight ?? this.labelFontWeight;\r\n this.labelColor = this.config.labelColor ?? this.labelColor;\r\n this.gap = this.config.gap ?? this.gap;\r\n this.fontFamily = this.config.fontFamily ?? this.fontFamily;\r\n }\r\n }\r\n\r\n private updateFromLabels(): void {\r\n if (this.labels) {\r\n this.label = this.labels.label || this.label;\r\n }\r\n }\r\n\r\n get isGroup(): boolean {\r\n return this.options && this.options.length > 0;\r\n }\r\n\r\n get requiredMarker(): string {\r\n return this.labels?.requiredMarker || '*';\r\n }\r\n\r\n writeValue(value: any): void {\r\n if (this.isGroup) {\r\n this.value = Array.isArray(value) ? value : [];\r\n this.options.forEach(opt => {\r\n opt.checked = (this.value as any[]).includes(opt.value);\r\n });\r\n } else {\r\n this.value = !!value;\r\n this.checked = this.value as boolean;\r\n }\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n onCheckboxChange(event: any): void {\r\n const checked = event.target.checked;\r\n this.value = checked;\r\n this.checked = checked;\r\n this.onChange(this.value);\r\n this.onTouched();\r\n this.checkedChange.emit(this.value);\r\n }\r\n\r\n onGroupCheckboxChange(option: CheckboxOption, event: any): void {\r\n const checked = event.target.checked;\r\n option.checked = checked;\r\n\r\n const valueArray = this.value as any[];\r\n if (checked) {\r\n if (!valueArray.includes(option.value)) {\r\n this.value = [...valueArray, option.value];\r\n }\r\n } else {\r\n this.value = valueArray.filter(v => v !== option.value);\r\n }\r\n\r\n this.onChange(this.value);\r\n this.onTouched();\r\n this.checkedChange.emit(this.value);\r\n }\r\n\r\n private getStyleValue(value: string | undefined): string | undefined {\r\n return value ? `${value}` : undefined;\r\n }\r\n\r\n get wrapperStyles(): { [key: string]: string | undefined } {\r\n return {\r\n '--cc-checkbox-font-family': this.getStyleValue(this.fontFamily),\r\n '--cc-checkbox-font-size': this.getStyleValue(this.fontSize),\r\n '--cc-checkbox-font-weight': this.getStyleValue(this.fontWeight),\r\n '--cc-checkbox-label-color': this.getStyleValue(this.labelColor),\r\n '--cc-checkbox-size': this.getStyleValue(this.size),\r\n '--cc-checkbox-checked-color': this.getStyleValue(this.checkedColor),\r\n '--cc-checkbox-unchecked-color': this.getStyleValue(this.uncheckedColor),\r\n '--cc-checkbox-disabled-color': this.getStyleValue(this.disabledColor),\r\n '--cc-checkbox-error-color': this.getStyleValue(this.errorColor),\r\n '--cc-checkbox-group-gap': this.getStyleValue(this.gap),\r\n '--cc-checkbox-group-label-color': this.getStyleValue(this.groupLabelColor),\r\n '--cc-checkbox-group-label-font-size': this.getStyleValue(this.groupLabelFontSize),\r\n '--cc-checkbox-group-label-font-weight': this.getStyleValue(this.groupLabelFontWeight),\r\n '--cc-checkbox-label-font-size': this.getStyleValue(this.labelFontSize),\r\n '--cc-checkbox-label-font-weight': this.getStyleValue(this.labelFontWeight),\r\n '--cc-checkbox-border-radius': this.getStyleValue(this.borderRadius)\r\n };\r\n }\r\n}\r\n\r\n","<div class=\"cc-checkbox-wrapper\" [ngStyle]=\"wrapperStyles\">\r\n\r\n <!-- Single Checkbox -->\r\n <label *ngIf=\"!isGroup\" class=\"cc-checkbox-label\" [class.label-before]=\"labelPosition === 'before'\"\r\n [class.disabled]=\"disabled\" [class.checked]=\"checked\">\r\n <input type=\"checkbox\" class=\"cc-native-checkbox\" [checked]=\"checked\" [disabled]=\"disabled\"\r\n [required]=\"required\" [indeterminate]=\"indeterminate\" (change)=\"onCheckboxChange($event)\" />\r\n <span class=\"cc-checkmark\"></span>\r\n <span class=\"cc-text\" *ngIf=\"label\">{{ label }}</span>\r\n </label>\r\n\r\n <!-- Checkbox Group -->\r\n <div *ngIf=\"isGroup\" class=\"cc-checkbox-group\">\r\n <label *ngIf=\"label\" class=\"cc-checkbox-group-label\" [class.label-before]=\"labelPosition === 'before'\">\r\n {{ label }}\r\n <span *ngIf=\"required\" class=\"cc-required\">{{ requiredMarker }}</span>\r\n </label>\r\n\r\n <label *ngFor=\"let option of options\" class=\"cc-checkbox-label\" [class.disabled]=\"disabled || option.disabled\"\r\n [class.checked]=\"option.checked\">\r\n <input type=\"checkbox\" class=\"cc-native-checkbox\" [checked]=\"option.checked\"\r\n [disabled]=\"disabled || option.disabled\" (change)=\"onGroupCheckboxChange(option, $event)\" />\r\n <span class=\"cc-checkmark\"></span>\r\n <span class=\"cc-text\">{{ option.label }}</span>\r\n </label>\r\n </div>\r\n\r\n <div class=\"cc-error-message\" *ngIf=\"errorMessage\">{{ errorMessage }}</div>\r\n</div>","import { Component, Input, Output, EventEmitter, forwardRef, OnInit } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { RadioConfig, RadioOption, RadioLabels } from './radio.models';\r\n\r\n@Component({\r\n selector: 'lib-radio',\r\n templateUrl: './radio.component.html',\r\n styleUrls: ['./radio.component.scss'],\r\n standalone: false,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => RadioComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class RadioComponent implements ControlValueAccessor, OnInit {\r\n @Input() config?: RadioConfig;\r\n @Input() label: string = '';\r\n @Input() options: RadioOption[] = [];\r\n @Input() disabled: boolean = false;\r\n @Input() required: boolean = false;\r\n @Input() labelPosition: 'before' | 'after' = 'after';\r\n @Input() color: 'primary' | 'accent' | 'warn' = 'primary';\r\n @Input() layout: 'vertical' | 'horizontal' = 'vertical';\r\n\r\n // i18n Labels\r\n @Input() labels: RadioLabels = {};\r\n\r\n // Customization — Layout\r\n @Input() gap?: string;\r\n\r\n // Customization — Colors\r\n @Input() labelColor?: string;\r\n @Input() checkedColor?: string;\r\n @Input() uncheckedColor?: string;\r\n\r\n // Customization — Typography\r\n @Input() fontSize?: string;\r\n @Input() fontWeight?: string;\r\n @Input() fontFamily?: string;\r\n\r\n // Customization — Group label\r\n @Input() groupLabelColor?: string;\r\n @Input() groupLabelFontSize?: string;\r\n @Input() groupLabelFontWeight?: string;\r\n\r\n // Customization — States\r\n @Input() disabledColor?: string;\r\n @Input() errorColor?: string;\r\n\r\n // Customization — Size\r\n @Input() size?: string;\r\n @Input() borderRadius?: string;\r\n\r\n // Customization — Synonyms for Playground\r\n @Input() labelFontSize?: string;\r\n @Input() labelFontWeight?: string;\r\n\r\n @Output() selectionChange = new EventEmitter<any>();\r\n\r\n value: any;\r\n uuid = `radio-group-${Math.random().toString(36).substr(2, 9)}`;\r\n\r\n private onChange: (value: any) => void = () => { };\r\n private onTouched: () => void = () => { };\r\n\r\n ngOnInit(): void {\r\n this.updateFromConfig();\r\n // i18n labels override\r\n if (this.labels) {\r\n this.label = this.labels.label || this.label;\r\n }\r\n }\r\n\r\n ngOnChanges(changes: any): void {\r\n if (changes.config) {\r\n this.updateFromConfig();\r\n }\r\n }\r\n\r\n private updateFromConfig(): void {\r\n if (this.config) {\r\n this.label = this.config.label ?? this.label;\r\n this.options = this.config.options || this.options;\r\n this.disabled = this.config.disabled ?? this.disabled;\r\n this.required = this.config.required ?? this.required;\r\n this.labelPosition = this.config.labelPosition ?? this.labelPosition;\r\n this.color = this.config.color ?? this.color;\r\n this.layout = this.config.layout ?? this.layout;\r\n this.value = this.config.value;\r\n\r\n // Style mappings\r\n this.gap = this.config.gap ?? this.gap;\r\n this.labelColor = this.config.labelColor ?? this.labelColor;\r\n this.checkedColor = this.config.checkedColor ?? this.checkedColor;\r\n this.uncheckedColor = this.config.uncheckedColor ?? this.uncheckedColor;\r\n this.fontSize = this.config.fontSize ?? this.fontSize;\r\n this.fontWeight = this.config.fontWeight ?? this.fontWeight;\r\n this.fontFamily = this.config.fontFamily ?? this.fontFamily;\r\n this.groupLabelColor = this.config.groupLabelColor ?? this.groupLabelColor;\r\n this.groupLabelFontSize = this.config.groupLabelFontSize ?? this.groupLabelFontSize;\r\n this.groupLabelFontWeight = this.config.groupLabelFontWeight ?? this.groupLabelFontWeight;\r\n this.disabledColor = this.config.disabledColor ?? this.disabledColor;\r\n this.errorColor = this.config.errorColor ?? this.errorColor;\r\n this.size = this.config.size ?? this.size;\r\n this.borderRadius = this.config.borderRadius ?? this.borderRadius;\r\n this.labelFontSize = this.config.labelFontSize ?? this.labelFontSize;\r\n this.labelFontWeight = this.config.labelFontWeight ?? this.labelFontWeight;\r\n }\r\n }\r\n\r\n\r\n get requiredMarker(): string {\r\n return this.labels?.requiredMarker || '*';\r\n }\r\n\r\n writeValue(value: any): void {\r\n this.value = value;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n onRadioChange(event: any): void {\r\n this.value = event.target.value;\r\n this.onChange(this.value);\r\n this.onTouched();\r\n this.selectionChange.emit(this.value);\r\n }\r\n\r\n private getStyleValue(value: string | undefined): string | undefined {\r\n return value ? `${value}` : undefined;\r\n }\r\n\r\n get wrapperStyles(): { [key: string]: string | undefined } {\r\n return {\r\n '--cc-radio-font-family': this.getStyleValue(this.fontFamily),\r\n '--cc-radio-font-size': this.getStyleValue(this.fontSize || this.labelFontSize),\r\n '--cc-radio-font-weight': this.getStyleValue(this.fontWeight || this.labelFontWeight),\r\n '--cc-radio-label-color': this.getStyleValue(this.labelColor),\r\n '--cc-radio-size': this.getStyleValue(this.size),\r\n '--cc-radio-border-radius': this.getStyleValue(this.borderRadius),\r\n '--cc-radio-checked-color': this.getStyleValue(this.checkedColor),\r\n '--cc-radio-unchecked-color': this.getStyleValue(this.uncheckedColor),\r\n '--cc-radio-disabled-color': this.getStyleValue(this.disabledColor),\r\n '--cc-radio-error-color': this.getStyleValue(this.errorColor),\r\n '--cc-radio-group-gap': this.getStyleValue(this.gap),\r\n '--cc-radio-group-label-color': this.getStyleValue(this.groupLabelColor),\r\n '--cc-radio-group-label-font-size': this.getStyleValue(this.groupLabelFontSize),\r\n '--cc-radio-group-label-font-weight': this.getStyleValue(this.groupLabelFontWeight)\r\n };\r\n }\r\n}\r\n","<div class=\"cc-radio-wrapper\" [ngStyle]=\"wrapperStyles\">\r\n <label *ngIf=\"label\" class=\"cc-radio-group-label\" [class.disabled]=\"disabled\">\r\n {{ label }}\r\n <span *ngIf=\"required\" class=\"cc-required\">{{ requiredMarker }}</span>\r\n </label>\r\n\r\n <div class=\"cc-radio-group\" [class.horizontal]=\"layout === 'horizontal'\" [class.vertical]=\"layout === 'vertical'\"\r\n role=\"radiogroup\">\r\n\r\n <label class=\"cc-radio-label\" *ngFor=\"let option of options; let i = index\"\r\n [class.disabled]=\"disabled || option.disabled\" [class.checked]=\"value === option.value\"\r\n [class.label-before]=\"labelPosition === 'before'\">\r\n\r\n <input type=\"radio\" [name]=\"uuid\" [value]=\"option.value\" [checked]=\"value === option.value\"\r\n [disabled]=\"disabled || option.disabled\" (change)=\"onRadioChange($event)\" class=\"cc-native-radio\"\r\n [id]=\"uuid + '-' + i\">\r\n\r\n <span class=\"cc-radio-circle\"></span>\r\n <span class=\"cc-text\">{{ option.label }}</span>\r\n </label>\r\n </div>\r\n</div>","import { Component, Input, Output, EventEmitter, forwardRef, OnInit, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { ToggleConfig, ToggleLabels } from './toggle.models';\r\n\r\n@Component({\r\n selector: 'lib-toggle',\r\n templateUrl: './toggle.component.html',\r\n styleUrls: ['./toggle.component.scss'],\r\n standalone: false,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => ToggleComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class ToggleComponent implements ControlValueAccessor, OnInit, OnChanges {\r\n @Input() config?: ToggleConfig;\r\n @Input() labels?: ToggleLabels;\r\n @Input() label: string = '';\r\n @Input() checked: boolean = false;\r\n @Input() disabled: boolean = false;\r\n @Input() required: boolean = false;\r\n @Input() labelPosition: 'before' | 'after' = 'after';\r\n @Input() color: string = '#1A73E8';\r\n\r\n // Customization — Colors\r\n @Input() labelColor?: string;\r\n @Input() uncheckedColor?: string;\r\n @Input() checkedColor?: string;\r\n @Input() thumbColor?: string;\r\n @Input() checkedThumbColor?: string;\r\n\r\n // Customization — Typography\r\n @Input() fontSize?: string;\r\n @Input() fontWeight?: string;\r\n @Input() fontFamily?: string;\r\n\r\n // Customization — Size\r\n @Input() toggleWidth?: string;\r\n @Input() toggleHeight?: string;\r\n @Input() gap?: string;\r\n\r\n // Customization — Slider\r\n @Input() sliderColor?: string;\r\n\r\n // Customization — Label\r\n @Input() labelFontSize?: string;\r\n @Input() labelFontWeight?: string;\r\n\r\n // Customization — States\r\n @Input() disabledColor?: string;\r\n\r\n @Output() toggleChange = new EventEmitter<boolean>();\r\n\r\n value: boolean = false;\r\n\r\n private onChange: (value: any) => void = () => { };\r\n private onTouched: () => void = () => { };\r\n\r\n ngOnInit(): void {\r\n this.updateFromConfig();\r\n this.updateFromLabels();\r\n this.value = this.checked;\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['config']) {\r\n this.updateFromConfig();\r\n }\r\n if (changes['labels']) {\r\n this.updateFromLabels();\r\n }\r\n if (changes['checked']) {\r\n this.value = this.checked;\r\n }\r\n }\r\n\r\n private updateFromConfig(): void {\r\n if (this.config) {\r\n this.label = this.config.label ?? this.label;\r\n this.checked = this.config.checked ?? this.checked;\r\n this.disabled = this.config.disabled ?? this.disabled;\r\n this.required = this.config.required ?? this.required;\r\n this.labelPosition = this.config.labelPosition ?? this.labelPosition;\r\n this.color = this.config.color ?? this.color;\r\n this.uncheckedColor = this.config.uncheckedColor ?? this.uncheckedColor;\r\n this.checkedColor = this.config.checkedColor ?? this.checkedColor;\r\n this.thumbColor = this.config.thumbColor ?? this.thumbColor;\r\n this.checkedThumbColor = this.config.checkedThumbColor ?? this.checkedThumbColor;\r\n this.fontSize = this.config.fontSize ?? this.fontSize;\r\n this.fontWeight = this.config.fontWeight ?? this.fontWeight;\r\n this.toggleWidth = this.config.toggleWidth ?? this.toggleWidth;\r\n this.toggleHeight = this.config.toggleHeight ?? this.toggleHeight;\r\n this.gap = this.config.gap ?? this.gap;\r\n this.fontFamily = this.config.fontFamily ?? this.fontFamily;\r\n this.labelColor = this.config.labelColor ?? this.labelColor;\r\n this.labelFontSize = this.config.labelFontSize ?? this.labelFontSize;\r\n this.labelFontWeight = this.config.labelFontWeight ?? this.labelFontWeight;\r\n }\r\n }\r\n\r\n private updateFromLabels(): void {\r\n if (this.labels) {\r\n this.label = this.labels.label || this.label;\r\n }\r\n }\r\n\r\n writeValue(value: any): void {\r\n this.value = !!value;\r\n this.checked = this.value;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n onToggleChange(event: any): void {\r\n this.value = event.target.checked;\r\n this.checked = this.value;\r\n this.onChange(this.value);\r\n this.onTouched();\r\n this.toggleChange.emit(this.value);\r\n }\r\n\r\n private getStyleValue(value: string | undefined): string | undefined {\r\n return value ? `${value}` : undefined;\r\n }\r\n\r\n get wrapperStyles(): { [key: string]: string | undefined } {\r\n return {\r\n '--cc-toggle-font-family': this.getStyleValue(this.fontFamily),\r\n '--cc-toggle-font-size': this.getStyleValue(this.fontSize || this.labelFontSize),\r\n '--cc-toggle-font-weight': this.getStyleValue(this.fontWeight || this.labelFontWeight),\r\n '--cc-toggle-label-color': this.getStyleValue(this.labelColor),\r\n '--cc-toggle-width': this.getStyleValue(this.toggleWidth),\r\n '--cc-toggle-height': this.getStyleValue(this.toggleHeight),\r\n '--cc-toggle-gap': this.getStyleValue(this.gap),\r\n '--cc-toggle-unchecked-bg': this.getStyleValue(this.uncheckedColor),\r\n '--cc-toggle-checked-bg': this.getStyleValue(this.checkedColor || this.color),\r\n '--cc-toggle-thumb-color': this.getStyleValue(this.thumbColor || this.sliderColor),\r\n '--cc-toggle-checked-thumb-color': this.getStyleValue(this.checkedThumbColor),\r\n '--cc-toggle-disabled-color': this.getStyleValue(this.disabledColor)\r\n };\r\n }\r\n}\r\n","<div class=\"cc-toggle-wrapper\" [ngStyle]=\"wrapperStyles\">\r\n <label class=\"cc-toggle-label\" [class.label-before]=\"labelPosition === 'before'\" [class.disabled]=\"disabled\">\r\n\r\n <span class=\"cc-label-text\" *ngIf=\"label && labelPosition === 'before'\">{{ label }}</span>\r\n\r\n <span class=\"cc-toggle-switch\">\r\n <input type=\"checkbox\" class=\"cc-native-toggle\" [checked]=\"checked\" [disabled]=\"disabled\"\r\n (change)=\"onToggleChange($event)\" />\r\n <span class=\"cc-toggle-track\"></span>\r\n <span class=\"cc-toggle-thumb\"></span>\r\n </span>\r\n\r\n <span class=\"cc-label-text\" *ngIf=\"label && labelPosition === 'after'\">{{ label }}</span>\r\n </label>\r\n</div>","import { Component, Input, Output, EventEmitter, forwardRef, OnInit, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { DatePickerConfig, DatepickerLabels } from './datepicker.models';\r\n\r\n@Component({\r\n selector: 'lib-datepicker',\r\n templateUrl: './datepicker.component.html',\r\n styleUrls: ['./datepicker.component.scss'],\r\n standalone: false,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DatepickerComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class DatepickerComponent implements ControlValueAccessor, OnInit, OnChanges {\r\n @Input() config?: DatePickerConfig;\r\n @Input() labels?: DatepickerLabels;\r\n @Input() label: string = '';\r\n @Input() placeholder: string = '';\r\n @Input() disabled: boolean = false;\r\n @Input() required: boolean = false;\r\n @Input() minDate?: string | Date; // Support string for native input\r\n @Input() maxDate?: string | Date; // Support string for native input\r\n @Input() isRange: boolean = false;\r\n @Input() startView: 'month' | 'year' | 'multi-year' = 'month';\r\n @Input() value: any = null;\r\n @Input() startDate?: string | Date;\r\n @Input() endDate?: string | Date;\r\n @Input() errorMessage: string = '';\r\n\r\n // Style inputs\r\n @Input() width?: string;\r\n @Input() height?: string;\r\n @Input() borderRadius?: string;\r\n @Input() fontSize?: string;\r\n\r\n @Input() gap?: string;\r\n @Input() fontFamily?: string;\r\n @Input() labelColor?: string;\r\n @Input() labelFontSize?: string;\r\n @Input() labelFontWeight?: string;\r\n\r\n @Input() backgroundColor?: string;\r\n @Input() borderColor?: string;\r\n @Input() borderWidth?: string;\r\n @Input() padding?: string;\r\n @Input() fontWeight?: string;\r\n @Input() color?: string;\r\n @Input() placeholderColor?: string;\r\n @Input() focusBorderColor?: string;\r\n @Input() errorColor?: string;\r\n @Input() disabledBackgroundColor?: string;\r\n @Input() disabledColor?: string;\r\n @Input() boxShadow?: string;\r\n\r\n @Output() dateChange = new EventEmitter<any>();\r\n\r\n onChange: (value: any) => void = () => { };\r\n onTouched: () => void = () => { };\r\n\r\n focused = false;\r\n\r\n ngOnInit(): void {\r\n this.updateFromConfig();\r\n this.updateFromLabels();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['config']) {\r\n this.updateFromConfig();\r\n }\r\n if (changes['labels']) {\r\n this.updateFromLabels();\r\n }\r\n }\r\n\r\n private updateFromConfig(): void {\r\n if (this.config) {\r\n this.label = this.config.label ?? this.label;\r\n this.placeholder = this.config.placeholder ?? this.placeholder;\r\n this.disabled = this.config.disabled ?? this.disabled;\r\n this.required = this.config.required ?? this.required;\r\n this.minDate = this.config.minDate ?? this.minDate;\r\n this.maxDate = this.config.maxDate ?? this.maxDate;\r\n this.isRange = this.config.isRange ?? this.isRange;\r\n this.width = this.config.width ?? this.width;\r\n this.borderRadius = this.config.borderRadius ?? this.borderRadius;\r\n this.fontSize = this.config.fontSize ?? this.fontSize;\r\n this.errorMessage = this.config.errorMessage ?? this.errorMessage;\r\n this.gap = this.config.gap ?? this.gap;\r\n this.fontFamily = this.config.fontFamily ?? this.fontFamily;\r\n this.labelColor = this.config.labelColor ?? this.labelColor;\r\n this.labelFontSize = this.config.labelFontSize ?? this.labelFontSize;\r\n this.labelFontWeight = this.config.labelFontWeight ?? this.labelFontWeight;\r\n this.backgroundColor = this.config.backgroundColor ?? this.backgroundColor;\r\n this.borderColor = this.config.borderColor ?? this.borderColor;\r\n this.borderWidth = this.config.borderWidth ?? this.borderWidth;\r\n this.padding = this.config.padding ?? this.padding;\r\n this.fontWeight = this.config.fontWeight ?? this.fontWeight;\r\n this.color = this.config.color ?? this.color;\r\n this.placeholderColor = this.config.placeholderColor ?? this.placeholderColor;\r\n this.focusBorderColor = this.config.focusBorderColor ?? this.focusBorderColor;\r\n this.errorColor = this.config.errorColor ?? this.errorColor;\r\n this.disabledBackgroundColor = this.config.disabledBackgroundColor ?? this.disabledBackgroundColor;\r\n this.disabledColor = this.config.disabledColor ?? this.disabledColor;\r\n this.boxShadow = this.config.boxShadow ?? this.boxShadow;\r\n this.height = this.config.height ?? this.height;\r\n\r\n if (this.config.value !== undefined) {\r\n this.value = this.config.value;\r\n }\r\n if (this.config.startDate) {\r\n this.startDate = this.config.startDate;\r\n }\r\n if (this.config.endDate) {\r\n this.endDate = this.config.endDate;\r\n }\r\n }\r\n }\r\n\r\n private updateFromLabels(): void {\r\n if (this.labels) {\r\n this.label = this.labels.label || this.label;\r\n this.placeholder = this.labels.placeholder || this.placeholder;\r\n }\r\n }\r\n\r\n get requiredMarker(): string {\r\n return this.labels?.requiredMarker || '*';\r\n }\r\n\r\n get startDateLabel(): string {\r\n return this.labels?.startDateLabel || 'Start Date';\r\n }\r\n\r\n get endDateLabel(): string {\r\n return this.labels?.endDateLabel || 'End Date';\r\n }\r\n\r\n // Helper to format Date or string to YYYY-MM-DD for native input\r\n private formatDate(date: Date | string | undefined | null): string {\r\n if (!date) return '';\r\n if (typeof date === 'string') return date; // Assume already formatted or ISO\r\n try {\r\n return date.toISOString().split('T')[0];\r\n } catch (e) {\r\n return '';\r\n }\r\n }\r\n\r\n get formattedValue(): string {\r\n return this.formatDate(this.value);\r\n }\r\n\r\n get formattedStartDate(): string {\r\n return this.formatDate(this.startDate);\r\n }\r\n\r\n get formattedEndDate(): string {\r\n return this.formatDate(this.endDate);\r\n }\r\n\r\n get formattedMin(): string {\r\n return this.formatDate(this.minDate);\r\n }\r\n\r\n get formattedMax(): string {\r\n return this.formatDate(this.maxDate);\r\n }\r\n\r\n\r\n writeValue(value: any): void {\r\n if (this.isRange && value && typeof value === 'object' && 'start' in value) {\r\n this.startDate = value.start;\r\n this.endDate = value.end;\r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n onDateInput(event: any): void {\r\n const value = event.target.value;\r\n this.value = value; // Keep as string or convert if needed\r\n this.onChange(this.value);\r\n this.dateChange.emit(this.value);\r\n }\r\n\r\n onBlur(): void {\r\n this.focused = false;\r\n this.onTouched();\r\n }\r\n\r\n onFocus(): void {\r\n this.focused = true;\r\n }\r\n\r\n onRangeStartInput(event: any): void {\r\n this.startDate = event.target.value;\r\n this.updateRangeValue();\r\n }\r\n\r\n onRangeEndInput(event: any): void {\r\n this.endDate = event.target.value;\r\n this.updateRangeValue();\r\n }\r\n\r\n private updateRangeValue(): void {\r\n const rangeValue = { start: this.startDate, end: this.endDate };\r\n this.onChange(rangeValue);\r\n this.dateChange.emit(rangeValue);\r\n }\r\n\r\n private getStyleValue(value: string | undefined): string | undefined {\r\n return value ? `${value}` : undefined;\r\n }\r\n\r\n get wrapperStyles(): { [key: string]: string | undefined } {\r\n return {\r\n 'width': this.getStyleValue(this.width),\r\n '--cc-datepicker-label-gap': this.getStyleValue(this.gap),\r\n '--cc-datepicker-font-family': this.getStyleValue(this.fontFamily)\r\n };\r\n }\r\n\r\n get labelStyles(): { [key: string]: string | undefined } {\r\n return {\r\n '--cc-datepicker-label-color': this.getStyleValue(this.labelColor),\r\n '--cc-datepicker-label-font-size': this.getStyleValue(this.labelFontSize),\r\n '--cc-datepicker-label-font-weight': this.getStyleValue(this.labelFontWeight)\r\n };\r\n }\r\n\r\n get fieldStyles(): { [key: string]: string | undefined } {\r\n return {\r\n '--cc-datepicker-bg': this.getStyleValue(this.backgroundColor),\r\n '--cc-datepicker-border-radius': this.getStyleValue(this.borderRadius),\r\n '--cc-datepicker-border-color': this.getStyleValue(this.borderColor),\r\n '--cc-datepicker-border-width': this.getStyleValue(this.borderWidth),\r\n '--cc-datepicker-height': this.getStyleValue(this.height),\r\n '--cc-datepicker-padding': this.getStyleValue(this.padding),\r\n '--cc-datepicker-font-size': this.getStyleValue(this.fontSize),\r\n '--cc-datepicker-font-weight': this.getStyleValue(this.fontWeight),\r\n '--cc-datepicker-color': this.getStyleValue(this.color),\r\n '--cc-datepicker-placeholder-color': this.getStyleValue(this.placeholderColor),\r\n '--cc-datepicker-focus-border-color': this.getStyleValue(this.focusBorderColor),\r\n '--cc-datepicker-error-color': this.getStyleValue(this.errorColor),\r\n '--cc-datepicker-disabled-bg': this.getStyleValue(this.disabledBackgroundColor),\r\n '--cc-datepicker-disabled-color': this.getStyleValue(this.disabledColor),\r\n 'box-shadow': this.getStyleValue(this.boxShadow)\r\n };\r\n }\r\n}\r\n","<div class=\"cc-datepicker-wrapper\" [ngStyle]=\"wrapperStyles\">\r\n <label *ngIf=\"label\" class=\"cc-datepicker-label\" [ngStyle]=\"labelStyles\">\r\n {{ label }}\r\n <span *ngIf=\"required\" class=\"cc-required\">{{ requiredMarker }}</span>\r\n </label>\r\n\r\n <!-- Single Date Picker -->\r\n <div *ngIf=\"!isRange\" class=\"cc-datepicker-field\" [class.focused]=\"focused\" [class.disabled]=\"disabled\"\r\n [class.error]=\"errorMessage\" [ngStyle]=\"fieldStyles\">\r\n\r\n <input type=\"date\" class=\"cc-datepicker-input\" #dateInput [value]=\"formattedValue\" [disabled]=\"disabled\"\r\n [required]=\"required\" [min]=\"formattedMin\" [max]=\"formattedMax\" [placeholder]=\"placeholder\"\r\n (input)=\"onDateInput($event)\" (blur)=\"onBlur()\" (focus)=\"onFocus()\" (click)=\"dateInput.showPicker()\" />\r\n\r\n <span class=\"cc-datepicker-icon material-icons\" (click)=\"dateInput.showPicker()\">calendar_today</span>\r\n </div>\r\n\r\n <!-- Range Date Picker -->\r\n <div *ngIf=\"isRange\" class=\"cc-datepicker-range\">\r\n <!-- Start Date -->\r\n <div class=\"cc-datepicker-subfield\">\r\n <label class=\"cc-datepicker-sublabel\">{{ startDateLabel }}</label>\r\n <div class=\"cc-datepicker-field\" [class.disabled]=\"disabled\" [ngStyle]=\"fieldStyles\">\r\n <input type=\"date\" class=\"cc-datepicker-input\" [value]=\"formattedStartDate\" [disabled]=\"disabled\"\r\n [required]=\"required\" [min]=\"formattedMin\" [max]=\"formattedEndDate || formattedMax\"\r\n (input)=\"onRangeStartInput($event)\" />\r\n </div>\r\n </div>\r\n\r\n <!-- End Date -->\r\n <div class=\"cc-datepicker-subfield\">\r\n <label class=\"cc-datepicker-sublabel\">{{ endDateLabel }}</label>\r\n <div class=\"cc-datepicker-field\" [class.disabled]=\"disabled\" [ngStyle]=\"fieldStyles\">\r\n <input type=\"date\" class=\"cc-datepicker-input\" [value]=\"formattedEndDate\" [disabled]=\"disabled\"\r\n [required]=\"required\" [min]=\"formattedStartDate || formattedMin\" [max]=\"formattedMax\"\r\n (input)=\"onRangeEndInput($event)\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"cc-error-message\" *ngIf=\"errorMessage\">{{ errorMessage }}</div>\r\n</div>","import { Component, Input, Output, EventEmitter, forwardRef, OnInit, OnDestroy, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { Subject } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\r\nimport { FilterSearchConfig, SearchLabels } from './search.models';\r\n\r\n@Component({\r\n selector: 'lib-search',\r\n templateUrl: './search.component.html',\r\n styleUrls: ['./search.component.scss'],\r\n standalone: false,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SearchComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class SearchComponent implements ControlValueAccessor, OnInit, OnDestroy, OnChanges {\r\n @Input() config?: FilterSearchConfig;\r\n @Input() labels?: SearchLabels;\r\n @Input() placeholder: string = '';\r\n @Input() label: string = '';\r\n @Input() disabled: boolean = false;\r\n @Input() debounceMs: number = 300;\r\n @Input() clearable: boolean = true;\r\n @Input() value: any = '';\r\n\r\n // Style inputs\r\n @Input() width?: string;\r\n @Input() height?: string;\r\n @Input() borderRadius?: string;\r\n @Input() fontSize?: string;\r\n\r\n @Input() gap?: string;\r\n @Input() fontFamily?: string;\r\n @Input() labelColor?: string;\r\n @Input() labelFontSize?: string;\r\n @Input() labelFontWeight?: string;\r\n\r\n @Input() backgroundColor?: string;\r\n @Input() borderColor?: string;\r\n @Input() borderWidth?: string;\r\n @Input() border?: string; // Shorthand\r\n @Input() padding?: string;\r\n @Input() fontWeight?: string;\r\n @Input() color?: string;\r\n @Input() textColor?: string; // Alias for color or specific text color\r\n @Input() iconColor?: string;\r\n @Input() placeholderColor?: string;\r\n @Input() focusBorderColor?: string;\r\n @Input() disabledBackgroundColor?: string;\r\n @Input() disabledColor?: string;\r\n @Input() boxShadow?: string;\r\n\r\n @Output() search = new EventEmitter<string>();\r\n @Output() clear = new EventEmitter<void>();\r\n\r\n private searchSubject = new Subject<string>();\r\n focused = false;\r\n onChange: (value: any) => void = () => { };\r\n onTouched: () => void = () => { };\r\n\r\n ngOnInit(): void {\r\n this.updateFromConfig();\r\n this.updateFromLabels();\r\n this.searchSubject.pipe(\r\n debounceTime(this.debounceMs),\r\n distinctUntilChanged()\r\n ).subscribe(value => {\r\n this.search.emit(value);\r\n });\r\n }\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['config']) {\r\n this.updateFromConfig();\r\n }\r\n if (changes['labels']) {\r\n this.updateFromLabels();\r\n }\r\n }\r\n\r\n private updateFromConfig(): void {\r\n if (this.config) {\r\n this.placeholder = this.config.placeholder ?? this.placeholder;\r\n this.label = this.config.label ?? this.label;\r\n this.disabled = this.config.disabled ?? this.disabled;\r\n this.debounceMs = this.config.debounceTime ?? this.debounceMs;\r\n this.clearable = this.config.clearable ?? this.clearable;\r\n this.width = this.config.width ?? this.width;\r\n this.height = this.config.height ?? this.height;\r\n this.borderRadius = this.config.borderRadius ?? this.borderRadius;\r\n this.fontSize = this.config.fontSize ?? this.fontSize;\r\n this.gap = this.config.gap ?? this.gap;\r\n this.fontFamily = this.config.fontFamily ?? this.fontFamily;\r\n this.labelColor = this.config.labelColor ?? this.labelColor;\r\n this.labelFontSize = this.config.labelFontSize ?? this.labelFontSize;\r\n this.labelFontWeight = this.config.labelFontWeight ?? this.labelFontWeight;\r\n this.backgroundColor = this.config.backgroundColor ?? this.backgroundColor;\r\n this.borderColor = this.config.borderColor ?? this.borderColor;\r\n this.borderWidth = this.config.borderWidth ?? this.borderWidth;\r\n this.border = this.config.border ?? this.border;\r\n this.padding = this.config.padding ?? this.padding;\r\n this.fontWeight = this.config.fontWeight ?? this.fontWeight;\r\n this.color = this.config.color ?? this.color;\r\n this.textColor = this.config.textColor ?? this.textColor;\r\n this.iconColor = this.config.iconColor ?? this.iconColor;\r\n this.placeholderColor = this.config.placeholderColor ?? this.placeholderColor;\r\n this.focusBorderColor = this.config.focusBorderColor ?? this.focusBorderColor;\r\n this.disabledBackgroundColor = this.config.disabledBackgroundColor ?? this.disabledBackgroundColor;\r\n this.disabledColor = this.config.disabledColor ?? this.disabledColor;\r\n this.boxShadow = this.config.boxShadow ?? this.boxShadow;\r\n if (this.config.value) {\r\n this.value = this.config.value;\r\n }\r\n }\r\n }\r\n\r\n private updateFromLabels(): void {\r\n if (this.labels) {\r\n this.label = this.labels.label || this.label;\r\n this.placeholder = this.labels.placeholder || this.placeholder;\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.searchSubject.complete();\r\n }\r\n\r\n get clearAriaLabel(): string {\r\n return this.labels?.clearAriaLabel || 'Clear search';\r\n }\r\n\r\n writeValue(value: any): void {\r\n this.value = value || '';\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n onInputChange(event: any): void {\r\n this.value = event.target.value;\r\n this.onChange(this.value);\r\n this.searchSubject.next(this.value);\r\n }\r\n\r\n onClear(): void {\r\n this.value = '';\r\n this.onChange(this.value);\r\n this.searchSubject.next(this.value);\r\n this.clear.emit();\r\n }\r\n\r\n onBlur(): void {\r\n this.focused = false;\r\n this.onTouched();\r\n }\r\n\r\n onFocus(): void {\r\n this.focused = true;\r\n }\r\n\r\n private getStyleValue(value: string | undefined): string | undefined {\r\n return value ? `${value}` : undefined;\r\n }\r\n\r\n get wrapperStyles(): { [key: string]: string | undefined } {\r\n return {\r\n 'width': this.getStyleValue(this.width),\r\n '--cc-search-label-gap': this.getStyleValue(this.gap),\r\n '--cc-search-font-family': this.getStyleValue(this.fontFamily)\r\n };\r\n }\r\n\r\n get labelStyles(): { [key: string]: string | undefined } {\r\n return {\r\n '--cc-search-label-color': this.getStyleValue(this.labelColor),\r\n '--cc-search-label-font-size': this.getStyleValue(this.labelFontSize),\r\n '--cc-search-label-font-weight': this.getStyleValue(this.labelFontWeight)\r\n };\r\n }\r\n\r\n get fieldStyles(): { [key: string]: string | undefined } {\r\n return {\r\n '--cc-search-bg': this.getStyleValue(this.backgroundColor),\r\n '--cc-search-border-radius': this.getStyleValue(this.borderRadius),\r\n '--cc-search-border-color': this.getStyleValue(this.borderColor),\r\n '--cc-search-border-width': this.getStyleValue(this.borderWidth),\r\n '--cc-search-border': this.getStyleValue(this.border),\r\n '--cc-search-height': this.getStyleValue(this.height),\r\n '--cc-search-padding': this.getStyleValue(this.padding),\r\n '--cc-search-font-size': this.getStyleValue(this.fontSize),\r\n '--cc-search-font-weight': this.getStyleValue(this.fontWeight),\r\n '--cc-search-color': this.getStyleValue(this.color || this.textColor),\r\n '--cc-search-icon-color': this.getStyleValue(this.iconColor),\r\n '--cc-search-placeholder-color': this.getStyleValue(this.placeholderColor),\r\n '--cc-search-focus-border-color': this.getStyleValue(this.focusBorderColor),\r\n '--cc-search-disabled-bg': this.getStyleValue(this.disabledBackgroundColor),\r\n '--cc-search-disabled-color': this.getStyleValue(this.disabledColor),\r\n 'box-shadow': this.getStyleValue(this.boxShadow)\r\n };\r\n }\r\n}\r\n","<div class=\"cc-search-wrapper\" [ngStyle]=\"wrapperStyles\">\r\n <label *ngIf=\"label\" class=\"cc-search-label\" [ngStyle]=\"labelStyles\">{{ label }}</label>\r\n\r\n <div class=\"cc-search-field\" [class.focused]=\"focused\" [class.disabled]=\"disabled\" [ngStyle]=\"fieldStyles\">\r\n <span class=\"cc-search-icon material-icons\">search</span>\r\n\r\n <input type=\"text\" class=\"cc-search-input\" [value]=\"value\" [placeholder]=\"placeholder\" [disabled]=\"disabled\"\r\n (input)=\"onInputChange($event)\" (blur)=\"onBlur()\" (focus)=\"onFocus()\" />\r\n\r\n <button *ngIf=\"clearable && value && !disabled\" type=\"button\" class=\"cc-clear-btn\" (click)=\"onClear()\"\r\n [attr.aria-label]=\"clearAriaLabel\">\r\n <span class=\"material-icons\">close</span>\r\n </button>\r\n </div>\r\n</div>","import { Component, EventEmitter, Input, OnInit, Output, forwardRef } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\nimport { FilterSidebarChangeEvent, FilterSidebarConfig, FilterSidebarOutput, FilterItem } from '../../filter-sidebar.models';\r\n\r\n@Component({\r\n selector: 'lib-filter-sidebar',\r\n templateUrl: './filter-sidebar.component.html',\r\n styleUrls: ['./filter-sidebar.component.scss'],\r\n standalone: false,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => FilterSidebarComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class FilterSidebarComponent implements OnInit, ControlValueAccessor {\r\n @Input() config!: FilterSidebarConfig;\r\n @Input() initialFilters: FilterSidebarOutput = {};\r\n\r\n @Output() filterChange = new EventEmitter<FilterSidebarChangeEvent>();\r\n @Output() filterApply = new EventEmitter<FilterSidebarOutput>();\r\n @Output() filterClear = new EventEmitter<void>();\r\n @Output() showCodeSnippet = new EventEmitter<void>();\r\n @Output() close = new EventEmitter<void>();\r\n\r\n filters: FilterSidebarOutput = {};\r\n\r\n // ControlValueAccessor callbacks\r\n onChange: any = () => { };\r\n onTouched: any = () => { };\r\n\r\n isCollapsed = false;\r\n\r\n toggleCollapse(): void {\r\n this.isCollapsed = !this.isCollapsed;\r\n }\r\n\r\n constructor(\r\n private router: Router,\r\n private route: ActivatedRoute\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n if (this.initialFilters) {\r\n this.filters = { ...this.initialFilters };\r\n }\r\n\r\n // Initialize from URL query params if persistent\r\n if (this.config.settings?.persistent !== false) {\r\n this.route.queryParams.subscribe(params => {\r\n if (Object.keys(params).length > 0) {\r\n // Start with existing filters to preserve defaults not in URL\r\n const newFilters = { ...this.filters };\r\n\r\n Object.keys(params).forEach(key => {\r\n // Try to parse arrays or numbers if possible, otherwise string\r\n // This is a naive implementation, ideally config should dictate type\r\n const val = params[key];\r\n // If comma separated and looked like array? For now keep simple\r\n newFilters[key] = val;\r\n });\r\n\r\n this.filters = newFilters;\r\n }\r\n });\r\n }\r\n }\r\n\r\n // ControlValueAccessor Implementation\r\n writeValue(value: any): void {\r\n if (value) {\r\n this.filters = { ...value };\r\n } else {\r\n this.filters = {};\r\n }\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n // Component Logic\r\n onValueChange(key: string | undefined, value: any): void {\r\n if (!key) return;\r\n\r\n this.filters[key] = value;\r\n this.notifyChanges(key, value);\r\n }\r\n\r\n private notifyChanges(key: string, value: any): void {\r\n this.onChange(this.filters);\r\n\r\n // Update URL if persistent\r\n if (this.config.settings?.persistent !== false) {\r\n this.updateUrl();\r\n }\r\n\r\n this.filterChange.emit({\r\n key,\r\n value,\r\n allFilters: this.filters\r\n });\r\n }\r\n\r\n private updateUrl(): void {\r\n this.router.navigate([], {\r\n relativeTo: this.route,\r\n queryParams: this.filters,\r\n queryParamsHandling: 'merge',\r\n replaceUrl: true\r\n });\r\n }\r\n\r\n applyFilters(): void {\r\n this.filterApply.emit(this.filters);\r\n }\r\n\r\n clearFilters(): void {\r\n this.filters = {};\r\n this.onChange(this.filters);\r\n\r\n if (this.config.settings?.persistent !== false) {\r\n this.router.navigate([], {\r\n relativeTo: this.route,\r\n queryParams: {},\r\n });\r\n }\r\n\r\n this.filterClear.emit();\r\n }\r\n\r\n onClose(): void {\r\n this.close.emit();\r\n }\r\n\r\n onShowCodeSnippet(): void {\r\n this.showCodeSnippet.emit();\r\n }\r\n\r\n get sidebarStyles(): { [key: string]: string } {\r\n const styles: { [key: string]: string } = {};\r\n if (this.config?.styles) {\r\n if (this.config.styles.width) styles['--cc-filter-sidebar-width'] = this.config.styles.width;\r\n if (this.config.styles.padding) styles['--cc-filter-sidebar-padding'] = this.config.styles.padding;\r\n if (this.config.styles.gap) styles['--cc-filter-sidebar-gap'] = this.config.styles.gap;\r\n if (this.config.styles.backgroundColor) styles['--cc-filter-sidebar-bg'] = this.config.styles.backgroundColor;\r\n if (this.config.styles.headerHeight) styles['--cc-filter-header-height'] = this.config.styles.headerHeight;\r\n if (this.config.styles.borderRadius) styles['--cc-filter-sidebar-border-radius'] = this.config.styles.borderRadius;\r\n }\r\n return styles;\r\n }\r\n\r\n trackByFn(index: number, item: FilterItem): any {\r\n return item.key || index;\r\n }\r\n}\r\n","<div class=\"cc-filter-sidebar\" [ngStyle]=\"sidebarStyles\" [class.collapsed]=\"isCollapsed\">\r\n\r\n <!-- Header -->\r\n <div class=\"cc-filter-header\" *ngIf=\"config.header?.visible !== false\">\r\n <div class=\"cc-header-content\">\r\n <span class=\"cc-header-title\" *ngIf=\"config.header?.title\">\r\n <span *ngIf=\"config.header?.icon\" [class]=\"config.header?.icon\" class=\"cc-header-icon material-icons\">\r\n <!-- {{config.header?.icon }} -->\r\n </span>\r\n {{ config.header?.title }}\r\n </span>\r\n <ng-content select=\"[header-actions]\"></ng-content>\r\n </div>\r\n <button type=\"button\" *ngIf=\"config.settings?.collapsible\" (click)=\"toggleCollapse()\" class=\"cc-icon-btn\"\r\n [attr.aria-label]=\"isCollapsed ? config.labels?.expandAriaLabel : config.labels?.collapseAriaLabel\">\r\n <span class=\"material-icons\">{{ isCollapsed ? 'menu_open' : 'menu' }}</span>\r\n </button>\r\n <button type=\"button\" *ngIf=\"config.header?.showClose && !isCollapsed\" (click)=\"onClose()\"\r\n class=\"cc-icon-btn cc-close-btn\" [attr.aria-label]=\"config.labels?.closeAriaLabel\">\r\n <span class=\"material-icons\">close</span>\r\n </button>\r\n <!-- Code snippet debug (optional) -->\r\n <button type=\"button\" *ngIf=\"config.settings?.showCodeSnippet\" (click)=\"onShowCodeSnippet()\" class=\"cc-icon-btn\"\r\n [attr.aria-label]=\"config.labels?.codeSnippetAriaLabel\">\r\n <span class=\"material-icons\">code</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Content (Scrollable) -->\r\n <div class=\"cc-filter-content\" [class.hidden]=\"isCollapsed\">\r\n <ng-container *ngFor=\"let item of config.items; trackBy: trackByFn\">\r\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { item: item }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div class=\"cc-filter-footer\" *ngIf=\"config.footer?.visible !== false && !isCollapsed\">\r\n <lib-button variant=\"outline\" color=\"warn\" class=\"cc-btn-clear\"\r\n *ngIf=\"config.footer?.clearButton?.visible !== false\" (click)=\"clearFilters()\">\r\n {{ config.footer?.clearButton?.label }}\r\n </lib-button>\r\n <lib-button variant=\"primary\" color=\"warn\" class=\"cc-btn-apply\"\r\n *ngIf=\"config.footer?.applyButton?.visible !== false\" [disabled]=\"config.footer?.applyButton?.disabled\"\r\n (click)=\"applyFilters()\">\r\n {{ config.footer?.applyButton?.label }}\r\n </lib-button>\r\n </div>\r\n</div>\r\n\r\n<!-- Recursive Template for Items -->\r\n<ng-template #itemTemplate let-item=\"item\">\r\n <div class=\"cc-filter-item\" [ngClass]=\"['type-' + item.type]\"\r\n [style.display]=\"item.visible === false ? 'none' : 'block'\" [ngStyle]=\"item.styles\">\r\n\r\n <ng-container [ngSwitch]=\"item.type\">\r\n\r\n <!-- Input -->\r\n <lib-input *ngSwitchCase=\"'input'\" [config]=\"item.inputConfig\" [label]=\"item.label\"\r\n [ngModel]=\"filters[item.key]\" (valueChange)=\"onValueChange(item.key, $event)\">\r\n </lib-input>\r\n\r\n <!-- Dropdown -->\r\n <lib-dropdown *ngSwitchCase=\"'dropdown'\" [config]=\"item.dropdownConfig\" [label]=\"item.label\"\r\n [ngModel]=\"filters[item.key]\" (selectionChange)=\"onValueChange(item.key, $event)\">\r\n </lib-dropdown>\r\n\r\n <!-- Checkbox -->\r\n <lib-checkbox *ngSwitchCase=\"'checkbox'\" [config]=\"item.checkboxConfig\" [label]=\"item.label\"\r\n [checked]=\"!!filters[item.key]\" (checkedChange)=\"onValueChange(item.key, $event)\">\r\n </lib-checkbox>\r\n\r\n <!-- Radio -->\r\n <lib-radio *ngSwitchCase=\"'radio'\" [config]=\"item.radioConfig\" [label]=\"item.label\"\r\n [ngModel]=\"filters[item.key]\" (selectionChange)=\"onValueChange(item.key, $event)\">\r\n </lib-radio>\r\n\r\n <!-- Toggle -->\r\n <lib-toggle *ngSwitchCase=\"'toggle'\" [config]=\"item.toggleConfig\" [label]=\"item.label\"\r\n [checked]=\"filters[item.key]\" (toggleChange)=\"onValueChange(item.key, $event)\">\r\n </lib-toggle>\r\n\r\n <!-- Datepicker -->\r\n <lib-datepicker *ngSwitchCase=\"'datepicker'\" [config]=\"item.datepickerConfig\" [label]=\"item.label\"\r\n [ngModel]=\"filters[item.key]\" (dateChange)=\"onValueChange(item.key, $event)\">\r\n </lib-datepicker>\r\n\r\n <!-- Search -->\r\n <lib-search *ngSwitchCase=\"'active-search'\" [config]=\"item.searchConfig\" [label]=\"item.label\"\r\n [ngModel]=\"filters[item.key]\" (search)=\"onValueChange(item.key, $event)\">\r\n </lib-search>\r\n\r\n <!-- Group / Accordion -->\r\n <div *ngSwitchCase=\"'group'\" class=\"cc-accordion-item\" [class.expanded]=\"item.expanded\">\r\n <button type=\"button\" class=\"cc-accordion-header\" (click)=\"item.expanded = !item.expanded\">\r\n <span class=\"cc-accordion-title\">{{ item.label }}</span>\r\n <span class=\"material-icons cc-accordion-icon\">{{ item.expanded ? 'expand_less' : 'expand_more'\r\n }}</span>\r\n </button>\r\n\r\n <div class=\"cc-accordion-body\" *ngIf=\"item.expanded\">\r\n <ng-container *ngFor=\"let child of item.children; trackBy: trackByFn\">\r\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { item: child }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Custom Divider -->\r\n <div *ngSwitchCase=\"'divider'\" class=\"cc-filter-divider\"></div>\r\n\r\n </ng-container>\r\n </div>\r\n</ng-template>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\r\nimport { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { InputComponent } from './components/input/input.component';\r\nimport { DropdownComponent } from './components/dropdown/dropdown.component';\r\nimport { CheckboxComponent } from './components/checkbox/checkbox.component';\r\nimport { RadioComponent } from './components/radio/radio.component';\r\nimport { ToggleComponent } from './components/toggle/toggle.component';\r\nimport { DatepickerComponent } from './components/datepicker/datepicker.component';\r\nimport { SearchComponent } from './components/search/search.component';\r\nimport { ClickOutsideDirective } from './directives/click-outside.directive';\r\n\r\n@NgModule({\r\n declarations: [\r\n InputComponent,\r\n DropdownComponent,\r\n CheckboxComponent,\r\n RadioComponent,\r\n ToggleComponent,\r\n DatepickerComponent,\r\n SearchComponent,\r\n ClickOutsideDirective\r\n ],\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n FormsModule,\r\n ScrollingModule\r\n ],\r\n exports: [\r\n InputComponent,\r\n DropdownComponent,\r\n CheckboxComponent,\r\n RadioComponent,\r\n ToggleComponent,\r\n DatepickerComponent,\r\n SearchComponent\r\n ]\r\n})\r\nexport class FormComponentsModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { FilterSidebarComponent } from './components/filter-sidebar/filter-sidebar.component';\r\nimport { FormComponentsModule } from '../form-components/form-components.module';\r\nimport { ButtonModule } from '../button/button.module';\r\n\r\n@NgModule({\r\n declarations: [\r\n FilterSidebarComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n FormComponentsModule,\r\n ButtonModule\r\n ],\r\n exports: [\r\n FilterSidebarComponent\r\n ]\r\n})\r\nexport class FilterSidebarModule { }\r\n","import { Component, Input, Output, EventEmitter, HostBinding } from '@angular/core';\r\n\r\nexport interface SummaryCardConfig {\r\n header: string;\r\n value: string;\r\n description?: string;\r\n\r\n // Icon or Image (mutually exclusive)\r\n icon?: string; // Material icon name\r\n iconImage?: string; // URL for image icon\r\n\r\n // Layout configurations\r\n descriptionPosition?: 'bottom' | 'inline'; // 'bottom' (default) or 'inline' (right side of value)\r\n\r\n // Extended Content\r\n valueSubtext?: string; // Text displayed next to the value (e.g. \"/ 15 Target\")\r\n metaData?: SummaryCardMeta[]; // Right-aligned meta information\r\n\r\n // Color configurations\r\n valueColor?: string; // Color for the value text\r\n headerColor?: string; // Color for the header text\r\n descriptionColor?: string; // Color for the description text\r\n iconColor?: string; // Color for the icon\r\n iconBackgroundColor?: string; // Background color for the icon container\r\n\r\n // Additional styling\r\n iconClass?: string; // Additional CSS classes for icon\r\n valueClass?: string; // Additional CSS classes for value\r\n headerClass?: string; // Additional CSS classes for header\r\n descriptionClass?: string; // Additional CSS classes for description\r\n\r\n // Interaction\r\n isDisabled?: boolean; // Disable click interaction\r\n isClickable?: boolean; // Whether card is clickable (default: true)\r\n}\r\n\r\nexport interface SummaryCardMeta {\r\n text: string;\r\n type?: 'text' | 'pill'; // 'text' (default) or 'pill' (badge style)\r\n color?: string; // Text color\r\n backgroundColor?: string; // Background color for pill\r\n cssClass?: string; // Custom CSS class\r\n}\r\n\r\nexport interface SummaryCardLabels {\r\n iconAlt: string;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-summary-card',\r\n templateUrl: './summary-card.component.html',\r\n styleUrls: ['./summary-card.component.scss'],\r\n standalone: false\r\n})\r\nexport class SummaryCardComponent {\r\n @Input() config!: SummaryCardConfig;\r\n @Input() theme?: 'theme-1' | 'theme-2';\r\n @Input() labels: any;\r\n @Output() cardClick = new EventEmitter<void>();\r\n\r\n constructor() { }\r\n\r\n onCardClick(): void {\r\n if (this.config?.isDisabled || this.config?.isClickable === false) {\r\n return;\r\n }\r\n this.cardClick.emit();\r\n }\r\n\r\n get cardClasses(): { [key: string]: boolean } {\r\n return {\r\n 'disabled': !!this.config?.isDisabled,\r\n 'clickable': this.config?.isClickable !== false && !this.config?.isDisabled\r\n };\r\n }\r\n\r\n get iconStyles(): { [key: string]: string } {\r\n const styles: { [key: string]: string } = {};\r\n if (this.config.iconBackgroundColor) {\r\n styles['backgroundColor'] = this.config.iconBackgroundColor;\r\n }\r\n if (this.config.iconColor) {\r\n styles['color'] = this.config.iconColor;\r\n }\r\n return styles;\r\n }\r\n\r\n get headerStyles(): { [key: string]: string } {\r\n const styles: { [key: string]: string } = {};\r\n if (this.config.headerColor) {\r\n styles['color'] = this.config.headerColor;\r\n }\r\n return styles;\r\n }\r\n\r\n get valueStyles(): { [key: string]: string } {\r\n const styles: { [key: string]: string } = {};\r\n if (this.config.valueColor) {\r\n styles['color'] = this.config.valueColor;\r\n }\r\n return styles;\r\n }\r\n\r\n get descriptionStyles(): { [key: string]: string } {\r\n const styles: { [key: string]: string } = {};\r\n if (this.config.descriptionColor) {\r\n styles['color'] = this.config.descriptionColor;\r\n }\r\n return styles;\r\n }\r\n\r\n get isDescriptionInline(): boolean {\r\n return this.config.descriptionPosition === 'inline';\r\n }\r\n\r\n getMetaStyles(meta: SummaryCardMeta): { [key: string]: string } {\r\n const styles: { [key: string]: string } = {};\r\n if (meta.color) {\r\n styles['color'] = meta.color;\r\n }\r\n if (meta.backgroundColor && meta.type === 'pill') {\r\n styles['backgroundColor'] = meta.backgroundColor;\r\n }\r\n return styles;\r\n }\r\n}\r\n","<div class=\"cc-summary-card\" (click)=\"onCardClick()\">\r\n <!-- Icon Section (Left Side) -->\r\n <div class=\"icon-section\" *ngIf=\"config.icon || config.iconImage\" [ngClass]=\"config.iconClass\"\r\n [ngStyle]=\"iconStyles\">\r\n <mat-icon *ngIf=\"config.icon\">{{ config.icon }}</mat-icon>\r\n <img *ngIf=\"!config.icon && config.iconImage\" [src]=\"config.iconImage\" [alt]=\"labels.iconAlt\">\r\n </div>\r\n\r\n <!-- Right Section (Header + Value/Meta) -->\r\n <div class=\"right-section\">\r\n <!-- Header (Full Width on Right) -->\r\n <div class=\"header\" [ngClass]=\"config.headerClass\" [ngStyle]=\"headerStyles\">\r\n {{ config.header }}\r\n </div>\r\n\r\n <!-- Value and Meta Row -->\r\n <div class=\"value-meta-row\">\r\n <!-- Content Section -->\r\n <div class=\"content-section\">\r\n <!-- Value Row (with optional inline description) -->\r\n <div class=\"value-row\" [class.inline-layout]=\"isDescriptionInline\">\r\n <div class=\"value-container\">\r\n <div class=\"value\" [ngClass]=\"config.valueClass\" [ngStyle]=\"valueStyles\">\r\n {{ config.value }}\r\n <span *ngIf=\"config.valueSubtext\" class=\"value-subtext\">{{ config.valueSubtext }}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Description (inline or bottom based on config) -->\r\n <div class=\"description\" *ngIf=\"config.description\" [ngClass]=\"config.descriptionClass\"\r\n [ngStyle]=\"descriptionStyles\">\r\n {{ config.description }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Meta/Status Section (Aligned with Value) -->\r\n <div class=\"meta-section\" *ngIf=\"config.metaData && config.metaData.length > 0\">\r\n <div *ngFor=\"let meta of config.metaData\" class=\"meta-item\"\r\n [ngClass]=\"[meta.type === 'pill' ? 'meta-pill' : 'meta-text', meta.cssClass || '']\"\r\n [ngStyle]=\"getMetaStyles(meta)\">\r\n {{ meta.text }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { SummaryCardComponent } from './components/summary-card/summary-card.component';\r\n\r\n@NgModule({\r\n declarations: [\r\n SummaryCardComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n MatIconModule\r\n ],\r\n exports: [\r\n SummaryCardComponent\r\n ]\r\n})\r\nexport class SummaryCardModule { }\r\n","\r\n/**\r\n * Recursively translates the Configuration object using the provided labels map.\r\n * This function processes:\r\n * - Section Titles\r\n * - Field Labels\r\n * - Placeholders\r\n * - Help Texts\r\n * - Option Labels (for static options)\r\n * - Repeater Labels (addLabel, repeaterItemLabel)\r\n * \r\n * @param config The FormConfig object to translate\r\n * @param labelsMap A map of key-value pairs for translation (Flattened JSON)\r\n * @returns A new FormConfig object with translated strings\r\n */\r\nexport function translateConfig(config: any, labelsMap: any): any {\r\n if (!config || !labelsMap) {\r\n return config;\r\n }\r\n\r\n // Deep clone to avoid mutating original config, if not already cloned\r\n // Note: Assuming config passed here is already a clone to be modified or we clone it.\r\n // To be safe, let's clone it if it's the root call, but this function is helper.\r\n // In component we do: processedConfig = JSON.parse(JSON.stringify(config)); -> translateConfig(processedConfig, map)\r\n // So distinct reference is passed.\r\n\r\n // Helper to translate a single key\r\n const t = (key: string) => {\r\n return labelsMap[key] || key;\r\n };\r\n\r\n if (config.sections) {\r\n config.sections.forEach((section: any) => {\r\n if (section.sectionTitle) {\r\n section.sectionTitle = t(section.sectionTitle);\r\n }\r\n if (section.repeaterItemLabel) {\r\n section.repeaterItemLabel = t(section.repeaterItemLabel);\r\n }\r\n if (section.addLabel) {\r\n section.addLabel = t(section.addLabel);\r\n }\r\n\r\n if (section.fields) {\r\n section.fields.forEach((field: any) => {\r\n translateField(field, t);\r\n });\r\n }\r\n });\r\n }\r\n\r\n return config;\r\n}\r\n\r\nfunction translateField(field: any, t: (key: string) => string) {\r\n if (field.label) {\r\n field.label = t(field.label);\r\n }\r\n if (field.placeholder) {\r\n field.placeholder = t(field.placeholder);\r\n }\r\n if (field.helpText) {\r\n field.helpText = t(field.helpText);\r\n }\r\n if (field.suffixText) {\r\n field.suffixText = t(field.suffixText);\r\n }\r\n if (field.prefixText) { // Assuming prefixText might exist or be added\r\n field.prefixText = t(field.prefixText);\r\n }\r\n\r\n // Translate options if they exist\r\n if (field.options) {\r\n field.options.forEach((opt: any) => {\r\n if (opt.label) {\r\n opt.label = t(opt.label);\r\n }\r\n });\r\n }\r\n\r\n // Handle subFields for composite type\r\n if (field.subFields) {\r\n field.subFields.forEach((sub: any) => {\r\n translateField(sub, t);\r\n });\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnInit, Output, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { FormBuilder, FormGroup, FormControl, FormArray, Validators, AbstractControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport {\r\n FormConfig,\r\n FormField,\r\n FormSection,\r\n FormOption,\r\n JsonFormConfig,\r\n JsonFieldConfig,\r\n FieldType,\r\n UISubType\r\n} from '../configurable-form.model';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MaterialModule } from '../../material/material.module';\r\nimport { translateConfig } from '../../../utils/translation.utils';\r\n\r\n@Component({\r\n selector: 'lib-configurable-form',\r\n templateUrl: './configurable-form.component.html',\r\n styleUrls: ['./configurable-form.component.scss'],\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, MaterialModule],\r\n})\r\nexport class ConfigurableFormComponent implements OnInit, OnChanges {\r\n @Input() config!: FormConfig;\r\n @Input() jsonConfig!: JsonFormConfig;\r\n @Input() data: any = {};\r\n @Input() baseApiUrl: string = '';\r\n @Input() labels: any;\r\n @Output() optionsLoad = new EventEmitter<any>();\r\n\r\n form!: FormGroup;\r\n processedConfig!: FormConfig;\r\n fieldVisibilityMap: Map<string, boolean> = new Map();\r\n passwordFieldState: Map<string, boolean> = new Map();\r\n\r\n constructor(\r\n private fb: FormBuilder,\r\n private snackBar: MatSnackBar,\r\n private http: HttpClient\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.initializeForm();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['config'] || changes['jsonConfig']) {\r\n this.initializeForm();\r\n }\r\n if (changes['data'] && this.form) {\r\n this.form.patchValue(this.data);\r\n }\r\n }\r\n\r\n initializeForm() {\r\n // Transform JSON config if provided, otherwise use config directly\r\n if (this.jsonConfig) {\r\n this.processedConfig = this.transformJsonConfig(this.jsonConfig);\r\n } else if (this.config) {\r\n this.processedConfig = JSON.parse(JSON.stringify(this.config));\r\n } else {\r\n return;\r\n }\r\n\r\n // Apply translations if labels and labelsObject are provided\r\n if (this.labels && this.labels.labelsObject) {\r\n translateConfig(this.processedConfig, this.labels.labelsObject);\r\n }\r\n\r\n\r\n this.normalizeFields();\r\n this.initializeFieldVisibility();\r\n this.buildForm();\r\n this.setupDependencies();\r\n\r\n // Patch initial data if provided\r\n if (this.data && Object.keys(this.data).length > 0) {\r\n this.form.patchValue(this.data);\r\n }\r\n }\r\n\r\n // Transform JSON config format to internal FormConfig format\r\n transformJsonConfig(jsonConfig: JsonFormConfig): FormConfig {\r\n const fields = jsonConfig.jsonConfig\r\n .sort((a, b) => a.sequence - b.sequence)\r\n .map(field => this.transformJsonField(field));\r\n\r\n return {\r\n sections: [{\r\n sectionTitle: jsonConfig.label,\r\n fields: fields\r\n }],\r\n entityType: jsonConfig.entityType\r\n };\r\n }\r\n\r\n // Transform individual JSON field to FormField\r\n transformJsonField(jsonField: JsonFieldConfig): FormField {\r\n const fieldType = this.mapUISubTypeToFieldType(jsonField.uiConfig.subType);\r\n\r\n return {\r\n name: jsonField.jsonKey,\r\n jsonKey: jsonField.jsonKey,\r\n label: jsonField.label,\r\n type: fieldType,\r\n sequence: jsonField.sequence,\r\n keyType: jsonField.keyType,\r\n uiConfig: jsonField.uiConfig,\r\n validationRules: jsonField.validationRules,\r\n required: jsonField.validationRules?.isMandatory || jsonField.validationRules?.isRequired,\r\n mandatory: jsonField.validationRules?.isMandatory,\r\n dependsOn: undefined, // Will be set based on dependent array\r\n dependent: jsonField.uiConfig.dependent,\r\n optionConfigs: jsonField.uiConfig.optionConfigs,\r\n class: 'col-12'\r\n };\r\n }\r\n\r\n // Map UI subtype to field type\r\n mapUISubTypeToFieldType(subType?: string): FieldType {\r\n switch (subType) {\r\n case 'UI_SUBTYPE.SHORT_TEXT':\r\n return 'text';\r\n case 'UI_SUBTYPE.LONG_TEXT':\r\n return 'textarea';\r\n case 'UI_SUBTYPE.NUMBER':\r\n return 'number';\r\n case 'UI_SUBTYPE.EMAIL':\r\n return 'email';\r\n case 'UI_SUBTYPE.PHONE':\r\n return 'tel';\r\n case 'UI_SUBTYPE.URL':\r\n return 'url';\r\n default:\r\n return 'text';\r\n }\r\n }\r\n\r\n // Normalize fields to ensure all required properties exist\r\n normalizeFields() {\r\n this.processedConfig.sections.forEach(section => {\r\n section.fields.forEach(field => {\r\n // Set default type if not specified\r\n if (!field.type) {\r\n field.type = 'text';\r\n }\r\n\r\n // Merge uiConfig with field-level properties\r\n if (field.uiConfig) {\r\n if (field.uiConfig.type === 'UI_TYPE.DROP_DOWN') {\r\n field.type = 'dropdown';\r\n }\r\n if (field.uiConfig.optionConfigs) {\r\n field.optionConfigs = field.uiConfig.optionConfigs;\r\n }\r\n if (field.uiConfig.dependent) {\r\n field.dependent = field.uiConfig.dependent;\r\n }\r\n }\r\n\r\n // Initialize visibility\r\n if (field.visible === undefined) {\r\n field.visible = true;\r\n }\r\n\r\n // Load options for dropdowns\r\n if ((field.type === 'dropdown' || field.type === 'select') && field.optionConfigs) {\r\n this.loadFieldOptions(field);\r\n }\r\n });\r\n });\r\n }\r\n\r\n // Initialize field visibility map\r\n initializeFieldVisibility() {\r\n this.processedConfig.sections.forEach(section => {\r\n section.fields.forEach(field => {\r\n this.fieldVisibilityMap.set(field.name, field.visible !== false);\r\n });\r\n });\r\n }\r\n\r\n buildForm() {\r\n const formGroupConfig: any = {};\r\n\r\n this.processedConfig.sections.forEach(section => {\r\n if (section.isRepeater) {\r\n // Create FormArray for repeater sections\r\n const arrayName = section.formArrayName || 'items';\r\n const minItems = section.minItems || 1;\r\n const initialItems = [];\r\n\r\n for (let i = 0; i < minItems; i++) {\r\n initialItems.push(this.createGroup(section.fields));\r\n }\r\n\r\n formGroupConfig[arrayName] = this.fb.array(initialItems);\r\n } else {\r\n // Add regular fields to form group\r\n section.fields.forEach(field => {\r\n if (field.subFields) {\r\n // Composite field - add all sub-fields\r\n field.subFields.forEach(subField => {\r\n if (field.required || field.mandatory) {\r\n subField.required = true;\r\n }\r\n formGroupConfig[subField.name] = this.createControl(subField);\r\n });\r\n } else {\r\n formGroupConfig[field.name] = this.createControl(field);\r\n }\r\n });\r\n }\r\n });\r\n\r\n this.form = this.fb.group(formGroupConfig);\r\n\r\n // Apply composite validators to the root form group\r\n this.processedConfig.sections.forEach(section => {\r\n if (!section.isRepeater) {\r\n section.fields.forEach(field => {\r\n if (field.type === 'composite' && field.compositeValidationRule && field.subFields) {\r\n this.form.addValidators(this.createCompositeValidator(field));\r\n }\r\n });\r\n }\r\n });\r\n this.form.updateValueAndValidity();\r\n }\r\n\r\n createCompositeValidator(field: FormField) {\r\n return (control: AbstractControl) => {\r\n const group = control as FormGroup;\r\n if (!field.subFields || field.subFields.length < 2) return null;\r\n\r\n if (field.compositeValidationRule === 'minMax') {\r\n const minControl = group.get(field.subFields[0].name);\r\n const maxControl = group.get(field.subFields[1].name);\r\n\r\n if (minControl && maxControl && minControl.value !== null && maxControl.value !== null) {\r\n if (Number(minControl.value) > Number(maxControl.value)) {\r\n return { [`invalid_minMax_${field.name}`]: true };\r\n }\r\n }\r\n }\r\n\r\n if (field.compositeValidationRule === 'percentageTotal') {\r\n let total = 0;\r\n let allPresent = true;\r\n\r\n field.subFields.forEach(sub => {\r\n const ctrl = group.get(sub.name);\r\n if (ctrl && ctrl.value !== null && ctrl.value !== '') {\r\n total += Number(ctrl.value);\r\n } else {\r\n allPresent = false;\r\n }\r\n });\r\n\r\n if (allPresent && total !== 100) {\r\n return { [`invalid_percentageTotal_${field.name}`]: true };\r\n }\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n\r\n createControl(field: FormField): FormControl {\r\n const validators = [];\r\n\r\n // Add validators based on field configuration\r\n if (field.required || field.mandatory || field.validationRules?.isMandatory || field.validationRules?.isRequired) {\r\n validators.push(Validators.required);\r\n }\r\n\r\n if (field.validationRules?.minLength) {\r\n validators.push(Validators.minLength(field.validationRules.minLength));\r\n }\r\n\r\n if (field.validationRules?.maxLength) {\r\n validators.push(Validators.maxLength(field.validationRules.maxLength));\r\n }\r\n\r\n if (field.validationRules?.pattern) {\r\n validators.push(Validators.pattern(field.validationRules.pattern));\r\n }\r\n\r\n if (field.validationRules?.min !== undefined) {\r\n validators.push(Validators.min(field.validationRules.min));\r\n }\r\n\r\n if (field.validationRules?.max !== undefined) {\r\n validators.push(Validators.max(field.validationRules.max));\r\n }\r\n\r\n if (field.type === 'email') {\r\n validators.push(Validators.email);\r\n }\r\n\r\n const initialValue = field.value !== undefined ? field.value : '';\r\n return this.fb.control({ value: initialValue, disabled: field.disabled || false }, validators);\r\n }\r\n\r\n createGroup(fields: FormField[]): FormGroup {\r\n const groupConfig: any = {};\r\n\r\n fields.forEach(field => {\r\n if (field.subFields) {\r\n field.subFields.forEach(subField => {\r\n groupConfig[subField.name] = this.createControl(subField);\r\n });\r\n } else {\r\n groupConfig[field.name] = this.createControl(field);\r\n }\r\n });\r\n\r\n return this.fb.group(groupConfig);\r\n }\r\n\r\n getFormArray(name: string): FormArray {\r\n return this.form.get(name) as FormArray;\r\n }\r\n\r\n addRepeaterItem(section: FormSection) {\r\n const arrayName = section.formArrayName || 'items';\r\n const formArray = this.getFormArray(arrayName);\r\n\r\n // Check max items\r\n if (section.maxItems && formArray.length >= section.maxItems) {\r\n this.snackBar.open(this.labels.errorMaxItemsAllowed.replace('{0}', String(section.maxItems)), this.labels.closeSnackBar, { duration: 3000 });\r\n return;\r\n }\r\n\r\n formArray.push(this.createGroup(section.fields));\r\n }\r\n\r\n removeRepeaterItem(sectionName: string, index: number) {\r\n const formArray = this.getFormArray(sectionName);\r\n formArray.removeAt(index);\r\n }\r\n\r\n validate(): boolean {\r\n if (this.form.invalid) {\r\n this.form.markAllAsTouched();\r\n this.scrollToFirstInvalidControl();\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n scrollToFirstInvalidControl() {\r\n const firstInvalidControl = document.querySelector('.is-invalid');\r\n if (firstInvalidControl) {\r\n firstInvalidControl.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n }\r\n\r\n setupDependencies() {\r\n this.processedConfig.sections.forEach(section => {\r\n section.fields.forEach(field => {\r\n\r\n\r\n // Also setup for fields with dependent array\r\n if (field.dependent && field.dependent.length > 0) {\r\n const control = this.form.get(field.name);\r\n if (control) {\r\n control.valueChanges.subscribe(value => {\r\n this.onFieldValueChange(field, value);\r\n });\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n onFieldValueChange(field: FormField, value: any) {\r\n // Handle dependent fields\r\n if (field.dependent && field.dependent.length > 0) {\r\n field.dependent.forEach(dependentFieldName => {\r\n const dependentField = this.findFieldByName(dependentFieldName);\r\n if (dependentField) {\r\n // Clear the dependent field value\r\n const control = this.form.get(dependentFieldName);\r\n if (control) {\r\n control.setValue('');\r\n control.markAsUntouched();\r\n }\r\n\r\n // Load new options for the dependent field\r\n if (value) {\r\n this.loadFieldOptions(dependentField, { [field.name]: value });\r\n } else {\r\n // Clear options if parent value is cleared\r\n dependentField.loadedOptions = [];\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n // Load options for a dropdown field\r\n loadFieldOptions(field: FormField, parentValues?: any) {\r\n // Emit event for parent to notify about options load request\r\n // Allow parent to mark as handled to skip internal API call\r\n const event = { field, parentValue: parentValues, handled: false };\r\n this.optionsLoad.emit(event);\r\n\r\n if (event.handled) {\r\n return;\r\n }\r\n\r\n if (!field.optionConfigs) {\r\n return;\r\n }\r\n\r\n const config = field.optionConfigs;\r\n\r\n // Handle static options\r\n if (config.optionDTO === 'OPTION_DTO.STATIC' && config.staticOptions) {\r\n field.loadedOptions = config.staticOptions;\r\n return;\r\n }\r\n\r\n // Handle API-based options\r\n if (config.optionDTO === 'OPTION_DTO.REF_DATA' && config.url) {\r\n let url = config.url;\r\n\r\n // Replace placeholders in URL with parent values\r\n if (parentValues) {\r\n Object.keys(parentValues).forEach(key => {\r\n url = url.replace(`{${key}}`, parentValues[key]);\r\n });\r\n }\r\n\r\n // Prepend base API URL if provided\r\n if (this.baseApiUrl && !url.startsWith('http')) {\r\n url = `${this.baseApiUrl}/${url}`;\r\n }\r\n\r\n this.http.get<any>(url).subscribe({\r\n next: (response) => {\r\n // Extract data from response\r\n const data = response.data || response.content || response;\r\n field.loadedOptions = this.extractOptions(data, config);\r\n },\r\n error: (error) => {\r\n console.error('Error loading options:', error);\r\n field.loadedOptions = [];\r\n }\r\n });\r\n }\r\n }\r\n\r\n // Extract options from API response\r\n extractOptions(data: any[], config: any): FormOption[] {\r\n if (!Array.isArray(data)) {\r\n return [];\r\n }\r\n\r\n return data.map(item => ({\r\n label: item[config.labelKey || 'name'],\r\n value: item[config.requestKey || 'code'] || item[config.valueKey || 'id'],\r\n code: item.code,\r\n name: item.name\r\n }));\r\n }\r\n\r\n // Get options for a field (either static or loaded)\r\n getFieldOptions(field: FormField): FormOption[] {\r\n return field.loadedOptions || field.options || [];\r\n }\r\n\r\n // Check if field is visible\r\n isFieldVisible(field: FormField): boolean {\r\n return this.fieldVisibilityMap.get(field.name) !== false;\r\n }\r\n\r\n // Toggle field visibility\r\n toggleFieldVisibility(field: FormField, visible: boolean) {\r\n this.fieldVisibilityMap.set(field.name, visible);\r\n\r\n const control = this.form.get(field.name);\r\n if (control) {\r\n if (visible) {\r\n // Re-enable and restore validators\r\n control.enable();\r\n this.updateControlValidators(control, field);\r\n } else {\r\n // Disable and clear validators\r\n control.disable();\r\n control.clearValidators();\r\n control.updateValueAndValidity();\r\n }\r\n }\r\n }\r\n\r\n // Update control validators based on field config\r\n updateControlValidators(control: AbstractControl, field: FormField) {\r\n const validators = [];\r\n\r\n if (field.required || field.mandatory || field.validationRules?.isMandatory) {\r\n validators.push(Validators.required);\r\n }\r\n\r\n if (field.validationRules?.minLength) {\r\n validators.push(Validators.minLength(field.validationRules.minLength));\r\n }\r\n\r\n if (field.validationRules?.maxLength) {\r\n validators.push(Validators.maxLength(field.validationRules.maxLength));\r\n }\r\n\r\n if (field.validationRules?.pattern) {\r\n validators.push(Validators.pattern(field.validationRules.pattern));\r\n }\r\n\r\n control.setValidators(validators);\r\n control.updateValueAndValidity();\r\n }\r\n\r\n onFileChange(event: any, field: FormField) {\r\n const files: FileList = event.target.files;\r\n\r\n if (!files || files.length === 0) {\r\n return;\r\n }\r\n\r\n // Initialize uploadedFiles if not present\r\n // Initialize uploadedFiles if not present\r\n if (!field.uploadedFiles) {\r\n field.uploadedFiles = [];\r\n }\r\n\r\n const uploadedFiles: any[] = [];\r\n // Handle files\r\n for (let i = 0; i < files.length; i++) {\r\n const file = files[i];\r\n\r\n // Check file size (5MB limit)\r\n if (file.size > 5 * 1024 * 1024) {\r\n this.snackBar.open(this.labels.errorFileLimitExceeded.replace('{0}', file.name), this.labels.closeSnackBar, { duration: 3000 });\r\n continue;\r\n }\r\n\r\n uploadedFiles.push({\r\n name: file.name,\r\n size: file.size,\r\n type: file.type,\r\n file: file\r\n });\r\n }\r\n\r\n if (field.multiple) {\r\n field.uploadedFiles.push(...uploadedFiles);\r\n } else {\r\n field.uploadedFiles = uploadedFiles;\r\n }\r\n\r\n // Update form control value for validation\r\n this.updateFileControlValue(field);\r\n\r\n // Clear the input\r\n event.target.value = '';\r\n }\r\n\r\n // Remove uploaded file\r\n removeFile(field: FormField, index: number) {\r\n if (field.uploadedFiles) {\r\n field.uploadedFiles.splice(index, 1);\r\n this.updateFileControlValue(field);\r\n }\r\n }\r\n\r\n // Update file control value for validation\r\n updateFileControlValue(field: FormField) {\r\n const control = this.form.get(field.name);\r\n if (control) {\r\n const hasFiles = field.uploadedFiles && field.uploadedFiles.length > 0;\r\n control.setValue(hasFiles ? field.uploadedFiles : null);\r\n control.markAsTouched();\r\n }\r\n }\r\n\r\n // Get character count for text field\r\n getCharacterCount(fieldName: string): number {\r\n const control = this.form.get(fieldName);\r\n if (control && control.value) {\r\n return control.value.toString().length;\r\n }\r\n return 0;\r\n }\r\n\r\n // Toggle section collapse\r\n toggleSection(section: FormSection) {\r\n section.collapsed = !section.collapsed;\r\n }\r\n\r\n\r\n\r\n // Helper method to find field by name\r\n private findFieldByName(name: string): FormField | undefined {\r\n for (const section of this.processedConfig.sections) {\r\n const field = section.fields.find(f => f.name === name);\r\n if (field) {\r\n return field;\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n // Get the processed config for template use\r\n get sections(): FormSection[] {\r\n return this.processedConfig?.sections || [];\r\n }\r\n\r\n togglePassword(fieldName: string) {\r\n this.passwordFieldState.set(fieldName, !this.passwordFieldState.get(fieldName));\r\n }\r\n\r\n isPasswordVisible(fieldName: string): boolean {\r\n return this.passwordFieldState.get(fieldName) || false;\r\n }\r\n}\r\n\r\n","<form [formGroup]=\"form\" class=\"configurable-form-container\" *ngIf=\"form\">\r\n\r\n <ng-container *ngFor=\"let section of sections\">\r\n\r\n <!-- Repeater Section -->\r\n <div *ngIf=\"section.isRepeater; else normalSection\"\r\n [ngClass]=\"section.noCardLayout ? 'section-no-card' : 'section-card'\">\r\n <div class=\"section-header\" *ngIf=\"section.sectionTitle\">\r\n <h3 class=\"section-title\">{{ section.sectionTitle }}</h3>\r\n <button *ngIf=\"section.collapsible\" mat-icon-button type=\"button\" (click)=\"toggleSection(section)\">\r\n <mat-icon>{{ section.collapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div [formArrayName]=\"section.formArrayName || 'items'\" *ngIf=\"!section.collapsed\">\r\n <div *ngFor=\"let item of getFormArray(section.formArrayName!).controls; let i = index\"\r\n [formGroupName]=\"i\" class=\"repeater-item\">\r\n <div class=\"repeater-item-header\" *ngIf=\"getFormArray(section.formArrayName!).length > 1\">\r\n <span class=\"text-small\">{{ section.repeaterItemLabel || labels.repeaterItemDefaultLabel }} {{i\r\n + 1}}</span>\r\n <button mat-icon-button color=\"warn\" type=\"button\"\r\n (click)=\"removeRepeaterItem(section.formArrayName!, i)\"\r\n [disabled]=\"section.minItems && getFormArray(section.formArrayName!).length <= section.minItems\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Fields Grid -->\r\n <div class=\"form-grid\">\r\n <div *ngFor=\"let field of section.fields\" [ngClass]=\"['form-col', field.class || 'col-12']\"\r\n [hidden]=\"!isFieldVisible(field)\">\r\n <ng-container\r\n *ngTemplateOutlet=\"fieldTemplate; context: {field: field, group: item}\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"repeater-separator\" *ngIf=\"i < getFormArray(section.formArrayName!).length - 1\"></div>\r\n </div>\r\n </div>\r\n\r\n <button mat-button color=\"primary\" type=\"button\" (click)=\"addRepeaterItem(section)\" class=\"add-btn\"\r\n *ngIf=\"!section.collapsed\"\r\n [disabled]=\"section.maxItems && getFormArray(section.formArrayName!).length >= section.maxItems\">\r\n <mat-icon>add_circle_outline</mat-icon> {{ section.addLabel || labels.addMoreDefaultLabel }}\r\n </button>\r\n </div>\r\n\r\n <!-- Normal Section -->\r\n <ng-template #normalSection>\r\n <div [ngClass]=\"section.noCardLayout ? 'section-no-card' : 'section-card'\">\r\n <div class=\"section-header\" *ngIf=\"section.sectionTitle\">\r\n <h3 class=\"section-title\">{{ section.sectionTitle }}</h3>\r\n <button *ngIf=\"section.collapsible\" mat-icon-button type=\"button\" (click)=\"toggleSection(section)\">\r\n <mat-icon>{{ section.collapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </button>\r\n </div>\r\n <div class=\"form-grid\" *ngIf=\"!section.collapsed\">\r\n <div *ngFor=\"let field of section.fields\" [ngClass]=\"['form-col', field.class || 'col-12']\"\r\n [hidden]=\"!isFieldVisible(field)\">\r\n <!-- Pass the root form group to the template -->\r\n <ng-container\r\n *ngTemplateOutlet=\"fieldTemplate; context: {field: field, group: form}\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n </ng-container>\r\n\r\n</form>\r\n\r\n<!-- Reusable Field Template -->\r\n<ng-template #fieldTemplate let-field=\"field\" let-group=\"group\">\r\n <div [formGroup]=\"group\">\r\n\r\n <!-- Text / Email / Number / Tel / URL (Password removed) -->\r\n <div *ngIf=\"['text', 'email', 'number', 'tel', 'url'].includes(field.type || '')\" class=\"field-container\">\r\n <div class=\"field-label\" *ngIf=\"field.label\">\r\n {{ field.label }}\r\n <span class=\"text-danger\" *ngIf=\"field.required || field.mandatory\">*</span>\r\n </div>\r\n <div class=\"input-wrapper\">\r\n <input [type]=\"field.type\" [formControlName]=\"field.name\" [placeholder]=\"field.placeholder || ''\"\r\n [readonly]=\"field.readonly\" class=\"form-input\" [name]=\"field.name\"\r\n [class.is-invalid]=\"group.get(field.name)?.touched && group.get(field.name)?.invalid\"\r\n [maxlength]=\"field.validationRules?.maxLength || field.uiConfig?.maxCharacters\">\r\n <div class=\"input-suffix\">\r\n <span class=\"suffix-text\" *ngIf=\"field.suffixText\">{{ field.suffixText }}</span>\r\n <mat-icon *ngIf=\"field.suffixIcon\">{{ field.suffixIcon }}</mat-icon>\r\n <mat-icon *ngIf=\"field.icon\">{{ field.icon }}</mat-icon>\r\n <mat-icon *ngIf=\"field.readonly\" class=\"lock-icon\">lock_outline</mat-icon>\r\n </div>\r\n </div>\r\n <!-- Character count -->\r\n <div class=\"char-count-row\" *ngIf=\"field.uiConfig?.maxCharacters || field.validationRules?.maxLength\">\r\n <div class=\"hint-text\" *ngIf=\"field.hint || field.helpText\">{{ field.hint || field.helpText }}</div>\r\n <div class=\"char-count\">\r\n {{ getCharacterCount(field.name) }} / {{ field.uiConfig?.maxCharacters ||\r\n field.validationRules?.maxLength }} {{ labels.charactersLabel }}\r\n </div>\r\n </div>\r\n <div class=\"hint-text mt-2\"\r\n *ngIf=\"(field.hint || field.helpText) && !field.uiConfig?.maxCharacters && !field.validationRules?.maxLength\">\r\n {{ field.hint || field.helpText }}\r\n </div>\r\n </div>\r\n\r\n <!-- Password Field (Separated) -->\r\n <div *ngIf=\"field.type === 'password'\" class=\"field-container\">\r\n <div class=\"field-label\" *ngIf=\"field.label\">\r\n {{ field.label }}\r\n <span class=\"text-danger\" *ngIf=\"field.required || field.mandatory\">*</span>\r\n </div>\r\n <div class=\"input-wrapper\">\r\n <input [type]=\"isPasswordVisible(field.name) ? 'text' : 'password'\" [formControlName]=\"field.name\"\r\n [placeholder]=\"field.placeholder || ''\" [readonly]=\"field.readonly\" class=\"form-input\"\r\n [class.is-invalid]=\"group.get(field.name)?.touched && group.get(field.name)?.invalid\"\r\n [maxlength]=\"field.validationRules?.maxLength || field.uiConfig?.maxCharacters\">\r\n <div class=\"input-suffix\">\r\n <span class=\"suffix-text\" *ngIf=\"field.suffixText\">{{ field.suffixText }}</span>\r\n <mat-icon *ngIf=\"field.suffixIcon\">{{ field.suffixIcon }}</mat-icon>\r\n <mat-icon *ngIf=\"field.icon\">{{ field.icon }}</mat-icon>\r\n <mat-icon *ngIf=\"field.readonly\" class=\"lock-icon\">lock_outline</mat-icon>\r\n <mat-icon class=\"password-toggle-icon\" (click)=\"togglePassword(field.name)\">\r\n {{ isPasswordVisible(field.name) ? 'visibility' : 'visibility_off' }}\r\n </mat-icon>\r\n </div>\r\n </div>\r\n <!-- Character count -->\r\n <div class=\"char-count-row\" *ngIf=\"field.uiConfig?.maxCharacters || field.validationRules?.maxLength\">\r\n <div class=\"hint-text\" *ngIf=\"field.hint || field.helpText\">{{ field.hint || field.helpText }}</div>\r\n <div class=\"char-count\">\r\n {{ getCharacterCount(field.name) }} / {{ field.uiConfig?.maxCharacters ||\r\n field.validationRules?.maxLength }} {{ labels.charactersLabel }}\r\n </div>\r\n </div>\r\n <div class=\"hint-text mt-2\"\r\n *ngIf=\"(field.hint || field.helpText) && !field.uiConfig?.maxCharacters && !field.validationRules?.maxLength\">\r\n {{ field.hint || field.helpText }}\r\n </div>\r\n </div>\r\n\r\n <!-- Textarea -->\r\n <div *ngIf=\"field.type === 'textarea'\" class=\"field-container\">\r\n <div class=\"field-label\" *ngIf=\"field.label\">\r\n {{ field.label }}\r\n <span class=\"text-danger\" *ngIf=\"field.required || field.mandatory\">*</span>\r\n </div>\r\n <textarea [formControlName]=\"field.name\" [placeholder]=\"field.placeholder || ''\" [readonly]=\"field.readonly\"\r\n class=\"form-input form-textarea\" rows=\"4\"\r\n [class.is-invalid]=\"group.get(field.name)?.touched && group.get(field.name)?.invalid\"\r\n [maxlength]=\"field.validationRules?.maxLength || field.uiConfig?.maxCharacters\"></textarea>\r\n <!-- Character count -->\r\n <div class=\"char-count-row\" *ngIf=\"field.uiConfig?.maxCharacters || field.validationRules?.maxLength\">\r\n <div class=\"hint-text\" *ngIf=\"field.hint || field.helpText\">{{ field.hint || field.helpText }}</div>\r\n <div class=\"char-count\">\r\n {{ getCharacterCount(field.name) }} / {{ field.uiConfig?.maxCharacters ||\r\n field.validationRules?.maxLength }} {{ labels.charactersLabel }}\r\n </div>\r\n </div>\r\n <div class=\"hint-text mt-2\"\r\n *ngIf=\"(field.hint || field.helpText) && !field.uiConfig?.maxCharacters && !field.validationRules?.maxLength\">\r\n {{ field.hint || field.helpText }}\r\n </div>\r\n </div>\r\n\r\n <!-- Select / Dropdown -->\r\n <div *ngIf=\"field.type === 'select' || field.type === 'dropdown'\" class=\"field-container\">\r\n <div class=\"field-label\" *ngIf=\"field.label\">\r\n {{ field.label }}\r\n <span class=\"text-danger\" *ngIf=\"field.required || field.mandatory\">*</span>\r\n </div>\r\n <select [formControlName]=\"field.name\" class=\"form-input\"\r\n [class.is-invalid]=\"group.get(field.name)?.touched && group.get(field.name)?.invalid\">\r\n <option value=\"\" disabled selected *ngIf=\"field.placeholder\">{{ field.placeholder }}</option>\r\n <option value=\"\" disabled selected *ngIf=\"!field.placeholder\">{{ labels.selectDefaultPlaceholder }}\r\n </option>\r\n <option *ngFor=\"let opt of getFieldOptions(field)\" [value]=\"opt.value\">{{ opt.label }}</option>\r\n </select>\r\n <div class=\"hint-text mt-2\" *ngIf=\"field.hint || field.helpText\">{{ field.hint || field.helpText }}</div>\r\n </div>\r\n\r\n <!-- Date -->\r\n <div *ngIf=\"field.type === 'date'\" class=\"field-container\">\r\n <div class=\"field-label\" *ngIf=\"field.label\">\r\n {{ field.label }}\r\n <span class=\"text-danger\" *ngIf=\"field.required || field.mandatory\">*</span>\r\n </div>\r\n <div class=\"relative\">\r\n <input matInput [matDatepicker]=\"picker\" [formControlName]=\"field.name\"\r\n [placeholder]=\"field.placeholder || ''\" class=\"form-input\"\r\n [class.is-invalid]=\"group.get(field.name)?.touched && group.get(field.name)?.invalid\">\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\" class=\"date-toggle\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n </div>\r\n <div class=\"hint-text mt-2\" *ngIf=\"field.hint || field.helpText\">{{ field.hint || field.helpText }}</div>\r\n </div>\r\n\r\n <!-- Radio -->\r\n <div *ngIf=\"field.type === 'radio'\" class=\"radio-group-container\"\r\n [class.is-invalid]=\"group.get(field.name)?.touched && group.get(field.name)?.invalid\">\r\n <label class=\"field-label\">\r\n {{ field.label }}\r\n <span class=\"text-danger\" *ngIf=\"field.required || field.mandatory\">*</span>\r\n </label>\r\n <mat-radio-group [formControlName]=\"field.name\" class=\"radio-group\">\r\n <mat-radio-button *ngFor=\"let opt of getFieldOptions(field)\" [value]=\"opt.value\" class=\"radio-button\">\r\n {{ opt.label }}\r\n </mat-radio-button>\r\n </mat-radio-group>\r\n <div class=\"hint-text mt-2\" *ngIf=\"field.hint || field.helpText\">{{ field.hint || field.helpText }}</div>\r\n </div>\r\n\r\n <!-- Composite Field (Sub-groups) -->\r\n <div *ngIf=\"field.type === 'composite'\" class=\"field-container\">\r\n <div class=\"field-label\" *ngIf=\"field.label\">\r\n {{ field.label }}\r\n <span class=\"text-danger\" *ngIf=\"field.required || field.mandatory\">*</span>\r\n </div>\r\n <div class=\"composite-container\">\r\n <ng-container *ngFor=\"let sub of field.subFields; let last = last\">\r\n <div class=\"composite-sub-field\" style=\"flex: 1;\">\r\n <div class=\"field-label\" *ngIf=\"sub.label\"\r\n style=\"font-size: 0.75rem; font-weight: normal; margin-bottom: 0.25rem;\">\r\n {{ sub.label }}\r\n </div>\r\n <div class=\"input-wrapper\">\r\n <input [type]=\"sub.type\" [formControlName]=\"sub.name\" [placeholder]=\"sub.placeholder || ''\"\r\n [readonly]=\"sub.readonly\" class=\"form-input\"\r\n [class.is-invalid]=\"group.get(sub.name)?.touched && group.get(sub.name)?.invalid\">\r\n <div class=\"input-suffix\" [class.color-suffix]=\"sub.suffixText === '%'\">\r\n <span class=\"suffix-text\" *ngIf=\"sub.suffixText\">{{ sub.suffixText }}</span>\r\n <mat-icon *ngIf=\"sub.readonly\" class=\"lock-icon\">lock_outline</mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Adjust separator alignment if labels are present -->\r\n <span class=\"separator\" *ngIf=\"!last && field.separator\"\r\n [style.padding-top]=\"sub.label ? '1.25rem' : '0'\">{{ field.separator }}</span>\r\n </ng-container>\r\n </div>\r\n <div class=\"hint-text mt-2\" *ngIf=\"field.hint || field.helpText\">{{ field.hint || field.helpText }}</div>\r\n <div class=\"error-text text-danger text-small mt-1\" *ngIf=\"group.errors?.['invalid_minMax_' + field.name]\">\r\n {{ labels.errorMinValue }}\r\n </div>\r\n <div class=\"error-text text-danger text-small mt-1\"\r\n *ngIf=\"group.errors?.['invalid_percentageTotal_' + field.name]\">\r\n {{ labels.errorPercentageTotal }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- File Upload -->\r\n <div *ngIf=\"field.type === 'file'\" class=\"field-container\">\r\n <div class=\"field-label\" *ngIf=\"field.label\">\r\n {{ field.label }}\r\n <span class=\"text-danger\" *ngIf=\"field.required || field.mandatory\">*</span>\r\n </div>\r\n\r\n <!-- Upload Box -->\r\n <div class=\"upload-box\" (click)=\"fileInput.click()\"\r\n [class.is-invalid]=\"group.get(field.name)?.touched && group.get(field.name)?.invalid\"\r\n *ngIf=\"!field.uploadedFiles || field.uploadedFiles.length === 0 || field.multiple\">\r\n <mat-icon class=\"upload-icon\">cloud_upload</mat-icon>\r\n <div class=\"upload-text\">{{ labels.uploadDragDropText }}</div>\r\n <div class=\"upload-hint\">{{ labels.uploadHint }}</div>\r\n <input #fileInput type=\"file\" [attr.multiple]=\"field.multiple ? true : null\" [attr.accept]=\"field.accept\"\r\n (change)=\"onFileChange($event, field)\" style=\"display: none;\">\r\n </div>\r\n\r\n <!-- Uploaded Files List -->\r\n <div class=\"uploaded-files-list\" *ngIf=\"field.uploadedFiles && field.uploadedFiles.length > 0\">\r\n <div class=\"uploaded-file-item\" *ngFor=\"let file of field.uploadedFiles; let i = index\">\r\n <div class=\"file-icon\">\r\n <mat-icon class=\"pdf-icon\" *ngIf=\"file.type === 'application/pdf'\">picture_as_pdf</mat-icon>\r\n <mat-icon class=\"doc-icon\"\r\n *ngIf=\"file.type.includes('word') || file.type.includes('document')\">description</mat-icon>\r\n <mat-icon class=\"img-icon\" *ngIf=\"file.type.includes('image')\">image</mat-icon>\r\n <mat-icon class=\"file-icon-default\"\r\n *ngIf=\"!file.type.includes('pdf') && !file.type.includes('word') && !file.type.includes('document') && !file.type.includes('image')\">insert_drive_file</mat-icon>\r\n </div>\r\n <div class=\"file-info\">\r\n <div class=\"file-name\">{{ file.name }}</div>\r\n <div class=\"file-size\">{{ (file.size / 1024).toFixed(2) }} KB</div>\r\n </div>\r\n <button mat-icon-button color=\"warn\" type=\"button\" (click)=\"removeFile(field, i)\"\r\n class=\"remove-file-btn\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</ng-template>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { ConfigurableFormComponent } from './component/configurable-form.component';\r\nimport { MaterialModule } from '../material/material.module';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n MaterialModule,\r\n ConfigurableFormComponent\r\n ],\r\n exports: [\r\n ConfigurableFormComponent\r\n ]\r\n})\r\nexport class ConfigurableFormModule { }\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\nimport { FormLabels } from '../models/form-schema.model';\r\n\r\n@Injectable()\r\nexport class SmartFormController {\r\n private formData: { [key: string]: any } = {};\r\n\r\n /** Auth token sourced from the FormSchema configJSON (e.g. \"Bearer eyJ…\") */\r\n token?: string;\r\n /** HTTP header name for the token (default: \"Authorization\") */\r\n tokenHeader?: string;\r\n /** Flat map of translated i18n labels passed from SmartFormComponent */\r\n labels: any = {};\r\n /** Custom label keys for form actions (Next, Submit, Add, etc.) */\r\n actionLabels?: FormLabels;\r\n private fieldSubjects: Map<string, BehaviorSubject<any>> = new Map();\r\n\r\n initialize(initialData: { [key: string]: any }): void {\r\n this.formData = { ...initialData };\r\n this.fieldSubjects.forEach((subject, key) => {\r\n subject.next(this.formData[key]);\r\n });\r\n }\r\n\r\n updateField(name: string, value: any): void {\r\n this.formData[name] = value;\r\n\r\n if (!this.fieldSubjects.has(name)) {\r\n this.fieldSubjects.set(name, new BehaviorSubject<any>(value));\r\n } else {\r\n this.fieldSubjects.get(name)!.next(value);\r\n }\r\n }\r\n\r\n getFieldValue(name: string): any {\r\n return this.formData[name];\r\n }\r\n\r\n getFieldObservable(name: string): Observable<any> {\r\n if (!this.fieldSubjects.has(name)) {\r\n this.fieldSubjects.set(name, new BehaviorSubject<any>(this.formData[name]));\r\n }\r\n return this.fieldSubjects.get(name)!.asObservable();\r\n }\r\n\r\n getAllData(): { [key: string]: any } {\r\n return { ...this.formData };\r\n }\r\n\r\n reset(): void {\r\n this.formData = {};\r\n this.fieldSubjects.forEach(subject => subject.next(undefined));\r\n }\r\n\r\n destroy(): void {\r\n this.fieldSubjects.forEach(subject => subject.complete());\r\n this.fieldSubjects.clear();\r\n }\r\n}\r\n","import { FieldConfig, FormSchema } from '../models/form-schema.model';\r\n\r\n/**\r\n * Utility class for translating Smart Form schemas.\r\n */\r\nexport class SmartFormTranslationUtils {\r\n\r\n /**\r\n * Recursively walks the schema and replaces i18n keys with values from labels map.\r\n * @param schema The FormSchema to translate.\r\n * @param labels The labels map (can be flat or contain labelsObject property).\r\n */\r\n static translateSchema(schema: FormSchema, labels: any): void {\r\n if (!schema || !labels) return;\r\n\r\n // Support both flat labels map and the pattern used in ConfigurableForm which passes { labelsObject: ... }\r\n const labelsMap = labels.labelsObject || labels;\r\n const translate = (key: string) => labelsMap[key] || key;\r\n\r\n // Root properties\r\n if (schema.label) schema.label = translate(schema.label);\r\n if (schema.description) schema.description = translate(schema.description);\r\n\r\n // Submit config\r\n if (schema.submitConfig) {\r\n if (schema.submitConfig.successMessage) schema.submitConfig.successMessage = translate(schema.submitConfig.successMessage);\r\n if (schema.submitConfig.errorMessage) schema.submitConfig.errorMessage = translate(schema.submitConfig.errorMessage);\r\n }\r\n\r\n // Section config\r\n if (schema.sectionConfig) {\r\n this.translateSection(schema.sectionConfig, translate);\r\n }\r\n\r\n // Stepper config\r\n if (schema.stepperConfig?.children) {\r\n schema.stepperConfig.children.forEach(field => this.translateField(field, translate));\r\n }\r\n }\r\n\r\n private static translateSection(section: any, translate: (key: string) => string): void {\r\n if (section.label) section.label = translate(section.label);\r\n if (section.children) {\r\n section.children.forEach((field: FieldConfig) => this.translateField(field, translate));\r\n }\r\n }\r\n\r\n private static translateField(field: FieldConfig, translate: (key: string) => string): void {\r\n if (field.label) field.label = translate(field.label);\r\n if (field.placeholder) field.placeholder = translate(field.placeholder);\r\n if (field.hint) field.hint = translate(field.hint);\r\n\r\n if (field.richTextConfig?.placeholder) {\r\n field.richTextConfig.placeholder = translate(field.richTextConfig.placeholder);\r\n }\r\n\r\n if (field.textConfig?.patternMessage) {\r\n field.textConfig.patternMessage = translate(field.textConfig.patternMessage);\r\n }\r\n\r\n if (field.attachmentConfig?.acceptLabel) {\r\n field.attachmentConfig.acceptLabel = translate(field.attachmentConfig.acceptLabel);\r\n }\r\n\r\n if (field.optionConfig?.optionList) {\r\n field.optionConfig.optionList.forEach(opt => {\r\n if (opt.label) opt.label = translate(opt.label);\r\n if (opt.hint) opt.hint = translate(opt.hint);\r\n });\r\n }\r\n\r\n // Recurse into children (ROW or GROUP)\r\n if (field.children) {\r\n field.children.forEach(child => this.translateField(child, translate));\r\n }\r\n\r\n // Recurse into nested section config\r\n if (field.sectionConfig) {\r\n this.translateSection(field.sectionConfig, translate);\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ExpressionService {\r\n private loadedFunctions: Map<string, Function> = new Map();\r\n\r\n evaluate(expression: string, context: { [key: string]: any }, variables?: string[]): any {\r\n try {\r\n const vars = variables || this.extractVariables(expression);\r\n const args = vars.map(v => context[v]);\r\n\r\n const func = new Function(...vars, `return ${expression};`);\r\n return func(...args);\r\n } catch (e) {\r\n console.error('Expression evaluation error:', e, { expression, vars: variables || this.extractVariables(expression), context });\r\n return null;\r\n }\r\n }\r\n\r\n evaluateCondition(expression: string, context: { [key: string]: any }): boolean {\r\n const vars = this.extractVariables(expression);\r\n try {\r\n const args = vars.map(v => context[v]);\r\n const func = new Function(...vars, `return ${expression};`);\r\n const result = func(...args);\r\n return !!result;\r\n } catch (e) {\r\n console.error('Condition evaluation error:', e, { expression, variables: vars, context });\r\n return false;\r\n }\r\n }\r\n\r\n evaluateFormula(formula: string, functionName: string, context: { [key: string]: any }, variables?: string[]): any {\r\n try {\r\n if (!this.loadedFunctions.has(functionName)) {\r\n const func = new Function('context', `\r\n ${formula}\r\n return ${functionName};\r\n `)(context);\r\n this.loadedFunctions.set(functionName, func);\r\n }\r\n\r\n const fn = this.loadedFunctions.get(functionName);\r\n if (!fn) return null;\r\n\r\n const args = variables ? variables.map(v => context[v]) : [];\r\n return fn(...args);\r\n } catch (e) {\r\n console.error('Formula evaluation error:', e);\r\n return null;\r\n }\r\n }\r\n\r\n extractVariables(expression: string): string[] {\r\n if (!expression) return [];\r\n\r\n // Remove strings from expression to avoid picking up variables inside quotes\r\n const cleanExpr = expression\r\n .replace(/'[^']*'/g, '')\r\n .replace(/\"[^\"]*\"/g, '')\r\n .replace(/`[^`]*`/g, '')\r\n // Remove properties (e.g., .max) to only pick up top-level identifiers\r\n .replace(/\\.\\w+/g, '');\r\n\r\n const regex = /\\b[a-zA-Z_]\\w*\\b/g;\r\n const matches = cleanExpr.match(regex) || [];\r\n const keywords = [\r\n 'true', 'false', 'null', 'undefined', 'return', 'if', 'else', 'for', 'while', 'function', 'var', 'let', 'const', 'this',\r\n 'Math', 'JSON', 'console', 'window', 'document', 'Date', 'Object', 'Array', 'Number', 'String', 'Boolean', 'Symbol'\r\n ];\r\n return [...new Set(matches.filter(m => !keywords.includes(m)))];\r\n }\r\n}\r\n","import { Component, inject } from '@angular/core';\nimport { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar';\nimport { SnackbarConfig } from '../models/snackbar.models';\n\n@Component({\n selector: 'lib-snackbar',\n templateUrl: './snackbar.component.html',\n styleUrls: ['./snackbar.component.scss'],\n standalone: false\n})\nexport class SnackbarComponent {\n public data: SnackbarConfig = inject(MAT_SNACK_BAR_DATA);\n public snackBarRef: MatSnackBarRef<SnackbarComponent> = inject(MatSnackBarRef);\n\n get variantClass(): string {\n return `snackbar-${this.data.variant || 'info'}`;\n }\n}\n","<div class=\"cc-snackbar-container\" [ngClass]=\"variantClass\">\n <div class=\"cc-snackbar-icon\">\n <!-- Success Icon -->\n <svg *ngIf=\"data.variant === 'success'\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"></path>\n <polyline points=\"22 4 12 14.01 9 11.01\"></polyline>\n </svg>\n \n <!-- Error Icon -->\n <svg *ngIf=\"data.variant === 'error'\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"></line>\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"></line>\n </svg>\n \n <!-- Warning Icon -->\n <svg *ngIf=\"data.variant === 'warning'\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"></path>\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"></line>\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"></line>\n </svg>\n \n <!-- Info Icon -->\n <svg *ngIf=\"data.variant === 'info' || !data.variant\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line>\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line>\n </svg>\n </div>\n \n <div class=\"cc-snackbar-message\">\n {{ data.message }}\n </div>\n\n <button *ngIf=\"data.showCloseButton\" class=\"cc-snackbar-close\" (click)=\"snackBarRef.dismiss()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n</div>\n","import { Injectable } from '@angular/core';\nimport { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar';\nimport { SnackbarConfig } from '../models/snackbar.models';\nimport { SnackbarComponent } from '../components/snackbar.component';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SnackbarService {\n\n constructor(private snackBar: MatSnackBar) {}\n\n show(config: SnackbarConfig): void {\n const matConfig: MatSnackBarConfig = {\n duration: config.duration ?? 5000,\n horizontalPosition: config.horizontalPosition ?? 'right',\n verticalPosition: config.verticalPosition ?? 'top',\n panelClass: ['cc-snackbar-panel', `cc-snackbar-${config.variant || 'info'}`],\n data: config // Pass the entire config down to the component\n };\n \n this.snackBar.openFromComponent(SnackbarComponent, matConfig);\n }\n\n success(message: string, duration?: number): void {\n this.show({ message, variant: 'success', duration });\n }\n\n error(message: string, duration?: number): void {\n this.show({ message, variant: 'error', duration });\n }\n\n warning(message: string, duration?: number): void {\n this.show({ message, variant: 'warning', duration });\n }\n\n info(message: string, duration?: number): void {\n this.show({ message, variant: 'info', duration });\n }\n}\n","/**\r\n * Utility functions for string manipulation\r\n */\r\nexport class StringUtils {\r\n\r\n /**\r\n * Converts a string to camelCase.\r\n * Example: \"First Name\" -> \"firstName\", \"Profile Picture\" -> \"profilePicture\"\r\n */\r\n static toCamelCase(str?: string): string {\r\n if (!str) return '';\r\n return str\r\n .replace(/[^a-zA-Z0-9 ]/g, '')\r\n .split(' ')\r\n .filter(Boolean)\r\n .map((word, i) =>\r\n i === 0\r\n ? word.charAt(0).toLowerCase() + word.slice(1)\r\n : word.charAt(0).toUpperCase() + word.slice(1)\r\n )\r\n .join('');\r\n }\r\n}\r\n","import { Pipe, PipeTransform, SecurityContext } from '@angular/core';\r\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\r\n\r\n/**\r\n * Bypasses Angular's DomSanitizer for resource URLs (e.g. YouTube embed iframes).\r\n * Used only for trusted URLs such as YouTube embed links derived from user-provided video IDs.\r\n */\r\n@Pipe({\r\n name: 'trustedUrl',\r\n standalone: false\r\n})\r\nexport class TrustedUrlPipe implements PipeTransform {\r\n constructor(private sanitizer: DomSanitizer) { }\r\n\r\n transform(url: string): SafeResourceUrl | null {\r\n if (!url) {\r\n return null;\r\n }\r\n const cleaned = this.sanitizer.sanitize(SecurityContext.URL, url);\r\n if (!cleaned) {\r\n return null;\r\n }\r\n return this.sanitizer.bypassSecurityTrustResourceUrl(cleaned);\r\n }\r\n}\r\n","import { Component, Input, OnInit, OnDestroy, ViewChild, ElementRef } from '@angular/core';\r\nimport { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport {\r\n FormArray,\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ValidatorFn,\r\n Validators\r\n} from '@angular/forms';\r\nimport { SectionConfig, FieldConfig, UploadedFile, MediaItem, LocationItem, LocationFieldValue } from '../../models/form-schema.model';\r\nimport { SmartFormController } from '../../services/smart-form-controller.service';\r\nimport { ExpressionService } from '../../services/expression.service';\r\nimport { ValidationUtils } from '../../utils/validation.utils';\r\nimport { StringUtils } from '../../../../utils/string.utils';\r\nimport { Subject, combineLatest, forkJoin, BehaviorSubject } from 'rxjs';\r\nimport { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'lib-form-field',\r\n templateUrl: './form-field.component.html',\r\n styleUrls: ['./form-field.component.scss'],\r\n standalone: false\r\n})\r\nexport class FormFieldComponent implements OnInit, OnDestroy {\r\n @Input() config!: FieldConfig;\r\n @Input() controller!: SmartFormController;\r\n /**\r\n * The FormGroup that THIS field's control should be registered in.\r\n * For repeater instances this is the instance's own isolated FormGroup.\r\n * For flat (non-repeater) fields this is the root formGroup.\r\n */\r\n @Input() formGroup!: FormGroup;\r\n\r\n /**\r\n * Set to TRUE when this field is part of a repeatable group (config.sectionConfig.allowMulti = true).\r\n * When true, the field does NOT sync with the global controller to prevent data collision\r\n * between different instances of the same repeater row.\r\n */\r\n @Input() allowMulti: boolean = false;\r\n\r\n value: any;\r\n isVisible: boolean = true;\r\n showPassword: boolean = false; // password show/hide toggle\r\n isDragOver: boolean = false; // file upload drag-over state\r\n fileUploadError: string = ''; // per-field file validation error\r\n multiSaveError: string = ''; // error for multisave validation\r\n private destroy$ = new Subject<void>();\r\n\r\n // ── MEDIA_UPLOAD support ────────────────────────────────────────────────\r\n @ViewChild('mediaDeviceInput') mediaDeviceInput!: ElementRef<HTMLInputElement>;\r\n showMediaMenu: boolean = false; // hover/click dropdown menu\r\n showYoutubeInput: boolean = false; // inline YouTube URL input panel\r\n youtubeUrlInput: string = ''; // model for the YT URL field\r\n youtubeUrlError: string = ''; // validation message for YT url\r\n mediaCarouselIndex: number = 0; // active slide index for carousel\r\n showLibraryModal: boolean = false; // library picker modal\r\n libraryImages: any[] = []; // raw list fetched from library API\r\n librarySelectedIds: Set<any> = new Set(); // selected library items\r\n libraryLoading: boolean = false;\r\n libraryError: string = '';\r\n mediaUploadError: string = ''; // transient error message for max limits\r\n\r\n // ── LOCATION field support ────────────────────────────────────────────────\r\n /** Active tab: VENUE | ONLINE | TBA */\r\n locationActiveTab: 'VENUE' | 'ONLINE' | 'TBA' = 'VENUE';\r\n /** Current text in the venue search box */\r\n locationSearchText: string = '';\r\n /** Google Places autocomplete suggestions */\r\n locationSuggestions: any[] = [];\r\n /** Show the suggestions dropdown */\r\n locationShowSuggestions: boolean = false;\r\n /** Cached Google AutocompleteService instance */\r\n private _googleAcService: any = null;\r\n /** Whether Google Maps is loaded */\r\n locationMapLoaded: boolean = false;\r\n /** Map instance */\r\n private _googleMap: any = null;\r\n /** Map markers */\r\n private _mapMarkers: any[] = [];\r\n\r\n // ── AUTOCOMPLETE support ────────────────────────────────────────────────\r\n /** FormControl used ONLY for the autocomplete text-input display value */\r\n autocompleteInputCtrl = new FormControl('');\r\n /** Filtered option list shown in the mat-autocomplete panel */\r\n filteredOptions: { label: string; code: any }[] = [];\r\n\r\n // ── GROUP / allowMulti support ──────────────────────────────────────────\r\n\r\n /** For GROUP fields with allowMulti = true */\r\n groupFormArray!: FormArray;\r\n\r\n /** For GROUP fields with allowMulti = false — single nested FormGroup */\r\n groupFormGroup!: FormGroup;\r\n\r\n /**\r\n * Tracked list of repeater instances.\r\n * Using a separate array (not FormArray.controls) + trackBy(id) ensures\r\n * Angular creates FRESH child components for every new row, preventing\r\n * cached values from bleeding into new instances.\r\n * \r\n * Enhanced with isEditing and isSaved flags for the 'multiSave' card UI.\r\n */\r\n instanceList: { id: number; fg: FormGroup; initialValue?: any; isEditing?: boolean; isSaved?: boolean; isExpanded?: boolean }[] = [];\r\n private _nextInstanceId = 0;\r\n\r\n /**\r\n * Key used to register the GROUP control on the parent formGroup.\r\n * Priority: sectionConfig.name > field.name > camelCase(label) > '__group__'\r\n */\r\n get groupKey(): string {\r\n return (\r\n this.config.sectionConfig?.name ||\r\n this.config.name ||\r\n StringUtils.toCamelCase(this.config.sectionConfig?.label) ||\r\n '__group__'\r\n );\r\n }\r\n\r\n\r\n constructor(\r\n private fb: FormBuilder,\r\n private expressionService: ExpressionService,\r\n private http: HttpClient\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n if (this.isGroup) {\r\n this.initGroupField();\r\n return;\r\n }\r\n\r\n this.registerControl();\r\n this.setupVisibility();\r\n this.setupGeneratedField();\r\n this.setupFormulaValidation(); // Generic formula-based validation\r\n this.setupDependencies();\r\n this.setupMatchValidation(); // cross-field match (e.g. confirmPassword)\r\n\r\n if (!this.config.optionConfig?.dependencies) {\r\n this.loadDropdownOptions();\r\n }\r\n\r\n if (this.isAutocomplete) {\r\n this.initAutocomplete();\r\n }\r\n\r\n if (this.isLocation) {\r\n this.initLocationField();\r\n }\r\n }\r\n\r\n // ── GROUP initialisation ──────────────────────────────────────────────────\r\n get addMultiLabel(): string {\r\n const rawLabel = this.config.sectionConfig?.multiSaveConfig?.addLabel;\r\n if (rawLabel) {\r\n return this.controller.labels?.[rawLabel] || rawLabel;\r\n }\r\n const sectionLabel = this.config.sectionConfig?.label;\r\n const translatedSectionLabel = sectionLabel ? (this.controller.labels?.[sectionLabel] || sectionLabel) : '';\r\n return '+ Add a ' + translatedSectionLabel;\r\n }\r\n\r\n private initGroupField(): void {\r\n if (this.config.sectionConfig?.allowMulti) {\r\n this.groupFormArray = this.fb.array([]);\r\n this.formGroup.addControl(this.groupKey, this.groupFormArray);\r\n\r\n const initialData = this.controller.getFieldValue(this.groupKey);\r\n if (Array.isArray(initialData) && initialData.length > 0) {\r\n initialData.forEach((item: any) => {\r\n this.addGroupInstance(item);\r\n });\r\n } else {\r\n // We always start with at least one instance.\r\n // If multi-save is active, it starts in editing mode and is NOT \r\n // added to the main form value until the user actually saves it.\r\n this.addGroupInstance();\r\n }\r\n } else {\r\n this.groupFormGroup = this.fb.group({});\r\n this.formGroup.addControl(this.groupKey, this.groupFormGroup);\r\n }\r\n }\r\n\r\n /**\r\n * Sets up cross-field validation based on the `onValidate` formula.\r\n * Watches all variables mentioned in the formula and updates the field's\r\n * validity whenever any of them change.\r\n */\r\n private setupFormulaValidation(): void {\r\n if (!this.config.onValidate) return;\r\n\r\n const expression = this.config.onValidate;\r\n const variables = this.expressionService.extractVariables(expression);\r\n\r\n // Subscribe to all fields mentioned in the formula\r\n const observables = variables.map(v => this.controller.getFieldObservable(v));\r\n\r\n combineLatest(observables).pipe(takeUntil(this.destroy$)).subscribe(() => {\r\n const context = this.controller.getAllData();\r\n const isValid = this.expressionService.evaluateCondition(expression, context);\r\n\r\n const control = this.formGroup.get(this.config.name!);\r\n if (control) {\r\n if (!isValid) {\r\n control.setErrors({ ...control.errors, formulaError: true });\r\n } else {\r\n // Clear only the formulaError\r\n if (control.hasError('formulaError')) {\r\n const errors = { ...control.errors };\r\n delete errors['formulaError'];\r\n control.setErrors(Object.keys(errors).length ? errors : null);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n addGroupInstance(initialData?: any): void {\r\n const fg = this.fb.group({});\r\n const isMultiSave = !!this.config.sectionConfig?.multiSaveConfig?.active;\r\n\r\n // If initialData exists, treat the instance as already submitted/saved to form\r\n const isEditing = initialData ? false : isMultiSave;\r\n const isSaved = initialData ? true : !isMultiSave;\r\n\r\n const instance = {\r\n id: this._nextInstanceId++,\r\n fg,\r\n isEditing,\r\n isSaved,\r\n isExpanded: false,\r\n initialValue: initialData ? { ...initialData } : undefined\r\n };\r\n\r\n if (isSaved) {\r\n this.groupFormArray.push(fg);\r\n }\r\n this.instanceList = [...this.instanceList, instance];\r\n\r\n if (initialData) {\r\n setTimeout(() => {\r\n // Ensure that controls exist for all keys in initialData so we don't drop fields like ID!\r\n Object.keys(initialData).forEach(key => {\r\n if (!fg.contains(key)) {\r\n fg.addControl(key, new FormControl(initialData[key]));\r\n }\r\n });\r\n fg.patchValue(initialData);\r\n });\r\n }\r\n }\r\n\r\n saveGroupInstance(index: number): void {\r\n const instance = this.instanceList[index];\r\n const multiCfg = this.config.sectionConfig?.multiSaveConfig;\r\n\r\n if (multiCfg?.active) {\r\n // Validate that at least one key field is filled\r\n const summaryVal = instance.fg.get(multiCfg.summaryField || '')?.value;\r\n const descVal = multiCfg.descriptionField ? instance.fg.get(multiCfg.descriptionField)?.value : null;\r\n\r\n const hasSummary = summaryVal !== null && summaryVal !== undefined && String(summaryVal).trim() !== '';\r\n const hasDesc = multiCfg.descriptionField\r\n ? (descVal !== null && descVal !== undefined && String(descVal).trim() !== '')\r\n : true; // if no desc field defined, we only care about summary or others\r\n\r\n // User rule: If both fields are empty, need to throw error (come from JSON)\r\n const bothRequired = !!multiCfg.summaryField && !!multiCfg.descriptionField;\r\n if (bothRequired && !hasSummary && !hasDesc) {\r\n this.multiSaveError = this.controller.labels['ERR_MSG_EMPTY_MULTI'] || 'Please fill the required fields before saving.';\r\n return;\r\n }\r\n\r\n this.multiSaveError = '';\r\n instance.isSaved = true;\r\n instance.isEditing = false;\r\n instance.initialValue = { ...instance.fg.value };\r\n\r\n // Push to the parent formArray so its submitted as part of the FormGroup value\r\n if (!this.groupFormArray.controls.includes(instance.fg)) {\r\n this.groupFormArray.push(instance.fg);\r\n }\r\n }\r\n }\r\n\r\n cancelGroupInstance(index: number): void {\r\n const instance = this.instanceList[index];\r\n if (!instance.isSaved) {\r\n // It was a new, unsaved addition - remove it entirely\r\n this.removeGroupInstance(index, true);\r\n } else {\r\n // Revert to original values\r\n if (instance.initialValue) {\r\n instance.fg.patchValue(instance.initialValue, { emitEvent: false });\r\n }\r\n instance.isEditing = false;\r\n }\r\n }\r\n\r\n editGroupInstance(index: number): void {\r\n const instance = this.instanceList[index];\r\n instance.isEditing = true;\r\n instance.initialValue = { ...instance.fg.value };\r\n }\r\n\r\n toggleExpandGroupInstance(index: number): void {\r\n const instance = this.instanceList[index];\r\n instance.isExpanded = !instance.isExpanded;\r\n }\r\n\r\n removeGroupInstance(index: number, force: boolean = false): void {\r\n // If not multiSave, we keep the one-row minimum rule.\r\n // In multiSave, we can remove it even if it's the last one.\r\n const isMultiSave = !!this.config.sectionConfig?.multiSaveConfig?.active;\r\n\r\n if (force || isMultiSave || this.instanceList.length > 1) {\r\n const instance = this.instanceList[index];\r\n const arrayIndex = this.groupFormArray.controls.indexOf(instance.fg);\r\n if (arrayIndex >= 0) {\r\n this.groupFormArray.removeAt(arrayIndex);\r\n }\r\n this.instanceList = this.instanceList.filter((_, i) => i !== index);\r\n }\r\n }\r\n\r\n trackByInstanceId(_: number, item: { id: number; fg: FormGroup }): number {\r\n return item.id;\r\n }\r\n\r\n // ── Leaf control ─────────────────────────────────────────────────────────\r\n\r\n ngOnDestroy(): void {\r\n // Always complete so any subscriptions (e.g. subfields valueChanges) are cleaned up\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n\r\n if (this.isGroup) {\r\n if (this.formGroup?.contains(this.groupKey)) {\r\n this.formGroup.removeControl(this.groupKey);\r\n }\r\n return;\r\n }\r\n\r\n const fieldName = this.config.name;\r\n if (fieldName && this.formGroup?.contains(fieldName)) {\r\n this.formGroup.removeControl(fieldName);\r\n }\r\n }\r\n\r\n registerControl(): void {\r\n if (!this.config.name || !this.formGroup) return;\r\n\r\n const fieldName = this.config.name;\r\n const validators = this.getValidators();\r\n\r\n // When inside a repeater instance, ALWAYS start with defaultValue (never\r\n // read from the shared controller — prevents cross-instance value copying).\r\n const initialValue = this.allowMulti\r\n ? (this.config.defaultValue ?? null)\r\n : (this.controller.getFieldValue(fieldName) ?? this.config.defaultValue ?? null);\r\n\r\n let control = this.formGroup.get(fieldName) as FormControl;\r\n if (!control) {\r\n control = new FormControl(\r\n { value: initialValue, disabled: !!this.config.disabled },\r\n validators\r\n );\r\n this.formGroup.addControl(fieldName, control);\r\n }\r\n\r\n this.value = control.value;\r\n\r\n if (!this.allowMulti) {\r\n // ── Flat field: keep in sync with shared controller ──────────────────\r\n control.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(val => {\r\n this.value = val;\r\n this.controller.updateField(fieldName, val);\r\n });\r\n\r\n this.controller.getFieldObservable(fieldName).pipe(takeUntil(this.destroy$)).subscribe(val => {\r\n if (val !== control.value) {\r\n control.setValue(val, { emitEvent: false });\r\n this.value = val;\r\n }\r\n });\r\n } else {\r\n // ── Repeater field: local value tracking only ─────────────────────────\r\n control.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(val => {\r\n this.value = val;\r\n });\r\n }\r\n }\r\n\r\n getValidators(): ValidatorFn[] {\r\n const validators: ValidatorFn[] = [];\r\n if (this.config.required) validators.push(Validators.required);\r\n if (this.config.subType === 'EMAIL') validators.push(Validators.email);\r\n if (this.config.subType === 'PASSWORD') {\r\n // Minimum 8 chars by default; honour explicit textConfig.length overrides\r\n const minLen = this.config.textConfig?.length?.min ?? 8;\r\n validators.push(Validators.minLength(minLen));\r\n }\r\n if (this.config.textConfig?.length) {\r\n const { min, max } = this.config.textConfig.length;\r\n if (min && this.config.subType !== 'PASSWORD') validators.push(Validators.minLength(min));\r\n if (max) validators.push(Validators.maxLength(max));\r\n }\r\n if (this.config.textConfig?.pattern) validators.push(Validators.pattern(this.config.textConfig.pattern));\r\n if (this.config.numberConfig) {\r\n const { min, max } = this.config.numberConfig;\r\n if (min !== undefined) validators.push(Validators.min(min));\r\n if (max !== undefined) validators.push(Validators.max(max));\r\n }\r\n if (this.config.type === 'RICH_TEXT' && this.config.richTextConfig?.maxLength) {\r\n const max = this.config.richTextConfig.maxLength;\r\n validators.push((control: import('@angular/forms').AbstractControl) => {\r\n if (!control.value) return null;\r\n const plainText = String(control.value).replace(/<[^>]*>/g, '');\r\n return plainText.length > max\r\n ? { 'maxlength': { requiredLength: max, actualLength: plainText.length } }\r\n : null;\r\n });\r\n }\r\n return validators;\r\n }\r\n\r\n // ── Cross-field match validation (password === confirmPassword) ───────────\r\n\r\n /**\r\n * When `textConfig.matchField` is configured, subscribes to value changes on\r\n * BOTH this control and the referenced control so the mismatch error updates\r\n * instantly whichever field the user edits last.\r\n *\r\n * - Values differ → sets `{ passwordMismatch: true }` on THIS control.\r\n * - Values match → clears `passwordMismatch` from THIS control.\r\n */\r\n setupMatchValidation(): void {\r\n const matchFieldName = this.config.textConfig?.matchField;\r\n if (!matchFieldName || !this.config.name || !this.formGroup) return;\r\n\r\n const thisControl = this.formGroup.get(this.config.name);\r\n const otherControl = this.formGroup.get(matchFieldName);\r\n if (!thisControl || !otherControl) return;\r\n\r\n const runCheck = () => {\r\n const thisVal = thisControl.value;\r\n const otherVal = otherControl.value;\r\n\r\n if (thisVal && otherVal && thisVal !== otherVal) {\r\n // Both have a value but they differ — flag the mismatch\r\n thisControl.setErrors(\r\n { ...thisControl.errors, passwordMismatch: true },\r\n { emitEvent: false }\r\n );\r\n } else {\r\n // Either one is empty OR they now match — clear the mismatch error\r\n if (thisControl.hasError('passwordMismatch')) {\r\n const errors = { ...thisControl.errors };\r\n delete errors['passwordMismatch'];\r\n thisControl.setErrors(\r\n Object.keys(errors).length ? errors : null,\r\n { emitEvent: false }\r\n );\r\n }\r\n }\r\n };\r\n\r\n // Fire when THIS (confirmPassword) field changes\r\n thisControl.valueChanges\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => runCheck());\r\n\r\n // Also fire when the OTHER (password) field changes so the error clears\r\n // as soon as the user corrects the source value\r\n otherControl.valueChanges\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => runCheck());\r\n }\r\n\r\n setupVisibility(): void {\r\n if (!this.config.visibilityExpression) return;\r\n const variables = this.expressionService.extractVariables(this.config.visibilityExpression);\r\n const observables = variables.map(v => this.controller.getFieldObservable(v));\r\n combineLatest(observables).pipe(takeUntil(this.destroy$)).subscribe(() => {\r\n const context = this.controller.getAllData();\r\n this.isVisible = this.expressionService.evaluateCondition(this.config.visibilityExpression!, context);\r\n const control = this.formGroup?.get(this.config.name!);\r\n if (control) {\r\n this.isVisible ? control.enable({ emitEvent: false }) : control.disable({ emitEvent: false });\r\n }\r\n });\r\n }\r\n\r\n setupGeneratedField(): void {\r\n if (this.config.type !== 'GENERATED' || !this.config.generatedConfig) return;\r\n const variables = this.config.generatedConfig.variables || [];\r\n const observables = variables.map(v => this.controller.getFieldObservable(v));\r\n combineLatest(observables).pipe(takeUntil(this.destroy$)).subscribe(() => {\r\n const context = this.controller.getAllData();\r\n const result = this.evaluateFormula(context);\r\n if (result !== null && this.config.name) {\r\n this.controller.updateField(this.config.name, result);\r\n }\r\n });\r\n }\r\n\r\n evaluateFormula(context: { [key: string]: any }): any {\r\n if (!this.config.generatedConfig) return null;\r\n const formula = this.config.generatedConfig.formula;\r\n const functionName = this.extractFunctionName(formula);\r\n if (functionName) {\r\n return this.expressionService.evaluateFormula(\r\n formula, functionName, context, this.config.generatedConfig.variables\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n extractFunctionName(formula: string): string | null {\r\n const match = formula.match(/(?:function|fun)\\s+(\\w+)\\s*\\(/);\r\n return match ? match[1] : null;\r\n }\r\n\r\n setupDependencies(): void {\r\n if (!this.config.optionConfig?.dependencies) return;\r\n const dependencies = this.config.optionConfig.dependencies;\r\n const observables = Object.values(dependencies).map(fieldName =>\r\n this.controller.getFieldObservable(fieldName)\r\n );\r\n combineLatest(observables).pipe(takeUntil(this.destroy$)).subscribe(values => {\r\n const dependencyValues: { [key: string]: any } = {};\r\n Object.keys(dependencies).forEach((paramKey, index) => {\r\n dependencyValues[paramKey] = values[index];\r\n });\r\n const allPresent = Object.values(dependencyValues).every(\r\n v => v !== null && v !== undefined && v !== ''\r\n );\r\n if (allPresent) {\r\n this.loadDropdownOptions(dependencyValues);\r\n } else if (this.config.optionConfig) {\r\n this.config.optionConfig.optionList = [];\r\n }\r\n });\r\n }\r\n\r\n loadDropdownOptions(queryParams: { [key: string]: any } = {}): void {\r\n const optionConfig = this.config.optionConfig;\r\n const urls = optionConfig?.apiUrls ||\r\n (optionConfig?.apiUrl ? [optionConfig.apiUrl] :\r\n optionConfig?.optionUrl ? [optionConfig.optionUrl] : []);\r\n\r\n if (!urls || urls.length === 0) return;\r\n\r\n const observables = urls.map(url => {\r\n let fullUrl = url;\r\n const params = new URLSearchParams();\r\n Object.entries(queryParams).forEach(([key, value]) => {\r\n if (value !== null && value !== undefined) params.append(key, String(value));\r\n });\r\n const queryString = params.toString();\r\n if (queryString) fullUrl += (fullUrl.includes('?') ? '&' : '?') + queryString;\r\n return this.http.get<any>(fullUrl, { headers: this.getHeaders() });\r\n });\r\n\r\n forkJoin(observables).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: responses => {\r\n let mergedData: any[] = [];\r\n responses.forEach(response => {\r\n let data = optionConfig?.dataPath\r\n ? this.getValueByPath(response, optionConfig.dataPath)\r\n : (Array.isArray(response) ? response : response.data || response.items || response || []);\r\n\r\n // Handle Dictionary Objects by converting them to Arrays\r\n if (data !== null && typeof data === 'object' && !Array.isArray(data)) {\r\n data = Object.values(data);\r\n }\r\n\r\n if (Array.isArray(data)) mergedData = [...mergedData, ...data];\r\n });\r\n\r\n if (optionConfig?.sortBy) {\r\n const sortKey = optionConfig.sortBy;\r\n const direction = optionConfig.sortDirection === 'DESC' ? -1 : 1;\r\n mergedData.sort((a, b) => {\r\n const valA = this.getValueByPath(a, sortKey);\r\n const valB = this.getValueByPath(b, sortKey);\r\n if (typeof valA === 'string' && typeof valB === 'string') return direction * valA.localeCompare(valB);\r\n if (typeof valA === 'number' && typeof valB === 'number') return direction * (valA - valB);\r\n return 0;\r\n });\r\n }\r\n\r\n this.config.optionConfig!.optionList = mergedData.map((item: any) => {\r\n const label = optionConfig?.labelPath\r\n ? this.getValueByPath(item, optionConfig.labelPath)\r\n : (item.label || item.name);\r\n const code = optionConfig?.valuePath\r\n ? this.getValueByPath(item, optionConfig.valuePath)\r\n : (item.code || item.id || item.value);\r\n return { label: String(label), code, value: item };\r\n });\r\n\r\n // Refresh autocomplete filter list after options arrive from API\r\n if (this.isAutocomplete) {\r\n this.filteredOptions = [...(this.config.optionConfig!.optionList || [])];\r\n this._syncAutocompleteDisplayValue();\r\n }\r\n },\r\n error: err => console.error('Failed to load dropdown options:', err)\r\n });\r\n }\r\n\r\n private getValueByPath(obj: any, path: string): any {\r\n if (!path || path === '') return obj;\r\n return path.split('.').reduce((acc, part) => {\r\n const match = part.match(/(\\w+)\\[(\\d+)\\]/);\r\n if (match) return acc?.[match[1]]?.[parseInt(match[2])];\r\n return acc?.[part];\r\n }, obj);\r\n }\r\n\r\n /** Builds HttpHeaders using the token stored in the SmartFormController (sourced from configJSON). */\r\n private getHeaders(): HttpHeaders {\r\n let headers = new HttpHeaders();\r\n if (this.controller.token) {\r\n const headerName = this.controller.tokenHeader || 'Authorization';\r\n headers = headers.set(headerName, this.controller.token);\r\n }\r\n return headers;\r\n }\r\n\r\n updateValue(newValue: any): void {\r\n if (!this.config.name) return;\r\n const control = this.formGroup.get(this.config.name);\r\n if (control) {\r\n control.setValue(newValue);\r\n control.markAsDirty();\r\n control.markAsTouched();\r\n }\r\n }\r\n\r\n onCheckboxListChange(code: string, checked: boolean): void {\r\n if (!this.config.name) return;\r\n const currentValue = (this.allowMulti\r\n ? (this.formGroup.get(this.config.name)?.value)\r\n : this.controller.getFieldValue(this.config.name)) || [];\r\n const newValue = checked\r\n ? [...currentValue, code]\r\n : currentValue.filter((c: string) => c !== code);\r\n this.updateValue(newValue);\r\n }\r\n\r\n isChecked(code: string): boolean {\r\n const value = this.value || [];\r\n return Array.isArray(value) && value.includes(code);\r\n }\r\n\r\n get errorMessage(): string {\r\n if (!this.config.name || !this.formGroup) return '';\r\n const control = this.formGroup.get(this.config.name);\r\n if (control && control.invalid && (control.touched || control.dirty)) {\r\n if (control.hasError('required')) return 'This field is required';\r\n if (control.hasError('email')) return 'Invalid email format';\r\n if (control.hasError('passwordMismatch')) return 'Passwords do not match';\r\n if (control.hasError('formulaError')) return this.config.errorMessage || 'Invalid value';\r\n if (control.hasError('minlength')) return `Minimum length is ${control.errors?.['minlength'].requiredLength} characters`;\r\n if (control.hasError('maxlength')) return `Maximum length is ${control.errors?.['maxlength'].requiredLength} characters`;\r\n if (control.hasError('min')) return `Minimum value is ${control.errors?.['min'].min}`;\r\n if (control.hasError('max')) return `Maximum value is ${control.errors?.['max'].max}`;\r\n if (control.hasError('pattern')) return this.config.textConfig?.patternMessage || 'Invalid format';\r\n }\r\n return '';\r\n }\r\n\r\n get showCharCount(): boolean {\r\n if (this.isTextField && this.config.subType !== 'PHONE') {\r\n return !!(this.config.textConfig?.showCharCount && this.config.textConfig?.length?.max);\r\n }\r\n if (this.isRichText) {\r\n return !!(this.config.richTextConfig?.showCharCount && this.config.richTextConfig?.maxLength);\r\n }\r\n return false;\r\n }\r\n\r\n get remainingCharacters(): number | null {\r\n if (!this.showCharCount || !this.formGroup || !this.config.name) return null;\r\n const currentVal = this.formGroup.get(this.config.name)?.value || '';\r\n\r\n if (this.isTextField && this.config.textConfig?.length?.max) {\r\n return Math.max(0, this.config.textConfig.length.max - currentVal.length);\r\n }\r\n if (this.isRichText && this.config.richTextConfig?.maxLength) {\r\n const plainText = String(currentVal).replace(/<[^>]*>/g, '');\r\n return Math.max(0, this.config.richTextConfig.maxLength - plainText.length);\r\n }\r\n return null;\r\n }\r\n\r\n // ── Type guards ──────────────────────────────────────────────────────────\r\n\r\n get isTextField(): boolean { return this.config.type === 'TEXT_INPUT'; }\r\n get isNumberField(): boolean { return this.config.type === 'NUMBER_INPUT'; }\r\n get isDateField(): boolean { return this.config.type === 'DATE'; }\r\n get isTimeField(): boolean { return this.config.type === 'TIME'; }\r\n get isDropdown(): boolean { return this.config.type === 'DROPDOWN'; }\r\n get isAutocomplete(): boolean { return this.config.type === 'AUTOCOMPLETE'; }\r\n get isFileUpload(): boolean { return this.config.type === 'FILE_UPLOAD'; }\r\n get isMediaUpload(): boolean { return this.config.type === 'MEDIA_UPLOAD'; }\r\n get isRadio(): boolean { return this.config.type === 'RADIO'; }\r\n get isCheckbox(): boolean { return this.config.type === 'CHECKBOX'; }\r\n get isChip(): boolean { return this.config.type === 'CHIP'; }\r\n get isSwitch(): boolean { return this.config.type === 'SWITCH'; }\r\n get isRating(): boolean { return this.config.type === 'RATING'; }\r\n get isRichText(): boolean { return this.config.type === 'RICH_TEXT'; }\r\n get isGenerated(): boolean { return this.config.type === 'GENERATED'; }\r\n get isRow(): boolean { return this.config.type === 'ROW'; }\r\n get isGroup(): boolean { return this.config.type === 'GROUP'; }\r\n get isLocation(): boolean { return this.config.type === 'LOCATION'; }\r\n\r\n // ── AUTOCOMPLETE helpers ────────────────────────────────────────────────\r\n\r\n /**\r\n * Initialise the separate display-control that drives the mat-autocomplete\r\n * text input. The real form control always stores the *code* value.\r\n */\r\n private initAutocomplete(): void {\r\n // Sync display input whenever the real control value changes externally\r\n this._syncAutocompleteDisplayValue();\r\n\r\n // Filter the option list as the user types\r\n this.autocompleteInputCtrl.valueChanges\r\n .pipe(debounceTime(150), distinctUntilChanged(), takeUntil(this.destroy$))\r\n .subscribe(search => {\r\n this.filteredOptions = this._filterOptions(typeof search === 'string' ? search : '');\r\n });\r\n\r\n // Initialise filtered list with all available options\r\n this.filteredOptions = [...(this.config.optionConfig?.optionList || [])];\r\n }\r\n\r\n /** Filter options by the user's search text (matches label or code). */\r\n private _filterOptions(search: string): { label: string; code: any }[] {\r\n const q = search.toLowerCase().trim();\r\n if (!q) return [...(this.config.optionConfig?.optionList || [])];\r\n return (this.config.optionConfig?.optionList || []).filter(opt =>\r\n opt.label?.toLowerCase().includes(q) ||\r\n String(opt.code).toLowerCase().includes(q)\r\n );\r\n }\r\n\r\n /** Put the human-readable label into the display control based on the stored code. */\r\n private _syncAutocompleteDisplayValue(): void {\r\n if (!this.config.name) return;\r\n const code = this.formGroup?.get(this.config.name)?.value;\r\n if (code === null || code === undefined || code === '') return;\r\n const matched = (this.config.optionConfig?.optionList || []).find(o => o.code === code);\r\n if (matched) {\r\n this.autocompleteInputCtrl.setValue(matched.label, { emitEvent: false });\r\n }\r\n }\r\n\r\n /** Called when user picks an option from the mat-autocomplete panel. */\r\n onAutocompleteSelected(option: { label: string; code: any }): void {\r\n this.autocompleteInputCtrl.setValue(option.label, { emitEvent: false });\r\n this.updateValue(option.code);\r\n }\r\n\r\n /** Called when the input loses focus — clear display & value if text was manually deleted. */\r\n onAutocompleteClear(): void {\r\n const display = (this.autocompleteInputCtrl.value || '').trim();\r\n if (!display) {\r\n this.updateValue(null);\r\n } else {\r\n // Restore label from stored code (prevents partial text staying)\r\n this._syncAutocompleteDisplayValue();\r\n }\r\n }\r\n\r\n /**\r\n * Returns the effective grid column span for a child inside a ROW.\r\n * If the child declares an explicit colSpan, use it.\r\n * Otherwise divide 12 equally among all children (floor, min 1).\r\n */\r\n getChildColSpan(child: FieldConfig): number {\r\n if (child.colSpan) return child.colSpan;\r\n const count = this.config.children?.length || 1;\r\n return Math.max(1, Math.floor(12 / count));\r\n }\r\n\r\n getOptionColSpan(option: any): number {\r\n const span = option.colSpan || option.colspan;\r\n if (span) return span;\r\n const count = this.config.optionConfig?.optionList?.length || 1;\r\n return Math.max(1, Math.floor(12 / count));\r\n }\r\n\r\n // ── Rating helpers ───────────────────────────────────────────────────────\r\n\r\n onRatingChange(star: number, event?: MouseEvent): void {\r\n if (!this.config.name || this.config.disabled) return;\r\n let newValue = star;\r\n if (this.config.ratingConfig?.allowHalf && event) {\r\n const target = event.target as HTMLElement;\r\n const rect = target.getBoundingClientRect();\r\n if (event.clientX - rect.left < rect.width / 2) newValue = star - 0.5;\r\n }\r\n if (this.value === newValue) newValue = 0;\r\n this.updateValue(newValue);\r\n }\r\n\r\n getStarArray(): number[] {\r\n const max = this.config.ratingConfig?.maxRating || 5;\r\n return Array.from({ length: max }, (_, i) => i + 1);\r\n }\r\n\r\n isStarHalf(star: number): boolean { return (this.value || 0) === star - 0.5; }\r\n isStarFilled(star: number): boolean { return (this.value || 0) >= star; }\r\n\r\n // ── File Upload helpers ──────────────────────────────────────────────────\r\n\r\n onDragOver(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver = true;\r\n }\r\n\r\n onDragLeave(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver = false;\r\n }\r\n\r\n onFileDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver = false;\r\n const files = event.dataTransfer?.files;\r\n if (files && files.length > 0) {\r\n this.processFiles(files);\r\n }\r\n }\r\n\r\n onFileSelected(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (input.files && input.files.length > 0) {\r\n this.processFiles(input.files);\r\n }\r\n // Reset input so the same file can be re-selected if removed\r\n input.value = '';\r\n }\r\n\r\n private processFiles(files: FileList): void {\r\n // ── MEDIA_UPLOAD branch — uses attachmentConfig, stores MediaItem[] ─────\r\n if (this.isMediaUpload) {\r\n const mediaCfg = this.config.attachmentConfig;\r\n if (!mediaCfg) return;\r\n const maxItems = mediaCfg.maxFiles ?? 10;\r\n\r\n let errorShown = false;\r\n\r\n Array.from(files).forEach(file => {\r\n if (this.mediaItems.length >= maxItems) {\r\n if (!errorShown) {\r\n this.showMediaError(this.controller.labels['ERR_MEDIA_MAX'] || `Maximum ${maxItems} media items allowed.`);\r\n errorShown = true;\r\n }\r\n return;\r\n }\r\n\r\n const placeholder: MediaItem = { mediaType: 'image', url: '', isUploading: true };\r\n this._appendMediaItem(placeholder);\r\n\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n if (mediaCfg.entityType) formData.append('entity_type', mediaCfg.entityType);\r\n\r\n if (!mediaCfg.uploadUrl) return;\r\n this.http.post<any>(mediaCfg.uploadUrl, formData, { headers: this.getHeaders() })\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response: any) => {\r\n // API returns { completeURL, id, mimeType, fileName, ... }\r\n const resolvedUrl: string = (response?.completeURL ?? response)?.toString().trim();\r\n const current: MediaItem[] = [...this.mediaItems];\r\n const idx = current.indexOf(placeholder);\r\n if (idx !== -1) {\r\n current[idx] = {\r\n mediaType: 'image',\r\n url: resolvedUrl,\r\n id: response?.id,\r\n mimeType: response?.mimeType,\r\n fileName: response?.fileName ?? response?.name,\r\n isUploading: false\r\n };\r\n this.updateValue(current);\r\n this.mediaCarouselIndex = current.length - 1;\r\n }\r\n },\r\n error: () => {\r\n const cleaned = this.mediaItems.filter(m => m !== placeholder);\r\n this.updateValue(cleaned.length ? cleaned : null);\r\n }\r\n });\r\n });\r\n return;\r\n }\r\n\r\n // ── FILE_UPLOAD branch — uses attachmentConfig, stores UploadedFile[] ────\r\n this.fileUploadError = '';\r\n const cfg = this.config.attachmentConfig;\r\n const maxSizeBytes = (cfg?.maxSizeMB ?? 10) * 1024 * 1024;\r\n const currentFiles: UploadedFile[] = (this.value as UploadedFile[]) || [];\r\n const maxFiles = cfg?.maxFiles ?? (cfg?.multiple ? 10 : 1);\r\n const isMultiple = cfg?.multiple ?? false;\r\n\r\n const incoming = Array.from(files);\r\n\r\n for (const file of incoming) {\r\n // Size validation\r\n if (file.size > maxSizeBytes) {\r\n this.fileUploadError = `\"${file.name}\" exceeds the maximum allowed size of ${cfg?.maxSizeMB ?? 10} MB.`;\r\n continue;\r\n }\r\n // Max-files validation\r\n if (isMultiple && currentFiles.length >= maxFiles) {\r\n this.fileUploadError = `Maximum ${maxFiles} file${maxFiles !== 1 ? 's' : ''} allowed.`;\r\n break;\r\n }\r\n\r\n if (cfg?.uploadUrl) {\r\n // ── API upload path ───────────────────────────────────────────────\r\n const entry: UploadedFile = {\r\n name: file.name,\r\n size: file.size,\r\n type: file.type,\r\n file,\r\n isUploading: true\r\n };\r\n\r\n // Add the placeholder entry immediately so the UI shows the progress row\r\n const withPlaceholder = isMultiple\r\n ? [...(this.value as UploadedFile[] || []), entry]\r\n : [entry];\r\n this.updateValue(withPlaceholder);\r\n\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n if (cfg.entityType) {\r\n formData.append('entity_type', cfg.entityType);\r\n }\r\n\r\n this.http.post<any>(cfg.uploadUrl, formData, { headers: this.getHeaders() })\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response: any) => {\r\n // The API returns a JSON object; use completeURL if present,\r\n // otherwise fall back to treating the raw response as a URL string.\r\n const resolvedUrl: string = (response?.completeURL ?? response)?.toString().trim();\r\n const current: UploadedFile[] = (this.value as UploadedFile[]) || [];\r\n const idx = current.indexOf(entry);\r\n if (idx !== -1) {\r\n const updatedEntry: UploadedFile = { ...entry, dataUrl: resolvedUrl, id: response?.id, isUploading: false };\r\n const updatedList = [...current];\r\n updatedList[idx] = updatedEntry;\r\n this.updateValue(updatedList);\r\n }\r\n },\r\n error: () => {\r\n // Remove the failed placeholder from the list\r\n const current: UploadedFile[] = (this.value as UploadedFile[]) || [];\r\n const cleaned = current.filter(f => f !== entry);\r\n this.updateValue(cleaned.length ? cleaned : null);\r\n this.fileUploadError = `Failed to upload \"${file.name}\". Please try again.`;\r\n }\r\n });\r\n } else {\r\n // ── FileReader (base64) fallback path ────────────────────────────\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n const entry: UploadedFile = {\r\n name: file.name,\r\n size: file.size,\r\n type: file.type,\r\n dataUrl: e.target?.result as string,\r\n file\r\n };\r\n const updated = isMultiple\r\n ? [...(this.value as UploadedFile[] || []), entry]\r\n : [entry];\r\n this.updateValue(updated);\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n }\r\n }\r\n\r\n removeUploadedFile(index: number): void {\r\n const current: UploadedFile[] = (this.value as UploadedFile[]) || [];\r\n const fileToRemove = current[index];\r\n if (!fileToRemove) return;\r\n\r\n const removeLocally = () => {\r\n const updated = current.filter((_, i) => i !== index);\r\n this.updateValue(updated);\r\n };\r\n\r\n const deleteUrl = this.config.attachmentConfig?.deleteUrl;\r\n\r\n if (fileToRemove.id && fileToRemove.id !== 0 && deleteUrl) {\r\n fileToRemove.isUploading = true; // Use this flag to disable the remove button\r\n this.updateValue([...current]); // trigger UI update\r\n\r\n let params = new HttpParams();\r\n if (!deleteUrl.includes('attachmentId=')) {\r\n params = params.set('attachmentId', fileToRemove.id.toString());\r\n }\r\n if (!deleteUrl.includes('reason=')) {\r\n // As requested in the API link, the reason is passed\r\n params = params.set('reason', 'DELECTED BY CREATOR');\r\n }\r\n\r\n this.http.delete<any>(deleteUrl, { headers: this.getHeaders(), params })\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: () => {\r\n removeLocally();\r\n },\r\n error: (err) => {\r\n console.error('Failed to delete attachment', err);\r\n fileToRemove.isUploading = false;\r\n this.fileUploadError = `Failed to delete \"${fileToRemove.name}\". Please try again.`;\r\n this.updateValue([...current]);\r\n }\r\n });\r\n } else {\r\n removeLocally();\r\n }\r\n }\r\n\r\n getFileIcon(mimeType: string): string {\r\n if (!mimeType) return 'attach_file'; // guard: undefined/null from non-FILE_UPLOAD values\r\n if (mimeType.includes('pdf')) return 'picture_as_pdf';\r\n if (mimeType.includes('image')) return 'image';\r\n if (mimeType.includes('word') || mimeType.includes('document')) return 'description';\r\n if (mimeType.includes('sheet') || mimeType.includes('excel') || mimeType.includes('csv')) return 'table_chart';\r\n if (mimeType.includes('zip') || mimeType.includes('compressed')) return 'folder_zip';\r\n return 'attach_file';\r\n }\r\n\r\n formatFileSize(bytes: number): string {\r\n if (bytes < 1024) return `${bytes} B`;\r\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\r\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\r\n }\r\n\r\n // ── Action Labels ──────────────────────────────────────────────────────────\r\n\r\n get addLabel(): string {\r\n const key = this.controller.actionLabels?.addLabel || 'Add';\r\n return this.controller.labels[key] || key;\r\n }\r\n\r\n get removeLabel(): string {\r\n const key = this.controller.actionLabels?.removeLabel || 'Remove';\r\n return this.controller.labels[key] || key;\r\n }\r\n\r\n // ── MEDIA_UPLOAD helpers ─────────────────────────────────────────────────\r\n\r\n get mediaItems(): MediaItem[] {\r\n return (this.value as MediaItem[]) || [];\r\n }\r\n\r\n /** Number of active items (used to clamp carousel index) */\r\n get mediaCount(): number { return this.mediaItems.length; }\r\n\r\n /** The currently visible carousel item */\r\n get activeMediaItem(): MediaItem | null {\r\n if (!this.mediaItems.length) return null;\r\n return this.mediaItems[Math.min(this.mediaCarouselIndex, this.mediaItems.length - 1)];\r\n }\r\n\r\n /** Thumbnail strip items */\r\n get mediaThumbnails(): MediaItem[] { return this.mediaItems; }\r\n\r\n mediaCarouselPrev(): void {\r\n if (this.mediaCarouselIndex > 0) this.mediaCarouselIndex--;\r\n }\r\n\r\n mediaCarouselNext(): void {\r\n if (this.mediaCarouselIndex < this.mediaItems.length - 1) this.mediaCarouselIndex++;\r\n }\r\n\r\n mediaGoTo(index: number): void {\r\n this.mediaCarouselIndex = index;\r\n }\r\n\r\n // ── YouTube ──────────────────────────────────────────────────────────────\r\n\r\n onMediaMenuVideo(): void {\r\n this.showMediaMenu = false;\r\n this.showYoutubeInput = !this.showYoutubeInput;\r\n this.youtubeUrlInput = '';\r\n this.youtubeUrlError = '';\r\n }\r\n\r\n addYoutubeMedia(): void {\r\n const cfg = this.config.attachmentConfig;\r\n const maxItems = cfg?.maxFiles ?? 10;\r\n if (this.mediaItems.length >= maxItems) {\r\n this.showMediaError(this.controller.labels['ERR_MEDIA_MAX'] || `Maximum ${maxItems} media items allowed.`);\r\n return;\r\n }\r\n\r\n const url = this.youtubeUrlInput.trim();\r\n const videoId = this._extractYoutubeId(url);\r\n if (!videoId) {\r\n this.youtubeUrlError = this.controller.labels['ERR_INVALID_YOUTUBE_URL'] || 'Please enter a valid YouTube URL.';\r\n return;\r\n }\r\n const item: MediaItem = {\r\n mediaType: 'youtube',\r\n url: `https://www.youtube.com/embed/${videoId}`,\r\n thumbnailUrl: `https://img.youtube.com/vi/${videoId}/mqdefault.jpg`\r\n };\r\n this._appendMediaItem(item);\r\n this.showYoutubeInput = false;\r\n this.youtubeUrlInput = '';\r\n this.youtubeUrlError = '';\r\n }\r\n\r\n private _extractYoutubeId(url: string): string | null {\r\n const patterns = [\r\n /(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/|youtube\\.com\\/embed\\/)([\\w-]{11})/,\r\n /youtube\\.com\\/shorts\\/([\\w-]{11})/\r\n ];\r\n for (const p of patterns) {\r\n const m = url.match(p);\r\n if (m) return m[1];\r\n }\r\n return null;\r\n }\r\n\r\n // ── Device upload ────────────────────────────────────────────────────────\r\n\r\n onMediaMenuDevice(): void {\r\n this.showMediaMenu = false;\r\n this.showYoutubeInput = false;\r\n // Use setTimeout so Angular finishes closing the dropdown before the\r\n // browser opens the native file picker (the input lives outside *ngIf).\r\n setTimeout(() => this.mediaDeviceInput?.nativeElement?.click());\r\n }\r\n\r\n onMediaFileSelected(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (input.files && input.files.length > 0) {\r\n this.processFiles(input.files);\r\n }\r\n input.value = '';\r\n }\r\n\r\n // ── Library picker ───────────────────────────────────────────────────────\r\n\r\n onMediaMenuLibrary(): void {\r\n this.showMediaMenu = false;\r\n this.showYoutubeInput = false;\r\n this.libraryImages = [];\r\n this.librarySelectedIds = new Set();\r\n this.libraryError = '';\r\n this.showLibraryModal = true;\r\n this._loadLibraryImages();\r\n }\r\n\r\n private _loadLibraryImages(): void {\r\n const cfg = this.config.attachmentConfig;\r\n if (!cfg?.libraryApiUrl) { this.libraryError = 'Library not configured.'; return; }\r\n this.libraryLoading = true;\r\n this.http.get<any>(cfg.libraryApiUrl, { headers: this.getHeaders() })\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res: any) => {\r\n let data: any;\r\n\r\n if (cfg.libraryDataPath) {\r\n // Try explicit dot-notation path configured by the dev (e.g. 'data.items')\r\n data = this.getValueByPath(res, cfg.libraryDataPath);\r\n }\r\n\r\n // If no array was found at the configured path, try auto-detecting\r\n // the array from common structures\r\n if (!Array.isArray(data)) {\r\n if (Array.isArray(res)) {\r\n // API returned a plain array\r\n data = res;\r\n } else if (res && typeof res === 'object') {\r\n // API returned an object keyed by entity-id e.g. { \"1\": [...], \"2\": [...] }\r\n // Flatten all value-arrays into one list\r\n data = (Object.values(res) as any[][])\r\n .filter(v => Array.isArray(v))\r\n .reduce((acc, arr) => acc.concat(arr), []);\r\n }\r\n }\r\n\r\n this.libraryImages = Array.isArray(data) ? data : [];\r\n this.libraryLoading = false;\r\n },\r\n error: () => {\r\n this.libraryError = this.controller.labels['ERR_LIBRARY_LOAD_FAILED'] || 'Failed to load library images.';\r\n this.libraryLoading = false;\r\n }\r\n });\r\n }\r\n\r\n getLibraryItemUrl(item: any): string {\r\n const cfg = this.config.attachmentConfig;\r\n return cfg?.libraryUrlPath ? this.getValueByPath(item, cfg.libraryUrlPath) : (item?.url || item?.completeURL || '');\r\n }\r\n\r\n getLibraryItemId(item: any): any {\r\n const cfg = this.config.attachmentConfig;\r\n return cfg?.libraryIdPath ? this.getValueByPath(item, cfg.libraryIdPath) : (item?.id ?? item);\r\n }\r\n\r\n isLibraryItemSelected(item: any): boolean {\r\n return this.librarySelectedIds.has(this.getLibraryItemId(item));\r\n }\r\n\r\n toggleLibraryItem(item: any): void {\r\n const id = this.getLibraryItemId(item);\r\n if (this.librarySelectedIds.has(id)) {\r\n this.librarySelectedIds.delete(id);\r\n } else {\r\n this.librarySelectedIds.add(id);\r\n }\r\n }\r\n\r\n closeLibraryModal(): void {\r\n this.showLibraryModal = false;\r\n }\r\n\r\n confirmLibrarySelection(): void {\r\n // We already have completeURL on each library item — no upload API call needed.\r\n // Directly build MediaItem[] from the selected library images and append to form value.\r\n const selectedItems = this.libraryImages.filter(item => this.isLibraryItemSelected(item));\r\n if (!selectedItems.length) {\r\n this.showLibraryModal = false;\r\n return;\r\n }\r\n\r\n const cfg = this.config.attachmentConfig;\r\n const maxItems = cfg?.maxFiles ?? 10;\r\n const currentItems: MediaItem[] = [...this.mediaItems];\r\n let errorShown = false;\r\n\r\n selectedItems.forEach(item => {\r\n if (currentItems.length >= maxItems) {\r\n if (!errorShown) {\r\n this.showMediaError(this.controller.labels['ERR_MEDIA_MAX'] || `Maximum ${maxItems} media items allowed.`);\r\n errorShown = true;\r\n }\r\n return;\r\n }\r\n const url = this.getLibraryItemUrl(item); // item.completeURL\r\n if (!url) return;\r\n\r\n // Do NOT store the library item's id — library images were not POSTed to\r\n // the upload API, so there is no server-side attachment record to DELETE.\r\n // Without an id, removeMediaItem() always takes the local-remove path. ✓\r\n currentItems.push({\r\n mediaType: 'image',\r\n url,\r\n mimeType: item.mimeType,\r\n fileName: item.fileName ?? item.name,\r\n isUploading: false\r\n });\r\n });\r\n\r\n\r\n this.updateValue(currentItems);\r\n this.mediaCarouselIndex = currentItems.length - 1;\r\n this.showLibraryModal = false;\r\n }\r\n\r\n // ── Remove item ──────────────────────────────────────────────────────────\r\n\r\n removeMediaItem(index: number): void {\r\n const items: MediaItem[] = [...this.mediaItems];\r\n const item = items[index];\r\n if (!item) return;\r\n\r\n const removeLocally = () => {\r\n const updated = items.filter((_, i) => i !== index);\r\n this.updateValue(updated.length ? updated : null);\r\n // Clamp carousel index so it never points past the end\r\n this.mediaCarouselIndex = Math.max(0, this.mediaCarouselIndex - (index <= this.mediaCarouselIndex ? 1 : 0));\r\n };\r\n\r\n const deleteUrl = this.config.attachmentConfig?.deleteUrl;\r\n\r\n if (item.id && item.id !== 0 && deleteUrl) {\r\n // ── API delete path (same logic as removeUploadedFile) ───────────────\r\n item.isUploading = true; // disable the remove button while in-flight\r\n this.updateValue([...items]); // trigger change detection\r\n\r\n let params = new HttpParams();\r\n if (!deleteUrl.includes('attachmentId=')) {\r\n params = params.set('attachmentId', item.id.toString());\r\n }\r\n if (!deleteUrl.includes('reason=')) {\r\n params = params.set('reason', 'DELETED BY CREATOR');\r\n }\r\n\r\n this.http.delete<any>(deleteUrl, { headers: this.getHeaders(), params })\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: () => removeLocally(),\r\n error: (err) => {\r\n console.error('Failed to delete media attachment', err);\r\n item.isUploading = false;\r\n this.updateValue([...items]); // restore UI state\r\n }\r\n });\r\n } else {\r\n // ── No id or no deleteUrl: remove locally, no API call ───────────────\r\n removeLocally();\r\n }\r\n }\r\n\r\n\r\n private _appendMediaItem(item: MediaItem): void {\r\n const current: MediaItem[] = [...this.mediaItems];\r\n current.push(item);\r\n this.updateValue(current);\r\n this.mediaCarouselIndex = current.length - 1;\r\n }\r\n\r\n private showMediaError(msg: string): void {\r\n this.mediaUploadError = msg;\r\n setTimeout(() => {\r\n if (this.mediaUploadError === msg) this.mediaUploadError = '';\r\n }, 4000);\r\n }\r\n\r\n // ── LOCATION field methods ─────────────────────────────────────────────────\r\n\r\n private initLocationField(): void {\r\n const cfg = this.config.locationConfig;\r\n this.locationActiveTab = cfg?.defaultTab ?? 'VENUE';\r\n\r\n // Restore from existing form value using the robust getter\r\n if (this.locationValue.tab) {\r\n this.locationActiveTab = this.locationValue.tab;\r\n }\r\n\r\n // Subscribe to external patchValue events (prefills)\r\n this.formGroup.get(this.config.name!)?.valueChanges\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n if (this.locationValue.tab) {\r\n this.locationActiveTab = this.locationValue.tab;\r\n }\r\n setTimeout(() => this._renderMap());\r\n });\r\n\r\n // Load Google Maps script if not already loaded\r\n this._ensureGoogleMapsScript();\r\n }\r\n\r\n private _ensureGoogleMapsScript(): void {\r\n const apiKey = this.config.locationConfig?.googleMapsApiKey;\r\n if (!apiKey) return;\r\n\r\n if ((window as any).google?.maps?.places) {\r\n this._googleAcService = new (window as any).google.maps.places.AutocompleteService();\r\n this.locationMapLoaded = true;\r\n setTimeout(() => this._renderMap(), 100);\r\n return;\r\n }\r\n\r\n // Only inject once\r\n if (document.querySelector('script[data-sf-gmaps]')) {\r\n // Wait for the script to load\r\n const wait = () => {\r\n if ((window as any).google?.maps?.places) {\r\n this._googleAcService = new (window as any).google.maps.places.AutocompleteService();\r\n this.locationMapLoaded = true;\r\n setTimeout(() => this._renderMap(), 100);\r\n } else {\r\n setTimeout(wait, 300);\r\n }\r\n };\r\n wait();\r\n return;\r\n }\r\n\r\n const script = document.createElement('script');\r\n script.src = `https://maps.googleapis.com/maps/api/js?key=${apiKey}&libraries=places`;\r\n script.async = true;\r\n script.defer = true;\r\n script.setAttribute('data-sf-gmaps', 'true');\r\n script.onload = () => {\r\n this._googleAcService = new (window as any).google.maps.places.AutocompleteService();\r\n this.locationMapLoaded = true;\r\n setTimeout(() => this._renderMap(), 100);\r\n };\r\n document.head.appendChild(script);\r\n }\r\n\r\n onLocationTabChange(tab: 'VENUE' | 'ONLINE' | 'TBA'): void {\r\n if (this.locationActiveTab === 'VENUE' && tab !== 'VENUE') {\r\n this._googleMap = null;\r\n this._mapMarkers = [];\r\n }\r\n this.locationActiveTab = tab;\r\n this.locationSuggestions = [];\r\n this.locationShowSuggestions = false;\r\n this.locationSearchText = '';\r\n const existing: LocationFieldValue = this.formGroup.get(this.config.name!)?.value || { tab, venues: [], onlineUrl: '' };\r\n existing.tab = tab;\r\n this.updateValue(existing);\r\n if (tab === 'VENUE') {\r\n setTimeout(() => this._renderMap());\r\n }\r\n }\r\n\r\n get locationValue(): LocationFieldValue {\r\n let v = this.formGroup.get(this.config.name!)?.value;\r\n if (typeof v === 'string') {\r\n try { v = JSON.parse(v); } catch { /* ignore */ }\r\n }\r\n // Automatically unwrap if prefill payload was mistakenly double-nested like `{ location: { tab... } }`\r\n if (v && !v.tab && v[this.config.name!]) {\r\n v = v[this.config.name!];\r\n }\r\n if (v && v.tab) return v;\r\n return { tab: this.locationActiveTab, venues: [], onlineUrl: '' };\r\n }\r\n\r\n get locationVenues(): LocationItem[] {\r\n return this.locationValue.venues || [];\r\n }\r\n\r\n get locationOnlineUrl(): string {\r\n return this.locationValue.onlineUrl || '';\r\n }\r\n\r\n get locationMaxReached(): boolean {\r\n const isMulti = this.config.locationConfig?.allowMulti;\r\n const max = isMulti ? (this.config.locationConfig?.maxLocations ?? 5) : 1;\r\n return this.locationVenues.length >= max;\r\n }\r\n\r\n handleLocationSearchInput(event: Event): void {\r\n const input = (event.target as HTMLInputElement).value;\r\n this.locationSearchText = input;\r\n if (!input || input.length < 2) {\r\n this.locationSuggestions = [];\r\n this.locationShowSuggestions = false;\r\n return;\r\n }\r\n if (!this._googleAcService) {\r\n return;\r\n }\r\n this._googleAcService.getPlacePredictions({ input }, (predictions: any[], status: string) => {\r\n if (status === 'OK' && predictions) {\r\n this.locationSuggestions = predictions;\r\n this.locationShowSuggestions = true;\r\n } else {\r\n this.locationSuggestions = [];\r\n this.locationShowSuggestions = false;\r\n }\r\n });\r\n }\r\n\r\n onLocationSuggestionSelect(prediction: any): void {\r\n if (!prediction) return;\r\n const isMulti = this.config.locationConfig?.allowMulti;\r\n const max = isMulti ? (this.config.locationConfig?.maxLocations ?? 5) : 1;\r\n const current = this.locationVenues;\r\n if (current.length >= max) return;\r\n\r\n const newItem: LocationItem = {\r\n description: prediction.description,\r\n placeId: prediction.place_id,\r\n address: prediction.description,\r\n type: 'GOOGLE',\r\n isActive: true\r\n };\r\n\r\n // Geocode to get lat/lng and components\r\n if ((window as any).google?.maps?.Geocoder) {\r\n const geocoder = new (window as any).google.maps.Geocoder();\r\n geocoder.geocode({ placeId: prediction.place_id }, (results: any[], status: string) => {\r\n if (status === 'OK' && results[0]) {\r\n const res = results[0];\r\n newItem.latitude = res.geometry?.location?.lat();\r\n newItem.longitude = res.geometry?.location?.lng();\r\n newItem.address = res.formatted_address || prediction.description;\r\n\r\n let name = prediction.description;\r\n if (prediction.structured_formatting && prediction.structured_formatting.main_text) {\r\n name = prediction.structured_formatting.main_text;\r\n }\r\n newItem.name = name;\r\n\r\n res.address_components?.forEach((c: any) => {\r\n if (c.types.includes('locality')) newItem.cityLabel = c.long_name;\r\n if (c.types.includes('administrative_area_level_1')) newItem.stateLabel = c.long_name;\r\n if (c.types.includes('country')) newItem.countryLabel = c.long_name;\r\n });\r\n }\r\n this._addVenueAndUpdate(newItem);\r\n });\r\n } else {\r\n this._addVenueAndUpdate(newItem);\r\n }\r\n\r\n this.locationSearchText = '';\r\n this.locationSuggestions = [];\r\n this.locationShowSuggestions = false;\r\n }\r\n\r\n private _addVenueAndUpdate(item: LocationItem): void {\r\n const val = { ...this.locationValue };\r\n val.venues = [...(val.venues || []), item];\r\n this.updateValue(val);\r\n setTimeout(() => this._renderMap());\r\n }\r\n\r\n removeLocationVenue(index: number): void {\r\n const val = { ...this.locationValue };\r\n val.venues = (val.venues || []).filter((_, i) => i !== index);\r\n this.updateValue(val);\r\n setTimeout(() => this._renderMap());\r\n }\r\n\r\n onLocationUrlChange(url: string): void {\r\n const val = { ...this.locationValue, onlineUrl: url };\r\n this.updateValue(val);\r\n }\r\n\r\n hideLocationSuggestions(): void {\r\n setTimeout(() => { this.locationShowSuggestions = false; }, 200);\r\n }\r\n\r\n getLocationMapEmbedUrl(): string {\r\n const venues = this.locationVenues.filter(v => v.placeId || (typeof v.latitude === 'number' && typeof v.longitude === 'number'));\r\n const apiKey = this.config.locationConfig?.googleMapsApiKey || '';\r\n\r\n // No locations currently selected: Show the default map view (India)\r\n if (!venues.length) {\r\n if (apiKey) {\r\n // Embed API center fallback if they have an API Key but no marker yet\r\n const lat = this.config.locationConfig?.defaultLat ?? 20.5937;\r\n const lng = this.config.locationConfig?.defaultLng ?? 78.9629;\r\n const zoom = this.config.locationConfig?.defaultZoom ?? 4;\r\n return `https://www.google.com/maps/embed/v1/view?key=${apiKey}¢er=${lat},${lng}&zoom=${zoom}`;\r\n } else {\r\n // Static iframe fallback text query\r\n return `https://maps.google.com/maps?q=India&output=embed`;\r\n }\r\n }\r\n\r\n if (venues.length === 1) {\r\n const v = venues[0];\r\n const q = v.placeId ? `place_id:${v.placeId}` : encodeURIComponent(v.address || v.description || '');\r\n return `https://www.google.com/maps/embed/v1/place?key=${apiKey}&q=${q}`;\r\n }\r\n // Multiple locations — use directions/search embed\r\n const q = encodeURIComponent(venues.map(v => v.address || v.description).join('|'));\r\n return `https://www.google.com/maps/embed/v1/search?key=${apiKey}&q=${q}`;\r\n }\r\n\r\n private _renderMap(): void {\r\n if (!(window as any).google?.maps) return;\r\n if (!this.config.locationConfig?.showMap && this.config.locationConfig?.showMap !== undefined) return;\r\n\r\n const venues = this.locationVenues.filter(v => typeof v.latitude === 'number' && typeof v.longitude === 'number');\r\n\r\n const mapEl = document.getElementById(`loc-map-${this.config.name}`);\r\n if (!mapEl) return;\r\n\r\n if (!this._googleMap) {\r\n // Default to India if no venues exist\r\n const defaultLat = this.config.locationConfig?.defaultLat ?? 20.5937;\r\n const defaultLng = this.config.locationConfig?.defaultLng ?? 78.9629;\r\n const defaultZoom = this.config.locationConfig?.defaultZoom ?? 4;\r\n\r\n this._googleMap = new (window as any).google.maps.Map(mapEl, {\r\n zoom: venues.length === 1 ? 12 : defaultZoom,\r\n center: venues.length > 0\r\n ? { lat: venues[0].latitude, lng: venues[0].longitude }\r\n : { lat: defaultLat, lng: defaultLng }\r\n });\r\n } else {\r\n if (venues.length === 0) {\r\n // Re-center on default\r\n const lat = this.config.locationConfig?.defaultLat ?? 20.5937;\r\n const lng = this.config.locationConfig?.defaultLng ?? 78.9629;\r\n this._googleMap.setCenter({ lat, lng });\r\n this._googleMap.setZoom(this.config.locationConfig?.defaultZoom ?? 4);\r\n } else if (venues.length === 1) {\r\n this._googleMap.setCenter({ lat: venues[0].latitude, lng: venues[0].longitude });\r\n this._googleMap.setZoom(12);\r\n }\r\n }\r\n\r\n // Clear old markers\r\n this._mapMarkers.forEach(m => m.setMap(null));\r\n this._mapMarkers = [];\r\n\r\n venues.forEach(v => {\r\n const marker = new (window as any).google.maps.Marker({\r\n position: { lat: v.latitude, lng: v.longitude },\r\n map: this._googleMap,\r\n title: v.name || v.address || v.description\r\n });\r\n this._mapMarkers.push(marker);\r\n });\r\n\r\n if (venues.length > 1) {\r\n const bounds = new (window as any).google.maps.LatLngBounds();\r\n venues.forEach(v => bounds.extend({ lat: v.latitude!, lng: v.longitude! }));\r\n this._googleMap.fitBounds(bounds);\r\n }\r\n }\r\n}\r\n\r\n","<div class=\"form-field\" *ngIf=\"isVisible\" [class.has-error]=\"errorMessage\">\r\n\r\n <!-- ══ ROW Layout ════════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isRow\" class=\"form-row grid-row\">\r\n <ng-container *ngFor=\"let child of config.children\">\r\n <div class=\"row-field\" [style.gridColumn]=\"'span ' + getChildColSpan(child)\" *ngIf=\"child.isEnabled !== false\">\r\n <lib-form-field [config]=\"child\" [controller]=\"controller\" [formGroup]=\"formGroup\" [allowMulti]=\"allowMulti\">\r\n </lib-form-field>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- ══ GROUP — allowMulti (repeater) ════════════════════════════════════ -->\r\n <div *ngIf=\"isGroup && config.sectionConfig?.allowMulti\" class=\"group-section-wrapper\"\r\n [class.multi-save-active]=\"config.sectionConfig?.multiSaveConfig?.active\">\r\n\r\n <!-- Multi-Save Header with Add button (top-right style) -->\r\n <div class=\"multi-save-header\" *ngIf=\"config.sectionConfig?.multiSaveConfig?.active\">\r\n <h3 class=\"group-label\" *ngIf=\"config.sectionConfig?.label\">{{ config.sectionConfig!.label }}</h3>\r\n <lib-button [variant]=\"'outline'\" [icon]=\"{type: 'material', value: 'add'}\" (click)=\"addGroupInstance()\"\r\n class=\"btn-add-multi\">\r\n {{ addMultiLabel }}\r\n </lib-button>\r\n </div>\r\n\r\n <!-- Standard Header for non-multiSave -->\r\n <h3 class=\"group-label\" *ngIf=\"config.sectionConfig?.label && !config.sectionConfig?.multiSaveConfig?.active\">{{\r\n config.sectionConfig!.label }}</h3>\r\n\r\n <div *ngFor=\"let instance of instanceList; trackBy: trackByInstanceId; let i = index\" class=\"group-instance\"\r\n [class.is-editing]=\"instance.isEditing\"\r\n [class.is-card]=\"config.sectionConfig?.multiSaveConfig?.active && !instance.isEditing\">\r\n\r\n <!-- 1. EDIT MODE / UNSAVED / STANDARD STATE -->\r\n <div [hidden]=\"config.sectionConfig?.multiSaveConfig?.active && !instance.isEditing\">\r\n <!-- Instance header — show remove only when more than 1 instance -->\r\n <div class=\"group-header\" *ngIf=\"!config.sectionConfig?.multiSaveConfig?.active && instanceList.length > 1\">\r\n <span class=\"group-number\">{{ config.sectionConfig!.label }} #{{ i + 1 }}</span>\r\n <lib-button [variant]=\"'danger-outline'\" [icon]=\"{type: 'material', value: 'delete_outline'}\"\r\n (click)=\"removeGroupInstance(i)\">\r\n {{ removeLabel }}\r\n </lib-button>\r\n </div>\r\n\r\n <div class=\"group-fields sf-grid\">\r\n <ng-container *ngFor=\"let field of config.sectionConfig!.children\">\r\n <div class=\"sf-col\" [style.gridColumn]=\"'span ' + (field.colSpan || 12)\" *ngIf=\"field.isEnabled !== false\">\r\n <lib-form-field [config]=\"field\" [controller]=\"controller\" [formGroup]=\"instance.fg\" [allowMulti]=\"true\">\r\n </lib-form-field>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- SAVE / CANCEL BUTTONS for MultiSave in Editing phase -->\r\n <div class=\"group-footer\" *ngIf=\"config.sectionConfig?.multiSaveConfig?.active\">\r\n <span class=\"field-error\" *ngIf=\"multiSaveError\">{{ multiSaveError }}</span>\r\n <div class=\"footer-actions\">\r\n <lib-button [variant]=\"'outline'\" (click)=\"cancelGroupInstance(i)\">Cancel</lib-button>\r\n <lib-button [variant]=\"'primary'\" (click)=\"saveGroupInstance(i)\">Save</lib-button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 2. CARD VIEW (Saved State) -->\r\n <ng-container *ngIf=\"config.sectionConfig?.multiSaveConfig?.active && !instance.isEditing\">\r\n <div class=\"card-view\" [class.is-expanded]=\"instance.isExpanded\">\r\n <div class=\"card-content\">\r\n <span class=\"card-title\">{{ instance.fg.get(config.sectionConfig.multiSaveConfig.summaryField || '')?.value\r\n || '—' }}</span>\r\n <!-- <span class=\"card-desc\" *ngIf=\"config.sectionConfig.multiSaveConfig.descriptionField\"\r\n [innerHTML]=\"instance.fg.get(config.sectionConfig.multiSaveConfig.descriptionField)?.value\">\r\n </span> -->\r\n </div>\r\n <div class=\"card-actions\">\r\n <mat-icon class=\"icon-delete\" (click)=\"removeGroupInstance(i, true)\">delete_outline</mat-icon>\r\n <mat-icon class=\"icon-edit\" (click)=\"editGroupInstance(i)\">edit_outline</mat-icon>\r\n <mat-icon class=\"icon-expand\" (click)=\"toggleExpandGroupInstance(i)\">\r\n {{ instance.isExpanded ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}\r\n </mat-icon>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Standard Add Button for non-multiSave -->\r\n <lib-button *ngIf=\"!config.sectionConfig?.multiSaveConfig?.active\" [variant]=\"'outline'\"\r\n [icon]=\"{type: 'material', value: 'add'}\" (click)=\"addGroupInstance()\" class=\"btn-add-group-wrapper\">\r\n {{ addLabel }} {{ config.sectionConfig!.label }}\r\n </lib-button>\r\n </div>\r\n\r\n <!-- ══ GROUP — single (non-repeater) ════════════════════════════════════ -->\r\n <div *ngIf=\"isGroup && config.sectionConfig && !config.sectionConfig.allowMulti\" class=\"group-section-wrapper\">\r\n <h3 class=\"group-label\" *ngIf=\"config.sectionConfig.label\">{{ config.sectionConfig.label }}</h3>\r\n <div class=\"group-fields sf-grid\">\r\n <ng-container *ngFor=\"let field of config.sectionConfig.children\">\r\n <div class=\"sf-col\" [style.gridColumn]=\"'span ' + (field.colSpan || 12)\" *ngIf=\"field.isEnabled !== false\">\r\n <lib-form-field [config]=\"field\" [controller]=\"controller\" [formGroup]=\"groupFormGroup\" [allowMulti]=\"false\">\r\n </lib-form-field>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n\r\n <!-- ══ Text Input ════════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isTextField\" class=\"field-wrapper\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"config.label\" class=\"field-label\">\r\n {{ config.label }}\r\n <span class=\"required\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n\r\n <textarea *ngIf=\"config.subType === 'LONG'\" class=\"field-input textarea\" [placeholder]=\"config.placeholder || ''\"\r\n [formControlName]=\"config.name!\" [class.is-invalid]=\"errorMessage\" rows=\"4\">\r\n </textarea>\r\n\r\n <!-- Password input with show/hide toggle -->\r\n <div *ngIf=\"config.subType === 'PASSWORD'\" class=\"password-wrapper\">\r\n <input [type]=\"showPassword ? 'text' : 'password'\" class=\"field-input password-input\"\r\n [placeholder]=\"config.placeholder || ''\" [formControlName]=\"config.name!\" [class.is-invalid]=\"errorMessage\">\r\n <button type=\"button\" class=\"password-toggle\" (click)=\"showPassword = !showPassword\" tabindex=\"-1\"\r\n [attr.aria-label]=\"showPassword ? 'Hide password' : 'Show password'\">\r\n <mat-icon class=\"eye-icon\">{{ showPassword ? 'visibility' : 'visibility_off' }}</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"input-group\" [class.readonly]=\"config.readonly\">\r\n <span class=\"input-prefix\" *ngIf=\"config.prefix\">{{ config.prefix }}</span>\r\n\r\n <input *ngIf=\"config.subType !== 'LONG' && config.subType !== 'PASSWORD'\"\r\n [type]=\"config.subType === 'EMAIL' ? 'email' : config.subType === 'PHONE' ? 'tel' : 'text'\" class=\"field-input\"\r\n [placeholder]=\"config.placeholder || ''\" [formControlName]=\"config.name!\" [class.is-invalid]=\"errorMessage\"\r\n [readonly]=\"config.readonly\">\r\n\r\n <span class=\"input-suffix\" *ngIf=\"config.suffix\">{{ config.suffix }}</span>\r\n\r\n <div class=\"readonly-icons\" *ngIf=\"config.readonly\">\r\n <mat-icon class=\"lock-icon\">lock</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <span class=\"field-hint\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n <span class=\"field-error\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n <div class=\"char-count-hint\" *ngIf=\"showCharCount\">\r\n {{ remainingCharacters }} characters remaining\r\n </div>\r\n </div>\r\n\r\n <!-- ══ Number Input ══════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isNumberField\" class=\"field-wrapper\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"config.label\" class=\"field-label\">\r\n {{ config.label }}\r\n <span class=\"required\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n\r\n <div class=\"input-group\" [class.readonly]=\"config.readonly\">\r\n <span class=\"input-prefix\" *ngIf=\"config.prefix\">{{ config.prefix }}</span>\r\n\r\n <input type=\"number\" class=\"field-input\" [placeholder]=\"config.placeholder || ''\" [formControlName]=\"config.name!\"\r\n [min]=\"config.numberConfig?.min\" [max]=\"config.numberConfig?.max\" [step]=\"config.numberConfig?.step || 1\"\r\n [class.is-invalid]=\"errorMessage\" [readonly]=\"config.readonly\">\r\n\r\n <span class=\"input-suffix\" *ngIf=\"config.suffix\">{{ config.suffix }}</span>\r\n\r\n <div class=\"readonly-icons\" *ngIf=\"config.readonly\">\r\n <mat-icon class=\"lock-icon\">lock</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <span class=\"field-hint\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n <span class=\"field-error\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n\r\n <!-- ══ Date Input ════════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isDateField\" class=\"field-wrapper\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"config.label\" class=\"field-label\">\r\n {{ config.label }}\r\n <span class=\"required\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n\r\n <div class=\"input-group\" [class.readonly]=\"config.readonly\">\r\n <input matInput [matDatepicker]=\"datePicker\" class=\"field-input date-input has-icon-right\"\r\n [formControlName]=\"config.name!\" [min]=\"config.dateConfig?.minDate\" [max]=\"config.dateConfig?.maxDate\"\r\n [class.is-invalid]=\"errorMessage\" [placeholder]=\"config.placeholder || ''\" [readonly]=\"config.readonly\"\r\n (click)=\"!config.readonly && datePicker.open()\">\r\n <div class=\"date-icon-wrapper\" *ngIf=\"!config.readonly\">\r\n <mat-datepicker-toggle matSuffix [for]=\"datePicker\"></mat-datepicker-toggle>\r\n </div>\r\n <mat-datepicker #datePicker></mat-datepicker>\r\n\r\n <div class=\"readonly-icons\" *ngIf=\"config.readonly\">\r\n <mat-icon class=\"lock-icon\">lock</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <span class=\"field-hint\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n <span class=\"field-error\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n\r\n <!-- ══ Time Input ════════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isTimeField\" class=\"field-wrapper\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"config.label\" class=\"field-label\">\r\n {{ config.label }}\r\n <span class=\"required\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n\r\n <div class=\"input-group\" [class.readonly]=\"config.readonly\">\r\n <input type=\"time\" class=\"field-input time-input\" [formControlName]=\"config.name!\"\r\n [class.is-invalid]=\"errorMessage\" [readonly]=\"!!config.readonly\">\r\n\r\n <div class=\"readonly-icons\" *ngIf=\"config.readonly\">\r\n <mat-icon class=\"lock-icon\">lock</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <span class=\"field-hint\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n <span class=\"field-error\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n\r\n <!-- ══ Autocomplete ═════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isAutocomplete\" class=\"field-wrapper\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"config.label\" class=\"field-label\">\r\n {{ config.label }}\r\n <span class=\"required\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n\r\n <!-- Hidden real control (stores the code value) -->\r\n <input type=\"hidden\" [formControlName]=\"config.name!\">\r\n\r\n <div class=\"autocomplete-wrapper\" [class.is-invalid]=\"errorMessage\" [class.readonly]=\"config.readonly\">\r\n <!-- Search icon -->\r\n <mat-icon class=\"ac-search-icon\">search</mat-icon>\r\n\r\n <input class=\"field-input ac-input\" [formControl]=\"autocompleteInputCtrl\" [matAutocomplete]=\"auto\"\r\n [placeholder]=\"config.placeholder || 'Search…'\" [readonly]=\"!!config.readonly\" [class.is-invalid]=\"errorMessage\"\r\n (blur)=\"onAutocompleteClear()\" autocomplete=\"off\">\r\n\r\n <!-- Clear button -->\r\n <button type=\"button\" class=\"ac-clear-btn\" *ngIf=\"autocompleteInputCtrl.value && !config.readonly\"\r\n (click)=\"autocompleteInputCtrl.setValue(''); updateValue(null)\" tabindex=\"-1\" aria-label=\"Clear\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n\r\n <mat-autocomplete #auto=\"matAutocomplete\" [panelWidth]=\"'auto'\">\r\n <mat-option *ngFor=\"let option of filteredOptions\" [value]=\"option.label\"\r\n (onSelectionChange)=\"onAutocompleteSelected(option)\">\r\n {{ option.label }}\r\n </mat-option>\r\n <mat-option *ngIf=\"filteredOptions.length === 0\" disabled class=\"ac-no-results\">\r\n No results found\r\n </mat-option>\r\n </mat-autocomplete>\r\n\r\n <div class=\"readonly-icons\" *ngIf=\"config.readonly\">\r\n <mat-icon class=\"lock-icon\">lock</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <span class=\"field-hint\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n <span class=\"field-error\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n\r\n <!-- ══ Dropdown ══════════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isDropdown\" class=\"field-wrapper\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"config.label\" class=\"field-label\">\r\n {{ config.label }}\r\n <span class=\"required\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n\r\n <select *ngIf=\"config.subType === 'SINGLE'\" class=\"field-input\" [formControlName]=\"config.name!\"\r\n [class.is-invalid]=\"errorMessage\">\r\n <option [ngValue]=\"null\" disabled selected>{{ config.placeholder || 'Select' }}</option>\r\n <option *ngFor=\"let option of config.optionConfig?.optionList\" [value]=\"option.code\">\r\n {{ option.label }}\r\n </option>\r\n </select>\r\n\r\n <select *ngIf=\"config.subType === 'MULTIPLE'\" class=\"field-input\" multiple [formControlName]=\"config.name!\"\r\n [class.is-invalid]=\"errorMessage\">\r\n <option *ngFor=\"let option of config.optionConfig?.optionList\" [value]=\"option.code\">\r\n {{ option.label }}\r\n </option>\r\n </select>\r\n\r\n <span class=\"field-hint\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n <span class=\"field-error\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n\r\n <!-- ══ Radio ═════════════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isRadio\" class=\"field-wrapper\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"config.label\" class=\"field-label\">\r\n {{ config.label }}\r\n <span class=\"required\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n\r\n <div class=\"radio-group\" [class.is-invalid]=\"errorMessage\" \r\n [class]=\"config.optionConfig?.layout ? 'layout-' + config.optionConfig!.layout.toLowerCase() : ''\">\r\n <label *ngFor=\"let option of config.optionConfig?.optionList\" class=\"radio-label\"\r\n [class.card-item]=\"config.subType === 'CARD'\"\r\n [class.selected]=\"formGroup.get(config.name!)?.value === option.code\"\r\n [style.gridColumn]=\"config.optionConfig?.layout?.toUpperCase() === 'COLUMN' ? 'span ' + getOptionColSpan(option) : null\">\r\n <input type=\"radio\" [formControlName]=\"config.name!\" [value]=\"option.code\">\r\n <div class=\"option-content\">\r\n <span class=\"label-text\">{{ option.label }}</span>\r\n <span class=\"option-hint\" *ngIf=\"option.hint\">{{ option.hint }}</span>\r\n </div>\r\n </label>\r\n </div>\r\n\r\n <span class=\"field-hint\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n <span class=\"field-error\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n\r\n <!-- ══ Checkbox ══════════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isCheckbox\" class=\"field-wrapper\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"config.label && config.subType === 'LIST'\" class=\"field-label\">\r\n {{ config.label }}\r\n <span class=\"required\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n\r\n <div *ngIf=\"config.subType === 'BOOL'\" class=\"checkbox-single\">\r\n <label class=\"checkbox-label\">\r\n <input type=\"checkbox\" [formControlName]=\"config.name!\" [class.is-invalid]=\"errorMessage\">\r\n <span>{{ config.label }}</span>\r\n </label>\r\n </div>\r\n\r\n <div *ngIf=\"config.subType === 'LIST' || config.subType === 'CARD'\" class=\"checkbox-group\" [class.is-invalid]=\"errorMessage\"\r\n [class]=\"config.optionConfig?.layout ? 'layout-' + config.optionConfig!.layout.toLowerCase() : ''\">\r\n <label *ngFor=\"let option of config.optionConfig?.optionList\" class=\"checkbox-label\"\r\n [class.card-item]=\"config.subType === 'CARD'\"\r\n [class.selected]=\"isChecked(option.code)\"\r\n [style.gridColumn]=\"config.optionConfig?.layout?.toUpperCase() === 'COLUMN' ? 'span ' + getOptionColSpan(option) : null\">\r\n <input type=\"checkbox\" [checked]=\"isChecked(option.code)\" [disabled]=\"!!config.disabled\"\r\n (change)=\"onCheckboxListChange(option.code, $any($event.target).checked)\">\r\n <div class=\"option-content\">\r\n <span class=\"label-text\">{{ option.label }}</span>\r\n <span class=\"option-hint\" *ngIf=\"option.hint\">{{ option.hint }}</span>\r\n </div>\r\n </label>\r\n </div>\r\n\r\n <span class=\"field-hint\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n <span class=\"field-error\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n\r\n <!-- ══ Chip ══════════════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isChip\" class=\"field-wrapper\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"config.label\" class=\"field-label\">\r\n {{ config.label }}\r\n <span class=\"required\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n\r\n <div class=\"chip-group\" [class.is-invalid]=\"errorMessage\">\r\n <label *ngFor=\"let option of config.optionConfig?.optionList\" class=\"chip-label\"\r\n [class.selected]=\"isChecked(option.code)\">\r\n <input type=\"checkbox\" [checked]=\"isChecked(option.code)\" [disabled]=\"!!config.disabled\"\r\n (change)=\"onCheckboxListChange(option.code, $any($event.target).checked)\" hidden>\r\n <span>{{ option.label }}</span>\r\n </label>\r\n </div>\r\n\r\n <span class=\"field-hint\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n <span class=\"field-error\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n\r\n <!-- ══ Switch ════════════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isSwitch\" class=\"field-wrapper\" [formGroup]=\"formGroup\">\r\n <label class=\"switch-container\">\r\n <span class=\"field-label\">{{ config.label }}</span>\r\n <div class=\"switch\">\r\n <input type=\"checkbox\" [formControlName]=\"config.name!\" [class.is-invalid]=\"errorMessage\">\r\n <span class=\"slider\"></span>\r\n </div>\r\n </label>\r\n\r\n <span class=\"field-hint\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n <span class=\"field-error\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n\r\n <!-- ══ Rich Text ═════════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isRichText\" class=\"field-wrapper component-rich-text\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"config.label\" class=\"field-label\">\r\n {{ config.label }}\r\n <span class=\"required\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n\r\n <div class=\"rich-text-container\" [class.is-invalid]=\"errorMessage\">\r\n <quill-editor [formControlName]=\"config.name!\" class=\"rich-text-editor\"\r\n [placeholder]=\"config.richTextConfig?.placeholder || config.placeholder || ''\"\r\n [styles]=\"{height: config.richTextConfig?.height || '200px'}\">\r\n </quill-editor>\r\n </div>\r\n\r\n <span class=\"field-hint\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n <span class=\"field-error\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n <div class=\"char-count-hint\" *ngIf=\"showCharCount\">\r\n {{ remainingCharacters }} characters remaining\r\n </div>\r\n </div>\r\n\r\n <!-- ══ Rating ════════════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isRating\" class=\"field-wrapper\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"config.label\" class=\"field-label\">\r\n {{ config.label }}\r\n <span class=\"required\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n\r\n <div class=\"rating-group\" [class.is-invalid]=\"errorMessage\">\r\n <span *ngFor=\"let star of getStarArray()\" class=\"star\" [class.filled]=\"isStarFilled(star)\"\r\n [class.half]=\"isStarHalf(star)\" (click)=\"onRatingChange(star, $event)\">\r\n <mat-icon>{{ isStarFilled(star) || isStarHalf(star) ? 'star' : 'star_border' }}</mat-icon>\r\n </span>\r\n </div>\r\n\r\n <span class=\"field-hint\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n <span class=\"field-error\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n\r\n <!-- ══ Generated Field (read-only) ══════════════════════════════════════ -->\r\n <div *ngIf=\"isGenerated\" class=\"field-wrapper\">\r\n <label *ngIf=\"config.label\" class=\"field-label\">{{ config.label }}</label>\r\n <div class=\"generated-value\">{{ value || '-' }}</div>\r\n <span class=\"field-hint\" *ngIf=\"config.hint\">{{ config.hint }}</span>\r\n </div>\r\n\r\n <!-- ══ File Upload ═══════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isFileUpload\" class=\"field-wrapper\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"config.label\" class=\"field-label\">\r\n {{ config.label }}\r\n <span class=\"required\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n\r\n <!-- Drop Zone -->\r\n <div class=\"upload-drop-zone\" [class.drag-over]=\"isDragOver\" [class.has-files]=\"value?.length\"\r\n [class.is-invalid]=\"errorMessage\" (dragover)=\"onDragOver($event)\" (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onFileDrop($event)\" (click)=\"fileInput.click()\">\r\n\r\n <div class=\"upload-icon-wrap\">\r\n <mat-icon class=\"upload-cloud-icon\">cloud_upload</mat-icon>\r\n </div>\r\n\r\n <p class=\"upload-main-text\">Drag and drop files here or <span class=\"upload-link\">click to upload</span></p>\r\n <p class=\"upload-hint-text\" *ngIf=\"config.attachmentConfig?.acceptLabel\">\r\n Supported formats:\r\n <span class=\"upload-formats\">{{ config.attachmentConfig!.acceptLabel }}</span>\r\n </p>\r\n <p class=\"upload-hint-text\" *ngIf=\"!config.attachmentConfig?.acceptLabel && config.hint\">\r\n {{ config.hint }}\r\n </p>\r\n\r\n <!-- Hidden native file input -->\r\n <input #fileInput type=\"file\" hidden [attr.multiple]=\"config.attachmentConfig?.multiple ? true : null\"\r\n [attr.accept]=\"config.attachmentConfig?.accept || null\" (change)=\"onFileSelected($event)\">\r\n </div>\r\n\r\n <!-- Uploaded file list -->\r\n <div class=\"uploaded-list\" *ngIf=\"value?.length\">\r\n <div *ngFor=\"let f of value; let i = index\" class=\"uploaded-item\" [class.uploading]=\"f.isUploading\">\r\n\r\n <!-- Uploading spinner (shown while API call is in progress) -->\r\n <ng-container *ngIf=\"f.isUploading; else fileReady\">\r\n <div class=\"upload-spinner\"></div>\r\n <div class=\"file-info\">\r\n <span class=\"file-name\" [title]=\"f.name\">{{ f.name }}</span>\r\n <span class=\"file-size uploading-label\">Uploading...</span>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Normal state once upload is done -->\r\n <ng-template #fileReady>\r\n <!-- File type icon -->\r\n <mat-icon class=\"file-type-icon\">{{ getFileIcon(f.type) }}</mat-icon>\r\n\r\n <!-- Image thumbnail (only for images) -->\r\n <img *ngIf=\"f.type?.startsWith('image') && f.dataUrl\" [src]=\"f.dataUrl\" class=\"file-thumb\" alt=\"preview\">\r\n\r\n <!-- Name & size -->\r\n <div class=\"file-info\">\r\n <span class=\"file-name\" [title]=\"f.name\">{{ f.name }}</span>\r\n <span class=\"file-size\">{{ formatFileSize(f.size) }}</span>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Remove button — disabled while uploading -->\r\n <lib-button [variant]=\"'danger-outline'\" [disabled]=\"f.isUploading\"\r\n (click)=\"!f.isUploading && removeUploadedFile(i)\">\r\n <mat-icon>close</mat-icon>\r\n </lib-button>\r\n </div>\r\n </div>\r\n\r\n <!-- Validation / file errors -->\r\n <span class=\"field-error\" *ngIf=\"fileUploadError\">{{ fileUploadError }}</span>\r\n <span class=\"field-error\" *ngIf=\"errorMessage && !fileUploadError\">{{ errorMessage }}</span>\r\n <span class=\"field-hint\"\r\n *ngIf=\"config.hint && !errorMessage && !fileUploadError && !config.attachmentConfig?.acceptLabel\">\r\n {{ config.hint }}\r\n </span>\r\n </div>\r\n\r\n <!-- ══ Media Upload (Type 2) ════════════════════════════════════════════ -->\r\n <div *ngIf=\"isMediaUpload\" class=\"field-wrapper media-upload-wrapper\" [formGroup]=\"formGroup\">\r\n\r\n <!-- Hidden file input lives outside *ngIf — triggered via ViewChild -->\r\n <input #mediaDeviceInput type=\"file\" hidden multiple accept=\"image/*\" (change)=\"onMediaFileSelected($event)\">\r\n\r\n <!-- Two-column layout -->\r\n <div class=\"mu-layout\">\r\n\r\n <!-- ── LEFT PANEL ──────────────────────────────────────────────── -->\r\n <div class=\"mu-left\">\r\n\r\n <!-- Header: title + max-items badge -->\r\n <div class=\"mu-header\">\r\n <h3 class=\"mu-title\">\r\n {{ config.label }}\r\n <span class=\"required\" *ngIf=\"config.required\">*</span>\r\n </h3>\r\n <span class=\"mu-badge\" *ngIf=\"config.attachmentConfig?.maxFiles\">\r\n {{ controller.labels['LBL_MEDIA_MAX_PREFIX'] || 'Maximum' }}\r\n {{ config.attachmentConfig?.maxFiles }}\r\n {{ controller.labels['LBL_MEDIA_MAX_SUFFIX'] || 'Image & Videos' }}\r\n </span>\r\n </div>\r\n\r\n <!-- Description -->\r\n <p class=\"mu-description\" *ngIf=\"config.attachmentConfig?.description\">\r\n {{ config.attachmentConfig?.description }}\r\n </p>\r\n <p class=\"mu-description\" *ngIf=\"!config.attachmentConfig?.description && controller.labels['LBL_MEDIA_DESC']\">\r\n {{ controller.labels['LBL_MEDIA_DESC'] }}\r\n </p>\r\n\r\n <!-- Feature bullet list -->\r\n <ul class=\"mu-features\"\r\n *ngIf=\"config.attachmentConfig?.features?.length || controller.labels['LBL_MEDIA_FEATURE_1']\">\r\n <ng-container *ngIf=\"config.attachmentConfig?.features?.length\">\r\n <li *ngFor=\"let f of config.attachmentConfig?.features\" class=\"mu-feature-item\">\r\n <mat-icon class=\"mu-check\">check</mat-icon>{{ f }}\r\n </li>\r\n </ng-container>\r\n <ng-container *ngIf=\"!config.attachmentConfig?.features?.length\">\r\n <li *ngIf=\"controller.labels['LBL_MEDIA_FEATURE_1']\" class=\"mu-feature-item\">\r\n <mat-icon class=\"mu-check\">check</mat-icon>{{ controller.labels['LBL_MEDIA_FEATURE_1'] }}\r\n </li>\r\n <li *ngIf=\"controller.labels['LBL_MEDIA_FEATURE_2']\" class=\"mu-feature-item\">\r\n <mat-icon class=\"mu-check\">check</mat-icon>{{ controller.labels['LBL_MEDIA_FEATURE_2'] }}\r\n </li>\r\n <li *ngIf=\"controller.labels['LBL_MEDIA_FEATURE_3']\" class=\"mu-feature-item\">\r\n <mat-icon class=\"mu-check\">check</mat-icon>{{ controller.labels['LBL_MEDIA_FEATURE_3'] }}\r\n </li>\r\n </ng-container>\r\n </ul>\r\n\r\n <!-- Backdrop to close dropdown on outside click -->\r\n <div class=\"media-menu-backdrop\" *ngIf=\"showMediaMenu\"\r\n (click)=\"$event.stopPropagation(); showMediaMenu = false\"></div>\r\n\r\n <!-- Add Media button + dropdown -->\r\n <div class=\"media-add-container\" (click)=\"showMediaMenu = !showMediaMenu\">\r\n <lib-button id=\"btn-add-media-{{ config.name }}\" [variant]=\"'warning'\"\r\n [icon]=\"{type: 'material', value: 'add_photo_alternate'}\">\r\n {{ controller.labels['LBL_ADD_MEDIA'] || 'Add media' }}\r\n <mat-icon class=\"menu-chevron\">add</mat-icon>\r\n </lib-button>\r\n\r\n <div class=\"media-dropdown\" *ngIf=\"showMediaMenu\" role=\"menu\" (click)=\"$event.stopPropagation()\">\r\n <!-- Video -->\r\n <button id=\"btn-media-video-{{ config.name }}\" type=\"button\" class=\"media-dropdown-item\"\r\n (click)=\"onMediaMenuVideo(); showMediaMenu = false\" role=\"menuitem\">\r\n <span class=\"media-drop-icon media-drop-icon--video\"><mat-icon>videocam</mat-icon></span>\r\n <span class=\"media-drop-text\">\r\n <span class=\"media-drop-label\">{{ controller.labels['LBL_MEDIA_VIDEO'] || 'Video' }}</span>\r\n <span class=\"media-drop-desc\">{{ controller.labels['LBL_MEDIA_VIDEO_DESC'] || 'Add YouTube URL'\r\n }}</span>\r\n </span>\r\n </button>\r\n <!-- Device -->\r\n <button id=\"btn-media-device-{{ config.name }}\" type=\"button\" class=\"media-dropdown-item\"\r\n (click)=\"onMediaMenuDevice(); showMediaMenu = false\" role=\"menuitem\">\r\n <span class=\"media-drop-icon media-drop-icon--device\"><mat-icon>upload</mat-icon></span>\r\n <span class=\"media-drop-text\">\r\n <span class=\"media-drop-label\">{{ controller.labels['LBL_MEDIA_DEVICE'] || 'Upload from device'\r\n }}</span>\r\n <span class=\"media-drop-desc\">{{ controller.labels['LBL_MEDIA_DEVICE_DESC'] || 'Select images from your\r\n computer' }}</span>\r\n </span>\r\n </button>\r\n <!-- Library -->\r\n <button id=\"btn-media-library-{{ config.name }}\" type=\"button\" class=\"media-dropdown-item\"\r\n (click)=\"onMediaMenuLibrary(); showMediaMenu = false\" role=\"menuitem\">\r\n <span class=\"media-drop-icon media-drop-icon--library\"><mat-icon>photo_library</mat-icon></span>\r\n <span class=\"media-drop-text\">\r\n <span class=\"media-drop-label\">{{ controller.labels['LBL_MEDIA_LIBRARY'] || 'Upload from library'\r\n }}</span>\r\n <span class=\"media-drop-desc\">{{ controller.labels['LBL_MEDIA_LIBRARY_DESC'] || 'Choose from default\r\n images' }}</span>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- YouTube URL Input (inline below button) -->\r\n <div class=\"youtube-input-panel\" *ngIf=\"showYoutubeInput\">\r\n <label class=\"youtube-panel-label\">\r\n {{ controller.labels['LBL_YOUTUBE_URL'] || 'Video URL' }}\r\n </label>\r\n <div class=\"youtube-input-row\">\r\n <input id=\"input-youtube-url-{{ config.name }}\" type=\"url\" class=\"field-input youtube-url-input\"\r\n [(ngModel)]=\"youtubeUrlInput\" [ngModelOptions]=\"{standalone: true}\"\r\n [placeholder]=\"controller.labels['PH_YOUTUBE_URL'] || 'Video URL'\" (keyup.enter)=\"addYoutubeMedia()\">\r\n <lib-button id=\"btn-add-youtube-{{ config.name }}\" [variant]=\"'secondary'\" (click)=\"addYoutubeMedia()\">\r\n {{ controller.labels['LBL_ADD'] || 'Add' }}\r\n </lib-button>\r\n </div>\r\n <span class=\"field-error\" *ngIf=\"youtubeUrlError\">{{ youtubeUrlError }}</span>\r\n </div>\r\n\r\n <div class=\"media-upload-status\" *ngIf=\"mediaUploadError\">\r\n <mat-icon class=\"status-icon\">error_outline</mat-icon>\r\n <span>{{ mediaUploadError }}</span>\r\n </div>\r\n\r\n <span class=\"field-error\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n <span class=\"field-hint\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n </div>\r\n <!-- end left panel -->\r\n\r\n <!-- ── RIGHT PANEL (carousel) ──────────────────────────────────── -->\r\n <div class=\"mu-right\">\r\n\r\n <!-- Carousel (when items exist) -->\r\n <div class=\"media-carousel-section\" *ngIf=\"mediaItems.length\">\r\n <div class=\"media-carousel-main\">\r\n <button id=\"btn-carousel-prev-{{ config.name }}\" type=\"button\" class=\"carousel-nav carousel-nav--prev\"\r\n (click)=\"mediaCarouselPrev()\" [disabled]=\"mediaCarouselIndex === 0\" aria-label=\"Previous\">\r\n <mat-icon>chevron_left</mat-icon>\r\n </button>\r\n\r\n <div class=\"carousel-viewer\" *ngFor=\"let item of mediaItems; let i = index\"\r\n [hidden]=\"i !== mediaCarouselIndex\">\r\n <div *ngIf=\"item.isUploading\" class=\"carousel-uploading\">\r\n <div class=\"carousel-spinner\"></div>\r\n <span>{{ controller.labels['LBL_UPLOADING'] || 'Uploading…' }}</span>\r\n </div>\r\n <ng-container *ngIf=\"!item.isUploading && item.mediaType === 'youtube'\">\r\n <iframe class=\"carousel-iframe\" [src]=\"item.url | trustedUrl\" frameborder=\"0\" allowfullscreen\r\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\">\r\n </iframe>\r\n </ng-container>\r\n <ng-container *ngIf=\"!item.isUploading && item.mediaType === 'image'\">\r\n <img class=\"carousel-image\" [src]=\"item.url\" alt=\"Media\">\r\n </ng-container>\r\n <button id=\"btn-remove-media-{{ config.name }}-{{ i }}\" type=\"button\" class=\"carousel-remove-btn\"\r\n [disabled]=\"item.isUploading\" (click)=\"removeMediaItem(i)\" aria-label=\"Remove\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <button id=\"btn-carousel-next-{{ config.name }}\" type=\"button\" class=\"carousel-nav carousel-nav--next\"\r\n (click)=\"mediaCarouselNext()\" [disabled]=\"mediaCarouselIndex === mediaItems.length - 1\" aria-label=\"Next\">\r\n <mat-icon>chevron_right</mat-icon>\r\n </button>\r\n\r\n <div class=\"carousel-dots\">\r\n <span *ngFor=\"let item of mediaItems; let i = index\" class=\"carousel-dot\"\r\n [class.active]=\"i === mediaCarouselIndex\" (click)=\"mediaGoTo(i)\"></span>\r\n </div>\r\n </div>\r\n\r\n <!-- Thumbnail strip -->\r\n <div class=\"media-thumbnail-strip\">\r\n <div *ngFor=\"let item of mediaThumbnails; let i = index\" class=\"media-thumb\"\r\n [class.active]=\"i === mediaCarouselIndex\" (click)=\"mediaGoTo(i)\">\r\n <div *ngIf=\"item.isUploading\" class=\"thumb-uploading\">\r\n <div class=\"thumb-spinner\"></div>\r\n </div>\r\n <img *ngIf=\"!item.isUploading && item.mediaType === 'youtube' && item.thumbnailUrl\"\r\n [src]=\"item.thumbnailUrl\" class=\"thumb-img\" alt=\"Video thumbnail\">\r\n <div *ngIf=\"!item.isUploading && item.mediaType === 'youtube' && !item.thumbnailUrl\"\r\n class=\"thumb-yt-placeholder\">\r\n <mat-icon>play_circle</mat-icon>\r\n </div>\r\n <img *ngIf=\"!item.isUploading && item.mediaType === 'image' && item.url\" [src]=\"item.url\"\r\n class=\"thumb-img\" alt=\"Image thumbnail\">\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Empty right-side placeholder -->\r\n <div class=\"mu-right-empty\" *ngIf=\"!mediaItems.length\" (click)=\"onMediaMenuDevice()\">\r\n <mat-icon class=\"mu-right-empty-icon\">perm_media</mat-icon>\r\n <p>{{ controller.labels['LBL_ADD_MEDIA'] || 'Add media' }}</p>\r\n </div>\r\n\r\n </div>\r\n <!-- end right panel -->\r\n\r\n </div><!-- end mu-layout -->\r\n </div>\r\n\r\n\r\n <!-- ══ Library Image Picker Modal ════════════════════════════════════════ -->\r\n <div class=\"media-library-overlay\" *ngIf=\"showLibraryModal\" (click)=\"closeLibraryModal()\"></div>\r\n <div class=\"media-library-modal\" *ngIf=\"showLibraryModal\" role=\"dialog\" aria-modal=\"true\">\r\n <div class=\"library-modal-header\">\r\n <div class=\"header-left\">\r\n <h3 class=\"library-modal-title\">\r\n {{ controller.labels['LBL_ADD_IMAGES'] || 'Add Images' }}\r\n </h3>\r\n <p class=\"library-modal-subtitle\">\r\n {{ controller.labels['LBL_LIBRARY_MODAL_DESC'] || 'Upload media to make your opportunity stand out. Plus, take full control of your sequence - drag images to reorder as you desire.' }}\r\n </p>\r\n </div>\r\n <button id=\"btn-close-library-{{ config.name }}\" type=\"button\" class=\"library-close-btn\"\r\n (click)=\"closeLibraryModal()\" aria-label=\"Close\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Loading -->\r\n <div class=\"library-loading\" *ngIf=\"libraryLoading\">\r\n <div class=\"lib-spinner\"></div>\r\n <span>{{ controller.labels['LBL_LOADING'] || 'Loading…' }}</span>\r\n </div>\r\n\r\n <!-- Error -->\r\n <div class=\"library-error\" *ngIf=\"libraryError && !libraryLoading\">\r\n <mat-icon>error_outline</mat-icon>\r\n {{ libraryError }}\r\n </div>\r\n\r\n <!-- Image grid -->\r\n <div class=\"library-grid\" *ngIf=\"!libraryLoading && libraryImages.length\">\r\n <div *ngFor=\"let img of libraryImages; let li = index\" id=\"lib-img-{{ config.name }}-{{ li }}\"\r\n class=\"library-grid-item\" [class.selected]=\"isLibraryItemSelected(img)\" (click)=\"toggleLibraryItem(img)\">\r\n <img [src]=\"getLibraryItemUrl(img)\" class=\"library-grid-img\" alt=\"Library image\">\r\n <div class=\"library-check\" *ngIf=\"isLibraryItemSelected(img)\">\r\n <mat-icon>check_circle</mat-icon>\r\n </div>\r\n <div class=\"library-overlay-hover\"></div>\r\n </div>\r\n </div>\r\n\r\n <!-- Empty library -->\r\n <div class=\"library-empty\" *ngIf=\"!libraryLoading && !libraryError && libraryImages.length === 0\">\r\n <mat-icon>image_not_supported</mat-icon>\r\n <span>{{ controller.labels['LBL_LIBRARY_EMPTY'] || 'No images found in library.' }}</span>\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div class=\"library-modal-footer\">\r\n <div class=\"library-footer-actions\">\r\n <lib-button id=\"btn-library-cancel-{{ config.name }}\" [variant]=\"'outline'\" (click)=\"closeLibraryModal()\">\r\n {{ controller.labels['LBL_CANCEL'] || 'Cancel' }}\r\n </lib-button>\r\n <lib-button id=\"btn-library-confirm-{{ config.name }}\" [variant]=\"'primary'\"\r\n [disabled]=\"librarySelectedIds.size === 0\" (click)=\"confirmLibrarySelection()\">\r\n {{ controller.labels['LBL_CONTINUE'] || 'Continue' }}\r\n </lib-button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ══ Location Field ═══════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isLocation\" class=\"field-wrapper location-field-wrapper\" [formGroup]=\"formGroup\">\r\n\r\n <!-- Field label -->\r\n <label *ngIf=\"config.label\" class=\"field-label\">\r\n {{ config.label }}\r\n <span class=\"required\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n <p class=\"location-subtitle\" *ngIf=\"config.hint\">{{ config.hint }}</p>\r\n\r\n <!-- Three-tab bar -->\r\n <div class=\"location-tabs\">\r\n <lib-button class=\"loc-tab-btn\" [variant]=\"locationActiveTab === 'VENUE' ? 'warning' : 'outline'\"\r\n (click)=\"onLocationTabChange('VENUE')\">\r\n {{ controller.labels['LBL_LOC_VENUE'] || 'Venue' }}\r\n </lib-button>\r\n <lib-button class=\"loc-tab-btn\" [variant]=\"locationActiveTab === 'ONLINE' ? 'warning' : 'outline'\"\r\n (click)=\"onLocationTabChange('ONLINE')\">\r\n {{ controller.labels['LBL_LOC_ONLINE'] || 'Online Event' }}\r\n </lib-button>\r\n <lib-button class=\"loc-tab-btn\" [variant]=\"locationActiveTab === 'TBA' ? 'warning' : 'outline'\"\r\n (click)=\"onLocationTabChange('TBA')\">\r\n {{ controller.labels['LBL_LOC_TBA'] || 'To be Announced' }}\r\n </lib-button>\r\n </div>\r\n\r\n <!-- VENUE TAB -->\r\n <div *ngIf=\"locationActiveTab === 'VENUE'\" class=\"loc-panel loc-venue-panel\">\r\n\r\n <p class=\"loc-section-label\">\r\n {{ controller.labels['LBL_LOC_ADDRESS'] || 'Location address' }}\r\n </p>\r\n\r\n <!-- Added venue rows -->\r\n <div class=\"loc-venue-list\" *ngIf=\"locationVenues.length > 0\">\r\n <div *ngFor=\"let venue of locationVenues; let i = index\" class=\"loc-venue-item\">\r\n <mat-icon class=\"loc-venue-search-icon\">search</mat-icon>\r\n <span class=\"loc-venue-text\">{{ venue.address || venue.name || venue.description }}</span>\r\n <button type=\"button\" class=\"loc-action-btn loc-delete-btn\" (click)=\"removeLocationVenue(i)\">\r\n <mat-icon>delete_outline</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Location count badge -->\r\n <p class=\"loc-count-text\" *ngIf=\"locationVenues.length > 0 && config.locationConfig?.allowMulti\">\r\n {{ locationVenues.length }} {{ controller.labels['LBL_LOC_COUNT_SUFFIX'] || 'Locations Added!' }}\r\n </p>\r\n\r\n <!-- Search input (hide when max reached) -->\r\n <div class=\"loc-search-container\" *ngIf=\"!locationMaxReached\">\r\n <div class=\"loc-search-wrapper\">\r\n <mat-icon class=\"loc-search-icon\">search</mat-icon>\r\n <input class=\"field-input loc-search-input\"\r\n [placeholder]=\"config.locationConfig?.venuePlaceholder || (controller.labels['PH_LOC_VENUE'] || 'Type to search venue...')\"\r\n [value]=\"locationSearchText\" (input)=\"handleLocationSearchInput($event)\" (blur)=\"hideLocationSuggestions()\"\r\n autocomplete=\"off\" [class.is-invalid]=\"errorMessage\">\r\n </div>\r\n <!-- Suggestions dropdown -->\r\n <div class=\"loc-suggestions-panel\" *ngIf=\"locationShowSuggestions && locationSuggestions.length\">\r\n <div *ngFor=\"let sug of locationSuggestions\" class=\"loc-suggestion-item\"\r\n (mousedown)=\"onLocationSuggestionSelect(sug)\">\r\n <mat-icon class=\"loc-suggestion-icon\">place</mat-icon>\r\n <span class=\"loc-suggestion-text\">{{ sug.description }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Add another button -->\r\n <button type=\"button\" class=\"loc-add-btn\"\r\n *ngIf=\"locationVenues.length > 0 && !locationMaxReached && config.locationConfig?.allowMulti\">\r\n <mat-icon>add_circle_outline</mat-icon>\r\n <span>{{ controller.labels['LBL_LOC_ADD_ANOTHER'] || 'Add another Location' }}</span>\r\n </button>\r\n\r\n <!-- Map -->\r\n <div class=\"loc-map-container\" *ngIf=\"config.locationConfig?.showMap !== false\">\r\n <ng-container *ngIf=\"config.locationConfig?.googleMapsApiKey; else simpleEmbed\">\r\n <div [id]=\"'loc-map-' + config.name\" class=\"loc-map-frame\"\r\n [style.height]=\"config.locationConfig?.mapHeight || '300px'\"></div>\r\n </ng-container>\r\n <ng-template #simpleEmbed>\r\n <iframe class=\"loc-map-frame\" [style.height]=\"config.locationConfig?.mapHeight || '300px'\"\r\n [src]=\"getLocationMapEmbedUrl() | trustedUrl\" frameborder=\"0\" allowfullscreen loading=\"lazy\">\r\n </iframe>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Map hint -->\r\n <p class=\"loc-map-hint\">\r\n {{ controller.labels['LBL_LOC_MAP_HINT'] || 'Type the venue address. A map will appear to assist you.' }}\r\n </p>\r\n </div>\r\n\r\n <!-- ONLINE TAB -->\r\n <div *ngIf=\"locationActiveTab === 'ONLINE'\" class=\"loc-panel loc-online-panel\">\r\n <p class=\"loc-section-label\">\r\n {{ controller.labels['LBL_LOC_ONLINE_URL'] || 'Event URL' }}\r\n </p>\r\n <div class=\"loc-search-wrapper\">\r\n <mat-icon class=\"loc-search-icon\">link</mat-icon>\r\n <input class=\"field-input loc-search-input\" type=\"url\"\r\n [placeholder]=\"config.locationConfig?.onlinePlaceholder || (controller.labels['PH_LOC_ONLINE'] || 'https://zoom.us/j/...')\"\r\n [value]=\"locationOnlineUrl\" (input)=\"onLocationUrlChange($any($event.target).value)\"\r\n [class.is-invalid]=\"errorMessage\">\r\n </div>\r\n </div>\r\n\r\n <!-- TBA TAB -->\r\n <div *ngIf=\"locationActiveTab === 'TBA'\" class=\"loc-panel loc-tba-panel\">\r\n <div class=\"loc-tba-content\">\r\n <mat-icon class=\"loc-tba-icon\">schedule</mat-icon>\r\n <p class=\"loc-tba-text\">\r\n {{ controller.labels['LBL_LOC_TBA_DESC'] || \"This event's location is yet to be announced. Check back later\r\n for updates.\" }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <!-- Hidden real form control -->\r\n <input type=\"hidden\" [formControlName]=\"config.name!\">\r\n\r\n <span class=\"field-error\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n\r\n</div>","import { Component, Input, OnInit, OnDestroy } from '@angular/core';\r\nimport { FormArray, FormBuilder, FormGroup } from '@angular/forms';\r\nimport { SectionConfig, FieldConfig } from '../../models/form-schema.model';\r\nimport { SmartFormController } from '../../services/smart-form-controller.service';\r\n\r\n@Component({\r\n selector: 'lib-form-section',\r\n templateUrl: './form-section.component.html',\r\n styleUrls: ['./form-section.component.scss'],\r\n standalone: false\r\n})\r\nexport class FormSectionComponent implements OnInit, OnDestroy {\r\n @Input() config!: SectionConfig;\r\n @Input() controller!: SmartFormController;\r\n @Input() formGroup!: FormGroup;\r\n\r\n /**\r\n * For allowMulti sections: the FormArray registered on the root formGroup.\r\n * Each element is a FormGroup representing one repeater instance.\r\n */\r\n repeaterFormArray!: FormArray;\r\n\r\n /**\r\n * The key under which the FormArray is registered in the root formGroup.\r\n * Falls back to config.name or a generated key.\r\n */\r\n get arrayKey(): string {\r\n return this.config.name || '__repeater__';\r\n }\r\n\r\n constructor(private fb: FormBuilder) { }\r\n\r\n ngOnInit(): void {\r\n if (this.config.allowMulti) {\r\n this.repeaterFormArray = this.fb.array([]);\r\n this.formGroup.addControl(this.arrayKey, this.repeaterFormArray);\r\n // Start with one empty instance\r\n this.addInstance();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.config.allowMulti && this.formGroup.contains(this.arrayKey)) {\r\n this.formGroup.removeControl(this.arrayKey);\r\n }\r\n }\r\n\r\n // ── Repeater helpers ──────────────────────────────────────────────────────\r\n\r\n /** Creates a fresh FormGroup for one repeater instance */\r\n private createInstanceGroup(): FormGroup {\r\n return this.fb.group({});\r\n }\r\n\r\n addInstance(): void {\r\n this.repeaterFormArray.push(this.createInstanceGroup());\r\n }\r\n\r\n removeInstance(index: number): void {\r\n if (this.repeaterFormArray.length > 1) {\r\n this.repeaterFormArray.removeAt(index);\r\n }\r\n }\r\n\r\n getInstanceGroup(index: number): FormGroup {\r\n return this.repeaterFormArray.at(index) as FormGroup;\r\n }\r\n\r\n get instanceGroups(): FormGroup[] {\r\n return this.repeaterFormArray.controls as FormGroup[];\r\n }\r\n\r\n // ── Non-repeater: flat single FormGroup (root formGroup passed through) ──\r\n\r\n /** For non-allowMulti sections we simply pass the root formGroup down */\r\n get flatFormGroup(): FormGroup {\r\n return this.formGroup;\r\n }\r\n\r\n // ── Collect nested fields for a given child ───────────────────────────────\r\n /** Flatten a field tree to get all leaf fields (for ROW children etc.) */\r\n getFlatFields(fields: FieldConfig[]): FieldConfig[] {\r\n const result: FieldConfig[] = [];\r\n fields.forEach(f => {\r\n if (f.type === 'ROW' && f.children) {\r\n result.push(...this.getFlatFields(f.children));\r\n } else {\r\n result.push(f);\r\n }\r\n });\r\n return result;\r\n }\r\n}\r\n","<div class=\"form-section-container\">\r\n <h3 class=\"section-label\" *ngIf=\"config.label && !config.allowMulti\">{{ config.label }}</h3>\r\n\r\n <!-- ══ Repeater (allowMulti) ══════════════════════════════════════════════ -->\r\n <ng-container *ngIf=\"config.allowMulti\">\r\n <h3 class=\"section-label\">{{ config.label }}</h3>\r\n\r\n <div *ngFor=\"let instanceGroup of instanceGroups; let i = index\" class=\"section-instance\">\r\n <!-- Instance header (remove button) -->\r\n <div class=\"section-header\" *ngIf=\"instanceGroups.length > 1\">\r\n <span class=\"section-number\">{{ config.label }} #{{ i + 1 }}</span>\r\n <lib-button [variant]=\"'danger-outline'\" (click)=\"removeInstance(i)\">\r\n <mat-icon>delete_outline</mat-icon> Remove\r\n </lib-button>\r\n </div>\r\n\r\n <!-- Fields – each child rendered with the *instance* FormGroup -->\r\n <div class=\"section-fields sf-grid\">\r\n <ng-container *ngFor=\"let field of config.children\">\r\n <div class=\"sf-col\" [style.gridColumn]=\"'span ' + (field.colSpan || 12)\" *ngIf=\"field.isEnabled !== false\">\r\n <lib-form-field [config]=\"field\" [controller]=\"controller\" [formGroup]=\"instanceGroup\">\r\n </lib-form-field>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <lib-button [variant]=\"'primary'\" (click)=\"addInstance()\">\r\n <mat-icon>add</mat-icon> Add {{ config.label }}\r\n </lib-button>\r\n </ng-container>\r\n\r\n <!-- ══ Non-repeater (single instance) ════════════════════════════════════ -->\r\n <ng-container *ngIf=\"!config.allowMulti\">\r\n <div class=\"section-fields sf-grid\">\r\n <ng-container *ngFor=\"let field of config.children\">\r\n <div class=\"sf-col\" [style.gridColumn]=\"'span ' + (field.colSpan || 12)\" *ngIf=\"field.isEnabled !== false\">\r\n <lib-form-field [config]=\"field\" [controller]=\"controller\" [formGroup]=\"flatFormGroup\">\r\n </lib-form-field>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n</div>","import { Component, EventEmitter, Input, OnDestroy, OnInit, OnChanges, SimpleChanges, Output } from '@angular/core';\r\nimport { FormArray, FormBuilder, FormGroup } from '@angular/forms';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Router } from '@angular/router';\r\nimport { ActionBarConfig, ActionButtonConfig, ActionConfig, FieldConfig, FormSchema } from '../../models/form-schema.model';\r\nimport { SmartFormController } from '../../services/smart-form-controller.service';\r\nimport { ExpressionService } from '../../services/expression.service';\r\nimport { SmartFormTranslationUtils } from '../../utils/translation.utils';\r\nimport { SnackbarService } from '../../../snackbar/services/snackbar.service';\r\n\r\n@Component({\r\n selector: 'lib-smart-form',\r\n templateUrl: './smart-form.component.html',\r\n styleUrls: ['./smart-form.component.scss'],\r\n providers: [SmartFormController],\r\n standalone: false\r\n})\r\nexport class SmartFormComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() formJson!: string;\r\n @Input() initialValues?: { [key: string]: any };\r\n @Input() enableDraftAutoSave: boolean = false;\r\n /** Flat i18n labels map passed by the consuming app.\r\n * After JSON parse the schema is walked and every string value that\r\n * matches a key in this map is replaced with the translated value.\r\n * Mirrors the pattern used by ConfigurableFormComponent + translateConfig.\r\n */\r\n @Input() labels: any = {};\r\n @Input() mode: 'CREATE' | 'EDIT' = 'CREATE';\r\n\r\n @Output() submit = new EventEmitter<{ [key: string]: any }>();\r\n @Output() draftSave = new EventEmitter<string>();\r\n /**\r\n * Emitted when a button with a custom `type` (not 'cancel', 'draft', or\r\n * 'submit') is clicked. Payload contains the button `id` and the current\r\n * form data snapshot.\r\n */\r\n @Output() actionClick = new EventEmitter<{ id: string; formData: { [key: string]: any } }>();\r\n\r\n formSchema!: FormSchema;\r\n formGroup!: FormGroup;\r\n fieldList: FieldConfig[] = [];\r\n isStepper: boolean = false;\r\n currentStep: number = 0;\r\n isLoading: boolean = false;\r\n isDraftLoading: boolean = false;\r\n\r\n constructor(\r\n private fb: FormBuilder,\r\n public controller: SmartFormController,\r\n private expressionService: ExpressionService,\r\n private http: HttpClient,\r\n private snackbarService: SnackbarService,\r\n private router: Router\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.parseFormJson();\r\n // Load databe in EDIT mode, or use fallback initialValues\r\n if (this.mode === 'EDIT' && this.formSchema?.editConfig?.loadApiUrl) {\r\n this.loadEditData();\r\n } else if (this.initialValues) {\r\n this.controller.initialize(this.initialValues);\r\n }\r\n }\r\n\r\n loadEditData(): void {\r\n const config = this.formSchema.editConfig!;\r\n this.isLoading = true;\r\n const headers = this.getHeaders();\r\n this.http.get(config.loadApiUrl, { headers }).subscribe({\r\n next: (response: any) => {\r\n // Assume API returns flat or easily mappable object matching form controls\r\n this.initialValues = response;\r\n this.controller.initialize(this.initialValues || {});\r\n this.isLoading = false;\r\n },\r\n error: (err) => {\r\n this.showAlert('error', config.errorMessage || 'Failed to load form data', config.snackbarConfig);\r\n console.error('Load data error:', err);\r\n this.isLoading = false;\r\n }\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['formJson'] && !changes['formJson'].isFirstChange()) {\r\n this.parseFormJson();\r\n }\r\n // Re-translate if labels arrive after the JSON was already parsed\r\n if (changes['labels'] && !changes['labels'].isFirstChange() && this.formSchema) {\r\n this.parseFormJson();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.controller.destroy();\r\n }\r\n\r\n parseFormJson(): void {\r\n if (!this.formJson) { return; } // guard: labels may arrive before formJson\r\n try {\r\n const jsonData = JSON.parse(this.formJson);\r\n this.formSchema = jsonData as FormSchema;\r\n // Push token from configJSON into the shared controller so all child\r\n // components (form-field, etc.) can read it without @Input prop-drilling.\r\n this.controller.token = this.formSchema.token;\r\n this.controller.tokenHeader = this.formSchema.tokenHeader;\r\n // Translate i18n keys before rendering\r\n if (this.labels && Object.keys(this.labels).length) {\r\n SmartFormTranslationUtils.translateSchema(this.formSchema, this.labels);\r\n }\r\n // Share translated labels with child components via controller\r\n this.controller.labels = this.labels;\r\n this.controller.actionLabels = this.formSchema.labels;\r\n this.isStepper = this.formSchema.formType === 'STEPPER';\r\n this.fieldList = this.isStepper\r\n ? (this.formSchema.stepperConfig?.children || []).filter(step => step.isEnabled !== false && step.sectionConfig?.isEnabled !== false)\r\n : (this.formSchema.sectionConfig?.children || []).filter(field => field.isEnabled !== false);\r\n this.initializeForm();\r\n } catch (e) {\r\n console.error('Error parsing form JSON:', e);\r\n }\r\n }\r\n\r\n\r\n initializeForm(): void {\r\n this.formGroup = this.fb.group({});\r\n this.collectFields(this.fieldList);\r\n }\r\n\r\n collectFields(fields: FieldConfig[]): void {\r\n fields.forEach(field => {\r\n if (field.isEnabled === false || field.sectionConfig?.isEnabled === false) return;\r\n\r\n // Flat leaf fields: seed controller with default values\r\n if (field.name && field.type !== 'GROUP' && field.type !== 'ROW') {\r\n // Check if initialValues already has a value for this field\r\n const existingValue = this.initialValues?.[field.name];\r\n const value = existingValue !== undefined\r\n ? existingValue\r\n : (field.defaultValue !== undefined ? field.defaultValue : null);\r\n this.controller.updateField(field.name, value);\r\n }\r\n // Recurse into ROW children\r\n if (field.type === 'ROW' && field.children?.length) {\r\n this.collectFields(field.children);\r\n }\r\n // Recurse into GROUP children\r\n if (field.type === 'GROUP' && field.sectionConfig?.children?.length) {\r\n this.collectFields(field.sectionConfig.children);\r\n }\r\n });\r\n }\r\n\r\n // ───────────────────────────────────────────────────────────────────────────\r\n // Submit\r\n // ───────────────────────────────────────────────────────────────────────────\r\n\r\n handleSubmit(): void {\r\n if (this.isStepper && this.currentStep < this.fieldList.length - 1) {\r\n if (this.validate()) this.nextStep();\r\n return;\r\n }\r\n if (!this.validate()) return;\r\n\r\n this.submitToApi(this.collectFormData(), 'submit');\r\n }\r\n\r\n // ───────────────────────────────────────────────────────────────────────────\r\n // Cancel\r\n // ───────────────────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Universal action handler for any button click.\r\n * One handler decides how to process based on action.kind.\r\n */\r\n handleButtonClick(btn: ActionButtonConfig): void {\r\n const action = btn.action;\r\n if (!action) return;\r\n\r\n switch (action.kind) {\r\n case 'submit':\r\n this.handleSubmit();\r\n break;\r\n case 'draft':\r\n this.submitToApi(this.collectFormData(), 'draft', btn);\r\n break;\r\n case 'navigate':\r\n this.navigateTo(action.redirectUrl);\r\n break;\r\n case 'api':\r\n this.fireActionApiCall(action);\r\n break;\r\n case 'emit':\r\n this.actionClick.emit({ id: btn.id, formData: this.collectFormData() });\r\n break;\r\n case 'next':\r\n if (this.validate()) this.nextStep();\r\n break;\r\n case 'prev':\r\n this.previousStep();\r\n break;\r\n }\r\n }\r\n\r\n // ── Action-Redirects & API ──────────────────────────────────────────────────\r\n\r\n private fireActionApiCall(action: ActionConfig): void {\r\n if (!action.apiUrl) return;\r\n const headers = this.getHeaders();\r\n const method = action.method || 'POST';\r\n const body = action.extraPayload || {};\r\n\r\n this.isLoading = true;\r\n this.http.request(method, action.apiUrl, { body, headers }).subscribe({\r\n next: (response) => {\r\n this.isLoading = false;\r\n const msg = action.successMessage || 'Action successful';\r\n this.showAlert('success', msg, action.snackbarConfig);\r\n if (action.redirectUrl) this.navigateTo(action.redirectUrl);\r\n },\r\n error: (err) => {\r\n this.isLoading = false;\r\n const msg = action.errorMessage || 'Action failed';\r\n this.showAlert('error', msg, action.snackbarConfig);\r\n console.error('API Action error:', err);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Constructs nested payload by checking field properties on form controls.\r\n */\r\n collectFormData(): { [key: string]: any } {\r\n const rawValue = this.extractGroupValue(this.formGroup);\r\n let payload = this.buildNestedPayload(rawValue, this.fieldList);\r\n\r\n // Merge extra fields based on the mode\r\n const config = this.mode === 'EDIT' ? this.formSchema.editConfig : this.formSchema.submitConfig;\r\n if (config?.extraPayload) {\r\n payload = this.deepMerge(payload, config.extraPayload);\r\n }\r\n\r\n return payload;\r\n }\r\n\r\n /**\r\n * Deep merges the source object (e.g. extraPayload) into the target object (e.g. form payload).\r\n */\r\n private deepMerge(target: any, source: any): any {\r\n if (typeof target !== 'object' || target === null) {\r\n return source;\r\n }\r\n if (typeof source !== 'object' || source === null) {\r\n return source;\r\n }\r\n\r\n if (Array.isArray(target) && Array.isArray(source)) {\r\n // For arrays, we merge objects at the same index\r\n const maxLength = Math.max(target.length, source.length);\r\n const mergedArray = [];\r\n for (let i = 0; i < maxLength; i++) {\r\n if (i < target.length && i < source.length) {\r\n mergedArray.push(this.deepMerge(target[i], source[i]));\r\n } else if (i < source.length) {\r\n mergedArray.push(source[i]);\r\n } else {\r\n mergedArray.push(target[i]);\r\n }\r\n }\r\n return mergedArray;\r\n }\r\n\r\n const merged = { ...target };\r\n Object.keys(source).forEach(key => {\r\n if (source[key] instanceof Object && key in target) {\r\n merged[key] = this.deepMerge(target[key], source[key]);\r\n } else {\r\n merged[key] = source[key];\r\n }\r\n });\r\n return merged;\r\n }\r\n\r\n private buildNestedPayload(rawValue: any, fields: FieldConfig[]): { [key: string]: any } {\r\n if (rawValue === null || typeof rawValue !== 'object') return rawValue;\r\n\r\n const payload: { [key: string]: any } = {};\r\n const processedKeys = new Set<string>();\r\n\r\n const processFields = (fieldList: FieldConfig[]) => {\r\n fieldList.forEach(field => {\r\n if (field.isEnabled === false || field.sectionConfig?.isEnabled === false) return;\r\n\r\n if (field.type === 'ROW' && field.children) {\r\n processFields(field.children);\r\n } else if (field.type === 'GROUP' && field.sectionConfig?.children) {\r\n // FormFieldComponent generates unnamed groups using their label inside the root FormGroup.\r\n const generatedKey = field.sectionConfig.label\r\n ? field.sectionConfig.label.replace(/(?:^\\w|[A-Z]|\\b\\w)/g, (w, i) => i === 0 ? w.toLowerCase() : w.toUpperCase()).replace(/\\s+/g, '')\r\n : '';\r\n const groupKey = field.sectionConfig.name || field.name || generatedKey || '__group__';\r\n \r\n processedKeys.add(groupKey);\r\n\r\n const groupRawValue = rawValue[groupKey];\r\n if (groupRawValue !== undefined) {\r\n // Identify if it's purely a visual section vs an explicit structural data block\r\n const isStructural = field.sectionConfig.name || field.name || field.sectionConfig.allowMulti;\r\n\r\n if (!isStructural) {\r\n // Visual section: Flatten its contents directly onto the target payload layer\r\n Object.assign(payload, this.buildNestedPayload(groupRawValue, field.sectionConfig.children));\r\n } else {\r\n // Structural block: process nested mappings / array instances\r\n const nestedData = (field.sectionConfig.allowMulti && Array.isArray(groupRawValue))\r\n ? groupRawValue.map(item => this.buildNestedPayload(item, field.sectionConfig!.children!))\r\n : this.buildNestedPayload(groupRawValue, field.sectionConfig.children);\r\n\r\n if (field.payloadPath) {\r\n this.setNestedValue(payload, field.payloadPath, nestedData);\r\n } else {\r\n payload[groupKey] = nestedData;\r\n }\r\n }\r\n }\r\n } else if (field.name) {\r\n processedKeys.add(field.name);\r\n if (rawValue[field.name] !== undefined) {\r\n const val = rawValue[field.name];\r\n if (field.payloadPath) {\r\n this.setNestedValue(payload, field.payloadPath, val);\r\n } else {\r\n payload[field.name] = val;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n processFields(fields);\r\n\r\n // Preserve any hidden tracking keys (e.g. id, uuid, isEdit) that were present in the initial data\r\n Object.keys(rawValue).forEach(key => {\r\n if (!processedKeys.has(key)) {\r\n payload[key] = rawValue[key];\r\n }\r\n });\r\n\r\n return payload;\r\n }\r\n\r\n private setNestedValue(obj: any, path: string, value: any): void {\r\n // Regex matches the property name and optionally an array index e.g. \"name[0]\" -> regex yields [\"name[0]\", \"name\", \"0\"]\r\n const arrayRegex = /^([a-zA-Z0-9_]+)\\[(\\d+)\\]$/;\r\n\r\n const parts = path.split('.');\r\n let current = obj;\r\n\r\n for (let i = 0; i < parts.length - 1; i++) {\r\n const part = parts[i];\r\n const match = part.match(arrayRegex);\r\n\r\n if (match) {\r\n const prop = match[1];\r\n const index = parseInt(match[2], 10);\r\n if (!current[prop]) current[prop] = [];\r\n if (!current[prop][index]) current[prop][index] = {};\r\n current = current[prop][index];\r\n } else {\r\n if (!current[part]) current[part] = {};\r\n current = current[part];\r\n }\r\n }\r\n\r\n const lastPart = parts[parts.length - 1];\r\n const matchLast = lastPart.match(arrayRegex);\r\n if (matchLast) {\r\n const prop = matchLast[1];\r\n const index = parseInt(matchLast[2], 10);\r\n if (!current[prop]) current[prop] = [];\r\n current[prop][index] = value;\r\n } else {\r\n current[lastPart] = value;\r\n }\r\n }\r\n\r\n private extractGroupValue(group: FormGroup): { [key: string]: any } {\r\n const result: { [key: string]: any } = {};\r\n Object.keys(group.controls).forEach(key => {\r\n const ctrl = group.get(key);\r\n if (ctrl instanceof FormArray) {\r\n // Repeater → array of objects\r\n result[key] = (ctrl.controls as FormGroup[]).map(fg => this.extractGroupValue(fg));\r\n } else if (ctrl instanceof FormGroup) {\r\n // Nested single group → nested object\r\n result[key] = this.extractGroupValue(ctrl);\r\n } else {\r\n result[key] = ctrl?.value ?? null;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n validate(): boolean {\r\n if (this.formGroup.invalid) {\r\n this.formGroup.markAllAsTouched();\r\n this.scrollToFirstInvalidControl();\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n scrollToFirstInvalidControl(): void {\r\n setTimeout(() => {\r\n const firstInvalidControl = document.querySelector('.is-invalid, .ng-invalid.ng-touched');\r\n if (firstInvalidControl) {\r\n firstInvalidControl.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n }, 100);\r\n }\r\n\r\n submitToApi(formData: any, actionType: 'submit' | 'draft' = 'submit', btn?: ActionButtonConfig): void {\r\n const isEdit = this.mode === 'EDIT';\r\n const configLine: any = isEdit ? this.formSchema.editConfig : this.formSchema.submitConfig;\r\n const action = btn?.action;\r\n\r\n // Build the final payload, merging draft extraPayload if applicable\r\n let finalPayload = formData;\r\n if (actionType === 'draft' && action?.extraPayload) {\r\n finalPayload = this.deepMerge(finalPayload, action.extraPayload);\r\n }\r\n\r\n // Fallback for emitted outputs if no API URL is defined centrally\r\n if (!configLine || (!configLine.apiUrl && !configLine.submitApiUrl)) {\r\n if (actionType === 'draft') {\r\n this.draftSave.emit(JSON.stringify(finalPayload));\r\n if (action?.redirectUrl) this.navigateTo(action.redirectUrl);\r\n } else {\r\n this.submit.emit(finalPayload);\r\n }\r\n return;\r\n }\r\n\r\n const apiUrl = isEdit ? configLine.submitApiUrl : configLine.apiUrl;\r\n const method = isEdit ? (configLine.submitMethod || 'PATCH') : (configLine.method || 'POST');\r\n const headers = this.getHeaders();\r\n\r\n // Messages and redirect URLs (Prefer button action overrides if present)\r\n const successMsg = actionType === 'draft'\r\n ? (action?.successMessage || 'Draft saved successfully')\r\n : (action?.successMessage || configLine.successMessage || 'Form submitted successfully');\r\n\r\n const errorMsg = actionType === 'draft'\r\n ? (action?.errorMessage || 'Failed to save draft')\r\n : (action?.errorMessage || configLine.errorMessage || 'Failed to submit form');\r\n\r\n const redirectUrl = actionType === 'draft'\r\n ? (action?.redirectUrl || configLine.redirectUrl)\r\n : (action?.redirectUrl || configLine.redirectUrl);\r\n\r\n if (actionType === 'draft') {\r\n this.isDraftLoading = true;\r\n } else {\r\n this.isLoading = true;\r\n }\r\n\r\n this.http.request(method, apiUrl, { body: finalPayload, headers }).subscribe({\r\n next: (response) => {\r\n this.showAlert('success', successMsg, action?.snackbarConfig || configLine.snackbarConfig);\r\n\r\n if (actionType === 'draft') {\r\n this.draftSave.emit(JSON.stringify(response));\r\n this.isDraftLoading = false;\r\n } else {\r\n this.submit.emit(response);\r\n this.isLoading = false;\r\n }\r\n\r\n if (redirectUrl) {\r\n setTimeout(() => this.navigateTo(redirectUrl), 1500);\r\n }\r\n },\r\n error: (err) => {\r\n this.showAlert('error', errorMsg, action?.snackbarConfig || configLine.snackbarConfig);\r\n console.error(actionType === 'draft' ? 'Draft save error:' : 'Submit error:', err);\r\n this.isLoading = false;\r\n this.isDraftLoading = false;\r\n }\r\n });\r\n }\r\n\r\n showAlert(type: 'success' | 'error' | 'warning' | 'info', message: string, customConfig?: any): void {\r\n this.snackbarService.show({\r\n variant: type,\r\n message: message,\r\n showCloseButton: true,\r\n ...customConfig\r\n });\r\n }\r\n\r\n /** Builds HttpHeaders from the token stored in the controller (sourced from configJSON). */\r\n getHeaders(): HttpHeaders {\r\n let headers = new HttpHeaders();\r\n if (this.controller.token) {\r\n const headerName = this.controller.tokenHeader || 'Authorization';\r\n headers = headers.set(headerName, this.controller.token);\r\n }\r\n return headers;\r\n }\r\n\r\n // ───────────────────────────────────────────────────────────────────────────\r\n // Stepper\r\n // ───────────────────────────────────────────────────────────────────────────\r\n\r\n nextStep(): void {\r\n if (this.currentStep < this.fieldList.length - 1) this.currentStep++;\r\n }\r\n\r\n previousStep(): void {\r\n if (this.currentStep > 0) this.currentStep--;\r\n }\r\n\r\n get canGoNext(): boolean { return this.currentStep < this.fieldList.length - 1; }\r\n get canGoPrevious(): boolean { return this.currentStep > 0; }\r\n get currentStepConfig(): FieldConfig | undefined {\r\n return this.isStepper ? this.fieldList[this.currentStep] : undefined;\r\n }\r\n\r\n // ── Action Labels ──────────────────────────────────────────────────────────\r\n\r\n get nextLabel(): string {\r\n const key = this.formSchema?.labels?.nextLabel || 'Next';\r\n return this.labels[key] || key;\r\n }\r\n\r\n get submitLabel(): string {\r\n const btn = this.getButtonByActionKind('submit');\r\n if (btn?.label) return this.labels[btn.label] || btn.label;\r\n const key = this.formSchema?.labels?.submitLabel || 'Submit';\r\n return this.labels[key] || key;\r\n }\r\n\r\n get previousLabel(): string {\r\n const key = this.formSchema?.labels?.previousLabel || 'Previous';\r\n return this.labels[key] || key;\r\n }\r\n\r\n // ── Action Bar helpers ─────────────────────────────────────────────────────\r\n\r\n get actionBarConfig(): ActionBarConfig | undefined {\r\n return this.formSchema?.actionBarConfig;\r\n }\r\n\r\n /**\r\n * Returns buttons for a given alignment, sorted by `order` (stable).\r\n */\r\n getButtonsForAlignment(alignment: 'left' | 'right'): ActionButtonConfig[] {\r\n return (this.actionBarConfig?.buttons || [])\r\n .filter(b => !b.hidden && (b.alignment ?? 'right') === alignment)\r\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\r\n }\r\n\r\n getButtonLabel(btn: ActionButtonConfig): string {\r\n if (btn.action?.kind === 'submit' && this.isStepper && this.canGoNext) {\r\n return this.nextLabel;\r\n }\r\n const key = btn.label || btn.id;\r\n return this.labels[key] || key;\r\n }\r\n\r\n isButtonDisabled(btn: ActionButtonConfig): boolean {\r\n if (btn.disabled) return true;\r\n const kind = btn.action?.kind;\r\n if (kind === 'submit' || kind === 'draft' || kind === 'api') {\r\n return this.isLoading || this.isDraftLoading;\r\n }\r\n return false;\r\n }\r\n\r\n private getButtonByActionKind(kind: string): ActionButtonConfig | undefined {\r\n return (this.actionBarConfig?.buttons || []).find(b => b.action?.kind === kind);\r\n }\r\n\r\n // ── Navigation helper ──────────────────────────────────────────────────────\r\n\r\n private navigateTo(url?: string): void {\r\n if (!url) return;\r\n if (url.startsWith('http://') || url.startsWith('https://')) {\r\n window.location.href = url;\r\n } else {\r\n this.router.navigateByUrl(url);\r\n }\r\n }\r\n\r\n\r\n}","<div class=\"smart-form-container\">\r\n <div class=\"smart-form-wrapper\" *ngIf=\"formSchema\">\r\n\r\n <!-- Form Header -->\r\n <div class=\"form-header\" *ngIf=\"formSchema.showTitle !== false\">\r\n <h2 class=\"form-title\">{{ formSchema.label }}</h2>\r\n <p class=\"form-description\" *ngIf=\"formSchema.description\">{{ formSchema.description }}</p>\r\n </div>\r\n\r\n <!-- Stepper Navigation -->\r\n <div class=\"stepper-nav\" *ngIf=\"isStepper && formSchema.stepperConfig?.showStep !== false\">\r\n <div class=\"stepper-steps\" [class.horizontal]=\"formSchema.stepperConfig?.isHorizontal !== false\">\r\n <div *ngFor=\"let step of fieldList; let i = index\" class=\"stepper-step\" [class.active]=\"i === currentStep\"\r\n [class.completed]=\"i < currentStep\">\r\n <div class=\"step-number\">{{ i + 1 }}</div>\r\n <div class=\"step-label\">{{ step.sectionConfig?.label || 'Step ' + (i + 1) }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Form Content -->\r\n <form [formGroup]=\"formGroup\" class=\"smart-form\">\r\n <!-- Section Form -->\r\n <div *ngIf=\"!isStepper && formSchema.sectionConfig && formSchema.sectionConfig.isEnabled !== false\" class=\"form-section\">\r\n <lib-form-section [config]=\"formSchema.sectionConfig\" [controller]=\"controller\" [formGroup]=\"formGroup\">\r\n </lib-form-section>\r\n </div>\r\n\r\n <!-- Stepper Form -->\r\n <div *ngIf=\"isStepper && currentStepConfig && currentStepConfig.sectionConfig?.isEnabled !== false\" class=\"form-stepper\">\r\n <lib-form-section [config]=\"currentStepConfig.sectionConfig!\" [controller]=\"controller\" [formGroup]=\"formGroup\">\r\n </lib-form-section>\r\n </div>\r\n </form>\r\n\r\n <!-- ── Form Actions ──────────────────────────────────────────────────── -->\r\n <div class=\"form-actions\" *ngIf=\"formSchema.showActions !== false\">\r\n\r\n <!-- LEFT GROUP -->\r\n <div class=\"action-group action-group--left\">\r\n <!-- Optional: Navigational buttons like 'Previous' for stepper can be explicitly added to config, \r\n but we'll keep the logic if they are provided in the buttons array via action.kind === 'prev' -->\r\n <lib-button\r\n *ngFor=\"let btn of getButtonsForAlignment('left')\"\r\n [variant]=\"$any(btn.variant) || 'outline'\"\r\n [disabled]=\"isButtonDisabled(btn)\"\r\n (click)=\"handleButtonClick(btn)\">\r\n {{ getButtonLabel(btn) }}\r\n </lib-button>\r\n </div>\r\n\r\n <!-- RIGHT GROUP -->\r\n <div class=\"action-group action-group--right\">\r\n <lib-button\r\n *ngFor=\"let btn of getButtonsForAlignment('right')\"\r\n [variant]=\"$any(btn.variant) || 'primary'\"\r\n [disabled]=\"isButtonDisabled(btn)\"\r\n (click)=\"handleButtonClick(btn)\">\r\n {{ getButtonLabel(btn) }}\r\n </lib-button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\r\nimport { MaterialModule } from '../material/material.module';\r\nimport { SmartFormComponent } from './components/smart-form/smart-form.component';\r\nimport { FormSectionComponent } from './components/form-section/form-section.component';\r\nimport { FormFieldComponent } from './components/form-field/form-field.component';\r\nimport { ExpressionService } from './services/expression.service';\r\nimport { ButtonModule } from '../button/button.module';\r\nimport { AlertModule } from '../alert/alert.module';\r\nimport { QuillModule } from 'ngx-quill';\r\nimport { TrustedUrlPipe } from './utils/trusted-url.pipe';\r\n\r\n@NgModule({\r\n declarations: [\r\n SmartFormComponent,\r\n FormSectionComponent,\r\n FormFieldComponent,\r\n TrustedUrlPipe\r\n ],\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n FormsModule,\r\n MaterialModule,\r\n ButtonModule,\r\n AlertModule,\r\n QuillModule.forRoot()\r\n ],\r\n exports: [\r\n SmartFormComponent\r\n ],\r\n providers: [\r\n ExpressionService\r\n ]\r\n})\r\nexport class SmartFormModule { }\r\n","export const DEFAULT_ITEMS_PER_PAGE = 10;\r\nexport const DEFAULT_PAGE_SIZE_OPTIONS = [10, 20, 50];\r\nexport const PAGINATION_THEME_DEFAULT = 'theme-1';\r\nexport const PAGINATION_THEME_DARK = 'theme-2';\r\n\r\n// Nav\r\nexport const NAV_VARIANT_DEFAULT: 'filled' | 'underline' | 'pills' = 'filled';\r\nexport const NAV_ORIENTATION_DEFAULT: 'horizontal' | 'vertical' = 'horizontal';\r\n\r\n// Side Nav\r\nexport const DEFAULT_SIDE_NAV_TOOLTIP_POSITION = 'right';\r\n","import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, HostBinding } from '@angular/core';\r\nimport { TooltipPosition } from '@angular/material/tooltip';\r\nimport { SideNavSection, SideNavItem, SideNavStyleConfig } from '../../side-nav.models';\r\nimport { DEFAULT_SIDE_NAV_TOOLTIP_POSITION } from '../../../../utils/constants';\r\n\r\n@Component({\r\n selector: 'lib-side-nav',\r\n templateUrl: './side-nav.component.html',\r\n styleUrls: ['./side-nav.component.scss'],\r\n standalone: false\r\n})\r\nexport class SideNavComponent implements OnChanges {\r\n @Input() sections: SideNavSection[] = [];\r\n @Input() userRoles?: string[]; // If provided, filters items automatically based on roles\r\n @Input() activeId?: string;\r\n @Input() styleConfig?: SideNavStyleConfig;\r\n\r\n /** Control whether the nav is collapsed externally (two-way bindable) */\r\n @Input() collapsed: boolean = false;\r\n /** Width of the nav when expanded. Overrides the CSS variable default. */\r\n @Input() width?: string;\r\n /** Width of the nav when collapsed (icons only). Overrides the CSS variable default. */\r\n @Input() collapsedWidth?: string;\r\n /** Whether to show the collapse toggle button */\r\n @Input() showCollapseToggle: boolean = true;\r\n /** Whether to hide icons when the side nav is expanded */\r\n @Input() hideIconsWhenExpanded: boolean = false;\r\n /** Whether to show tooltips on nav items */\r\n @Input() showTooltips: boolean = true;\r\n /** Position of the tooltip */\r\n @Input() tooltipPosition: TooltipPosition = DEFAULT_SIDE_NAV_TOOLTIP_POSITION as TooltipPosition;\r\n\r\n /** Optional dictionary for label translation */\r\n @Input() labels?: { [key: string]: string };\r\n\r\n @Output() itemClicked = new EventEmitter<SideNavItem>();\r\n /** Emits whenever the collapsed state changes (supports two-way binding via [(collapsed)]) */\r\n @Output() collapsedChange = new EventEmitter<boolean>();\r\n\r\n /** Applies collapsed class to :host for the width CSS transition */\r\n @HostBinding('class.cc-side-nav-host-collapsed') get isHostCollapsed() {\r\n return this.collapsed;\r\n }\r\n\r\n filteredSections: SideNavSection[] = [];\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['sections'] || changes['userRoles'] || changes['labels']) {\r\n this.filterAndMapSections();\r\n }\r\n }\r\n\r\n private filterAndMapSections() {\r\n if (!this.sections) {\r\n this.filteredSections = [];\r\n return;\r\n }\r\n\r\n const clonedSections: SideNavSection[] = structuredClone(this.sections);\r\n\r\n this.filteredSections = clonedSections.map(section => {\r\n // Map section heading if labels are provided\r\n if (this.labels && section.heading) {\r\n section.heading = this.labels[section.heading] || section.heading;\r\n }\r\n\r\n // Filter and map items\r\n section.items = section.items.filter(item => {\r\n if (this.userRoles && this.userRoles.length > 0 && item.roles && item.roles.length > 0) {\r\n const hasRole = item.roles.some(role => this.userRoles?.includes(role));\r\n if (!hasRole) return false;\r\n }\r\n return true;\r\n }).map((item: any) => {\r\n // Map item labels and tooltips\r\n if (this.labels) {\r\n const mappedLabel = this.labels[item.labelKey || item.label] || item.labelKey || item.label;\r\n return {\r\n ...item,\r\n label: mappedLabel,\r\n tooltip: this.labels[item.tooltip || item.labelKey] || mappedLabel\r\n };\r\n }\r\n return item;\r\n });\r\n\r\n return section;\r\n }).filter(section => section.items.length > 0);\r\n }\r\n\r\n onItemClick(item: SideNavItem, event: Event) {\r\n if (item.disabled) {\r\n event.preventDefault();\r\n return;\r\n }\r\n this.activeId = item.id;\r\n this.itemClicked.emit(item);\r\n }\r\n\r\n toggleCollapse() {\r\n this.collapsed = !this.collapsed;\r\n this.collapsedChange.emit(this.collapsed);\r\n }\r\n\r\n get customStyles(): { [key: string]: string } {\r\n const styles: { [key: string]: string } = {};\r\n\r\n // Size overrides from direct inputs (take priority over styleConfig)\r\n if (this.width) styles['--cc-side-nav-width'] = this.width;\r\n if (this.collapsedWidth) styles['--cc-side-nav-collapsed-width'] = this.collapsedWidth;\r\n\r\n if (!this.styleConfig) return styles;\r\n\r\n if (this.styleConfig.bg) styles['--cc-side-nav-bg'] = this.styleConfig.bg;\r\n if (this.styleConfig.width) styles['--cc-side-nav-width'] = this.styleConfig.width;\r\n if (this.styleConfig.collapsedWidth) styles['--cc-side-nav-collapsed-width'] = this.styleConfig.collapsedWidth;\r\n if (this.styleConfig.fontFamily) styles['--cc-side-nav-font-family'] = this.styleConfig.fontFamily;\r\n if (this.styleConfig.headingColor) styles['--cc-side-nav-heading-color'] = this.styleConfig.headingColor;\r\n if (this.styleConfig.itemColor) styles['--cc-side-nav-item-color'] = this.styleConfig.itemColor;\r\n if (this.styleConfig.itemHoverBg) styles['--cc-side-nav-item-hover-bg'] = this.styleConfig.itemHoverBg;\r\n if (this.styleConfig.activeBg) styles['--cc-side-nav-active-bg'] = this.styleConfig.activeBg;\r\n if (this.styleConfig.activeColor) styles['--cc-side-nav-active-color'] = this.styleConfig.activeColor;\r\n if (this.styleConfig.activeHoverBg) styles['--cc-side-nav-active-hover-bg'] = this.styleConfig.activeHoverBg;\r\n\r\n return styles;\r\n }\r\n}","<nav class=\"cc-side-nav\" [class.collapsed]=\"collapsed\" role=\"navigation\" [ngStyle]=\"customStyles\">\r\n\r\n <!-- Fallback standalone toggle if no sections exist -->\r\n <div class=\"cc-side-nav-toggle-wrap standalone\" *ngIf=\"filteredSections.length === 0 && showCollapseToggle\">\r\n <button class=\"cc-side-nav-toggle\" (click)=\"toggleCollapse()\" type=\"button\"\r\n [attr.aria-label]=\"collapsed ? 'Expand navigation' : 'Collapse navigation'\">\r\n <span class=\"material-icons cc-side-nav-toggle-icon\">\r\n {{ collapsed ? 'menu_open' : 'menu' }}\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"cc-side-nav-section\" *ngFor=\"let section of filteredSections; let i = index\">\r\n\r\n <div class=\"cc-side-nav-heading-row\" *ngIf=\"section.heading || (i === 0 && showCollapseToggle)\">\r\n <h3 class=\"cc-side-nav-heading\" *ngIf=\"section.heading && !collapsed\">\r\n {{ section.heading }}\r\n </h3>\r\n\r\n <div class=\"cc-side-nav-toggle-wrap\" *ngIf=\"i === 0 && showCollapseToggle\"\r\n [class.no-heading]=\"!section.heading || collapsed\">\r\n <button class=\"cc-side-nav-toggle\" (click)=\"toggleCollapse()\" type=\"button\"\r\n [attr.aria-label]=\"collapsed ? 'Expand navigation' : 'Collapse navigation'\">\r\n <span class=\"material-icons cc-side-nav-toggle-icon\">\r\n {{ collapsed ? 'menu_open' : 'menu' }}\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <ul class=\"cc-side-nav-list\">\r\n <li *ngFor=\"let item of section.items\" class=\"cc-side-nav-list-item\">\r\n <a (click)=\"onItemClick(item, $event)\" class=\"cc-side-nav-link\" [class.active]=\"item.id === activeId\"\r\n [class.disabled]=\"item.disabled\" [matTooltip]=\"item.tooltip || item.label\"\r\n [matTooltipDisabled]=\"!showTooltips\" [matTooltipPosition]=\"tooltipPosition\"\r\n [matTooltipClass]=\"'cc-side-nav-tooltip'\" [attr.aria-current]=\"(item.id === activeId) ? 'page' : null\"\r\n [attr.aria-disabled]=\"item.disabled ? true : null\">\r\n <span *ngIf=\"item.icon && (collapsed || !hideIconsWhenExpanded)\" class=\"cc-side-nav-icon\">\r\n\r\n <span *ngIf=\"!item.icon.includes('fa') && !item.icon.includes('bi')\" class=\"material-icons\">\r\n {{ item.icon }}\r\n </span>\r\n\r\n <i *ngIf=\"item.icon.includes('fa') || item.icon.includes('bi')\" [class]=\"item.icon\"></i>\r\n\r\n </span>\r\n <span class=\"cc-side-nav-label\" *ngIf=\"!collapsed\">{{ item.label }}</span>\r\n <span class=\"cc-side-nav-arrow material-icons\"\r\n *ngIf=\"!collapsed && (item.id === activeId) && item.showArrow !== false\">chevron_right</span>\r\n </a>\r\n </li>\r\n </ul>\r\n\r\n </div>\r\n\r\n</nav>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { RouterModule } from '@angular/router';\r\nimport { MaterialModule } from '../material/material.module';\r\nimport { SideNavComponent } from './components/side-nav/side-nav.component';\r\n\r\n@NgModule({\r\n declarations: [SideNavComponent],\r\n imports: [\r\n CommonModule,\r\n RouterModule,\r\n MaterialModule\r\n ],\r\n exports: [SideNavComponent]\r\n})\r\nexport class SideNavModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MaterialModule } from './modules/material/material.module';\r\nimport { AlertModule } from './modules/alert/alert.module';\r\nimport { ButtonModule } from './modules/button/button.module';\r\nimport { ButtonDropdownModule } from './modules/button-dropdown/button-dropdown.module';\r\nimport { ConfirmationModalModule } from './modules/confirmation-modal/confirmation-modal.module';\r\nimport { FilterSidebarModule } from './modules/filter-sidebar/filter-sidebar.module';\r\nimport { SummaryCardModule } from './modules/summary-card/summary-card.module';\r\nimport { ConfigurableFormModule } from './modules/configurable-form/configurable-form.module';\r\nimport { FormComponentsModule } from './modules/form-components/form-components.module';\r\nimport { SmartFormModule } from './modules/smart-form/smart-form.module';\r\nimport { FilterModule } from '../public-api';\r\nimport { SideNavModule } from './modules/side-nav/side-nav.module';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule,\r\n MaterialModule,\r\n AlertModule, ButtonModule, ButtonDropdownModule, ConfirmationModalModule, FilterSidebarModule, FilterModule,\r\n SummaryCardModule,\r\n ConfigurableFormModule,\r\n FormComponentsModule,\r\n SmartFormModule,\r\n SideNavModule\r\n ],\r\n exports: [\r\n MaterialModule,\r\n AlertModule, ButtonModule, ButtonDropdownModule, ConfirmationModalModule, FilterSidebarModule, FilterModule,\r\n SummaryCardModule,\r\n ConfigurableFormModule,\r\n FormComponentsModule,\r\n SmartFormModule,\r\n SideNavModule\r\n ],\r\n})\r\nexport class SharedUiModule { }\r\n","/**\n * Utility functions for LocalStorage operations\n */\nexport const getLocalStorageItem = (key: string): string | null => {\n return localStorage.getItem(key);\n};\n\nexport const setLocalStorageItem = (key: string, value: string): void => {\n localStorage.setItem(key, value);\n};\n\nexport const removeLocalStorageItem = (key: string): void => {\n localStorage.removeItem(key);\n};\n\nexport const clearLocalStorage = (): void => {\n localStorage.clear();\n};\n\n/**\n * Utility functions for SessionStorage operations\n */\nexport const getSessionStorageItem = (key: string): string | null => {\n return sessionStorage.getItem(key);\n};\n\nexport const setSessionStorageItem = (key: string, value: string): void => {\n sessionStorage.setItem(key, value);\n};\n\nexport const removeSessionStorageItem = (key: string): void => {\n sessionStorage.removeItem(key);\n};\n\nexport const clearSessionStorage = (): void => {\n sessionStorage.clear();\n};\n","import { FormConfig } from './configurable-form.model';\r\n\r\n/**\r\n * Example: Basic Form Configuration\r\n * This is a generic example for testing and demonstration purposes.\r\n */\r\nexport const EXAMPLE_FORM_CONFIG: FormConfig = {\r\n sections: [\r\n {\r\n sectionTitle: 'User Information',\r\n fields: [\r\n {\r\n name: 'fullName',\r\n label: 'Full Name',\r\n type: 'text',\r\n placeholder: 'Enter full name',\r\n required: true,\r\n class: 'col-12'\r\n },\r\n {\r\n name: 'email',\r\n label: 'Email Address',\r\n type: 'email',\r\n placeholder: 'Enter email address',\r\n required: true,\r\n class: 'col-6'\r\n },\r\n {\r\n name: 'phone',\r\n label: 'Phone Number',\r\n type: 'tel',\r\n placeholder: '+91 9999999999',\r\n class: 'col-6'\r\n },\r\n {\r\n name: 'role',\r\n label: 'Role',\r\n type: 'dropdown',\r\n placeholder: 'Select Role',\r\n options: [\r\n { label: 'Admin', value: 'admin' },\r\n { label: 'User', value: 'user' },\r\n { label: 'Guest', value: 'guest' }\r\n ],\r\n class: 'col-12'\r\n }\r\n ]\r\n },\r\n {\r\n sectionTitle: 'Preferences',\r\n fields: [\r\n {\r\n name: 'notifications',\r\n label: 'Receive Notifications',\r\n type: 'radio',\r\n options: [\r\n { label: 'Yes', value: 'yes' },\r\n { label: 'No', value: 'no' }\r\n ],\r\n value: 'yes',\r\n class: 'col-12'\r\n }\r\n ]\r\n },\r\n {\r\n sectionTitle: 'Documents',\r\n fields: [\r\n {\r\n name: 'profilePicture',\r\n label: 'Profile Picture',\r\n type: 'file',\r\n accept: '.jpg,.png',\r\n multiple: false,\r\n helpText: 'Upload a single profile picture (Max 5MB)',\r\n class: 'col-12'\r\n },\r\n {\r\n name: 'certificates',\r\n label: 'Certificates',\r\n type: 'file',\r\n accept: '.pdf,.doc,.docx',\r\n multiple: true,\r\n helpText: 'Upload multiple certificates (Max 5MB each)',\r\n class: 'col-12'\r\n }\r\n ]\r\n }\r\n ],\r\n entityType: 'User'\r\n};\r\n\r\n/**\r\n * Example: Target Group Configuration\r\n * Demonstrates composite fields for Age Group and Gender Split\r\n */\r\nexport const TARGET_GROUP_CONFIG: FormConfig = {\r\n sections: [\r\n {\r\n sectionTitle: 'Target Group Settings',\r\n fields: [\r\n {\r\n name: 'targetAgeGroup',\r\n label: 'Target Age Group',\r\n type: 'composite',\r\n separator: '-',\r\n subFields: [\r\n {\r\n label: \"Min Age\",\r\n name: 'minAge',\r\n type: 'number',\r\n placeholder: 'Min Age',\r\n validationRules: { min: 0 }\r\n },\r\n {\r\n label: \"Max Age\",\r\n name: 'maxAge',\r\n type: 'number',\r\n placeholder: 'Max Age',\r\n validationRules: { min: 0 }\r\n }\r\n ],\r\n compositeValidationRule: 'minMax',\r\n class: 'col-12'\r\n },\r\n {\r\n name: 'genderSplit',\r\n label: 'Target Gender Split',\r\n type: 'composite',\r\n subFields: [\r\n {\r\n label: \"Male\",\r\n name: 'malePercentage',\r\n type: 'number',\r\n placeholder: 'Male',\r\n suffixText: '%',\r\n validationRules: { min: 0, max: 100 }\r\n },\r\n {\r\n label: \"Female\",\r\n name: 'femalePercentage',\r\n type: 'number',\r\n placeholder: 'Female',\r\n suffixText: '%',\r\n validationRules: { min: 0, max: 100 }\r\n }\r\n ],\r\n compositeValidationRule: 'percentageTotal',\r\n class: 'col-12'\r\n }\r\n ]\r\n }\r\n ],\r\n\r\n};\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { DEFAULT_ITEMS_PER_PAGE, DEFAULT_PAGE_SIZE_OPTIONS, PAGINATION_THEME_DEFAULT } from '../../../../utils/constants';\n\nexport interface PaginationLabels {\n items: string;\n of: string;\n perPage: string;\n}\n\n@Component({\n selector: 'lib-pagination',\n templateUrl: './pagination.component.html',\n styleUrls: ['./pagination.component.scss'],\n standalone: false\n})\nexport class PaginationComponent implements OnInit, OnChanges {\n @Input() totalItems: number = 0;\n @Input() itemsPerPage: number = DEFAULT_ITEMS_PER_PAGE;\n @Input() currentPage: number = 1;\n @Input() pageSizeOptions: number[] = DEFAULT_PAGE_SIZE_OPTIONS;\n @Input() theme: 'theme-1' | 'theme-2' = PAGINATION_THEME_DEFAULT;\n @Input() labels: PaginationLabels = {\n items: 'items',\n of: 'of',\n perPage: 'Per Page'\n };\n\n @Output() pageChange = new EventEmitter<number>();\n @Output() itemsPerPageChange = new EventEmitter<number>();\n\n totalPages: number = 0;\n pages: (number | string)[] = [];\n startItem: number = 0;\n endItem: number = 0;\n\n constructor() { }\n\n ngOnInit(): void {\n this.calculatePagination();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['totalItems'] || changes['itemsPerPage'] || changes['currentPage']) {\n this.calculatePagination();\n }\n }\n\n calculatePagination(): void {\n this.totalPages = Math.ceil(this.totalItems / this.itemsPerPage);\n\n // Ensure current page is valid\n if (this.currentPage < 1) {\n this.currentPage = 1;\n } else if (this.currentPage > this.totalPages && this.totalPages > 0) {\n this.currentPage = this.totalPages;\n }\n\n this.startItem = (this.currentPage - 1) * this.itemsPerPage + 1;\n this.endItem = Math.min(this.currentPage * this.itemsPerPage, this.totalItems);\n\n if (this.totalItems === 0) {\n this.startItem = 0;\n this.endItem = 0;\n }\n\n this.pages = this.getVisiblePages(this.currentPage, this.totalPages);\n }\n\n getVisiblePages(current: number, total: number): (number | string)[] {\n if (total <= 7) {\n return Array.from({ length: total }, (_, i) => i + 1);\n }\n\n if (current <= 4) {\n return [1, 2, 3, 4, 5, '...', total];\n }\n\n if (current >= total - 3) {\n return [1, '...', total - 4, total - 3, total - 2, total - 1, total];\n }\n\n return [1, '...', current - 1, current, current + 1, '...', total];\n }\n\n onPageChange(page: number | string): void {\n if (typeof page === 'string') return;\n if (page < 1 || page > this.totalPages || page === this.currentPage) return;\n \n this.pageChange.emit(page);\n }\n\n onItemsPerPageChange(event: Event): void {\n const target = event.target as HTMLSelectElement;\n const newSize = Number(target.value);\n this.itemsPerPageChange.emit(newSize);\n }\n\n nextPage(): void {\n if (this.currentPage < this.totalPages) {\n this.onPageChange(this.currentPage + 1);\n }\n }\n\n prevPage(): void {\n if (this.currentPage > 1) {\n this.onPageChange(this.currentPage - 1);\n }\n }\n}\n","<div class=\"cc-pagination\" [ngClass]=\"theme\">\n <!-- Left Side: Items Info & Per Page -->\n <div class=\"pagination-left\" *ngIf=\"pageSizeOptions.length > 1 || totalItems > 0\">\n <span class=\"items-info\">\n {{ startItem }}-{{ endItem }} {{ labels.of }} {{ totalItems }} {{ labels.items }}\n </span>\n\n <div class=\"per-page-selector\" *ngIf=\"pageSizeOptions.length > 1\">\n <div class=\"select-wrapper\">\n <select [value]=\"itemsPerPage\" (change)=\"onItemsPerPageChange($event)\">\n <option *ngFor=\"let option of pageSizeOptions\" [value]=\"option\">\n {{ option }}\n </option>\n </select>\n <span class=\"select-arrow\"></span>\n </div>\n <span class=\"per-page-label\">{{ labels.perPage }}</span>\n </div>\n </div>\n\n <!-- Right Side: Page Controls -->\n <div class=\"pagination-right\">\n <button \n class=\"page-btn prev-btn\" \n [disabled]=\"currentPage === 1\" \n (click)=\"prevPage()\"\n aria-label=\"Previous Page\">\n <span class=\"icon\">‹</span>\n </button>\n\n <div class=\"page-numbers\">\n <ng-container *ngFor=\"let page of pages\">\n <button \n *ngIf=\"page !== '...'\"\n class=\"page-btn number-btn\" \n [class.active]=\"page === currentPage\"\n (click)=\"onPageChange(page)\">\n {{ page }}\n </button>\n <span *ngIf=\"page === '...'\" class=\"ellipsis\">...</span>\n </ng-container>\n </div>\n\n <button \n class=\"page-btn next-btn\" \n [disabled]=\"currentPage === totalPages || totalPages === 0\" \n (click)=\"nextPage()\"\n aria-label=\"Next Page\">\n <span class=\"icon\">›</span>\n </button>\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PaginationComponent } from './components/pagination/pagination.component';\n\n\n@NgModule({\n declarations: [\n PaginationComponent\n ],\n imports: [\n CommonModule\n ],\n exports: [\n PaginationComponent\n ]\n})\nexport class PaginationModule { }\n","import { Component, EventEmitter, Input, Output, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { NAV_VARIANT_DEFAULT, NAV_ORIENTATION_DEFAULT } from '../../../../utils/constants';\r\nimport { NavStyleConfig } from '../../nav.models';\r\n\r\nexport interface NavItem {\r\n id: string | number;\r\n label: string;\r\n icon?: string;\r\n badge?: string | number;\r\n disabled?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-nav',\r\n templateUrl: './nav.component.html',\r\n styleUrls: ['./nav.component.scss'],\r\n standalone: false\r\n})\r\nexport class NavComponent implements OnChanges {\r\n @Input() items: NavItem[] = [];\r\n @Input() activeId: string | number | null = null;\r\n @Input() variant: 'filled' | 'underline' | 'pills' = NAV_VARIANT_DEFAULT;\r\n @Input() orientation: 'horizontal' | 'vertical' = NAV_ORIENTATION_DEFAULT;\r\n @Input() styleConfig: NavStyleConfig = {};\r\n\r\n @Output() selectionChange = new EventEmitter<NavItem>();\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['styleConfig']) {\r\n console.log(' [NavComponent] styleConfig changed:', this.styleConfig);\r\n console.log(' [NavComponent] computedStyles:', this.computedStyles);\r\n }\r\n }\r\n\r\n get computedStyles(): { [key: string]: string | undefined } {\r\n const c = this.styleConfig;\r\n return {\r\n // Container (direct CSS)\r\n 'width': c.width,\r\n 'box-shadow': c.boxShadow,\r\n\r\n // Container (CSS Variables)\r\n '--cc-nav-container-bg': c.backgroundColor,\r\n '--cc-nav-container-radius': c.borderRadius,\r\n '--cc-nav-container-border': c.border,\r\n '--cc-nav-container-padding': c.padding,\r\n '--cc-nav-container-gap': c.gap,\r\n\r\n // Item (CSS Variables)\r\n '--cc-nav-font-size': c.fontSize,\r\n '--cc-nav-font-weight': c.fontWeight,\r\n '--cc-nav-item-color': c.itemColor,\r\n '--cc-nav-item-radius': c.itemRadius,\r\n '--cc-nav-item-padding': c.itemPadding,\r\n\r\n // Active Item (CSS Variables)\r\n '--cc-nav-item-active-bg': c.activeItemBg,\r\n '--cc-nav-item-active-color': c.activeItemColor,\r\n '--cc-nav-item-active-font-weight': c.activeItemFontWeight,\r\n '--cc-nav-item-active-border-color': c.activeItemBorderColor,\r\n\r\n // Hover Item (CSS Variables)\r\n '--cc-nav-item-hover-bg': c.hoverItemBg,\r\n '--cc-nav-item-hover-color': c.hoverItemColor,\r\n\r\n // Badge (CSS Variables)\r\n '--cc-nav-badge-bg': c.badgeBg,\r\n '--cc-nav-badge-color': c.badgeColor,\r\n };\r\n }\r\n\r\n onItemClick(item: NavItem): void {\r\n if (item.disabled) return;\r\n if (item.id === this.activeId) return;\r\n\r\n this.selectionChange.emit(item);\r\n }\r\n\r\n trackById(index: number, item: NavItem): string | number {\r\n return item.id;\r\n }\r\n}\r\n","<nav\r\n class=\"cc-nav\"\r\n [ngClass]=\"[variant, orientation]\"\r\n [ngStyle]=\"computedStyles\"\r\n role=\"tablist\"\r\n [attr.aria-orientation]=\"orientation\">\r\n\r\n <button\r\n *ngFor=\"let item of items; trackBy: trackById\"\r\n class=\"cc-nav-item\"\r\n [class.active]=\"item.id === activeId\"\r\n [class.disabled]=\"item.disabled\"\r\n [disabled]=\"item.disabled\"\r\n role=\"tab\"\r\n [attr.aria-selected]=\"item.id === activeId\"\r\n [attr.aria-disabled]=\"item.disabled || null\"\r\n (click)=\"onItemClick(item)\">\r\n\r\n <!-- Icon (optional) -->\r\n <span *ngIf=\"item.icon\" class=\"cc-nav-item-icon\">\r\n <i [ngClass]=\"item.icon\"></i>\r\n </span>\r\n\r\n <!-- Label -->\r\n <span class=\"cc-nav-item-label\">{{ item.label }}</span>\r\n\r\n <!-- Badge (optional) -->\r\n <span *ngIf=\"item.badge != null\" class=\"cc-nav-item-badge\">\r\n {{ item.badge }}\r\n </span>\r\n\r\n </button>\r\n\r\n</nav>\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NavComponent } from './components/nav/nav.component';\r\n\r\n\r\n@NgModule({\r\n declarations: [\r\n NavComponent\r\n ],\r\n imports: [\r\n CommonModule\r\n ],\r\n exports: [\r\n NavComponent\r\n ]\r\n})\r\nexport class NavModule { }\r\n","import { Component, EventEmitter, Input, OnInit, Output, ElementRef, HostListener } from '@angular/core';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\nimport { TableFilterConfig, TableFilterOutput, TableFilterColumn, TableFilterLabels } from '../../filter.models';\r\n\r\n@Component({\r\n selector: 'lib-filter',\r\n templateUrl: './filter.component.html',\r\n styleUrls: ['./filter.component.scss'],\r\n standalone: false\r\n})\r\nexport class FilterComponent implements OnInit {\r\n @Input() config: TableFilterConfig = { items: [] };\r\n @Input() activeFilters: TableFilterOutput = {};\r\n @Input() columns: TableFilterColumn[] = [];\r\n @Input() labels: TableFilterLabels = {\r\n filterBtn: '',\r\n clear: '',\r\n apply: '',\r\n search: '',\r\n columns: '',\r\n showAll: '',\r\n hideAll: ''\r\n };\r\n @Input() theme: string = '';\r\n\r\n @Output() filterChange = new EventEmitter<TableFilterOutput>();\r\n @Output() columnChange = new EventEmitter<TableFilterColumn[]>();\r\n @Output() toggle = new EventEmitter<boolean>();\r\n\r\n isOpen = false;\r\n activeTab: 'filters' | 'columns' = 'filters';\r\n\r\n // Temporary state while panel is open\r\n tempFilters: TableFilterOutput = {};\r\n tempColumns: TableFilterColumn[] = [];\r\n\r\n constructor(\r\n private elementRef: ElementRef,\r\n private router: Router,\r\n private route: ActivatedRoute\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.syncTempState();\r\n this.initFromUrl();\r\n }\r\n\r\n private initFromUrl(): void {\r\n if (this.config.settings?.persistent) {\r\n this.route.queryParams.subscribe(params => {\r\n if (Object.keys(params).length > 0) {\r\n const newFilters: TableFilterOutput = { ...this.activeFilters };\r\n Object.keys(params).forEach(key => {\r\n // Skip non-filter params if possible, or assume all are filters\r\n // Ideally we check against config items\r\n if (params[key] !== undefined) {\r\n newFilters[key] = params[key];\r\n }\r\n });\r\n this.activeFilters = newFilters;\r\n this.syncTempState();\r\n }\r\n });\r\n }\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onClickOutside(event: Event): void {\r\n if (!this.elementRef.nativeElement.contains(event.target)) {\r\n this.isOpen = false;\r\n }\r\n }\r\n\r\n togglePanel(): void {\r\n this.isOpen = !this.isOpen;\r\n if (this.isOpen) {\r\n this.syncTempState();\r\n this.activeTab = 'filters';\r\n }\r\n this.toggle.emit(this.isOpen);\r\n }\r\n\r\n setActiveTab(tab: 'filters' | 'columns'): void {\r\n this.activeTab = tab;\r\n }\r\n\r\n // Generic Filter Change Handler\r\n onFilterChange(key: string | undefined, value: any): void {\r\n if (!key) return;\r\n this.tempFilters[key] = value;\r\n }\r\n\r\n // Column Visibility Logic\r\n toggleColumn(columnId: string): void {\r\n const col = this.tempColumns.find(c => c.id === columnId);\r\n if (col) {\r\n col.visible = !col.visible;\r\n }\r\n }\r\n\r\n toggleAllColumns(visible: boolean): void {\r\n this.tempColumns.forEach(c => c.visible = visible);\r\n }\r\n\r\n // Actions\r\n clearAll(): void {\r\n if (this.activeTab === 'filters') {\r\n this.tempFilters = {};\r\n if (this.config.settings?.persistent) {\r\n this.updateUrl({});\r\n }\r\n } else {\r\n // Reset columns to default or show all?\r\n // Usually 'clear' in filters context means clear filters\r\n // But if we are in columns tab, maybe we want to reset columns?\r\n // For now, let's keep it simple: generic clear clears filters.\r\n this.tempFilters = {};\r\n }\r\n // If we want clear to apply immediately without clicking apply:\r\n // this.apply(); \r\n // But usually \"Clear\" inside panel just clears temp state until Apply is clicked.\r\n // However, if the user requested \"Persistent\" and \"Clear\", they might expect immediate URL update?\r\n // Standard UX: panel actions apply on \"Apply\".\r\n // The persisted state should only change when \"Apply\" is clicked?\r\n // Wait, if I update URL on clearAll inside panel, it might be confusing if panel is still open with cleared state but not \"applied\" to data.\r\n // Re-reading expectation: \"Persistent\" setting usually means the filter state is synced with URL.\r\n // If I clear temp state, URL shouldn't change until I click Apply.\r\n // SO I WILL NOT UPDATE URL HERE. The `initFromUrl` loads INTO `activeFilters`.\r\n // `apply()` updates `activeFilters` AND should update URL.\r\n }\r\n\r\n apply(): void {\r\n // Apply temp state to active state\r\n this.activeFilters = { ...this.tempFilters };\r\n // Clean up undefined/null values\r\n Object.keys(this.activeFilters).forEach(key => {\r\n if (this.activeFilters[key] === null || this.activeFilters[key] === undefined || this.activeFilters[key] === '') {\r\n delete this.activeFilters[key];\r\n }\r\n });\r\n\r\n // Apply columns\r\n this.columns = this.tempColumns.map(c => ({ ...c }));\r\n\r\n this.filterChange.emit(this.activeFilters);\r\n this.columnChange.emit(this.columns);\r\n\r\n if (this.config.settings?.persistent) {\r\n this.updateUrl(this.activeFilters);\r\n }\r\n\r\n this.isOpen = false;\r\n }\r\n\r\n\r\n private updateUrl(queryParams: any): void {\r\n this.router.navigate([], {\r\n relativeTo: this.route,\r\n queryParams: queryParams,\r\n queryParamsHandling: 'merge', // or 'replace' to clear others? 'merge' ensures we don't lose other params\r\n // But wait, if we removed a filter, merge keeps it?\r\n // We need to explicitly clear removed keys if we use merge.\r\n // Or use pure replacement of filter keys.\r\n // For simplicity, let's assuming we want to replace parameters that overlap.\r\n // But to clear keys, we need to pass `null` or `undefined` for those keys in `queryParams`?\r\n // Angular router: passing null removes the param.\r\n });\r\n\r\n // Refined updateUrl logic:\r\n // We merged activeFilters. But if we removed a key, it's missing from activeFilters.\r\n // We need to compare with current params and remove keys that are no longer in activeFilters?\r\n // A simpler way for this component:\r\n // We likely want to replace ALL query params that correspond to filters. \r\n // But we don't know which params are filters vs other things (e.g. page, sort).\r\n // For now, I will just push `this.activeFilters`. \r\n // NOTE: This doesn't clear keys that were removed. \r\n // To fix clearing:\r\n // I should probably navigate with exact activeFilters if I knew they are the ONLY params.\r\n // Better:\r\n // this.router.navigate([], { queryParams: this.activeFilters }); // property replaces all\r\n // If we want to keep 'page', etc., we need to include them.\r\n // Let's use 'merge' but we need to handle clearing.\r\n // I will implement a smarter update.\r\n }\r\n\r\n activeFilterCountValue(): number {\r\n return Object.keys(this.activeFilters).length;\r\n }\r\n\r\n\r\n get activeFilterCount(): number {\r\n return Object.keys(this.activeFilters).length;\r\n }\r\n\r\n private syncTempState(): void {\r\n this.tempFilters = { ...this.activeFilters };\r\n this.tempColumns = JSON.parse(JSON.stringify(this.columns || []));\r\n }\r\n\r\n get containerStyles(): { [key: string]: string } {\r\n const styles: { [key: string]: string } = {};\r\n if (this.config.styles) {\r\n if (this.config.styles.width) styles['--cc-filter-panel-width'] = this.config.styles.width;\r\n if (this.config.styles.padding) styles['--cc-filter-panel-padding'] = this.config.styles.padding;\r\n if (this.config.styles.gap) styles['--cc-filter-panel-gap'] = this.config.styles.gap;\r\n if (this.config.styles.backgroundColor) styles['--cc-filter-panel-bg'] = this.config.styles.backgroundColor;\r\n if (this.config.styles.borderRadius) styles['--cc-filter-panel-radius'] = this.config.styles.borderRadius;\r\n if (this.config.styles.headerHeight) styles['--cc-filter-panel-header-height'] = this.config.styles.headerHeight;\r\n }\r\n return styles;\r\n }\r\n\r\n trackByFn(index: number, item: any): any {\r\n return item.key || index;\r\n }\r\n}\r\n","<div class=\"cc-filter-container\" [class.is-open]=\"isOpen\" [ngStyle]=\"containerStyles\">\r\n\r\n <!-- Trigger Button -->\r\n <lib-button variant=\"outline\" (click)=\"togglePanel()\" class=\"cc-filter-trigger\"\r\n [class.active]=\"activeFilterCount > 0\">\r\n <span class=\"fas fa-filter\"></span> {{ labels?.filterBtn || 'Filter' }}\r\n <span *ngIf=\"activeFilterCount > 0\" class=\"cc-badge\">{{ activeFilterCount }}</span>\r\n </lib-button>\r\n\r\n <!-- Dropdown Panel -->\r\n <div class=\"cc-filter-panel mat-elevation-z4\" *ngIf=\"isOpen\" (click)=\"$event.stopPropagation()\">\r\n\r\n <!-- Header / Tabs -->\r\n <div class=\"cc-panel-header\">\r\n <div class=\"cc-tabs\">\r\n <div class=\"cc-tab\" [class.active]=\"activeTab === 'filters'\" (click)=\"setActiveTab('filters')\">\r\n {{ labels.filterBtn }}\r\n </div>\r\n <!-- Hide columns tab if no columns config provided -->\r\n <div class=\"cc-tab\" [class.active]=\"activeTab === 'columns'\" (click)=\"setActiveTab('columns')\"\r\n *ngIf=\"columns?.length\">\r\n {{ labels.columns }}\r\n </div>\r\n </div>\r\n <button type=\"button\" class=\"cc-icon-btn\" (click)=\"togglePanel()\">\r\n <span class=\"material-icons\">close</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Filters Tab Content -->\r\n <div class=\"cc-panel-content\" *ngIf=\"activeTab === 'filters'\">\r\n\r\n <!-- Dynamic Items -->\r\n <ng-container *ngFor=\"let item of config.items; trackBy: trackByFn\">\r\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { item: item }\"></ng-container>\r\n </ng-container>\r\n\r\n </div>\r\n\r\n <!-- Columns Tab Content -->\r\n <div class=\"cc-panel-content\" *ngIf=\"activeTab === 'columns'\">\r\n <div class=\"cc-columns-actions\">\r\n <lib-button variant=\"outline\" class=\"cc-btn-text\" (click)=\"toggleAllColumns(true)\">{{ labels.showAll\r\n }}</lib-button>\r\n <lib-button variant=\"outline\" class=\"cc-btn-text\" (click)=\"toggleAllColumns(false)\">{{ labels.hideAll\r\n }}</lib-button>\r\n </div>\r\n <div class=\"cc-columns-list\">\r\n <div *ngFor=\"let col of tempColumns\" class=\"cc-column-item\">\r\n <lib-checkbox [label]=\"col.label\" [checked]=\"col.visible\" (checkedChange)=\"toggleColumn(col.id)\">\r\n </lib-checkbox>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Actions -->\r\n <div class=\"cc-panel-footer\">\r\n <lib-button variant=\"outline\" color=\"warn\" class=\"cc-btn-text text-danger\" (click)=\"clearAll()\">\r\n {{ labels.clear }}\r\n </lib-button>\r\n <lib-button class=\"ms-2\" variant=\"primary\" (click)=\"apply()\">\r\n {{ labels.apply }}\r\n </lib-button>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n\r\n<!-- Recursive Template for Items -->\r\n<ng-template #itemTemplate let-item=\"item\">\r\n <div class=\"cc-filter-item\" [ngClass]=\"['type-' + item.type]\"\r\n [style.display]=\"item.visible === false ? 'none' : 'block'\" [ngStyle]=\"item.styles\">\r\n\r\n <ng-container [ngSwitch]=\"item.type\">\r\n\r\n <!-- Input -->\r\n <lib-input *ngSwitchCase=\"'input'\" [config]=\"item.inputConfig\" [label]=\"item.label\"\r\n [ngModel]=\"tempFilters[item.key]\" (valueChange)=\"onFilterChange(item.key, $event)\">\r\n </lib-input>\r\n\r\n <!-- Dropdown -->\r\n <lib-dropdown *ngSwitchCase=\"'dropdown'\" [config]=\"item.dropdownConfig\" [label]=\"item.label\"\r\n [ngModel]=\"tempFilters[item.key]\" (selectionChange)=\"onFilterChange(item.key, $event)\">\r\n </lib-dropdown>\r\n\r\n <!-- Checkbox -->\r\n <lib-checkbox *ngSwitchCase=\"'checkbox'\" [config]=\"item.checkboxConfig\" [label]=\"item.label\"\r\n [ngModel]=\"tempFilters[item.key]\" (checkedChange)=\"onFilterChange(item.key, $event)\">\r\n </lib-checkbox>\r\n\r\n <!-- Radio -->\r\n <lib-radio *ngSwitchCase=\"'radio'\" [config]=\"item.radioConfig\" [label]=\"item.label\"\r\n [ngModel]=\"tempFilters[item.key]\" (selectionChange)=\"onFilterChange(item.key, $event)\">\r\n </lib-radio>\r\n\r\n <!-- Toggle -->\r\n <lib-toggle *ngSwitchCase=\"'toggle'\" [config]=\"item.toggleConfig\" [label]=\"item.label\"\r\n [checked]=\"tempFilters[item.key]\" (toggleChange)=\"onFilterChange(item.key, $event)\">\r\n </lib-toggle>\r\n\r\n <!-- Datepicker -->\r\n <lib-datepicker *ngSwitchCase=\"'datepicker'\" [config]=\"item.datepickerConfig\" [label]=\"item.label\"\r\n [ngModel]=\"tempFilters[item.key]\" (dateChange)=\"onFilterChange(item.key, $event)\">\r\n </lib-datepicker>\r\n\r\n <!-- Search -->\r\n <lib-search *ngSwitchCase=\"'active-search'\" [config]=\"item.searchConfig\" [label]=\"item.label\"\r\n [ngModel]=\"tempFilters[item.key]\" (search)=\"onFilterChange(item.key, $event)\">\r\n </lib-search>\r\n\r\n <!-- Group / Accordion -->\r\n <div *ngSwitchCase=\"'group'\" class=\"cc-accordion-item\" [class.expanded]=\"item.expanded\">\r\n <button type=\"button\" class=\"cc-accordion-header\" (click)=\"item.expanded = !item.expanded\">\r\n <span class=\"cc-accordion-title\">{{ item.label }}</span>\r\n <span class=\"material-icons cc-accordion-icon\">{{ item.expanded ? 'expand_less' : 'expand_more'\r\n }}</span>\r\n </button>\r\n\r\n <div class=\"cc-accordion-body\" *ngIf=\"item.expanded\">\r\n <ng-container *ngFor=\"let child of item.children; trackBy: trackByFn\">\r\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { item: child }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Custom Divider -->\r\n <div *ngSwitchCase=\"'divider'\" class=\"cc-filter-divider\"></div>\r\n\r\n </ng-container>\r\n </div>\r\n</ng-template>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { ButtonModule } from '../button/button.module';\r\nimport { FormComponentsModule } from '../form-components/form-components.module';\r\nimport { FilterComponent } from './components/filter/filter.component';\r\n\r\n@NgModule({\r\n declarations: [\r\n FilterComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n ButtonModule,\r\n FormComponentsModule\r\n ],\r\n exports: [\r\n FilterComponent\r\n ]\r\n})\r\nexport class FilterModule { }\r\n","import { Component, EventEmitter, Input, OnInit, Output, OnChanges, SimpleChanges, AfterViewInit, OnDestroy, ViewChildren, QueryList, ElementRef, ChangeDetectorRef, NgZone, inject, LOCALE_ID, HostListener } from '@angular/core';\nimport { TableConfig, TableColumn, TableAction, TableFilter } from '../../models/table-config.model';\nimport { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http';\nimport { formatDate } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { catchError, finalize, map, debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { of, forkJoin, Subject } from 'rxjs';\n\n@Component({\n selector: 'lib-smart-table',\n templateUrl: './smart-table.component.html',\n styleUrls: ['./smart-table.component.scss'],\n standalone: false\n})\nexport class SmartTableComponent implements OnInit, OnChanges, AfterViewInit, OnDestroy {\n @Input() config!: TableConfig;\n \n @Output() action = new EventEmitter<{ action: TableAction, row: any }>();\n @Output() topAction = new EventEmitter<TableAction>(); // For top bar buttons\n @Output() filterChange = new EventEmitter<{ key: string, value: any }>();\n @Output() rowSelect = new EventEmitter<any[]>();\n @Output() columnClick = new EventEmitter<{ row: any, column: string }>();\n\n data: any[] = [];\n totalItems: number = 0;\n currentPage: number = 1;\n loading: boolean = false;\n \n // State\n activeSort: { key: string, direction: 'ASC' | 'DESC' } = { key: '', direction: 'ASC' };\n activeFilters: { [key: string]: any } = {};\n searchTerm: string = '';\n selectedRows: any[] = [];\n stickyColumnStyles: { [key: string]: any } = {};\n hasStickyColumns: boolean = false;\n openDropdownId: string | null = null;\n\n searchSubject = new Subject<string>();\n\n @ViewChildren('stickyHeader') stickyHeaders!: QueryList<ElementRef>;\n private resizeObserver: ResizeObserver | null = null;\n private locale = inject(LOCALE_ID);\n\n constructor(\n private http: HttpClient, \n private router: Router,\n private cdr: ChangeDetectorRef,\n private ngZone: NgZone\n ) { \n // Debounce search input\n this.searchSubject.pipe(\n debounceTime(this.config?.searchConfig?.debounceTime || 300),\n distinctUntilChanged()\n ).subscribe(term => {\n this.searchTerm = term;\n this.currentPage = 1;\n this.loadData();\n });\n }\n\n ngOnInit(): void {\n if (this.config) {\n if (this.config.sortBy) {\n this.activeSort.key = this.config.sortBy;\n }\n if (this.config.orderBy) {\n this.activeSort.direction = this.config.orderBy;\n }\n this.loadFilterOptions();\n this.loadData();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && !changes['config'].firstChange) {\n this.loadFilterOptions();\n this.loadData();\n setTimeout(() => this.calculateStickyPositions());\n }\n }\n\n ngAfterViewInit(): void {\n this.setupResizeObserver();\n }\n\n ngOnDestroy(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n }\n\n private setupResizeObserver(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n \n this.resizeObserver = new ResizeObserver(() => {\n this.ngZone.run(() => {\n this.calculateStickyPositions();\n });\n });\n\n if (this.stickyHeaders) {\n this.stickyHeaders.changes.subscribe(() => {\n this.observeHeaders();\n // Also recalculate immediately\n setTimeout(() => this.calculateStickyPositions());\n });\n this.observeHeaders();\n }\n }\n\n private observeHeaders(): void {\n if (!this.resizeObserver || !this.stickyHeaders) return;\n this.stickyHeaders.forEach(header => {\n this.resizeObserver!.observe(header.nativeElement);\n });\n }\n \n loadData(): void {\n if (!this.config?.apiUrl) return;\n \n this.loading = true;\n let params: HttpParams;\n\n // --- Query Params Construction ---\n if (this.config.queryParamsConfig) {\n const qpConfig = this.config.queryParamsConfig;\n const pageKey = qpConfig.pageKey || 'page';\n const sizeKey = qpConfig.sizeKey || 'pageSize';\n const pageIndex = this.currentPage + (qpConfig.pageIndexOffset || 0);\n\n let paramsObj: any = {\n [pageKey]: pageIndex.toString(),\n [sizeKey]: (this.config.pagination?.pageSize || 10).toString()\n };\n\n if (this.activeSort.key) paramsObj['sortBy'] = this.activeSort.key;\n // Note: Some APIs might use different keys for sort/order, can be extended later if needed\n if (this.activeSort.direction) paramsObj['orderBy'] = this.activeSort.direction;\n \n // Search Handling\n if (this.searchTerm) {\n const searchConfig = this.config.searchConfig;\n const searchKey = searchConfig?.searchKey || 'search';\n \n if (searchConfig?.handling === 'nested_string' && qpConfig.nestedStringConfig) {\n // Will be handled in nested string construction below\n } else {\n paramsObj[searchKey] = this.searchTerm;\n }\n }\n\n // Filter Handling (and Search if nested)\n if (qpConfig.filterHandling === 'nested_string' && qpConfig.nestedStringConfig) {\n const { paramName, baseValue, separator, assignment } = qpConfig.nestedStringConfig;\n let nestedString = baseValue || '';\n const assign = assignment || '=';\n\n // Add Filters\n Object.keys(this.activeFilters).forEach(key => {\n if (this.activeFilters[key]) {\n const prefix = nestedString ? separator : '';\n nestedString += `${prefix}${key}${assign}${this.activeFilters[key]}`;\n }\n });\n \n // Add Search if nested\n if (this.searchTerm && this.config.searchConfig?.handling === 'nested_string') {\n const searchKey = this.config.searchConfig.searchKey || 'SEARCH_TERM';\n const prefix = nestedString ? separator : '';\n nestedString += `${prefix}${searchKey}${assign}${this.searchTerm}`;\n }\n\n paramsObj[paramName] = nestedString;\n } else {\n // Standard handling\n Object.keys(this.activeFilters).forEach(key => {\n if (this.activeFilters[key]) paramsObj[key] = this.activeFilters[key];\n });\n }\n params = new HttpParams({ fromObject: paramsObj });\n\n } else {\n // --- Default Behavior (Backward Compatibility) ---\n let paramsObj: any = {};\n \n if (this.config.pagination?.enabled) {\n paramsObj['page'] = this.currentPage;\n paramsObj['pageSize'] = this.config.pagination.pageSize;\n }\n\n if (this.activeSort.key) {\n paramsObj['sortBy'] = this.activeSort.key;\n paramsObj['orderBy'] = this.activeSort.direction;\n }\n\n if (this.searchTerm) {\n const searchKey = this.config.searchConfig?.searchKey || 'search';\n paramsObj[searchKey] = this.searchTerm;\n }\n\n Object.keys(this.activeFilters).forEach(key => {\n if (this.activeFilters[key]) {\n paramsObj[key] = this.activeFilters[key];\n }\n });\n\n // Custom Request Params Mapper (if provided)\n if (this.config.requestParams) {\n const customParams = this.config.requestParams(\n this.currentPage, \n this.config.pagination?.pageSize || 10, \n this.activeSort.key, \n this.activeSort.direction, \n this.searchTerm, \n this.activeFilters\n );\n if (customParams instanceof HttpParams) {\n // If function returns HttpParams, use it directly (caveat: might lose previous params if not careful in mapper)\n params = customParams;\n } else {\n paramsObj = { ...paramsObj, ...customParams };\n params = new HttpParams({ fromObject: paramsObj });\n }\n } else {\n params = new HttpParams({ fromObject: paramsObj });\n }\n }\n\n // --- Data Fetching ---\n \n // Check for separate count API\n const totalCountConfig = this.config.pagination?.totalCountConfig;\n let request$: any; // Observable\n\n if (totalCountConfig?.source === 'separate' && totalCountConfig.apiUrl) {\n const headers = this.getHeaders();\n const method = this.config.apiMethod || 'GET';\n const body = this.config.apiPayload || {};\n\n const dataRequest$ = method === 'POST' ? this.http.post<any>(this.config.apiUrl, body, { params, headers }) : this.http.get<any>(this.config.apiUrl, { params, headers });\n const countRequest$ = method === 'POST' ? this.http.post<any>(totalCountConfig.apiUrl, body, { params, headers }) : this.http.get<any>(totalCountConfig.apiUrl, { params, headers });\n\n request$ = forkJoin({\n data: dataRequest$,\n count: countRequest$\n }).pipe(\n map(({ data, count }) => {\n const dataPath = this.config.dataResponsePath !== undefined ? this.config.dataResponsePath : '';\n return {\n data: this.getValueByPath(data, dataPath),\n total: this.getValueByPath(count, totalCountConfig.responsePath || '')\n };\n })\n );\n } else {\n \n const headers = this.getHeaders();\n const method = this.config.apiMethod || 'GET';\n const body = this.config.apiPayload || {};\n \n const baseRequest$ = method === 'POST' ? this.http.post<any>(this.config.apiUrl, body, { params, headers }) : this.http.get<any>(this.config.apiUrl, { params, headers });\n\n request$ = baseRequest$.pipe(\n map(response => {\n const dataPath = this.config.dataResponsePath !== undefined ? this.config.dataResponsePath : '';\n const totalPath = totalCountConfig?.responsePath || '';\n return {\n data: this.getValueByPath(response, dataPath),\n // If source is 'same', try to get total from response, else default 0\n total: totalCountConfig ? this.getValueByPath(response, totalPath) : 0\n };\n })\n );\n }\n\n request$.pipe(\n finalize(() => this.loading = false),\n catchError(err => {\n console.error('Table Data Fetch Error', err);\n return of({ data: [], total: 0 }); \n })\n )\n .subscribe((result: any) => {\n this.data = result.data || [];\n if (this.config.pagination) {\n this.totalItems = result.total || 0;\n }\n\n // Dynamic Column Generation\n if (!this.config.columns || this.config.columns.length === 0) {\n if (this.data.length > 0) {\n this.config.columns = Object.keys(this.data[0]).map(key => ({\n key: key,\n label: this.toTitleCase(key),\n type: 'text',\n sortable: false,\n editable: false\n }));\n }\n }\n });\n }\n\n // --- Actions ---\n\n onPageChange(page: number): void {\n this.currentPage = page;\n this.loadData();\n }\n\n onPageSizeChange(size: number): void {\n if (this.config.pagination) {\n this.config.pagination.pageSize = size;\n this.currentPage = 1; // Reset to first page\n this.loadData();\n }\n }\n\n onSort(col: TableColumn): void {\n if (!col.sortable) return;\n\n if (this.activeSort.key === col.key) {\n this.activeSort.direction = this.activeSort.direction === 'ASC' ? 'DESC' : 'ASC';\n } else {\n this.activeSort.key = col.key;\n this.activeSort.direction = 'ASC';\n }\n this.loadData();\n }\n\n onSearch(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.searchSubject.next(value);\n }\n\n onFilterChange(key: string, event: Event): void {\n const value = (event.target as HTMLSelectElement).value;\n this.activeFilters[key] = value;\n this.currentPage = 1;\n this.filterChange.emit({ key, value });\n this.loadData();\n }\n \n onAction(action: TableAction, row: any): void {\n if (action.type === 'callback' && action.callback) {\n action.callback(row);\n }\n \n if (action.type === 'route' && action.route) {\n const url = this.replaceParams(action.route, row);\n this.router.navigateByUrl(url);\n return;\n }\n\n if (action.type === 'api') {\n if (action.confirmationNeeded) {\n const message = action.confirmationMessage || this.config.labels?.defaultConfirmationMessage || 'Are you sure?';\n if (!confirm(message)) return;\n }\n if (action.apiUrl) {\n this.executeApiAction(action, row);\n } else {\n this.action.emit({ action, row });\n }\n } else {\n this.action.emit({ action, row });\n }\n }\n\n onActionItemClick(item: any, row: any, event: Event): void {\n event.stopPropagation();\n \n if (item.type === 'callback' && item.callback) {\n item.callback(row);\n }\n \n if (item.type === 'route' && item.route) {\n const url = this.replaceParams(item.route, row);\n this.router.navigateByUrl(url);\n return;\n }\n\n if (item.type === 'api') {\n if (item.confirmationNeeded) {\n const message = item.confirmationMessage || this.config.labels?.defaultConfirmationMessage || 'Are you sure?';\n if (!confirm(message)) return;\n }\n if (item.apiUrl) {\n this.executeApiAction(item as TableAction, row);\n } else {\n this.action.emit({ action: item as TableAction, row });\n }\n } else {\n this.action.emit({ action: item as TableAction, row });\n }\n }\n\n onTopAction(action: TableAction): void {\n if (action.type === 'callback' && action.callback) {\n action.callback(null); // No row for top action\n }\n \n if (action.type === 'route' && action.route) {\n // Since it's a top action, replaceParams with an empty object or handle statically \n const url = this.replaceParams(action.route, {});\n this.router.navigateByUrl(url);\n return;\n }\n\n if (action.type === 'api') {\n if (action.confirmationNeeded) {\n const message = action.confirmationMessage || this.config.labels?.defaultConfirmationMessage || 'Are you sure?';\n if (!confirm(message)) return;\n }\n if (action.apiUrl) {\n this.executeApiAction(action, null);\n } else {\n this.topAction.emit(action);\n }\n } else {\n this.topAction.emit(action);\n }\n }\n\n private executeApiAction(action: TableAction, row: any): void {\n if (!action.apiUrl) return;\n \n const url = row ? this.replaceParams(action.apiUrl, row) : action.apiUrl;\n const method = action.apiMethod || 'POST';\n const headers = this.getHeaders();\n const body = row ? row : {};\n \n this.loading = true;\n this.http.request(method, url, { body, headers }).pipe(\n finalize(() => this.loading = false)\n ).subscribe({\n next: () => {\n this.loadData(); // reload on success\n if (row) {\n this.action.emit({ action, row });\n } else {\n this.topAction.emit(action);\n }\n },\n error: (err) => {\n console.error('API Action Error', err);\n }\n });\n }\n\n // --- Selection ---\n\n onSelectAll(event: Event): void {\n const checked = (event.target as HTMLInputElement).checked;\n this.data.forEach(row => row.selected = checked);\n this.updateSelectedRows();\n }\n \n onRowSelect(row: any): void {\n this.updateSelectedRows();\n }\n \n updateSelectedRows(): void {\n this.selectedRows = this.data.filter(row => row.selected);\n this.rowSelect.emit(this.selectedRows);\n }\n\n // --- Helpers ---\n\n getCellValue(row: any, col: TableColumn): any {\n // Support nested properties via labelPath or key\n const path = col.labelPath || col.key;\n let val = this.getValueByPath(row, path);\n \n // Formatting (Date, etc.)\n if (col.type === 'date' && val) {\n if (col.dateFormat) {\n try {\n return formatDate(val, col.dateFormat, this.locale);\n } catch (e) {\n console.warn('Invalid date format or value', val, col.dateFormat);\n return val;\n }\n }\n return new Date(val).toLocaleDateString();\n }\n return val;\n }\n\n getBadgeClass(row: any, col: TableColumn): string {\n const val = this.getCellValue(row, col);\n const strVal = String(val);\n \n // Config approach\n if (col.badgeConfig && col.badgeConfig[strVal]) {\n return `badge-${col.badgeConfig[strVal]}`;\n }\n\n // Default Logic\n const status = strVal.toLowerCase();\n \n if (['active', 'completed', 'success', 'approved'].includes(status)) return 'badge-success';\n if (['pending', 'in progress', 'waiting'].includes(status)) return 'badge-warning';\n if (['rejected', 'failed', 'error', 'deleted'].includes(status)) return 'badge-danger';\n if (['draft', 'inactive'].includes(status)) return 'badge-neutral';\n \n return 'badge-info'; // default\n }\n \n getSortIcon(key: string): string {\n if (this.activeSort.key !== key) return 'fa-sort';\n return this.activeSort.direction === 'ASC' ? 'fa-sort-up' : 'fa-sort-down';\n }\n\n private replaceParams(template: string, row: any): string {\n return template.replace(/:([a-zA-Z0-9_]+)/g, (_, key) => row[key] || '');\n }\n \n private loadFilterOptions(): void {\n if (!this.config.filters) return;\n\n this.config.filters.forEach(filter => {\n if (filter.apiUrl && !filter.options) {\n const headers = this.getHeaders();\n let params = new HttpParams();\n\n if (filter.handling === 'nested_string' && filter.nestedStringConfig) {\n const { paramName, baseValue } = filter.nestedStringConfig;\n if (baseValue) {\n params = params.set(paramName, baseValue);\n }\n }\n\n const method = filter.apiMethod || 'GET';\n const body = filter.apiPayload || {};\n \n const request$ = method === 'POST' \n ? this.http.post<any>(filter.apiUrl, body, { headers, params }) \n : this.http.get<any>(filter.apiUrl, { headers, params });\n\n request$.subscribe({\n next: (response) => {\n const data = filter.dataPath ? this.getValueByPath(response, filter.dataPath) : response;\n if (!Array.isArray(data)) {\n console.error(`Filter data for ${filter.key} is not an array`, data);\n return;\n }\n filter.options = data.map((item: any) => {\n const label = filter.labelPath ? this.getValueByPath(item, filter.labelPath) :\n (filter.labelKey ? item[filter.labelKey] : item.label || item.name);\n const value = filter.valuePath ? this.getValueByPath(item, filter.valuePath) :\n (filter.valueKey ? item[filter.valueKey] : item.value || item.code);\n return { label, value };\n });\n\n // Auto-populate matching column options\n if (this.config.columns) {\n const matchingColumn = this.config.columns.find(col => col.key === filter.key);\n if (matchingColumn && matchingColumn.dataType === 'select' && !matchingColumn.options) {\n matchingColumn.options = filter.options;\n }\n }\n },\n error: (err) => console.error(`Failed to load filter options for ${filter.key}:`, err)\n });\n }\n });\n }\n\n private getValueByPath(obj: any, path: string): any {\n if (!path || path === '') return obj;\n return path.split('.').reduce((acc, part) => {\n const match = part.match(/(\\w+)\\[(\\d+)\\]/);\n if (match) {\n return acc?.[match[1]]?.[parseInt(match[2])];\n }\n return acc?.[part];\n }, obj);\n }\n\n private calculateStickyPositions(): void {\n // We calculate positions based on rendered widths\n if (!this.stickyHeaders || this.stickyHeaders.length === 0) return;\n\n this.stickyColumnStyles = {};\n let leftOffset = 0;\n this.hasStickyColumns = false;\n\n // Default sticky columns count is 3 if not specified\n const stickyCount = this.config.stickyColumnCount !== undefined ? this.config.stickyColumnCount : 3;\n\n // Checkbox width handling\n if (this.config.selectable) {\n const firstSticky = this.config.columns.find((c, i) => i < stickyCount || c.sticky);\n if (firstSticky) {\n // We can try to measure checkbox col if needed, but usually fixed 40px\n // Or better, if we have a checkbox col ref, assume 40px for now as it is fixed in CSS\n leftOffset = 40; \n }\n }\n\n const headerElements = this.stickyHeaders.toArray();\n\n this.config.columns.forEach((col, index) => {\n if (col.sticky || index < stickyCount) {\n col.sticky = true;\n this.hasStickyColumns = false; // Reset to true only after we set styles? No, wait. \n // Actually property is used in template to add class 'sticky-col'\n // but we need to update Styles based on previous cols widths\n \n // Find corresponding header element\n // Note: headerElements corresponds to columns indices\n const headerEl = headerElements[index]?.nativeElement;\n \n if (headerEl) {\n // Set style for current column\n this.stickyColumnStyles[col.key] = { \n left: `${leftOffset}px`\n // We DO NOT set width here, allowing it to be dynamic/auto\n };\n \n // Add THIS column's width to offset for the NEXT column\n // use getBoundingClientRect or offsetWidth\n leftOffset += headerEl.offsetWidth;\n }\n this.hasStickyColumns = true;\n }\n });\n \n this.cdr.detectChanges();\n }\n\n private toTitleCase(str: string): string {\n return str\n .replace(/([A-Z])/g, ' $1') // insert space before capital letters\n .replace(/^./, (str) => str.toUpperCase()) // capitalize the first letter\n .trim(); // remove any leading/trailing whitespace\n }\n \n get columnCount(): number {\n return this.config.columns.length;\n }\n\n onColumnClick(row: any, col: TableColumn): void {\n if (col.clickAction === 'callback') {\n this.columnClick.emit({ row, column: col.key });\n } else if (col.clickAction === 'route' && col.clickRoute) {\n const url = this.replaceParams(col.clickRoute, row);\n this.router.navigateByUrl(url);\n }\n }\n\n private getHeaders(): HttpHeaders {\n let headers = new HttpHeaders();\n if (this.config.token) {\n const headerName = this.config.tokenHeader || 'Authorization';\n headers = headers.set(headerName, this.config.token);\n }\n return headers;\n }\n\n toggleDropdown(id: string, event: Event): void {\n event.stopPropagation();\n this.openDropdownId = this.openDropdownId === id ? null : id;\n }\n\n @HostListener('document:click')\n closeDropdown(): void {\n this.openDropdownId = null;\n }\n}\n","<div class=\"smart-table-wrapper\">\n <!-- Top Toolbar -->\n <div class=\"st-toolbar\" *ngIf=\"config.searchConfig?.enabled || (config.filters && config.filters.length > 0) || (config.topBarButtons && config.topBarButtons.length > 0)\">\n \n <!-- Search -->\n <div class=\"st-search\" *ngIf=\"config.searchConfig?.enabled\">\n <i class=\"fa fa-search\"></i>\n <input type=\"text\" [placeholder]=\"config.labels?.searchPlaceholder || 'Search'\" (input)=\"onSearch($event)\">\n </div>\n\n <!-- Filters -->\n <div class=\"st-filters\" *ngIf=\"config.filters\">\n <div class=\"st-filter-item\" *ngFor=\"let filter of config.filters\">\n <select (change)=\"onFilterChange(filter.key, $event)\">\n <option value=\"\">{{ filter.label }}</option>\n <option *ngFor=\"let opt of filter.options\" [value]=\"opt.value\">{{ opt.label }}</option>\n </select>\n </div>\n </div>\n\n <!-- Top Bar Buttons -->\n <div class=\"st-actions\" *ngIf=\"config.topBarButtons\">\n <lib-button *ngFor=\"let btn of config.topBarButtons\" \n [variant]=\"btn.btnVariant || 'primary'\"\n [icon]=\"btn.icon || ''\"\n (click)=\"onTopAction(btn)\">\n {{ btn.label }}\n </lib-button>\n </div>\n </div>\n\n <!-- Table Container -->\n <div class=\"st-table-container\">\n <div class=\"st-check-loader\" *ngIf=\"loading\">\n <div class=\"spinner\"></div>\n </div>\n <table class=\"st-table\" [class.loading-data]=\"loading\">\n <thead>\n <tr>\n <th *ngIf=\"config.selectable\" class=\"st-checkbox-col\">\n <input type=\"checkbox\" (change)=\"onSelectAll($event)\">\n </th>\n <th *ngFor=\"let col of config.columns\" \n #stickyHeader\n [class.sortable]=\"col.sortable\"\n [class.sticky-col]=\"col.sticky\"\n [ngStyle]=\"stickyColumnStyles[col.key]\"\n (click)=\"onSort(col)\">\n {{ col.label }}\n <span *ngIf=\"col.sortable\" class=\"sort-icon\">\n <i class=\"fa\" [ngClass]=\"getSortIcon(col.key)\"></i>\n </span>\n </th>\n <th *ngIf=\"config.actions && config.actions.length > 0\">{{ config.labels?.actionColumnHeader || 'Actions' }}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of data; let rowIndex = index\">\n <td *ngIf=\"config.selectable\" class=\"st-checkbox-col\">\n <input type=\"checkbox\" [(ngModel)]=\"row.selected\" (change)=\"onRowSelect(row)\">\n </td>\n <td *ngFor=\"let col of config.columns\" \n [class.sticky-col]=\"col.sticky\" \n [ngStyle]=\"stickyColumnStyles[col.key]\"\n [class.clickable-cell]=\"col.clickAction\"\n (click)=\"onColumnClick(row, col)\">\n <!-- Text/Number/Date -->\n <span *ngIf=\"col.type !== 'custom' && col.type !== 'html' && col.type !== 'badge'\">\n {{ getCellValue(row, col) }}\n </span>\n <!-- HTML -->\n <div *ngIf=\"col.type === 'html'\" [innerHTML]=\"getCellValue(row, col)\"></div>\n <!-- Badge -->\n <span *ngIf=\"col.type === 'badge'\" class=\"st-badge\" [ngClass]=\"getBadgeClass(row, col)\">\n {{ getCellValue(row, col) }}\n </span>\n </td>\n \n <!-- Row Actions -->\n <td *ngIf=\"config.actions && config.actions.length > 0\" class=\"st-row-actions\">\n <div class=\"action-buttons\">\n <ng-container *ngFor=\"let action of config.actions; let i = index\">\n <ng-container *ngIf=\"action.type === 'dropdown'\">\n <div class=\"st-dropdown-container\" (click)=\"$event.stopPropagation()\">\n <button class=\"st-dropdown-btn\" (click)=\"toggleDropdown(rowIndex + '-' + i, $event)\">\n <i [class]=\"action.icon || 'fa fa-ellipsis-h'\"></i>\n </button>\n <div class=\"st-dropdown-menu\" *ngIf=\"openDropdownId === (rowIndex + '-' + i)\">\n <button class=\"st-dropdown-item\" *ngFor=\"let item of action.items\" (click)=\"onActionItemClick(item, row, $event); closeDropdown()\">\n <i *ngIf=\"item.icon\" [class]=\"item.icon + ' st-action-icon'\"></i>\n <span>{{ item.label }}</span>\n </button>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"action.type !== 'dropdown'\">\n <lib-button \n [variant]=\"action.btnVariant || 'secondary'\"\n [icon]=\"action.icon || ''\"\n (click)=\"onAction(action, row)\">\n {{ action.label }}\n </lib-button>\n </ng-container>\n </ng-container>\n </div>\n </td>\n </tr>\n <tr *ngIf=\"data.length === 0 && !loading\">\n <td [attr.colspan]=\"columnCount + (config.selectable ? 1 : 0) + (config.actions ? 1 : 0)\" class=\"no-data\">\n {{ config.labels?.noDataMessage || 'No data available' }}\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <!-- Pagination -->\n <div class=\"st-pagination\" *ngIf=\"config.pagination && config.pagination.enabled\">\n <lib-pagination\n [totalItems]=\"totalItems\"\n [itemsPerPage]=\"config.pagination.pageSize\"\n [currentPage]=\"currentPage\"\n [pageSizeOptions]=\"config.pagination.pageSizeOptions\"\n (pageChange)=\"onPageChange($event)\"\n (itemsPerPageChange)=\"onPageSizeChange($event)\">\n </lib-pagination>\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { SmartTableComponent } from './components/smart-table/smart-table.component';\nimport { PaginationModule } from '../pagination/pagination.module';\nimport { ButtonModule } from '../button/button.module';\nimport { MaterialModule } from '../material/material.module';\n\n\n@NgModule({\n declarations: [\n SmartTableComponent\n ],\n imports: [\n CommonModule,\n FormsModule,\n PaginationModule,\n ButtonModule,\n MaterialModule\n ],\n exports: [\n SmartTableComponent\n ]\n})\nexport class SmartTableModule { }\n","export function appendBaseUrlRecursively(obj: any, baseURL: string): void {\n if (obj && typeof obj === 'object') {\n if (obj.apiUrl && typeof obj.apiUrl === 'string' && !obj.apiUrl.startsWith('http://') && !obj.apiUrl.startsWith('https://')) {\n let finalApiUrl = obj.apiUrl;\n if (baseURL.endsWith('/') && finalApiUrl.startsWith('/')) {\n finalApiUrl = finalApiUrl.substring(1);\n } else if (!baseURL.endsWith('/') && !finalApiUrl.startsWith('/')) {\n finalApiUrl = '/' + finalApiUrl;\n }\n obj.apiUrl = baseURL + finalApiUrl;\n }\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n appendBaseUrlRecursively(obj[key], baseURL);\n }\n }\n }\n}\n","import { AbstractControl, FormGroup, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\nexport class ValidationUtils {\r\n\r\n\r\n\r\n static email(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) return null;\r\n const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;\r\n return emailRegex.test(control.value) ? null : { email: true };\r\n };\r\n }\r\n\r\n static phone(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) return null;\r\n const phoneRegex = /^\\+?[\\d\\s\\-\\(\\)]{10,}$/;\r\n return phoneRegex.test(control.value) ? null : { phone: true };\r\n };\r\n }\r\n\r\n static url(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) return null;\r\n const urlRegex = /^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$/;\r\n return urlRegex.test(control.value) ? null : { url: true };\r\n };\r\n }\r\n\r\n static minLength(min: number): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) return null;\r\n return control.value.length >= min ? null : { minLength: { min, actual: control.value.length } };\r\n };\r\n }\r\n\r\n static maxLength(max: number): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) return null;\r\n return control.value.length <= max ? null : { maxLength: { max, actual: control.value.length } };\r\n };\r\n }\r\n\r\n static pattern(pattern: string, message?: string): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) return null;\r\n const regex = new RegExp(pattern);\r\n return regex.test(control.value) ? null : { pattern: { message: message || 'Invalid format' } };\r\n };\r\n }\r\n\r\n static numberRange(min?: number, max?: number): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value && control.value !== 0) return null;\r\n const value = Number(control.value);\r\n if (min !== undefined && value < min) {\r\n return { min: { min, actual: value } };\r\n }\r\n if (max !== undefined && value > max) {\r\n return { max: { max, actual: value } };\r\n }\r\n return null;\r\n };\r\n }\r\n\r\n static dateRange(minDate?: string, maxDate?: string): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) return null;\r\n const date = new Date(control.value);\r\n if (minDate && date < new Date(minDate)) {\r\n return { minDate: { minDate } };\r\n }\r\n if (maxDate && date > new Date(maxDate)) {\r\n return { maxDate: { maxDate } };\r\n }\r\n return null;\r\n };\r\n }\r\n\r\n static getErrorMessage(errors: ValidationErrors | null): string {\r\n if (!errors) return '';\r\n\r\n if (errors['required']) return 'This field is required';\r\n if (errors['email']) return 'Please enter a valid email address';\r\n if (errors['phone']) return 'Please enter a valid phone number';\r\n if (errors['url']) return 'Please enter a valid URL';\r\n if (errors['minLength']) return `Minimum length is ${errors['minLength'].min} characters`;\r\n if (errors['maxLength']) return `Maximum length is ${errors['maxLength'].max} characters`;\r\n if (errors['min']) return `Minimum value is ${errors['min'].min}`;\r\n if (errors['max']) return `Maximum value is ${errors['max'].max}`;\r\n if (errors['minDate']) return `Date must be after ${errors['minDate'].minDate}`;\r\n if (errors['maxDate']) return `Date must be before ${errors['maxDate'].maxDate}`;\r\n if (errors['pattern']) return errors['pattern'].message || 'Invalid format';\r\n\r\n return 'Invalid value';\r\n }\r\n}\r\n","export const SAMPLE_FORMS = {\r\n // Simple Contact Form\r\n contactForm: `{\r\n \"entityType\": \"CONTACT\",\r\n \"label\": \"Contact Us\",\r\n \"description\": \"Send us a message\",\r\n \"formType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"children\": [\r\n {\r\n \"name\": \"name\",\r\n \"label\": \"Full Name\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true,\r\n \"hint\": \"Enter your full name\"\r\n },\r\n {\r\n \"name\": \"email\",\r\n \"label\": \"Email Address\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"EMAIL\",\r\n \"required\": true,\r\n \"hint\": \"your.email@example.com\"\r\n },\r\n {\r\n \"name\": \"meetingTime\",\r\n \"label\": \"Meeting Time\",\r\n \"type\": \"TIME\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"placeholder\": \"Select a time\"\r\n },\r\n {\r\n \"name\": \"message\",\r\n \"label\": \"Message\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"LONG\",\r\n \"required\": true,\r\n \"textConfig\": {\r\n \"length\": {\r\n \"min\": 10,\r\n \"max\": 500\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }`,\r\n\r\n // User Registration with Stepper\r\n registrationForm: `{\r\n \"entityType\": \"USER\",\r\n \"label\": \"User Registration\",\r\n \"description\": \"Create your account\",\r\n \"formType\": \"STEPPER\",\r\n \"stepperConfig\": {\r\n \"children\": [\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"Personal Information\",\r\n \"children\": [\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"firstName\",\r\n \"label\": \"First Name\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true\r\n },\r\n {\r\n \"name\": \"lastName\",\r\n \"label\": \"Last Name\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"fullName\",\r\n \"label\": \"Full Name\",\r\n \"type\": \"GENERATED\",\r\n \"subType\": \"FORMULA\",\r\n \"generatedConfig\": {\r\n \"formula\": \"function fullName(first, last) { return (first || '') + ' ' + (last || ''); }\",\r\n \"variables\": [\"firstName\", \"lastName\"]\r\n }\r\n },\r\n {\r\n \"name\": \"dateOfBirth\",\r\n \"label\": \"Date of Birth\",\r\n \"type\": \"DATE\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"dateConfig\": {\r\n \"allowFuture\": false\r\n }\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"Contact Information\",\r\n \"children\": [\r\n {\r\n \"name\": \"email\",\r\n \"label\": \"Email\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"EMAIL\",\r\n \"required\": true\r\n },\r\n {\r\n \"name\": \"phone\",\r\n \"label\": \"Phone Number\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"PHONE\",\r\n \"required\": true\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"Preferences\",\r\n \"children\": [\r\n {\r\n \"name\": \"notifications\",\r\n \"label\": \"Enable Email Notifications\",\r\n \"type\": \"SWITCH\",\r\n \"subType\": \"BOOL\",\r\n \"defaultValue\": true\r\n },\r\n {\r\n \"name\": \"interests\",\r\n \"label\": \"Interests\",\r\n \"type\": \"CHIP\",\r\n \"subType\": \"MULTIPLE\",\r\n \"optionConfig\": {\r\n \"optionList\": [\r\n { \"label\": \"Technology\", \"code\": \"TECH\" },\r\n { \"label\": \"Sports\", \"code\": \"SPORTS\" },\r\n { \"label\": \"Music\", \"code\": \"MUSIC\" },\r\n { \"label\": \"Travel\", \"code\": \"TRAVEL\" }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n ],\r\n \"showStep\": true,\r\n \"isHorizontal\": true\r\n }\r\n }`,\r\n\r\n // Survey Form with Conditional Fields\r\n surveyForm: `{\r\n \"entityType\": \"SURVEY\",\r\n \"label\": \"Customer Satisfaction Survey\",\r\n \"formType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"children\": [\r\n {\r\n \"name\": \"overallRating\",\r\n \"label\": \"Overall Experience\",\r\n \"type\": \"RATING\",\r\n \"subType\": \"STAR\",\r\n \"required\": true,\r\n \"ratingConfig\": {\r\n \"maxRating\": 5,\r\n \"allowHalf\": false\r\n }\r\n },\r\n {\r\n \"name\": \"wouldRecommend\",\r\n \"label\": \"Would you recommend us?\",\r\n \"type\": \"RADIO\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"optionConfig\": {\r\n \"optionList\": [\r\n { \"label\": \"Yes\", \"code\": \"YES\" },\r\n { \"label\": \"No\", \"code\": \"NO\" },\r\n { \"label\": \"Maybe\", \"code\": \"MAYBE\" }\r\n ]\r\n }\r\n },\r\n {\r\n \"name\": \"reasonForNo\",\r\n \"label\": \"Why not?\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"LONG\",\r\n \"visibilityExpression\": \"wouldRecommend === 'NO'\",\r\n \"required\": true\r\n },\r\n {\r\n \"name\": \"improvements\",\r\n \"label\": \"What can we improve?\",\r\n \"type\": \"CHECKBOX\",\r\n \"subType\": \"LIST\",\r\n \"optionConfig\": {\r\n \"optionList\": [\r\n { \"label\": \"Customer Service\", \"code\": \"SERVICE\" },\r\n { \"label\": \"Product Quality\", \"code\": \"QUALITY\" },\r\n { \"label\": \"Pricing\", \"code\": \"PRICE\" },\r\n { \"label\": \"Delivery Speed\", \"code\": \"DELIVERY\" }\r\n ]\r\n }\r\n },\r\n {\r\n \"name\": \"additionalComments\",\r\n \"label\": \"Additional Comments\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"LONG\",\r\n \"textConfig\": {\r\n \"length\": {\r\n \"max\": 1000\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }`,\r\n\r\n // Job Application Form\r\n jobApplicationForm: `{\r\n \"entityType\": \"JOB_APPLICATION\",\r\n \"label\": \"Job Application\",\r\n \"description\": \"Apply for a position at our company\",\r\n \"formType\": \"STEPPER\",\r\n \"stepperConfig\": {\r\n \"children\": [\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"Personal Details\",\r\n \"children\": [\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"firstName\",\r\n \"label\": \"First Name\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true\r\n },\r\n {\r\n \"name\": \"lastName\",\r\n \"label\": \"Last Name\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"email\",\r\n \"label\": \"Email\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"EMAIL\",\r\n \"required\": true\r\n },\r\n {\r\n \"name\": \"phone\",\r\n \"label\": \"Phone\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"PHONE\",\r\n \"required\": true\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"Experience\",\r\n \"allowMulti\": true,\r\n \"name\": \"experienceList\",\r\n \"children\": [\r\n {\r\n \"name\": \"company\",\r\n \"label\": \"Company Name\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true\r\n },\r\n {\r\n \"name\": \"position\",\r\n \"label\": \"Position\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true\r\n },\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"startDate\",\r\n \"label\": \"Start Date\",\r\n \"type\": \"DATE\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true\r\n },\r\n {\r\n \"name\": \"endDate\",\r\n \"label\": \"End Date\",\r\n \"type\": \"DATE\",\r\n \"subType\": \"SINGLE\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"responsibilities\",\r\n \"label\": \"Key Responsibilities\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"LONG\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"Skills & Qualifications\",\r\n \"children\": [\r\n {\r\n \"name\": \"skills\",\r\n \"label\": \"Technical Skills\",\r\n \"type\": \"CHIP\",\r\n \"subType\": \"MULTIPLE\",\r\n \"optionConfig\": {\r\n \"optionList\": [\r\n { \"label\": \"JavaScript\", \"code\": \"JS\" },\r\n { \"label\": \"TypeScript\", \"code\": \"TS\" },\r\n { \"label\": \"Angular\", \"code\": \"ANGULAR\" },\r\n { \"label\": \"React\", \"code\": \"REACT\" },\r\n { \"label\": \"Node.js\", \"code\": \"NODE\" },\r\n { \"label\": \"Python\", \"code\": \"PYTHON\" }\r\n ]\r\n }\r\n },\r\n {\r\n \"name\": \"yearsOfExperience\",\r\n \"label\": \"Years of Experience\",\r\n \"type\": \"NUMBER_INPUT\",\r\n \"subType\": \"INTEGER\",\r\n \"required\": true,\r\n \"numberConfig\": {\r\n \"min\": 0,\r\n \"max\": 50\r\n }\r\n },\r\n {\r\n \"name\": \"availableToStart\",\r\n \"label\": \"Available to Start\",\r\n \"type\": \"DATE\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"dateConfig\": {\r\n \"allowFuture\": true\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n ],\r\n \"showStep\": true,\r\n \"isHorizontal\": true\r\n }\r\n }`,\r\n\r\n // Donor Form based on UI\r\n donorForm: `{\r\n \"entityType\": \"DONOR\",\r\n \"label\": \"Donor Form\",\r\n \"formType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"children\": [\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"Donor Details\",\r\n \"name\": \"donorDetails\",\r\n \"children\": [\r\n {\r\n \"name\": \"legalName\",\r\n \"label\": \"Donor Legal Name\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true,\r\n \"placeholder\": \"Enter the name\"\r\n },\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"shortCode\",\r\n \"label\": \"Donor Short Code\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"colSpan\": 3,\r\n \"disabled\": true,\r\n \"defaultValue\": \"DLP-24-L1\",\r\n \"hint\": \"System-generated, unique internal code\"\r\n },\r\n {\r\n \"name\": \"donorType\",\r\n \"label\": \"Donor Type\",\r\n \"type\": \"DROPDOWN\",\r\n \"subType\": \"SINGLE\",\r\n \"colSpan\": 3,\r\n \"required\": true,\r\n \"placeholder\": \"Select\",\r\n \"optionConfig\": {\r\n \"optionList\": [\r\n { \"label\": \"Individual\", \"code\": \"INDIVIDUAL\" },\r\n { \"label\": \"Corporate\", \"code\": \"CORPORATE\" },\r\n { \"label\": \"Trust\", \"code\": \"TRUST\" }\r\n ]\r\n }\r\n },\r\n {\r\n \"name\": \"regNumber\",\r\n \"label\": \"Registration / Legal Entity Number\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"colSpan\": 3,\r\n \"placeholder\": \"Type\",\r\n \"hint\": \"CIN / Trust Reg. No / Govt ID (if applicable)\"\r\n },\r\n {\r\n \"name\": \"country\",\r\n \"label\": \"Country of Incorporation\",\r\n \"type\": \"DROPDOWN\",\r\n \"subType\": \"SINGLE\",\r\n \"colSpan\": 3,\r\n \"required\": true,\r\n \"placeholder\": \"Select\",\r\n \"optionConfig\": {\r\n \"optionList\": [\r\n { \"label\": \"India\", \"code\": \"IN\" },\r\n { \"label\": \"USA\", \"code\": \"US\" },\r\n { \"label\": \"UK\", \"code\": \"UK\" }\r\n ]\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"profilePicture\",\r\n \"label\": \"Profile Picture\",\r\n \"type\": \"FILE_UPLOAD\",\r\n \"subType\": \"SINGLE\",\r\n \"colSpan\": 3,\r\n \"attachmentConfig\": {\r\n \"multiple\": false,\r\n \"maxSizeMB\": 2,\r\n \"accept\": \"image/*\",\r\n \"acceptLabel\": \"JPG, PNG, SVG (max 2 MB)\"\r\n }\r\n },\r\n {\r\n \"name\": \"website\",\r\n \"label\": \"Organization Website (Optional)\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"colSpan\": 9,\r\n \"placeholder\": \"Add your website link or LinkedIn profile\",\r\n \"hint\": \"Add your website link to automatically fetch your logo, powered by Clearbit.\"\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"Primary Contact\",\r\n \"allowMulti\": true,\r\n \"name\": \"contacts\",\r\n \"children\": [\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"contactName\",\r\n \"label\": \"Full Name\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"colSpan\": 6,\r\n \"required\": true,\r\n \"placeholder\": \"Enter the name\"\r\n },\r\n {\r\n \"name\": \"designation\",\r\n \"label\": \"Designation/Title\",\r\n \"type\": \"DROPDOWN\",\r\n \"subType\": \"SINGLE\",\r\n \"colSpan\": 6,\r\n \"required\": true,\r\n \"placeholder\": \"Select\",\r\n \"optionConfig\": {\r\n \"optionList\": [\r\n { \"label\": \"CEO\", \"code\": \"CEO\" },\r\n { \"label\": \"Manager\", \"code\": \"MANAGER\" },\r\n { \"label\": \"Other\", \"code\": \"OTHER\" }\r\n ]\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"email\",\r\n \"label\": \"Email Address\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"EMAIL\",\r\n \"colSpan\": 4,\r\n \"required\": true,\r\n \"placeholder\": \"Enter your email address\"\r\n },\r\n {\r\n \"name\": \"phone\",\r\n \"label\": \"Phone Number\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"PHONE\",\r\n \"colSpan\": 4,\r\n \"required\": true,\r\n \"placeholder\": \"+91 7007713990\"\r\n },\r\n {\r\n \"name\": \"communicationPreference\",\r\n \"label\": \"Communication Preference\",\r\n \"type\": \"RADIO\",\r\n \"subType\": \"SINGLE\",\r\n \"colSpan\": 4,\r\n \"required\": true,\r\n \"optionConfig\": {\r\n \"optionList\": [\r\n { \"label\": \"Email\", \"code\": \"EMAIL\" },\r\n { \"label\": \"Phone Number\", \"code\": \"PHONE\" }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n }`,\r\n\r\n\r\n // ──────────────────────────────────────────────────────────────────────────\r\n // User Registration Form — Basic Details / Primary Address / User Role\r\n // ──────────────────────────────────────────────────────────────────────────\r\n userBasicDetailsForm: `{\r\n \"entityType\": \"USER_REGISTRATION\",\r\n \"label\": \"User Registration\",\r\n \"description\": \"Fill in your details to create a new account\",\r\n \"formType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"children\": [\r\n\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"Basic Details\",\r\n \"name\": \"basicDetails\",\r\n \"children\": [\r\n\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"firstName\",\r\n \"label\": \"First Name\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true,\r\n \"placeholder\": \"Enter first name\"\r\n },\r\n {\r\n \"name\": \"lastName\",\r\n \"label\": \"Last Name\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true,\r\n \"placeholder\": \"Enter last name\"\r\n }\r\n ]\r\n },\r\n\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"contactNo\",\r\n \"label\": \"Contact No\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"PHONE\",\r\n \"required\": true,\r\n \"placeholder\": \"+91 9999999999\",\r\n \"hint\": \"Enter a valid 10-digit mobile number\"\r\n },\r\n {\r\n \"name\": \"emailId\",\r\n \"label\": \"Email ID\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"EMAIL\",\r\n \"required\": true,\r\n \"placeholder\": \"example@domain.com\"\r\n }\r\n ]\r\n },\r\n\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"loginId\",\r\n \"label\": \"Login / User ID\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true,\r\n \"placeholder\": \"Choose a unique login ID\",\r\n \"hint\": \"Alphanumeric, no spaces\",\r\n \"textConfig\": {\r\n \"length\": { \"min\": 4, \"max\": 30 },\r\n \"pattern\": \"^[a-zA-Z0-9_]+$\",\r\n \"patternMessage\": \"Only letters, numbers and underscores are allowed\"\r\n }\r\n },\r\n {\r\n \"name\": \"password\",\r\n \"label\": \"Password\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"PASSWORD\",\r\n \"required\": true,\r\n \"placeholder\": \"Min. 8 characters\",\r\n \"hint\": \"Use at least 8 characters with letters and numbers\",\r\n \"textConfig\": {\r\n \"length\": { \"min\": 8, \"max\": 64 }\r\n }\r\n },\r\n {\r\n \"name\": \"confirmPassword\",\r\n \"label\": \"Confirm Password\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"PASSWORD\",\r\n \"required\": true,\r\n \"placeholder\": \"Re-enter your password\",\r\n \"textConfig\": {\r\n \"matchField\": \"password\"\r\n }\r\n }\r\n ]\r\n }\r\n\r\n ]\r\n }\r\n },\r\n\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"Primary Address\",\r\n \"name\": \"primaryAddress\",\r\n \"children\": [\r\n\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"addressLine1\",\r\n \"label\": \"Address Line 1\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true,\r\n \"placeholder\": \"House / Flat No., Building, Street\"\r\n },\r\n {\r\n \"name\": \"addressLine2\",\r\n \"label\": \"Address Line 2\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"placeholder\": \"Area / Locality / Colony (optional)\"\r\n }\r\n ]\r\n },\r\n\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"country\",\r\n \"label\": \"Country\",\r\n \"type\": \"DROPDOWN\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"placeholder\": \"Select Country\",\r\n \"optionConfig\": {\r\n \"optionList\": [\r\n { \"label\": \"India\", \"code\": \"REGION_COUNTRY.INDIA\" },\r\n { \"label\": \"USA\", \"code\": \"REGION_COUNTRY.USA\" }\r\n ]\r\n }\r\n },\r\n {\r\n \"name\": \"state\",\r\n \"label\": \"State\",\r\n \"type\": \"DROPDOWN\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"placeholder\": \"Select State\",\r\n \"optionConfig\": {\r\n \"apiUrl\": \"https://dev.platformcommons.org/ctld/api/globalrefdata/v1?refClass=GREF.REGION_STATE&parentRefClass=GREF.REGION_COUNTRY\",\r\n \"labelPath\": \"label\",\r\n \"valuePath\": \"dataCode\",\r\n \"dependencies\": {\r\n \"parentRefData\": \"country\"\r\n }\r\n }\r\n },\r\n {\r\n \"name\": \"city\",\r\n \"label\": \"City\",\r\n \"type\": \"DROPDOWN\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"placeholder\": \"Select City\",\r\n \"optionConfig\": {\r\n \"apiUrl\": \"https://dev.platformcommons.org/ctld/api/globalrefdata/v1?refClass=GREF.REGION_DISTRICT&parentRefClass=GREF.REGION_STATE\",\r\n \"labelPath\": \"label\",\r\n \"valuePath\": \"dataCode\",\r\n \"dependencies\": {\r\n \"parentRefData\": \"state\"\r\n }\r\n }\r\n }\r\n ]\r\n },\r\n\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"block\",\r\n \"label\": \"Block / Taluka\",\r\n \"type\": \"DROPDOWN\",\r\n \"subType\": \"SINGLE\",\r\n \"placeholder\": \"Select Block\",\r\n \"optionConfig\": {\r\n \"apiUrl\": \"https://dev.platformcommons.org/ctld/api/globalrefdata/v1?refClass=GREF.REGION_BLOCK&parentRefClass=GREF.REGION_DISTRICT\",\r\n \"labelPath\": \"label\",\r\n \"valuePath\": \"dataCode\",\r\n \"dependencies\": {\r\n \"parentRefData\": \"city\"\r\n }\r\n }\r\n },\r\n {\r\n \"name\": \"pinCode\",\r\n \"label\": \"PIN Code\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true,\r\n \"placeholder\": \"6-digit PIN code\",\r\n \"textConfig\": {\r\n \"length\": { \"min\": 6, \"max\": 6 },\r\n \"pattern\": \"^[0-9]{6}$\",\r\n \"patternMessage\": \"Enter a valid 6-digit PIN code\"\r\n }\r\n }\r\n ]\r\n }\r\n\r\n ]\r\n }\r\n },\r\n\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"User Role\",\r\n \"name\": \"userRole\",\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"role\",\r\n \"label\": \"User Role\",\r\n \"type\": \"DROPDOWN\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"placeholder\": \"Select a role\",\r\n \"optionConfig\": {\r\n \"apiUrl\": \"https://dev.platformcommons.org/gateway/commons-report-service/api/v1/datasets/name/VMS_GET_TENANT_ROLES/execute?params=TENANT_ID=1823\",\r\n \"labelPath\": \"roleName\",\r\n \"valuePath\": \"code\"\r\n }\r\n },\r\n {\r\n \"name\": \"reportingRole\",\r\n \"label\": \"Reporting Role\",\r\n \"type\": \"DROPDOWN\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"placeholder\": \"Select Reporting Role\",\r\n \"optionConfig\": {\r\n \"apiUrl\": \"https://dev.platformcommons.org/ctld/api/rolehierarchy/v1?criteria=roleCode.code='{{userRole}}' and isActive=1&includeAttributes=id,parentRoleCode\",\r\n \"dataPath\": \"payload\",\r\n \"labelPath\": \"parentRoleCode\",\r\n \"valuePath\": \"parentRoleCode\",\r\n \"dependencies\": {\r\n \"userRole\": \"role\"\r\n }\r\n }\r\n },\r\n {\r\n \"name\": \"reportingManager\",\r\n \"label\": \"Reporting Manager\",\r\n \"type\": \"DROPDOWN\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"placeholder\": \"Select Reporting Manager\",\r\n \"optionConfig\": {\r\n \"apiUrl\": \"https://dev.platformcommons.org/ctld/api/tenant/user/role/criteria/v1?criteria=role.code='{{reportingRole}}' and isActive=1 and user.isActive=1\",\r\n \"dataPath\": \"payload\",\r\n \"labelPath\": \"user.userName\",\r\n \"valuePath\": \"user.id\",\r\n \"dependencies\": {\r\n \"reportingRole\": \"reportingRole\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n\r\n ]\r\n }\r\n }`,\r\n\r\n // ──────────────────────────────────────────────────────────────────────────\r\n // Document Upload Form — demonstrates the FILE_UPLOAD field type\r\n // ──────────────────────────────────────────────────────────────────────────\r\n documentUploadForm: `{\r\n \"entityType\": \"DOCUMENT_UPLOAD\",\r\n \"label\": \"Documents\",\r\n \"description\": \"Upload the required documents\",\r\n \"formType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"children\": [\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"Documents\",\r\n \"name\": \"documents\",\r\n \"children\": [\r\n {\r\n \"name\": \"profilePicture\",\r\n \"label\": \"Profile Picture\",\r\n \"type\": \"FILE_UPLOAD\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"attachmentConfig\": {\r\n \"multiple\": false,\r\n \"maxSizeMB\": 5,\r\n \"accept\": \".jpg,.jpeg,.png,.webp,image/*\",\r\n \"acceptLabel\": \"JPG, PNG, WEBP\"\r\n }\r\n },\r\n {\r\n \"name\": \"certificates\",\r\n \"label\": \"Certificates\",\r\n \"type\": \"FILE_UPLOAD\",\r\n \"subType\": \"MULTIPLE\",\r\n \"attachmentConfig\": {\r\n \"multiple\": true,\r\n \"maxFiles\": 5,\r\n \"maxSizeMB\": 10,\r\n \"accept\": \".pdf,.doc,.docx,.jpg,.jpeg,.png\",\r\n \"acceptLabel\": \"PDF, DOCX, JPG, PNG\"\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n }`,\r\n\r\n // Demand Definition Form (matching user request image)\r\n demandDefinitionForm: `{\r\n \"entityType\": \"DEMAND\",\r\n \"label\": \"Demand Definition\",\r\n \"formType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"children\": [\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"beneficiaries\",\r\n \"label\": \"Required Beneficiaries\",\r\n \"type\": \"NUMBER_INPUT\",\r\n \"subType\": \"INTEGER\",\r\n \"required\": true,\r\n \"suffix\": \"Students\",\r\n \"placeholder\": \"0\",\r\n \"numberConfig\": { \"min\": 0 }\r\n },\r\n {\r\n \"name\": \"deliveryModel\",\r\n \"label\": \"Preferred Delivery Model\",\r\n \"type\": \"DROPDOWN\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"placeholder\": \"Select\",\r\n \"optionConfig\": {\r\n \"optionList\": [\r\n { \"label\": \"Onsite Delivery\", \"code\": \"ONSITE\" },\r\n { \"label\": \"Hybrid Model\", \"code\": \"HYBRID\" }\r\n ]\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"minAge\",\r\n \"label\": \"Min Target Age\",\r\n \"type\": \"NUMBER_INPUT\",\r\n \"subType\": \"INTEGER\",\r\n \"required\": true,\r\n \"placeholder\": \"0\",\r\n \"numberConfig\": { \"min\": 0, \"max\": 100 },\r\n \"onValidate\": \"!maxAge || minAge <= maxAge\",\r\n \"errorMessage\": \"Min Age cannot be greater than Max Age\"\r\n },\r\n {\r\n \"name\": \"maxAge\",\r\n \"label\": \"Max Target Age\",\r\n \"type\": \"NUMBER_INPUT\",\r\n \"subType\": \"INTEGER\",\r\n \"required\": true,\r\n \"placeholder\": \"100\",\r\n \"numberConfig\": { \"min\": 0, \"max\": 100 },\r\n \"onValidate\": \"!minAge || maxAge >= minAge\",\r\n \"errorMessage\": \"Max Age cannot be less than Min Age\"\r\n }\r\n ]\r\n },\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"male\",\r\n \"label\": \"Male Split (%)\",\r\n \"type\": \"NUMBER_INPUT\",\r\n \"subType\": \"INTEGER\",\r\n \"required\": true,\r\n \"suffix\": \"%\",\r\n \"placeholder\": \"50\",\r\n \"numberConfig\": { \"min\": 0, \"max\": 100 },\r\n \"onValidate\": \"(male || 0) + (female || 0) === 100\",\r\n \"errorMessage\": \"Male + Female % must equal 100%\"\r\n },\r\n {\r\n \"name\": \"female\",\r\n \"label\": \"Female Split (%)\",\r\n \"type\": \"NUMBER_INPUT\",\r\n \"subType\": \"INTEGER\",\r\n \"required\": true,\r\n \"suffix\": \"%\",\r\n \"placeholder\": \"50\",\r\n \"numberConfig\": { \"min\": 0, \"max\": 100 },\r\n \"onValidate\": \"(male || 0) + (female || 0) === 100\",\r\n \"errorMessage\": \"Male + Female % must equal 100%\"\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n }`,\r\n\r\n\r\n\r\n // Project Info Form (matching user request image)\r\n // Project Form (Combined Info + Demand)\r\n projectInfoForm: `{\r\n \"entityType\": \"PROJECT\",\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.TITLE\",\r\n \"formType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"children\": [\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.SECTION.INFO\",\r\n \"children\": [\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"projectName\",\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.NAME.LABEL\",\r\n \"placeholder\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.NAME.PH\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true,\r\n \"colSpan\": 6\r\n },\r\n {\r\n \"name\": \"programId\",\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.PROG_ID.LABEL\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"defaultValue\": \"DLP-24-L1\",\r\n \"readonly\": true,\r\n \"colSpan\": 6\r\n }\r\n ]\r\n },\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"linkedProgram\",\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.LINKED_PROG.LABEL\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"defaultValue\": \"National Skills Initiative\",\r\n \"readonly\": true,\r\n \"colSpan\": 4\r\n },\r\n {\r\n \"name\": \"linkedContract\",\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.LINKED_CONTRACT.LABEL\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"defaultValue\": \"NSI-Gov-Oct23\",\r\n \"readonly\": true,\r\n \"colSpan\": 4\r\n },\r\n {\r\n \"name\": \"assignedDistrict\",\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.DISTRICT.LABEL\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"defaultValue\": \"Bangalore Rural\",\r\n \"readonly\": true,\r\n \"colSpan\": 4\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.SECTION.DEMAND\",\r\n \"children\": [\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"requiredBeneficiaries\",\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.BENEFICIARIES.LABEL\",\r\n \"placeholder\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.BENEFICIARIES.PH\",\r\n \"type\": \"NUMBER_INPUT\",\r\n \"subType\": \"INTEGER\",\r\n \"required\": true,\r\n \"colSpan\": 6,\r\n \"numberConfig\": {\r\n \"min\": 1\r\n }\r\n },\r\n {\r\n \"name\": \"deliveryModel\",\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.DELIVERY_MODEL.LABEL\",\r\n \"type\": \"DROPDOWN\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"colSpan\": 6,\r\n \"optionConfig\": {\r\n \"optionList\": [\r\n {\r\n \"label\": \"UI_PLAYGROUND.OPTION.IN_PERSON\",\r\n \"code\": \"IN_PERSON\"\r\n },\r\n {\r\n \"label\": \"UI_PLAYGROUND.OPTION.HYBRID\",\r\n \"code\": \"HYBRID\"\r\n },\r\n {\r\n \"label\": \"UI_PLAYGROUND.OPTION.ONLINE\",\r\n \"code\": \"ONLINE\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"minAge\",\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.AGE_MIN.LABEL\",\r\n \"type\": \"NUMBER_INPUT\",\r\n \"subType\": \"INTEGER\",\r\n \"required\": true,\r\n \"placeholder\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.AGE_MIN.LABEL\",\r\n \"numberConfig\": {\r\n \"min\": 0,\r\n \"max\": 100\r\n },\r\n \"onValidate\": \"!maxAge || minAge <= maxAge\",\r\n \"errorMessage\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.AGE_MIN.ERR\"\r\n },\r\n {\r\n \"name\": \"maxAge\",\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.AGE_MAX.LABEL\",\r\n \"type\": \"NUMBER_INPUT\",\r\n \"subType\": \"INTEGER\",\r\n \"required\": true,\r\n \"placeholder\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.AGE_MAX.LABEL\",\r\n \"numberConfig\": {\r\n \"min\": 0,\r\n \"max\": 100\r\n },\r\n \"onValidate\": \"!minAge || maxAge >= minAge\",\r\n \"errorMessage\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.AGE_MAX.ERR\"\r\n }\r\n ]\r\n },\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"maleSplit\",\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.MALE.LABEL\",\r\n \"type\": \"NUMBER_INPUT\",\r\n \"subType\": \"INTEGER\",\r\n \"required\": true,\r\n \"suffix\": \"%\",\r\n \"placeholder\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.MALE.LABEL\",\r\n \"numberConfig\": {\r\n \"min\": 0,\r\n \"max\": 100\r\n },\r\n \"onValidate\": \"(maleSplit || 0) + (femaleSplit || 0) === 100\",\r\n \"errorMessage\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.GENDER_SPLIT.ERR\"\r\n },\r\n {\r\n \"name\": \"femaleSplit\",\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.FEMALE.LABEL\",\r\n \"type\": \"NUMBER_INPUT\",\r\n \"subType\": \"INTEGER\",\r\n \"required\": true,\r\n \"suffix\": \"%\",\r\n \"placeholder\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.FEMALE.LABEL\",\r\n \"numberConfig\": {\r\n \"min\": 0,\r\n \"max\": 100\r\n },\r\n \"onValidate\": \"(maleSplit || 0) + (femaleSplit || 0) === 100\",\r\n \"errorMessage\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.GENDER_SPLIT.ERR\"\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n}\r\n }`,\r\n\r\n faqForm: `{\r\n \"entityType\": \"FAQ\",\r\n \"label\": \"Frequently Asked Questions\",\r\n \"description\": \"Answer attendee questions.\",\r\n \"formType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"children\": [\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"Frequently Asked Questions\",\r\n \"allowMulti\": true,\r\n \"name\": \"faqs\",\r\n \"multiSaveConfig\": {\r\n \"active\": true,\r\n \"summaryField\": \"question\",\r\n \"descriptionField\": \"answer\",\r\n \"addLabel\": \"Add a Question\"\r\n },\r\n \"children\": [\r\n {\r\n \"name\": \"question\",\r\n \"label\": \"Question\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true,\r\n \"placeholder\": \"What is Lorem Ipsum?\"\r\n },\r\n {\r\n \"name\": \"answer\",\r\n \"label\": \"Answer\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"LONG\",\r\n \"required\": true,\r\n \"placeholder\": \"Contrary to popular belief...\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n }`,\r\n\r\n // ── Location field example ──────────────────────────────────────────────\r\n locationForm: `{\r\n \"entityType\": \"EVENT\",\r\n \"label\": \"Event Location\",\r\n \"formType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"children\": [\r\n {\r\n \"name\": \"eventLocation\",\r\n \"label\": \"Location\",\r\n \"type\": \"LOCATION\",\r\n \"required\": true,\r\n \"hint\": \"Set where your event takes place\",\r\n \"locationConfig\": {\r\n \"defaultTab\": \"VENUE\",\r\n \"maxLocations\": 5,\r\n \"venuePlaceholder\": \"Search for a venue address...\",\r\n \"onlinePlaceholder\": \"https://zoom.us/j/meeting-id\",\r\n \"showMap\": true,\r\n \"mapHeight\": \"300px\",\r\n \"googleMapsApiKey\": \"YOUR_GOOGLE_MAPS_API_KEY\"\r\n }\r\n }\r\n ]\r\n }\r\n }`,\r\n};\r\n\r\n/**\r\n * i18n label keys used by the LOCATION field type.\r\n * Add these to your labels JSON file(s) for all supported languages.\r\n *\r\n * LBL_LOC_VENUE – Tab: \"Venue\"\r\n * LBL_LOC_ONLINE – Tab: \"Online Event\"\r\n * LBL_LOC_TBA – Tab: \"To be Announced\"\r\n * LBL_LOC_ADDRESS – Section heading inside Venue tab: \"Location address\"\r\n * LBL_LOC_COUNT_SUFFIX – e.g. \"Locations Added!\"\r\n * LBL_LOC_ADD_ANOTHER – \"Add another Location\" button label\r\n * LBL_LOC_MAP_HINT – hint below the embedded map\r\n * LBL_LOC_ONLINE_URL – Label above online URL input: \"Event URL\"\r\n * LBL_LOC_TBA_DESC – Message shown inside TBA tab\r\n * PH_LOC_VENUE – Placeholder for venue search input\r\n * PH_LOC_ONLINE – Placeholder for online URL input\r\n */\r\n\r\n\r\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { SnackbarComponent } from './components/snackbar.component';\n\n@NgModule({\n declarations: [SnackbarComponent],\n imports: [CommonModule, MatSnackBarModule],\n exports: [SnackbarComponent]\n})\nexport class SnackbarModule {}\n","/*\r\n * Public API Surface of commons-shared-web-ui\r\n */\r\n\r\nexport * from './lib/shared-ui.module';\r\nexport * from './lib/modules/material/material.module';\r\nexport * from './lib/utils/storage.utils';\r\nexport * from './lib/utils/string.utils';\r\nexport * from './lib/utils/translation.utils';\r\nexport * from './lib/modules/summary-card/summary-card.module';\r\nexport * from './lib/modules/summary-card/components/summary-card/summary-card.component';\r\nexport * from './lib/modules/configurable-form/configurable-form.module';\r\nexport * from './lib/modules/configurable-form/component/configurable-form.component';\r\n// Export Configurable Form resources namespaced to avoid collisions\r\nexport * from './lib/modules/configurable-form/configurable-form.model';\r\nexport * as ConfigurableFormExamples from './lib/modules/configurable-form/configurable-form.examples';\r\n\r\nexport * from './lib/modules/pagination/pagination.module';\r\nexport * from './lib/modules/pagination/components/pagination/pagination.component';\r\nexport * from './lib/modules/nav/nav.module';\r\nexport * from './lib/modules/nav/components/nav/nav.component';\r\nexport * from './lib/modules/nav/nav.models';\r\nexport * from './lib/modules/side-nav/side-nav.module';\r\nexport * from './lib/modules/side-nav/components/side-nav/side-nav.component';\r\nexport * from './lib/modules/side-nav/side-nav.models';\r\nexport * from './lib/utils/constants';\r\nexport * from './lib/modules/alert/alert.module';\r\nexport * from './lib/modules/alert/alert.models';\r\nexport * from './lib/modules/alert/components/alert/alert.component';\r\nexport * from './lib/modules/button/button.module';\r\nexport * from './lib/modules/button/button.models';\r\nexport * from './lib/modules/button/components/button/button.component';\r\nexport * from './lib/modules/button-dropdown/button-dropdown.module';\r\nexport * from './lib/modules/button-dropdown/button-dropdown.models';\r\nexport * from './lib/modules/button-dropdown/components/button-dropdown/button-dropdown.component';\r\nexport * from './lib/modules/confirmation-modal/confirmation-modal.module';\r\nexport * from './lib/modules/confirmation-modal/confirmation-modal.models';\r\nexport * from './lib/modules/confirmation-modal/components/confirmation-modal/confirmation-modal.component';\r\nexport * from './lib/modules/filter-sidebar/filter-sidebar.module';\r\nexport * from './lib/modules/filter-sidebar/filter-sidebar.models';\r\nexport * from './lib/modules/filter-sidebar/components/filter-sidebar/filter-sidebar.component';\r\nexport * from './lib/modules/filter/filter.module';\r\nexport * from './lib/modules/filter/filter.models';\r\nexport * from './lib/modules/filter/components/filter/filter.component';\r\nexport * from './lib/modules/form-components/form-components.module';\r\nexport * from './lib/modules/form-components/components/input/input.component';\r\nexport * from './lib/modules/form-components/components/input/input.models';\r\nexport * from './lib/modules/form-components/components/dropdown/dropdown.component';\r\nexport * from './lib/modules/form-components/components/dropdown/dropdown.models';\r\nexport * from './lib/modules/form-components/components/checkbox/checkbox.component';\r\nexport * from './lib/modules/form-components/components/checkbox/checkbox.models';\r\nexport * from './lib/modules/form-components/components/radio/radio.component';\r\nexport * from './lib/modules/form-components/components/radio/radio.models';\r\nexport * from './lib/modules/form-components/components/toggle/toggle.component';\r\nexport * from './lib/modules/form-components/components/toggle/toggle.models';\r\nexport * from './lib/modules/form-components/components/datepicker/datepicker.component';\r\nexport * from './lib/modules/form-components/components/datepicker/datepicker.models';\r\nexport * from './lib/modules/form-components/components/search/search.component';\r\nexport * from './lib/modules/form-components/components/search/search.models';\r\nexport * from './lib/modules/smart-table/smart-table.module';\r\nexport * from './lib/modules/smart-table/components/smart-table/smart-table.component';\r\nexport * from './lib/modules/smart-table/models/table-config.model';\r\nexport * from './lib/modules/smart-table/utils/smart-table.utils';\r\nexport * from './lib/modules/smart-form/smart-form.module';\r\nexport * from './lib/modules/smart-form/components/smart-form/smart-form.component';\r\nexport {\r\n FormSchema,\r\n SubmitConfig,\r\n FieldConfig,\r\n SectionConfig,\r\n StepperConfig,\r\n TextConfig,\r\n NumberConfig,\r\n DateConfig,\r\n EmailConfig,\r\n PhoneConfig,\r\n GeneratedConfig,\r\n RangeConfig,\r\n AttachmentConfig,\r\n LocationConfig,\r\n RatingConfig,\r\n ValidationResult,\r\n LengthConstraint,\r\n OptionItem\r\n} from './lib/modules/smart-form/models/form-schema.model';\r\nexport * from './lib/modules/smart-form/services/expression.service';\r\nexport * from './lib/modules/smart-form/services/smart-form-controller.service';\r\nexport * from './lib/modules/smart-form/utils/validation.utils';\r\nexport * as SmartFormExamples from './lib/modules/smart-form/smart-form.examples';\r\n\r\nexport * from './lib/modules/snackbar/snackbar.module';\r\nexport * from './lib/modules/snackbar/components/snackbar.component';\r\nexport * from './lib/modules/snackbar/models/snackbar.models';\r\nexport * from './lib/modules/snackbar/services/snackbar.service';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","i4.ButtonComponent","i5.ConfirmationModalComponent","i3.ClickOutsideDirective","i4.InputComponent","i5.DropdownComponent","i6.CheckboxComponent","i7.RadioComponent","i8.ToggleComponent","i9.DatepickerComponent","i10.SearchComponent","i11.ButtonComponent","i4","i9","i2.ExpressionService","i6","i7","i8","i10.ButtonComponent","i12.TrustedUrlPipe","i5.FormFieldComponent","i2.SmartFormController","i3.ExpressionService","i5.SnackbarService","i8.ButtonComponent","i9.FormSectionComponent","i5.InputComponent","i6.DropdownComponent","i7.CheckboxComponent","i8.RadioComponent","i9.ToggleComponent","i10.DatepickerComponent","i11.SearchComponent","i5.PaginationComponent","i6.ButtonComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"commons-shared-web-ui.mjs","sources":["../../../src/lib/modules/material/material.module.ts","../../../src/lib/modules/smart-form/services/smart-form-controller.service.ts","../../../src/lib/modules/smart-form/utils/translation.utils.ts","../../../src/lib/modules/smart-form/services/expression.service.ts","../../../src/lib/modules/snackbar/components/snackbar.component.ts","../../../src/lib/modules/snackbar/components/snackbar.component.html","../../../src/lib/modules/snackbar/services/snackbar.service.ts","../../../src/lib/modules/button/components/button/button.component.ts","../../../src/lib/modules/button/components/button/button.component.html","../../../src/lib/utils/string.utils.ts","../../../src/lib/modules/smart-form/utils/trusted-url.pipe.ts","../../../src/lib/modules/smart-form/components/form-field/form-field.component.ts","../../../src/lib/modules/smart-form/components/form-field/form-field.component.html","../../../src/lib/modules/smart-form/components/form-section/form-section.component.ts","../../../src/lib/modules/smart-form/components/form-section/form-section.component.html","../../../src/lib/modules/smart-form/components/smart-form/smart-form.component.ts","../../../src/lib/modules/smart-form/components/smart-form/smart-form.component.html","../../../src/lib/modules/button/button.module.ts","../../../src/lib/modules/alert/components/alert/alert.component.ts","../../../src/lib/modules/alert/components/alert/alert.component.html","../../../src/lib/modules/alert/alert.module.ts","../../../src/lib/modules/smart-form/smart-form.module.ts","../../../src/lib/modules/form-components/components/input/input.component.ts","../../../src/lib/modules/form-components/components/input/input.component.html","../../../src/lib/modules/form-components/directives/click-outside.directive.ts","../../../src/lib/modules/form-components/components/dropdown/dropdown.component.ts","../../../src/lib/modules/form-components/components/dropdown/dropdown.component.html","../../../src/lib/modules/form-components/components/checkbox/checkbox.component.ts","../../../src/lib/modules/form-components/components/checkbox/checkbox.component.html","../../../src/lib/modules/form-components/components/radio/radio.component.ts","../../../src/lib/modules/form-components/components/radio/radio.component.html","../../../src/lib/modules/form-components/components/toggle/toggle.component.ts","../../../src/lib/modules/form-components/components/toggle/toggle.component.html","../../../src/lib/modules/form-components/components/datepicker/datepicker.component.ts","../../../src/lib/modules/form-components/components/datepicker/datepicker.component.html","../../../src/lib/modules/form-components/components/search/search.component.ts","../../../src/lib/modules/form-components/components/search/search.component.html","../../../src/lib/modules/form-components/form-components.module.ts","../../../src/lib/modules/form-builder/services/form-schema-tree.service.ts","../../../src/lib/modules/form-builder/services/field-selection.service.ts","../../../src/lib/modules/form-builder/components/field-selection/selection-field-node/selection-field-node.component.ts","../../../src/lib/modules/form-builder/components/field-selection/selection-field-node/selection-field-node.component.html","../../../src/lib/modules/form-builder/components/field-selection/selection-section-node/selection-section-node.component.ts","../../../src/lib/modules/form-builder/components/field-selection/selection-section-node/selection-section-node.component.html","../../../src/lib/modules/form-builder/components/field-selection/group-node/group-node.component.ts","../../../src/lib/modules/form-builder/components/field-selection/group-node/group-node.component.html","../../../src/lib/modules/form-builder/components/field-selection/field-selection.component.ts","../../../src/lib/modules/form-builder/components/field-selection/field-selection.component.html","../../../src/lib/modules/form-builder/services/field-configurator.service.ts","../../../src/lib/modules/form-builder/tokens/builder.tokens.ts","../../../src/lib/modules/form-builder/utils/constants.ts","../../../src/lib/modules/form-builder/configs/field-type-schema.map.ts","../../../src/lib/modules/form-builder/components/field-configurator/configurator-tree/configurator-tree.component.ts","../../../src/lib/modules/form-builder/components/field-configurator/configurator-tree/configurator-tree.component.html","../../../src/lib/modules/form-builder/components/field-configurator/configurator-config-panel/configurator-config-panel.component.ts","../../../src/lib/modules/form-builder/components/field-configurator/configurator-config-panel/configurator-config-panel.component.html","../../../src/lib/modules/form-builder/components/field-configurator/field-configurator.component.ts","../../../src/lib/modules/form-builder/components/field-configurator/field-configurator.component.html","../../../src/lib/modules/form-builder/form-builder.module.ts","../../../src/lib/modules/confirmation-modal/components/confirmation-modal/confirmation-modal.component.ts","../../../src/lib/modules/confirmation-modal/components/confirmation-modal/confirmation-modal.component.html","../../../src/lib/modules/button-dropdown/components/button-dropdown/button-dropdown.component.ts","../../../src/lib/modules/button-dropdown/components/button-dropdown/button-dropdown.component.html","../../../src/lib/modules/confirmation-modal/confirmation-modal.module.ts","../../../src/lib/modules/button-dropdown/button-dropdown.module.ts","../../../src/lib/modules/filter-sidebar/components/filter-sidebar/filter-sidebar.component.ts","../../../src/lib/modules/filter-sidebar/components/filter-sidebar/filter-sidebar.component.html","../../../src/lib/modules/filter-sidebar/filter-sidebar.module.ts","../../../src/lib/modules/summary-card/components/summary-card/summary-card.component.ts","../../../src/lib/modules/summary-card/components/summary-card/summary-card.component.html","../../../src/lib/modules/summary-card/summary-card.module.ts","../../../src/lib/utils/translation.utils.ts","../../../src/lib/modules/configurable-form/component/configurable-form.component.ts","../../../src/lib/modules/configurable-form/component/configurable-form.component.html","../../../src/lib/modules/configurable-form/configurable-form.module.ts","../../../src/lib/modules/filter/components/filter/filter.component.ts","../../../src/lib/modules/filter/components/filter/filter.component.html","../../../src/lib/modules/filter/filter.module.ts","../../../src/lib/utils/constants.ts","../../../src/lib/modules/side-nav/components/side-nav/side-nav.component.ts","../../../src/lib/modules/side-nav/components/side-nav/side-nav.component.html","../../../src/lib/modules/side-nav/side-nav.module.ts","../../../src/lib/shared-ui.module.ts","../../../src/lib/utils/storage.utils.ts","../../../src/lib/modules/configurable-form/configurable-form.examples.ts","../../../src/lib/modules/pagination/components/pagination/pagination.component.ts","../../../src/lib/modules/pagination/components/pagination/pagination.component.html","../../../src/lib/modules/pagination/pagination.module.ts","../../../src/lib/modules/nav/components/nav/nav.component.ts","../../../src/lib/modules/nav/components/nav/nav.component.html","../../../src/lib/modules/nav/nav.module.ts","../../../src/lib/modules/smart-table/components/smart-table/smart-table.component.ts","../../../src/lib/modules/smart-table/components/smart-table/smart-table.component.html","../../../src/lib/modules/smart-table/smart-table.module.ts","../../../src/lib/modules/smart-table/utils/smart-table.utils.ts","../../../src/lib/modules/smart-form/utils/validation.utils.ts","../../../src/lib/modules/smart-form/smart-form.examples.ts","../../../src/lib/modules/snackbar/snackbar.module.ts","../../../src/public-api.ts","../../../src/commons-shared-web-ui.ts"],"sourcesContent":["import { NgModule } from \"@angular/core\";\nimport { MatCardModule } from '@angular/material/card';\nimport { MatSnackBarModule } from \"@angular/material/snack-bar\";\nimport { MatCheckboxModule } from '@angular/material/checkbox'\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatDialogModule } from \"@angular/material/dialog\";\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from \"@angular/material/button\";\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatNativeDateModule } from \"@angular/material/core\";\nimport { MatInputModule } from '@angular/material/input';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport {MatSliderModule} from '@angular/material/slider';\nimport {MatListModule} from '@angular/material/list';\nimport {MatChipsModule} from '@angular/material/chips';\nimport {MatPaginatorModule} from '@angular/material/paginator';\nimport {MatTableModule} from '@angular/material/table';\nimport {MatExpansionModule} from '@angular/material/expansion';\nimport {CdkAccordionModule} from '@angular/cdk/accordion';\nimport { MatSortModule } from \"@angular/material/sort\";\nimport {MatAutocompleteModule} from '@angular/material/autocomplete';\nimport {MatSlideToggleModule} from '@angular/material/slide-toggle';\nimport {MatButtonToggleModule} from '@angular/material/button-toggle';\n\n@NgModule({\n imports: [\n MatCardModule,\n MatSnackBarModule,\n MatCheckboxModule,\n MatDividerModule,\n MatSelectModule,\n MatRadioModule,\n MatDialogModule,\n MatFormFieldModule,\n MatDatepickerModule,\n MatNativeDateModule,\n MatInputModule,\n MatIconModule,\n MatProgressSpinnerModule,\n MatTabsModule,\n MatButtonModule,\n MatMenuModule,\n MatTabsModule,\n MatProgressBarModule,\n MatTooltipModule,\n MatSliderModule,\n MatListModule,\n MatChipsModule,\n MatSortModule,\n MatAutocompleteModule,\n MatSlideToggleModule,\n MatButtonToggleModule\n ],\n exports: [\n MatCardModule,\n MatSnackBarModule,\n MatCheckboxModule,\n MatDividerModule,\n MatSelectModule,\n MatRadioModule,\n MatDialogModule,\n MatFormFieldModule,\n MatDatepickerModule,\n MatNativeDateModule,\n MatInputModule,\n MatIconModule,\n MatProgressSpinnerModule,\n MatTabsModule,\n MatButtonModule,\n MatMenuModule,\n MatTabsModule,\n MatProgressBarModule,\n MatTooltipModule,\n MatSliderModule,\n MatListModule,\n MatChipsModule,\n MatPaginatorModule,\n MatTableModule,\n MatExpansionModule,\n CdkAccordionModule,\n MatSortModule,\n MatAutocompleteModule,\n MatSlideToggleModule,\n MatButtonToggleModule\n ]\n})\nexport class MaterialModule { }\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\nimport { FormLabels } from '../models/form-schema.model';\r\n\r\n@Injectable()\r\nexport class SmartFormController {\r\n private formData: { [key: string]: any } = {};\r\n\r\n /** Auth token sourced from the FormSchema configJSON (e.g. \"Bearer eyJ…\") */\r\n token?: string;\r\n /** HTTP header name for the token (default: \"Authorization\") */\r\n tokenHeader?: string;\r\n /** Flat map of translated i18n labels passed from SmartFormComponent */\r\n labels: any = {};\r\n /** Custom label keys for form actions (Next, Submit, Add, etc.) */\r\n actionLabels?: FormLabels;\r\n private fieldSubjects: Map<string, BehaviorSubject<any>> = new Map();\r\n\r\n initialize(initialData: { [key: string]: any }): void {\r\n this.formData = { ...initialData };\r\n this.fieldSubjects.forEach((subject, key) => {\r\n subject.next(this.formData[key]);\r\n });\r\n }\r\n\r\n updateField(name: string, value: any): void {\r\n this.formData[name] = value;\r\n\r\n if (!this.fieldSubjects.has(name)) {\r\n this.fieldSubjects.set(name, new BehaviorSubject<any>(value));\r\n } else {\r\n this.fieldSubjects.get(name)!.next(value);\r\n }\r\n }\r\n\r\n getFieldValue(name: string): any {\r\n return this.formData[name];\r\n }\r\n\r\n getFieldObservable(name: string): Observable<any> {\r\n if (!this.fieldSubjects.has(name)) {\r\n this.fieldSubjects.set(name, new BehaviorSubject<any>(this.formData[name]));\r\n }\r\n return this.fieldSubjects.get(name)!.asObservable();\r\n }\r\n\r\n getAllData(): { [key: string]: any } {\r\n return { ...this.formData };\r\n }\r\n\r\n reset(): void {\r\n this.formData = {};\r\n this.fieldSubjects.forEach(subject => subject.next(undefined));\r\n }\r\n\r\n destroy(): void {\r\n this.fieldSubjects.forEach(subject => subject.complete());\r\n this.fieldSubjects.clear();\r\n }\r\n}\r\n","import { FieldConfig, FormSchema } from '../models/form-schema.model';\r\n\r\n/**\r\n * Utility class for translating Smart Form schemas.\r\n */\r\nexport class SmartFormTranslationUtils {\r\n\r\n /**\r\n * Recursively walks the schema and replaces i18n keys with values from labels map.\r\n * @param schema The FormSchema to translate.\r\n * @param labels The labels map (can be flat or contain labelsObject property).\r\n */\r\n static translateSchema(schema: FormSchema, labels: any): void {\r\n if (!schema || !labels) return;\r\n\r\n // Support both flat labels map and the pattern used in ConfigurableForm which passes { labelsObject: ... }\r\n const labelsMap = labels.labelsObject || labels;\r\n const translate = (key: string) => labelsMap[key] || key;\r\n\r\n // Root properties\r\n if (schema.label) schema.label = translate(schema.label);\r\n if (schema.description) schema.description = translate(schema.description);\r\n\r\n // Submit config\r\n if (schema.submitConfig) {\r\n if (schema.submitConfig.successMessage) schema.submitConfig.successMessage = translate(schema.submitConfig.successMessage);\r\n if (schema.submitConfig.errorMessage) schema.submitConfig.errorMessage = translate(schema.submitConfig.errorMessage);\r\n }\r\n\r\n // Section config\r\n if (schema.sectionConfig) {\r\n this.translateSection(schema.sectionConfig, translate);\r\n }\r\n\r\n // Stepper config\r\n if (schema.stepperConfig?.children) {\r\n schema.stepperConfig.children.forEach(field => this.translateField(field, translate));\r\n }\r\n }\r\n\r\n private static translateSection(section: any, translate: (key: string) => string): void {\r\n if (section.label) section.label = translate(section.label);\r\n if (section.children) {\r\n section.children.forEach((field: FieldConfig) => this.translateField(field, translate));\r\n }\r\n }\r\n\r\n private static translateField(field: FieldConfig, translate: (key: string) => string): void {\r\n if (field.label) field.label = translate(field.label);\r\n if (field.placeholder) field.placeholder = translate(field.placeholder);\r\n if (field.hint) field.hint = translate(field.hint);\r\n\r\n if (field.richTextConfig?.placeholder) {\r\n field.richTextConfig.placeholder = translate(field.richTextConfig.placeholder);\r\n }\r\n\r\n if (field.textConfig?.patternMessage) {\r\n field.textConfig.patternMessage = translate(field.textConfig.patternMessage);\r\n }\r\n\r\n if (field.attachmentConfig?.acceptLabel) {\r\n field.attachmentConfig.acceptLabel = translate(field.attachmentConfig.acceptLabel);\r\n }\r\n\r\n if (field.optionConfig?.optionList) {\r\n field.optionConfig.optionList.forEach(opt => {\r\n if (opt.label) opt.label = translate(opt.label);\r\n if (opt.hint) opt.hint = translate(opt.hint);\r\n });\r\n }\r\n\r\n // Recurse into children (ROW or GROUP)\r\n if (field.children) {\r\n field.children.forEach(child => this.translateField(child, translate));\r\n }\r\n\r\n // Recurse into nested section config\r\n if (field.sectionConfig) {\r\n this.translateSection(field.sectionConfig, translate);\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ExpressionService {\r\n private loadedFunctions: Map<string, Function> = new Map();\r\n\r\n evaluate(expression: string, context: { [key: string]: any }, variables?: string[]): any {\r\n try {\r\n const vars = variables || this.extractVariables(expression);\r\n const args = vars.map(v => context[v]);\r\n\r\n const func = new Function(...vars, `return ${expression};`);\r\n return func(...args);\r\n } catch (e) {\r\n console.error('Expression evaluation error:', e, { expression, vars: variables || this.extractVariables(expression), context });\r\n return null;\r\n }\r\n }\r\n\r\n evaluateCondition(expression: string, context: { [key: string]: any }): boolean {\r\n const vars = this.extractVariables(expression);\r\n try {\r\n const args = vars.map(v => context[v]);\r\n const func = new Function(...vars, `return ${expression};`);\r\n const result = func(...args);\r\n return !!result;\r\n } catch (e) {\r\n console.error('Condition evaluation error:', e, { expression, variables: vars, context });\r\n return false;\r\n }\r\n }\r\n\r\n evaluateFormula(formula: string, functionName: string, context: { [key: string]: any }, variables?: string[]): any {\r\n try {\r\n if (!this.loadedFunctions.has(functionName)) {\r\n const func = new Function('context', `\r\n ${formula}\r\n return ${functionName};\r\n `)(context);\r\n this.loadedFunctions.set(functionName, func);\r\n }\r\n\r\n const fn = this.loadedFunctions.get(functionName);\r\n if (!fn) return null;\r\n\r\n const args = variables ? variables.map(v => context[v]) : [];\r\n return fn(...args);\r\n } catch (e) {\r\n console.error('Formula evaluation error:', e);\r\n return null;\r\n }\r\n }\r\n\r\n extractVariables(expression: string): string[] {\r\n if (!expression) return [];\r\n\r\n // Remove strings from expression to avoid picking up variables inside quotes\r\n const cleanExpr = expression\r\n .replace(/'[^']*'/g, '')\r\n .replace(/\"[^\"]*\"/g, '')\r\n .replace(/`[^`]*`/g, '')\r\n // Remove properties (e.g., .max) to only pick up top-level identifiers\r\n .replace(/\\.\\w+/g, '');\r\n\r\n const regex = /\\b[a-zA-Z_]\\w*\\b/g;\r\n const matches = cleanExpr.match(regex) || [];\r\n const keywords = [\r\n 'true', 'false', 'null', 'undefined', 'return', 'if', 'else', 'for', 'while', 'function', 'var', 'let', 'const', 'this',\r\n 'Math', 'JSON', 'console', 'window', 'document', 'Date', 'Object', 'Array', 'Number', 'String', 'Boolean', 'Symbol'\r\n ];\r\n return [...new Set(matches.filter(m => !keywords.includes(m)))];\r\n }\r\n}\r\n","import { Component, inject } from '@angular/core';\nimport { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar';\nimport { SnackbarConfig } from '../models/snackbar.models';\n\n@Component({\n selector: 'lib-snackbar',\n templateUrl: './snackbar.component.html',\n styleUrls: ['./snackbar.component.scss'],\n standalone: false\n})\nexport class SnackbarComponent {\n public data: SnackbarConfig = inject(MAT_SNACK_BAR_DATA);\n public snackBarRef: MatSnackBarRef<SnackbarComponent> = inject(MatSnackBarRef);\n\n get variantClass(): string {\n return `snackbar-${this.data.variant || 'info'}`;\n }\n}\n","<div class=\"cc-snackbar-container\" [ngClass]=\"variantClass\">\n <div class=\"cc-snackbar-icon\">\n <!-- Success Icon -->\n <svg *ngIf=\"data.variant === 'success'\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"></path>\n <polyline points=\"22 4 12 14.01 9 11.01\"></polyline>\n </svg>\n \n <!-- Error Icon -->\n <svg *ngIf=\"data.variant === 'error'\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"></line>\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"></line>\n </svg>\n \n <!-- Warning Icon -->\n <svg *ngIf=\"data.variant === 'warning'\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"></path>\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"></line>\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"></line>\n </svg>\n \n <!-- Info Icon -->\n <svg *ngIf=\"data.variant === 'info' || !data.variant\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line>\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line>\n </svg>\n </div>\n \n <div class=\"cc-snackbar-message\">\n {{ data.message }}\n </div>\n\n <button *ngIf=\"data.showCloseButton\" class=\"cc-snackbar-close\" (click)=\"snackBarRef.dismiss()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n</div>\n","import { Injectable } from '@angular/core';\nimport { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar';\nimport { SnackbarConfig } from '../models/snackbar.models';\nimport { SnackbarComponent } from '../components/snackbar.component';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SnackbarService {\n\n constructor(private snackBar: MatSnackBar) {}\n\n show(config: SnackbarConfig): void {\n const matConfig: MatSnackBarConfig = {\n duration: config.duration ?? 5000,\n horizontalPosition: config.horizontalPosition ?? 'right',\n verticalPosition: config.verticalPosition ?? 'top',\n panelClass: ['cc-snackbar-panel', `cc-snackbar-${config.variant || 'info'}`],\n data: config // Pass the entire config down to the component\n };\n \n this.snackBar.openFromComponent(SnackbarComponent, matConfig);\n }\n\n success(message: string, duration?: number): void {\n this.show({ message, variant: 'success', duration });\n }\n\n error(message: string, duration?: number): void {\n this.show({ message, variant: 'error', duration });\n }\n\n warning(message: string, duration?: number): void {\n this.show({ message, variant: 'warning', duration });\n }\n\n info(message: string, duration?: number): void {\n this.show({ message, variant: 'info', duration });\n }\n}\n","import { Component, Input, OnInit } from '@angular/core';\r\n\r\nimport { ButtonLabels, ButtonVariant } from '../../button.models';\r\n\r\n@Component({\r\n selector: 'lib-button',\r\n templateUrl: './button.component.html',\r\n styleUrls: ['./button.component.scss'],\r\n standalone: false\r\n})\r\nexport class ButtonComponent implements OnInit {\r\n\r\n @Input() variant: ButtonVariant = 'primary';\r\n @Input() type: 'button' | 'submit' | 'reset' = 'button';\r\n @Input() disabled: boolean = false;\r\n\r\n // Customization Inputs\r\n @Input() width?: string;\r\n @Input() height?: string;\r\n @Input() borderRadius?: string;\r\n @Input() fontSize?: string;\r\n @Input() fontWeight?: string;\r\n @Input() backgroundColor?: string;\r\n @Input() color?: string;\r\n @Input() border?: string;\r\n @Input() icon: boolean | string | { type: 'material' | 'fontawesome' | 'img'; value: string } = '';\r\n @Input() labels?: ButtonLabels;\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n get isDefaultIcon(): boolean {\r\n return this.icon === true;\r\n }\r\n\r\n get isStringIcon(): boolean {\r\n return typeof this.icon === 'string' && this.icon !== '';\r\n }\r\n\r\n get isImgIcon(): boolean {\r\n const icon = this.icon;\r\n if (typeof icon === 'string') {\r\n return icon.includes('/') || icon.includes('.') || icon.startsWith('http');\r\n }\r\n return typeof icon === 'object' && icon !== null && !!icon.value && (icon.type === 'img' || icon.value.includes('/') || icon.value.includes('.') || icon.value.startsWith('http'));\r\n }\r\n\r\n get isObjectIcon(): boolean {\r\n return typeof this.icon === 'object' && this.icon !== null;\r\n }\r\n\r\n get iconString(): string {\r\n return typeof this.icon === 'string' ? this.icon : '';\r\n }\r\n\r\n get iconObject(): { type: string; value: string } {\r\n return typeof this.icon === 'object' ? this.icon as any : { type: '', value: '' };\r\n }\r\n\r\n}\r\n","<button [type]=\"type\" [disabled]=\"disabled\" class=\"cc-btn\" [ngClass]=\"'cc-btn-' + variant\" [style.width]=\"width\"\r\n [style.height]=\"height\" [style.border-radius]=\"borderRadius\" [style.font-size]=\"fontSize\"\r\n [style.font-weight]=\"fontWeight\" [style.background-color]=\"backgroundColor\" [style.color]=\"color\"\r\n [style.border]=\"border\">\r\n <div class=\"cc-btn-icon-wrapper\" *ngIf=\"icon\">\r\n <!-- String Icons -->\r\n <ng-container *ngIf=\"isStringIcon\">\r\n <i *ngIf=\"!isImgIcon\" [ngClass]=\"iconString\" class=\"cc-btn-icon\"></i>\r\n <img *ngIf=\"isImgIcon\" [src]=\"iconString\" [attr.alt]=\"labels?.iconAltText || 'button icon'\"\r\n class=\"cc-btn-icon cc-btn-img-icon\" />\r\n </ng-container>\r\n\r\n <!-- Object Icons -->\r\n <ng-container *ngIf=\"isObjectIcon\">\r\n <i *ngIf=\"iconObject.type === 'fontawesome'\" [ngClass]=\"iconObject.value\" class=\"cc-btn-icon\"></i>\r\n <span *ngIf=\"iconObject.type === 'material'\" class=\"material-icons cc-btn-icon\">{{ iconObject.value }}</span>\r\n <img *ngIf=\"iconObject.type === 'img'\" [src]=\"iconObject.value\" [attr.alt]=\"labels?.iconAltText || 'button icon'\"\r\n class=\"cc-btn-icon cc-btn-img-icon\" />\r\n </ng-container>\r\n </div>\r\n <ng-content></ng-content>\r\n</button>","/**\r\n * Utility functions for string manipulation\r\n */\r\nexport class StringUtils {\r\n\r\n /**\r\n * Converts a string to camelCase.\r\n * Example: \"First Name\" -> \"firstName\", \"Profile Picture\" -> \"profilePicture\"\r\n */\r\n static toCamelCase(str?: string): string {\r\n if (!str) return '';\r\n return str\r\n .replace(/[^a-zA-Z0-9 ]/g, '')\r\n .split(' ')\r\n .filter(Boolean)\r\n .map((word, i) =>\r\n i === 0\r\n ? word.charAt(0).toLowerCase() + word.slice(1)\r\n : word.charAt(0).toUpperCase() + word.slice(1)\r\n )\r\n .join('');\r\n }\r\n}\r\n","import { Pipe, PipeTransform, SecurityContext } from '@angular/core';\r\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\r\n\r\n/**\r\n * Bypasses Angular's DomSanitizer for resource URLs (e.g. YouTube embed iframes).\r\n * Used only for trusted URLs such as YouTube embed links derived from user-provided video IDs.\r\n */\r\n@Pipe({\r\n name: 'trustedUrl',\r\n standalone: false\r\n})\r\nexport class TrustedUrlPipe implements PipeTransform {\r\n constructor(private sanitizer: DomSanitizer) { }\r\n\r\n transform(url: string): SafeResourceUrl | null {\r\n if (!url) {\r\n return null;\r\n }\r\n const cleaned = this.sanitizer.sanitize(SecurityContext.URL, url);\r\n if (!cleaned) {\r\n return null;\r\n }\r\n return this.sanitizer.bypassSecurityTrustResourceUrl(cleaned);\r\n }\r\n}\r\n","import { Component, Input, OnInit, OnDestroy, ViewChild, ElementRef } from '@angular/core';\r\nimport { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport {\r\n FormArray,\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ValidatorFn,\r\n Validators\r\n} from '@angular/forms';\r\nimport { SectionConfig, FieldConfig, UploadedFile, MediaItem, LocationItem, LocationFieldValue, AttachmentConfig, LibraryUploadConfig } from '../../models/form-schema.model';\r\nimport { SmartFormController } from '../../services/smart-form-controller.service';\r\nimport { ExpressionService } from '../../services/expression.service';\r\nimport { ValidationUtils } from '../../utils/validation.utils';\r\nimport { StringUtils } from '../../../../utils/string.utils';\r\nimport { Subject, combineLatest, forkJoin, BehaviorSubject } from 'rxjs';\r\nimport { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'lib-form-field',\r\n templateUrl: './form-field.component.html',\r\n styleUrls: ['./form-field.component.scss'],\r\n standalone: false\r\n})\r\nexport class FormFieldComponent implements OnInit, OnDestroy {\r\n @Input() config!: FieldConfig;\r\n @Input() controller!: SmartFormController;\r\n /**\r\n * The FormGroup that THIS field's control should be registered in.\r\n * For repeater instances this is the instance's own isolated FormGroup.\r\n * For flat (non-repeater) fields this is the root formGroup.\r\n */\r\n @Input() formGroup!: FormGroup;\r\n\r\n /**\r\n * Set to TRUE when this field is part of a repeatable group (config.sectionConfig.allowMulti = true).\r\n * When true, the field does NOT sync with the global controller to prevent data collision\r\n * between different instances of the same repeater row.\r\n */\r\n @Input() allowMulti: boolean = false;\r\n\r\n value: any;\r\n isVisible: boolean = true;\r\n showPassword: boolean = false; // password show/hide toggle\r\n isDragOver: boolean = false; // file upload drag-over state\r\n fileUploadError: string = ''; // per-field file validation error\r\n multiSaveError: string = ''; // error for multisave validation\r\n private destroy$ = new Subject<void>();\r\n\r\n // ── MEDIA_UPLOAD support ────────────────────────────────────────────────\r\n @ViewChild('mediaDeviceInput') mediaDeviceInput!: ElementRef<HTMLInputElement>;\r\n showMediaMenu: boolean = false; // hover/click dropdown menu\r\n showYoutubeInput: boolean = false; // inline YouTube URL input panel\r\n youtubeUrlInput: string = ''; // model for the YT URL field\r\n youtubeUrlError: string = ''; // validation message for YT url\r\n mediaCarouselIndex: number = 0; // active slide index for carousel\r\n showLibraryModal: boolean = false; // library picker modal\r\n libraryImages: any[] = []; // raw list fetched from library API\r\n librarySelectedIds: Set<any> = new Set(); // selected library items\r\n libraryLoading: boolean = false;\r\n libraryError: string = '';\r\n mediaUploadError: string = ''; // transient error message for max limits\r\n\r\n // ── LOCATION field support ────────────────────────────────────────────────\r\n /** Active tab: any string, e.g. 'VENUE', 'ONLINE', 'TBA'. Defaults to 'VENUE'. */\r\n locationActiveTab: string = 'VENUE';\r\n /** Current text in the venue search box */\r\n locationSearchText: string = '';\r\n /** Google Places autocomplete suggestions */\r\n locationSuggestions: any[] = [];\r\n /** Show the suggestions dropdown */\r\n locationShowSuggestions: boolean = false;\r\n /** Cached Google AutocompleteService instance */\r\n private _googleAcService: any = null;\r\n /** Whether Google Maps is loaded */\r\n locationMapLoaded: boolean = false;\r\n /** Map instance */\r\n private _googleMap: any = null;\r\n /** Map markers */\r\n private _mapMarkers: any[] = [];\r\n\r\n // ── AUTOCOMPLETE support ────────────────────────────────────────────────\r\n /** FormControl used ONLY for the autocomplete text-input display value */\r\n autocompleteInputCtrl = new FormControl('');\r\n /** Filtered option list shown in the mat-autocomplete panel */\r\n filteredOptions: { label: string; code: any }[] = [];\r\n\r\n // ── GROUP / allowMulti support ──────────────────────────────────────────\r\n\r\n /** For GROUP fields with allowMulti = true */\r\n groupFormArray!: FormArray;\r\n\r\n /** For GROUP fields with allowMulti = false — single nested FormGroup */\r\n groupFormGroup!: FormGroup;\r\n\r\n /**\r\n * Tracked list of repeater instances.\r\n * Using a separate array (not FormArray.controls) + trackBy(id) ensures\r\n * Angular creates FRESH child components for every new row, preventing\r\n * cached values from bleeding into new instances.\r\n * \r\n * Enhanced with isEditing and isSaved flags for the 'multiSave' card UI.\r\n */\r\n instanceList: { id: number; fg: FormGroup; initialValue?: any; isEditing?: boolean; isSaved?: boolean; isExpanded?: boolean }[] = [];\r\n private _nextInstanceId = 0;\r\n\r\n /**\r\n * Key used to register the GROUP control on the parent formGroup.\r\n * Priority: sectionConfig.name > field.name > camelCase(label) > '__group__'\r\n */\r\n get groupKey(): string {\r\n return (\r\n this.config.sectionConfig?.name ||\r\n this.config.name ||\r\n StringUtils.toCamelCase(this.config.sectionConfig?.label) ||\r\n '__group__'\r\n );\r\n }\r\n\r\n\r\n constructor(\r\n private fb: FormBuilder,\r\n private expressionService: ExpressionService,\r\n private http: HttpClient\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n if (this.isGroup) {\r\n this.initGroupField();\r\n return;\r\n }\r\n\r\n this.registerControl();\r\n this.setupVisibility();\r\n this.setupGeneratedField();\r\n this.setupFormulaValidation(); // Generic formula-based validation\r\n this.setupDependencies();\r\n this.setupMatchValidation(); // cross-field match (e.g. confirmPassword)\r\n\r\n if (!this.config.optionConfig?.dependencies) {\r\n this.loadDropdownOptions();\r\n }\r\n\r\n if (this.isAutocomplete) {\r\n this.initAutocomplete();\r\n }\r\n\r\n if (this.isLocation) {\r\n this.initLocationField();\r\n }\r\n }\r\n\r\n // ── GROUP initialisation ──────────────────────────────────────────────────\r\n get addMultiLabel(): string {\r\n const rawLabel = this.config.sectionConfig?.multiSaveConfig?.addLabel;\r\n if (rawLabel) {\r\n return this.controller.labels?.[rawLabel] || rawLabel;\r\n }\r\n const sectionLabel = this.config.sectionConfig?.label;\r\n const translatedSectionLabel = sectionLabel ? (this.controller.labels?.[sectionLabel] || sectionLabel) : '';\r\n return '+ Add a ' + translatedSectionLabel;\r\n }\r\n\r\n private initGroupField(): void {\r\n if (this.config.sectionConfig?.allowMulti) {\r\n this.groupFormArray = this.fb.array([]);\r\n this.formGroup.addControl(this.groupKey, this.groupFormArray);\r\n\r\n const initialData = this.controller.getFieldValue(this.groupKey);\r\n if (Array.isArray(initialData) && initialData.length > 0) {\r\n initialData.forEach((item: any) => {\r\n this.addGroupInstance(item);\r\n });\r\n } else {\r\n // We always start with at least one instance.\r\n // If multi-save is active, it starts in editing mode and is NOT \r\n // added to the main form value until the user actually saves it.\r\n this.addGroupInstance();\r\n }\r\n } else {\r\n this.groupFormGroup = this.fb.group({});\r\n this.formGroup.addControl(this.groupKey, this.groupFormGroup);\r\n }\r\n }\r\n\r\n /**\r\n * Sets up cross-field validation based on the `onValidate` formula.\r\n * Watches all variables mentioned in the formula and updates the field's\r\n * validity whenever any of them change.\r\n */\r\n private setupFormulaValidation(): void {\r\n if (!this.config.onValidate) return;\r\n\r\n const expression = this.config.onValidate;\r\n const variables = this.expressionService.extractVariables(expression);\r\n\r\n // Subscribe to all fields mentioned in the formula\r\n const observables = variables.map(v => this.controller.getFieldObservable(v));\r\n\r\n combineLatest(observables).pipe(takeUntil(this.destroy$)).subscribe(() => {\r\n const context = this.controller.getAllData();\r\n const isValid = this.expressionService.evaluateCondition(expression, context);\r\n\r\n const control = this.formGroup.get(this.config.name!);\r\n if (control) {\r\n if (!isValid) {\r\n control.setErrors({ ...control.errors, formulaError: true });\r\n } else {\r\n // Clear only the formulaError\r\n if (control.hasError('formulaError')) {\r\n const errors = { ...control.errors };\r\n delete errors['formulaError'];\r\n control.setErrors(Object.keys(errors).length ? errors : null);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n addGroupInstance(initialData?: any): void {\r\n const fg = this.fb.group({});\r\n const isMultiSave = !!this.config.sectionConfig?.multiSaveConfig?.active;\r\n\r\n // If initialData exists, treat the instance as already submitted/saved to form\r\n const isEditing = initialData ? false : isMultiSave;\r\n const isSaved = initialData ? true : !isMultiSave;\r\n\r\n const instance = {\r\n id: this._nextInstanceId++,\r\n fg,\r\n isEditing,\r\n isSaved,\r\n isExpanded: false,\r\n initialValue: initialData ? { ...initialData } : undefined\r\n };\r\n\r\n if (isSaved) {\r\n this.groupFormArray.push(fg);\r\n }\r\n this.instanceList = [...this.instanceList, instance];\r\n\r\n if (initialData) {\r\n setTimeout(() => {\r\n // Ensure that controls exist for all keys in initialData so we don't drop fields like ID!\r\n Object.keys(initialData).forEach(key => {\r\n if (!fg.contains(key)) {\r\n fg.addControl(key, new FormControl(initialData[key]));\r\n }\r\n });\r\n fg.patchValue(initialData);\r\n });\r\n }\r\n }\r\n\r\n saveGroupInstance(index: number): void {\r\n const instance = this.instanceList[index];\r\n const multiCfg = this.config.sectionConfig?.multiSaveConfig;\r\n\r\n if (multiCfg?.active) {\r\n // Validate that at least one key field is filled\r\n const summaryVal = instance.fg.get(multiCfg.summaryField || '')?.value;\r\n const descVal = multiCfg.descriptionField ? instance.fg.get(multiCfg.descriptionField)?.value : null;\r\n\r\n const hasSummary = summaryVal !== null && summaryVal !== undefined && String(summaryVal).trim() !== '';\r\n const hasDesc = multiCfg.descriptionField\r\n ? (descVal !== null && descVal !== undefined && String(descVal).trim() !== '')\r\n : true; // if no desc field defined, we only care about summary or others\r\n\r\n // User rule: If both fields are empty, need to throw error (come from JSON)\r\n const bothRequired = !!multiCfg.summaryField && !!multiCfg.descriptionField;\r\n if (bothRequired && !hasSummary && !hasDesc) {\r\n this.multiSaveError = this.controller.labels['ERR_MSG_EMPTY_MULTI'] || 'Please fill the required fields before saving.';\r\n return;\r\n }\r\n\r\n this.multiSaveError = '';\r\n instance.isSaved = true;\r\n instance.isEditing = false;\r\n instance.initialValue = { ...instance.fg.value };\r\n\r\n // Push to the parent formArray so its submitted as part of the FormGroup value\r\n if (!this.groupFormArray.controls.includes(instance.fg)) {\r\n this.groupFormArray.push(instance.fg);\r\n }\r\n }\r\n }\r\n\r\n cancelGroupInstance(index: number): void {\r\n const instance = this.instanceList[index];\r\n if (!instance.isSaved) {\r\n // It was a new, unsaved addition - remove it entirely\r\n this.removeGroupInstance(index, true);\r\n } else {\r\n // Revert to original values\r\n if (instance.initialValue) {\r\n instance.fg.patchValue(instance.initialValue, { emitEvent: false });\r\n }\r\n instance.isEditing = false;\r\n }\r\n }\r\n\r\n editGroupInstance(index: number): void {\r\n const instance = this.instanceList[index];\r\n instance.isEditing = true;\r\n instance.initialValue = { ...instance.fg.value };\r\n }\r\n\r\n toggleExpandGroupInstance(index: number): void {\r\n const instance = this.instanceList[index];\r\n instance.isExpanded = !instance.isExpanded;\r\n }\r\n\r\n removeGroupInstance(index: number, force: boolean = false): void {\r\n // If not multiSave, we keep the one-row minimum rule.\r\n // In multiSave, we can remove it even if it's the last one.\r\n const isMultiSave = !!this.config.sectionConfig?.multiSaveConfig?.active;\r\n\r\n if (force || isMultiSave || this.instanceList.length > 1) {\r\n const instance = this.instanceList[index];\r\n const arrayIndex = this.groupFormArray.controls.indexOf(instance.fg);\r\n if (arrayIndex >= 0) {\r\n this.groupFormArray.removeAt(arrayIndex);\r\n }\r\n this.instanceList = this.instanceList.filter((_, i) => i !== index);\r\n }\r\n }\r\n\r\n trackByInstanceId(_: number, item: { id: number; fg: FormGroup }): number {\r\n return item.id;\r\n }\r\n\r\n // ── Leaf control ─────────────────────────────────────────────────────────\r\n\r\n ngOnDestroy(): void {\r\n // Always complete so any subscriptions (e.g. subfields valueChanges) are cleaned up\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n\r\n if (this.isGroup) {\r\n if (this.formGroup?.contains(this.groupKey)) {\r\n this.formGroup.removeControl(this.groupKey);\r\n }\r\n return;\r\n }\r\n\r\n const fieldName = this.config.name;\r\n if (fieldName && this.formGroup?.contains(fieldName)) {\r\n this.formGroup.removeControl(fieldName);\r\n }\r\n }\r\n\r\n registerControl(): void {\r\n if (!this.config.name || !this.formGroup) return;\r\n\r\n const fieldName = this.config.name;\r\n const validators = this.getValidators();\r\n\r\n // When inside a repeater instance, ALWAYS start with defaultValue (never\r\n // read from the shared controller — prevents cross-instance value copying).\r\n const initialValue = this.allowMulti\r\n ? (this.config.defaultValue ?? null)\r\n : (this.controller.getFieldValue(fieldName) ?? this.config.defaultValue ?? null);\r\n\r\n let control = this.formGroup.get(fieldName) as FormControl;\r\n if (!control) {\r\n control = new FormControl(\r\n { value: initialValue, disabled: !!this.config.disabled },\r\n validators\r\n );\r\n this.formGroup.addControl(fieldName, control);\r\n }\r\n\r\n this.value = control.value;\r\n\r\n if (!this.allowMulti) {\r\n // ── Flat field: keep in sync with shared controller ──────────────────\r\n control.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(val => {\r\n this.value = val;\r\n this.controller.updateField(fieldName, val);\r\n });\r\n\r\n this.controller.getFieldObservable(fieldName).pipe(takeUntil(this.destroy$)).subscribe(val => {\r\n if (val !== control.value) {\r\n control.setValue(val, { emitEvent: false });\r\n this.value = val;\r\n }\r\n });\r\n } else {\r\n // ── Repeater field: local value tracking only ─────────────────────────\r\n control.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(val => {\r\n this.value = val;\r\n });\r\n }\r\n }\r\n\r\n getValidators(): ValidatorFn[] {\r\n const validators: ValidatorFn[] = [];\r\n if (this.config.required) validators.push(Validators.required);\r\n if (this.config.subType === 'EMAIL') validators.push(Validators.email);\r\n if (this.config.subType === 'PASSWORD') {\r\n // Minimum 8 chars by default; honour explicit textConfig.length overrides\r\n const minLen = this.config.textConfig?.length?.min ?? 8;\r\n validators.push(Validators.minLength(minLen));\r\n }\r\n if (this.config.textConfig?.length) {\r\n const { min, max } = this.config.textConfig.length;\r\n if (min && this.config.subType !== 'PASSWORD') validators.push(Validators.minLength(min));\r\n if (max) validators.push(Validators.maxLength(max));\r\n }\r\n if (this.config.textConfig?.pattern) validators.push(Validators.pattern(this.config.textConfig.pattern));\r\n if (this.config.numberConfig) {\r\n const { min, max } = this.config.numberConfig;\r\n if (min !== undefined) validators.push(Validators.min(min));\r\n if (max !== undefined) validators.push(Validators.max(max));\r\n }\r\n if (this.config.type === 'RICH_TEXT' && this.config.richTextConfig?.maxLength) {\r\n const max = this.config.richTextConfig.maxLength;\r\n validators.push((control: import('@angular/forms').AbstractControl) => {\r\n if (!control.value) return null;\r\n const plainText = String(control.value).replace(/<[^>]*>/g, '');\r\n return plainText.length > max\r\n ? { 'maxlength': { requiredLength: max, actualLength: plainText.length } }\r\n : null;\r\n });\r\n }\r\n return validators;\r\n }\r\n\r\n // ── Cross-field match validation (password === confirmPassword) ───────────\r\n\r\n /**\r\n * When `textConfig.matchField` is configured, subscribes to value changes on\r\n * BOTH this control and the referenced control so the mismatch error updates\r\n * instantly whichever field the user edits last.\r\n *\r\n * - Values differ → sets `{ passwordMismatch: true }` on THIS control.\r\n * - Values match → clears `passwordMismatch` from THIS control.\r\n */\r\n setupMatchValidation(): void {\r\n const matchFieldName = this.config.textConfig?.matchField;\r\n if (!matchFieldName || !this.config.name || !this.formGroup) return;\r\n\r\n const thisControl = this.formGroup.get(this.config.name);\r\n const otherControl = this.formGroup.get(matchFieldName);\r\n if (!thisControl || !otherControl) return;\r\n\r\n const runCheck = () => {\r\n const thisVal = thisControl.value;\r\n const otherVal = otherControl.value;\r\n\r\n if (thisVal && otherVal && thisVal !== otherVal) {\r\n // Both have a value but they differ — flag the mismatch\r\n thisControl.setErrors(\r\n { ...thisControl.errors, passwordMismatch: true },\r\n { emitEvent: false }\r\n );\r\n } else {\r\n // Either one is empty OR they now match — clear the mismatch error\r\n if (thisControl.hasError('passwordMismatch')) {\r\n const errors = { ...thisControl.errors };\r\n delete errors['passwordMismatch'];\r\n thisControl.setErrors(\r\n Object.keys(errors).length ? errors : null,\r\n { emitEvent: false }\r\n );\r\n }\r\n }\r\n };\r\n\r\n // Fire when THIS (confirmPassword) field changes\r\n thisControl.valueChanges\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => runCheck());\r\n\r\n // Also fire when the OTHER (password) field changes so the error clears\r\n // as soon as the user corrects the source value\r\n otherControl.valueChanges\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => runCheck());\r\n }\r\n\r\n setupVisibility(): void {\r\n if (!this.config.visibilityExpression) return;\r\n const variables = this.expressionService.extractVariables(this.config.visibilityExpression);\r\n const observables = variables.map(v => this.controller.getFieldObservable(v));\r\n combineLatest(observables).pipe(takeUntil(this.destroy$)).subscribe(() => {\r\n const context = this.controller.getAllData();\r\n this.isVisible = this.expressionService.evaluateCondition(this.config.visibilityExpression!, context);\r\n const control = this.formGroup?.get(this.config.name!);\r\n if (control) {\r\n this.isVisible ? control.enable({ emitEvent: false }) : control.disable({ emitEvent: false });\r\n }\r\n });\r\n }\r\n\r\n setupGeneratedField(): void {\r\n if (this.config.type !== 'GENERATED' || !this.config.generatedConfig) return;\r\n const variables = this.config.generatedConfig.variables || [];\r\n const observables = variables.map(v => this.controller.getFieldObservable(v));\r\n combineLatest(observables).pipe(takeUntil(this.destroy$)).subscribe(() => {\r\n const context = this.controller.getAllData();\r\n const result = this.evaluateFormula(context);\r\n if (result !== null && this.config.name) {\r\n this.controller.updateField(this.config.name, result);\r\n }\r\n });\r\n }\r\n\r\n evaluateFormula(context: { [key: string]: any }): any {\r\n if (!this.config.generatedConfig) return null;\r\n const formula = this.config.generatedConfig.formula;\r\n const functionName = this.extractFunctionName(formula);\r\n if (functionName) {\r\n return this.expressionService.evaluateFormula(\r\n formula, functionName, context, this.config.generatedConfig.variables\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n extractFunctionName(formula: string): string | null {\r\n const match = formula.match(/(?:function|fun)\\s+(\\w+)\\s*\\(/);\r\n return match ? match[1] : null;\r\n }\r\n\r\n setupDependencies(): void {\r\n if (!this.config.optionConfig?.dependencies) return;\r\n const dependencies = this.config.optionConfig.dependencies;\r\n const observables = Object.values(dependencies).map(fieldName =>\r\n this.controller.getFieldObservable(fieldName)\r\n );\r\n combineLatest(observables).pipe(takeUntil(this.destroy$)).subscribe(values => {\r\n const dependencyValues: { [key: string]: any } = {};\r\n Object.keys(dependencies).forEach((paramKey, index) => {\r\n dependencyValues[paramKey] = values[index];\r\n });\r\n const allPresent = Object.values(dependencyValues).every(\r\n v => v !== null && v !== undefined && v !== ''\r\n );\r\n if (allPresent) {\r\n this.loadDropdownOptions(dependencyValues);\r\n } else if (this.config.optionConfig) {\r\n this.config.optionConfig.optionList = [];\r\n }\r\n });\r\n }\r\n\r\n loadDropdownOptions(queryParams: { [key: string]: any } = {}): void {\r\n const optionConfig = this.config.optionConfig;\r\n const urls = optionConfig?.apiUrls ||\r\n (optionConfig?.apiUrl ? [optionConfig.apiUrl] :\r\n optionConfig?.optionUrl ? [optionConfig.optionUrl] : []);\r\n\r\n if (!urls || urls.length === 0) return;\r\n\r\n const observables = urls.map(url => {\r\n let fullUrl = url;\r\n const params = new URLSearchParams();\r\n Object.entries(queryParams).forEach(([key, value]) => {\r\n if (value !== null && value !== undefined) params.append(key, String(value));\r\n });\r\n const queryString = params.toString();\r\n if (queryString) fullUrl += (fullUrl.includes('?') ? '&' : '?') + queryString;\r\n return this.http.get<any>(fullUrl, { headers: this.getHeaders() });\r\n });\r\n\r\n forkJoin(observables).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: responses => {\r\n let mergedData: any[] = [];\r\n responses.forEach(response => {\r\n let data = optionConfig?.dataPath\r\n ? this.getValueByPath(response, optionConfig.dataPath)\r\n : (Array.isArray(response) ? response : response.data || response.items || response || []);\r\n\r\n // Handle Dictionary Objects by converting them to Arrays\r\n if (data !== null && typeof data === 'object' && !Array.isArray(data)) {\r\n data = Object.values(data);\r\n }\r\n\r\n if (Array.isArray(data)) mergedData = [...mergedData, ...data];\r\n });\r\n\r\n if (optionConfig?.sortBy) {\r\n const sortKey = optionConfig.sortBy;\r\n const direction = optionConfig.sortDirection === 'DESC' ? -1 : 1;\r\n mergedData.sort((a, b) => {\r\n const valA = this.getValueByPath(a, sortKey);\r\n const valB = this.getValueByPath(b, sortKey);\r\n if (typeof valA === 'string' && typeof valB === 'string') return direction * valA.localeCompare(valB);\r\n if (typeof valA === 'number' && typeof valB === 'number') return direction * (valA - valB);\r\n return 0;\r\n });\r\n }\r\n\r\n this.config.optionConfig!.optionList = mergedData.map((item: any) => {\r\n const label = optionConfig?.labelPath\r\n ? this.getValueByPath(item, optionConfig.labelPath)\r\n : (item.label || item.name);\r\n const code = optionConfig?.valuePath\r\n ? this.getValueByPath(item, optionConfig.valuePath)\r\n : (item.code || item.id || item.value);\r\n return { label: String(label), code, value: item };\r\n });\r\n\r\n // Refresh autocomplete filter list after options arrive from API\r\n if (this.isAutocomplete) {\r\n this.filteredOptions = [...(this.config.optionConfig!.optionList || [])];\r\n this._syncAutocompleteDisplayValue();\r\n }\r\n },\r\n error: err => console.error('Failed to load dropdown options:', err)\r\n });\r\n }\r\n\r\n private getValueByPath(obj: any, path: string): any {\r\n if (!path || path === '') return obj;\r\n return path.split('.').reduce((acc, part) => {\r\n const match = part.match(/(\\w+)\\[(\\d+)\\]/);\r\n if (match) return acc?.[match[1]]?.[parseInt(match[2])];\r\n return acc?.[part];\r\n }, obj);\r\n }\r\n\r\n /** Builds HttpHeaders using the token stored in the SmartFormController (sourced from configJSON). */\r\n private getHeaders(): HttpHeaders {\r\n let headers = new HttpHeaders();\r\n if (this.controller.token) {\r\n const headerName = this.controller.tokenHeader || 'Authorization';\r\n headers = headers.set(headerName, this.controller.token);\r\n }\r\n return headers;\r\n }\r\n\r\n updateValue(newValue: any): void {\r\n if (!this.config.name) return;\r\n const control = this.formGroup.get(this.config.name);\r\n if (control) {\r\n control.setValue(newValue);\r\n control.markAsDirty();\r\n control.markAsTouched();\r\n }\r\n }\r\n\r\n onCheckboxListChange(code: string, checked: boolean): void {\r\n if (!this.config.name) return;\r\n const currentValue = (this.allowMulti\r\n ? (this.formGroup.get(this.config.name)?.value)\r\n : this.controller.getFieldValue(this.config.name)) || [];\r\n const newValue = checked\r\n ? [...currentValue, code]\r\n : currentValue.filter((c: string) => c !== code);\r\n this.updateValue(newValue);\r\n }\r\n\r\n isChecked(code: string): boolean {\r\n const value = this.value || [];\r\n return Array.isArray(value) && value.includes(code);\r\n }\r\n\r\n get errorMessage(): string {\r\n if (!this.config.name || !this.formGroup) return '';\r\n const control = this.formGroup.get(this.config.name);\r\n if (control && control.invalid && (control.touched || control.dirty)) {\r\n if (control.hasError('required')) return 'This field is required';\r\n if (control.hasError('email')) return 'Invalid email format';\r\n if (control.hasError('passwordMismatch')) return 'Passwords do not match';\r\n if (control.hasError('formulaError')) return this.config.errorMessage || 'Invalid value';\r\n if (control.hasError('minlength')) return `Minimum length is ${control.errors?.['minlength'].requiredLength} characters`;\r\n if (control.hasError('maxlength')) return `Maximum length is ${control.errors?.['maxlength'].requiredLength} characters`;\r\n if (control.hasError('min')) return `Minimum value is ${control.errors?.['min'].min}`;\r\n if (control.hasError('max')) return `Maximum value is ${control.errors?.['max'].max}`;\r\n if (control.hasError('pattern')) return this.config.textConfig?.patternMessage || 'Invalid format';\r\n }\r\n return '';\r\n }\r\n\r\n get showCharCount(): boolean {\r\n if (this.isTextField && this.config.subType !== 'PHONE') {\r\n return !!(this.config.textConfig?.showCharCount && this.config.textConfig?.length?.max);\r\n }\r\n if (this.isRichText) {\r\n return !!(this.config.richTextConfig?.showCharCount && this.config.richTextConfig?.maxLength);\r\n }\r\n return false;\r\n }\r\n\r\n get remainingCharacters(): number | null {\r\n if (!this.showCharCount || !this.formGroup || !this.config.name) return null;\r\n const currentVal = this.formGroup.get(this.config.name)?.value || '';\r\n\r\n if (this.isTextField && this.config.textConfig?.length?.max) {\r\n return Math.max(0, this.config.textConfig.length.max - currentVal.length);\r\n }\r\n if (this.isRichText && this.config.richTextConfig?.maxLength) {\r\n const plainText = String(currentVal).replace(/<[^>]*>/g, '');\r\n return Math.max(0, this.config.richTextConfig.maxLength - plainText.length);\r\n }\r\n return null;\r\n }\r\n\r\n // ── Type guards ──────────────────────────────────────────────────────────\r\n\r\n get isTextField(): boolean { return this.config.type === 'TEXT_INPUT'; }\r\n get isNumberField(): boolean { return this.config.type === 'NUMBER_INPUT'; }\r\n get isDateField(): boolean { return this.config.type === 'DATE'; }\r\n get isTimeField(): boolean { return this.config.type === 'TIME'; }\r\n get isDropdown(): boolean { return this.config.type === 'DROPDOWN'; }\r\n get isAutocomplete(): boolean { return this.config.type === 'AUTOCOMPLETE'; }\r\n get isFileUpload(): boolean { return this.config.type === 'FILE_UPLOAD'; }\r\n get isMediaUpload(): boolean { return this.config.type === 'MEDIA_UPLOAD'; }\r\n get isRadio(): boolean { return this.config.type === 'RADIO'; }\r\n get isCheckbox(): boolean { return this.config.type === 'CHECKBOX'; }\r\n get isChip(): boolean { return this.config.type === 'CHIP'; }\r\n get isSwitch(): boolean { return this.config.type === 'SWITCH'; }\r\n get isRating(): boolean { return this.config.type === 'RATING'; }\r\n get isRichText(): boolean { return this.config.type === 'RICH_TEXT'; }\r\n get isGenerated(): boolean { return this.config.type === 'GENERATED'; }\r\n get isRow(): boolean { return this.config.type === 'ROW'; }\r\n get isGroup(): boolean { return this.config.type === 'GROUP'; }\r\n get isLocation(): boolean { return this.config.type === 'LOCATION'; }\r\n\r\n // ── AUTOCOMPLETE helpers ────────────────────────────────────────────────\r\n\r\n /**\r\n * Initialise the separate display-control that drives the mat-autocomplete\r\n * text input. The real form control always stores the *code* value.\r\n */\r\n private initAutocomplete(): void {\r\n // Sync display input whenever the real control value changes externally\r\n this._syncAutocompleteDisplayValue();\r\n\r\n // Filter the option list as the user types\r\n this.autocompleteInputCtrl.valueChanges\r\n .pipe(debounceTime(150), distinctUntilChanged(), takeUntil(this.destroy$))\r\n .subscribe(search => {\r\n this.filteredOptions = this._filterOptions(typeof search === 'string' ? search : '');\r\n });\r\n\r\n // Initialise filtered list with all available options\r\n this.filteredOptions = [...(this.config.optionConfig?.optionList || [])];\r\n }\r\n\r\n /** Filter options by the user's search text (matches label or code). */\r\n private _filterOptions(search: string): { label: string; code: any }[] {\r\n const q = search.toLowerCase().trim();\r\n if (!q) return [...(this.config.optionConfig?.optionList || [])];\r\n return (this.config.optionConfig?.optionList || []).filter(opt =>\r\n opt.label?.toLowerCase().includes(q) ||\r\n String(opt.code).toLowerCase().includes(q)\r\n );\r\n }\r\n\r\n /** Put the human-readable label into the display control based on the stored code. */\r\n private _syncAutocompleteDisplayValue(): void {\r\n if (!this.config.name) return;\r\n const code = this.formGroup?.get(this.config.name)?.value;\r\n if (code === null || code === undefined || code === '') return;\r\n const matched = (this.config.optionConfig?.optionList || []).find(o => o.code === code);\r\n if (matched) {\r\n this.autocompleteInputCtrl.setValue(matched.label, { emitEvent: false });\r\n }\r\n }\r\n\r\n /** Called when user picks an option from the mat-autocomplete panel. */\r\n onAutocompleteSelected(option: { label: string; code: any }): void {\r\n this.autocompleteInputCtrl.setValue(option.label, { emitEvent: false });\r\n this.updateValue(option.code);\r\n }\r\n\r\n /** Called when the input loses focus — clear display & value if text was manually deleted. */\r\n onAutocompleteClear(): void {\r\n const display = (this.autocompleteInputCtrl.value || '').trim();\r\n if (!display) {\r\n this.updateValue(null);\r\n } else {\r\n // Restore label from stored code (prevents partial text staying)\r\n this._syncAutocompleteDisplayValue();\r\n }\r\n }\r\n\r\n /**\r\n * Returns the effective grid column span for a child inside a ROW.\r\n * If the child declares an explicit colSpan, use it.\r\n * Otherwise divide 12 equally among all children (floor, min 1).\r\n */\r\n getChildColSpan(child: FieldConfig): number {\r\n if (child.colSpan) return child.colSpan;\r\n const count = this.config.children?.length || 1;\r\n return Math.max(1, Math.floor(12 / count));\r\n }\r\n\r\n getOptionColSpan(option: any): number {\r\n const span = option.colSpan || option.colspan;\r\n if (span) return span;\r\n const count = this.config.optionConfig?.optionList?.length || 1;\r\n return Math.max(1, Math.floor(12 / count));\r\n }\r\n\r\n // ── Rating helpers ───────────────────────────────────────────────────────\r\n\r\n onRatingChange(star: number, event?: MouseEvent): void {\r\n if (!this.config.name || this.config.disabled) return;\r\n let newValue = star;\r\n if (this.config.ratingConfig?.allowHalf && event) {\r\n const target = event.target as HTMLElement;\r\n const rect = target.getBoundingClientRect();\r\n if (event.clientX - rect.left < rect.width / 2) newValue = star - 0.5;\r\n }\r\n if (this.value === newValue) newValue = 0;\r\n this.updateValue(newValue);\r\n }\r\n\r\n getStarArray(): number[] {\r\n const max = this.config.ratingConfig?.maxRating || 5;\r\n return Array.from({ length: max }, (_, i) => i + 1);\r\n }\r\n\r\n isStarHalf(star: number): boolean { return (this.value || 0) === star - 0.5; }\r\n isStarFilled(star: number): boolean { return (this.value || 0) >= star; }\r\n\r\n // ── File Upload helpers ──────────────────────────────────────────────────\r\n\r\n onDragOver(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver = true;\r\n }\r\n\r\n onDragLeave(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver = false;\r\n }\r\n\r\n onFileDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver = false;\r\n const files = event.dataTransfer?.files;\r\n if (files && files.length > 0) {\r\n this.processFiles(files);\r\n }\r\n }\r\n\r\n onFileSelected(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (input.files && input.files.length > 0) {\r\n this.processFiles(input.files);\r\n }\r\n // Reset input so the same file can be re-selected if removed\r\n input.value = '';\r\n }\r\n\r\n private processFiles(files: FileList): void {\r\n // ── MEDIA_UPLOAD branch — uses attachmentConfig, stores MediaItem[] ─────\r\n if (this.isMediaUpload) {\r\n const mediaCfg = this.config.attachmentConfig;\r\n if (!mediaCfg) return;\r\n const maxItems = mediaCfg.maxFiles ?? 10;\r\n\r\n let errorShown = false;\r\n\r\n Array.from(files).forEach(file => {\r\n if (this.mediaItems.length >= maxItems) {\r\n if (!errorShown) {\r\n this.showMediaError(this.controller.labels['ERR_MEDIA_MAX'] || `Maximum ${maxItems} media items allowed.`);\r\n errorShown = true;\r\n }\r\n return;\r\n }\r\n\r\n const placeholder: MediaItem = { mediaType: 'image', url: '', isUploading: true };\r\n this._appendMediaItem(placeholder);\r\n\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n if (mediaCfg.entityType) formData.append('entity_type', mediaCfg.entityType);\r\n\r\n if (!mediaCfg.uploadUrl) return;\r\n this.http.post<any>(mediaCfg.uploadUrl, formData, { headers: this.getHeaders() })\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response: any) => {\r\n // API returns { completeURL, id, mimeType, fileName, ... }\r\n const resolvedUrl: string = (response?.completeURL ?? response)?.toString().trim();\r\n const current: MediaItem[] = [...this.mediaItems];\r\n const idx = current.indexOf(placeholder);\r\n if (idx !== -1) {\r\n current[idx] = {\r\n mediaType: 'image',\r\n url: resolvedUrl,\r\n id: response?.id,\r\n mimeType: response?.mimeType,\r\n fileName: response?.fileName ?? response?.name,\r\n isUploading: false\r\n };\r\n this.updateValue(current);\r\n this.mediaCarouselIndex = current.length - 1;\r\n }\r\n },\r\n error: () => {\r\n const cleaned = this.mediaItems.filter(m => m !== placeholder);\r\n this.updateValue(cleaned.length ? cleaned : null);\r\n }\r\n });\r\n });\r\n return;\r\n }\r\n\r\n // ── FILE_UPLOAD branch — uses attachmentConfig, stores UploadedFile[] ────\r\n this.fileUploadError = '';\r\n const cfg = this.config.attachmentConfig;\r\n const maxSizeBytes = (cfg?.maxSizeMB ?? 10) * 1024 * 1024;\r\n const currentFiles: UploadedFile[] = (this.value as UploadedFile[]) || [];\r\n const maxFiles = cfg?.maxFiles ?? (cfg?.multiple ? 10 : 1);\r\n const isMultiple = cfg?.multiple ?? false;\r\n\r\n const incoming = Array.from(files);\r\n\r\n for (const file of incoming) {\r\n // Size validation\r\n if (file.size > maxSizeBytes) {\r\n this.fileUploadError = `\"${file.name}\" exceeds the maximum allowed size of ${cfg?.maxSizeMB ?? 10} MB.`;\r\n continue;\r\n }\r\n // Max-files validation\r\n if (isMultiple && currentFiles.length >= maxFiles) {\r\n this.fileUploadError = `Maximum ${maxFiles} file${maxFiles !== 1 ? 's' : ''} allowed.`;\r\n break;\r\n }\r\n\r\n if (cfg?.uploadUrl) {\r\n // ── API upload path ───────────────────────────────────────────────\r\n const entry: UploadedFile = {\r\n name: file.name,\r\n size: file.size,\r\n type: file.type,\r\n file,\r\n isUploading: true\r\n };\r\n\r\n // Add the placeholder entry immediately so the UI shows the progress row\r\n const withPlaceholder = isMultiple\r\n ? [...(this.value as UploadedFile[] || []), entry]\r\n : [entry];\r\n this.updateValue(withPlaceholder);\r\n\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n if (cfg.entityType) {\r\n formData.append('entity_type', cfg.entityType);\r\n }\r\n\r\n this.http.post<any>(cfg.uploadUrl, formData, { headers: this.getHeaders() })\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response: any) => {\r\n // The API returns a JSON object; use completeURL if present,\r\n // otherwise fall back to treating the raw response as a URL string.\r\n const resolvedUrl: string = (response?.completeURL ?? response)?.toString().trim();\r\n const current: UploadedFile[] = (this.value as UploadedFile[]) || [];\r\n const idx = current.indexOf(entry);\r\n if (idx !== -1) {\r\n const updatedEntry: UploadedFile = { ...entry, dataUrl: resolvedUrl, id: response?.id, isUploading: false };\r\n const updatedList = [...current];\r\n updatedList[idx] = updatedEntry;\r\n this.updateValue(updatedList);\r\n }\r\n },\r\n error: () => {\r\n // Remove the failed placeholder from the list\r\n const current: UploadedFile[] = (this.value as UploadedFile[]) || [];\r\n const cleaned = current.filter(f => f !== entry);\r\n this.updateValue(cleaned.length ? cleaned : null);\r\n this.fileUploadError = `Failed to upload \"${file.name}\". Please try again.`;\r\n }\r\n });\r\n } else {\r\n // ── FileReader (base64) fallback path ────────────────────────────\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n const entry: UploadedFile = {\r\n name: file.name,\r\n size: file.size,\r\n type: file.type,\r\n dataUrl: e.target?.result as string,\r\n file\r\n };\r\n const updated = isMultiple\r\n ? [...(this.value as UploadedFile[] || []), entry]\r\n : [entry];\r\n this.updateValue(updated);\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n }\r\n }\r\n\r\n removeUploadedFile(index: number): void {\r\n const current: UploadedFile[] = (this.value as UploadedFile[]) || [];\r\n const fileToRemove = current[index];\r\n if (!fileToRemove) return;\r\n\r\n const removeLocally = () => {\r\n const updated = current.filter((_, i) => i !== index);\r\n this.updateValue(updated);\r\n };\r\n\r\n const deleteUrl = this.config.attachmentConfig?.deleteUrl;\r\n\r\n if (fileToRemove.id && fileToRemove.id !== 0 && deleteUrl) {\r\n fileToRemove.isUploading = true; // Use this flag to disable the remove button\r\n this.updateValue([...current]); // trigger UI update\r\n\r\n let params = new HttpParams();\r\n if (!deleteUrl.includes('attachmentId=')) {\r\n params = params.set('attachmentId', fileToRemove.id.toString());\r\n }\r\n if (!deleteUrl.includes('reason=')) {\r\n // As requested in the API link, the reason is passed\r\n params = params.set('reason', 'DELECTED BY CREATOR');\r\n }\r\n\r\n this.http.delete<any>(deleteUrl, { headers: this.getHeaders(), params })\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: () => {\r\n removeLocally();\r\n },\r\n error: (err) => {\r\n console.error('Failed to delete attachment', err);\r\n fileToRemove.isUploading = false;\r\n this.fileUploadError = `Failed to delete \"${fileToRemove.name}\". Please try again.`;\r\n this.updateValue([...current]);\r\n }\r\n });\r\n } else {\r\n removeLocally();\r\n }\r\n }\r\n\r\n getFileIcon(mimeType: string): string {\r\n if (!mimeType) return 'attach_file'; // guard: undefined/null from non-FILE_UPLOAD values\r\n if (mimeType.includes('pdf')) return 'picture_as_pdf';\r\n if (mimeType.includes('image')) return 'image';\r\n if (mimeType.includes('word') || mimeType.includes('document')) return 'description';\r\n if (mimeType.includes('sheet') || mimeType.includes('excel') || mimeType.includes('csv')) return 'table_chart';\r\n if (mimeType.includes('zip') || mimeType.includes('compressed')) return 'folder_zip';\r\n return 'attach_file';\r\n }\r\n\r\n formatFileSize(bytes: number): string {\r\n if (bytes < 1024) return `${bytes} B`;\r\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\r\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\r\n }\r\n\r\n // ── Action Labels ──────────────────────────────────────────────────────────\r\n\r\n get addLabel(): string {\r\n const key = this.controller.actionLabels?.addLabel || 'Add';\r\n return this.controller.labels[key] || key;\r\n }\r\n\r\n get removeLabel(): string {\r\n const key = this.controller.actionLabels?.removeLabel || 'Remove';\r\n return this.controller.labels[key] || key;\r\n }\r\n\r\n // ── MEDIA_UPLOAD helpers ─────────────────────────────────────────────────\r\n\r\n get mediaItems(): MediaItem[] {\r\n return (this.value as MediaItem[]) || [];\r\n }\r\n\r\n /** Number of active items (used to clamp carousel index) */\r\n get mediaCount(): number { return this.mediaItems.length; }\r\n\r\n /** The currently visible carousel item */\r\n get activeMediaItem(): MediaItem | null {\r\n if (!this.mediaItems.length) return null;\r\n return this.mediaItems[Math.min(this.mediaCarouselIndex, this.mediaItems.length - 1)];\r\n }\r\n\r\n /** Thumbnail strip items */\r\n get mediaThumbnails(): MediaItem[] { return this.mediaItems; }\r\n\r\n mediaCarouselPrev(): void {\r\n if (this.mediaCarouselIndex > 0) this.mediaCarouselIndex--;\r\n }\r\n\r\n mediaCarouselNext(): void {\r\n if (this.mediaCarouselIndex < this.mediaItems.length - 1) this.mediaCarouselIndex++;\r\n }\r\n\r\n mediaGoTo(index: number): void {\r\n this.mediaCarouselIndex = index;\r\n }\r\n\r\n // ── YouTube ──────────────────────────────────────────────────────────────\r\n\r\n onMediaMenuVideo(): void {\r\n this.showMediaMenu = false;\r\n this.showYoutubeInput = !this.showYoutubeInput;\r\n this.youtubeUrlInput = '';\r\n this.youtubeUrlError = '';\r\n }\r\n\r\n addYoutubeMedia(): void {\r\n const cfg = this.config.attachmentConfig;\r\n const maxItems = cfg?.maxFiles ?? 10;\r\n if (this.mediaItems.length >= maxItems) {\r\n this.showMediaError(this.controller.labels['ERR_MEDIA_MAX'] || `Maximum ${maxItems} media items allowed.`);\r\n return;\r\n }\r\n\r\n const url = this.youtubeUrlInput.trim();\r\n const videoId = this._extractYoutubeId(url);\r\n if (!videoId) {\r\n this.youtubeUrlError = this.controller.labels['ERR_INVALID_YOUTUBE_URL'] || 'Please enter a valid YouTube URL.';\r\n return;\r\n }\r\n const item: MediaItem = {\r\n mediaType: 'youtube',\r\n url: `https://www.youtube.com/embed/${videoId}`,\r\n thumbnailUrl: `https://img.youtube.com/vi/${videoId}/mqdefault.jpg`\r\n };\r\n this._appendMediaItem(item);\r\n this.showYoutubeInput = false;\r\n this.youtubeUrlInput = '';\r\n this.youtubeUrlError = '';\r\n }\r\n\r\n private _extractYoutubeId(url: string): string | null {\r\n const patterns = [\r\n /(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/|youtube\\.com\\/embed\\/)([\\w-]{11})/,\r\n /youtube\\.com\\/shorts\\/([\\w-]{11})/\r\n ];\r\n for (const p of patterns) {\r\n const m = url.match(p);\r\n if (m) return m[1];\r\n }\r\n return null;\r\n }\r\n\r\n // ── Device upload ────────────────────────────────────────────────────────\r\n\r\n onMediaMenuDevice(): void {\r\n this.showMediaMenu = false;\r\n this.showYoutubeInput = false;\r\n // Use setTimeout so Angular finishes closing the dropdown before the\r\n // browser opens the native file picker (the input lives outside *ngIf).\r\n setTimeout(() => this.mediaDeviceInput?.nativeElement?.click());\r\n }\r\n\r\n onMediaFileSelected(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (input.files && input.files.length > 0) {\r\n this.processFiles(input.files);\r\n }\r\n input.value = '';\r\n }\r\n\r\n // ── Library helpers ──────────────────────────────────────────────────────\r\n\r\n /**\r\n * Resolves the library-image sync POST endpoint from `attachmentConfig.libraryConfig.uploadConfig`.\r\n * Returns `null` when not configured; the caller skips the API call.\r\n */\r\n private buildLibraryUploadRequest(\r\n cfg: AttachmentConfig | undefined,\r\n runtimeContext: Record<string, any>\r\n ): { baseUrl: string; params: HttpParams } | null {\r\n const uploadConfig = cfg?.libraryConfig?.uploadConfig;\r\n if (!uploadConfig) return null;\r\n\r\n const { baseUrl, params: paramDefs = [] } = uploadConfig;\r\n let params = new HttpParams();\r\n\r\n for (const def of paramDefs) {\r\n let value: string | undefined;\r\n\r\n // sourcePath takes precedence over staticValue\r\n if (def.sourcePath) {\r\n const resolved = def.sourcePath\r\n .split('.')\r\n .reduce((obj: Record<string, any>, k: string) => obj?.[k], runtimeContext);\r\n if (resolved !== null && resolved !== undefined) {\r\n value = String(resolved);\r\n }\r\n }\r\n\r\n if (!value && def.staticValue) {\r\n value = def.staticValue;\r\n }\r\n\r\n if (def.required && !value) {\r\n console.warn(`[SmartForm] libraryConfig.uploadConfig: required param \"${def.key}\" could not be resolved.`);\r\n return null;\r\n }\r\n\r\n if (value) {\r\n params = params.set(def.key, value);\r\n }\r\n }\r\n\r\n return { baseUrl, params };\r\n }\r\n\r\n // ── Library picker ───────────────────────────────────────────────────────\r\n\r\n onMediaMenuLibrary(): void {\r\n this.showMediaMenu = false;\r\n this.showYoutubeInput = false;\r\n this.libraryImages = [];\r\n this.librarySelectedIds = new Set();\r\n this.libraryError = '';\r\n this.showLibraryModal = true;\r\n this._loadLibraryImages();\r\n }\r\n\r\n private _loadLibraryImages(): void {\r\n const cfg = this.config.attachmentConfig;\r\n const libCfg = cfg?.libraryConfig;\r\n if (!libCfg?.apiUrl) { this.libraryError = 'Library not configured.'; return; }\r\n this.libraryLoading = true;\r\n this.http.get<any>(libCfg.apiUrl, { headers: this.getHeaders() })\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res: any) => {\r\n let data: any;\r\n\r\n if (libCfg.dataPath) {\r\n // Try explicit dot-notation path configured by the dev (e.g. 'data.items')\r\n data = this.getValueByPath(res, libCfg.dataPath);\r\n }\r\n\r\n // If no array was found at the configured path, try auto-detecting\r\n // the array from common structures\r\n if (!Array.isArray(data)) {\r\n if (Array.isArray(res)) {\r\n // API returned a plain array\r\n data = res;\r\n } else if (res && typeof res === 'object') {\r\n // API returned an object keyed by entity-id e.g. { \"1\": [...], \"2\": [...] }\r\n // Flatten all value-arrays into one list\r\n data = (Object.values(res) as any[][])\r\n .filter(v => Array.isArray(v))\r\n .reduce((acc, arr) => acc.concat(arr), []);\r\n }\r\n }\r\n\r\n this.libraryImages = Array.isArray(data) ? data : [];\r\n this.libraryLoading = false;\r\n },\r\n error: () => {\r\n this.libraryError = this.controller.labels['ERR_LIBRARY_LOAD_FAILED'] || 'Failed to load library images.';\r\n this.libraryLoading = false;\r\n }\r\n });\r\n }\r\n\r\n getLibraryItemUrl(item: any): string {\r\n const libCfg = this.config.attachmentConfig?.libraryConfig;\r\n return libCfg?.urlPath ? this.getValueByPath(item, libCfg.urlPath) : (item?.url || item?.completeURL || '');\r\n }\r\n\r\n getLibraryItemId(item: any): any {\r\n const libCfg = this.config.attachmentConfig?.libraryConfig;\r\n return libCfg?.idPath ? this.getValueByPath(item, libCfg.idPath) : (item?.id ?? item);\r\n }\r\n\r\n isLibraryItemSelected(item: any): boolean {\r\n return this.librarySelectedIds.has(this.getLibraryItemId(item));\r\n }\r\n\r\n toggleLibraryItem(item: any): void {\r\n const id = this.getLibraryItemId(item);\r\n if (this.librarySelectedIds.has(id)) {\r\n this.librarySelectedIds.delete(id);\r\n } else {\r\n this.librarySelectedIds.add(id);\r\n }\r\n }\r\n\r\n closeLibraryModal(): void {\r\n this.showLibraryModal = false;\r\n }\r\n\r\n confirmLibrarySelection(): void {\r\n const selectedItems = this.libraryImages.filter(item => this.isLibraryItemSelected(item));\r\n\r\n if (!selectedItems.length) {\r\n this.showLibraryModal = false;\r\n return;\r\n }\r\n\r\n const cfg = this.config.attachmentConfig;\r\n const maxItems = cfg?.maxFiles ?? 10;\r\n // NOTE: track added count live — do NOT snapshot currentItems here\r\n let errorShown = false;\r\n\r\n // Close modal immediately so UI feels responsive\r\n this.showLibraryModal = false;\r\n\r\n selectedItems.forEach(item => {\r\n // Use live count — this.mediaItems grows as _appendMediaItem is called\r\n if (this.mediaItems.length >= maxItems) {\r\n if (!errorShown) {\r\n this.showMediaError(this.controller.labels['ERR_MEDIA_MAX'] || `Maximum ${maxItems} media items allowed.`);\r\n errorShown = true;\r\n }\r\n return;\r\n }\r\n const libraryUrl = this.getLibraryItemUrl(item);\r\n\r\n if (!libraryUrl) return;\r\n\r\n const placeholder: MediaItem = {\r\n mediaType: 'image',\r\n url: libraryUrl,\r\n mimeType: item.mimeType,\r\n fileName: item.fileName ?? item.name,\r\n isUploading: true\r\n };\r\n\r\n this._appendMediaItem(placeholder);\r\n\r\n // Build the POST request using the structured config or legacy URL fallback.\r\n // The runtime context provides dynamic param values (e.g. the selected image URL).\r\n const request = this.buildLibraryUploadRequest(cfg, { libraryItem: { url: libraryUrl } });\r\n\r\n if (request) {\r\n // For legacy fallback the completeUrl param is not yet on params — add it now.\r\n // For the structured config it is declared via sourcePath='libraryItem.url' so\r\n // it gets resolved inside buildLibraryUploadRequest and is already on params.\r\n let { baseUrl, params } = request;\r\n if (!params.has('completeUrl')) {\r\n params = params.set('completeUrl', libraryUrl);\r\n }\r\n\r\n // POST with null body — all data travels as query params\r\n this.http.post<any>(baseUrl, null, { headers: this.getHeaders(), params })\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response: any) => {\r\n const current: MediaItem[] = [...this.mediaItems];\r\n const idx = current.indexOf(placeholder);\r\n if (idx !== -1) {\r\n const resolvedUrl: string = (response?.completeURL ?? response)?.toString().trim();\r\n current[idx] = {\r\n mediaType: 'image',\r\n url: resolvedUrl,\r\n id: response?.id,\r\n mimeType: response?.mimeType ?? placeholder.mimeType,\r\n fileName: response?.fileName ?? response?.name ?? placeholder.fileName,\r\n isUploading: false\r\n };\r\n this.updateValue(current);\r\n }\r\n },\r\n error: (err) => {\r\n console.error('Failed to sync library image to attachments:', err);\r\n const current: MediaItem[] = [...this.mediaItems];\r\n const cleaned = current.filter(m => m !== placeholder);\r\n this.updateValue(cleaned.length ? cleaned : null);\r\n }\r\n });\r\n } else {\r\n // No sync URL configured — use the library URL directly (local-only fallback)\r\n const current: MediaItem[] = [...this.mediaItems];\r\n const idx = current.indexOf(placeholder);\r\n if (idx !== -1) {\r\n current[idx] = { ...placeholder, isUploading: false };\r\n this.updateValue(current);\r\n }\r\n }\r\n });\r\n\r\n this.mediaCarouselIndex = this.mediaItems.length - 1;\r\n }\r\n\r\n // ── Remove item ──────────────────────────────────────────────────────────\r\n\r\n removeMediaItem(index: number): void {\r\n const items: MediaItem[] = [...this.mediaItems];\r\n const item = items[index];\r\n if (!item) return;\r\n\r\n const removeLocally = () => {\r\n const updated = items.filter((_, i) => i !== index);\r\n this.updateValue(updated.length ? updated : null);\r\n // Clamp carousel index so it never points past the end\r\n this.mediaCarouselIndex = Math.max(0, this.mediaCarouselIndex - (index <= this.mediaCarouselIndex ? 1 : 0));\r\n };\r\n\r\n const deleteUrl = this.config.attachmentConfig?.deleteUrl;\r\n\r\n if (item.id && item.id !== 0 && deleteUrl) {\r\n // ── API delete path (same logic as removeUploadedFile) ───────────────\r\n item.isUploading = true; // disable the remove button while in-flight\r\n this.updateValue([...items]); // trigger change detection\r\n\r\n let params = new HttpParams();\r\n if (!deleteUrl.includes('attachmentId=')) {\r\n params = params.set('attachmentId', item.id.toString());\r\n }\r\n if (!deleteUrl.includes('reason=')) {\r\n params = params.set('reason', 'DELETED BY CREATOR');\r\n }\r\n\r\n this.http.delete<any>(deleteUrl, { headers: this.getHeaders(), params })\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: () => removeLocally(),\r\n error: (err) => {\r\n console.error('Failed to delete media attachment', err);\r\n item.isUploading = false;\r\n this.updateValue([...items]); // restore UI state\r\n }\r\n });\r\n } else {\r\n // ── No id or no deleteUrl: remove locally, no API call ───────────────\r\n removeLocally();\r\n }\r\n }\r\n\r\n\r\n private _appendMediaItem(item: MediaItem): void {\r\n const current: MediaItem[] = [...this.mediaItems];\r\n current.push(item);\r\n this.updateValue(current);\r\n this.mediaCarouselIndex = current.length - 1;\r\n }\r\n\r\n private showMediaError(msg: string): void {\r\n this.mediaUploadError = msg;\r\n setTimeout(() => {\r\n if (this.mediaUploadError === msg) this.mediaUploadError = '';\r\n }, 4000);\r\n }\r\n\r\n // ── LOCATION field methods ─────────────────────────────────────────────────\r\n\r\n private initLocationField(): void {\r\n const cfg = this.config.locationConfig;\r\n this.locationActiveTab = cfg?.defaultTab ?? 'VENUE';\r\n\r\n // Restore from existing form value using the robust getter\r\n if (this.locationValue.tab) {\r\n this.locationActiveTab = this.locationValue.tab;\r\n }\r\n\r\n // Subscribe to external patchValue events (prefills)\r\n this.formGroup.get(this.config.name!)?.valueChanges\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n if (this.locationValue.tab) {\r\n this.locationActiveTab = this.locationValue.tab;\r\n }\r\n setTimeout(() => this._renderMap());\r\n });\r\n\r\n // Load Google Maps script if not already loaded\r\n this._ensureGoogleMapsScript();\r\n }\r\n\r\n private _ensureGoogleMapsScript(): void {\r\n const apiKey = this.config.locationConfig?.googleMapsApiKey;\r\n if (!apiKey) return;\r\n\r\n if ((window as any).google?.maps?.places) {\r\n this._googleAcService = new (window as any).google.maps.places.AutocompleteService();\r\n this.locationMapLoaded = true;\r\n setTimeout(() => this._renderMap(), 100);\r\n return;\r\n }\r\n\r\n // Only inject once\r\n if (document.querySelector('script[data-sf-gmaps]')) {\r\n // Wait for the script to load\r\n const wait = () => {\r\n if ((window as any).google?.maps?.places) {\r\n this._googleAcService = new (window as any).google.maps.places.AutocompleteService();\r\n this.locationMapLoaded = true;\r\n setTimeout(() => this._renderMap(), 100);\r\n } else {\r\n setTimeout(wait, 300);\r\n }\r\n };\r\n wait();\r\n return;\r\n }\r\n\r\n const script = document.createElement('script');\r\n script.src = `https://maps.googleapis.com/maps/api/js?key=${apiKey}&libraries=places`;\r\n script.async = true;\r\n script.defer = true;\r\n script.setAttribute('data-sf-gmaps', 'true');\r\n script.onload = () => {\r\n this._googleAcService = new (window as any).google.maps.places.AutocompleteService();\r\n this.locationMapLoaded = true;\r\n setTimeout(() => this._renderMap(), 100);\r\n };\r\n document.head.appendChild(script);\r\n }\r\n\r\n onLocationTabChange(tab: string): void {\r\n if (this.locationActiveTab === 'VENUE' && tab !== 'VENUE') {\r\n this._googleMap = null;\r\n this._mapMarkers = [];\r\n }\r\n this.locationActiveTab = tab;\r\n this.locationSuggestions = [];\r\n this.locationShowSuggestions = false;\r\n this.locationSearchText = '';\r\n const existing: LocationFieldValue = this.formGroup.get(this.config.name!)?.value || { tab, venues: [], onlineUrl: '' };\r\n existing.tab = tab;\r\n this.updateValue(existing);\r\n if (tab === 'VENUE') {\r\n setTimeout(() => this._renderMap());\r\n }\r\n }\r\n\r\n get locationValue(): LocationFieldValue {\r\n let v = this.formGroup.get(this.config.name!)?.value;\r\n if (typeof v === 'string') {\r\n try { v = JSON.parse(v); } catch { /* ignore */ }\r\n }\r\n // Automatically unwrap if prefill payload was mistakenly double-nested like `{ location: { tab... } }`\r\n if (v && !v.tab && v[this.config.name!]) {\r\n v = v[this.config.name!];\r\n }\r\n if (v && v.tab) return v;\r\n return { tab: this.locationActiveTab, venues: [], onlineUrl: '' };\r\n }\r\n\r\n get locationVenues(): LocationItem[] {\r\n return this.locationValue.venues || [];\r\n }\r\n\r\n get locationOnlineUrl(): string {\r\n return this.locationValue.onlineUrl || '';\r\n }\r\n\r\n get locationMaxReached(): boolean {\r\n const isMulti = this.config.locationConfig?.allowMulti;\r\n const max = isMulti ? (this.config.locationConfig?.maxLocations ?? 5) : 1;\r\n return this.locationVenues.length >= max;\r\n }\r\n\r\n handleLocationSearchInput(event: Event): void {\r\n const input = (event.target as HTMLInputElement).value;\r\n this.locationSearchText = input;\r\n if (!input || input.length < 2) {\r\n this.locationSuggestions = [];\r\n this.locationShowSuggestions = false;\r\n return;\r\n }\r\n if (!this._googleAcService) {\r\n return;\r\n }\r\n this._googleAcService.getPlacePredictions({ input }, (predictions: any[], status: string) => {\r\n if (status === 'OK' && predictions) {\r\n this.locationSuggestions = predictions;\r\n this.locationShowSuggestions = true;\r\n } else {\r\n this.locationSuggestions = [];\r\n this.locationShowSuggestions = false;\r\n }\r\n });\r\n }\r\n\r\n onLocationSuggestionSelect(prediction: any): void {\r\n if (!prediction) return;\r\n const isMulti = this.config.locationConfig?.allowMulti;\r\n const max = isMulti ? (this.config.locationConfig?.maxLocations ?? 5) : 1;\r\n const current = this.locationVenues;\r\n if (current.length >= max) return;\r\n\r\n const newItem: LocationItem = {\r\n description: prediction.description,\r\n placeId: prediction.place_id,\r\n address: prediction.description,\r\n type: 'GOOGLE',\r\n isActive: true\r\n };\r\n\r\n // Geocode to get lat/lng and components\r\n if ((window as any).google?.maps?.Geocoder) {\r\n const geocoder = new (window as any).google.maps.Geocoder();\r\n geocoder.geocode({ placeId: prediction.place_id }, (results: any[], status: string) => {\r\n if (status === 'OK' && results[0]) {\r\n const res = results[0];\r\n newItem.latitude = res.geometry?.location?.lat();\r\n newItem.longitude = res.geometry?.location?.lng();\r\n newItem.address = res.formatted_address || prediction.description;\r\n\r\n let name = prediction.description;\r\n if (prediction.structured_formatting && prediction.structured_formatting.main_text) {\r\n name = prediction.structured_formatting.main_text;\r\n }\r\n newItem.name = name;\r\n\r\n res.address_components?.forEach((c: any) => {\r\n if (c.types.includes('locality')) newItem.cityLabel = c.long_name;\r\n if (c.types.includes('administrative_area_level_1')) newItem.stateLabel = c.long_name;\r\n if (c.types.includes('country')) newItem.countryLabel = c.long_name;\r\n });\r\n }\r\n this._addVenueAndUpdate(newItem);\r\n });\r\n } else {\r\n this._addVenueAndUpdate(newItem);\r\n }\r\n\r\n this.locationSearchText = '';\r\n this.locationSuggestions = [];\r\n this.locationShowSuggestions = false;\r\n }\r\n\r\n private _addVenueAndUpdate(item: LocationItem): void {\r\n const val = { ...this.locationValue };\r\n val.venues = [...(val.venues || []), item];\r\n this.updateValue(val);\r\n setTimeout(() => this._renderMap());\r\n }\r\n\r\n removeLocationVenue(index: number): void {\r\n const val = { ...this.locationValue };\r\n val.venues = (val.venues || []).filter((_, i) => i !== index);\r\n this.updateValue(val);\r\n setTimeout(() => this._renderMap());\r\n }\r\n\r\n onLocationUrlChange(url: string): void {\r\n const val = { ...this.locationValue, onlineUrl: url };\r\n this.updateValue(val);\r\n }\r\n\r\n hideLocationSuggestions(): void {\r\n setTimeout(() => { this.locationShowSuggestions = false; }, 200);\r\n }\r\n\r\n getLocationMapEmbedUrl(): string {\r\n const venues = this.locationVenues.filter(v => v.placeId || (typeof v.latitude === 'number' && typeof v.longitude === 'number'));\r\n const apiKey = this.config.locationConfig?.googleMapsApiKey || '';\r\n\r\n // No locations currently selected: Show the default map view (India)\r\n if (!venues.length) {\r\n if (apiKey) {\r\n // Embed API center fallback if they have an API Key but no marker yet\r\n const lat = this.config.locationConfig?.defaultLat ?? 20.5937;\r\n const lng = this.config.locationConfig?.defaultLng ?? 78.9629;\r\n const zoom = this.config.locationConfig?.defaultZoom ?? 4;\r\n return `https://www.google.com/maps/embed/v1/view?key=${apiKey}¢er=${lat},${lng}&zoom=${zoom}`;\r\n } else {\r\n // Static iframe fallback text query\r\n return `https://maps.google.com/maps?q=India&output=embed`;\r\n }\r\n }\r\n\r\n if (venues.length === 1) {\r\n const v = venues[0];\r\n const q = v.placeId ? `place_id:${v.placeId}` : encodeURIComponent(v.address || v.description || '');\r\n return `https://www.google.com/maps/embed/v1/place?key=${apiKey}&q=${q}`;\r\n }\r\n // Multiple locations — use directions/search embed\r\n const q = encodeURIComponent(venues.map(v => v.address || v.description).join('|'));\r\n return `https://www.google.com/maps/embed/v1/search?key=${apiKey}&q=${q}`;\r\n }\r\n\r\n private _renderMap(): void {\r\n if (!(window as any).google?.maps) return;\r\n if (!this.config.locationConfig?.showMap && this.config.locationConfig?.showMap !== undefined) return;\r\n\r\n const venues = this.locationVenues.filter(v => typeof v.latitude === 'number' && typeof v.longitude === 'number');\r\n\r\n const mapEl = document.getElementById(`loc-map-${this.config.name}`);\r\n if (!mapEl) return;\r\n\r\n if (!this._googleMap) {\r\n // Default to India if no venues exist\r\n const defaultLat = this.config.locationConfig?.defaultLat ?? 20.5937;\r\n const defaultLng = this.config.locationConfig?.defaultLng ?? 78.9629;\r\n const defaultZoom = this.config.locationConfig?.defaultZoom ?? 4;\r\n\r\n this._googleMap = new (window as any).google.maps.Map(mapEl, {\r\n zoom: venues.length === 1 ? 12 : defaultZoom,\r\n center: venues.length > 0\r\n ? { lat: venues[0].latitude, lng: venues[0].longitude }\r\n : { lat: defaultLat, lng: defaultLng }\r\n });\r\n } else {\r\n if (venues.length === 0) {\r\n // Re-center on default\r\n const lat = this.config.locationConfig?.defaultLat ?? 20.5937;\r\n const lng = this.config.locationConfig?.defaultLng ?? 78.9629;\r\n this._googleMap.setCenter({ lat, lng });\r\n this._googleMap.setZoom(this.config.locationConfig?.defaultZoom ?? 4);\r\n } else if (venues.length === 1) {\r\n this._googleMap.setCenter({ lat: venues[0].latitude, lng: venues[0].longitude });\r\n this._googleMap.setZoom(12);\r\n }\r\n }\r\n\r\n // Clear old markers\r\n this._mapMarkers.forEach(m => m.setMap(null));\r\n this._mapMarkers = [];\r\n\r\n venues.forEach(v => {\r\n const marker = new (window as any).google.maps.Marker({\r\n position: { lat: v.latitude, lng: v.longitude },\r\n map: this._googleMap,\r\n title: v.name || v.address || v.description\r\n });\r\n this._mapMarkers.push(marker);\r\n });\r\n\r\n if (venues.length > 1) {\r\n const bounds = new (window as any).google.maps.LatLngBounds();\r\n venues.forEach(v => bounds.extend({ lat: v.latitude!, lng: v.longitude! }));\r\n this._googleMap.fitBounds(bounds);\r\n }\r\n }\r\n}\r\n\r\n","<div class=\"form-field mb-16px\" *ngIf=\"isVisible\" [class.has-error]=\"errorMessage\">\r\n\r\n <!-- ══ ROW Layout ════════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isRow\" class=\"form-row grid-row\">\r\n <ng-container *ngFor=\"let child of config.children\">\r\n <div class=\"row-field\" [style.gridColumn]=\"'span ' + getChildColSpan(child)\" *ngIf=\"child.isEnabled !== false\">\r\n <lib-form-field [config]=\"child\" [controller]=\"controller\" [formGroup]=\"formGroup\" [allowMulti]=\"allowMulti\">\r\n </lib-form-field>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- ══ GROUP — allowMulti (repeater) ════════════════════════════════════ -->\r\n <div *ngIf=\"isGroup && config.sectionConfig?.allowMulti\"\r\n class=\"group-section-wrapper mb-20px b-1px-solid-E5E7EB br-10px p-20px bc-ffffff\"\r\n [class.multi-save-active]=\"config.sectionConfig?.multiSaveConfig?.active\">\r\n\r\n <!-- Multi-Save Header with Add button (top-right style) -->\r\n <div class=\"multi-save-header d-flex justify-content-between align-items-center mb-24\"\r\n *ngIf=\"config.sectionConfig?.multiSaveConfig?.active\">\r\n <h3\r\n class=\"group-label pb-10 mb-0 d-block font-weight-600 border-none fs-0-875rem c-111827 fs-1rem c-1F2937 m-0-0-16px-0 bb-2px-solid-E5E7EB pb-0 mb-0-75rem\"\r\n *ngIf=\"config.sectionConfig?.label\">{{ config.sectionConfig!.label }}</h3>\r\n <lib-button [variant]=\"'outline'\" [icon]=\"{type: 'material', value: 'add'}\" (click)=\"addGroupInstance()\"\r\n class=\"btn-add-multi\">\r\n {{ addMultiLabel }}\r\n </lib-button>\r\n </div>\r\n\r\n <!-- Standard Header for non-multiSave -->\r\n <h3\r\n class=\"group-label pb-10 mb-0 d-block font-weight-600 border-none fs-0-875rem c-111827 fs-1rem c-1F2937 m-0-0-16px-0 bb-2px-solid-E5E7EB pb-0 mb-0-75rem\"\r\n *ngIf=\"config.sectionConfig?.label && !config.sectionConfig?.multiSaveConfig?.active\">{{\r\n config.sectionConfig!.label }}</h3>\r\n\r\n <div *ngFor=\"let instance of instanceList; trackBy: trackByInstanceId; let i = index\"\r\n class=\"group-instance position-relative mb-16 p-0 overflow-hidden p-16px b-F9FAFB b-1px-solid-E5E7EB br-8px b-ffffff br-10px\"\r\n [class.is-editing]=\"instance.isEditing\"\r\n [class.is-card]=\"config.sectionConfig?.multiSaveConfig?.active && !instance.isEditing\">\r\n\r\n <!-- 1. EDIT MODE / UNSAVED / STANDARD STATE -->\r\n <div [hidden]=\"config.sectionConfig?.multiSaveConfig?.active && !instance.isEditing\">\r\n <!-- Instance header — show remove only when more than 1 instance -->\r\n <div class=\"group-header d-flex justify-content-between align-items-center mb-12 pb-10 bb-1px-dashed-D1D5DB\"\r\n *ngIf=\"!config.sectionConfig?.multiSaveConfig?.active && instanceList.length > 1\">\r\n <span class=\"group-number font-weight-500 c-4B5563 fs-0-8125rem\">{{ config.sectionConfig!.label }} #{{ i + 1\r\n }}</span>\r\n <lib-button [variant]=\"'danger-outline'\" [icon]=\"{type: 'material', value: 'delete_outline'}\"\r\n (click)=\"removeGroupInstance(i)\">\r\n {{ removeLabel }}\r\n </lib-button>\r\n </div>\r\n\r\n <div class=\"group-fields sf-grid\">\r\n <ng-container *ngFor=\"let field of config.sectionConfig!.children\">\r\n <div class=\"sf-col\" [style.gridColumn]=\"'span ' + (field.colSpan || 12)\" *ngIf=\"field.isEnabled !== false\">\r\n <lib-form-field [config]=\"field\" [controller]=\"controller\" [formGroup]=\"instance.fg\" [allowMulti]=\"true\">\r\n </lib-form-field>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- SAVE / CANCEL BUTTONS for MultiSave in Editing phase -->\r\n <div\r\n class=\"group-footer d-flex justify-content-between align-items-center gap-16 mt-24 pt-20 bt-1px-solid-E5E7EB\"\r\n *ngIf=\"config.sectionConfig?.multiSaveConfig?.active\">\r\n <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"multiSaveError\">{{ multiSaveError }}</span>\r\n <div class=\"footer-actions d-flex gap-12\">\r\n <lib-button [variant]=\"'outline'\" (click)=\"cancelGroupInstance(i)\">Cancel</lib-button>\r\n <lib-button [variant]=\"'primary'\" (click)=\"saveGroupInstance(i)\">Save</lib-button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 2. CARD VIEW (Saved State) -->\r\n <ng-container *ngIf=\"config.sectionConfig?.multiSaveConfig?.active && !instance.isEditing\">\r\n <div class=\"card-view d-flex justify-content-between align-items-center p-18px-24px\"\r\n [class.is-expanded]=\"instance.isExpanded\">\r\n <div class=\"card-content flex-1 d-flex flex-column gap-4 overflow-hidden\">\r\n <span class=\"card-title font-weight-600 overflow-hidden fs-1rem c-111827\">{{\r\n instance.fg.get(config.sectionConfig!.multiSaveConfig!.summaryField || '')?.value\r\n || '—' }}</span>\r\n <!-- <span class=\"card-desc overflow-hidden fs-0-875rem c-6B7280\" *ngIf=\"config.sectionConfig.multiSaveConfig.descriptionField\"\r\n [innerHTML]=\"instance.fg.get(config.sectionConfig.multiSaveConfig.descriptionField)?.value\">\r\n </span> -->\r\n </div>\r\n <div class=\"card-actions d-flex align-items-center gap-16 ml-20\">\r\n <mat-icon class=\"icon-delete\" (click)=\"removeGroupInstance(i, true)\">delete_outline</mat-icon>\r\n <mat-icon class=\"icon-edit\" (click)=\"editGroupInstance(i)\">edit_outline</mat-icon>\r\n <mat-icon class=\"icon-expand\" (click)=\"toggleExpandGroupInstance(i)\">\r\n {{ instance.isExpanded ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}\r\n </mat-icon>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Standard Add Button for non-multiSave -->\r\n <lib-button *ngIf=\"!config.sectionConfig?.multiSaveConfig?.active\" [variant]=\"'outline'\"\r\n [icon]=\"{type: 'material', value: 'add'}\" (click)=\"addGroupInstance()\" class=\"btn-add-group-wrapper\">\r\n {{ addLabel }} {{ config.sectionConfig!.label }}\r\n </lib-button>\r\n </div>\r\n\r\n <!-- ══ GROUP — single (non-repeater) ════════════════════════════════════ -->\r\n <div *ngIf=\"isGroup && config.sectionConfig && !config.sectionConfig.allowMulti\"\r\n class=\"group-section-wrapper mb-20px b-1px-solid-E5E7EB br-10px p-20px bc-ffffff\">\r\n <h3\r\n class=\"group-label pb-10 mb-0 d-block font-weight-600 border-none fs-0-875rem c-111827 fs-1rem c-1F2937 m-0-0-16px-0 bb-2px-solid-E5E7EB pb-0 mb-0-75rem\"\r\n *ngIf=\"config.sectionConfig.label\">{{ config.sectionConfig.label }}</h3>\r\n <div class=\"group-fields sf-grid\">\r\n <ng-container *ngFor=\"let field of config.sectionConfig.children\">\r\n <div class=\"sf-col\" [style.gridColumn]=\"'span ' + (field.colSpan || 12)\" *ngIf=\"field.isEnabled !== false\">\r\n <lib-form-field [config]=\"field\" [controller]=\"controller\" [formGroup]=\"groupFormGroup\" [allowMulti]=\"false\">\r\n </lib-form-field>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n\r\n <!-- ══ Text Input ════════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isTextField\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px mb-0-5rem\">\r\n {{ config.label }}\r\n <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n\r\n <textarea *ngIf=\"config.subType === 'LONG'\" class=\"field-input textarea\" [placeholder]=\"config.placeholder || ''\"\r\n [formControlName]=\"config.name!\" [class.is-invalid]=\"errorMessage\" rows=\"4\">\r\n </textarea>\r\n\r\n <!-- Password input with show/hide toggle -->\r\n <div *ngIf=\"config.subType === 'PASSWORD'\" class=\"password-wrapper position-relative d-flex align-items-center\">\r\n <input [type]=\"showPassword ? 'text' : 'password'\" class=\"field-input password-input\"\r\n [placeholder]=\"config.placeholder || ''\" [formControlName]=\"config.name!\" [class.is-invalid]=\"errorMessage\">\r\n <button type=\"button\"\r\n class=\"password-toggle position-absolute cursor-pointer d-flex align-items-center justify-content-center b-none border-none c-6B7280 p-0-25rem\"\r\n (click)=\"showPassword = !showPassword\" tabindex=\"-1\"\r\n [attr.aria-label]=\"showPassword ? 'Hide password' : 'Show password'\">\r\n <mat-icon class=\"eye-icon\">{{ showPassword ? 'visibility' : 'visibility_off' }}</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"input-group position-relative d-flex w-100\" [class.readonly]=\"config.readonly\">\r\n <span class=\"input-prefix br-none\" *ngIf=\"config.prefix\">{{ config.prefix }}</span>\r\n\r\n <input *ngIf=\"config.subType !== 'LONG' && config.subType !== 'PASSWORD'\"\r\n [type]=\"config.subType === 'EMAIL' ? 'email' : config.subType === 'PHONE' ? 'tel' : 'text'\" class=\"field-input\"\r\n [placeholder]=\"config.placeholder || ''\" [formControlName]=\"config.name!\" [class.is-invalid]=\"errorMessage\"\r\n [readonly]=\"config.readonly\">\r\n\r\n <span class=\"input-suffix d-flex align-items-center font-weight-500\" *ngIf=\"config.suffix\">{{ config.suffix\r\n }}</span>\r\n\r\n <div class=\"readonly-icons position-absolute d-flex gap-8 pe-none\" *ngIf=\"config.readonly\">\r\n <mat-icon class=\"lock-icon\">lock</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n <div class=\"char-count-hint font-poppins font-weight-400 text-14 text-right mt-4 c-6B7280\" *ngIf=\"showCharCount\">\r\n {{ remainingCharacters }} characters remaining\r\n </div>\r\n </div>\r\n\r\n <!-- ══ Number Input ══════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isNumberField\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px mb-0-5rem\">\r\n {{ config.label }}\r\n <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n\r\n <div class=\"input-group position-relative d-flex w-100\" [class.readonly]=\"config.readonly\">\r\n <span class=\"input-prefix br-none\" *ngIf=\"config.prefix\">{{ config.prefix }}</span>\r\n\r\n <input type=\"number\" class=\"field-input\" [placeholder]=\"config.placeholder || ''\" [formControlName]=\"config.name!\"\r\n [min]=\"config.numberConfig?.min ?? null\" [max]=\"config.numberConfig?.max ?? null\"\r\n [step]=\"config.numberConfig?.step || 1\" [class.is-invalid]=\"errorMessage\" [readonly]=\"config.readonly\">\r\n\r\n <span class=\"input-suffix d-flex align-items-center font-weight-500\" *ngIf=\"config.suffix\">{{ config.suffix\r\n }}</span>\r\n\r\n <div class=\"readonly-icons position-absolute d-flex gap-8 pe-none\" *ngIf=\"config.readonly\">\r\n <mat-icon class=\"lock-icon\">lock</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n\r\n <!-- ══ Date Input ════════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isDateField\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px mb-0-5rem\">\r\n {{ config.label }}\r\n <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n\r\n <div class=\"input-group position-relative d-flex w-100\" [class.readonly]=\"config.readonly\">\r\n <input matInput [matDatepicker]=\"datePicker\" class=\"field-input date-input has-icon-right\"\r\n [formControlName]=\"config.name!\" [min]=\"config.dateConfig?.minDate\" [max]=\"config.dateConfig?.maxDate\"\r\n [class.is-invalid]=\"errorMessage\" [placeholder]=\"config.placeholder || ''\" [readonly]=\"config.readonly\"\r\n (click)=\"!config.readonly && datePicker.open()\">\r\n <div class=\"date-icon-wrapper position-absolute d-flex align-items-center justify-content-center\"\r\n *ngIf=\"!config.readonly\">\r\n <mat-datepicker-toggle matSuffix [for]=\"datePicker\"></mat-datepicker-toggle>\r\n </div>\r\n <mat-datepicker #datePicker></mat-datepicker>\r\n\r\n <div class=\"readonly-icons position-absolute d-flex gap-8 pe-none\" *ngIf=\"config.readonly\">\r\n <mat-icon class=\"lock-icon\">lock</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n\r\n <!-- ══ Time Input ════════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isTimeField\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px mb-0-5rem\">\r\n {{ config.label }}\r\n <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n\r\n <div class=\"input-group position-relative d-flex w-100\" [class.readonly]=\"config.readonly\">\r\n <input type=\"time\" class=\"field-input time-input\" [formControlName]=\"config.name!\"\r\n [class.is-invalid]=\"errorMessage\" [readonly]=\"!!config.readonly\">\r\n\r\n <div class=\"readonly-icons position-absolute d-flex gap-8 pe-none\" *ngIf=\"config.readonly\">\r\n <mat-icon class=\"lock-icon\">lock</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n\r\n <!-- ══ Autocomplete ═════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isAutocomplete\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px mb-0-5rem\">\r\n {{ config.label }}\r\n <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n\r\n <!-- Hidden real control (stores the code value) -->\r\n <input type=\"hidden\" [formControlName]=\"config.name!\">\r\n\r\n <div class=\"autocomplete-wrapper position-relative d-flex align-items-center w-100\"\r\n [class.is-invalid]=\"errorMessage\" [class.readonly]=\"config.readonly\">\r\n <!-- Search icon -->\r\n <mat-icon class=\"ac-search-icon position-absolute fs-1-1rem c-9CA3AF pe-none\">search</mat-icon>\r\n\r\n <input class=\"field-input ac-input\" [formControl]=\"autocompleteInputCtrl\" [matAutocomplete]=\"auto\"\r\n [placeholder]=\"config.placeholder || 'Search…'\" [readonly]=\"!!config.readonly\" [class.is-invalid]=\"errorMessage\"\r\n (blur)=\"onAutocompleteClear()\" autocomplete=\"off\">\r\n\r\n <!-- Clear button -->\r\n <button type=\"button\"\r\n class=\"ac-clear-btn position-absolute d-flex align-items-center justify-content-center cursor-pointer rounded-50 b-none border-none c-9CA3AF p-0-2rem\"\r\n *ngIf=\"autocompleteInputCtrl.value && !config.readonly\"\r\n (click)=\"autocompleteInputCtrl.setValue(''); updateValue(null)\" tabindex=\"-1\" aria-label=\"Clear\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n\r\n <mat-autocomplete #auto=\"matAutocomplete\" [panelWidth]=\"'auto'\">\r\n <mat-option *ngFor=\"let option of filteredOptions\" [value]=\"option.label\"\r\n (onSelectionChange)=\"onAutocompleteSelected(option)\">\r\n {{ option.label }}\r\n </mat-option>\r\n <mat-option *ngIf=\"filteredOptions.length === 0\" disabled class=\"ac-no-results fs-0-8125rem c-6B7280\">\r\n No results found\r\n </mat-option>\r\n </mat-autocomplete>\r\n\r\n <div class=\"readonly-icons position-absolute d-flex gap-8 pe-none\" *ngIf=\"config.readonly\">\r\n <mat-icon class=\"lock-icon\">lock</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n\r\n <!-- ══ Dropdown ══════════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isDropdown\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px mb-0-5rem\">\r\n {{ config.label }}\r\n <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n\r\n <select *ngIf=\"config.subType === 'SINGLE'\" class=\"field-input\" [formControlName]=\"config.name!\"\r\n [class.is-invalid]=\"errorMessage\">\r\n <option [ngValue]=\"null\" disabled selected>{{ config.placeholder || 'Select' }}</option>\r\n <option *ngFor=\"let option of config.optionConfig?.optionList\" [value]=\"option.code\">\r\n {{ option.label }}\r\n </option>\r\n </select>\r\n\r\n <select *ngIf=\"config.subType === 'MULTIPLE'\" class=\"field-input\" multiple [formControlName]=\"config.name!\"\r\n [class.is-invalid]=\"errorMessage\">\r\n <option *ngFor=\"let option of config.optionConfig?.optionList\" [value]=\"option.code\">\r\n {{ option.label }}\r\n </option>\r\n </select>\r\n\r\n <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n\r\n <!-- ══ Radio ═════════════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isRadio\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px mb-0-5rem\">\r\n {{ config.label }}\r\n <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n\r\n <div class=\"radio-group\" [class.is-invalid]=\"errorMessage\"\r\n [class]=\"config.optionConfig?.layout ? 'layout-' + config.optionConfig!.layout.toLowerCase() : ''\">\r\n <label *ngFor=\"let option of config.optionConfig?.optionList\" class=\"radio-label\"\r\n [class.card-item]=\"config.subType === 'CARD'\"\r\n [class.selected]=\"formGroup.get(config.name!)?.value === option.code\"\r\n [style.gridColumn]=\"config.optionConfig?.layout?.toUpperCase() === 'COLUMN' ? 'span ' + getOptionColSpan(option) : null\">\r\n <input type=\"radio\" [formControlName]=\"config.name!\" [value]=\"option.code\">\r\n <div class=\"option-content d-flex flex-column gap-4 flex-1 text-left\">\r\n <span class=\"label-text text-16 c-1F2937\">{{ option.label }}</span>\r\n <span class=\"option-hint text-13 color-gray\" *ngIf=\"option.hint\">{{ option.hint }}</span>\r\n </div>\r\n </label>\r\n </div>\r\n\r\n <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n\r\n <!-- ══ Checkbox ══════════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isCheckbox\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"config.label && config.subType === 'LIST'\"\r\n class=\"field-label d-block font-poppins c-202124 fs-18px mb-0-5rem\">\r\n {{ config.label }}\r\n <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n\r\n <div *ngIf=\"config.subType === 'BOOL'\" class=\"checkbox-single\">\r\n <label class=\"checkbox-label d-flex align-items-center gap-8 cursor-pointer fs-0-875rem c-111827\">\r\n <input type=\"checkbox\" [formControlName]=\"config.name!\" [class.is-invalid]=\"errorMessage\">\r\n <span>{{ config.label }}</span>\r\n </label>\r\n </div>\r\n\r\n <div *ngIf=\"config.subType === 'LIST' || config.subType === 'CARD'\" class=\"checkbox-group d-flex flex-column gap-8\"\r\n [class.is-invalid]=\"errorMessage\"\r\n [class]=\"config.optionConfig?.layout ? 'layout-' + config.optionConfig!.layout.toLowerCase() : ''\">\r\n <label *ngFor=\"let option of config.optionConfig?.optionList\"\r\n class=\"checkbox-label d-flex align-items-center gap-8 cursor-pointer fs-0-875rem c-111827\"\r\n [class.card-item]=\"config.subType === 'CARD'\" [class.selected]=\"isChecked(option.code)\"\r\n [style.gridColumn]=\"config.optionConfig?.layout?.toUpperCase() === 'COLUMN' ? 'span ' + getOptionColSpan(option) : null\">\r\n <input type=\"checkbox\" [checked]=\"isChecked(option.code)\" [disabled]=\"!!config.disabled\"\r\n (change)=\"onCheckboxListChange(option.code, $any($event.target).checked)\">\r\n <div class=\"option-content d-flex flex-column gap-4 flex-1 text-left\">\r\n <span class=\"label-text text-16 c-1F2937\">{{ option.label }}</span>\r\n <span class=\"option-hint text-13 color-gray\" *ngIf=\"option.hint\">{{ option.hint }}</span>\r\n </div>\r\n </label>\r\n </div>\r\n\r\n <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n\r\n <!-- ══ Chip ══════════════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isChip\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px mb-0-5rem\">\r\n {{ config.label }}\r\n <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n\r\n <div class=\"chip-group d-flex flex-wrap gap-8\" [class.is-invalid]=\"errorMessage\">\r\n <label *ngFor=\"let option of config.optionConfig?.optionList\"\r\n class=\"chip-label cursor-pointer p-6px-14px b-ffffff c-374151 b-1px-solid-D1D5DB br-20px fs-0-875rem\"\r\n [class.selected]=\"isChecked(option.code)\">\r\n <input type=\"checkbox\" [checked]=\"isChecked(option.code)\" [disabled]=\"!!config.disabled\"\r\n (change)=\"onCheckboxListChange(option.code, $any($event.target).checked)\" hidden>\r\n <span>{{ option.label }}</span>\r\n </label>\r\n </div>\r\n\r\n <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n\r\n <!-- ══ Switch ════════════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isSwitch\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n <label class=\"switch-container d-flex justify-content-between align-items-center cursor-pointer\">\r\n <span class=\"field-label d-block font-poppins c-202124 fs-18px mb-0-5rem\">{{ config.label }}</span>\r\n <div class=\"switch position-relative\">\r\n <input type=\"checkbox\" [formControlName]=\"config.name!\" [class.is-invalid]=\"errorMessage\">\r\n <span class=\"slider position-absolute cursor-pointer\"></span>\r\n </div>\r\n </label>\r\n\r\n <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n\r\n <!-- ══ Rich Text ═════════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isRichText\" class=\"field-wrapper component-rich-text d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px mb-0-5rem\">\r\n {{ config.label }}\r\n <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n\r\n <div class=\"rich-text-container\" [class.is-invalid]=\"errorMessage\">\r\n <quill-editor [formControlName]=\"config.name!\" class=\"rich-text-editor d-block w-100\"\r\n [placeholder]=\"config.richTextConfig?.placeholder || config.placeholder || ''\"\r\n [styles]=\"{height: config.richTextConfig?.height || '200px'}\">\r\n </quill-editor>\r\n </div>\r\n\r\n <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n <div class=\"char-count-hint font-poppins font-weight-400 text-14 text-right mt-4 c-6B7280\" *ngIf=\"showCharCount\">\r\n {{ remainingCharacters }} characters remaining\r\n </div>\r\n </div>\r\n\r\n <!-- ══ Rating ════════════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isRating\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px mb-0-5rem\">\r\n {{ config.label }}\r\n <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n\r\n <div class=\"rating-group d-flex gap-4\" [class.is-invalid]=\"errorMessage\">\r\n <span *ngFor=\"let star of getStarArray()\" class=\"star d-inline-flex align-items-center cursor-pointer\"\r\n [class.filled]=\"isStarFilled(star)\" [class.half]=\"isStarHalf(star)\" (click)=\"onRatingChange(star, $event)\">\r\n <mat-icon>{{ isStarFilled(star) || isStarHalf(star) ? 'star' : 'star_border' }}</mat-icon>\r\n </span>\r\n </div>\r\n\r\n <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n\r\n <!-- ══ Generated Field (read-only) ══════════════════════════════════════ -->\r\n <div *ngIf=\"isGenerated\" class=\"field-wrapper d-flex flex-column gap-6\">\r\n <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px mb-0-5rem\">{{ config.label\r\n }}</label>\r\n <div class=\"generated-value fs-0-875rem p-0-625rem-0-875rem b-F3F4F6 b-1px-solid-E5E7EB br-8px c-6B7280\">{{ value ||\r\n '-' }}</div>\r\n <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint\">{{ config.hint }}</span>\r\n </div>\r\n\r\n <!-- ══ File Upload ═══════════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isFileUpload\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px mb-0-5rem\">\r\n {{ config.label }}\r\n <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n\r\n <!-- Drop Zone -->\r\n <div\r\n class=\"upload-drop-zone d-flex flex-column align-items-center justify-content-center gap-8 cursor-pointer text-center p-32px-24px us-none b-1-5px-dashed-CBD5E1 br-12px bc-FFFAF1\"\r\n [class.drag-over]=\"isDragOver\" [class.has-files]=\"value?.length\" [class.is-invalid]=\"errorMessage\"\r\n (dragover)=\"onDragOver($event)\" (dragleave)=\"onDragLeave($event)\" (drop)=\"onFileDrop($event)\"\r\n (click)=\"fileInput.click()\">\r\n\r\n <div class=\"upload-icon-wrap mb-4 c-94A3B8\">\r\n <mat-icon class=\"upload-cloud-icon\">cloud_upload</mat-icon>\r\n </div>\r\n\r\n <p class=\"upload-main-text font-weight-600 m-0 c-1E293B fs-0-9rem\">Drag and drop files here or <span\r\n class=\"upload-link c-3B82F6\">click to upload</span></p>\r\n <p class=\"upload-hint-text m-0 fs-0-78rem c-64748B\" *ngIf=\"config.attachmentConfig?.acceptLabel\">\r\n Supported formats:\r\n <span class=\"upload-formats font-weight-500 c-3B82F6\">{{ config.attachmentConfig!.acceptLabel }}</span>\r\n </p>\r\n <p class=\"upload-hint-text m-0 fs-0-78rem c-64748B\" *ngIf=\"!config.attachmentConfig?.acceptLabel && config.hint\">\r\n {{ config.hint }}\r\n </p>\r\n\r\n <!-- Hidden native file input -->\r\n <input #fileInput type=\"file\" hidden [attr.multiple]=\"config.attachmentConfig?.multiple ? true : null\"\r\n [attr.accept]=\"config.attachmentConfig?.accept || null\" (change)=\"onFileSelected($event)\">\r\n </div>\r\n\r\n <!-- Uploaded file list -->\r\n <div class=\"uploaded-list d-flex flex-column gap-8 mt-10\" *ngIf=\"value?.length\">\r\n <div *ngFor=\"let f of value; let i = index\"\r\n class=\"uploaded-item d-flex align-items-center gap-10 p-10px-14px b-ffffff b-1px-solid-E2E8F0 br-8px\"\r\n [class.uploading]=\"f.isUploading\">\r\n\r\n <!-- Uploading spinner (shown while API call is in progress) -->\r\n <ng-container *ngIf=\"f.isUploading; else fileReady\">\r\n <div class=\"upload-spinner rounded-50 b-2px-solid-E2E8F0\"></div>\r\n <div class=\"file-info flex-1 d-flex flex-column\">\r\n <span class=\"file-name font-weight-500 overflow-hidden fs-0-85rem c-1E293B\" [title]=\"f.name\">{{ f.name\r\n }}</span>\r\n <span class=\"file-size uploading-label fs-0-72rem c-94A3B8 c-3B82F6\">Uploading...</span>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Normal state once upload is done -->\r\n <ng-template #fileReady>\r\n <!-- File type icon -->\r\n <mat-icon class=\"file-type-icon\">{{ getFileIcon(f.type) }}</mat-icon>\r\n\r\n <!-- Image thumbnail (only for images) -->\r\n <img *ngIf=\"f.type?.startsWith('image') && f.dataUrl\" [src]=\"f.dataUrl\" class=\"file-thumb rounded-4\"\r\n alt=\"preview\">\r\n\r\n <!-- Name & size -->\r\n <div class=\"file-info flex-1 d-flex flex-column\">\r\n <span class=\"file-name font-weight-500 overflow-hidden fs-0-85rem c-1E293B\" [title]=\"f.name\">{{ f.name\r\n }}</span>\r\n <span class=\"file-size fs-0-72rem c-94A3B8\">{{ formatFileSize(f.size) }}</span>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Remove button — disabled while uploading -->\r\n <lib-button [variant]=\"'danger-outline'\" [disabled]=\"f.isUploading\"\r\n (click)=\"!f.isUploading && removeUploadedFile(i)\">\r\n <mat-icon>close</mat-icon>\r\n </lib-button>\r\n </div>\r\n </div>\r\n\r\n <!-- Validation / file errors -->\r\n <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"fileUploadError\">{{ fileUploadError }}</span>\r\n <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage && !fileUploadError\">{{ errorMessage }}</span>\r\n <span class=\"field-hint c-6B7280 fs-0-75rem\"\r\n *ngIf=\"config.hint && !errorMessage && !fileUploadError && !config.attachmentConfig?.acceptLabel\">\r\n {{ config.hint }}\r\n </span>\r\n </div>\r\n\r\n <!-- ══ Media Upload (Type 2) ════════════════════════════════════════════ -->\r\n <div *ngIf=\"isMediaUpload\" class=\"field-wrapper media-upload-wrapper d-flex flex-column gap-6 p-0 border-none b-none\"\r\n [formGroup]=\"formGroup\">\r\n\r\n <!-- Hidden file input lives outside *ngIf — triggered via ViewChild -->\r\n <input #mediaDeviceInput type=\"file\" hidden multiple accept=\"image/*\" (change)=\"onMediaFileSelected($event)\">\r\n\r\n <!-- Two-column layout -->\r\n <div class=\"mu-layout d-grid align-items-start\">\r\n\r\n <!-- ── LEFT PANEL ──────────────────────────────────────────────── -->\r\n <div class=\"mu-left d-flex flex-column gap-20\">\r\n\r\n <!-- Header: title + max-items badge -->\r\n <div class=\"mu-header d-flex align-items-start flex-wrap gap-10\">\r\n <h3 class=\"mu-title m-0 c-111827 fs-1-35rem\">\r\n {{ config.label }}\r\n <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n </h3>\r\n <span\r\n class=\"mu-badge d-inline-flex align-items-center rounded-20 color-white font-weight-600 fs-0-72rem p-4px-12px b-111827\"\r\n *ngIf=\"config.attachmentConfig?.maxFiles\">\r\n {{ controller.labels['LBL_MEDIA_MAX_PREFIX'] || 'Maximum' }}\r\n {{ config.attachmentConfig?.maxFiles }}\r\n {{ controller.labels['LBL_MEDIA_MAX_SUFFIX'] || 'Image & Videos' }}\r\n </span>\r\n </div>\r\n\r\n <!-- Description -->\r\n <p class=\"mu-description m-0 fs-0-875rem c-6B7280\" *ngIf=\"config.attachmentConfig?.description\">\r\n {{ config.attachmentConfig?.description }}\r\n </p>\r\n <p class=\"mu-description m-0 fs-0-875rem c-6B7280\"\r\n *ngIf=\"!config.attachmentConfig?.description && controller.labels['LBL_MEDIA_DESC']\">\r\n {{ controller.labels['LBL_MEDIA_DESC'] }}\r\n </p>\r\n\r\n <!-- Feature bullet list -->\r\n <ul class=\"mu-features m-0 p-0 d-flex flex-column gap-8 ls-none\"\r\n *ngIf=\"config.attachmentConfig?.features?.length || controller.labels['LBL_MEDIA_FEATURE_1']\">\r\n <ng-container *ngIf=\"config.attachmentConfig?.features?.length\">\r\n <li *ngFor=\"let f of config.attachmentConfig?.features\"\r\n class=\"mu-feature-item d-flex align-items-center gap-8 fs-0-875rem c-374151\">\r\n <mat-icon class=\"mu-check text-16 c-3B82F6\">check</mat-icon>{{ f }}\r\n </li>\r\n </ng-container>\r\n <ng-container *ngIf=\"!config.attachmentConfig?.features?.length\">\r\n <li *ngIf=\"controller.labels['LBL_MEDIA_FEATURE_1']\"\r\n class=\"mu-feature-item d-flex align-items-center gap-8 fs-0-875rem c-374151\">\r\n <mat-icon class=\"mu-check text-16 c-3B82F6\">check</mat-icon>{{ controller.labels['LBL_MEDIA_FEATURE_1'] }}\r\n </li>\r\n <li *ngIf=\"controller.labels['LBL_MEDIA_FEATURE_2']\"\r\n class=\"mu-feature-item d-flex align-items-center gap-8 fs-0-875rem c-374151\">\r\n <mat-icon class=\"mu-check text-16 c-3B82F6\">check</mat-icon>{{ controller.labels['LBL_MEDIA_FEATURE_2'] }}\r\n </li>\r\n <li *ngIf=\"controller.labels['LBL_MEDIA_FEATURE_3']\"\r\n class=\"mu-feature-item d-flex align-items-center gap-8 fs-0-875rem c-374151\">\r\n <mat-icon class=\"mu-check text-16 c-3B82F6\">check</mat-icon>{{ controller.labels['LBL_MEDIA_FEATURE_3'] }}\r\n </li>\r\n </ng-container>\r\n </ul>\r\n\r\n <!-- Backdrop to close dropdown on outside click -->\r\n <div class=\"media-menu-backdrop\" *ngIf=\"showMediaMenu\"\r\n (click)=\"$event.stopPropagation(); showMediaMenu = false\"></div>\r\n\r\n <!-- Add Media button + dropdown -->\r\n <div class=\"media-add-container position-relative\" (click)=\"showMediaMenu = !showMediaMenu\">\r\n <lib-button id=\"btn-add-media-{{ config.name }}\" [variant]=\"'warning'\"\r\n [icon]=\"{type: 'material', value: 'add_photo_alternate'}\">\r\n {{ controller.labels['LBL_ADD_MEDIA'] || 'Add media' }}\r\n <mat-icon class=\"menu-chevron fs-18px\">add</mat-icon>\r\n </lib-button>\r\n\r\n <div class=\"media-dropdown position-absolute rounded-12 overflow-hidden b-ffffff b-1px-solid-E5E7EB\"\r\n *ngIf=\"showMediaMenu\" role=\"menu\" (click)=\"$event.stopPropagation()\">\r\n <!-- Video -->\r\n <button id=\"btn-media-video-{{ config.name }}\" type=\"button\"\r\n class=\"media-dropdown-item d-flex align-items-center gap-12 w-100 cursor-pointer text-left b-none border-none p-12px-16px bb-1px-solid-F3F4F6\"\r\n (click)=\"onMediaMenuVideo(); showMediaMenu = false\" role=\"menuitem\">\r\n <span\r\n class=\"media-drop-icon media-drop-icon--video d-flex align-items-center justify-content-center rounded-8\"><mat-icon>videocam</mat-icon></span>\r\n <span class=\"media-drop-text d-flex flex-column flex-1\">\r\n <span class=\"media-drop-label font-weight-600 fs-0-875rem c-111827\">{{\r\n controller.labels['LBL_MEDIA_VIDEO'] || 'Video' }}</span>\r\n <span class=\"media-drop-desc c-6B7280 fs-0-75rem\">{{ controller.labels['LBL_MEDIA_VIDEO_DESC'] || 'Add\r\n YouTube URL'\r\n }}</span>\r\n </span>\r\n </button>\r\n <!-- Device -->\r\n <button id=\"btn-media-device-{{ config.name }}\" type=\"button\"\r\n class=\"media-dropdown-item d-flex align-items-center gap-12 w-100 cursor-pointer text-left b-none border-none p-12px-16px bb-1px-solid-F3F4F6\"\r\n (click)=\"onMediaMenuDevice(); showMediaMenu = false\" role=\"menuitem\">\r\n <span\r\n class=\"media-drop-icon media-drop-icon--device d-flex align-items-center justify-content-center rounded-8\"><mat-icon>upload</mat-icon></span>\r\n <span class=\"media-drop-text d-flex flex-column flex-1\">\r\n <span class=\"media-drop-label font-weight-600 fs-0-875rem c-111827\">{{\r\n controller.labels['LBL_MEDIA_DEVICE'] || 'Upload from device'\r\n }}</span>\r\n <span class=\"media-drop-desc c-6B7280 fs-0-75rem\">{{ controller.labels['LBL_MEDIA_DEVICE_DESC'] ||\r\n 'Select images from your\r\n computer' }}</span>\r\n </span>\r\n </button>\r\n <!-- Library -->\r\n <button id=\"btn-media-library-{{ config.name }}\" type=\"button\"\r\n class=\"media-dropdown-item d-flex align-items-center gap-12 w-100 cursor-pointer text-left b-none border-none p-12px-16px bb-1px-solid-F3F4F6\"\r\n (click)=\"onMediaMenuLibrary(); showMediaMenu = false\" role=\"menuitem\">\r\n <span\r\n class=\"media-drop-icon media-drop-icon--library d-flex align-items-center justify-content-center rounded-8\"><mat-icon>photo_library</mat-icon></span>\r\n <span class=\"media-drop-text d-flex flex-column flex-1\">\r\n <span class=\"media-drop-label font-weight-600 fs-0-875rem c-111827\">{{\r\n controller.labels['LBL_MEDIA_LIBRARY'] || 'Upload from library'\r\n }}</span>\r\n <span class=\"media-drop-desc c-6B7280 fs-0-75rem\">{{ controller.labels['LBL_MEDIA_LIBRARY_DESC'] ||\r\n 'Choose from default\r\n images' }}</span>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- YouTube URL Input (inline below button) -->\r\n <div class=\"youtube-input-panel d-flex flex-column gap-8 p-16 rounded-10 b-FFFAF1 b-1px-solid-E5E7EB\"\r\n *ngIf=\"showYoutubeInput\">\r\n <label class=\"youtube-panel-label d-flex align-items-center gap-6 font-weight-600 fs-0-875rem c-111827\">\r\n {{ controller.labels['LBL_YOUTUBE_URL'] || 'Video URL' }}\r\n </label>\r\n <div class=\"youtube-input-row d-flex gap-8\">\r\n <input id=\"input-youtube-url-{{ config.name }}\" type=\"url\" class=\"field-input youtube-url-input\"\r\n [(ngModel)]=\"youtubeUrlInput\" [ngModelOptions]=\"{standalone: true}\"\r\n [placeholder]=\"controller.labels['PH_YOUTUBE_URL'] || 'Video URL'\" (keyup.enter)=\"addYoutubeMedia()\">\r\n <lib-button id=\"btn-add-youtube-{{ config.name }}\" [variant]=\"'secondary'\" (click)=\"addYoutubeMedia()\">\r\n {{ controller.labels['LBL_ADD'] || 'Add' }}\r\n </lib-button>\r\n </div>\r\n <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"youtubeUrlError\">{{ youtubeUrlError }}</span>\r\n </div>\r\n\r\n <div\r\n class=\"media-upload-status d-flex align-items-center gap-8 mt-4 color-error rounded-8 font-weight-500 p-10px-14px b-FEF2F2 fs-0-85rem\"\r\n *ngIf=\"mediaUploadError\">\r\n <mat-icon class=\"status-icon fs-18px\">error_outline</mat-icon>\r\n <span>{{ mediaUploadError }}</span>\r\n </div>\r\n\r\n <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n </div>\r\n <!-- end left panel -->\r\n\r\n <!-- ── RIGHT PANEL (carousel) ──────────────────────────────────── -->\r\n <div class=\"mu-right d-flex flex-column gap-12\">\r\n\r\n <!-- Carousel (when items exist) -->\r\n <div class=\"media-carousel-section d-flex flex-column gap-12\" *ngIf=\"mediaItems.length\">\r\n <div\r\n class=\"media-carousel-main position-relative w-100 overflow-hidden d-flex align-items-center justify-content-center br-12px b-0F172A\">\r\n <button id=\"btn-carousel-prev-{{ config.name }}\" type=\"button\"\r\n class=\"carousel-nav carousel-nav--prev position-absolute rounded-50 cursor-pointer d-flex align-items-center justify-content-center border-none b-rgba-255-255-255-0-85\"\r\n (click)=\"mediaCarouselPrev()\" [disabled]=\"mediaCarouselIndex === 0\" aria-label=\"Previous\">\r\n <mat-icon>chevron_left</mat-icon>\r\n </button>\r\n\r\n <div class=\"carousel-viewer position-absolute d-flex align-items-center justify-content-center\"\r\n *ngFor=\"let item of mediaItems; let i = index\" [hidden]=\"i !== mediaCarouselIndex\">\r\n <div *ngIf=\"item.isUploading\"\r\n class=\"carousel-uploading d-flex flex-column align-items-center gap-12 c-94A3B8 fs-0-85rem\">\r\n <div class=\"carousel-spinner rounded-50 b-3px-solid-rgba-255-255-255-0-15\"></div>\r\n <span>{{ controller.labels['LBL_UPLOADING'] || 'Uploading…' }}</span>\r\n </div>\r\n <ng-container *ngIf=\"!item.isUploading && item.mediaType === 'youtube'\">\r\n <iframe class=\"carousel-iframe w-100 h-100 br-12px\" [src]=\"item.url | trustedUrl\" frameborder=\"0\"\r\n allowfullscreen\r\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\">\r\n </iframe>\r\n </ng-container>\r\n <ng-container *ngIf=\"!item.isUploading && item.mediaType === 'image'\">\r\n <img class=\"carousel-image w-100 h-100 br-12px\" [src]=\"item.url\" alt=\"Media\">\r\n </ng-container>\r\n <button id=\"btn-remove-media-{{ config.name }}-{{ i }}\" type=\"button\"\r\n class=\"carousel-remove-btn position-absolute rounded-50 cursor-pointer d-flex align-items-center justify-content-center border-none b-rgba-0-0-0-0-55\"\r\n [disabled]=\"item.isUploading\" (click)=\"removeMediaItem(i)\" aria-label=\"Remove\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <button id=\"btn-carousel-next-{{ config.name }}\" type=\"button\"\r\n class=\"carousel-nav carousel-nav--next position-absolute rounded-50 cursor-pointer d-flex align-items-center justify-content-center border-none b-rgba-255-255-255-0-85\"\r\n (click)=\"mediaCarouselNext()\" [disabled]=\"mediaCarouselIndex === mediaItems.length - 1\" aria-label=\"Next\">\r\n <mat-icon>chevron_right</mat-icon>\r\n </button>\r\n\r\n <div class=\"carousel-dots position-absolute d-flex gap-6\">\r\n <span *ngFor=\"let item of mediaItems; let i = index\"\r\n class=\"carousel-dot rounded-50 cursor-pointer b-rgba-255-255-255-0-45\"\r\n [class.active]=\"i === mediaCarouselIndex\" (click)=\"mediaGoTo(i)\"></span>\r\n </div>\r\n </div>\r\n\r\n <!-- Thumbnail strip -->\r\n <div class=\"media-thumbnail-strip d-flex flex-wrap gap-8 pb-4px\">\r\n <div *ngFor=\"let item of mediaThumbnails; let i = index\"\r\n class=\"media-thumb rounded-8 overflow-hidden cursor-pointer d-flex align-items-center justify-content-center b-2px-solid-transparent b-E2E8F0\"\r\n [class.active]=\"i === mediaCarouselIndex\" (click)=\"mediaGoTo(i)\">\r\n <div *ngIf=\"item.isUploading\"\r\n class=\"thumb-uploading d-flex align-items-center justify-content-center w-100 h-100\">\r\n <div class=\"thumb-spinner rounded-50 b-2px-solid-E2E8F0\"></div>\r\n </div>\r\n <img *ngIf=\"!item.isUploading && item.mediaType === 'youtube' && item.thumbnailUrl\"\r\n [src]=\"item.thumbnailUrl\" class=\"thumb-img w-100 h-100\" alt=\"Video thumbnail\">\r\n <div *ngIf=\"!item.isUploading && item.mediaType === 'youtube' && !item.thumbnailUrl\"\r\n class=\"thumb-yt-placeholder d-flex align-items-center justify-content-center w-100 h-100 b-1E293B c-EF4444\">\r\n <mat-icon>play_circle</mat-icon>\r\n </div>\r\n <img *ngIf=\"!item.isUploading && item.mediaType === 'image' && item.url\" [src]=\"item.url\"\r\n class=\"thumb-img w-100 h-100\" alt=\"Image thumbnail\">\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Empty right-side placeholder -->\r\n <div\r\n class=\"mu-right-empty d-flex flex-column align-items-center justify-content-center gap-10 h-100 text-center p-24 br-12px b-FFFAF1 c-94A3B8 b-2px-dashed-CBD5E1\"\r\n *ngIf=\"!mediaItems.length\" (click)=\"onMediaMenuDevice()\">\r\n <mat-icon class=\"mu-right-empty-icon fs-52px\">perm_media</mat-icon>\r\n <p>{{ controller.labels['LBL_ADD_MEDIA'] || 'Add media' }}</p>\r\n </div>\r\n\r\n </div>\r\n <!-- end right panel -->\r\n\r\n </div><!-- end mu-layout -->\r\n </div>\r\n\r\n\r\n <!-- ══ Library Image Picker Modal ════════════════════════════════════════ -->\r\n <div class=\"media-library-overlay b-rgba-0-0-0-0-5\" *ngIf=\"showLibraryModal\" (click)=\"closeLibraryModal()\"></div>\r\n <div class=\"media-library-modal d-flex flex-column overflow-hidden b-ffffff br-16px\" *ngIf=\"showLibraryModal\"\r\n role=\"dialog\" aria-modal=\"true\">\r\n <div class=\"library-modal-header d-flex align-items-start justify-content-between p-24px-28px bb-1px-solid-E5E7EB\">\r\n <div class=\"header-left d-flex flex-column gap-8\">\r\n <h3 class=\"library-modal-title m-0 color-dark fs-1-25rem\">\r\n {{ controller.labels['LBL_ADD_IMAGES'] || 'Add Images' }}\r\n </h3>\r\n <p class=\"library-modal-subtitle m-0 color-gray fs-0-85rem\">\r\n {{ controller.labels['LBL_LIBRARY_MODAL_DESC'] || 'Upload media to make your opportunity stand out. Plus, take\r\n full control of your sequence - drag images to reorder as you desire.' }}\r\n </p>\r\n </div>\r\n <button id=\"btn-close-library-{{ config.name }}\" type=\"button\"\r\n class=\"library-close-btn d-flex align-items-center justify-content-center cursor-pointer rounded-50 border-none b-none c-9CA3AF\"\r\n (click)=\"closeLibraryModal()\" aria-label=\"Close\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Loading -->\r\n <div class=\"library-loading\" *ngIf=\"libraryLoading\">\r\n <div class=\"lib-spinner rounded-50 b-3px-solid-E2E8F0\"></div>\r\n <span>{{ controller.labels['LBL_LOADING'] || 'Loading…' }}</span>\r\n </div>\r\n\r\n <!-- Error -->\r\n <div class=\"library-error d-flex align-items-center gap-8 color-error b-FEF2F2 fs-0-875rem p-16px-24px\"\r\n *ngIf=\"libraryError && !libraryLoading\">\r\n <mat-icon>error_outline</mat-icon>\r\n {{ libraryError }}\r\n </div>\r\n\r\n <!-- Image grid -->\r\n <div class=\"library-grid d-grid gap-16 flex-1 p-28px b-F9FAFB\" *ngIf=\"!libraryLoading && libraryImages.length\">\r\n <div *ngFor=\"let img of libraryImages; let li = index\" id=\"lib-img-{{ config.name }}-{{ li }}\"\r\n class=\"library-grid-item position-relative rounded-12 overflow-hidden cursor-pointer bg-white b-3px-solid-transparent\"\r\n [class.selected]=\"isLibraryItemSelected(img)\" (click)=\"toggleLibraryItem(img)\">\r\n <img [src]=\"getLibraryItemUrl(img)\" class=\"library-grid-img w-100 h-100 d-block\" alt=\"Library image\">\r\n <div\r\n class=\"library-check position-absolute bg-white rounded-50 d-flex align-items-center justify-content-center c-3B82F6\"\r\n *ngIf=\"isLibraryItemSelected(img)\">\r\n <mat-icon>check_circle</mat-icon>\r\n </div>\r\n <div class=\"library-overlay-hover position-absolute b-rgba-59-130-246-0-12\"></div>\r\n </div>\r\n </div>\r\n\r\n <!-- Empty library -->\r\n <div\r\n class=\"library-empty d-flex flex-column align-items-center justify-content-center gap-12 flex-1 c-9CA3AF fs-0-875rem p-48px-24px\"\r\n *ngIf=\"!libraryLoading && !libraryError && libraryImages.length === 0\">\r\n <mat-icon>image_not_supported</mat-icon>\r\n <span>{{ controller.labels['LBL_LIBRARY_EMPTY'] || 'No images found in library.' }}</span>\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div\r\n class=\"library-modal-footer d-flex align-items-center justify-content-end bg-white p-20px-28px bt-1px-solid-E5E7EB\">\r\n <div class=\"library-footer-actions d-flex gap-12 gap-10\">\r\n <lib-button id=\"btn-library-cancel-{{ config.name }}\" [variant]=\"'outline'\" (click)=\"closeLibraryModal()\">\r\n {{ controller.labels['LBL_CANCEL'] || 'Cancel' }}\r\n </lib-button>\r\n <lib-button id=\"btn-library-confirm-{{ config.name }}\" [variant]=\"'primary'\"\r\n [disabled]=\"librarySelectedIds.size === 0\" (click)=\"confirmLibrarySelection()\">\r\n {{ controller.labels['LBL_CONTINUE'] || 'Continue' }}\r\n </lib-button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ══ Location Field ═══════════════════════════════════════════════════ -->\r\n <div *ngIf=\"isLocation\" class=\"field-wrapper location-field-wrapper d-flex flex-column gap-6 gap-12\"\r\n [formGroup]=\"formGroup\">\r\n\r\n <!-- Field label -->\r\n <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px mb-0-5rem\">\r\n {{ config.label }}\r\n <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n </label>\r\n <p class=\"location-subtitle m-0 c-6B7280 fs-0-8125rem\" *ngIf=\"config.hint\">{{ config.hint }}</p>\r\n\r\n <!-- Three-tab bar -->\r\n <div class=\"location-tabs d-flex gap-12 mb-24\">\r\n <lib-button class=\"loc-tab-btn flex-1\" [variant]=\"locationActiveTab === 'VENUE' ? 'warning' : 'outline'\"\r\n (click)=\"onLocationTabChange('VENUE')\">\r\n {{ controller.labels['LBL_LOC_VENUE'] || 'Venue' }}\r\n </lib-button>\r\n <lib-button class=\"loc-tab-btn flex-1\" [variant]=\"locationActiveTab === 'ONLINE' ? 'warning' : 'outline'\"\r\n (click)=\"onLocationTabChange('ONLINE')\">\r\n {{ controller.labels['LBL_LOC_ONLINE'] || 'Online Event' }}\r\n </lib-button>\r\n <lib-button class=\"loc-tab-btn flex-1\" [variant]=\"locationActiveTab === 'TBA' ? 'warning' : 'outline'\"\r\n (click)=\"onLocationTabChange('TBA')\">\r\n {{ controller.labels['LBL_LOC_TBA'] || 'To be Announced' }}\r\n </lib-button>\r\n </div>\r\n\r\n <!-- VENUE TAB -->\r\n <div *ngIf=\"locationActiveTab === 'VENUE'\" class=\"loc-panel loc-venue-panel d-flex flex-column gap-12\">\r\n\r\n <p class=\"loc-section-label m-0 font-weight-600 c-111827 fs-0-9rem\">\r\n {{ controller.labels['LBL_LOC_ADDRESS'] || 'Location address' }}\r\n </p>\r\n\r\n <!-- Added venue rows -->\r\n <div class=\"loc-venue-list d-flex flex-column gap-8\" *ngIf=\"locationVenues.length > 0\">\r\n <div *ngFor=\"let venue of locationVenues; let i = index\"\r\n class=\"loc-venue-item d-flex align-items-center gap-10 p-10px-14px br-7px b-ffffff b-1px-solid-D1D5DB\">\r\n <mat-icon class=\"loc-venue-search-icon fs-18px c-9CA3AF\">search</mat-icon>\r\n <span class=\"loc-venue-text flex-1 overflow-hidden fs-0-875rem c-111827\">{{ venue.address || venue.name ||\r\n venue.description }}</span>\r\n <button type=\"button\"\r\n class=\"loc-action-btn loc-delete-btn d-flex align-items-center justify-content-center cursor-pointer rounded-50 b-none border-none p-4px\"\r\n (click)=\"removeLocationVenue(i)\">\r\n <mat-icon>delete_outline</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Location count badge -->\r\n <p class=\"loc-count-text m-0 font-weight-600 fs-0-8125rem c-3B82F6\"\r\n *ngIf=\"locationVenues.length > 0 && config.locationConfig?.allowMulti\">\r\n {{ locationVenues.length }} {{ controller.labels['LBL_LOC_COUNT_SUFFIX'] || 'Locations Added!' }}\r\n </p>\r\n\r\n <!-- Search input (hide when max reached) -->\r\n <div class=\"loc-search-container position-relative\" *ngIf=\"!locationMaxReached\">\r\n <div class=\"loc-search-wrapper position-relative d-flex align-items-center mt-4\">\r\n <mat-icon class=\"loc-search-icon position-absolute fs-1-1rem c-9CA3AF pe-none\">search</mat-icon>\r\n <input\r\n class=\"field-input loc-search-input w-100 font-poppins flex-1 fs-0-875rem c-111827 br-7px br-8px bc-F3F4F6 pl-2-4rem bc-DC2626 pt-0-625rem pb-0-625rem pl-16px pr-16px bc-ffffff b-1px-solid-D1D5DB pr-3-5rem\"\r\n [placeholder]=\"config.locationConfig?.venuePlaceholder || (controller.labels['PH_LOC_VENUE'] || 'Type to search venue...')\"\r\n [value]=\"locationSearchText\" (input)=\"handleLocationSearchInput($event)\" (blur)=\"hideLocationSuggestions()\"\r\n autocomplete=\"off\" [class.is-invalid]=\"errorMessage\">\r\n </div>\r\n <!-- Suggestions dropdown -->\r\n <div class=\"loc-suggestions-panel position-absolute overflow-hidden br-8px b-ffffff b-1px-solid-D1D5DB\"\r\n *ngIf=\"locationShowSuggestions && locationSuggestions.length\">\r\n <div *ngFor=\"let sug of locationSuggestions\"\r\n class=\"loc-suggestion-item d-flex align-items-center gap-10 cursor-pointer p-10px-14px\"\r\n (mousedown)=\"onLocationSuggestionSelect(sug)\">\r\n <mat-icon class=\"loc-suggestion-icon fs-18px c-E53E3E\">place</mat-icon>\r\n <span class=\"loc-suggestion-text overflow-hidden fs-0-875rem c-374151\">{{ sug.description }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Add another button -->\r\n <button type=\"button\"\r\n class=\"loc-add-btn d-inline-flex align-items-center gap-6 cursor-pointer font-weight-600 p-0 b-none border-none fs-0-875rem c-1A56DB\"\r\n *ngIf=\"locationVenues.length > 0 && !locationMaxReached && config.locationConfig?.allowMulti\">\r\n <mat-icon>add_circle_outline</mat-icon>\r\n <span>{{ controller.labels['LBL_LOC_ADD_ANOTHER'] || 'Add another Location' }}</span>\r\n </button>\r\n\r\n <!-- Map -->\r\n <div class=\"loc-map-container overflow-hidden br-10px b-1px-solid-E5E7EB\"\r\n *ngIf=\"config.locationConfig?.showMap !== false\">\r\n <ng-container *ngIf=\"config.locationConfig?.googleMapsApiKey; else simpleEmbed\">\r\n <div [id]=\"'loc-map-' + config.name\" class=\"loc-map-frame w-100 d-block border-none\"\r\n [style.height]=\"config.locationConfig?.mapHeight || '300px'\"></div>\r\n </ng-container>\r\n <ng-template #simpleEmbed>\r\n <iframe class=\"loc-map-frame w-100 d-block border-none\"\r\n [style.height]=\"config.locationConfig?.mapHeight || '300px'\" [src]=\"getLocationMapEmbedUrl() | trustedUrl\"\r\n frameborder=\"0\" allowfullscreen loading=\"lazy\">\r\n </iframe>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Map hint -->\r\n <p class=\"loc-map-hint m-0 text-center fs-0-78rem c-6B7280\">\r\n {{ controller.labels['LBL_LOC_MAP_HINT'] || 'Type the venue address. A map will appear to assist you.' }}\r\n </p>\r\n </div>\r\n\r\n <!-- ONLINE TAB -->\r\n <div *ngIf=\"locationActiveTab === 'ONLINE'\" class=\"loc-panel loc-online-panel d-flex flex-column gap-12\">\r\n <p class=\"loc-section-label m-0 font-weight-600 c-111827 fs-0-9rem\">\r\n {{ controller.labels['LBL_LOC_ONLINE_URL'] || 'Event URL' }}\r\n </p>\r\n <div class=\"loc-search-wrapper position-relative d-flex align-items-center mt-4\">\r\n <mat-icon class=\"loc-search-icon position-absolute fs-1-1rem c-9CA3AF pe-none\">link</mat-icon>\r\n <input\r\n class=\"field-input loc-search-input w-100 font-poppins flex-1 fs-0-875rem c-111827 br-7px br-8px bc-F3F4F6 pl-2-4rem bc-DC2626 pt-0-625rem pb-0-625rem pl-16px pr-16px bc-ffffff b-1px-solid-D1D5DB pr-3-5rem\"\r\n type=\"url\"\r\n [placeholder]=\"config.locationConfig?.onlinePlaceholder || (controller.labels['PH_LOC_ONLINE'] || 'https://zoom.us/j/...')\"\r\n [value]=\"locationOnlineUrl\" (input)=\"onLocationUrlChange($any($event.target).value)\"\r\n [class.is-invalid]=\"errorMessage\">\r\n </div>\r\n </div>\r\n\r\n <!-- TBA TAB -->\r\n <div *ngIf=\"locationActiveTab === 'TBA'\"\r\n class=\"loc-panel loc-tba-panel d-flex flex-column gap-12 justify-content-center\">\r\n <div\r\n class=\"loc-tba-content d-flex flex-column align-items-center justify-content-center text-center gap-12 p-32px-24px b-F9FAFB b-1px-dashed-D1D5DB br-10px\">\r\n <mat-icon class=\"loc-tba-icon fs-40px c-9CA3AF\">schedule</mat-icon>\r\n <p class=\"loc-tba-text m-0 c-6B7280 fs-0-9rem\">\r\n {{ controller.labels['LBL_LOC_TBA_DESC'] || \"This event's location is yet to be announced. Check back later\r\n for updates.\" }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <!-- Hidden real form control -->\r\n <input type=\"hidden\" [formControlName]=\"config.name!\">\r\n\r\n <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n\r\n</div>","import { Component, Input, OnInit, OnDestroy } from '@angular/core';\r\nimport { FormArray, FormBuilder, FormGroup } from '@angular/forms';\r\nimport { SectionConfig, FieldConfig } from '../../models/form-schema.model';\r\nimport { SmartFormController } from '../../services/smart-form-controller.service';\r\n\r\n@Component({\r\n selector: 'lib-form-section',\r\n templateUrl: './form-section.component.html',\r\n styleUrls: ['./form-section.component.scss'],\r\n standalone: false\r\n})\r\nexport class FormSectionComponent implements OnInit, OnDestroy {\r\n @Input() config!: SectionConfig;\r\n @Input() controller!: SmartFormController;\r\n @Input() formGroup!: FormGroup;\r\n\r\n /**\r\n * For allowMulti sections: the FormArray registered on the root formGroup.\r\n * Each element is a FormGroup representing one repeater instance.\r\n */\r\n repeaterFormArray!: FormArray;\r\n\r\n /**\r\n * The key under which the FormArray is registered in the root formGroup.\r\n * Falls back to config.name or a generated key.\r\n */\r\n get arrayKey(): string {\r\n return this.config.name || '__repeater__';\r\n }\r\n\r\n constructor(private fb: FormBuilder) { }\r\n\r\n ngOnInit(): void {\r\n if (this.config.allowMulti) {\r\n this.repeaterFormArray = this.fb.array([]);\r\n this.formGroup.addControl(this.arrayKey, this.repeaterFormArray);\r\n // Start with one empty instance\r\n this.addInstance();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.config.allowMulti && this.formGroup.contains(this.arrayKey)) {\r\n this.formGroup.removeControl(this.arrayKey);\r\n }\r\n }\r\n\r\n // ── Repeater helpers ──────────────────────────────────────────────────────\r\n\r\n /** Creates a fresh FormGroup for one repeater instance */\r\n private createInstanceGroup(): FormGroup {\r\n return this.fb.group({});\r\n }\r\n\r\n addInstance(): void {\r\n this.repeaterFormArray.push(this.createInstanceGroup());\r\n }\r\n\r\n removeInstance(index: number): void {\r\n if (this.repeaterFormArray.length > 1) {\r\n this.repeaterFormArray.removeAt(index);\r\n }\r\n }\r\n\r\n getInstanceGroup(index: number): FormGroup {\r\n return this.repeaterFormArray.at(index) as FormGroup;\r\n }\r\n\r\n get instanceGroups(): FormGroup[] {\r\n return this.repeaterFormArray.controls as FormGroup[];\r\n }\r\n\r\n // ── Non-repeater: flat single FormGroup (root formGroup passed through) ──\r\n\r\n /** For non-allowMulti sections we simply pass the root formGroup down */\r\n get flatFormGroup(): FormGroup {\r\n return this.formGroup;\r\n }\r\n\r\n // ── Collect nested fields for a given child ───────────────────────────────\r\n /** Flatten a field tree to get all leaf fields (for ROW children etc.) */\r\n getFlatFields(fields: FieldConfig[]): FieldConfig[] {\r\n const result: FieldConfig[] = [];\r\n fields.forEach(f => {\r\n if (f.type === 'ROW' && f.children) {\r\n result.push(...this.getFlatFields(f.children));\r\n } else {\r\n result.push(f);\r\n }\r\n });\r\n return result;\r\n }\r\n}\r\n","<div class=\"form-section-container\">\r\n <h3 class=\"section-label\" *ngIf=\"config.label && !config.allowMulti\">{{ config.label }}</h3>\r\n\r\n <!-- ══ Repeater (allowMulti) ══════════════════════════════════════════════ -->\r\n <ng-container *ngIf=\"config.allowMulti\">\r\n <h3 class=\"section-label\">{{ config.label }}</h3>\r\n\r\n <div *ngFor=\"let instanceGroup of instanceGroups; let i = index\" class=\"section-instance\">\r\n <!-- Instance header (remove button) -->\r\n <div class=\"section-header\" *ngIf=\"instanceGroups.length > 1\">\r\n <span class=\"section-number\">{{ config.label }} #{{ i + 1 }}</span>\r\n <lib-button [variant]=\"'danger-outline'\" (click)=\"removeInstance(i)\">\r\n <mat-icon>delete_outline</mat-icon> Remove\r\n </lib-button>\r\n </div>\r\n\r\n <!-- Fields – each child rendered with the *instance* FormGroup -->\r\n <div class=\"section-fields sf-grid\">\r\n <ng-container *ngFor=\"let field of config.children\">\r\n <div class=\"sf-col\" [style.gridColumn]=\"'span ' + (field.colSpan || 12)\" *ngIf=\"field.isEnabled !== false\">\r\n <lib-form-field [config]=\"field\" [controller]=\"controller\" [formGroup]=\"instanceGroup\">\r\n </lib-form-field>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <lib-button [variant]=\"'primary'\" (click)=\"addInstance()\">\r\n <mat-icon>add</mat-icon> Add {{ config.label }}\r\n </lib-button>\r\n </ng-container>\r\n\r\n <!-- ══ Non-repeater (single instance) ════════════════════════════════════ -->\r\n <ng-container *ngIf=\"!config.allowMulti\">\r\n <div class=\"section-fields sf-grid\">\r\n <ng-container *ngFor=\"let field of config.children\">\r\n <div class=\"sf-col\" [style.gridColumn]=\"'span ' + (field.colSpan || 12)\" *ngIf=\"field.isEnabled !== false\">\r\n <lib-form-field [config]=\"field\" [controller]=\"controller\" [formGroup]=\"flatFormGroup\">\r\n </lib-form-field>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n</div>","import { Component, EventEmitter, Input, OnDestroy, OnInit, OnChanges, SimpleChanges, Output } from '@angular/core';\r\nimport { FormArray, FormBuilder, FormGroup } from '@angular/forms';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Router } from '@angular/router';\r\nimport { ActionBarConfig, ActionButtonConfig, ActionConfig, FieldConfig, FormSchema } from '../../models/form-schema.model';\r\nimport { SmartFormController } from '../../services/smart-form-controller.service';\r\nimport { ExpressionService } from '../../services/expression.service';\r\nimport { SmartFormTranslationUtils } from '../../utils/translation.utils';\r\nimport { SnackbarService } from '../../../snackbar/services/snackbar.service';\r\nimport { Subject, takeUntil } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'lib-smart-form',\r\n templateUrl: './smart-form.component.html',\r\n styleUrls: ['./smart-form.component.scss'],\r\n providers: [SmartFormController],\r\n standalone: false\r\n})\r\nexport class SmartFormComponent implements OnInit, OnChanges, OnDestroy {\r\n private destroy$ = new Subject<void>();\r\n @Input() formJson!: string;\r\n @Input() initialValues?: { [key: string]: any };\r\n @Input() enableDraftAutoSave: boolean = false;\r\n /** Flat i18n labels map passed by the consuming app.\r\n * After JSON parse the schema is walked and every string value that\r\n * matches a key in this map is replaced with the translated value.\r\n * Mirrors the pattern used by ConfigurableFormComponent + translateConfig.\r\n */\r\n @Input() labels: any = {};\r\n @Input() mode: 'CREATE' | 'EDIT' = 'CREATE';\r\n\r\n @Output() submit = new EventEmitter<{ [key: string]: any }>();\r\n @Output() draftSave = new EventEmitter<string>();\r\n /**\r\n * Emitted when a button with a custom `type` (not 'cancel', 'draft', or\r\n * 'submit') is clicked. Payload contains the button `id` and the current\r\n * form data snapshot.\r\n */\r\n @Output() actionClick = new EventEmitter<{ id: string; formData: { [key: string]: any } }>();\r\n @Output() valueChange = new EventEmitter<{ [key: string]: any }>();\r\n\r\n formSchema!: FormSchema;\r\n formGroup!: FormGroup;\r\n fieldList: FieldConfig[] = [];\r\n isStepper: boolean = false;\r\n currentStep: number = 0;\r\n isLoading: boolean = false;\r\n isDraftLoading: boolean = false;\r\n\r\n constructor(\r\n private fb: FormBuilder,\r\n public controller: SmartFormController,\r\n private expressionService: ExpressionService,\r\n private http: HttpClient,\r\n private snackbarService: SnackbarService,\r\n private router: Router\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.parseFormJson();\r\n // Load databe in EDIT mode, or use fallback initialValues\r\n if (this.mode === 'EDIT' && this.formSchema?.editConfig?.loadApiUrl) {\r\n this.loadEditData();\r\n } else if (this.initialValues) {\r\n this.controller.initialize(this.initialValues);\r\n }\r\n }\r\n\r\n loadEditData(): void {\r\n const config = this.formSchema.editConfig!;\r\n this.isLoading = true;\r\n const headers = this.getHeaders();\r\n this.http.get(config.loadApiUrl, { headers }).subscribe({\r\n next: (response: any) => {\r\n // Assume API returns flat or easily mappable object matching form controls\r\n this.initialValues = response;\r\n this.controller.initialize(this.initialValues || {});\r\n this.isLoading = false;\r\n },\r\n error: (err) => {\r\n this.showAlert('error', config.errorMessage || 'Failed to load form data', config.snackbarConfig);\r\n console.error('Load data error:', err);\r\n this.isLoading = false;\r\n }\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['formJson'] && !changes['formJson'].isFirstChange()) {\r\n this.parseFormJson();\r\n }\r\n // Re-translate if labels arrive after the JSON was already parsed\r\n if (changes['labels'] && !changes['labels'].isFirstChange() && this.formSchema) {\r\n this.parseFormJson();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.controller.destroy();\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n parseFormJson(): void {\r\n if (!this.formJson) { return; } // guard: labels may arrive before formJson\r\n try {\r\n const jsonData = JSON.parse(this.formJson);\r\n this.formSchema = jsonData as FormSchema;\r\n // Push token from configJSON into the shared controller so all child\r\n // components (form-field, etc.) can read it without @Input prop-drilling.\r\n this.controller.token = this.formSchema.token;\r\n this.controller.tokenHeader = this.formSchema.tokenHeader;\r\n // Translate i18n keys before rendering\r\n if (this.labels && Object.keys(this.labels).length) {\r\n SmartFormTranslationUtils.translateSchema(this.formSchema, this.labels);\r\n }\r\n // Share translated labels with child components via controller\r\n this.controller.labels = this.labels;\r\n this.controller.actionLabels = this.formSchema.labels;\r\n this.isStepper = this.formSchema.formType === 'STEPPER';\r\n this.fieldList = this.isStepper\r\n ? (this.formSchema.stepperConfig?.children || []).filter(step => step.isEnabled !== false && step.sectionConfig?.isEnabled !== false)\r\n : (this.formSchema.sectionConfig?.children || []).filter(field => field.isEnabled !== false);\r\n this.initializeForm();\r\n } catch (e) {\r\n console.error('Error parsing form JSON:', e);\r\n }\r\n }\r\n\r\n\r\n initializeForm(): void {\r\n this.formGroup = this.fb.group({});\r\n this.collectFields(this.fieldList);\r\n\r\n // Emit value changes to parent\r\n this.formGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(() => {\r\n this.valueChange.emit(this.collectFormData());\r\n });\r\n }\r\n\r\n collectFields(fields: FieldConfig[]): void {\r\n fields.forEach(field => {\r\n if (field.isEnabled === false || field.sectionConfig?.isEnabled === false) return;\r\n\r\n // Flat leaf fields: seed controller with default values\r\n if (field.name && field.type !== 'GROUP' && field.type !== 'ROW') {\r\n // Check if initialValues already has a value for this field\r\n const existingValue = this.initialValues?.[field.name];\r\n const value = existingValue !== undefined\r\n ? existingValue\r\n : (field.defaultValue !== undefined ? field.defaultValue : null);\r\n this.controller.updateField(field.name, value);\r\n }\r\n // Recurse into ROW children\r\n if (field.type === 'ROW' && field.children?.length) {\r\n this.collectFields(field.children);\r\n }\r\n // Recurse into GROUP children\r\n if (field.type === 'GROUP' && field.sectionConfig?.children?.length) {\r\n this.collectFields(field.sectionConfig.children);\r\n }\r\n });\r\n }\r\n\r\n // ───────────────────────────────────────────────────────────────────────────\r\n // Submit\r\n // ───────────────────────────────────────────────────────────────────────────\r\n\r\n handleSubmit(): void {\r\n if (this.isStepper && this.currentStep < this.fieldList.length - 1) {\r\n if (this.validate()) this.nextStep();\r\n return;\r\n }\r\n if (!this.validate()) return;\r\n\r\n this.submitToApi(this.collectFormData(), 'submit');\r\n }\r\n\r\n // ───────────────────────────────────────────────────────────────────────────\r\n // Cancel\r\n // ───────────────────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Universal action handler for any button click.\r\n * One handler decides how to process based on action.kind.\r\n */\r\n handleButtonClick(btn: ActionButtonConfig): void {\r\n const action = btn.action;\r\n if (!action) return;\r\n\r\n switch (action.kind) {\r\n case 'submit':\r\n this.handleSubmit();\r\n break;\r\n case 'draft':\r\n this.submitToApi(this.collectFormData(), 'draft', btn);\r\n break;\r\n case 'navigate':\r\n this.navigateTo(action.redirectUrl);\r\n break;\r\n case 'api':\r\n this.fireActionApiCall(action);\r\n break;\r\n case 'emit':\r\n this.actionClick.emit({ id: btn.id, formData: this.collectFormData() });\r\n break;\r\n case 'next':\r\n if (this.validate()) this.nextStep();\r\n break;\r\n case 'prev':\r\n this.previousStep();\r\n break;\r\n }\r\n }\r\n\r\n // ── Action-Redirects & API ──────────────────────────────────────────────────\r\n\r\n private fireActionApiCall(action: ActionConfig): void {\r\n if (!action.apiUrl) return;\r\n const headers = this.getHeaders();\r\n const method = action.method || 'POST';\r\n const body = action.extraPayload || {};\r\n\r\n this.isLoading = true;\r\n this.http.request(method, action.apiUrl, { body, headers }).subscribe({\r\n next: (response) => {\r\n this.isLoading = false;\r\n const msg = action.successMessage || 'Action successful';\r\n this.showAlert('success', msg, action.snackbarConfig);\r\n if (action.redirectUrl) this.navigateTo(action.redirectUrl);\r\n },\r\n error: (err) => {\r\n this.isLoading = false;\r\n const msg = action.errorMessage || 'Action failed';\r\n this.showAlert('error', msg, action.snackbarConfig);\r\n console.error('API Action error:', err);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Constructs nested payload by checking field properties on form controls.\r\n */\r\n collectFormData(): { [key: string]: any } {\r\n const rawValue = this.extractGroupValue(this.formGroup);\r\n let payload = this.buildNestedPayload(rawValue, this.fieldList);\r\n\r\n // Merge extra fields based on the mode\r\n const config = this.mode === 'EDIT' ? this.formSchema.editConfig : this.formSchema.submitConfig;\r\n if (config?.extraPayload) {\r\n payload = this.deepMerge(payload, config.extraPayload);\r\n }\r\n\r\n return payload;\r\n }\r\n\r\n /**\r\n * Deep merges the source object (e.g. extraPayload) into the target object (e.g. form payload).\r\n */\r\n private deepMerge(target: any, source: any): any {\r\n if (typeof target !== 'object' || target === null) {\r\n return source;\r\n }\r\n if (typeof source !== 'object' || source === null) {\r\n return source;\r\n }\r\n\r\n if (Array.isArray(target) && Array.isArray(source)) {\r\n // For arrays, we merge objects at the same index\r\n const maxLength = Math.max(target.length, source.length);\r\n const mergedArray = [];\r\n for (let i = 0; i < maxLength; i++) {\r\n if (i < target.length && i < source.length) {\r\n mergedArray.push(this.deepMerge(target[i], source[i]));\r\n } else if (i < source.length) {\r\n mergedArray.push(source[i]);\r\n } else {\r\n mergedArray.push(target[i]);\r\n }\r\n }\r\n return mergedArray;\r\n }\r\n\r\n const merged = { ...target };\r\n Object.keys(source).forEach(key => {\r\n if (source[key] instanceof Object && key in target) {\r\n merged[key] = this.deepMerge(target[key], source[key]);\r\n } else {\r\n merged[key] = source[key];\r\n }\r\n });\r\n return merged;\r\n }\r\n\r\n private buildNestedPayload(rawValue: any, fields: FieldConfig[]): { [key: string]: any } {\r\n if (rawValue === null || typeof rawValue !== 'object') return rawValue;\r\n\r\n const payload: { [key: string]: any } = {};\r\n const processedKeys = new Set<string>();\r\n\r\n const processFields = (fieldList: FieldConfig[]) => {\r\n fieldList.forEach(field => {\r\n if (field.isEnabled === false || field.sectionConfig?.isEnabled === false) return;\r\n\r\n if (field.type === 'ROW' && field.children) {\r\n processFields(field.children);\r\n } else if (field.type === 'GROUP' && field.sectionConfig?.children) {\r\n // FormFieldComponent generates unnamed groups using their label inside the root FormGroup.\r\n const generatedKey = field.sectionConfig.label\r\n ? field.sectionConfig.label.replace(/(?:^\\w|[A-Z]|\\b\\w)/g, (w, i) => i === 0 ? w.toLowerCase() : w.toUpperCase()).replace(/\\s+/g, '')\r\n : '';\r\n const groupKey = field.sectionConfig.name || field.name || generatedKey || '__group__';\r\n \r\n processedKeys.add(groupKey);\r\n\r\n const groupRawValue = rawValue[groupKey];\r\n if (groupRawValue !== undefined) {\r\n // Identify if it's purely a visual section vs an explicit structural data block\r\n const isStructural = field.sectionConfig.name || field.name || field.sectionConfig.allowMulti;\r\n\r\n if (!isStructural) {\r\n // Visual section: Flatten its contents directly onto the target payload layer\r\n Object.assign(payload, this.buildNestedPayload(groupRawValue, field.sectionConfig.children));\r\n } else {\r\n // Structural block: process nested mappings / array instances\r\n const nestedData = (field.sectionConfig.allowMulti && Array.isArray(groupRawValue))\r\n ? groupRawValue.map(item => this.buildNestedPayload(item, field.sectionConfig!.children!))\r\n : this.buildNestedPayload(groupRawValue, field.sectionConfig.children);\r\n\r\n if (field.payloadPath) {\r\n this.setNestedValue(payload, field.payloadPath, nestedData);\r\n } else {\r\n payload[groupKey] = nestedData;\r\n }\r\n }\r\n }\r\n } else if (field.name) {\r\n processedKeys.add(field.name);\r\n if (rawValue[field.name] !== undefined) {\r\n const val = rawValue[field.name];\r\n if (field.payloadPath) {\r\n this.setNestedValue(payload, field.payloadPath, val);\r\n } else {\r\n payload[field.name] = val;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n processFields(fields);\r\n\r\n // Preserve any hidden tracking keys (e.g. id, uuid, isEdit) that were present in the initial data\r\n Object.keys(rawValue).forEach(key => {\r\n if (!processedKeys.has(key)) {\r\n payload[key] = rawValue[key];\r\n }\r\n });\r\n\r\n return payload;\r\n }\r\n\r\n private setNestedValue(obj: any, path: string, value: any): void {\r\n // Regex matches the property name and optionally an array index e.g. \"name[0]\" -> regex yields [\"name[0]\", \"name\", \"0\"]\r\n const arrayRegex = /^([a-zA-Z0-9_]+)\\[(\\d+)\\]$/;\r\n\r\n const parts = path.split('.');\r\n let current = obj;\r\n\r\n for (let i = 0; i < parts.length - 1; i++) {\r\n const part = parts[i];\r\n const match = part.match(arrayRegex);\r\n\r\n if (match) {\r\n const prop = match[1];\r\n const index = parseInt(match[2], 10);\r\n if (!current[prop]) current[prop] = [];\r\n if (!current[prop][index]) current[prop][index] = {};\r\n current = current[prop][index];\r\n } else {\r\n if (!current[part]) current[part] = {};\r\n current = current[part];\r\n }\r\n }\r\n\r\n const lastPart = parts[parts.length - 1];\r\n const matchLast = lastPart.match(arrayRegex);\r\n if (matchLast) {\r\n const prop = matchLast[1];\r\n const index = parseInt(matchLast[2], 10);\r\n if (!current[prop]) current[prop] = [];\r\n current[prop][index] = value;\r\n } else {\r\n current[lastPart] = value;\r\n }\r\n }\r\n\r\n private extractGroupValue(group: FormGroup): { [key: string]: any } {\r\n const result: { [key: string]: any } = {};\r\n Object.keys(group.controls).forEach(key => {\r\n const ctrl = group.controls[key];\r\n if (ctrl instanceof FormArray) {\r\n // Repeater → array of objects\r\n result[key] = (ctrl.controls as FormGroup[]).map(fg => this.extractGroupValue(fg));\r\n } else if (ctrl instanceof FormGroup) {\r\n // Nested single group → nested object\r\n result[key] = this.extractGroupValue(ctrl);\r\n } else {\r\n result[key] = ctrl?.value ?? null;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n validate(): boolean {\r\n if (this.formGroup.invalid) {\r\n this.formGroup.markAllAsTouched();\r\n this.scrollToFirstInvalidControl();\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n scrollToFirstInvalidControl(): void {\r\n setTimeout(() => {\r\n const firstInvalidControl = document.querySelector('.is-invalid, .ng-invalid.ng-touched');\r\n if (firstInvalidControl) {\r\n firstInvalidControl.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n }, 100);\r\n }\r\n\r\n submitToApi(formData: any, actionType: 'submit' | 'draft' = 'submit', btn?: ActionButtonConfig): void {\r\n const isEdit = this.mode === 'EDIT';\r\n const configLine: any = isEdit ? this.formSchema.editConfig : this.formSchema.submitConfig;\r\n const action = btn?.action;\r\n\r\n // Build the final payload, merging draft extraPayload if applicable\r\n let finalPayload = formData;\r\n if (actionType === 'draft' && action?.extraPayload) {\r\n finalPayload = this.deepMerge(finalPayload, action.extraPayload);\r\n }\r\n\r\n // Fallback for emitted outputs if no API URL is defined centrally\r\n if (!configLine || (!configLine.apiUrl && !configLine.submitApiUrl)) {\r\n if (actionType === 'draft') {\r\n this.draftSave.emit(JSON.stringify(finalPayload));\r\n if (action?.redirectUrl) this.navigateTo(action.redirectUrl);\r\n } else {\r\n this.submit.emit(finalPayload);\r\n }\r\n return;\r\n }\r\n\r\n const apiUrl = isEdit ? configLine.submitApiUrl : configLine.apiUrl;\r\n const method = isEdit ? (configLine.submitMethod || 'PATCH') : (configLine.method || 'POST');\r\n const headers = this.getHeaders();\r\n\r\n // Messages and redirect URLs (Prefer button action overrides if present)\r\n const successMsg = actionType === 'draft'\r\n ? (action?.successMessage || 'Draft saved successfully')\r\n : (action?.successMessage || configLine.successMessage || 'Form submitted successfully');\r\n\r\n const errorMsg = actionType === 'draft'\r\n ? (action?.errorMessage || 'Failed to save draft')\r\n : (action?.errorMessage || configLine.errorMessage || 'Failed to submit form');\r\n\r\n const redirectUrl = actionType === 'draft'\r\n ? (action?.redirectUrl || configLine.redirectUrl)\r\n : (action?.redirectUrl || configLine.redirectUrl);\r\n\r\n if (actionType === 'draft') {\r\n this.isDraftLoading = true;\r\n } else {\r\n this.isLoading = true;\r\n }\r\n\r\n this.http.request(method, apiUrl, { body: finalPayload, headers }).subscribe({\r\n next: (response) => {\r\n this.showAlert('success', successMsg, action?.snackbarConfig || configLine.snackbarConfig);\r\n\r\n if (actionType === 'draft') {\r\n this.draftSave.emit(JSON.stringify(response));\r\n this.isDraftLoading = false;\r\n } else {\r\n this.submit.emit(response);\r\n this.isLoading = false;\r\n }\r\n\r\n if (redirectUrl) {\r\n setTimeout(() => this.navigateTo(redirectUrl), 1500);\r\n }\r\n },\r\n error: (err) => {\r\n this.showAlert('error', errorMsg, action?.snackbarConfig || configLine.snackbarConfig);\r\n console.error(actionType === 'draft' ? 'Draft save error:' : 'Submit error:', err);\r\n this.isLoading = false;\r\n this.isDraftLoading = false;\r\n }\r\n });\r\n }\r\n\r\n showAlert(type: 'success' | 'error' | 'warning' | 'info', message: string, customConfig?: any): void {\r\n this.snackbarService.show({\r\n variant: type,\r\n message: message,\r\n showCloseButton: true,\r\n ...customConfig\r\n });\r\n }\r\n\r\n /** Builds HttpHeaders from the token stored in the controller (sourced from configJSON). */\r\n getHeaders(): HttpHeaders {\r\n let headers = new HttpHeaders();\r\n if (this.controller.token) {\r\n const headerName = this.controller.tokenHeader || 'Authorization';\r\n headers = headers.set(headerName, this.controller.token);\r\n }\r\n return headers;\r\n }\r\n\r\n // ───────────────────────────────────────────────────────────────────────────\r\n // Stepper\r\n // ───────────────────────────────────────────────────────────────────────────\r\n\r\n nextStep(): void {\r\n if (this.currentStep < this.fieldList.length - 1) this.currentStep++;\r\n }\r\n\r\n previousStep(): void {\r\n if (this.currentStep > 0) this.currentStep--;\r\n }\r\n\r\n get canGoNext(): boolean { return this.currentStep < this.fieldList.length - 1; }\r\n get canGoPrevious(): boolean { return this.currentStep > 0; }\r\n get currentStepConfig(): FieldConfig | undefined {\r\n return this.isStepper ? this.fieldList[this.currentStep] : undefined;\r\n }\r\n\r\n // ── Action Labels ──────────────────────────────────────────────────────────\r\n\r\n get nextLabel(): string {\r\n const key = this.formSchema?.labels?.nextLabel || 'Next';\r\n return this.labels[key] || key;\r\n }\r\n\r\n get submitLabel(): string {\r\n const btn = this.getButtonByActionKind('submit');\r\n if (btn?.label) return this.labels[btn.label] || btn.label;\r\n const key = this.formSchema?.labels?.submitLabel || 'Submit';\r\n return this.labels[key] || key;\r\n }\r\n\r\n get previousLabel(): string {\r\n const key = this.formSchema?.labels?.previousLabel || 'Previous';\r\n return this.labels[key] || key;\r\n }\r\n\r\n // ── Action Bar helpers ─────────────────────────────────────────────────────\r\n\r\n get actionBarConfig(): ActionBarConfig | undefined {\r\n return this.formSchema?.actionBarConfig;\r\n }\r\n\r\n /**\r\n * Returns buttons for a given alignment, sorted by `order` (stable).\r\n */\r\n getButtonsForAlignment(alignment: 'left' | 'right'): ActionButtonConfig[] {\r\n return (this.actionBarConfig?.buttons || [])\r\n .filter(b => !b.hidden && (b.alignment ?? 'right') === alignment)\r\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\r\n }\r\n\r\n getButtonLabel(btn: ActionButtonConfig): string {\r\n if (btn.action?.kind === 'submit' && this.isStepper && this.canGoNext) {\r\n return this.nextLabel;\r\n }\r\n const key = btn.label || btn.id;\r\n return this.labels[key] || key;\r\n }\r\n\r\n isButtonDisabled(btn: ActionButtonConfig): boolean {\r\n if (btn.disabled) return true;\r\n const kind = btn.action?.kind;\r\n if (kind === 'submit' || kind === 'draft' || kind === 'api') {\r\n return this.isLoading || this.isDraftLoading;\r\n }\r\n return false;\r\n }\r\n\r\n private getButtonByActionKind(kind: string): ActionButtonConfig | undefined {\r\n return (this.actionBarConfig?.buttons || []).find(b => b.action?.kind === kind);\r\n }\r\n\r\n // ── Navigation helper ──────────────────────────────────────────────────────\r\n\r\n private navigateTo(url?: string): void {\r\n if (!url) return;\r\n if (url.startsWith('http://') || url.startsWith('https://')) {\r\n window.location.href = url;\r\n } else {\r\n this.router.navigateByUrl(url);\r\n }\r\n }\r\n\r\n\r\n}","<div class=\"smart-form-container\">\r\n <div class=\"smart-form-wrapper\" *ngIf=\"formSchema\">\r\n\r\n <!-- Form Header -->\r\n <div class=\"form-header\" *ngIf=\"formSchema.showTitle !== false\">\r\n <h2 class=\"form-title\">{{ formSchema.label }}</h2>\r\n <p class=\"form-description\" *ngIf=\"formSchema.description\">{{ formSchema.description }}</p>\r\n </div>\r\n\r\n <!-- Stepper Navigation -->\r\n <div class=\"stepper-nav\" *ngIf=\"isStepper && formSchema.stepperConfig?.showStep !== false\">\r\n <div class=\"stepper-steps\" [class.horizontal]=\"formSchema.stepperConfig?.isHorizontal !== false\">\r\n <div *ngFor=\"let step of fieldList; let i = index\" class=\"stepper-step\" [class.active]=\"i === currentStep\"\r\n [class.completed]=\"i < currentStep\">\r\n <div class=\"step-number\">{{ i + 1 }}</div>\r\n <div class=\"step-label\">{{ step.sectionConfig?.label || 'Step ' + (i + 1) }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Form Content -->\r\n <form [formGroup]=\"formGroup\" class=\"smart-form\">\r\n <!-- Section Form -->\r\n <div *ngIf=\"!isStepper && formSchema.sectionConfig && formSchema.sectionConfig.isEnabled !== false\" class=\"form-section\">\r\n <lib-form-section [config]=\"formSchema.sectionConfig\" [controller]=\"controller\" [formGroup]=\"formGroup\">\r\n </lib-form-section>\r\n </div>\r\n\r\n <!-- Stepper Form -->\r\n <div *ngIf=\"isStepper && currentStepConfig && currentStepConfig.sectionConfig?.isEnabled !== false\" class=\"form-stepper\">\r\n <lib-form-section [config]=\"currentStepConfig.sectionConfig!\" [controller]=\"controller\" [formGroup]=\"formGroup\">\r\n </lib-form-section>\r\n </div>\r\n </form>\r\n\r\n <!-- ── Form Actions ──────────────────────────────────────────────────── -->\r\n <div class=\"form-actions\" *ngIf=\"formSchema.showActions !== false\">\r\n\r\n <!-- LEFT GROUP -->\r\n <div class=\"action-group action-group--left\">\r\n <!-- Optional: Navigational buttons like 'Previous' for stepper can be explicitly added to config, \r\n but we'll keep the logic if they are provided in the buttons array via action.kind === 'prev' -->\r\n <lib-button\r\n *ngFor=\"let btn of getButtonsForAlignment('left')\"\r\n [variant]=\"$any(btn.variant) || 'outline'\"\r\n [disabled]=\"isButtonDisabled(btn)\"\r\n (click)=\"handleButtonClick(btn)\">\r\n {{ getButtonLabel(btn) }}\r\n </lib-button>\r\n </div>\r\n\r\n <!-- RIGHT GROUP -->\r\n <div class=\"action-group action-group--right\">\r\n <lib-button\r\n *ngFor=\"let btn of getButtonsForAlignment('right')\"\r\n [variant]=\"$any(btn.variant) || 'primary'\"\r\n [disabled]=\"isButtonDisabled(btn)\"\r\n (click)=\"handleButtonClick(btn)\">\r\n {{ getButtonLabel(btn) }}\r\n </lib-button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ButtonComponent } from './components/button/button.component';\r\n\r\n@NgModule({\r\n declarations: [\r\n ButtonComponent\r\n ],\r\n imports: [\r\n CommonModule\r\n ],\r\n exports: [\r\n ButtonComponent\r\n ]\r\n})\r\nexport class ButtonModule { }\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { AlertLabels, AlertVariant, IconInput } from '../../alert.models';\r\n\r\n@Component({\r\n selector: 'lib-alert',\r\n templateUrl: './alert.component.html',\r\n styleUrls: ['./alert.component.scss'],\r\n standalone: false\r\n})\r\nexport class AlertComponent implements OnInit {\r\n @Input() variant: AlertVariant = 'info';\r\n @Input() title: string = '';\r\n @Input() message: string = '';\r\n @Input() icon: IconInput = true;\r\n @Input() customIcon: string = ''; // New input for custom class\r\n @Input() labels?: AlertLabels;\r\n\r\n // Customization Inputs\r\n @Input() width?: string;\r\n @Input() height?: string;\r\n @Input() borderRadius?: string;\r\n @Input() padding?: string;\r\n @Input() gap?: string;\r\n @Input() backgroundColor?: string;\r\n @Input() color?: string; // New input for custom text color\r\n @Input() borderColor?: string;\r\n @Input() fontSize?: string;\r\n @Input() fontWeight?: string;\r\n @Input() boxShadow?: string;\r\n\r\n // Granular Border Radius Customization\r\n @Input() borderTopLeftRadius?: string;\r\n @Input() borderTopRightRadius?: string;\r\n @Input() borderBottomLeftRadius?: string;\r\n @Input() borderBottomRightRadius?: string;\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n get isDefaultIcon(): boolean {\r\n return this.icon === true;\r\n }\r\n\r\n get isStringIcon(): boolean {\r\n return typeof this.icon === 'string';\r\n }\r\n\r\n get isObjectIcon(): boolean {\r\n return typeof this.icon === 'object' && this.icon !== null;\r\n }\r\n\r\n get iconString(): string {\r\n return typeof this.icon === 'string' ? this.icon : '';\r\n }\r\n\r\n get isImgIcon(): boolean {\r\n const icon = this.icon;\r\n if (typeof icon === 'string') {\r\n return icon.includes('/') || icon.includes('.') || icon.startsWith('http');\r\n }\r\n return typeof icon === 'object' && icon !== null && icon.type === 'img';\r\n }\r\n\r\n get iconObject(): { type: string; value: string } {\r\n return typeof this.icon === 'object' ? this.icon as any : { type: '', value: '' };\r\n }\r\n\r\n get defaultIconClass(): string {\r\n switch (this.variant) {\r\n case 'success': return 'fa-solid fa-circle-check';\r\n case 'warning':\r\n case 'warning-shadow': return 'fa-solid fa-triangle-exclamation';\r\n case 'error': return 'fa-solid fa-triangle-exclamation';\r\n case 'info':\r\n default: return 'fa-solid fa-circle-info';\r\n }\r\n }\r\n}\r\n","<div class=\"cc-alert\" [ngClass]=\"'cc-alert-' + variant\" [style.width]=\"width\" [style.height]=\"height\"\r\n [style.border-radius]=\"borderRadius\" [style.border-top-left-radius]=\"borderTopLeftRadius\"\r\n [style.border-top-right-radius]=\"borderTopRightRadius\" [style.border-bottom-left-radius]=\"borderBottomLeftRadius\"\r\n [style.border-bottom-right-radius]=\"borderBottomRightRadius\" [style.padding]=\"padding\" [style.gap]=\"gap\"\r\n [style.background-color]=\"backgroundColor\" [style.color]=\"color\" [style.border-color]=\"borderColor\"\r\n [style.font-size]=\"fontSize\" [style.font-weight]=\"fontWeight\" [style.box-shadow]=\"boxShadow\">\r\n\r\n <div class=\"cc-alert-icon\" *ngIf=\"icon\">\r\n <i *ngIf=\"customIcon\" [ngClass]=\"customIcon\"></i>\r\n <i *ngIf=\"!customIcon && isDefaultIcon\" [ngClass]=\"defaultIconClass\"></i>\r\n <i *ngIf=\"!customIcon && isStringIcon && !isImgIcon\" [ngClass]=\"iconString\"></i>\r\n <img *ngIf=\"!customIcon && isStringIcon && isImgIcon\" [src]=\"iconString\"\r\n [attr.alt]=\"labels?.iconAltText || 'alert icon'\" />\r\n <ng-container *ngIf=\"isObjectIcon\">\r\n <i *ngIf=\"iconObject.type === 'fontawesome'\" [ngClass]=\"iconObject.value\"></i>\r\n <span *ngIf=\"iconObject.type === 'material'\" class=\"material-icons\">{{ iconObject.value }}</span>\r\n <img *ngIf=\"iconObject.type === 'img'\" [src]=\"iconObject.value\"\r\n [attr.alt]=\"labels?.iconAltText || 'alert icon'\" />\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"cc-alert-content\">\r\n <div class=\"cc-alert-title\" *ngIf=\"title\">{{ title }}</div>\r\n <div class=\"cc-alert-message\" *ngIf=\"message\">{{ message }}</div>\r\n <ng-content></ng-content>\r\n </div>\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { AlertComponent } from './components/alert/alert.component';\r\n\r\n@NgModule({\r\n declarations: [\r\n AlertComponent\r\n ],\r\n imports: [\r\n CommonModule\r\n ],\r\n exports: [\r\n AlertComponent\r\n ]\r\n})\r\nexport class AlertModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\r\nimport { MaterialModule } from '../material/material.module';\r\nimport { SmartFormComponent } from './components/smart-form/smart-form.component';\r\nimport { FormSectionComponent } from './components/form-section/form-section.component';\r\nimport { FormFieldComponent } from './components/form-field/form-field.component';\r\nimport { ExpressionService } from './services/expression.service';\r\nimport { ButtonModule } from '../button/button.module';\r\nimport { AlertModule } from '../alert/alert.module';\r\nimport { QuillModule } from 'ngx-quill';\r\nimport { TrustedUrlPipe } from './utils/trusted-url.pipe';\r\n\r\n@NgModule({\r\n declarations: [\r\n SmartFormComponent,\r\n FormSectionComponent,\r\n FormFieldComponent,\r\n TrustedUrlPipe\r\n ],\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n FormsModule,\r\n MaterialModule,\r\n ButtonModule,\r\n AlertModule,\r\n QuillModule.forRoot()\r\n ],\r\n exports: [\r\n SmartFormComponent\r\n ],\r\n providers: [\r\n ExpressionService\r\n ]\r\n})\r\nexport class SmartFormModule { }\r\n","import { Component, Input, Output, EventEmitter, forwardRef, OnInit, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { InputConfig, InputType, InputLabels } from './input.models';\r\n\r\n@Component({\r\n selector: 'lib-input',\r\n templateUrl: './input.component.html',\r\n styleUrls: ['./input.component.scss'],\r\n standalone: false,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => InputComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class InputComponent implements ControlValueAccessor, OnInit, OnChanges {\r\n @Input() config?: InputConfig;\r\n @Input() labels?: InputLabels;\r\n @Input() type: InputType = 'text';\r\n @Input() label: string = '';\r\n @Input() placeholder: string = '';\r\n @Input() disabled: boolean = false;\r\n @Input() required: boolean = false;\r\n @Input() readonly: boolean = false;\r\n @Input() clearable: boolean = true;\r\n @Input() maxLength?: number;\r\n @Input() minLength?: number;\r\n @Input() min?: number | string;\r\n @Input() max?: number | string;\r\n @Input() pattern?: string;\r\n @Input() errorMessage: string = '';\r\n @Input() helperText: string = '';\r\n @Input() rows: number = 3;\r\n @Input() prefixIcon?: any;\r\n @Input() suffixIcon?: any;\r\n @Input() value: any = '';\r\n\r\n // Style inputs\r\n @Input() width?: string;\r\n @Input() height?: string;\r\n @Input() borderRadius?: string;\r\n @Input() fontSize?: string;\r\n\r\n @Input() gap?: string;\r\n @Input() fontFamily?: string;\r\n @Input() labelColor?: string;\r\n @Input() labelFontSize?: string;\r\n @Input() labelFontWeight?: string;\r\n\r\n @Input() backgroundColor?: string;\r\n @Input() borderColor?: string;\r\n @Input() borderWidth?: string;\r\n @Input() padding?: string;\r\n @Input() fontWeight?: string;\r\n @Input() color?: string;\r\n @Input() placeholderColor?: string;\r\n @Input() focusBorderColor?: string;\r\n @Input() errorColor?: string;\r\n @Input() disabledBackgroundColor?: string;\r\n @Input() disabledColor?: string;\r\n @Input() boxShadow?: string;\r\n\r\n @Output() valueChange = new EventEmitter<any>();\r\n @Output() inputBlur = new EventEmitter<void>();\r\n @Output() inputFocus = new EventEmitter<void>();\r\n\r\n showPassword = false;\r\n focused = false;\r\n onChange: (value: any) => void = () => { };\r\n onTouched: () => void = () => { };\r\n\r\n ngOnInit(): void {\r\n this.updateFromConfig();\r\n this.updateFromLabels();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['config']) {\r\n this.updateFromConfig();\r\n }\r\n if (changes['labels']) {\r\n this.updateFromLabels();\r\n }\r\n }\r\n\r\n private updateFromConfig(): void {\r\n if (this.config) {\r\n this.type = this.config.type ?? this.type;\r\n this.label = this.config.label ?? this.label;\r\n this.placeholder = this.config.placeholder ?? this.placeholder;\r\n this.disabled = this.config.disabled ?? this.disabled;\r\n this.required = this.config.required ?? this.required;\r\n this.readonly = this.config.readonly ?? this.readonly;\r\n this.maxLength = this.config.maxLength ?? this.maxLength;\r\n this.minLength = this.config.minLength ?? this.minLength;\r\n this.min = this.config.min ?? this.min;\r\n this.max = this.config.max ?? this.max;\r\n this.pattern = this.config.pattern ?? this.pattern;\r\n this.errorMessage = this.config.errorMessage ?? this.errorMessage;\r\n this.helperText = this.config.helperText ?? this.helperText;\r\n this.rows = this.config.rows ?? this.rows;\r\n this.prefixIcon = this.config.prefixIcon ?? this.prefixIcon;\r\n this.suffixIcon = this.config.suffixIcon ?? this.suffixIcon;\r\n\r\n // Style inputs\r\n this.width = this.config.width ?? this.width;\r\n this.height = this.config.height ?? this.height;\r\n this.borderRadius = this.config.borderRadius ?? this.borderRadius;\r\n this.fontSize = this.config.fontSize ?? this.fontSize;\r\n this.gap = this.config.gap ?? this.gap;\r\n this.fontFamily = this.config.fontFamily ?? this.fontFamily;\r\n this.labelColor = this.config.labelColor ?? this.labelColor;\r\n this.labelFontSize = this.config.labelFontSize ?? this.labelFontSize;\r\n this.labelFontWeight = this.config.labelFontWeight ?? this.labelFontWeight;\r\n this.backgroundColor = this.config.backgroundColor ?? this.backgroundColor;\r\n this.borderColor = this.config.borderColor ?? this.borderColor;\r\n this.borderWidth = this.config.borderWidth ?? this.borderWidth;\r\n this.padding = this.config.padding ?? this.padding;\r\n this.fontWeight = this.config.fontWeight ?? this.fontWeight;\r\n this.color = this.config.color ?? this.color;\r\n this.placeholderColor = this.config.placeholderColor ?? this.placeholderColor;\r\n this.focusBorderColor = this.config.focusBorderColor ?? this.focusBorderColor;\r\n this.errorColor = this.config.errorColor ?? this.errorColor;\r\n this.disabledBackgroundColor = this.config.disabledBackgroundColor ?? this.disabledBackgroundColor;\r\n this.disabledColor = this.config.disabledColor ?? this.disabledColor;\r\n this.boxShadow = this.config.boxShadow ?? this.boxShadow;\r\n\r\n if (this.config.value !== undefined) {\r\n this.value = this.config.value;\r\n }\r\n }\r\n }\r\n\r\n private updateFromLabels(): void {\r\n if (this.labels) {\r\n this.label = this.labels.label || this.label;\r\n this.placeholder = this.labels.placeholder || this.placeholder;\r\n this.errorMessage = this.labels.errorMessage || this.errorMessage;\r\n this.helperText = this.labels.helperText || this.helperText;\r\n }\r\n }\r\n\r\n get requiredMarker(): string {\r\n return this.labels?.requiredMarker || '*';\r\n }\r\n\r\n writeValue(value: any): void {\r\n this.value = value;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n onInputChange(event: any): void {\r\n const value = event.target.value;\r\n this.value = this.type === 'number' ? (value ? Number(value) : null) : value;\r\n this.onChange(this.value);\r\n this.valueChange.emit(this.value);\r\n }\r\n\r\n onBlur(): void {\r\n this.focused = false;\r\n this.onTouched();\r\n this.inputBlur.emit();\r\n }\r\n\r\n onFocus(): void {\r\n this.focused = true;\r\n this.inputFocus.emit();\r\n }\r\n\r\n togglePasswordVisibility(): void {\r\n this.showPassword = !this.showPassword;\r\n }\r\n\r\n getIconType(icon: any): 'material' | 'fontawesome' | 'img' | 'none' {\r\n if (!icon) return 'none';\r\n if (typeof icon === 'string') {\r\n if (icon.includes('/') || icon.includes('.') || icon.startsWith('http')) {\r\n return 'img';\r\n }\r\n return 'material';\r\n }\r\n return icon.type || 'material';\r\n }\r\n\r\n getIconValue(icon: any): string {\r\n if (typeof icon === 'string') return icon;\r\n return icon?.value || '';\r\n }\r\n\r\n get inputType(): string {\r\n if (this.type === 'password' && this.showPassword) {\r\n return 'text';\r\n }\r\n return this.type === 'textarea' ? 'text' : this.type;\r\n }\r\n\r\n private getStyleValue(value: string | undefined): string | undefined {\r\n return value ? `${value}` : undefined;\r\n }\r\n\r\n get wrapperStyles(): { [key: string]: string | undefined } {\r\n return {\r\n 'width': this.getStyleValue(this.width),\r\n '--cc-input-label-gap': this.getStyleValue(this.gap),\r\n '--cc-input-font-family': this.getStyleValue(this.fontFamily)\r\n };\r\n }\r\n\r\n get labelStyles(): { [key: string]: string | undefined } {\r\n return {\r\n '--cc-input-label-color': this.getStyleValue(this.labelColor),\r\n '--cc-input-label-font-size': this.getStyleValue(this.labelFontSize),\r\n '--cc-input-label-font-weight': this.getStyleValue(this.labelFontWeight)\r\n };\r\n }\r\n\r\n get fieldStyles(): { [key: string]: string | undefined } {\r\n return {\r\n '--cc-input-bg': this.getStyleValue(this.backgroundColor),\r\n '--cc-input-border-radius': this.getStyleValue(this.borderRadius),\r\n '--cc-input-border-color': this.getStyleValue(this.borderColor),\r\n '--cc-input-border-width': this.getStyleValue(this.borderWidth),\r\n '--cc-input-height': this.getStyleValue(this.height),\r\n '--cc-input-padding': this.getStyleValue(this.padding),\r\n '--cc-input-font-size': this.getStyleValue(this.fontSize),\r\n '--cc-input-font-weight': this.getStyleValue(this.fontWeight),\r\n '--cc-input-color': this.getStyleValue(this.color),\r\n '--cc-input-placeholder-color': this.getStyleValue(this.placeholderColor),\r\n '--cc-input-focus-border-color': this.getStyleValue(this.focusBorderColor),\r\n '--cc-input-error-color': this.getStyleValue(this.errorColor),\r\n '--cc-input-disabled-bg': this.getStyleValue(this.disabledBackgroundColor),\r\n '--cc-input-disabled-color': this.getStyleValue(this.disabledColor),\r\n 'box-shadow': this.getStyleValue(this.boxShadow)\r\n };\r\n }\r\n}\r\n\r\n","<div class=\"cc-input-container\" [ngStyle]=\"wrapperStyles\">\r\n <label *ngIf=\"label\" class=\"cc-input-label\" [ngStyle]=\"labelStyles\">\r\n {{ label }}\r\n <span *ngIf=\"required\" class=\"cc-required\">{{ requiredMarker }}</span>\r\n </label>\r\n\r\n <div class=\"cc-input-wrapper\" [class.focused]=\"focused\" [class.disabled]=\"disabled\" [class.error]=\"errorMessage\"\r\n [ngStyle]=\"fieldStyles\">\r\n\r\n <!-- Prefix Icon -->\r\n <span class=\"cc-input-prefix\" *ngIf=\"prefixIcon\">\r\n <span class=\"material-icons\" *ngIf=\"getIconType(prefixIcon) === 'material'\">{{ getIconValue(prefixIcon)\r\n }}</span>\r\n <i *ngIf=\"getIconType(prefixIcon) === 'fontawesome'\" [class]=\"getIconValue(prefixIcon)\"></i>\r\n <img *ngIf=\"getIconType(prefixIcon) === 'img'\" [src]=\"getIconValue(prefixIcon)\" class=\"cc-icon-img\"\r\n [attr.alt]=\"labels?.prefixAltText || 'prefix'\" />\r\n </span>\r\n\r\n <!-- Input -->\r\n <input *ngIf=\"type !== 'textarea'\" class=\"cc-input-element\" [type]=\"inputType\" [value]=\"value\"\r\n [placeholder]=\"placeholder\" [disabled]=\"disabled\" [required]=\"required\" [readonly]=\"readonly\"\r\n [maxLength]=\"maxLength || 524288\" [minLength]=\"minLength || 0\" [min]=\"min\" [max]=\"max\" [pattern]=\"pattern\"\r\n (input)=\"onInputChange($event)\" (blur)=\"onBlur()\" (focus)=\"onFocus()\" [attr.aria-invalid]=\"!!errorMessage\"\r\n [attr.aria-describedby]=\"helperText ? 'helper-text' : null\" />\r\n\r\n <!-- Textarea -->\r\n <textarea *ngIf=\"type === 'textarea'\" class=\"cc-input-element cc-textarea\" [value]=\"value\"\r\n [placeholder]=\"placeholder\" [disabled]=\"disabled\" [required]=\"required\" [readonly]=\"readonly\"\r\n [maxLength]=\"maxLength || 524288\" [minLength]=\"minLength || 0\" [rows]=\"rows\" (input)=\"onInputChange($event)\"\r\n (blur)=\"onBlur()\" (focus)=\"onFocus()\" [attr.aria-invalid]=\"!!errorMessage\"></textarea>\r\n\r\n <!-- Suffix Icon / Password Toggle -->\r\n <span class=\"cc-input-suffix\">\r\n <button *ngIf=\"type === 'password'\" type=\"button\" class=\"cc-icon-btn\" (click)=\"togglePasswordVisibility()\"\r\n [attr.aria-label]=\"labels?.passwordToggleAriaLabel\">\r\n <span class=\"material-icons\">{{ showPassword ? 'visibility_off' : 'visibility' }}</span>\r\n </button>\r\n\r\n <ng-container *ngIf=\"suffixIcon && type !== 'password'\">\r\n <span class=\"material-icons\" *ngIf=\"getIconType(suffixIcon) === 'material'\">{{ getIconValue(suffixIcon)\r\n }}</span>\r\n <i *ngIf=\"getIconType(suffixIcon) === 'fontawesome'\" [class]=\"getIconValue(suffixIcon)\"></i>\r\n <img *ngIf=\"getIconType(suffixIcon) === 'img'\" [src]=\"getIconValue(suffixIcon)\" class=\"cc-icon-img\"\r\n [attr.alt]=\"labels?.suffixAltText || 'suffix'\" />\r\n </ng-container>\r\n </span>\r\n </div>\r\n\r\n <div class=\"cc-helper-text\" *ngIf=\"helperText\" id=\"helper-text\">{{ helperText }}</div>\r\n <div class=\"cc-error-message\" *ngIf=\"errorMessage\">{{ errorMessage }}</div>\r\n</div>","import { Directive, ElementRef, Output, EventEmitter, HostListener } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[libClickOutside]',\r\n standalone: false\r\n})\r\nexport class ClickOutsideDirective {\r\n @Output() libClickOutside = new EventEmitter<void>();\r\n\r\n constructor(private elementRef: ElementRef) { }\r\n\r\n @HostListener('document:click', ['$event.target'])\r\n public onClick(target: any): void {\r\n const clickedInside = this.elementRef.nativeElement.contains(target);\r\n if (!clickedInside) {\r\n this.libClickOutside.emit();\r\n }\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, forwardRef, OnInit, OnChanges, SimpleChanges, HostListener, ViewChild, ElementRef } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';\r\nimport { DropdownOption, DropdownConfig, DropdownLabels } from './dropdown.models';\r\n\r\n@Component({\r\n selector: 'lib-dropdown',\r\n templateUrl: './dropdown.component.html',\r\n styleUrls: ['./dropdown.component.scss'],\r\n standalone: false,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DropdownComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class DropdownComponent implements ControlValueAccessor, OnInit, OnChanges {\r\n @Input() config?: DropdownConfig;\r\n @Input() labels?: DropdownLabels;\r\n @Input() options: DropdownOption[] = [];\r\n @Input() placeholder: string = '';\r\n @Input() label: string = '';\r\n @Input() multiple: boolean = false;\r\n @Input() searchable: boolean = false;\r\n @Input() clearable: boolean = false;\r\n @Input() disabled: boolean = false;\r\n @Input() required: boolean = false;\r\n @Input() errorMessage: string = '';\r\n\r\n // Configurable styles\r\n @Input() width?: string;\r\n @Input() height?: string;\r\n @Input() borderRadius?: string;\r\n @Input() fontSize?: string;\r\n\r\n // Additional style inputs inferred from template/getters\r\n @Input() gap?: string;\r\n @Input() fontFamily?: string;\r\n @Input() labelColor?: string;\r\n @Input() labelFontSize?: string;\r\n @Input() labelFontWeight?: string;\r\n\r\n @Input() backgroundColor?: string;\r\n @Input() borderColor?: string;\r\n @Input() borderWidth?: string;\r\n @Input() padding?: string;\r\n @Input() fontWeight?: string;\r\n @Input() color?: string;\r\n @Input() placeholderColor?: string;\r\n @Input() focusBorderColor?: string;\r\n @Input() errorColor?: string;\r\n @Input() disabledBackgroundColor?: string;\r\n @Input() disabledColor?: string;\r\n @Input() boxShadow?: string;\r\n\r\n @Output() selectionChange = new EventEmitter<any>();\r\n\r\n @ViewChild(CdkVirtualScrollViewport) viewport?: CdkVirtualScrollViewport;\r\n @ViewChild('searchInput') searchInput?: ElementRef;\r\n\r\n filteredOptions: DropdownOption[] = [];\r\n searchTerm: string = '';\r\n value: any = null;\r\n isOpen = false;\r\n focusedIndex = -1;\r\n\r\n onChange: (value: any) => void = () => { };\r\n onTouched: () => void = () => { };\r\n\r\n ngOnInit(): void {\r\n this.updateFromConfig();\r\n this.updateFromLabels();\r\n this.filteredOptions = [...this.options];\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['config']) {\r\n this.updateFromConfig();\r\n }\r\n if (changes['labels']) {\r\n this.updateFromLabels();\r\n }\r\n if (changes['config'] || changes['options']) {\r\n this.filteredOptions = [...this.options];\r\n }\r\n }\r\n\r\n private updateFromConfig(): void {\r\n if (this.config) {\r\n this.options = this.config.options || this.options;\r\n this.placeholder = this.config.placeholder ?? this.placeholder;\r\n this.label = this.config.label ?? this.label;\r\n this.multiple = this.config.multiple ?? this.multiple;\r\n this.searchable = this.config.searchable ?? this.searchable;\r\n this.clearable = this.config.clearable ?? this.clearable;\r\n this.disabled = this.config.disabled ?? this.disabled;\r\n this.required = this.config.required ?? this.required;\r\n this.errorMessage = this.config.errorMessage ?? this.errorMessage;\r\n this.width = this.config.width ?? this.width;\r\n this.height = this.config.height ?? this.height;\r\n this.borderRadius = this.config.borderRadius ?? this.borderRadius;\r\n this.fontSize = this.config.fontSize ?? this.fontSize;\r\n this.gap = this.config.gap ?? this.gap;\r\n this.fontFamily = this.config.fontFamily ?? this.fontFamily;\r\n this.labelColor = this.config.labelColor ?? this.labelColor;\r\n this.labelFontSize = this.config.labelFontSize ?? this.labelFontSize;\r\n this.labelFontWeight = this.config.labelFontWeight ?? this.labelFontWeight;\r\n this.backgroundColor = this.config.backgroundColor ?? this.backgroundColor;\r\n this.borderColor = this.config.borderColor ?? this.borderColor;\r\n this.borderWidth = this.config.borderWidth ?? this.borderWidth;\r\n this.padding = this.config.padding ?? this.padding;\r\n this.fontWeight = this.config.fontWeight ?? this.fontWeight;\r\n this.color = this.config.color ?? this.color;\r\n this.placeholderColor = this.config.placeholderColor ?? this.placeholderColor;\r\n this.focusBorderColor = this.config.focusBorderColor ?? this.focusBorderColor;\r\n this.errorColor = this.config.errorColor ?? this.errorColor;\r\n this.disabledBackgroundColor = this.config.disabledBackgroundColor ?? this.disabledBackgroundColor;\r\n this.disabledColor = this.config.disabledColor ?? this.disabledColor;\r\n this.boxShadow = this.config.boxShadow ?? this.boxShadow;\r\n }\r\n }\r\n\r\n private updateFromLabels(): void {\r\n if (this.labels) {\r\n this.label = this.labels.label || this.label;\r\n this.placeholder = this.labels.placeholder || this.placeholder;\r\n this.errorMessage = this.labels.errorMessage || this.errorMessage;\r\n }\r\n }\r\n\r\n get requiredMarker(): string {\r\n return this.labels?.requiredMarker || '*';\r\n }\r\n\r\n get searchPlaceholder(): string {\r\n return this.labels?.searchPlaceholder || 'Search...';\r\n }\r\n\r\n get selectedSuffix(): string {\r\n return this.labels?.selectedSuffix || 'selected';\r\n }\r\n\r\n get clearAriaLabel(): string {\r\n return this.labels?.clearAriaLabel || 'Clear selection';\r\n }\r\n\r\n writeValue(value: any): void {\r\n this.value = value;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n toggle(): void {\r\n if (this.disabled) return;\r\n this.isOpen = !this.isOpen;\r\n if (this.isOpen) {\r\n this.focusedIndex = -1;\r\n setTimeout(() => {\r\n if (this.searchable && this.searchInput) {\r\n this.searchInput.nativeElement.focus();\r\n } else if (this.viewport) {\r\n this.viewport.elementRef.nativeElement.focus();\r\n }\r\n });\r\n } else {\r\n this.onTouched();\r\n }\r\n }\r\n\r\n close(): void {\r\n if (this.isOpen) {\r\n this.isOpen = false;\r\n this.onTouched();\r\n }\r\n }\r\n\r\n selectOption(option: DropdownOption): void {\r\n if (option.disabled) return;\r\n\r\n if (this.multiple) {\r\n const currentValues = Array.isArray(this.value) ? [...this.value] : [];\r\n const index = currentValues.indexOf(option.value);\r\n if (index > -1) {\r\n currentValues.splice(index, 1);\r\n } else {\r\n currentValues.push(option.value);\r\n }\r\n this.value = currentValues;\r\n } else {\r\n this.value = option.value;\r\n this.close();\r\n }\r\n\r\n this.onChange(this.value);\r\n this.selectionChange.emit(this.value);\r\n }\r\n\r\n isSelected(option: DropdownOption): boolean {\r\n if (this.multiple) {\r\n return Array.isArray(this.value) && this.value.includes(option.value);\r\n }\r\n return this.value === option.value;\r\n }\r\n\r\n onSearch(term: string): void {\r\n this.searchTerm = term;\r\n if (!term) {\r\n this.filteredOptions = [...this.options];\r\n } else {\r\n this.filteredOptions = this.options.filter(option =>\r\n option.label.toLowerCase().includes(term.toLowerCase())\r\n );\r\n }\r\n this.focusedIndex = -1;\r\n }\r\n\r\n clearSelection(event?: Event): void {\r\n if (event) {\r\n event.stopPropagation();\r\n }\r\n this.value = this.multiple ? [] : null;\r\n this.onChange(this.value);\r\n this.selectionChange.emit(this.value);\r\n }\r\n\r\n getIconType(icon: any): 'material' | 'fontawesome' | 'img' | 'none' {\r\n if (!icon) return 'none';\r\n if (typeof icon === 'string') {\r\n if (icon.includes('/') || icon.includes('.') || icon.startsWith('http')) {\r\n return 'img';\r\n }\r\n return 'material';\r\n }\r\n return icon.type || 'material';\r\n }\r\n\r\n getIconValue(icon: any): string {\r\n if (typeof icon === 'string') return icon;\r\n return icon?.value || '';\r\n }\r\n\r\n getSelectedLabel(): string {\r\n if (this.multiple) {\r\n const count = Array.isArray(this.value) ? this.value.length : 0;\r\n return count > 0 ? `${count} ${this.selectedSuffix}` : '';\r\n }\r\n\r\n if (!this.value) return '';\r\n const selected = this.options.find(opt => opt.value === this.value);\r\n return selected?.label || '';\r\n }\r\n\r\n hasValue(): boolean {\r\n if (this.multiple) {\r\n return Array.isArray(this.value) && this.value.length > 0;\r\n }\r\n return this.value !== null && this.value !== undefined && this.value !== '';\r\n }\r\n\r\n @HostListener('keydown', ['$event'])\r\n handleKeyboardEvent(event: KeyboardEvent): void {\r\n if (this.disabled) return;\r\n\r\n if (event.key === 'Escape') {\r\n this.close();\r\n return;\r\n }\r\n\r\n if (!this.isOpen && (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown')) {\r\n this.toggle();\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n if (!this.isOpen) return;\r\n\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n this.focusedIndex = Math.min(this.focusedIndex + 1, this.filteredOptions.length - 1);\r\n this.scrollToIndex(this.focusedIndex);\r\n event.preventDefault();\r\n break;\r\n case 'ArrowUp':\r\n this.focusedIndex = Math.max(this.focusedIndex - 1, 0);\r\n this.scrollToIndex(this.focusedIndex);\r\n event.preventDefault();\r\n break;\r\n case 'Enter':\r\n if (this.focusedIndex > -1) {\r\n this.selectOption(this.filteredOptions[this.focusedIndex]);\r\n }\r\n event.preventDefault();\r\n break;\r\n }\r\n }\r\n\r\n scrollToIndex(index: number): void {\r\n if (this.viewport) {\r\n this.viewport.scrollToIndex(index);\r\n }\r\n }\r\n\r\n private getStyleValue(value: string | undefined): string | undefined {\r\n return value ? `${value}` : undefined;\r\n }\r\n\r\n get wrapperStyles(): { [key: string]: string | undefined } {\r\n return {\r\n 'width': this.getStyleValue(this.width),\r\n '--cc-dropdown-label-gap': this.getStyleValue(this.gap),\r\n '--cc-dropdown-font-family': this.getStyleValue(this.fontFamily)\r\n };\r\n }\r\n\r\n get labelStyles(): { [key: string]: string | undefined } {\r\n return {\r\n '--cc-dropdown-label-color': this.getStyleValue(this.labelColor),\r\n '--cc-dropdown-font-size': this.getStyleValue(this.labelFontSize),\r\n '--cc-dropdown-font-weight': this.getStyleValue(this.labelFontWeight)\r\n };\r\n }\r\n\r\n get fieldStyles(): { [key: string]: string | undefined } {\r\n return {\r\n '--cc-dropdown-bg': this.getStyleValue(this.backgroundColor),\r\n '--cc-dropdown-border-radius': this.getStyleValue(this.borderRadius),\r\n '--cc-dropdown-border-color': this.getStyleValue(this.borderColor),\r\n '--cc-dropdown-border-width': this.getStyleValue(this.borderWidth),\r\n '--cc-dropdown-height': this.getStyleValue(this.height),\r\n '--cc-dropdown-padding': this.getStyleValue(this.padding),\r\n '--cc-dropdown-font-size': this.getStyleValue(this.fontSize),\r\n '--cc-dropdown-font-weight': this.getStyleValue(this.fontWeight),\r\n '--cc-dropdown-color': this.getStyleValue(this.color),\r\n '--cc-dropdown-placeholder-color': this.getStyleValue(this.placeholderColor),\r\n '--cc-dropdown-focus-border-color': this.getStyleValue(this.focusBorderColor),\r\n '--cc-dropdown-error-color': this.getStyleValue(this.errorColor),\r\n '--cc-dropdown-disabled-bg': this.getStyleValue(this.disabledBackgroundColor),\r\n '--cc-dropdown-disabled-color': this.getStyleValue(this.disabledColor),\r\n 'box-shadow': this.getStyleValue(this.boxShadow)\r\n };\r\n }\r\n}\r\n","<div class=\"cc-dropdown-wrapper\" [ngStyle]=\"wrapperStyles\" libClickOutside (libClickOutside)=\"close()\">\r\n <!-- Label -->\r\n <label *ngIf=\"label\" class=\"cc-dropdown-label\" [ngStyle]=\"labelStyles\">\r\n {{ label }}\r\n <span *ngIf=\"required\" class=\"cc-required\">{{ requiredMarker }}</span>\r\n </label>\r\n\r\n <!-- Trigger -->\r\n <div class=\"cc-dropdown-trigger\" [class.disabled]=\"disabled\" [class.open]=\"isOpen\" [class.error]=\"errorMessage\"\r\n (click)=\"toggle()\" tabindex=\"0\" (keydown)=\"handleKeyboardEvent($event)\" [ngStyle]=\"fieldStyles\">\r\n\r\n <div class=\"cc-selected-value\" *ngIf=\"hasValue()\">\r\n {{ multiple ? value.length + ' ' + selectedSuffix : getSelectedLabel() }}\r\n </div>\r\n <div class=\"cc-placeholder\" *ngIf=\"!hasValue()\">{{ placeholder }}</div>\r\n\r\n <div class=\"cc-actions\">\r\n <span *ngIf=\"clearable && hasValue() && !disabled\" class=\"cc-clear-btn\" (click)=\"clearSelection($event)\"\r\n [attr.aria-label]=\"clearAriaLabel\">\r\n <span class=\"material-icons\">close</span>\r\n </span>\r\n <span class=\"cc-arrow material-icons\">expand_more</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Dropdown Menu -->\r\n <div class=\"cc-dropdown-menu\" *ngIf=\"isOpen\">\r\n <!-- Search -->\r\n <div class=\"cc-search-container\" *ngIf=\"searchable\">\r\n <input type=\"text\" #searchInput [placeholder]=\"searchPlaceholder\"\r\n (input)=\"onSearch($any($event.target).value)\" (click)=\"$event.stopPropagation()\"\r\n class=\"cc-dropdown-search-input\" />\r\n </div>\r\n\r\n <!-- Options Virtual Scroll -->\r\n <cdk-virtual-scroll-viewport itemSize=\"40\" class=\"cc-virtual-scroll\"\r\n [style.height.px]=\"filteredOptions.length * 40 > 240 ? 240 : (filteredOptions.length * 40 || 40)\">\r\n\r\n <div *cdkVirtualFor=\"let option of filteredOptions; let i = index\" class=\"cc-option\"\r\n [class.selected]=\"isSelected(option)\" [class.focused]=\"i === focusedIndex\"\r\n [class.disabled]=\"option.disabled\" (click)=\"selectOption(option)\">\r\n\r\n <!-- Multi-select checkbox visual -->\r\n <span class=\"cc-multi-check\" *ngIf=\"multiple\">\r\n <span class=\"material-icons\" *ngIf=\"isSelected(option)\">check_box</span>\r\n <span class=\"material-icons\" *ngIf=\"!isSelected(option)\">check_box_outline_blank</span>\r\n </span>\r\n\r\n <!-- Icon -->\r\n <span class=\"cc-option-icon-wrapper\" *ngIf=\"option.icon\">\r\n <span class=\"material-icons\" *ngIf=\"getIconType(option.icon) === 'material'\">{{\r\n getIconValue(option.icon) }}</span>\r\n <i *ngIf=\"getIconType(option.icon) === 'fontawesome'\" [class]=\"getIconValue(option.icon)\"></i>\r\n <img *ngIf=\"getIconType(option.icon) === 'img'\" [src]=\"getIconValue(option.icon)\"\r\n class=\"cc-option-img\" alt=\"icon\" />\r\n </span>\r\n\r\n <span class=\"cc-option-label\">{{ option.label }}</span>\r\n\r\n <!-- Single-select check visual -->\r\n <span class=\"cc-single-check\" *ngIf=\"!multiple && isSelected(option)\">\r\n <span class=\"material-icons\">check</span>\r\n </span>\r\n </div>\r\n\r\n <div *ngIf=\"filteredOptions.length === 0\" class=\"cc-no-results\">{{ labels?.noResultsFound || 'No results\r\n found' }}</div>\r\n </cdk-virtual-scroll-viewport>\r\n </div>\r\n\r\n <!-- Error Message -->\r\n <div class=\"cc-error-message\" *ngIf=\"errorMessage\">{{ errorMessage }}</div>\r\n</div>","import { Component, Input, Output, EventEmitter, forwardRef, OnInit, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { CheckboxConfig, CheckboxOption, CheckboxLabels } from './checkbox.models';\r\n\r\n@Component({\r\n selector: 'lib-checkbox',\r\n templateUrl: './checkbox.component.html',\r\n styleUrls: ['./checkbox.component.scss'],\r\n standalone: false,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => CheckboxComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class CheckboxComponent implements ControlValueAccessor, OnInit, OnChanges {\r\n @Input() config: CheckboxConfig = {};\r\n @Input() labels?: CheckboxLabels;\r\n @Input() label: string = '';\r\n @Input() checked: boolean = false;\r\n @Input() disabled: boolean = false;\r\n @Input() required: boolean = false;\r\n @Input() indeterminate: boolean = false;\r\n @Input() options: CheckboxOption[] = [];\r\n @Input() labelPosition: 'before' | 'after' = 'after';\r\n @Input() color: string = '#007bff';\r\n @Input() borderRadius: string = '4px';\r\n @Input() value: any = null;\r\n @Input() errorMessage: string = '';\r\n\r\n // Style inputs\r\n @Input() width?: string;\r\n @Input() height?: string;\r\n @Input() fontSize?: string;\r\n @Input() fontWeight?: string;\r\n @Input() labelColor?: string;\r\n @Input() labelFontSize?: string;\r\n @Input() labelFontWeight?: string;\r\n @Input() gap?: string;\r\n @Input() fontFamily?: string;\r\n @Input() backgroundColor?: string;\r\n @Input() borderColor?: string;\r\n @Input() borderWidth?: string;\r\n @Input() padding?: string;\r\n @Input() placeholderColor?: string;\r\n @Input() focusBorderColor?: string;\r\n @Input() errorColor?: string;\r\n @Input() disabledBackgroundColor?: string;\r\n @Input() disabledColor?: string;\r\n @Input() boxShadow?: string;\r\n\r\n @Input() size?: string;\r\n @Input() checkedColor?: string;\r\n @Input() uncheckedColor?: string;\r\n @Input() groupLabelColor?: string;\r\n @Input() groupLabelFontSize?: string;\r\n @Input() groupLabelFontWeight?: string;\r\n\r\n @Output() checkedChange = new EventEmitter<any>();\r\n\r\n onChange: (value: any) => void = () => { };\r\n onTouched: () => void = () => { };\r\n\r\n ngOnInit(): void {\r\n this.updateFromConfig();\r\n this.updateFromLabels();\r\n\r\n if (this.isGroup) {\r\n this.value = this.options\r\n .filter(opt => opt.checked)\r\n .map(opt => opt.value);\r\n } else {\r\n this.value = this.checked;\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['config']) {\r\n this.updateFromConfig();\r\n }\r\n if (changes['labels']) {\r\n this.updateFromLabels();\r\n }\r\n }\r\n\r\n private updateFromConfig(): void {\r\n if (this.config) {\r\n this.label = this.config.label ?? this.label;\r\n this.checked = this.config.checked ?? this.checked;\r\n this.disabled = this.config.disabled ?? this.disabled;\r\n this.required = this.config.required ?? this.required;\r\n this.indeterminate = this.config.indeterminate ?? this.indeterminate;\r\n this.options = this.config.options || this.options;\r\n this.labelPosition = this.config.labelPosition ?? this.labelPosition;\r\n this.color = this.config.color ?? this.color;\r\n this.borderRadius = this.config.borderRadius ?? this.borderRadius;\r\n this.size = this.config.size ?? this.size;\r\n this.checkedColor = this.config.checkedColor ?? this.checkedColor;\r\n this.uncheckedColor = this.config.uncheckedColor ?? this.uncheckedColor;\r\n this.groupLabelColor = this.config.groupLabelColor ?? this.groupLabelColor;\r\n this.groupLabelFontSize = this.config.groupLabelFontSize ?? this.groupLabelFontSize;\r\n this.groupLabelFontWeight = this.config.groupLabelFontWeight ?? this.groupLabelFontWeight;\r\n this.labelFontSize = this.config.labelFontSize ?? this.labelFontSize;\r\n this.labelFontWeight = this.config.labelFontWeight ?? this.labelFontWeight;\r\n this.labelColor = this.config.labelColor ?? this.labelColor;\r\n this.gap = this.config.gap ?? this.gap;\r\n this.fontFamily = this.config.fontFamily ?? this.fontFamily;\r\n }\r\n }\r\n\r\n private updateFromLabels(): void {\r\n if (this.labels) {\r\n this.label = this.labels.label || this.label;\r\n }\r\n }\r\n\r\n get isGroup(): boolean {\r\n return this.options && this.options.length > 0;\r\n }\r\n\r\n get requiredMarker(): string {\r\n return this.labels?.requiredMarker || '*';\r\n }\r\n\r\n writeValue(value: any): void {\r\n if (this.isGroup) {\r\n this.value = Array.isArray(value) ? value : [];\r\n this.options.forEach(opt => {\r\n opt.checked = (this.value as any[]).includes(opt.value);\r\n });\r\n } else {\r\n this.value = !!value;\r\n this.checked = this.value as boolean;\r\n }\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n onCheckboxChange(event: any): void {\r\n const checked = event.target.checked;\r\n this.value = checked;\r\n this.checked = checked;\r\n this.onChange(this.value);\r\n this.onTouched();\r\n this.checkedChange.emit(this.value);\r\n }\r\n\r\n onGroupCheckboxChange(option: CheckboxOption, event: any): void {\r\n const checked = event.target.checked;\r\n option.checked = checked;\r\n\r\n const valueArray = this.value as any[];\r\n if (checked) {\r\n if (!valueArray.includes(option.value)) {\r\n this.value = [...valueArray, option.value];\r\n }\r\n } else {\r\n this.value = valueArray.filter(v => v !== option.value);\r\n }\r\n\r\n this.onChange(this.value);\r\n this.onTouched();\r\n this.checkedChange.emit(this.value);\r\n }\r\n\r\n private getStyleValue(value: string | undefined): string | undefined {\r\n return value ? `${value}` : undefined;\r\n }\r\n\r\n get wrapperStyles(): { [key: string]: string | undefined } {\r\n return {\r\n '--cc-checkbox-font-family': this.getStyleValue(this.fontFamily),\r\n '--cc-checkbox-font-size': this.getStyleValue(this.fontSize),\r\n '--cc-checkbox-font-weight': this.getStyleValue(this.fontWeight),\r\n '--cc-checkbox-label-color': this.getStyleValue(this.labelColor),\r\n '--cc-checkbox-size': this.getStyleValue(this.size),\r\n '--cc-checkbox-checked-color': this.getStyleValue(this.checkedColor),\r\n '--cc-checkbox-unchecked-color': this.getStyleValue(this.uncheckedColor),\r\n '--cc-checkbox-disabled-color': this.getStyleValue(this.disabledColor),\r\n '--cc-checkbox-error-color': this.getStyleValue(this.errorColor),\r\n '--cc-checkbox-group-gap': this.getStyleValue(this.gap),\r\n '--cc-checkbox-group-label-color': this.getStyleValue(this.groupLabelColor),\r\n '--cc-checkbox-group-label-font-size': this.getStyleValue(this.groupLabelFontSize),\r\n '--cc-checkbox-group-label-font-weight': this.getStyleValue(this.groupLabelFontWeight),\r\n '--cc-checkbox-label-font-size': this.getStyleValue(this.labelFontSize),\r\n '--cc-checkbox-label-font-weight': this.getStyleValue(this.labelFontWeight),\r\n '--cc-checkbox-border-radius': this.getStyleValue(this.borderRadius)\r\n };\r\n }\r\n}\r\n\r\n","<div class=\"cc-checkbox-wrapper\" [ngStyle]=\"wrapperStyles\">\r\n\r\n <!-- Single Checkbox -->\r\n <label *ngIf=\"!isGroup\" class=\"cc-checkbox-label\" [class.label-before]=\"labelPosition === 'before'\"\r\n [class.disabled]=\"disabled\" [class.checked]=\"checked\">\r\n <input type=\"checkbox\" class=\"cc-native-checkbox\" [checked]=\"checked\" [disabled]=\"disabled\"\r\n [required]=\"required\" [indeterminate]=\"indeterminate\" (change)=\"onCheckboxChange($event)\" />\r\n <span class=\"cc-checkmark\"></span>\r\n <span class=\"cc-text\" *ngIf=\"label\">{{ label }}</span>\r\n </label>\r\n\r\n <!-- Checkbox Group -->\r\n <div *ngIf=\"isGroup\" class=\"cc-checkbox-group\">\r\n <label *ngIf=\"label\" class=\"cc-checkbox-group-label\" [class.label-before]=\"labelPosition === 'before'\">\r\n {{ label }}\r\n <span *ngIf=\"required\" class=\"cc-required\">{{ requiredMarker }}</span>\r\n </label>\r\n\r\n <label *ngFor=\"let option of options\" class=\"cc-checkbox-label\" [class.disabled]=\"disabled || option.disabled\"\r\n [class.checked]=\"option.checked\">\r\n <input type=\"checkbox\" class=\"cc-native-checkbox\" [checked]=\"option.checked\"\r\n [disabled]=\"disabled || option.disabled\" (change)=\"onGroupCheckboxChange(option, $event)\" />\r\n <span class=\"cc-checkmark\"></span>\r\n <span class=\"cc-text\">{{ option.label }}</span>\r\n </label>\r\n </div>\r\n\r\n <div class=\"cc-error-message\" *ngIf=\"errorMessage\">{{ errorMessage }}</div>\r\n</div>","import { Component, Input, Output, EventEmitter, forwardRef, OnInit } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { RadioConfig, RadioOption, RadioLabels } from './radio.models';\r\n\r\n@Component({\r\n selector: 'lib-radio',\r\n templateUrl: './radio.component.html',\r\n styleUrls: ['./radio.component.scss'],\r\n standalone: false,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => RadioComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class RadioComponent implements ControlValueAccessor, OnInit {\r\n @Input() config?: RadioConfig;\r\n @Input() label: string = '';\r\n @Input() options: RadioOption[] = [];\r\n @Input() disabled: boolean = false;\r\n @Input() required: boolean = false;\r\n @Input() labelPosition: 'before' | 'after' = 'after';\r\n @Input() color: 'primary' | 'accent' | 'warn' = 'primary';\r\n @Input() layout: 'vertical' | 'horizontal' = 'vertical';\r\n\r\n // i18n Labels\r\n @Input() labels: RadioLabels = {};\r\n\r\n // Customization — Layout\r\n @Input() gap?: string;\r\n\r\n // Customization — Colors\r\n @Input() labelColor?: string;\r\n @Input() checkedColor?: string;\r\n @Input() uncheckedColor?: string;\r\n\r\n // Customization — Typography\r\n @Input() fontSize?: string;\r\n @Input() fontWeight?: string;\r\n @Input() fontFamily?: string;\r\n\r\n // Customization — Group label\r\n @Input() groupLabelColor?: string;\r\n @Input() groupLabelFontSize?: string;\r\n @Input() groupLabelFontWeight?: string;\r\n\r\n // Customization — States\r\n @Input() disabledColor?: string;\r\n @Input() errorColor?: string;\r\n\r\n // Customization — Size\r\n @Input() size?: string;\r\n @Input() borderRadius?: string;\r\n\r\n // Customization — Synonyms for Playground\r\n @Input() labelFontSize?: string;\r\n @Input() labelFontWeight?: string;\r\n\r\n @Output() selectionChange = new EventEmitter<any>();\r\n\r\n value: any;\r\n uuid = `radio-group-${Math.random().toString(36).substr(2, 9)}`;\r\n\r\n private onChange: (value: any) => void = () => { };\r\n private onTouched: () => void = () => { };\r\n\r\n ngOnInit(): void {\r\n this.updateFromConfig();\r\n // i18n labels override\r\n if (this.labels) {\r\n this.label = this.labels.label || this.label;\r\n }\r\n }\r\n\r\n ngOnChanges(changes: any): void {\r\n if (changes.config) {\r\n this.updateFromConfig();\r\n }\r\n }\r\n\r\n private updateFromConfig(): void {\r\n if (this.config) {\r\n this.label = this.config.label ?? this.label;\r\n this.options = this.config.options || this.options;\r\n this.disabled = this.config.disabled ?? this.disabled;\r\n this.required = this.config.required ?? this.required;\r\n this.labelPosition = this.config.labelPosition ?? this.labelPosition;\r\n this.color = this.config.color ?? this.color;\r\n this.layout = this.config.layout ?? this.layout;\r\n this.value = this.config.value;\r\n\r\n // Style mappings\r\n this.gap = this.config.gap ?? this.gap;\r\n this.labelColor = this.config.labelColor ?? this.labelColor;\r\n this.checkedColor = this.config.checkedColor ?? this.checkedColor;\r\n this.uncheckedColor = this.config.uncheckedColor ?? this.uncheckedColor;\r\n this.fontSize = this.config.fontSize ?? this.fontSize;\r\n this.fontWeight = this.config.fontWeight ?? this.fontWeight;\r\n this.fontFamily = this.config.fontFamily ?? this.fontFamily;\r\n this.groupLabelColor = this.config.groupLabelColor ?? this.groupLabelColor;\r\n this.groupLabelFontSize = this.config.groupLabelFontSize ?? this.groupLabelFontSize;\r\n this.groupLabelFontWeight = this.config.groupLabelFontWeight ?? this.groupLabelFontWeight;\r\n this.disabledColor = this.config.disabledColor ?? this.disabledColor;\r\n this.errorColor = this.config.errorColor ?? this.errorColor;\r\n this.size = this.config.size ?? this.size;\r\n this.borderRadius = this.config.borderRadius ?? this.borderRadius;\r\n this.labelFontSize = this.config.labelFontSize ?? this.labelFontSize;\r\n this.labelFontWeight = this.config.labelFontWeight ?? this.labelFontWeight;\r\n }\r\n }\r\n\r\n\r\n get requiredMarker(): string {\r\n return this.labels?.requiredMarker || '*';\r\n }\r\n\r\n writeValue(value: any): void {\r\n this.value = value;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n onRadioChange(event: any): void {\r\n this.value = event.target.value;\r\n this.onChange(this.value);\r\n this.onTouched();\r\n this.selectionChange.emit(this.value);\r\n }\r\n\r\n private getStyleValue(value: string | undefined): string | undefined {\r\n return value ? `${value}` : undefined;\r\n }\r\n\r\n get wrapperStyles(): { [key: string]: string | undefined } {\r\n return {\r\n '--cc-radio-font-family': this.getStyleValue(this.fontFamily),\r\n '--cc-radio-font-size': this.getStyleValue(this.fontSize || this.labelFontSize),\r\n '--cc-radio-font-weight': this.getStyleValue(this.fontWeight || this.labelFontWeight),\r\n '--cc-radio-label-color': this.getStyleValue(this.labelColor),\r\n '--cc-radio-size': this.getStyleValue(this.size),\r\n '--cc-radio-border-radius': this.getStyleValue(this.borderRadius),\r\n '--cc-radio-checked-color': this.getStyleValue(this.checkedColor),\r\n '--cc-radio-unchecked-color': this.getStyleValue(this.uncheckedColor),\r\n '--cc-radio-disabled-color': this.getStyleValue(this.disabledColor),\r\n '--cc-radio-error-color': this.getStyleValue(this.errorColor),\r\n '--cc-radio-group-gap': this.getStyleValue(this.gap),\r\n '--cc-radio-group-label-color': this.getStyleValue(this.groupLabelColor),\r\n '--cc-radio-group-label-font-size': this.getStyleValue(this.groupLabelFontSize),\r\n '--cc-radio-group-label-font-weight': this.getStyleValue(this.groupLabelFontWeight)\r\n };\r\n }\r\n}\r\n","<div class=\"cc-radio-wrapper\" [ngStyle]=\"wrapperStyles\">\r\n <label *ngIf=\"label\" class=\"cc-radio-group-label\" [class.disabled]=\"disabled\">\r\n {{ label }}\r\n <span *ngIf=\"required\" class=\"cc-required\">{{ requiredMarker }}</span>\r\n </label>\r\n\r\n <div class=\"cc-radio-group\" [class.horizontal]=\"layout === 'horizontal'\" [class.vertical]=\"layout === 'vertical'\"\r\n role=\"radiogroup\">\r\n\r\n <label class=\"cc-radio-label\" *ngFor=\"let option of options; let i = index\"\r\n [class.disabled]=\"disabled || option.disabled\" [class.checked]=\"value === option.value\"\r\n [class.label-before]=\"labelPosition === 'before'\">\r\n\r\n <input type=\"radio\" [name]=\"uuid\" [value]=\"option.value\" [checked]=\"value === option.value\"\r\n [disabled]=\"disabled || option.disabled\" (change)=\"onRadioChange($event)\" class=\"cc-native-radio\"\r\n [id]=\"uuid + '-' + i\">\r\n\r\n <span class=\"cc-radio-circle\"></span>\r\n <span class=\"cc-text\">{{ option.label }}</span>\r\n </label>\r\n </div>\r\n</div>","import { Component, Input, Output, EventEmitter, forwardRef, OnInit, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { ToggleConfig, ToggleLabels } from './toggle.models';\r\n\r\n@Component({\r\n selector: 'lib-toggle',\r\n templateUrl: './toggle.component.html',\r\n styleUrls: ['./toggle.component.scss'],\r\n standalone: false,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => ToggleComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class ToggleComponent implements ControlValueAccessor, OnInit, OnChanges {\r\n @Input() config?: ToggleConfig;\r\n @Input() labels?: ToggleLabels;\r\n @Input() label: string = '';\r\n @Input() checked: boolean = false;\r\n @Input() disabled: boolean = false;\r\n @Input() required: boolean = false;\r\n @Input() labelPosition: 'before' | 'after' = 'after';\r\n @Input() color: string = '#1A73E8';\r\n\r\n // Customization — Colors\r\n @Input() labelColor?: string;\r\n @Input() uncheckedColor?: string;\r\n @Input() checkedColor?: string;\r\n @Input() thumbColor?: string;\r\n @Input() checkedThumbColor?: string;\r\n\r\n // Customization — Typography\r\n @Input() fontSize?: string;\r\n @Input() fontWeight?: string;\r\n @Input() fontFamily?: string;\r\n\r\n // Customization — Size\r\n @Input() toggleWidth?: string;\r\n @Input() toggleHeight?: string;\r\n @Input() gap?: string;\r\n\r\n // Customization — Slider\r\n @Input() sliderColor?: string;\r\n\r\n // Customization — Label\r\n @Input() labelFontSize?: string;\r\n @Input() labelFontWeight?: string;\r\n\r\n // Customization — States\r\n @Input() disabledColor?: string;\r\n\r\n @Output() toggleChange = new EventEmitter<boolean>();\r\n\r\n value: boolean = false;\r\n\r\n private onChange: (value: any) => void = () => { };\r\n private onTouched: () => void = () => { };\r\n\r\n ngOnInit(): void {\r\n this.updateFromConfig();\r\n this.updateFromLabels();\r\n this.value = this.checked;\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['config']) {\r\n this.updateFromConfig();\r\n }\r\n if (changes['labels']) {\r\n this.updateFromLabels();\r\n }\r\n if (changes['checked']) {\r\n this.value = this.checked;\r\n }\r\n }\r\n\r\n private updateFromConfig(): void {\r\n if (this.config) {\r\n this.label = this.config.label ?? this.label;\r\n this.checked = this.config.checked ?? this.checked;\r\n this.disabled = this.config.disabled ?? this.disabled;\r\n this.required = this.config.required ?? this.required;\r\n this.labelPosition = this.config.labelPosition ?? this.labelPosition;\r\n this.color = this.config.color ?? this.color;\r\n this.uncheckedColor = this.config.uncheckedColor ?? this.uncheckedColor;\r\n this.checkedColor = this.config.checkedColor ?? this.checkedColor;\r\n this.thumbColor = this.config.thumbColor ?? this.thumbColor;\r\n this.checkedThumbColor = this.config.checkedThumbColor ?? this.checkedThumbColor;\r\n this.fontSize = this.config.fontSize ?? this.fontSize;\r\n this.fontWeight = this.config.fontWeight ?? this.fontWeight;\r\n this.toggleWidth = this.config.toggleWidth ?? this.toggleWidth;\r\n this.toggleHeight = this.config.toggleHeight ?? this.toggleHeight;\r\n this.gap = this.config.gap ?? this.gap;\r\n this.fontFamily = this.config.fontFamily ?? this.fontFamily;\r\n this.labelColor = this.config.labelColor ?? this.labelColor;\r\n this.labelFontSize = this.config.labelFontSize ?? this.labelFontSize;\r\n this.labelFontWeight = this.config.labelFontWeight ?? this.labelFontWeight;\r\n }\r\n }\r\n\r\n private updateFromLabels(): void {\r\n if (this.labels) {\r\n this.label = this.labels.label || this.label;\r\n }\r\n }\r\n\r\n writeValue(value: any): void {\r\n this.value = !!value;\r\n this.checked = this.value;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n onToggleChange(event: any): void {\r\n this.value = event.target.checked;\r\n this.checked = this.value;\r\n this.onChange(this.value);\r\n this.onTouched();\r\n this.toggleChange.emit(this.value);\r\n }\r\n\r\n private getStyleValue(value: string | undefined): string | undefined {\r\n return value ? `${value}` : undefined;\r\n }\r\n\r\n get wrapperStyles(): { [key: string]: string | undefined } {\r\n return {\r\n '--cc-toggle-font-family': this.getStyleValue(this.fontFamily),\r\n '--cc-toggle-font-size': this.getStyleValue(this.fontSize || this.labelFontSize),\r\n '--cc-toggle-font-weight': this.getStyleValue(this.fontWeight || this.labelFontWeight),\r\n '--cc-toggle-label-color': this.getStyleValue(this.labelColor),\r\n '--cc-toggle-width': this.getStyleValue(this.toggleWidth),\r\n '--cc-toggle-height': this.getStyleValue(this.toggleHeight),\r\n '--cc-toggle-gap': this.getStyleValue(this.gap),\r\n '--cc-toggle-unchecked-bg': this.getStyleValue(this.uncheckedColor),\r\n '--cc-toggle-checked-bg': this.getStyleValue(this.checkedColor || this.color),\r\n '--cc-toggle-thumb-color': this.getStyleValue(this.thumbColor || this.sliderColor),\r\n '--cc-toggle-checked-thumb-color': this.getStyleValue(this.checkedThumbColor),\r\n '--cc-toggle-disabled-color': this.getStyleValue(this.disabledColor)\r\n };\r\n }\r\n}\r\n","<div class=\"cc-toggle-wrapper\" [ngStyle]=\"wrapperStyles\">\r\n <label class=\"cc-toggle-label\" [class.label-before]=\"labelPosition === 'before'\" [class.disabled]=\"disabled\">\r\n\r\n <span class=\"cc-label-text\" *ngIf=\"label && labelPosition === 'before'\">{{ label }}</span>\r\n\r\n <span class=\"cc-toggle-switch\">\r\n <input type=\"checkbox\" class=\"cc-native-toggle\" [checked]=\"checked\" [disabled]=\"disabled\"\r\n (change)=\"onToggleChange($event)\" />\r\n <span class=\"cc-toggle-track\"></span>\r\n <span class=\"cc-toggle-thumb\"></span>\r\n </span>\r\n\r\n <span class=\"cc-label-text\" *ngIf=\"label && labelPosition === 'after'\">{{ label }}</span>\r\n </label>\r\n</div>","import { Component, Input, Output, EventEmitter, forwardRef, OnInit, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { DatePickerConfig, DatepickerLabels } from './datepicker.models';\r\n\r\n@Component({\r\n selector: 'lib-datepicker',\r\n templateUrl: './datepicker.component.html',\r\n styleUrls: ['./datepicker.component.scss'],\r\n standalone: false,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DatepickerComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class DatepickerComponent implements ControlValueAccessor, OnInit, OnChanges {\r\n @Input() config?: DatePickerConfig;\r\n @Input() labels?: DatepickerLabels;\r\n @Input() label: string = '';\r\n @Input() placeholder: string = '';\r\n @Input() disabled: boolean = false;\r\n @Input() required: boolean = false;\r\n @Input() minDate?: string | Date; // Support string for native input\r\n @Input() maxDate?: string | Date; // Support string for native input\r\n @Input() isRange: boolean = false;\r\n @Input() startView: 'month' | 'year' | 'multi-year' = 'month';\r\n @Input() value: any = null;\r\n @Input() startDate?: string | Date;\r\n @Input() endDate?: string | Date;\r\n @Input() errorMessage: string = '';\r\n\r\n // Style inputs\r\n @Input() width?: string;\r\n @Input() height?: string;\r\n @Input() borderRadius?: string;\r\n @Input() fontSize?: string;\r\n\r\n @Input() gap?: string;\r\n @Input() fontFamily?: string;\r\n @Input() labelColor?: string;\r\n @Input() labelFontSize?: string;\r\n @Input() labelFontWeight?: string;\r\n\r\n @Input() backgroundColor?: string;\r\n @Input() borderColor?: string;\r\n @Input() borderWidth?: string;\r\n @Input() padding?: string;\r\n @Input() fontWeight?: string;\r\n @Input() color?: string;\r\n @Input() placeholderColor?: string;\r\n @Input() focusBorderColor?: string;\r\n @Input() errorColor?: string;\r\n @Input() disabledBackgroundColor?: string;\r\n @Input() disabledColor?: string;\r\n @Input() boxShadow?: string;\r\n\r\n @Output() dateChange = new EventEmitter<any>();\r\n\r\n onChange: (value: any) => void = () => { };\r\n onTouched: () => void = () => { };\r\n\r\n focused = false;\r\n\r\n ngOnInit(): void {\r\n this.updateFromConfig();\r\n this.updateFromLabels();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['config']) {\r\n this.updateFromConfig();\r\n }\r\n if (changes['labels']) {\r\n this.updateFromLabels();\r\n }\r\n }\r\n\r\n private updateFromConfig(): void {\r\n if (this.config) {\r\n this.label = this.config.label ?? this.label;\r\n this.placeholder = this.config.placeholder ?? this.placeholder;\r\n this.disabled = this.config.disabled ?? this.disabled;\r\n this.required = this.config.required ?? this.required;\r\n this.minDate = this.config.minDate ?? this.minDate;\r\n this.maxDate = this.config.maxDate ?? this.maxDate;\r\n this.isRange = this.config.isRange ?? this.isRange;\r\n this.width = this.config.width ?? this.width;\r\n this.borderRadius = this.config.borderRadius ?? this.borderRadius;\r\n this.fontSize = this.config.fontSize ?? this.fontSize;\r\n this.errorMessage = this.config.errorMessage ?? this.errorMessage;\r\n this.gap = this.config.gap ?? this.gap;\r\n this.fontFamily = this.config.fontFamily ?? this.fontFamily;\r\n this.labelColor = this.config.labelColor ?? this.labelColor;\r\n this.labelFontSize = this.config.labelFontSize ?? this.labelFontSize;\r\n this.labelFontWeight = this.config.labelFontWeight ?? this.labelFontWeight;\r\n this.backgroundColor = this.config.backgroundColor ?? this.backgroundColor;\r\n this.borderColor = this.config.borderColor ?? this.borderColor;\r\n this.borderWidth = this.config.borderWidth ?? this.borderWidth;\r\n this.padding = this.config.padding ?? this.padding;\r\n this.fontWeight = this.config.fontWeight ?? this.fontWeight;\r\n this.color = this.config.color ?? this.color;\r\n this.placeholderColor = this.config.placeholderColor ?? this.placeholderColor;\r\n this.focusBorderColor = this.config.focusBorderColor ?? this.focusBorderColor;\r\n this.errorColor = this.config.errorColor ?? this.errorColor;\r\n this.disabledBackgroundColor = this.config.disabledBackgroundColor ?? this.disabledBackgroundColor;\r\n this.disabledColor = this.config.disabledColor ?? this.disabledColor;\r\n this.boxShadow = this.config.boxShadow ?? this.boxShadow;\r\n this.height = this.config.height ?? this.height;\r\n\r\n if (this.config.value !== undefined) {\r\n this.value = this.config.value;\r\n }\r\n if (this.config.startDate) {\r\n this.startDate = this.config.startDate;\r\n }\r\n if (this.config.endDate) {\r\n this.endDate = this.config.endDate;\r\n }\r\n }\r\n }\r\n\r\n private updateFromLabels(): void {\r\n if (this.labels) {\r\n this.label = this.labels.label || this.label;\r\n this.placeholder = this.labels.placeholder || this.placeholder;\r\n }\r\n }\r\n\r\n get requiredMarker(): string {\r\n return this.labels?.requiredMarker || '*';\r\n }\r\n\r\n get startDateLabel(): string {\r\n return this.labels?.startDateLabel || 'Start Date';\r\n }\r\n\r\n get endDateLabel(): string {\r\n return this.labels?.endDateLabel || 'End Date';\r\n }\r\n\r\n // Helper to format Date or string to YYYY-MM-DD for native input\r\n private formatDate(date: Date | string | undefined | null): string {\r\n if (!date) return '';\r\n if (typeof date === 'string') return date; // Assume already formatted or ISO\r\n try {\r\n return date.toISOString().split('T')[0];\r\n } catch (e) {\r\n return '';\r\n }\r\n }\r\n\r\n get formattedValue(): string {\r\n return this.formatDate(this.value);\r\n }\r\n\r\n get formattedStartDate(): string {\r\n return this.formatDate(this.startDate);\r\n }\r\n\r\n get formattedEndDate(): string {\r\n return this.formatDate(this.endDate);\r\n }\r\n\r\n get formattedMin(): string {\r\n return this.formatDate(this.minDate);\r\n }\r\n\r\n get formattedMax(): string {\r\n return this.formatDate(this.maxDate);\r\n }\r\n\r\n\r\n writeValue(value: any): void {\r\n if (this.isRange && value && typeof value === 'object' && 'start' in value) {\r\n this.startDate = value.start;\r\n this.endDate = value.end;\r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n onDateInput(event: any): void {\r\n const value = event.target.value;\r\n this.value = value; // Keep as string or convert if needed\r\n this.onChange(this.value);\r\n this.dateChange.emit(this.value);\r\n }\r\n\r\n onBlur(): void {\r\n this.focused = false;\r\n this.onTouched();\r\n }\r\n\r\n onFocus(): void {\r\n this.focused = true;\r\n }\r\n\r\n onRangeStartInput(event: any): void {\r\n this.startDate = event.target.value;\r\n this.updateRangeValue();\r\n }\r\n\r\n onRangeEndInput(event: any): void {\r\n this.endDate = event.target.value;\r\n this.updateRangeValue();\r\n }\r\n\r\n private updateRangeValue(): void {\r\n const rangeValue = { start: this.startDate, end: this.endDate };\r\n this.onChange(rangeValue);\r\n this.dateChange.emit(rangeValue);\r\n }\r\n\r\n private getStyleValue(value: string | undefined): string | undefined {\r\n return value ? `${value}` : undefined;\r\n }\r\n\r\n get wrapperStyles(): { [key: string]: string | undefined } {\r\n return {\r\n 'width': this.getStyleValue(this.width),\r\n '--cc-datepicker-label-gap': this.getStyleValue(this.gap),\r\n '--cc-datepicker-font-family': this.getStyleValue(this.fontFamily)\r\n };\r\n }\r\n\r\n get labelStyles(): { [key: string]: string | undefined } {\r\n return {\r\n '--cc-datepicker-label-color': this.getStyleValue(this.labelColor),\r\n '--cc-datepicker-label-font-size': this.getStyleValue(this.labelFontSize),\r\n '--cc-datepicker-label-font-weight': this.getStyleValue(this.labelFontWeight)\r\n };\r\n }\r\n\r\n get fieldStyles(): { [key: string]: string | undefined } {\r\n return {\r\n '--cc-datepicker-bg': this.getStyleValue(this.backgroundColor),\r\n '--cc-datepicker-border-radius': this.getStyleValue(this.borderRadius),\r\n '--cc-datepicker-border-color': this.getStyleValue(this.borderColor),\r\n '--cc-datepicker-border-width': this.getStyleValue(this.borderWidth),\r\n '--cc-datepicker-height': this.getStyleValue(this.height),\r\n '--cc-datepicker-padding': this.getStyleValue(this.padding),\r\n '--cc-datepicker-font-size': this.getStyleValue(this.fontSize),\r\n '--cc-datepicker-font-weight': this.getStyleValue(this.fontWeight),\r\n '--cc-datepicker-color': this.getStyleValue(this.color),\r\n '--cc-datepicker-placeholder-color': this.getStyleValue(this.placeholderColor),\r\n '--cc-datepicker-focus-border-color': this.getStyleValue(this.focusBorderColor),\r\n '--cc-datepicker-error-color': this.getStyleValue(this.errorColor),\r\n '--cc-datepicker-disabled-bg': this.getStyleValue(this.disabledBackgroundColor),\r\n '--cc-datepicker-disabled-color': this.getStyleValue(this.disabledColor),\r\n 'box-shadow': this.getStyleValue(this.boxShadow)\r\n };\r\n }\r\n}\r\n","<div class=\"cc-datepicker-wrapper\" [ngStyle]=\"wrapperStyles\">\r\n <label *ngIf=\"label\" class=\"cc-datepicker-label\" [ngStyle]=\"labelStyles\">\r\n {{ label }}\r\n <span *ngIf=\"required\" class=\"cc-required\">{{ requiredMarker }}</span>\r\n </label>\r\n\r\n <!-- Single Date Picker -->\r\n <div *ngIf=\"!isRange\" class=\"cc-datepicker-field\" [class.focused]=\"focused\" [class.disabled]=\"disabled\"\r\n [class.error]=\"errorMessage\" [ngStyle]=\"fieldStyles\">\r\n\r\n <input type=\"date\" class=\"cc-datepicker-input\" #dateInput [value]=\"formattedValue\" [disabled]=\"disabled\"\r\n [required]=\"required\" [min]=\"formattedMin\" [max]=\"formattedMax\" [placeholder]=\"placeholder\"\r\n (input)=\"onDateInput($event)\" (blur)=\"onBlur()\" (focus)=\"onFocus()\" (click)=\"dateInput.showPicker()\" />\r\n\r\n <span class=\"cc-datepicker-icon material-icons\" (click)=\"dateInput.showPicker()\">calendar_today</span>\r\n </div>\r\n\r\n <!-- Range Date Picker -->\r\n <div *ngIf=\"isRange\" class=\"cc-datepicker-range\">\r\n <!-- Start Date -->\r\n <div class=\"cc-datepicker-subfield\">\r\n <label class=\"cc-datepicker-sublabel\">{{ startDateLabel }}</label>\r\n <div class=\"cc-datepicker-field\" [class.disabled]=\"disabled\" [ngStyle]=\"fieldStyles\">\r\n <input type=\"date\" class=\"cc-datepicker-input\" [value]=\"formattedStartDate\" [disabled]=\"disabled\"\r\n [required]=\"required\" [min]=\"formattedMin\" [max]=\"formattedEndDate || formattedMax\"\r\n (input)=\"onRangeStartInput($event)\" />\r\n </div>\r\n </div>\r\n\r\n <!-- End Date -->\r\n <div class=\"cc-datepicker-subfield\">\r\n <label class=\"cc-datepicker-sublabel\">{{ endDateLabel }}</label>\r\n <div class=\"cc-datepicker-field\" [class.disabled]=\"disabled\" [ngStyle]=\"fieldStyles\">\r\n <input type=\"date\" class=\"cc-datepicker-input\" [value]=\"formattedEndDate\" [disabled]=\"disabled\"\r\n [required]=\"required\" [min]=\"formattedStartDate || formattedMin\" [max]=\"formattedMax\"\r\n (input)=\"onRangeEndInput($event)\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"cc-error-message\" *ngIf=\"errorMessage\">{{ errorMessage }}</div>\r\n</div>","import { Component, Input, Output, EventEmitter, forwardRef, OnInit, OnDestroy, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { Subject } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\r\nimport { FilterSearchConfig, SearchLabels } from './search.models';\r\n\r\n@Component({\r\n selector: 'lib-search',\r\n templateUrl: './search.component.html',\r\n styleUrls: ['./search.component.scss'],\r\n standalone: false,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SearchComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class SearchComponent implements ControlValueAccessor, OnInit, OnDestroy, OnChanges {\r\n @Input() config?: FilterSearchConfig;\r\n @Input() labels?: SearchLabels;\r\n @Input() placeholder: string = '';\r\n @Input() label: string = '';\r\n @Input() disabled: boolean = false;\r\n @Input() debounceMs: number = 300;\r\n @Input() clearable: boolean = true;\r\n @Input() value: any = '';\r\n\r\n // Style inputs\r\n @Input() width?: string;\r\n @Input() height?: string;\r\n @Input() borderRadius?: string;\r\n @Input() fontSize?: string;\r\n\r\n @Input() gap?: string;\r\n @Input() fontFamily?: string;\r\n @Input() labelColor?: string;\r\n @Input() labelFontSize?: string;\r\n @Input() labelFontWeight?: string;\r\n\r\n @Input() backgroundColor?: string;\r\n @Input() borderColor?: string;\r\n @Input() borderWidth?: string;\r\n @Input() border?: string; // Shorthand\r\n @Input() padding?: string;\r\n @Input() fontWeight?: string;\r\n @Input() color?: string;\r\n @Input() textColor?: string; // Alias for color or specific text color\r\n @Input() iconColor?: string;\r\n @Input() placeholderColor?: string;\r\n @Input() focusBorderColor?: string;\r\n @Input() disabledBackgroundColor?: string;\r\n @Input() disabledColor?: string;\r\n @Input() boxShadow?: string;\r\n\r\n @Output() search = new EventEmitter<string>();\r\n @Output() clear = new EventEmitter<void>();\r\n\r\n private searchSubject = new Subject<string>();\r\n focused = false;\r\n onChange: (value: any) => void = () => { };\r\n onTouched: () => void = () => { };\r\n\r\n ngOnInit(): void {\r\n this.updateFromConfig();\r\n this.updateFromLabels();\r\n this.searchSubject.pipe(\r\n debounceTime(this.debounceMs),\r\n distinctUntilChanged()\r\n ).subscribe(value => {\r\n this.search.emit(value);\r\n });\r\n }\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['config']) {\r\n this.updateFromConfig();\r\n }\r\n if (changes['labels']) {\r\n this.updateFromLabels();\r\n }\r\n }\r\n\r\n private updateFromConfig(): void {\r\n if (this.config) {\r\n this.placeholder = this.config.placeholder ?? this.placeholder;\r\n this.label = this.config.label ?? this.label;\r\n this.disabled = this.config.disabled ?? this.disabled;\r\n this.debounceMs = this.config.debounceTime ?? this.debounceMs;\r\n this.clearable = this.config.clearable ?? this.clearable;\r\n this.width = this.config.width ?? this.width;\r\n this.height = this.config.height ?? this.height;\r\n this.borderRadius = this.config.borderRadius ?? this.borderRadius;\r\n this.fontSize = this.config.fontSize ?? this.fontSize;\r\n this.gap = this.config.gap ?? this.gap;\r\n this.fontFamily = this.config.fontFamily ?? this.fontFamily;\r\n this.labelColor = this.config.labelColor ?? this.labelColor;\r\n this.labelFontSize = this.config.labelFontSize ?? this.labelFontSize;\r\n this.labelFontWeight = this.config.labelFontWeight ?? this.labelFontWeight;\r\n this.backgroundColor = this.config.backgroundColor ?? this.backgroundColor;\r\n this.borderColor = this.config.borderColor ?? this.borderColor;\r\n this.borderWidth = this.config.borderWidth ?? this.borderWidth;\r\n this.border = this.config.border ?? this.border;\r\n this.padding = this.config.padding ?? this.padding;\r\n this.fontWeight = this.config.fontWeight ?? this.fontWeight;\r\n this.color = this.config.color ?? this.color;\r\n this.textColor = this.config.textColor ?? this.textColor;\r\n this.iconColor = this.config.iconColor ?? this.iconColor;\r\n this.placeholderColor = this.config.placeholderColor ?? this.placeholderColor;\r\n this.focusBorderColor = this.config.focusBorderColor ?? this.focusBorderColor;\r\n this.disabledBackgroundColor = this.config.disabledBackgroundColor ?? this.disabledBackgroundColor;\r\n this.disabledColor = this.config.disabledColor ?? this.disabledColor;\r\n this.boxShadow = this.config.boxShadow ?? this.boxShadow;\r\n if (this.config.value) {\r\n this.value = this.config.value;\r\n }\r\n }\r\n }\r\n\r\n private updateFromLabels(): void {\r\n if (this.labels) {\r\n this.label = this.labels.label || this.label;\r\n this.placeholder = this.labels.placeholder || this.placeholder;\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.searchSubject.complete();\r\n }\r\n\r\n get clearAriaLabel(): string {\r\n return this.labels?.clearAriaLabel || 'Clear search';\r\n }\r\n\r\n writeValue(value: any): void {\r\n this.value = value || '';\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n onInputChange(event: any): void {\r\n this.value = event.target.value;\r\n this.onChange(this.value);\r\n this.searchSubject.next(this.value);\r\n }\r\n\r\n onClear(): void {\r\n this.value = '';\r\n this.onChange(this.value);\r\n this.searchSubject.next(this.value);\r\n this.clear.emit();\r\n }\r\n\r\n onBlur(): void {\r\n this.focused = false;\r\n this.onTouched();\r\n }\r\n\r\n onFocus(): void {\r\n this.focused = true;\r\n }\r\n\r\n private getStyleValue(value: string | undefined): string | undefined {\r\n return value ? `${value}` : undefined;\r\n }\r\n\r\n get wrapperStyles(): { [key: string]: string | undefined } {\r\n return {\r\n 'width': this.getStyleValue(this.width),\r\n '--cc-search-label-gap': this.getStyleValue(this.gap),\r\n '--cc-search-font-family': this.getStyleValue(this.fontFamily)\r\n };\r\n }\r\n\r\n get labelStyles(): { [key: string]: string | undefined } {\r\n return {\r\n '--cc-search-label-color': this.getStyleValue(this.labelColor),\r\n '--cc-search-label-font-size': this.getStyleValue(this.labelFontSize),\r\n '--cc-search-label-font-weight': this.getStyleValue(this.labelFontWeight)\r\n };\r\n }\r\n\r\n get fieldStyles(): { [key: string]: string | undefined } {\r\n return {\r\n '--cc-search-bg': this.getStyleValue(this.backgroundColor),\r\n '--cc-search-border-radius': this.getStyleValue(this.borderRadius),\r\n '--cc-search-border-color': this.getStyleValue(this.borderColor),\r\n '--cc-search-border-width': this.getStyleValue(this.borderWidth),\r\n '--cc-search-border': this.getStyleValue(this.border),\r\n '--cc-search-height': this.getStyleValue(this.height),\r\n '--cc-search-padding': this.getStyleValue(this.padding),\r\n '--cc-search-font-size': this.getStyleValue(this.fontSize),\r\n '--cc-search-font-weight': this.getStyleValue(this.fontWeight),\r\n '--cc-search-color': this.getStyleValue(this.color || this.textColor),\r\n '--cc-search-icon-color': this.getStyleValue(this.iconColor),\r\n '--cc-search-placeholder-color': this.getStyleValue(this.placeholderColor),\r\n '--cc-search-focus-border-color': this.getStyleValue(this.focusBorderColor),\r\n '--cc-search-disabled-bg': this.getStyleValue(this.disabledBackgroundColor),\r\n '--cc-search-disabled-color': this.getStyleValue(this.disabledColor),\r\n 'box-shadow': this.getStyleValue(this.boxShadow)\r\n };\r\n }\r\n}\r\n","<div class=\"cc-search-wrapper\" [ngStyle]=\"wrapperStyles\">\r\n <label *ngIf=\"label\" class=\"cc-search-label\" [ngStyle]=\"labelStyles\">{{ label }}</label>\r\n\r\n <div class=\"cc-search-field\" [class.focused]=\"focused\" [class.disabled]=\"disabled\" [ngStyle]=\"fieldStyles\">\r\n <span class=\"cc-search-icon material-icons\">search</span>\r\n\r\n <input type=\"text\" class=\"cc-search-input\" [value]=\"value\" [placeholder]=\"placeholder\" [disabled]=\"disabled\"\r\n (input)=\"onInputChange($event)\" (blur)=\"onBlur()\" (focus)=\"onFocus()\" />\r\n\r\n <button *ngIf=\"clearable && value && !disabled\" type=\"button\" class=\"cc-clear-btn\" (click)=\"onClear()\"\r\n [attr.aria-label]=\"clearAriaLabel\">\r\n <span class=\"material-icons\">close</span>\r\n </button>\r\n </div>\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\r\nimport { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { InputComponent } from './components/input/input.component';\r\nimport { DropdownComponent } from './components/dropdown/dropdown.component';\r\nimport { CheckboxComponent } from './components/checkbox/checkbox.component';\r\nimport { RadioComponent } from './components/radio/radio.component';\r\nimport { ToggleComponent } from './components/toggle/toggle.component';\r\nimport { DatepickerComponent } from './components/datepicker/datepicker.component';\r\nimport { SearchComponent } from './components/search/search.component';\r\nimport { ClickOutsideDirective } from './directives/click-outside.directive';\r\n\r\n@NgModule({\r\n declarations: [\r\n InputComponent,\r\n DropdownComponent,\r\n CheckboxComponent,\r\n RadioComponent,\r\n ToggleComponent,\r\n DatepickerComponent,\r\n SearchComponent,\r\n ClickOutsideDirective\r\n ],\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n FormsModule,\r\n ScrollingModule\r\n ],\r\n exports: [\r\n InputComponent,\r\n DropdownComponent,\r\n CheckboxComponent,\r\n RadioComponent,\r\n ToggleComponent,\r\n DatepickerComponent,\r\n SearchComponent\r\n ]\r\n})\r\nexport class FormComponentsModule { }\r\n","import { Injectable } from '@angular/core';\r\nimport {\r\n FormSchema,\r\n FieldConfig,\r\n SectionConfig,\r\n} from '../../smart-form/models/form-schema.model';\r\nimport {\r\n SelectionGroupNode,\r\n SelectionSectionNode,\r\n SelectionFieldNode,\r\n} from '../models/field-selection.models';\r\nimport {\r\n ConfiguratorTreeNode,\r\n} from '../models/field-configurator.models';\r\n\r\n/**\r\n * Service to parse a FormSchema into selection/configurator tree structures,\r\n * and to rebuild a modified FormSchema from those trees.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class FormSchemaTreeService {\r\n\r\n // ────────────────────────────────────────────────────────────────────────────\r\n // SELECTION TREE\r\n // ────────────────────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Parse a FormSchema into SelectionGroupNodes for the field-selection UI.\r\n * Stepper forms produce one group per step; section forms produce one group.\r\n */\r\n parseSchemaToSelectionGroups(schema: FormSchema): SelectionGroupNode[] {\r\n if (schema.formType === 'STEPPER' && schema.stepperConfig?.children?.length) {\r\n return schema.stepperConfig.children\r\n .filter(child => child.type === 'GROUP')\r\n .map(groupField => this._buildGroupNode(groupField));\r\n }\r\n\r\n // SECTION form → single virtual group\r\n if (schema.sectionConfig?.children?.length) {\r\n return [{\r\n label: schema.label || 'Form',\r\n groupFieldConfig: null,\r\n enabled: true,\r\n expanded: true,\r\n sections: this._buildSectionsFromChildren(schema.sectionConfig.children),\r\n }];\r\n }\r\n\r\n return [];\r\n }\r\n\r\n /**\r\n * Rebuild a FormSchema from the selection tree, updating visible/disabled/required\r\n * flags on each FieldConfig. Does NOT mutate the original schema.\r\n */\r\n applySelectionToSchema(\r\n groups: SelectionGroupNode[],\r\n originalSchema: FormSchema,\r\n ): FormSchema {\r\n const schema: FormSchema = JSON.parse(JSON.stringify(originalSchema));\r\n\r\n if (schema.formType === 'STEPPER' && schema.stepperConfig?.children?.length) {\r\n const stepChildren = schema.stepperConfig.children.filter(c => c.type === 'GROUP');\r\n groups.forEach((group, gi) => {\r\n if (gi < stepChildren.length) {\r\n const groupField = stepChildren[gi];\r\n groupField.isEnabled = group.enabled;\r\n groupField.visible = group.enabled; // Backward compatibility\r\n groupField.disabled = !group.enabled;\r\n if (groupField.sectionConfig?.children) {\r\n this._applySectionsToChildren(group.sections, groupField.sectionConfig.children);\r\n }\r\n }\r\n });\r\n } else if (schema.sectionConfig?.children?.length && groups.length > 0) {\r\n this._applySectionsToChildren(groups[0].sections, schema.sectionConfig.children);\r\n }\r\n\r\n return schema;\r\n }\r\n\r\n // ────────────────────────────────────────────────────────────────────────────\r\n // CONFIGURATOR TREE\r\n // ────────────────────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Parse a FormSchema into a flat ConfiguratorTreeNode[] for the left-panel tree.\r\n */\r\n parseSchemaToConfiguratorTree(schema: FormSchema): ConfiguratorTreeNode[] {\r\n if (schema.formType === 'STEPPER' && schema.stepperConfig?.children?.length) {\r\n return schema.stepperConfig.children\r\n .filter(c => c.type === 'GROUP')\r\n .map((groupField, gi) => this._buildConfiguratorGroupNode(groupField, [gi]));\r\n }\r\n\r\n if (schema.sectionConfig?.children?.length) {\r\n return this._buildConfiguratorChildNodes(schema.sectionConfig.children, []);\r\n }\r\n\r\n return [];\r\n }\r\n\r\n /**\r\n * Find a FieldConfig inside a FormSchema by its index path.\r\n */\r\n findFieldByPath(schema: FormSchema, path: number[]): FieldConfig | null {\r\n if (path.length === 0) return null;\r\n\r\n let children: FieldConfig[] | undefined;\r\n if (schema.formType === 'STEPPER') {\r\n children = schema.stepperConfig?.children;\r\n } else {\r\n children = schema.sectionConfig?.children;\r\n }\r\n if (!children) return null;\r\n\r\n let current: FieldConfig | undefined;\r\n for (let i = 0; i < path.length; i++) {\r\n const idx = path[i];\r\n if (!children || idx >= children.length) return null;\r\n current = children[idx];\r\n\r\n if (i < path.length - 1) {\r\n // Navigate deeper\r\n if (current.sectionConfig?.children) {\r\n children = current.sectionConfig.children;\r\n } else if (current.children) {\r\n children = current.children;\r\n } else {\r\n return null;\r\n }\r\n }\r\n }\r\n\r\n return current ?? null;\r\n }\r\n\r\n /**\r\n * Apply a partial patch to a FieldConfig located at the given path.\r\n * Returns a new FormSchema (does not mutate the original).\r\n */\r\n /**\r\n * Known top-level keys of FieldConfig.\r\n * Used to strip stale group-name keys (e.g. textConstraintsTextConfig) that\r\n * may have been introduced by previous incorrect patch operations.\r\n */\r\n private readonly _VALID_FIELD_KEYS = new Set([\r\n 'name', 'type', 'subType', 'label', 'placeholder', 'hint',\r\n 'required', 'disabled', 'readonly', 'isEnabled', 'visible',\r\n 'colSpan', 'defaultValue', 'prefix', 'suffix', 'className',\r\n 'payloadPath', 'errorMessage', 'visibilityExpression', 'onValidate',\r\n 'children', 'sectionConfig', 'rows',\r\n 'textConfig', 'emailConfig', 'phoneConfig', 'numberConfig',\r\n 'dateConfig', 'optionConfig', 'attachmentConfig', 'richTextConfig',\r\n 'ratingConfig', 'locationConfig', 'generatedConfig', 'rangeConfig',\r\n ]);\r\n\r\n applyFieldPatchToSchema(\r\n path: number[],\r\n patch: Partial<FieldConfig>,\r\n originalSchema: FormSchema,\r\n ): FormSchema {\r\n const schema: FormSchema = JSON.parse(JSON.stringify(originalSchema));\r\n const field = this.findFieldByPath(schema, path) as Record<string, any> | null;\r\n if (field) {\r\n // 1. Strip stale keys that don't belong to FieldConfig (e.g. old group names)\r\n for (const key of Object.keys(field)) {\r\n if (!this._VALID_FIELD_KEYS.has(key)) {\r\n delete field[key];\r\n }\r\n }\r\n // 2. Deep-merge the new patch on top of the cleaned field\r\n FormSchemaTreeService.deepMerge(field, patch as any);\r\n // 3. Clean up empty-string / null leaves from nested config objects.\r\n // e.g. user clears minDate → dateConfig.minDate becomes \"\" → remove it.\r\n // If the entire config object ends up empty → remove the key.\r\n FormSchemaTreeService.cleanEmptyConfigValues(field);\r\n }\r\n return schema;\r\n }\r\n\r\n /**\r\n * Remove empty-string and null values from all typed config sub-objects on a field.\r\n * If all values in a config sub-object are empty, the key is deleted entirely.\r\n */\r\n public static cleanEmptyConfigValues(field: Record<string, any>): void {\r\n const CONFIG_KEYS = [\r\n 'textConfig', 'emailConfig', 'phoneConfig', 'numberConfig',\r\n 'dateConfig', 'optionConfig', 'attachmentConfig', 'richTextConfig',\r\n 'ratingConfig', 'locationConfig', 'generatedConfig', 'rangeConfig',\r\n ];\r\n for (const key of CONFIG_KEYS) {\r\n if (field[key] && typeof field[key] === 'object' && !Array.isArray(field[key])) {\r\n field[key] = FormSchemaTreeService._removeEmptyLeaves(field[key]);\r\n if (Object.keys(field[key]).length === 0) {\r\n delete field[key];\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Recursively strip empty-string, null, and undefined values from a plain object.\r\n * Nested objects that become empty after stripping are also removed.\r\n */\r\n private static _removeEmptyLeaves(obj: Record<string, any>): Record<string, any> {\r\n const result: Record<string, any> = {};\r\n for (const [key, val] of Object.entries(obj)) {\r\n if (val === '' || val === null || val === undefined) continue;\r\n if (typeof val === 'object' && !Array.isArray(val)) {\r\n const nested = FormSchemaTreeService._removeEmptyLeaves(val);\r\n if (Object.keys(nested).length > 0) result[key] = nested;\r\n } else {\r\n result[key] = val;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Recursively merge `source` into `target` in-place.\r\n * Objects are merged key-by-key; primitives/arrays replace the existing value.\r\n */\r\n public static deepMerge(target: Record<string, any>, source: Record<string, any>): void {\r\n for (const key of Object.keys(source)) {\r\n const srcVal = source[key];\r\n const tgtVal = target[key];\r\n if (\r\n srcVal !== null &&\r\n typeof srcVal === 'object' &&\r\n !Array.isArray(srcVal) &&\r\n tgtVal !== null &&\r\n typeof tgtVal === 'object' &&\r\n !Array.isArray(tgtVal)\r\n ) {\r\n // Both sides are plain objects — merge recursively\r\n this.deepMerge(tgtVal, srcVal);\r\n } else {\r\n target[key] = srcVal;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Convert a flat object with dot-notation keys into a nested object.\r\n * E.g. { 'a.b.c': 1 } -> { a: { b: { c: 1 } } }\r\n */\r\n public static inflatePatch(flatPatch: Record<string, any>): Record<string, any> {\r\n const nested: Record<string, any> = {};\r\n\r\n for (const [key, value] of Object.entries(flatPatch)) {\r\n const parts = key.split('.');\r\n let current = nested;\r\n\r\n for (let i = 0; i < parts.length - 1; i++) {\r\n const part = parts[i];\r\n if (!(part in current) || typeof current[part] !== 'object' || current[part] === null) {\r\n current[part] = {};\r\n }\r\n current = current[part];\r\n }\r\n\r\n current[parts[parts.length - 1]] = value;\r\n }\r\n\r\n return nested;\r\n }\r\n\r\n /**\r\n * Convert a nested object into a flat object with dot-notation keys.\r\n * E.g. { a: { b: { c: 1 } } } -> { 'a.b.c': 1 }\r\n */\r\n public static flattenObject(obj: Record<string, any>, prefix = ''): Record<string, any> {\r\n const flat: Record<string, any> = {};\r\n\r\n for (const [key, value] of Object.entries(obj)) {\r\n const newKey = prefix ? `${prefix}.${key}` : key;\r\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\r\n Object.assign(flat, this.flattenObject(value, newKey));\r\n } else {\r\n flat[newKey] = value;\r\n }\r\n }\r\n\r\n return flat;\r\n }\r\n\r\n // ────────────────────────────────────────────────────────────────────────────\r\n // FIELD TYPE MAPPING (FormSchema type → builder field type)\r\n // ────────────────────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Map a FormSchema FieldConfig.type to the builder fieldType key\r\n * used in field-type-schema.map.ts for config UI generation.\r\n */\r\n mapFieldTypeToBuilderType(type: string, subType?: string): string {\r\n const typeMap: Record<string, string> = {\r\n 'TEXT_INPUT': 'shortText',\r\n 'TEXT': 'shortText',\r\n 'TEXTAREA': 'longText',\r\n 'RICH_TEXT': 'richText',\r\n 'NUMBER_INPUT': 'number',\r\n 'NUMBER': 'number',\r\n 'DATE': 'date',\r\n 'TIME': 'time',\r\n 'DROPDOWN': 'dropdown',\r\n 'SELECT': 'dropdown',\r\n 'MULTI_SELECT': 'multiSelect',\r\n 'AUTOCOMPLETE': 'autocomplete',\r\n 'RADIO': 'radio',\r\n 'CHECKBOX': 'checkbox',\r\n 'SWITCH': 'toggle',\r\n 'FILE_UPLOAD': 'file',\r\n 'RATING': 'rating',\r\n 'GENERATED': 'generated',\r\n 'CHIP': 'chip',\r\n 'LOCATION': 'location',\r\n 'GROUP': 'group',\r\n 'SUBFIELDS': 'section',\r\n };\r\n\r\n // Refinement by subType\r\n if (type === 'TEXT_INPUT' && subType) {\r\n switch (subType) {\r\n case 'LONG': return 'longText';\r\n case 'EMAIL': return 'email';\r\n case 'PHONE': return 'phone';\r\n case 'PASSWORD': return 'password';\r\n default: return 'shortText';\r\n }\r\n }\r\n\r\n if (type === 'NUMBER_INPUT') {\r\n if (subType === 'DECIMAL') return 'decimal';\r\n return 'number';\r\n }\r\n\r\n if (type === 'DATE') {\r\n if (subType === 'DATETIME') return 'dateTime';\r\n return 'date';\r\n }\r\n\r\n if (type === 'CHECKBOX' && subType === 'LIST') {\r\n return 'multiCheckbox';\r\n }\r\n\r\n return typeMap[type] ?? 'shortText';\r\n }\r\n\r\n // ────────────────────────────────────────────────────────────────────────────\r\n // PRIVATE — Selection tree builders\r\n // ────────────────────────────────────────────────────────────────────────────\r\n\r\n private _buildGroupNode(groupField: FieldConfig): SelectionGroupNode {\r\n const sections: SelectionSectionNode[] = [];\r\n\r\n if (groupField.sectionConfig?.children) {\r\n const built = this._buildSectionsFromChildren(groupField.sectionConfig.children);\r\n sections.push(...built);\r\n }\r\n\r\n return {\r\n label: groupField.sectionConfig?.label || groupField.label || groupField.name || 'Group',\r\n groupFieldConfig: groupField,\r\n enabled: groupField.isEnabled ?? groupField.visible ?? true,\r\n expanded: groupField.isEnabled ?? groupField.visible ?? true,\r\n sections,\r\n };\r\n }\r\n\r\n /**\r\n * Build sections from a children array. Fields that are GROUP/SUBFIELDS\r\n * become sections; other leaf fields are collected into a \"default\" section.\r\n */\r\n private _buildSectionsFromChildren(children: FieldConfig[]): SelectionSectionNode[] {\r\n const sections: SelectionSectionNode[] = [];\r\n let leafFields: SelectionFieldNode[] = [];\r\n\r\n for (const child of children) {\r\n if (child.type === 'GROUP' || (child.type === 'SUBFIELDS') || child.sectionConfig) {\r\n // Flush any accumulated leaf fields into a default section\r\n if (leafFields.length > 0) {\r\n sections.push(this._createDefaultSection(leafFields));\r\n leafFields = [];\r\n }\r\n sections.push(this._buildSectionNode(child));\r\n } else if (child.type === 'ROW' && child.children?.length) {\r\n // ROW children are leaf fields\r\n for (const rowChild of child.children) {\r\n leafFields.push(this._buildFieldNode(rowChild));\r\n }\r\n } else {\r\n leafFields.push(this._buildFieldNode(child));\r\n }\r\n }\r\n\r\n // Flush remaining leaf fields\r\n if (leafFields.length > 0) {\r\n sections.push(this._createDefaultSection(leafFields));\r\n }\r\n\r\n return sections;\r\n }\r\n\r\n private _buildSectionNode(field: FieldConfig): SelectionSectionNode {\r\n const subsections: SelectionSectionNode[] = [];\r\n const fields: SelectionFieldNode[] = [];\r\n\r\n const children = field.sectionConfig?.children ?? field.children ?? [];\r\n for (const child of children) {\r\n if (child.type === 'GROUP' || child.sectionConfig) {\r\n subsections.push(this._buildSectionNode(child));\r\n } else if (child.type === 'ROW' && child.children?.length) {\r\n for (const rowChild of child.children) {\r\n fields.push(this._buildFieldNode(rowChild));\r\n }\r\n } else {\r\n fields.push(this._buildFieldNode(child));\r\n }\r\n }\r\n\r\n const isVisible = field.isEnabled ?? field.visible ?? true;\r\n return {\r\n label: field.sectionConfig?.label || field.label || field.name || 'Section',\r\n sectionConfig: field.sectionConfig ?? null,\r\n parentFieldConfig: field,\r\n enabled: isVisible && field.disabled !== true,\r\n expanded: isVisible,\r\n fields,\r\n subsections,\r\n };\r\n }\r\n\r\n private _createDefaultSection(fields: SelectionFieldNode[]): SelectionSectionNode {\r\n return {\r\n label: 'Fields',\r\n sectionConfig: null,\r\n parentFieldConfig: null,\r\n enabled: true,\r\n expanded: true,\r\n fields,\r\n subsections: [],\r\n };\r\n }\r\n\r\n private _buildFieldNode(field: FieldConfig): SelectionFieldNode {\r\n return {\r\n fieldConfig: field,\r\n selected: field.isEnabled ?? field.visible ?? true,\r\n isLocked: field.readonly === true,\r\n };\r\n }\r\n\r\n // ────────────────────────────────────────────────────────────────────────────\r\n // PRIVATE — Apply selection back to FormSchema children\r\n // ────────────────────────────────────────────────────────────────────────────\r\n\r\n private _applySectionsToChildren(\r\n sections: SelectionSectionNode[],\r\n children: FieldConfig[],\r\n ): void {\r\n let sectionIdx = 0;\r\n let fieldIdx = 0;\r\n\r\n for (const child of children) {\r\n if (child.type === 'GROUP' || child.sectionConfig) {\r\n if (sectionIdx < sections.length) {\r\n const section = sections[sectionIdx];\r\n child.isEnabled = section.enabled;\r\n child.visible = section.enabled; // Backward compatibility\r\n child.disabled = !section.enabled;\r\n const innerChildren = child.sectionConfig?.children ?? child.children ?? [];\r\n if (innerChildren.length > 0) {\r\n this._applySectionsToChildren(section.subsections, innerChildren);\r\n // Also apply field selections\r\n this._applyFieldsToChildren(section.fields, innerChildren);\r\n }\r\n sectionIdx++;\r\n }\r\n } else if (child.type === 'ROW' && child.children?.length) {\r\n for (const rowChild of child.children) {\r\n const matchedField = this._findSelectionField(sections, rowChild, fieldIdx);\r\n if (matchedField) {\r\n rowChild.isEnabled = matchedField.selected;\r\n rowChild.visible = matchedField.selected; // Backward compatibility\r\n fieldIdx++;\r\n }\r\n }\r\n } else {\r\n const matchedField = this._findSelectionField(sections, child, fieldIdx);\r\n if (matchedField) {\r\n child.isEnabled = matchedField.selected;\r\n child.visible = matchedField.selected; // Backward compatibility\r\n fieldIdx++;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _applyFieldsToChildren(\r\n selectionFields: SelectionFieldNode[],\r\n children: FieldConfig[],\r\n ): void {\r\n let fi = 0;\r\n for (const child of children) {\r\n if (child.type === 'GROUP' || child.sectionConfig) continue;\r\n if (child.type === 'ROW' && child.children?.length) {\r\n for (const rowChild of child.children) {\r\n if (fi < selectionFields.length) {\r\n rowChild.isEnabled = selectionFields[fi].selected;\r\n rowChild.visible = selectionFields[fi].selected; // Backward compatibility\r\n fi++;\r\n }\r\n }\r\n } else {\r\n if (fi < selectionFields.length) {\r\n child.isEnabled = selectionFields[fi].selected;\r\n child.visible = selectionFields[fi].selected; // Backward compatibility\r\n fi++;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _findSelectionField(\r\n sections: SelectionSectionNode[],\r\n _field: FieldConfig,\r\n _index: number,\r\n ): SelectionFieldNode | null {\r\n // Flatten all fields from all sections\r\n for (const section of sections) {\r\n for (const f of section.fields) {\r\n if (f.fieldConfig === _field || f.fieldConfig.name === _field.name) {\r\n return f;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n // ────────────────────────────────────────────────────────────────────────────\r\n // PRIVATE — Configurator tree builders\r\n // ────────────────────────────────────────────────────────────────────────────\r\n\r\n private _buildConfiguratorGroupNode(\r\n groupField: FieldConfig,\r\n basePath: number[],\r\n ): ConfiguratorTreeNode {\r\n const children: ConfiguratorTreeNode[] = [];\r\n const sectionChildren = groupField.sectionConfig?.children ?? [];\r\n\r\n sectionChildren.forEach((child, ci) => {\r\n if (child.isEnabled === false || child.visible === false) return;\r\n const childPath = [...basePath, ci];\r\n if (child.type === 'GROUP' || child.type === 'SUBFIELDS' || child.subType === 'SECTION' || child.sectionConfig) {\r\n children.push(this._buildConfiguratorSectionNode(child, childPath));\r\n } else if (child.type === 'ROW' && child.children?.length) {\r\n child.children.forEach((rowChild, ri) => {\r\n if (rowChild.isEnabled !== false && rowChild.visible !== false) {\r\n children.push(this._buildConfiguratorFieldNode(rowChild, [...childPath, ri]));\r\n }\r\n });\r\n } else {\r\n children.push(this._buildConfiguratorFieldNode(child, childPath));\r\n }\r\n });\r\n\r\n return {\r\n id: groupField.name || `group-${basePath.join('-')}`,\r\n label: groupField.sectionConfig?.label || groupField.label || 'Group',\r\n type: 'group',\r\n expanded: false,\r\n fieldConfig: groupField,\r\n path: basePath,\r\n children,\r\n };\r\n }\r\n\r\n private _buildConfiguratorSectionNode(\r\n field: FieldConfig,\r\n basePath: number[],\r\n ): ConfiguratorTreeNode {\r\n const children: ConfiguratorTreeNode[] = [];\r\n const sectionChildren = field.sectionConfig?.children ?? field.children ?? [];\r\n\r\n sectionChildren.forEach((child, ci) => {\r\n if (child.isEnabled === false || child.visible === false) return;\r\n const childPath = [...basePath, ci];\r\n if (child.type === 'GROUP' || child.type === 'SUBFIELDS' || child.subType === 'SECTION' || child.sectionConfig) {\r\n children.push(this._buildConfiguratorSectionNode(child, childPath));\r\n } else if (child.type === 'ROW' && child.children?.length) {\r\n child.children.forEach((rowChild, ri) => {\r\n if (rowChild.isEnabled !== false && rowChild.visible !== false) {\r\n children.push(this._buildConfiguratorFieldNode(rowChild, [...childPath, ri]));\r\n }\r\n });\r\n } else {\r\n children.push(this._buildConfiguratorFieldNode(child, childPath));\r\n }\r\n });\r\n\r\n return {\r\n id: field.name || `section-${basePath.join('-')}`,\r\n label: field.sectionConfig?.label || field.label || 'Section',\r\n type: 'section',\r\n expanded: false,\r\n fieldConfig: field,\r\n path: basePath,\r\n children,\r\n };\r\n }\r\n\r\n private _buildConfiguratorFieldNode(\r\n field: FieldConfig,\r\n path: number[],\r\n ): ConfiguratorTreeNode {\r\n return {\r\n id: field.name || `field-${path.join('-')}`,\r\n label: field.label || field.name || 'Field',\r\n type: 'field',\r\n expanded: false,\r\n fieldConfig: field,\r\n path,\r\n children: [],\r\n };\r\n }\r\n\r\n private _buildConfiguratorChildNodes(\r\n children: FieldConfig[],\r\n basePath: number[],\r\n ): ConfiguratorTreeNode[] {\r\n const nodes: ConfiguratorTreeNode[] = [];\r\n\r\n children.forEach((child, ci) => {\r\n if (child.isEnabled === false || child.visible === false) return;\r\n const childPath = [...basePath, ci];\r\n if (child.type === 'GROUP' || child.sectionConfig) {\r\n nodes.push(this._buildConfiguratorSectionNode(child, childPath));\r\n } else if (child.type === 'ROW' && child.children?.length) {\r\n child.children.forEach((rowChild, ri) => {\r\n if (rowChild.isEnabled !== false && rowChild.visible !== false) {\r\n nodes.push(this._buildConfiguratorFieldNode(rowChild, [...childPath, ri]));\r\n }\r\n });\r\n } else {\r\n nodes.push(this._buildConfiguratorFieldNode(child, childPath));\r\n }\r\n });\r\n\r\n return nodes;\r\n }\r\n}\r\n","import { Injectable, computed, signal } from '@angular/core';\r\nimport { FormSchema } from '../../smart-form/models/form-schema.model';\r\nimport {\r\n SelectionGroupNode,\r\n SelectionSectionNode,\r\n SelectionFieldNode,\r\n} from '../models/field-selection.models';\r\nimport { FormSchemaTreeService } from '../services/form-schema-tree.service';\r\n\r\ninterface FieldSelectionState {\r\n groups: SelectionGroupNode[];\r\n originalSchema: FormSchema | null;\r\n}\r\n\r\n/**\r\n * Signal-based service for the field-selection component.\r\n * Manages group/section/field enable/disable toggles.\r\n */\r\n@Injectable()\r\nexport class FieldSelectionService {\r\n private readonly _state = signal<FieldSelectionState>({\r\n groups: [],\r\n originalSchema: null,\r\n });\r\n\r\n private readonly treeService = new FormSchemaTreeService();\r\n\r\n // ── Computed slices ─────────────────────────────────────────────\r\n readonly groups = computed(() => this._state().groups);\r\n readonly originalSchema = computed(() => this._state().originalSchema);\r\n\r\n readonly totalFieldCount = computed(() => {\r\n let count = 0;\r\n const countFields = (sections: SelectionSectionNode[]): void => {\r\n for (const s of sections) {\r\n count += s.fields.length;\r\n countFields(s.subsections);\r\n }\r\n };\r\n for (const g of this._state().groups) {\r\n countFields(g.sections);\r\n }\r\n return count;\r\n });\r\n\r\n readonly selectedFieldCount = computed(() => {\r\n let count = 0;\r\n const countSelected = (sections: SelectionSectionNode[]): void => {\r\n for (const s of sections) {\r\n if (!s.enabled) continue;\r\n count += s.fields.filter(f => f.selected).length;\r\n countSelected(s.subsections);\r\n }\r\n };\r\n for (const g of this._state().groups) {\r\n if (!g.enabled) continue;\r\n countSelected(g.sections);\r\n }\r\n return count;\r\n });\r\n\r\n // ── Mutators ────────────────────────────────────────────────────\r\n\r\n /**\r\n * Initialize the store from a FormSchema.\r\n */\r\n loadSchema(schema: FormSchema): void {\r\n const groups = this.treeService.parseSchemaToSelectionGroups(schema);\r\n this._state.set({ groups, originalSchema: schema });\r\n }\r\n\r\n /**\r\n * Toggle a group's enabled state. Disabling cascades to all sections + fields.\r\n */\r\n toggleGroup(groupIndex: number): void {\r\n this._state.update(s => ({\r\n ...s,\r\n groups: s.groups.map((g, i) => {\r\n if (i !== groupIndex) return g;\r\n const enabled = !g.enabled;\r\n return {\r\n ...g,\r\n enabled,\r\n sections: enabled ? g.sections : this._disableAllSections(g.sections),\r\n };\r\n }),\r\n }));\r\n }\r\n\r\n /**\r\n * Toggle a section's enabled state.\r\n * Disabling cascades to all child fields (and subsections).\r\n */\r\n toggleSection(groupIndex: number, sectionPath: number[]): void {\r\n this._state.update(s => ({\r\n ...s,\r\n groups: s.groups.map((g, gi) => {\r\n if (gi !== groupIndex) return g;\r\n return {\r\n ...g,\r\n sections: this._toggleSectionAtPath(g.sections, sectionPath, 0),\r\n };\r\n }),\r\n }));\r\n }\r\n\r\n /**\r\n * Toggle a section's expanded (collapsed/expanded) state.\r\n */\r\n toggleSectionExpanded(groupIndex: number, sectionPath: number[]): void {\r\n this._state.update(s => ({\r\n ...s,\r\n groups: s.groups.map((g, gi) => {\r\n if (gi !== groupIndex) return g;\r\n return {\r\n ...g,\r\n sections: this._toggleExpandedAtPath(g.sections, sectionPath, 0),\r\n };\r\n }),\r\n }));\r\n }\r\n\r\n /**\r\n * Toggle a group's expanded (collapsed/expanded) state.\r\n */\r\n toggleGroupExpanded(groupIndex: number): void {\r\n this._state.update(s => ({\r\n ...s,\r\n groups: s.groups.map((g, i) =>\r\n i === groupIndex ? { ...g, expanded: !g.expanded } : g\r\n ),\r\n }));\r\n }\r\n\r\n /**\r\n * Toggle a field's selected (checkbox) state.\r\n */\r\n toggleField(groupIndex: number, sectionPath: number[], fieldIndex: number): void {\r\n this._state.update(s => ({\r\n ...s,\r\n groups: s.groups.map((g, gi) => {\r\n if (gi !== groupIndex) return g;\r\n return {\r\n ...g,\r\n sections: this._toggleFieldAtPath(g.sections, sectionPath, 0, fieldIndex),\r\n };\r\n }),\r\n }));\r\n }\r\n\r\n /**\r\n * Build and return the updated FormSchema with selection changes applied.\r\n */\r\n buildUpdatedSchema(): FormSchema | null {\r\n const { groups, originalSchema } = this._state();\r\n if (!originalSchema) return null;\r\n return this.treeService.applySelectionToSchema(groups, originalSchema);\r\n }\r\n\r\n // ── Private helpers ─────────────────────────────────────────────\r\n\r\n private _disableAllSections(sections: SelectionSectionNode[]): SelectionSectionNode[] {\r\n return sections.map(s => ({\r\n ...s,\r\n enabled: false,\r\n fields: s.fields.map(f => ({ ...f, selected: false })),\r\n subsections: this._disableAllSections(s.subsections),\r\n }));\r\n }\r\n\r\n private _toggleSectionAtPath(\r\n sections: SelectionSectionNode[],\r\n path: number[],\r\n depth: number,\r\n ): SelectionSectionNode[] {\r\n return sections.map((s, i) => {\r\n if (i !== path[depth]) return s;\r\n\r\n if (depth === path.length - 1) {\r\n // This is the target section\r\n const enabled = !s.enabled;\r\n return {\r\n ...s,\r\n enabled,\r\n fields: enabled ? s.fields : s.fields.map(f => ({ ...f, selected: false })),\r\n subsections: enabled ? s.subsections : this._disableAllSections(s.subsections),\r\n };\r\n }\r\n\r\n // Recurse into subsections\r\n return {\r\n ...s,\r\n subsections: this._toggleSectionAtPath(s.subsections, path, depth + 1),\r\n };\r\n });\r\n }\r\n\r\n private _toggleExpandedAtPath(\r\n sections: SelectionSectionNode[],\r\n path: number[],\r\n depth: number,\r\n ): SelectionSectionNode[] {\r\n return sections.map((s, i) => {\r\n if (i !== path[depth]) return s;\r\n\r\n if (depth === path.length - 1) {\r\n return { ...s, expanded: !s.expanded };\r\n }\r\n\r\n return {\r\n ...s,\r\n subsections: this._toggleExpandedAtPath(s.subsections, path, depth + 1),\r\n };\r\n });\r\n }\r\n\r\n private _toggleFieldAtPath(\r\n sections: SelectionSectionNode[],\r\n sectionPath: number[],\r\n depth: number,\r\n fieldIndex: number,\r\n ): SelectionSectionNode[] {\r\n return sections.map((s, i) => {\r\n if (i !== sectionPath[depth]) return s;\r\n\r\n if (depth === sectionPath.length - 1) {\r\n return {\r\n ...s,\r\n fields: s.fields.map((f, fi) =>\r\n fi === fieldIndex && !f.isLocked\r\n ? { ...f, selected: !f.selected }\r\n : f\r\n ),\r\n };\r\n }\r\n\r\n return {\r\n ...s,\r\n subsections: this._toggleFieldAtPath(s.subsections, sectionPath, depth + 1, fieldIndex),\r\n };\r\n });\r\n }\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormComponentsModule } from '../../../../form-components/form-components.module';\r\nimport { SelectionFieldNode } from '../../../models/field-selection.models';\r\n\r\n@Component({\r\n selector: 'lib-selection-field-node',\r\n standalone: false,\r\n templateUrl: './selection-field-node.component.html',\r\n styleUrls: ['./selection-field-node.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SelectionFieldNodeComponent {\r\n @Input({ required: true }) field!: SelectionFieldNode;\r\n @Output() toggleSelected = new EventEmitter<void>();\r\n}\r\n","<div\r\n class=\"fb-selection-field\"\r\n [class.fb-selection-field--selected]=\"field.selected\"\r\n [class.fb-selection-field--locked]=\"field.isLocked\"\r\n>\r\n <span class=\"fb-selection-field__label\">\r\n {{ field.fieldConfig.label || field.fieldConfig.name }}\r\n </span>\r\n\r\n @if (field.isLocked) {\r\n <span class=\"fb-selection-field__lock\" title=\"This field is locked\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"></rect>\r\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\"></path>\r\n </svg>\r\n </span>\r\n } @else {\r\n <lib-checkbox\r\n [checked]=\"field.selected\"\r\n [disabled]=\"false\"\r\n (checkedChange)=\"toggleSelected.emit()\"\r\n />\r\n }\r\n</div>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormComponentsModule } from '../../../../form-components/form-components.module';\r\nimport { SelectionSectionNode } from '../../../models/field-selection.models';\r\nimport { SelectionFieldNodeComponent } from '../selection-field-node/selection-field-node.component';\r\n\r\n@Component({\r\n selector: 'lib-selection-section-node',\r\n standalone: false,\r\n templateUrl: './selection-section-node.component.html',\r\n styleUrls: ['./selection-section-node.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SelectionSectionNodeComponent {\r\n @Input({ required: true }) section!: SelectionSectionNode;\r\n @Input({ required: true }) sectionIndex!: number;\r\n @Input() depth: number = 0;\r\n\r\n /** Emits the sub-path from this node downward (empty [] for self) */\r\n @Output() toggleEnabled = new EventEmitter<number[]>();\r\n @Output() toggleExpanded = new EventEmitter<number[]>();\r\n @Output() fieldToggle = new EventEmitter<{ sectionPath: number[]; fieldIndex: number }>();\r\n\r\n onToggleEnabled(): void {\r\n this.toggleEnabled.emit([]);\r\n }\r\n\r\n onToggleExpanded(): void {\r\n this.toggleExpanded.emit([]);\r\n }\r\n\r\n onSubsectionToggleEnabled(subIndex: number, subPath: number[]): void {\r\n this.toggleEnabled.emit([subIndex, ...subPath]);\r\n }\r\n\r\n onSubsectionToggleExpanded(subIndex: number, subPath: number[]): void {\r\n this.toggleExpanded.emit([subIndex, ...subPath]);\r\n }\r\n\r\n onFieldToggle(fieldIndex: number): void {\r\n this.fieldToggle.emit({ sectionPath: [], fieldIndex });\r\n }\r\n\r\n onSubsectionFieldToggle(subIndex: number, payload: { sectionPath: number[]; fieldIndex: number }): void {\r\n this.fieldToggle.emit({\r\n sectionPath: [subIndex, ...payload.sectionPath],\r\n fieldIndex: payload.fieldIndex,\r\n });\r\n }\r\n\r\n get selectedCount(): number {\r\n return this.section.fields.filter(f => f.selected).length;\r\n }\r\n\r\n get isLocked(): boolean {\r\n return this.section.parentFieldConfig?.readonly === true;\r\n }\r\n\r\n trackByFieldIndex(index: number): number {\r\n return index;\r\n }\r\n\r\n trackBySubsectionIndex(index: number): number {\r\n return index;\r\n }\r\n}\r\n","<div\r\n class=\"fb-selection-section\"\r\n [class.fb-selection-section--disabled]=\"!section.enabled\"\r\n [class.fb-selection-section--nested]=\"depth > 0\"\r\n>\r\n <div class=\"fb-selection-section__header\">\r\n <button\r\n class=\"fb-selection-section__expand-btn\"\r\n (click)=\"onToggleExpanded()\"\r\n [attr.aria-expanded]=\"section.expanded\"\r\n type=\"button\"\r\n >\r\n <svg\r\n class=\"fb-selection-section__chevron\"\r\n [class.fb-selection-section__chevron--open]=\"section.expanded\"\r\n width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\"\r\n >\r\n <polyline points=\"6 9 12 15 18 9\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </button>\r\n\r\n <div class=\"fb-selection-section__meta\">\r\n <span class=\"fb-selection-section__label\">{{ section.label }}</span>\r\n </div>\r\n\r\n @if (isLocked) {\r\n <span class=\"fb-selection-section__lock\" title=\"This section is locked\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"></rect>\r\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\"></path>\r\n </svg>\r\n </span>\r\n } @else {\r\n <lib-toggle\r\n [checked]=\"section.enabled\"\r\n [disabled]=\"false\"\r\n [attr.aria-label]=\"'Enable ' + section.label\"\r\n (toggleChange)=\"onToggleEnabled()\"\r\n />\r\n }\r\n </div>\r\n\r\n @if (section.expanded && section.enabled) {\r\n <div class=\"fb-selection-section__body\">\r\n @for (field of section.fields; track trackByFieldIndex($index); let fi = $index) {\r\n <lib-selection-field-node\r\n [field]=\"field\"\r\n (toggleSelected)=\"onFieldToggle(fi)\"\r\n />\r\n }\r\n\r\n @for (sub of section.subsections; track trackBySubsectionIndex($index); let si = $index) {\r\n <lib-selection-section-node\r\n [section]=\"sub\"\r\n [sectionIndex]=\"si\"\r\n [depth]=\"depth + 1\"\r\n (toggleEnabled)=\"onSubsectionToggleEnabled(si, $event)\"\r\n (toggleExpanded)=\"onSubsectionToggleExpanded(si, $event)\"\r\n (fieldToggle)=\"onSubsectionFieldToggle(si, $event)\"\r\n />\r\n }\r\n </div>\r\n }\r\n</div>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormComponentsModule } from '../../../../form-components/form-components.module';\r\nimport { SelectionGroupNode } from '../../../models/field-selection.models';\r\nimport { SelectionSectionNodeComponent } from '../selection-section-node/selection-section-node.component';\r\n\r\n@Component({\r\n selector: 'lib-group-node',\r\n standalone: false,\r\n templateUrl: './group-node.component.html',\r\n styleUrls: ['./group-node.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class GroupNodeComponent {\r\n @Input({ required: true }) group!: SelectionGroupNode;\r\n @Input({ required: true }) groupIndex!: number;\r\n\r\n @Output() toggleEnabled = new EventEmitter<void>();\r\n @Output() toggleExpanded = new EventEmitter<void>();\r\n @Output() sectionToggleEnabled = new EventEmitter<number[]>();\r\n @Output() sectionToggleExpanded = new EventEmitter<number[]>();\r\n @Output() fieldToggle = new EventEmitter<{ sectionPath: number[]; fieldIndex: number }>();\r\n\r\n onSectionToggleEnabled(sectionIndex: number, subPath: number[]): void {\r\n this.sectionToggleEnabled.emit([sectionIndex, ...subPath]);\r\n }\r\n\r\n onSectionToggleExpanded(sectionIndex: number, subPath: number[]): void {\r\n this.sectionToggleExpanded.emit([sectionIndex, ...subPath]);\r\n }\r\n\r\n onFieldToggle(sectionIndex: number, payload: { sectionPath: number[]; fieldIndex: number }): void {\r\n this.fieldToggle.emit({\r\n sectionPath: [sectionIndex, ...payload.sectionPath],\r\n fieldIndex: payload.fieldIndex,\r\n });\r\n }\r\n\r\n trackBySectionIndex(index: number): number {\r\n return index;\r\n }\r\n}\r\n","<div class=\"fb-group-node\" [class.fb-group-node--disabled]=\"!group.enabled\">\r\n <div class=\"fb-group-node__header\">\r\n <button\r\n class=\"fb-group-node__expand-btn\"\r\n (click)=\"toggleExpanded.emit()\"\r\n [attr.aria-expanded]=\"group.expanded\"\r\n type=\"button\"\r\n >\r\n <svg\r\n class=\"fb-group-node__chevron\"\r\n [class.fb-group-node__chevron--open]=\"group.expanded\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\"\r\n >\r\n <polyline points=\"6 9 12 15 18 9\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </button>\r\n\r\n <div class=\"fb-group-node__meta\">\r\n <span class=\"fb-group-node__label\">{{ group.label }}</span>\r\n </div>\r\n\r\n <lib-toggle\r\n [checked]=\"group.enabled\"\r\n [disabled]=\"false\"\r\n [attr.aria-label]=\"'Enable ' + group.label\"\r\n (toggleChange)=\"toggleEnabled.emit()\"\r\n />\r\n </div>\r\n\r\n @if (group.expanded && group.enabled) {\r\n <div class=\"fb-group-node__body\">\r\n @for (section of group.sections; track trackBySectionIndex($index); let si = $index) {\r\n <lib-selection-section-node\r\n [section]=\"section\"\r\n [sectionIndex]=\"si\"\r\n [depth]=\"0\"\r\n (toggleEnabled)=\"onSectionToggleEnabled(si, $event)\"\r\n (toggleExpanded)=\"onSectionToggleExpanded(si, $event)\"\r\n (fieldToggle)=\"onFieldToggle(si, $event)\"\r\n />\r\n }\r\n </div>\r\n }\r\n</div>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n OnChanges,\r\n SimpleChanges,\r\n inject,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormSchema } from '../../../smart-form/models/form-schema.model';\r\nimport { FieldSelectionService } from '../../services/field-selection.service';\r\nimport { GroupNodeComponent } from './group-node/group-node.component';\r\n\r\n@Component({\r\n selector: 'lib-field-selection',\r\n standalone: false,\r\n providers: [FieldSelectionService],\r\n templateUrl: './field-selection.component.html',\r\n styleUrls: ['./field-selection.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FieldSelectionComponent implements OnChanges {\r\n @Input({ required: true }) schema!: FormSchema;\r\n @Output() schemaChange = new EventEmitter<FormSchema>();\r\n\r\n protected readonly store = inject(FieldSelectionService);\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['schema'] && this.schema) {\r\n this.store.loadSchema(this.schema);\r\n }\r\n }\r\n\r\n onToggleGroup(groupIndex: number): void {\r\n this.store.toggleGroup(groupIndex);\r\n this._emitChange();\r\n }\r\n\r\n onToggleGroupExpanded(groupIndex: number): void {\r\n this.store.toggleGroupExpanded(groupIndex);\r\n }\r\n\r\n onToggleSection(groupIndex: number, sectionPath: number[]): void {\r\n this.store.toggleSection(groupIndex, sectionPath);\r\n this._emitChange();\r\n }\r\n\r\n onToggleSectionExpanded(groupIndex: number, sectionPath: number[]): void {\r\n this.store.toggleSectionExpanded(groupIndex, sectionPath);\r\n }\r\n\r\n onToggleField(groupIndex: number, sectionPath: number[], fieldIndex: number): void {\r\n this.store.toggleField(groupIndex, sectionPath, fieldIndex);\r\n this._emitChange();\r\n }\r\n\r\n trackByGroupIndex(index: number): number {\r\n return index;\r\n }\r\n\r\n private _emitChange(): void {\r\n const updated = this.store.buildUpdatedSchema();\r\n if (updated) {\r\n this.schemaChange.emit(updated);\r\n }\r\n }\r\n}\r\n","<div class=\"fb-field-selection\">\r\n @for (group of store.groups(); track trackByGroupIndex($index); let gi = $index) {\r\n <lib-group-node\r\n [group]=\"group\"\r\n [groupIndex]=\"gi\"\r\n (toggleEnabled)=\"onToggleGroup(gi)\"\r\n (toggleExpanded)=\"onToggleGroupExpanded(gi)\"\r\n (sectionToggleEnabled)=\"onToggleSection(gi, $event)\"\r\n (sectionToggleExpanded)=\"onToggleSectionExpanded(gi, $event)\"\r\n (fieldToggle)=\"onToggleField(gi, $event.sectionPath, $event.fieldIndex)\"\r\n />\r\n }\r\n\r\n @if (store.groups().length === 0) {\r\n <div class=\"fb-field-selection__empty\">\r\n <p>No groups or fields found in the schema.</p>\r\n </div>\r\n }\r\n</div>\r\n","import { Injectable, computed, signal } from '@angular/core';\r\nimport { FormSchema, FieldConfig } from '../../smart-form/models/form-schema.model';\r\nimport {\r\n ConfiguratorTreeNode,\r\n ConfiguratorFieldInfo,\r\n} from '../models/field-configurator.models';\r\nimport { FormSchemaTreeService } from '../services/form-schema-tree.service';\r\n\r\ninterface FieldConfiguratorState {\r\n tree: ConfiguratorTreeNode[];\r\n selectedFieldPath: number[] | null;\r\n schema: FormSchema | null;\r\n}\r\n\r\n/**\r\n * Signal-based service for the field-configurator component.\r\n * Manages the tree + selected field + config panel state.\r\n */\r\n@Injectable()\r\nexport class FieldConfiguratorService {\r\n private readonly _state = signal<FieldConfiguratorState>({\r\n tree: [],\r\n selectedFieldPath: null,\r\n schema: null,\r\n });\r\n\r\n private readonly treeService = new FormSchemaTreeService();\r\n\r\n // ── Computed slices ─────────────────────────────────────────────\r\n readonly tree = computed(() => this._state().tree);\r\n readonly schema = computed(() => this._state().schema);\r\n readonly selectedFieldPath = computed(() => this._state().selectedFieldPath);\r\n\r\n readonly selectedField = computed<FieldConfig | null>(() => {\r\n const { schema, selectedFieldPath } = this._state();\r\n if (!schema || !selectedFieldPath) return null;\r\n return this.treeService.findFieldByPath(schema, selectedFieldPath);\r\n });\r\n\r\n readonly selectedFieldInfo = computed<ConfiguratorFieldInfo | null>(() => {\r\n const field = this.selectedField();\r\n const path = this.selectedFieldPath();\r\n if (!field || !path) return null;\r\n\r\n // Walk the tree to find group/section labels\r\n const labels = this._getParentLabels(this._state().tree, path);\r\n\r\n return {\r\n fieldConfig: field,\r\n groupLabel: labels.groupLabel,\r\n sectionLabel: labels.sectionLabel,\r\n path,\r\n };\r\n });\r\n\r\n /**\r\n * Returns the builder-compatible field type string for the currently selected field.\r\n * Used to look up the config schema from field-type-schema.map.ts.\r\n */\r\n readonly selectedFieldBuilderType = computed<string | null>(() => {\r\n const field = this.selectedField();\r\n if (!field) return null;\r\n return this.treeService.mapFieldTypeToBuilderType(field.type, field.subType);\r\n });\r\n\r\n // ── Mutators ────────────────────────────────────────────────────\r\n\r\n /**\r\n * Initialize the store from a FormSchema.\r\n */\r\n loadSchema(schema: FormSchema, preserveSelection = false): void {\r\n // If it's the exact same object reference and we are not forcing a reset, skip.\r\n if (this._state().schema === schema && preserveSelection) return;\r\n\r\n const tree = this.treeService.parseSchemaToConfiguratorTree(schema);\r\n \r\n this._state.update(s => {\r\n // If preserveSelection is truthy, we definitely keep it.\r\n // Otherwise, we still try to keep it IF the path is still valid in the new schema.\r\n let newPath = s.selectedFieldPath;\r\n if (!preserveSelection && newPath) {\r\n const stillExists = !!this.treeService.findFieldByPath(schema, newPath);\r\n if (!stillExists) newPath = null;\r\n }\r\n\r\n return {\r\n ...s,\r\n tree,\r\n selectedFieldPath: newPath,\r\n schema: JSON.parse(JSON.stringify(schema)),\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Select a field by its path. Pass null to deselect.\r\n */\r\n selectField(path: number[] | null): void {\r\n this._state.update(s => ({ ...s, selectedFieldPath: path }));\r\n }\r\n\r\n /**\r\n * Toggle a tree node's expanded state.\r\n */\r\n toggleNodeExpanded(nodeId: string): void {\r\n this._state.update(s => ({\r\n ...s,\r\n tree: this._toggleExpanded(s.tree, nodeId),\r\n }));\r\n }\r\n\r\n /**\r\n * Apply a config patch to the currently selected field.\r\n * Rebuilds the schema and tree nodes immutably.\r\n */\r\n patchSelectedField(patch: Partial<FieldConfig>): void {\r\n const { schema, selectedFieldPath, tree } = this._state();\r\n if (!schema || !selectedFieldPath) return;\r\n\r\n const newSchema = this.treeService.applyFieldPatchToSchema(\r\n selectedFieldPath,\r\n patch,\r\n schema,\r\n );\r\n\r\n // Rebuild the tree to reflect label changes etc.\r\n const newTree = this.treeService.parseSchemaToConfiguratorTree(newSchema);\r\n // Preserve expanded states from the old tree\r\n this._restoreExpandedStates(tree, newTree);\r\n\r\n this._state.set({\r\n schema: newSchema,\r\n selectedFieldPath,\r\n tree: newTree,\r\n });\r\n }\r\n\r\n /**\r\n * Change the type (and optionally subType) of the currently selected field.\r\n * Mapping goes from builderType keys (e.g. 'richText') → {type, subType?}.\r\n * DROPDOWN fields cannot be changed and are guarded here as well.\r\n */\r\n changeFieldType(builderType: string): void {\r\n const currentField = this.selectedField();\r\n if (!currentField) return;\r\n // Guard: never change a DROPDOWN-based field\r\n const t = currentField.type?.toUpperCase();\r\n if (t === 'DROPDOWN' || t === 'MULTI_SELECT') return;\r\n\r\n const TYPE_MAP: Record<string, { type: string; subType?: string }> = {\r\n shortText: { type: 'TEXT_INPUT' },\r\n longText: { type: 'TEXT_INPUT', subType: 'LONG' },\r\n email: { type: 'TEXT_INPUT', subType: 'EMAIL' },\r\n phone: { type: 'TEXT_INPUT', subType: 'PHONE' },\r\n password: { type: 'TEXT_INPUT', subType: 'PASSWORD' },\r\n number: { type: 'NUMBER_INPUT', subType: 'INTEGER' },\r\n decimal: { type: 'NUMBER_INPUT', subType: 'DECIMAL' },\r\n date: { type: 'DATE', subType: 'SINGLE' },\r\n time: { type: 'TIME', subType: 'SINGLE' },\r\n dateTime: { type: 'DATE', subType: 'DATETIME' },\r\n checkbox: { type: 'CHECKBOX', subType: 'BOOL' },\r\n multiCheckbox: { type: 'CHECKBOX', subType: 'LIST' },\r\n radio: { type: 'RADIO', subType: 'SINGLE' },\r\n toggle: { type: 'SWITCH', subType: 'BOOL' },\r\n chip: { type: 'CHIP', subType: 'MULTIPLE' },\r\n richText: { type: 'RICH_TEXT' },\r\n file: { type: 'FILE_UPLOAD', subType: 'SINGLE' },\r\n rating: { type: 'RATING', subType: 'STAR' },\r\n location: { type: 'LOCATION' },\r\n generated: { type: 'GENERATED', subType: 'FORMULA' },\r\n multiSelect: { type: 'MULTI_SELECT' },\r\n autocomplete: { type: 'AUTOCOMPLETE', subType: 'SINGLE' },\r\n dropdown: { type: 'DROPDOWN', subType: 'SINGLE' },\r\n multiDropdown: { type: 'MULTI_SELECT' },\r\n };\r\n\r\n const mapping = TYPE_MAP[builderType];\r\n if (!mapping) return;\r\n\r\n const patch: Partial<FieldConfig> = { type: mapping.type };\r\n if (mapping.subType !== undefined) {\r\n patch.subType = mapping.subType;\r\n } else {\r\n // Clear stale subType from previous field type\r\n patch.subType = undefined;\r\n }\r\n this.patchSelectedField(patch);\r\n }\r\n\r\n /**\r\n * Get the current schema (with all applied modifications).\r\n */\r\n getCurrentSchema(): FormSchema | null {\r\n return this._state().schema;\r\n }\r\n\r\n // ── Private helpers ─────────────────────────────────────────────\r\n\r\n private _toggleExpanded(nodes: ConfiguratorTreeNode[], nodeId: string): ConfiguratorTreeNode[] {\r\n return nodes.map(n => {\r\n if (n.id === nodeId) {\r\n return { ...n, expanded: !n.expanded };\r\n }\r\n if (n.children.length > 0) {\r\n return { ...n, children: this._toggleExpanded(n.children, nodeId) };\r\n }\r\n return n;\r\n });\r\n }\r\n\r\n private _restoreExpandedStates(\r\n oldNodes: ConfiguratorTreeNode[],\r\n newNodes: ConfiguratorTreeNode[],\r\n ): void {\r\n for (const newNode of newNodes) {\r\n const oldNode = oldNodes.find(o => o.id === newNode.id);\r\n if (oldNode) {\r\n newNode.expanded = oldNode.expanded;\r\n if (oldNode.children.length > 0 && newNode.children.length > 0) {\r\n this._restoreExpandedStates(oldNode.children, newNode.children);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _getParentLabels(\r\n nodes: ConfiguratorTreeNode[],\r\n path: number[],\r\n ): { groupLabel: string; sectionLabel: string } {\r\n let groupLabel = '';\r\n let sectionLabel = '';\r\n\r\n const findInNodes = (nodeList: ConfiguratorTreeNode[], targetPath: number[]): boolean => {\r\n for (const node of nodeList) {\r\n if (this._pathsEqual(node.path, targetPath)) {\r\n return true;\r\n }\r\n if (node.children.length > 0) {\r\n const found = findInNodes(node.children, targetPath);\r\n if (found) {\r\n if (node.type === 'group') groupLabel = node.label;\r\n if (node.type === 'section') sectionLabel = node.label;\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n findInNodes(nodes, path);\r\n return { groupLabel, sectionLabel };\r\n }\r\n\r\n private _pathsEqual(a: number[], b: number[]): boolean {\r\n if (a.length !== b.length) return false;\r\n return a.every((val, i) => val === b[i]);\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { FieldTypeSchemaMap } from '../models/builder.models';\r\n\r\n/**\r\n * Optional token to override the field-type → config-schema mapping\r\n * used by the standalone FieldConfiguratorComponent.\r\n */\r\nexport const BUILDER_FIELD_TYPE_SCHEMA_MAP = new InjectionToken<FieldTypeSchemaMap>(\r\n 'BUILDER_FIELD_TYPE_SCHEMA_MAP'\r\n);\r\n","/** Available field types that users can switch to in the configurator. */\r\nexport const SWITCHABLE_FIELD_TYPES = [\r\n { label: 'Short Text', value: 'shortText' },\r\n { label: 'Long Text', value: 'longText' },\r\n { label: 'Email', value: 'email' },\r\n { label: 'Phone', value: 'phone' },\r\n { label: 'Password', value: 'password' },\r\n { label: 'Number (Integer)',value: 'number' },\r\n { label: 'Number (Decimal)',value: 'decimal' },\r\n { label: 'Date', value: 'date' },\r\n { label: 'Time', value: 'time' },\r\n { label: 'Date & Time', value: 'dateTime' },\r\n { label: 'Dropdown', value: 'dropdown' },\r\n { label: 'Multi-Select', value: 'multiSelect' },\r\n { label: 'Autocomplete', value: 'autocomplete' },\r\n { label: 'Checkbox', value: 'checkbox' },\r\n { label: 'Multi-Checkbox', value: 'multiCheckbox' },\r\n { label: 'Radio', value: 'radio' },\r\n { label: 'Toggle', value: 'toggle' },\r\n { label: 'Chips', value: 'chip' },\r\n { label: 'Rich Text', value: 'richText' },\r\n { label: 'File Upload', value: 'file' },\r\n { label: 'Rating', value: 'rating' },\r\n { label: 'Location', value: 'location' },\r\n { label: 'Formula (Auto)', value: 'generated' },\r\n];\r\n","import { FormSchema } from '../../smart-form/models/form-schema.model';\r\nimport { SWITCHABLE_FIELD_TYPES } from '../utils/constants';\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// SHARED BASE FIELDS (common to ALL field types)\r\n// These fields come from the core FieldConfig interface.\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nconst F = {\r\n label: { name: 'label', type: 'TEXT_INPUT', label: 'Field Label', required: true, placeholder: 'Enter field label...', colSpan: 12 },\r\n name: { name: 'name', type: 'TEXT_INPUT', label: 'System Name (name)', placeholder: 'e.g. firstName', colSpan: 6, hint: 'Unique key for the field in payload' },\r\n colSpan: { name: 'colSpan', type: 'NUMBER_INPUT', label: 'Col Span (1–12)', defaultValue: 12, colSpan: 6, hint: '6 = half width, 12 = full width' },\r\n placeholder: { name: 'placeholder', type: 'TEXT_INPUT', label: 'Placeholder Text', placeholder: 'e.g. Enter value here...', colSpan: 6 },\r\n hint: { name: 'hint', type: 'TEXT_INPUT', label: 'Hint (below field)', placeholder: 'Helpful instruction...', colSpan: 6 },\r\n prefix: { name: 'prefix', type: 'TEXT_INPUT', label: 'Prefix', placeholder: 'e.g. $', colSpan: 6 },\r\n suffix: { name: 'suffix', type: 'TEXT_INPUT', label: 'Suffix', placeholder: 'e.g. USD', colSpan: 6 },\r\n defaultValue: { name: 'defaultValue', type: 'TEXT_INPUT', label: 'Default Value', placeholder: 'Pre-filled value', colSpan: 6 },\r\n payloadPath: { name: 'payloadPath', type: 'TEXT_INPUT', label: 'Payload Path', placeholder: 'e.g. metadata.status.code', colSpan: 6, hint: 'Dot-notation path in API payload' },\r\n className: { name: 'className', type: 'TEXT_INPUT', label: 'CSS Class', placeholder: 'e.g. custom-class', colSpan: 6 },\r\n errorMessage: { name: 'errorMessage', type: 'TEXT_INPUT', label: 'Custom Error Message', placeholder: 'e.g. This field is required', colSpan: 12 },\r\n visibilityExpression: { name: 'visibilityExpression', type: 'TEXT_INPUT', label: 'Visibility Expression', placeholder: 'e.g. data.age > 18', colSpan: 12, hint: 'Show/hide this field conditionally based on other field values' },\r\n isEnabled: { name: 'isEnabled', type: 'SWITCH', label: 'Is Enabled', colSpan: 3, defaultValue: true },\r\n required: { name: 'required', type: 'SWITCH', label: 'Required', colSpan: 3 },\r\n readonly: { name: 'readonly', type: 'SWITCH', label: 'Read Only', colSpan: 3 },\r\n disabled: { name: 'disabled', type: 'SWITCH', label: 'Disabled', colSpan: 3 },\r\n type: {\r\n name: 'type',\r\n type: 'DROPDOWN',\r\n label: 'Field Type',\r\n colSpan: 6,\r\n subType: 'SINGLE',\r\n placeholder: 'Select field type',\r\n optionConfig: { optionList: SWITCHABLE_FIELD_TYPES }\r\n },\r\n};\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// SECTIONS\r\n// Each section groups related fields for better UX\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nfunction section(label: string, children: any[]): any {\r\n return {\r\n type: 'GROUP',\r\n label,\r\n sectionConfig: { label, children }\r\n };\r\n}\r\n\r\nfunction row(...children: any[]): any {\r\n return { type: 'ROW', name: 'row-' + children.map(c => c.name).join('-'), children };\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// COMMON SECTIONS (shared across multiple types)\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nconst BASE_SECTION_NO_TYPE = section('Basic Settings', [\r\n F.label,\r\n row(F.name, F.colSpan),\r\n row(F.defaultValue, F.placeholder),\r\n F.hint,\r\n]);\r\n\r\nconst BASE_SECTION = section('Basic Settings', [\r\n F.label,\r\n // row(F.name, F.type),\r\n row(F.name, F.colSpan),\r\n row(F.defaultValue, F.placeholder),\r\n F.hint,\r\n]);\r\n\r\nconst FLAGS_SECTION = section('Field State', [\r\n row(F.isEnabled, F.required, F.readonly, F.disabled),\r\n]);\r\n\r\nconst ADVANCED_SECTION = section('Advanced', [\r\n F.visibilityExpression,\r\n row(F.payloadPath, F.className),\r\n row(F.prefix, F.suffix),\r\n F.errorMessage,\r\n]);\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// APPLY BUTTON\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nconst APPLY_BUTTON: any = {\r\n actionBarConfig: {\r\n buttons: [{\r\n id: 'apply', label: 'Apply Changes', variant: 'primary',\r\n alignment: 'right', action: { kind: 'emit' }\r\n }]\r\n }\r\n};\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// SCHEMA BUILDER HELPER\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nfunction buildSchema(...sections: any[]): FormSchema {\r\n return {\r\n entityType: 'FIELD_CONFIG',\r\n label: 'Field Configuration',\r\n formType: 'SECTION',\r\n sectionConfig: { children: sections },\r\n ...APPLY_BUTTON\r\n } as FormSchema;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// TYPE-SPECIFIC CONFIG SCHEMAS\r\n// Based on: FieldConfig interface in form-schema.model.ts\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport const DEFAULT_FIELD_TYPE_SCHEMA_MAP: Record<string, FormSchema> = {\r\n\r\n // ── SHORT TEXT (TEXT_INPUT → textConfig: TextConfig) ─────────────────────\r\n shortText: buildSchema(\r\n BASE_SECTION,\r\n section('Text Constraints (textConfig)', [\r\n row(\r\n { name: 'textConfig.length.min', type: 'NUMBER_INPUT', label: 'Min Length', colSpan: 6, hint: 'Minimum number of characters' },\r\n { name: 'textConfig.length.max', type: 'NUMBER_INPUT', label: 'Max Length', colSpan: 6, hint: 'Maximum number of characters' },\r\n ),\r\n { name: 'textConfig.pattern', type: 'TEXT_INPUT', label: 'Regex Pattern', placeholder: '^[A-Za-z]+$', colSpan: 9 },\r\n { name: 'textConfig.patternMessage', type: 'TEXT_INPUT', label: 'Pattern Error Message', placeholder: 'Only letters allowed', colSpan: 9 },\r\n row(\r\n { name: 'textConfig.showCharCount', type: 'SWITCH', label: 'Show Char Count', colSpan: 6 },\r\n ),\r\n ]),\r\n FLAGS_SECTION,\r\n ADVANCED_SECTION,\r\n ),\r\n\r\n // ── PASSWORD (TEXT_INPUT + subType=PASSWORD → textConfig) ────────────────\r\n password: buildSchema(\r\n BASE_SECTION,\r\n section('Password Settings (textConfig)', [\r\n row(\r\n { name: 'textConfig.length.min', type: 'NUMBER_INPUT', label: 'Min Length', colSpan: 6 },\r\n { name: 'textConfig.length.max', type: 'NUMBER_INPUT', label: 'Max Length', colSpan: 6 },\r\n ),\r\n { name: 'textConfig.matchField', type: 'TEXT_INPUT', label: 'Match with Field', placeholder: 'password', colSpan: 12, hint: 'e.g. for \"Confirm Password\" field' },\r\n ]),\r\n FLAGS_SECTION,\r\n ADVANCED_SECTION,\r\n ),\r\n\r\n // ── LONG TEXT (TEXT_INPUT + subType=LONG → textConfig) ───────────────────\r\n longText: buildSchema(\r\n BASE_SECTION,\r\n section('Textarea Settings (textConfig)', [\r\n row(\r\n { name: 'textConfig.length.min', type: 'NUMBER_INPUT', label: 'Min Length', colSpan: 6 },\r\n { name: 'textConfig.length.max', type: 'NUMBER_INPUT', label: 'Max Length', colSpan: 6 },\r\n ),\r\n row(\r\n { name: 'rows', type: 'NUMBER_INPUT', label: 'Visible Rows', defaultValue: 4, colSpan: 6, hint: 'Height of the textarea' },\r\n { name: 'textConfig.showCharCount', type: 'SWITCH', label: 'Show Char Count', colSpan: 6 },\r\n ),\r\n ]),\r\n FLAGS_SECTION,\r\n ADVANCED_SECTION,\r\n ),\r\n\r\n // ── EMAIL (TEXT_INPUT + subType=EMAIL → emailConfig: EmailConfig) ─────────\r\n email: buildSchema(\r\n BASE_SECTION,\r\n section('Email Settings (emailConfig)', [\r\n { name: 'emailConfig.defaultDomain', type: 'TEXT_INPUT', label: 'Default Domain', placeholder: 'example.com', colSpan: 6 },\r\n { name: 'emailConfig.allowedDomains', type: 'TEXT_INPUT', label: 'Allowed Domains (comma-separated)', placeholder: 'example.com, org.com', colSpan: 12, hint: 'Leave blank to allow all domains' },\r\n { name: 'emailConfig.blockedDomains', type: 'TEXT_INPUT', label: 'Blocked Domains (comma-separated)', placeholder: 'spam.com', colSpan: 12 },\r\n ]),\r\n FLAGS_SECTION,\r\n ADVANCED_SECTION,\r\n ),\r\n\r\n // ── PHONE (TEXT_INPUT + subType=PHONE → phoneConfig: PhoneConfig) ─────────\r\n phone: buildSchema(\r\n BASE_SECTION,\r\n section('Phone Settings (phoneConfig)', [\r\n row(\r\n { name: 'phoneConfig.defaultCountryCode', type: 'TEXT_INPUT', label: 'Default Country Code', placeholder: '+91', colSpan: 6 },\r\n { name: 'phoneConfig.prefixCountryCode', type: 'SWITCH', label: 'Prefix Country Code', colSpan: 6 },\r\n ),\r\n {\r\n name: 'phoneConfig.supportedCountryCodeLocale',\r\n type: 'TEXT_INPUT', label: 'Supported Country Codes (comma-separated)',\r\n placeholder: 'IN, US, GB',\r\n colSpan: 12,\r\n hint: 'Leave blank to allow all country codes'\r\n },\r\n ]),\r\n FLAGS_SECTION,\r\n ADVANCED_SECTION,\r\n ),\r\n\r\n // ── NUMBER (NUMBER_INPUT → numberConfig: NumberConfig) ────────────────────\r\n number: buildSchema(\r\n BASE_SECTION,\r\n section('Number Settings (numberConfig)', [\r\n row(\r\n { name: 'numberConfig.min', type: 'NUMBER_INPUT', label: 'Min Value', colSpan: 6 },\r\n { name: 'numberConfig.max', type: 'NUMBER_INPUT', label: 'Max Value', colSpan: 6 },\r\n ),\r\n row(\r\n { name: 'numberConfig.step', type: 'NUMBER_INPUT', label: 'Step', colSpan: 6, hint: 'Increment by this amount' },\r\n { name: 'numberConfig.precision', type: 'NUMBER_INPUT', label: 'Decimal Precision', colSpan: 6, defaultValue: 0 },\r\n ),\r\n ]),\r\n FLAGS_SECTION,\r\n ADVANCED_SECTION,\r\n ),\r\n\r\n // ── DECIMAL (NUMBER_INPUT + precision → numberConfig) ─────────────────────\r\n decimal: buildSchema(\r\n BASE_SECTION,\r\n section('Decimal Number Settings (numberConfig)', [\r\n row(\r\n { name: 'numberConfig.min', type: 'NUMBER_INPUT', label: 'Min Value', colSpan: 6 },\r\n { name: 'numberConfig.max', type: 'NUMBER_INPUT', label: 'Max Value', colSpan: 6 },\r\n ),\r\n row(\r\n { name: 'numberConfig.precision', type: 'NUMBER_INPUT', label: 'Decimal Places', defaultValue: 2, colSpan: 6 },\r\n { name: 'numberConfig.step', type: 'NUMBER_INPUT', label: 'Step', defaultValue: 0.01, colSpan: 6 },\r\n ),\r\n ]),\r\n FLAGS_SECTION,\r\n ADVANCED_SECTION,\r\n ),\r\n\r\n // ── DATE (DATE → dateConfig: DateConfig) ─────────────────────────────────\r\n date: buildSchema(\r\n BASE_SECTION,\r\n section('Date Settings (dateConfig)', [\r\n row(\r\n { name: 'dateConfig.minDate', type: 'TEXT_INPUT', label: 'Min Date', placeholder: 'YYYY-MM-DD', colSpan: 6 },\r\n { name: 'dateConfig.maxDate', type: 'TEXT_INPUT', label: 'Max Date', placeholder: 'YYYY-MM-DD', colSpan: 6 },\r\n ),\r\n row(\r\n { name: 'dateConfig.allowFuture', type: 'SWITCH', label: 'Allow Future Dates', colSpan: 6 },\r\n ),\r\n ]),\r\n FLAGS_SECTION,\r\n ADVANCED_SECTION,\r\n ),\r\n\r\n // ── TIME ────────────────────────────────────────────────────────────────\r\n time: buildSchema(\r\n BASE_SECTION,\r\n section('Time Settings', [\r\n row(F.placeholder, F.hint),\r\n ]),\r\n FLAGS_SECTION,\r\n ADVANCED_SECTION,\r\n ),\r\n\r\n // ── DATE & TIME ──────────────────────────────────────────────────────────\r\n dateTime: buildSchema(\r\n BASE_SECTION,\r\n section('Date & Time Settings (dateConfig)', [\r\n row(\r\n { name: 'dateConfig.minDate', type: 'TEXT_INPUT', label: 'Min Date', placeholder: 'YYYY-MM-DD', colSpan: 6 },\r\n { name: 'dateConfig.maxDate', type: 'TEXT_INPUT', label: 'Max Date', placeholder: 'YYYY-MM-DD', colSpan: 6 },\r\n ),\r\n row(\r\n { name: 'dateConfig.allowFuture', type: 'SWITCH', label: 'Allow Future', colSpan: 6 },\r\n ),\r\n ]),\r\n FLAGS_SECTION,\r\n ADVANCED_SECTION,\r\n ),\r\n\r\n // ── DROPDOWN (DROPDOWN → optionConfig: OptionConfig) ─────────────────────\r\n dropdown: buildSchema(\r\n BASE_SECTION_NO_TYPE,\r\n section('Dropdown Options (optionConfig)', [\r\n {\r\n name: 'optionConfig.optionList',\r\n type: 'TEXT_INPUT',\r\n subType: 'LONG',\r\n label: 'Static Options (JSON)',\r\n placeholder: '[{\"label\": \"Yes\", \"code\": \"Y\"}, {\"label\": \"No\", \"code\": \"N\"}]',\r\n colSpan: 12,\r\n hint: 'Paste an array of objects with \"label\" and \"code\" keys',\r\n },\r\n { name: 'optionConfig.apiUrl', type: 'TEXT_INPUT', label: 'Options API URL', placeholder: '/api/options', colSpan: 12 },\r\n row(\r\n { name: 'optionConfig.dataPath', type: 'TEXT_INPUT', label: 'Data Path', placeholder: 'data.items', colSpan: 6 },\r\n { name: 'optionConfig.labelPath', type: 'TEXT_INPUT', label: 'Label Path', placeholder: 'name', colSpan: 6 },\r\n ),\r\n row(\r\n { name: 'optionConfig.valuePath', type: 'TEXT_INPUT', label: 'Value Path (code)', placeholder: 'code', colSpan: 6 },\r\n { name: 'optionConfig.sortBy', type: 'TEXT_INPUT', label: 'Sort By', placeholder: 'name.text', colSpan: 6 },\r\n ),\r\n row(\r\n { name: 'optionConfig.responsePath', type: 'TEXT_INPUT', label: 'Response Path', placeholder: 'e.g. elements', colSpan: 6 },\r\n {\r\n name: 'optionConfig.layout',\r\n type: 'DROPDOWN', subType: 'SINGLE',\r\n label: 'Options Layout',\r\n colSpan: 6,\r\n optionConfig: { optionList: [{ label: 'Row', code: 'row' }, { label: 'Column', code: 'column' }] },\r\n },\r\n ),\r\n ]),\r\n FLAGS_SECTION,\r\n ADVANCED_SECTION,\r\n ),\r\n\r\n // ── AUTOCOMPLETE (AUTOCOMPLETE → optionConfig) ───────────────────────────\r\n autocomplete: buildSchema(\r\n BASE_SECTION,\r\n section('Autocomplete Settings (optionConfig)', [\r\n { name: 'optionConfig.apiUrl', type: 'TEXT_INPUT', label: 'Search API URL', placeholder: '/api/search', colSpan: 12 },\r\n { name: 'optionConfig.dataPath', type: 'TEXT_INPUT', label: 'Data Path', placeholder: 'data.items', colSpan: 6 },\r\n { name: 'optionConfig.labelPath', type: 'TEXT_INPUT', label: 'Label Path', placeholder: 'name', colSpan: 6 },\r\n ]),\r\n FLAGS_SECTION,\r\n ADVANCED_SECTION,\r\n ),\r\n\r\n // ── MULTI-SELECT (same structure as dropdown) ────────────────────────────\r\n multiSelect: buildSchema(\r\n BASE_SECTION_NO_TYPE,\r\n section('Multi-Select Options (optionConfig)', [\r\n {\r\n name: 'optionConfig.optionList',\r\n type: 'TEXT_INPUT',\r\n subType: 'LONG',\r\n label: 'Static Options (JSON)',\r\n placeholder: '[{\"label\": \"Option A\", \"code\": \"A\"}]',\r\n colSpan: 12,\r\n hint: 'Array of objects with \"label\" and \"code\" keys',\r\n },\r\n { name: 'optionConfig.apiUrl', type: 'TEXT_INPUT', label: 'Options API URL', placeholder: '/api/options', colSpan: 12 },\r\n ]),\r\n FLAGS_SECTION,\r\n ADVANCED_SECTION,\r\n ),\r\n\r\n // ── CHECKBOX (CHECKBOX → optionConfig for list, no optionConfig for single)\r\n checkbox: buildSchema(\r\n BASE_SECTION,\r\n section('Checkbox List Options (optionConfig)', [\r\n {\r\n name: 'optionConfig.optionList',\r\n type: 'TEXT_INPUT',\r\n subType: 'LONG',\r\n label: 'Checkbox Options (JSON) — leave blank for single checkbox',\r\n placeholder: '[{\"label\": \"Yes\", \"code\": \"Y\"}]',\r\n colSpan: 12,\r\n },\r\n ]),\r\n FLAGS_SECTION,\r\n ADVANCED_SECTION,\r\n ),\r\n\r\n // ── MUTLI-CHECKBOX ───────────────────────────────────────────────────────\r\n multiCheckbox: buildSchema(\r\n BASE_SECTION,\r\n section('Checkbox List Options (optionConfig)', [\r\n {\r\n name: 'optionConfig.optionList',\r\n type: 'TEXT_INPUT',\r\n subType: 'LONG',\r\n label: 'Checkbox Options (JSON)',\r\n placeholder: '[{\"label\": \"Opt A\", \"code\": \"A\"}]',\r\n colSpan: 12,\r\n },\r\n { name: 'optionConfig.apiUrl', type: 'TEXT_INPUT', label: 'Options API URL', placeholder: '/api/options', colSpan: 12 },\r\n ]),\r\n FLAGS_SECTION,\r\n ADVANCED_SECTION,\r\n ),\r\n\r\n // ── TOGGLE / SWITCH (SWITCH → no extra config except basics) ─────────────\r\n toggle: buildSchema(\r\n section('Basic Settings', [\r\n row(F.label, F.name),\r\n row(F.colSpan, F.defaultValue),\r\n F.hint,\r\n ]),\r\n FLAGS_SECTION,\r\n section('Advanced', [\r\n F.visibilityExpression,\r\n row(F.payloadPath, F.className),\r\n F.errorMessage,\r\n ]),\r\n ),\r\n\r\n // ── CHIPS ────────────────────────────────────────────────────────────────\r\n chip: buildSchema(\r\n BASE_SECTION,\r\n section('Chip Options (optionConfig)', [\r\n {\r\n name: 'optionConfig.optionList',\r\n type: 'TEXT_INPUT',\r\n subType: 'LONG',\r\n label: 'Chip Options (JSON)',\r\n placeholder: '[{\"label\": \"Tag 1\", \"code\": \"T1\"}]',\r\n colSpan: 12,\r\n },\r\n ]),\r\n FLAGS_SECTION,\r\n ADVANCED_SECTION,\r\n ),\r\n\r\n // ── RICH TEXT (RICH_TEXT → richTextConfig: RichTextConfig) ───────────────\r\n richText: buildSchema(\r\n BASE_SECTION,\r\n section('Rich Text Editor Settings (richTextConfig)', [\r\n row(\r\n { name: 'richTextConfig.height', type: 'TEXT_INPUT', label: 'Editor Height', placeholder: '300px', colSpan: 6 },\r\n { name: 'richTextConfig.maxLength', type: 'NUMBER_INPUT', label: 'Max Length (chars)', colSpan: 6 },\r\n ),\r\n row(\r\n { name: 'richTextConfig.placeholder', type: 'TEXT_INPUT', label: 'Editor Placeholder', placeholder: 'Enter content here...', colSpan: 6 },\r\n { name: 'richTextConfig.showCharCount', type: 'SWITCH', label: 'Show Char Count', colSpan: 6 },\r\n ),\r\n ]),\r\n FLAGS_SECTION,\r\n ADVANCED_SECTION,\r\n ),\r\n\r\n // ── FILE UPLOAD (FILE_UPLOAD → attachmentConfig: AttachmentConfig) ────────\r\n file: buildSchema(\r\n BASE_SECTION,\r\n section('File Upload Settings (attachmentConfig)', [\r\n row(\r\n { name: 'attachmentConfig.multiple', type: 'SWITCH', label: 'Allow Multiple Files', colSpan: 6 },\r\n { name: 'attachmentConfig.maxFiles', type: 'NUMBER_INPUT', label: 'Max Files', colSpan: 6, hint: 'Only applies when multiple=true' },\r\n ),\r\n row(\r\n { name: 'attachmentConfig.maxSizeMB', type: 'NUMBER_INPUT', label: 'Max File Size (MB)', colSpan: 6 },\r\n { name: 'attachmentConfig.accept', type: 'TEXT_INPUT', label: 'Accepted Types', placeholder: '.pdf,.jpg,image/*', colSpan: 6 },\r\n ),\r\n { name: 'attachmentConfig.acceptLabel', type: 'TEXT_INPUT', label: 'Hint in Drop Zone', placeholder: 'JPG, PNG, PDF (max 5 MB)', colSpan: 12 },\r\n { name: 'attachmentConfig.uploadUrl', type: 'TEXT_INPUT', label: 'Upload API URL', placeholder: '/api/upload', colSpan: 12 },\r\n { name: 'attachmentConfig.deleteUrl', type: 'TEXT_INPUT', label: 'Delete API URL', placeholder: '/api/file/{id}', colSpan: 12 },\r\n ]),\r\n FLAGS_SECTION,\r\n ADVANCED_SECTION,\r\n ),\r\n\r\n // ── RATING (RATING → ratingConfig: RatingConfig) ─────────────────────────\r\n rating: buildSchema(\r\n BASE_SECTION,\r\n section('Rating Settings (ratingConfig)', [\r\n row(\r\n { name: 'ratingConfig.maxRating', type: 'NUMBER_INPUT', label: 'Max Stars', defaultValue: 5, colSpan: 6 },\r\n { name: 'ratingConfig.allowHalf', type: 'SWITCH', label: 'Allow Half Stars', colSpan: 6 },\r\n ),\r\n ]),\r\n FLAGS_SECTION,\r\n ADVANCED_SECTION,\r\n ),\r\n\r\n // ── RADIO (RADIO → optionConfig for list) ────────────────────────────────\r\n radio: buildSchema(\r\n BASE_SECTION,\r\n section('Radio Options (optionConfig)', [\r\n {\r\n name: 'optionConfig.optionList',\r\n type: 'TEXT_INPUT',\r\n subType: 'LONG',\r\n label: 'Radio Options (JSON)',\r\n placeholder: '[{\"label\": \"Male\", \"code\": \"M\"}, {\"label\": \"Female\", \"code\": \"F\"}]',\r\n colSpan: 12,\r\n },\r\n { name: 'optionConfig.apiUrl', type: 'TEXT_INPUT', label: 'Options API URL', placeholder: '/api/options', colSpan: 12 },\r\n ]),\r\n FLAGS_SECTION,\r\n ADVANCED_SECTION,\r\n ),\r\n\r\n // ── LOCATION (LOCATION → locationConfig: LocationConfig) ─────────────────\r\n location: buildSchema(\r\n BASE_SECTION,\r\n section('Location Settings (locationConfig)', [\r\n row(\r\n {\r\n name: 'locationConfig.defaultTab',\r\n type: 'DROPDOWN', subType: 'SINGLE',\r\n label: 'Default Tab',\r\n colSpan: 6,\r\n optionConfig: { optionList: [{ label: 'Venue', code: 'VENUE' }, { label: 'Online', code: 'ONLINE' }, { label: 'TBA', code: 'TBA' }] },\r\n },\r\n { name: 'locationConfig.maxLocations', type: 'NUMBER_INPUT', label: 'Max Locations', colSpan: 6, defaultValue: 5 },\r\n ),\r\n row(\r\n { name: 'locationConfig.allowMulti', type: 'SWITCH', label: 'Allow Multiple Locations', colSpan: 6 },\r\n { name: 'locationConfig.showMap', type: 'SWITCH', label: 'Show Map Preview', colSpan: 6 },\r\n ),\r\n { name: 'locationConfig.googleMapsApiKey', type: 'TEXT_INPUT', label: 'Google Maps API Key', colSpan: 12 },\r\n { name: 'locationConfig.venuePlaceholder', type: 'TEXT_INPUT', label: 'Venue Search Placeholder', colSpan: 6 },\r\n { name: 'locationConfig.onlinePlaceholder', type: 'TEXT_INPUT', label: 'Online URL Placeholder', colSpan: 6 },\r\n ]),\r\n FLAGS_SECTION,\r\n ADVANCED_SECTION,\r\n ),\r\n\r\n // ── GENERATED / FORMULA ──────────────────────────────────────────────────\r\n generated: buildSchema(\r\n BASE_SECTION,\r\n section('Formula Settings (generatedConfig)', [\r\n { \r\n name: 'generatedConfig.formula', \r\n type: 'TEXT_INPUT', \r\n label: 'Formula Expression', \r\n placeholder: 'data.price * data.quantity', \r\n colSpan: 12,\r\n hint: 'Use data.field_name to reference other fields'\r\n },\r\n ]),\r\n FLAGS_SECTION,\r\n ADVANCED_SECTION,\r\n ),\r\n \r\n // ── GROUP & SECTION ───────────────────────────────────────────────────────\r\n group: buildSchema(\r\n section('Group Settings', [\r\n row(F.label, F.name),\r\n row(F.colSpan),\r\n F.isEnabled,\r\n ]),\r\n ADVANCED_SECTION,\r\n ),\r\n\r\n section: buildSchema(\r\n section('Section Settings', [\r\n row(F.label, F.name),\r\n F.isEnabled,\r\n ]),\r\n ADVANCED_SECTION,\r\n ),\r\n};\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ConfiguratorTreeNode } from '../../../models/field-configurator.models';\r\n\r\n@Component({\r\n selector: 'lib-configurator-tree',\r\n standalone: false,\r\n templateUrl: './configurator-tree.component.html',\r\n styleUrls: ['./configurator-tree.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ConfiguratorTreeComponent {\r\n @Input() tree: ConfiguratorTreeNode[] = [];\r\n @Input() selectedFieldPath: number[] | null = null;\r\n\r\n @Output() selectField = new EventEmitter<number[]>();\r\n @Output() toggleExpanded = new EventEmitter<string>();\r\n\r\n onNodeClick(node: ConfiguratorTreeNode): void {\r\n if (node.type === 'field') {\r\n this.selectField.emit(node.path);\r\n } else {\r\n this.toggleExpanded.emit(node.id);\r\n }\r\n }\r\n\r\n onFieldSelect(node: ConfiguratorTreeNode): void {\r\n this.selectField.emit(node.path);\r\n }\r\n\r\n onToggleExpand(node: ConfiguratorTreeNode, event: Event): void {\r\n event.stopPropagation();\r\n this.toggleExpanded.emit(node.id);\r\n }\r\n\r\n isSelected(node: ConfiguratorTreeNode): boolean {\r\n if (!this.selectedFieldPath || !node.path) return false;\r\n return this.pathsEqual(node.path, this.selectedFieldPath);\r\n }\r\n\r\n trackByNodeId(_index: number, node: ConfiguratorTreeNode): string {\r\n return node.id;\r\n }\r\n\r\n private pathsEqual(a: number[], b: number[]): boolean {\r\n if (a.length !== b.length) return false;\r\n return a.every((v, i) => v === b[i]);\r\n }\r\n}\r\n","<div class=\"fb-cfg-tree\">\r\n <div class=\"fb-cfg-tree__header\">\r\n <h4 class=\"fb-cfg-tree__title\">Field Tree</h4>\r\n <p class=\"fb-cfg-tree__subtitle\">Select a field to configure</p>\r\n </div>\r\n\r\n <div class=\"fb-cfg-tree__scrollable\">\r\n @for (node of tree; track trackByNodeId($index, node)) {\r\n <ng-container *ngTemplateOutlet=\"treeNodeTpl; context: { $implicit: node, depth: 0 }\"></ng-container>\r\n }\r\n\r\n @if (tree.length === 0) {\r\n <div class=\"fb-cfg-tree__empty\">\r\n No fields to configure.\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n\r\n<!-- Recursive tree node template -->\r\n<ng-template #treeNodeTpl let-node let-depth=\"depth\">\r\n @if (node.type === 'field') {\r\n <!-- Field node (clickable leaf) -->\r\n <div\r\n class=\"fb-cfg-tree-item\"\r\n [class.fb-cfg-tree-item--active]=\"isSelected(node)\"\r\n (click)=\"onFieldSelect(node)\"\r\n [style.padding-left.px]=\"16 + depth * 16\"\r\n >\r\n <span class=\"fb-cfg-tree-item__drag\" title=\"Drag to reorder\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n <circle cx=\"9\" cy=\"5\" r=\"1\"/><circle cx=\"9\" cy=\"12\" r=\"1\"/>\r\n <circle cx=\"9\" cy=\"19\" r=\"1\"/><circle cx=\"15\" cy=\"5\" r=\"1\"/>\r\n <circle cx=\"15\" cy=\"12\" r=\"1\"/><circle cx=\"15\" cy=\"19\" r=\"1\"/>\r\n </svg>\r\n </span>\r\n <div class=\"fb-cfg-tree-item__content\">\r\n <span class=\"fb-cfg-tree-item__label\">{{ node.label }}</span>\r\n @if (node.fieldConfig?.type) {\r\n <span class=\"fb-cfg-tree-item__type\">{{ node.fieldConfig.type }}</span>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <!-- Group or Section node (expandable) -->\r\n <div\r\n class=\"fb-cfg-tree-section\"\r\n [style.padding-left.px]=\"8 + depth * 12\"\r\n >\r\n <div class=\"fb-cfg-tree-section__header\" (click)=\"onNodeClick(node)\">\r\n <div class=\"fb-cfg-tree-section__title-group\">\r\n <span\r\n class=\"fb-cfg-tree-section__chevron\"\r\n [class.fb-cfg-tree-section__chevron--expanded]=\"node.expanded\"\r\n >\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n <polyline points=\"9 18 15 12 9 6\"></polyline>\r\n </svg>\r\n </span>\r\n <span class=\"fb-cfg-tree-section__label\">{{ node.label }}</span>\r\n </div>\r\n </div>\r\n\r\n @if (node.expanded && node.children.length > 0) {\r\n <div class=\"fb-cfg-tree-section__children\">\r\n @for (child of node.children; track trackByNodeId($index, child)) {\r\n <ng-container *ngTemplateOutlet=\"treeNodeTpl; context: { $implicit: child, depth: depth + 1 }\"></ng-container>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { FieldConfig, FormSchema } from '../../../../smart-form/models/form-schema.model';\r\nimport { ConfiguratorFieldInfo } from '../../../models/field-configurator.models';\r\nimport { SWITCHABLE_FIELD_TYPES } from '../../../utils/constants';\r\n\r\n@Component({\r\n selector: 'lib-configurator-config-panel',\r\n standalone: false,\r\n templateUrl: './configurator-config-panel.component.html',\r\n styleUrls: ['./configurator-config-panel.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ConfiguratorConfigPanelComponent implements OnChanges {\r\n constructor(private cdr: ChangeDetectorRef) {}\r\n\r\n @Input() selectedField: FieldConfig | null = null;\r\n @Input() selectedFieldInfo: ConfiguratorFieldInfo | null = null;\r\n @Input() builderFieldType: string | null = null;\r\n @Input() fieldTypeSchemaMap: Record<string, FormSchema> = {};\r\n\r\n @Output() configChange = new EventEmitter<Record<string, unknown>>();\r\n @Output() typeChange = new EventEmitter<string>();\r\n\r\n /** Exposed to the template for the native type-switcher select */\r\n readonly switchableFieldTypes = SWITCHABLE_FIELD_TYPES;\r\n\r\n configFormJson: string = '';\r\n configInitialValues: Record<string, unknown> = {};\r\n showConfigForm: boolean = false;\r\n\r\n /**\r\n * The type currently being PREVIEWED in the config form.\r\n * Starts equal to builderFieldType; changes as user picks a new type.\r\n * Emitted to the parent on Apply.\r\n */\r\n currentBuilderType: string | null = null;\r\n\r\n /** Identity key of the currently rendered field — used to detect real field switches. */\r\n private _currentFieldKey: string = '';\r\n\r\n /** True when the current field type is DROPDOWN — type switching is disabled for these fields. */\r\n get isDropdownType(): boolean {\r\n const t = this.selectedField?.type?.toUpperCase();\r\n return t === 'DROPDOWN' || t === 'MULTI_SELECT';\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (\r\n (changes['selectedField'] || changes['builderFieldType'] || changes['fieldTypeSchemaMap'])\r\n && this.selectedField\r\n && this.builderFieldType\r\n ) {\r\n const key = `${this.selectedField.name}__${this.builderFieldType}`;\r\n if (key !== this._currentFieldKey) {\r\n this._currentFieldKey = key;\r\n // Reset the previewed type whenever we switch to a different field\r\n this.currentBuilderType = this.builderFieldType;\r\n this._buildConfigFormForType(this.builderFieldType);\r\n }\r\n }\r\n }\r\n\r\n // ─── Type Switcher ────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Called when the user picks a new type from the native select in the header.\r\n * Immediately rebuilds the config form to show fields for the new type.\r\n * The actual field-level type change is only committed when Apply is clicked.\r\n */\r\n onTypeSelectChange(event: Event): void {\r\n const newType = (event.target as HTMLSelectElement).value;\r\n if (!newType || newType === this.currentBuilderType) return;\r\n if (!this.fieldTypeSchemaMap[newType]) {\r\n console.warn(`[ConfigPanel] No schema found for field type: ${newType}`);\r\n return;\r\n }\r\n this.currentBuilderType = newType;\r\n this._buildConfigFormForType(newType);\r\n }\r\n\r\n // ─── Form Actions ─────────────────────────────────────────────────────────\r\n\r\n onActionClick(event: { id: string; formData: Record<string, unknown> }): void {\r\n if (event.id === 'apply') {\r\n const patch = this._buildPatchFromFormData(event.formData);\r\n\r\n // Emit type change only if the user picked a different type\r\n if (this.currentBuilderType && this.currentBuilderType !== this.builderFieldType) {\r\n this.typeChange.emit(this.currentBuilderType);\r\n }\r\n\r\n this.configChange.emit(patch);\r\n }\r\n }\r\n\r\n // ─── Private: Build the config form JSON ─────────────────────────────────\r\n\r\n /**\r\n * Rebuild the SmartForm for the given builder type key.\r\n * Uses a destroy/recreate cycle (showConfigForm toggle + setTimeout) to\r\n * guarantee a completely fresh SmartForm instance is mounted.\r\n */\r\n private _buildConfigFormForType(builderType: string): void {\r\n if (!this.fieldTypeSchemaMap || !this.selectedField) return;\r\n\r\n const schema = this.fieldTypeSchemaMap[builderType];\r\n if (!schema) {\r\n this.showConfigForm = false;\r\n this.configFormJson = '';\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n\r\n // 1. Destroy current SmartForm instance\r\n this.showConfigForm = false;\r\n this.cdr.detectChanges();\r\n\r\n // 2. Prepare new schema + initial values\r\n this.configFormJson = JSON.stringify(schema);\r\n this.configInitialValues = this._extractInitialValuesFromField(this.selectedField);\r\n\r\n // 3. Re-mount on next tick\r\n setTimeout(() => {\r\n this.showConfigForm = true;\r\n this.cdr.detectChanges();\r\n });\r\n }\r\n\r\n // ─── Private: Extract initial values from FieldConfig ─────────────────────\r\n\r\n private _extractInitialValuesFromField(field: FieldConfig): Record<string, unknown> {\r\n const v: Record<string, unknown> = {};\r\n\r\n const set = (key: string, val: unknown) => {\r\n if (val !== undefined && val !== null) v[key] = val;\r\n };\r\n\r\n // ── Common FieldConfig properties ─────────────────────────────────────────\r\n set('label', field.label);\r\n set('name', field.name);\r\n set('colSpan', field.colSpan);\r\n set('placeholder', field.placeholder);\r\n set('hint', field.hint);\r\n set('defaultValue', field.defaultValue);\r\n set('payloadPath', field.payloadPath);\r\n set('className', field.className);\r\n set('prefix', field.prefix);\r\n set('suffix', field.suffix);\r\n set('required', field.required);\r\n set('readonly', field.readonly);\r\n set('disabled', field.disabled);\r\n set('isEnabled', field.isEnabled ?? field.visible);\r\n set('errorMessage', field.errorMessage);\r\n set('visibilityExpression', field.visibilityExpression);\r\n\r\n if (field.textConfig) {\r\n const tc = field.textConfig;\r\n set('textConfig.length.min', tc.length?.min);\r\n set('textConfig.length.max', tc.length?.max);\r\n set('textConfig.pattern', tc.pattern);\r\n set('textConfig.patternMessage', tc.patternMessage);\r\n set('textConfig.showCharCount', tc.showCharCount);\r\n set('textConfig.matchField', tc.matchField);\r\n }\r\n if (field.emailConfig) {\r\n const ec = field.emailConfig;\r\n set('emailConfig.defaultDomain', ec.defaultDomain);\r\n set('emailConfig.allowedDomains', ec.allowedDomains?.join(', '));\r\n set('emailConfig.blockedDomains', ec.blockedDomains?.join(', '));\r\n }\r\n if (field.phoneConfig) {\r\n const pc = field.phoneConfig;\r\n set('phoneConfig.defaultCountryCode', pc.defaultCountryCode);\r\n set('phoneConfig.prefixCountryCode', pc.prefixCountryCode);\r\n set('phoneConfig.supportedCountryCodeLocale', pc.supportedCountryCodeLocale?.join(', '));\r\n }\r\n if (field.numberConfig) {\r\n const nc = field.numberConfig;\r\n set('numberConfig.min', nc.min);\r\n set('numberConfig.max', nc.max);\r\n set('numberConfig.step', nc.step);\r\n set('numberConfig.precision', nc.precision);\r\n }\r\n if (field.dateConfig) {\r\n const dc = field.dateConfig;\r\n set('dateConfig.minDate', dc.minDate);\r\n set('dateConfig.maxDate', dc.maxDate);\r\n set('dateConfig.allowFuture', dc.allowFuture);\r\n }\r\n if (field.optionConfig) {\r\n const oc = field.optionConfig;\r\n if (oc.optionList?.length) set('optionConfig.optionList', JSON.stringify(oc.optionList, null, 2));\r\n set('optionConfig.apiUrl', oc.apiUrl || oc.optionUrl);\r\n set('optionConfig.dataPath', oc.dataPath);\r\n set('optionConfig.labelPath', oc.labelPath);\r\n set('optionConfig.valuePath', oc.valuePath);\r\n set('optionConfig.sortBy', oc.sortBy);\r\n set('optionConfig.layout', oc.layout);\r\n }\r\n if (field.attachmentConfig) {\r\n const ac = field.attachmentConfig;\r\n set('attachmentConfig.multiple', ac.multiple);\r\n set('attachmentConfig.maxFiles', ac.maxFiles);\r\n set('attachmentConfig.maxSizeMB', ac.maxSizeMB);\r\n set('attachmentConfig.accept', ac.accept);\r\n set('attachmentConfig.acceptLabel', ac.acceptLabel);\r\n set('attachmentConfig.uploadUrl', ac.uploadUrl);\r\n set('attachmentConfig.deleteUrl', ac.deleteUrl);\r\n }\r\n if (field.richTextConfig) {\r\n const rc = field.richTextConfig;\r\n set('richTextConfig.height', rc.height);\r\n set('richTextConfig.maxLength', rc.maxLength);\r\n set('richTextConfig.placeholder', rc.placeholder);\r\n set('richTextConfig.showCharCount', rc.showCharCount);\r\n }\r\n if (field.ratingConfig) {\r\n const rat = field.ratingConfig;\r\n set('ratingConfig.maxRating', rat.maxRating);\r\n set('ratingConfig.allowHalf', rat.allowHalf);\r\n }\r\n if (field.locationConfig) {\r\n const lc = field.locationConfig;\r\n set('locationConfig.defaultTab', lc.defaultTab);\r\n set('locationConfig.maxLocations', lc.maxLocations);\r\n set('locationConfig.allowMulti', lc.allowMulti);\r\n set('locationConfig.showMap', lc.showMap);\r\n set('locationConfig.googleMapsApiKey', lc.googleMapsApiKey);\r\n set('locationConfig.venuePlaceholder', lc.venuePlaceholder);\r\n set('locationConfig.onlinePlaceholder', lc.onlinePlaceholder);\r\n }\r\n\r\n return v;\r\n }\r\n\r\n // ─── Private: Convert flat dot-notation form data → nested FieldConfig patch\r\n\r\n private _buildPatchFromFormData(formData: Record<string, unknown>): Record<string, unknown> {\r\n const patch: Record<string, unknown> = {};\r\n\r\n const setNested = (obj: any, dotPath: string, val: unknown): void => {\r\n const parts = dotPath.split('.');\r\n let cur = obj;\r\n for (let i = 0; i < parts.length - 1; i++) {\r\n const part = parts[i];\r\n if (typeof cur[part] !== 'object' || cur[part] === null) {\r\n cur[part] = {};\r\n }\r\n cur = cur[part];\r\n }\r\n cur[parts[parts.length - 1]] = val;\r\n };\r\n\r\n const flatData: Record<string, unknown> = {};\r\n for (const [key, val] of Object.entries(formData)) {\r\n if (val !== null && typeof val === 'object' && !Array.isArray(val)) {\r\n for (const [innerKey, innerVal] of Object.entries(val as Record<string, unknown>)) {\r\n flatData[innerKey] = innerVal;\r\n }\r\n } else {\r\n flatData[key] = val;\r\n }\r\n }\r\n\r\n for (const [key, val] of Object.entries(flatData)) {\r\n if (val === null || val === undefined) continue;\r\n if (key.startsWith('row-')) continue;\r\n setNested(patch, key, val);\r\n }\r\n\r\n // Post-process: parse JSON strings for optionConfig.optionList\r\n if (patch['optionConfig'] && (patch['optionConfig'] as any)['optionList']) {\r\n try {\r\n const raw = (patch['optionConfig'] as any)['optionList'];\r\n if (typeof raw === 'string') {\r\n (patch['optionConfig'] as any)['optionList'] = JSON.parse(raw);\r\n }\r\n } catch {\r\n // Ignore invalid JSON — leave as-is\r\n }\r\n }\r\n\r\n // Post-process: split comma-separated strings for email/phone arrays\r\n if (patch['emailConfig']) {\r\n const ec = patch['emailConfig'] as any;\r\n if (typeof ec['allowedDomains'] === 'string') ec['allowedDomains'] = ec['allowedDomains'].split(',').map((s: string) => s.trim()).filter(Boolean);\r\n if (typeof ec['blockedDomains'] === 'string') ec['blockedDomains'] = ec['blockedDomains'].split(',').map((s: string) => s.trim()).filter(Boolean);\r\n }\r\n if (patch['phoneConfig']) {\r\n const pc = patch['phoneConfig'] as any;\r\n if (typeof pc['supportedCountryCodeLocale'] === 'string') {\r\n pc['supportedCountryCodeLocale'] = pc['supportedCountryCodeLocale'].split(',').map((s: string) => s.trim()).filter(Boolean);\r\n }\r\n }\r\n\r\n return patch;\r\n }\r\n}\r\n","<div class=\"fb-config-panel\">\r\n @if (!selectedField) {\r\n <div class=\"fb-config-panel__empty\">\r\n <div class=\"fb-config-panel__empty-icon\">\r\n <svg width=\"64\" height=\"64\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/>\r\n <line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"/>\r\n <line x1=\"9\" y1=\"21\" x2=\"9\" y2=\"9\"/>\r\n </svg>\r\n </div>\r\n <p class=\"fb-config-panel__empty-text\">\r\n Select a field from the tree panel to edit its configuration.\r\n </p>\r\n </div>\r\n } @else {\r\n <div class=\"fb-config-panel__header\">\r\n <div class=\"fb-config-panel__header-left\">\r\n <h3 class=\"fb-config-panel__title\">\r\n {{ selectedField.label || selectedField.name || 'Field Settings' }}\r\n </h3>\r\n @if (selectedField.type) {\r\n <span class=\"fb-config-panel__badge\">{{ selectedField.type }}</span>\r\n }\r\n </div>\r\n\r\n <!-- Field Type Switcher: hidden for DROPDOWN / MULTI_SELECT fields -->\r\n @if (!isDropdownType) {\r\n <div class=\"fb-config-panel__type-switcher\">\r\n <label class=\"fb-config-panel__type-label\" for=\"fb-field-type-select\">Field Type</label>\r\n <select\r\n id=\"fb-field-type-select\"\r\n class=\"fb-config-panel__type-select\"\r\n [value]=\"currentBuilderType\"\r\n (change)=\"onTypeSelectChange($event)\"\r\n >\r\n @for (opt of switchableFieldTypes; track opt.value) {\r\n <option [value]=\"opt.value\">{{ opt.label }}</option>\r\n }\r\n </select>\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"fb-config-panel__form-wrapper\">\r\n @if (showConfigForm && configFormJson) {\r\n <div class=\"fb-config-card\">\r\n <lib-smart-form\r\n [formJson]=\"configFormJson\"\r\n [initialValues]=\"configInitialValues\"\r\n (actionClick)=\"onActionClick($event)\"\r\n />\r\n </div>\r\n } @else if (!showConfigForm) {\r\n <!-- intentionally empty — SmartForm is being recycled -->\r\n } @else {\r\n <div class=\"fb-config-panel__error\">\r\n No configuration schema available for this field type.\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n OnChanges,\r\n SimpleChanges,\r\n inject,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormSchema } from '../../../smart-form/models/form-schema.model';\r\nimport { SmartFormModule } from '../../../smart-form/smart-form.module';\r\nimport { FieldConfiguratorService } from '../../services/field-configurator.service';\r\nimport { ConfiguratorTreeComponent } from './configurator-tree/configurator-tree.component';\r\nimport { ConfiguratorConfigPanelComponent } from './configurator-config-panel/configurator-config-panel.component';\r\nimport { BUILDER_FIELD_TYPE_SCHEMA_MAP } from '../../tokens/builder.tokens';\r\nimport { DEFAULT_FIELD_TYPE_SCHEMA_MAP } from '../../configs/field-type-schema.map';\r\n\r\n@Component({\r\n selector: 'lib-field-configurator',\r\n standalone: false,\r\n providers: [FieldConfiguratorService],\r\n templateUrl: './field-configurator.component.html',\r\n styleUrls: ['./field-configurator.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FieldConfiguratorComponent implements OnChanges {\r\n @Input({ required: true }) schema!: FormSchema;\r\n @Output() schemaChange = new EventEmitter<FormSchema>();\r\n\r\n readonly store = inject(FieldConfiguratorService);\r\n private readonly schemaMapOverride = inject(BUILDER_FIELD_TYPE_SCHEMA_MAP, { optional: true });\r\n\r\n /**\r\n * Merged field-type → config-schema map (defaults + optional overrides).\r\n * Memoized to avoid triggering ngOnChanges in children due to new object references.\r\n */\r\n finalFieldTypeSchemaMap: Record<string, FormSchema> = { ...DEFAULT_FIELD_TYPE_SCHEMA_MAP, ...(this.schemaMapOverride ?? {}) } as any;\r\n\r\n private _isInternalChange = false;\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['schema'] && this.schema) {\r\n this.store.loadSchema(this.schema, this._isInternalChange);\r\n this._isInternalChange = false;\r\n }\r\n }\r\n\r\n onFieldSelected(path: number[]): void {\r\n this.store.selectField(path);\r\n }\r\n\r\n onNodeToggleExpanded(nodeId: string): void {\r\n this.store.toggleNodeExpanded(nodeId);\r\n }\r\n\r\n onConfigChange(patch: Record<string, unknown>): void {\r\n this._isInternalChange = true;\r\n this.store.patchSelectedField(patch as any);\r\n this._emitChange();\r\n }\r\n\r\n onTypeChange(builderType: string): void {\r\n this._isInternalChange = true;\r\n this.store.changeFieldType(builderType);\r\n this._emitChange();\r\n }\r\n\r\n private _emitChange(): void {\r\n const updated = this.store.getCurrentSchema();\r\n if (updated) {\r\n this.schemaChange.emit(updated);\r\n }\r\n }\r\n}\r\n","<div class=\"fb-configurator\">\r\n <div class=\"fb-configurator__layout\">\r\n <div class=\"fb-configurator__sidebar\">\r\n <lib-configurator-tree\r\n [tree]=\"store.tree()\"\r\n [selectedFieldPath]=\"store.selectedFieldPath()\"\r\n (selectField)=\"onFieldSelected($event)\"\r\n (toggleExpanded)=\"onNodeToggleExpanded($event)\"\r\n />\r\n </div>\r\n\r\n <div class=\"fb-configurator__main\">\r\n <lib-configurator-config-panel\r\n [selectedField]=\"store.selectedField()\"\r\n [selectedFieldInfo]=\"store.selectedFieldInfo()\"\r\n [builderFieldType]=\"store.selectedFieldBuilderType()\"\r\n [fieldTypeSchemaMap]=\"finalFieldTypeSchemaMap\"\r\n (configChange)=\"onConfigChange($event)\"\r\n (typeChange)=\"onTypeChange($event)\"\r\n />\r\n </div>\r\n </div>\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SmartFormModule } from '../smart-form/smart-form.module';\r\nimport { FormComponentsModule } from '../form-components/form-components.module';\r\n\r\nimport { FieldSelectionComponent } from './components/field-selection/field-selection.component';\r\nimport { FieldConfiguratorComponent } from './components/field-configurator/field-configurator.component';\r\nimport { GroupNodeComponent } from './components/field-selection/group-node/group-node.component';\r\nimport { SelectionSectionNodeComponent } from './components/field-selection/selection-section-node/selection-section-node.component';\r\nimport { SelectionFieldNodeComponent } from './components/field-selection/selection-field-node/selection-field-node.component';\r\nimport { ConfiguratorTreeComponent } from './components/field-configurator/configurator-tree/configurator-tree.component';\r\nimport { ConfiguratorConfigPanelComponent } from './components/field-configurator/configurator-config-panel/configurator-config-panel.component';\r\n\r\nconst COMPONENTS = [\r\n FieldSelectionComponent,\r\n FieldConfiguratorComponent,\r\n GroupNodeComponent,\r\n SelectionSectionNodeComponent,\r\n SelectionFieldNodeComponent,\r\n ConfiguratorTreeComponent,\r\n ConfiguratorConfigPanelComponent,\r\n];\r\n\r\n@NgModule({\r\n declarations: [...COMPONENTS],\r\n imports: [\r\n CommonModule,\r\n SmartFormModule,\r\n FormComponentsModule,\r\n ],\r\n exports: [\r\n FieldSelectionComponent,\r\n FieldConfiguratorComponent,\r\n ],\r\n})\r\nexport class FormBuilderModule {}\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n OnInit,\r\n OnDestroy,\r\n HostListener\r\n} from '@angular/core';\r\nimport { ConfirmationModalConfig } from '../../confirmation-modal.models';\r\n\r\n@Component({\r\n selector: 'cc-confirmation-modal',\r\n templateUrl: './confirmation-modal.component.html',\r\n styleUrls: ['./confirmation-modal.component.scss'],\r\n standalone: false\r\n})\r\nexport class ConfirmationModalComponent implements OnInit, OnDestroy {\r\n @Input() config!: ConfirmationModalConfig;\r\n @Input() isOpen = false;\r\n\r\n @Output() confirm = new EventEmitter<void>();\r\n @Output() cancel = new EventEmitter<void>();\r\n @Output() close = new EventEmitter<void>();\r\n @Output() showCodeSnippet = new EventEmitter<void>();\r\n\r\n // Default configuration\r\n private defaultConfig: Partial<ConfirmationModalConfig> = {\r\n headerTheme: 'dark', // Changed to dark as per new default requirement\r\n width: '560px',\r\n size: 'md',\r\n closeOnBackdrop: true,\r\n closeOnEsc: true,\r\n showCloseButton: true,\r\n cancelButton: {\r\n label: '',\r\n show: true\r\n }\r\n };\r\n\r\n mergedConfig!: ConfirmationModalConfig;\r\n private previousActiveElement: HTMLElement | null = null;\r\n\r\n ngOnInit(): void {\r\n this.updateConfig();\r\n\r\n // Store currently focused element\r\n this.previousActiveElement = document.activeElement as HTMLElement;\r\n\r\n // Prevent body scroll when modal is open\r\n if (this.isOpen) {\r\n this.toggleBodyScroll(true);\r\n }\r\n }\r\n\r\n ngOnChanges(): void {\r\n this.updateConfig();\r\n if (this.isOpen !== undefined) {\r\n this.toggleBodyScroll(this.isOpen);\r\n }\r\n }\r\n\r\n private updateConfig(): void {\r\n // Merge user config with defaults\r\n this.mergedConfig = {\r\n ...this.defaultConfig,\r\n ...this.config,\r\n cancelButton: {\r\n ...this.defaultConfig.cancelButton,\r\n ...this.config.cancelButton\r\n },\r\n confirmButton: {\r\n ...this.config.confirmButton\r\n }\r\n };\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Restore body scroll\r\n this.toggleBodyScroll(false);\r\n\r\n // Restore focus to previous element\r\n if (this.previousActiveElement) {\r\n this.previousActiveElement.focus();\r\n }\r\n }\r\n\r\n private toggleBodyScroll(disable: boolean): void {\r\n if (disable) {\r\n document.body.style.overflow = 'hidden';\r\n } else {\r\n document.body.style.overflow = '';\r\n }\r\n }\r\n\r\n @HostListener('document:keydown.escape', ['$event'])\r\n handleEscape(event: KeyboardEvent): void {\r\n if (this.isOpen && this.mergedConfig.closeOnEsc) {\r\n event.preventDefault();\r\n this.onClose();\r\n }\r\n }\r\n\r\n onBackdropClick(event: MouseEvent): void {\r\n // Only close if clicking directly on backdrop, not modal content\r\n if (\r\n this.mergedConfig.closeOnBackdrop &&\r\n event.target === event.currentTarget\r\n ) {\r\n this.onClose();\r\n }\r\n }\r\n\r\n onConfirm(): void {\r\n if (!this.mergedConfig.confirmButton.disabled &&\r\n !this.mergedConfig.confirmButton.loading) {\r\n this.confirm.emit();\r\n }\r\n }\r\n\r\n onCancel(): void {\r\n this.cancel.emit();\r\n }\r\n\r\n onClose(): void {\r\n this.close.emit();\r\n }\r\n\r\n onShowCodeSnippet(): void {\r\n this.showCodeSnippet.emit();\r\n }\r\n\r\n getModalWidth(): string {\r\n if (this.mergedConfig.size) {\r\n const sizeMap: Record<string, string> = {\r\n sm: '400px',\r\n md: '560px',\r\n lg: '720px'\r\n };\r\n return sizeMap[this.mergedConfig.size];\r\n }\r\n return this.mergedConfig.width || '560px';\r\n }\r\n\r\n getConfirmButtonClass(): string {\r\n const typeMap: Record<string, string> = {\r\n primary: 'cc-btn-primary',\r\n danger: 'cc-btn-danger',\r\n warning: 'cc-btn-warning'\r\n };\r\n return `cc-btn ${typeMap[this.mergedConfig.confirmButton.type]}`;\r\n }\r\n\r\n getHeaderClass(): string {\r\n return `modal-header modal-header--${this.mergedConfig.headerTheme}`;\r\n }\r\n\r\n resolveIconType(icon: any): 'material' | 'custom' | 'img' {\r\n if (typeof icon === 'string') {\r\n if (icon.includes('/') || icon.includes('.') || icon.startsWith('http')) {\r\n return 'img';\r\n }\r\n return 'material';\r\n }\r\n if (icon && typeof icon === 'object') {\r\n if (icon.type === 'custom' || (icon.value && (icon.value.includes('/') || icon.value.includes('.') || icon.value.startsWith('http')))) {\r\n return 'custom';\r\n }\r\n return icon.type || 'material';\r\n }\r\n return 'material';\r\n }\r\n\r\n getIconValue(icon: any): string {\r\n return typeof icon === 'string' ? icon : icon?.value;\r\n }\r\n\r\n getIconColor(icon: any): string | undefined {\r\n return typeof icon === 'object' ? icon.color : undefined;\r\n }\r\n}\r\n","<div *ngIf=\"isOpen\" class=\"cc-modal-backdrop\" (click)=\"onBackdropClick($event)\" role=\"dialog\" [attr.aria-modal]=\"true\"\r\n [attr.aria-labelledby]=\"'modal-title-' + mergedConfig.title\" [attr.aria-label]=\"mergedConfig.ariaLabel\"\r\n [attr.aria-describedby]=\"mergedConfig.ariaDescribedBy\">\r\n\r\n <div class=\"cc-modal-container {{ mergedConfig.customClass }}\" [style.width]=\"getModalWidth()\"\r\n [style.background-color]=\"mergedConfig.backgroundColor\" [style.border-radius]=\"mergedConfig.borderRadius\"\r\n [style.border-top-left-radius]=\"mergedConfig.borderTopLeftRadius\"\r\n [style.border-top-right-radius]=\"mergedConfig.borderTopRightRadius\"\r\n [style.border-bottom-left-radius]=\"mergedConfig.borderBottomLeftRadius\"\r\n [style.border-bottom-right-radius]=\"mergedConfig.borderBottomRightRadius\" (click)=\"$event.stopPropagation()\">\r\n\r\n <!-- Header -->\r\n <div [ngClass]=\"getHeaderClass()\" [style.background-color]=\"mergedConfig.headerBackgroundColor\"\r\n [style.border-bottom]=\"mergedConfig.headerBorderBottom\">\r\n <div class=\"modal-header__content\">\r\n <!-- Icon (Optional) -->\r\n <span *ngIf=\"mergedConfig.icon\" class=\"modal-header__icon\">\r\n <ng-container [ngSwitch]=\"resolveIconType(mergedConfig.icon)\">\r\n <mat-icon *ngSwitchCase=\"'material'\" [style.color]=\"getIconColor(mergedConfig.icon)\">\r\n {{ getIconValue(mergedConfig.icon) }}\r\n </mat-icon>\r\n <img *ngSwitchCase=\"'custom'\" [src]=\"getIconValue(mergedConfig.icon)\"\r\n [attr.alt]=\"mergedConfig.labels?.iconAltText || mergedConfig.title + ' icon'\"\r\n class=\"modal-header__custom-icon\">\r\n <img *ngSwitchCase=\"'img'\" [src]=\"getIconValue(mergedConfig.icon)\"\r\n [attr.alt]=\"mergedConfig.labels?.iconAltText || mergedConfig.title + ' icon'\"\r\n class=\"modal-header__custom-icon\">\r\n </ng-container>\r\n </span>\r\n\r\n <!-- Title -->\r\n <h2 class=\"modal-header__title\" [id]=\"'modal-title-' + mergedConfig.title\"\r\n [style.color]=\"mergedConfig.headerTextColor\">\r\n {{ mergedConfig.title }}\r\n </h2>\r\n </div>\r\n\r\n <!-- Code Snippet Button -->\r\n <button *ngIf=\"mergedConfig.showCodeSnippetButton\" type=\"button\" class=\"modal-header__code-btn\"\r\n (click)=\"onShowCodeSnippet()\" [attr.aria-label]=\"mergedConfig.labels?.codeSnippetAriaLabel\"\r\n [attr.title]=\"mergedConfig.labels?.codeSnippetTitle\">\r\n <mat-icon>code</mat-icon>\r\n </button>\r\n\r\n <!-- Close Button -->\r\n <button *ngIf=\"mergedConfig.showCloseButton\" type=\"button\" class=\"modal-header__close\" (click)=\"onClose()\"\r\n [attr.aria-label]=\"mergedConfig.labels?.closeAriaLabel\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Body (Content Projection) -->\r\n <div class=\"cc-modal-body\" [style.padding]=\"mergedConfig.padding\" [style.color]=\"mergedConfig.bodyTextColor\">\r\n <ng-content></ng-content>\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div class=\"cc-modal-footer\" [style.background-color]=\"mergedConfig.footerBackgroundColor\"\r\n [style.border-top]=\"mergedConfig.footerBorderTop\">\r\n\r\n <ng-container *ngIf=\"!mergedConfig.customFooter\">\r\n <button *ngIf=\"mergedConfig.cancelButton?.show\" type=\"button\" class=\"cc-btn cc-btn-secondary\"\r\n (click)=\"onCancel()\">\r\n {{ mergedConfig.cancelButton?.label }}\r\n </button>\r\n\r\n <button type=\"button\" [ngClass]=\"getConfirmButtonClass()\"\r\n [disabled]=\"mergedConfig.confirmButton.disabled || mergedConfig.confirmButton.loading\"\r\n (click)=\"onConfirm()\">\r\n <span *ngIf=\"mergedConfig.confirmButton.loading\" class=\"cc-btn-spinner\"></span>\r\n {{ mergedConfig.confirmButton.label }}\r\n </button>\r\n </ng-container>\r\n\r\n <ng-content select=\"[cc-modal-footer]\"></ng-content>\r\n </div>\r\n </div>\r\n</div>","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n HostListener,\r\n ElementRef\r\n} from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { DropdownAction } from '../../button-dropdown.models';\r\nimport { ButtonVariant } from '../../../button/button.models';\r\nimport { ConfirmationModalConfig } from '../../../confirmation-modal/confirmation-modal.models';\r\n\r\n@Component({\r\n selector: 'lib-button-dropdown',\r\n templateUrl: './button-dropdown.component.html',\r\n styleUrls: ['./button-dropdown.component.scss'],\r\n standalone: false\r\n})\r\nexport class ButtonDropdownComponent {\r\n @Input() label: string = 'Actions';\r\n @Input() variant: ButtonVariant = 'primary';\r\n @Input() menuTheme: 'light' | 'dark' = 'light';\r\n @Input() icon: string = 'fa fa-chevron-down';\r\n @Input() actions: DropdownAction[] = [];\r\n @Input() data: any = null;\r\n @Input() disabled: boolean = false;\r\n\r\n @Output() apiActionStart = new EventEmitter<DropdownAction>();\r\n @Output() apiActionSuccess = new EventEmitter<{ action: DropdownAction, response: any }>();\r\n @Output() apiActionError = new EventEmitter<{ action: DropdownAction, error: any }>();\r\n @Output() actionClick = new EventEmitter<{ action: DropdownAction, data: any }>();\r\n\r\n isOpen = false;\r\n isConfirmModalOpen = false;\r\n pendingAction: DropdownAction | null = null;\r\n confirmConfig: ConfirmationModalConfig | null = null;\r\n confirmMessage: string = '';\r\n\r\n constructor(\r\n private elementRef: ElementRef,\r\n private router: Router,\r\n private http: HttpClient\r\n ) {}\r\n\r\n @HostListener('document:click', ['$event'])\r\n onClickOutside(event: Event) {\r\n if (!this.elementRef.nativeElement.contains(event.target)) {\r\n this.isOpen = false;\r\n }\r\n }\r\n\r\n toggleDropdown(event: Event) {\r\n if (this.disabled) return;\r\n event.stopPropagation();\r\n this.isOpen = !this.isOpen;\r\n }\r\n\r\n onActionItemClick(action: DropdownAction, event: Event) {\r\n event.stopPropagation();\r\n this.isOpen = false;\r\n\r\n if (action.disabled) return;\r\n\r\n if (action.confirmationNeeded) {\r\n this.pendingAction = action;\r\n \r\n // Smart inference for \"delete\" actions\r\n const isDelete = action.apiMethod === 'DELETE' || \r\n action.variant === 'danger' || \r\n action.color === 'red' || \r\n action.label.toLowerCase().includes('delete');\r\n \r\n // Apply intelligent fallbacks based on action intent\r\n this.confirmMessage = action.confirmationMessage || (isDelete \r\n ? 'Are you sure you want to delete this item? This action cannot be undone.' \r\n : 'Are you sure you want to proceed?');\r\n \r\n this.confirmConfig = {\r\n title: action.confirmationTitle || (isDelete ? 'Confirm Deletion' : 'Please Confirm'),\r\n icon: { type: 'material', value: 'warning', color: isDelete ? '#E63E30' : '#F9C80E' },\r\n confirmButton: {\r\n label: isDelete ? 'Delete' : 'Confirm',\r\n type: isDelete ? 'danger' : 'primary'\r\n },\r\n cancelButton: {\r\n show: true,\r\n label: 'Cancel'\r\n }\r\n };\r\n this.isConfirmModalOpen = true;\r\n } else {\r\n this.executeAction(action);\r\n }\r\n }\r\n\r\n private executeAction(action: DropdownAction) {\r\n this.actionClick.emit({ action, data: this.data });\r\n\r\n if (action.type === 'callback' && action.callback) {\r\n action.callback(this.data);\r\n } else if (action.type === 'route' && action.route) {\r\n this.navigateToRoute(action.route, this.data);\r\n } else if (action.type === 'api' && action.apiUrl) {\r\n this.executeApiCall(action);\r\n }\r\n }\r\n\r\n private navigateToRoute(routePattern: string, rowData: any) {\r\n let finalRoute = routePattern;\r\n // Simple parameter replacement like smart-table: /users/:id -> /users/123\r\n if (rowData) {\r\n Object.keys(rowData).forEach(key => {\r\n finalRoute = finalRoute.replace(`:${key}`, rowData[key]);\r\n });\r\n }\r\n this.router.navigate([finalRoute]);\r\n }\r\n\r\n private executeApiCall(action: DropdownAction) {\r\n this.apiActionStart.emit(action);\r\n \r\n let url = action.apiUrl!;\r\n if (this.data) {\r\n Object.keys(this.data).forEach(key => {\r\n url = url.replace(`:${key}`, this.data[key]);\r\n });\r\n }\r\n\r\n const method = (action.apiMethod || 'GET').toUpperCase();\r\n let request$;\r\n\r\n if (method === 'GET') request$ = this.http.get(url);\r\n else if (method === 'POST') request$ = this.http.post(url, action.apiPayload || this.data);\r\n else if (method === 'PUT') request$ = this.http.put(url, action.apiPayload || this.data);\r\n else if (method === 'DELETE') request$ = this.http.delete(url);\r\n else if (method === 'PATCH') request$ = this.http.patch(url, action.apiPayload || this.data);\r\n else request$ = this.http.get(url); // fallback\r\n\r\n request$.subscribe({\r\n next: (res) => this.apiActionSuccess.emit({ action, response: res }),\r\n error: (err) => this.apiActionError.emit({ action, error: err })\r\n });\r\n }\r\n\r\n invokePendingAction() {\r\n if (this.pendingAction) {\r\n this.executeAction(this.pendingAction);\r\n }\r\n this.closeConfirmModal();\r\n }\r\n\r\n closeConfirmModal() {\r\n this.isConfirmModalOpen = false;\r\n this.pendingAction = null;\r\n this.confirmConfig = null;\r\n this.confirmMessage = '';\r\n }\r\n}\r\n","<div class=\"cc-btn-dropdown-container\">\r\n <!-- Main Toggle Button -->\r\n <lib-button \r\n [variant]=\"variant\" \r\n [disabled]=\"disabled\"\r\n (click)=\"toggleDropdown($event)\">\r\n <span class=\"cc-btn-dropdown-content\">\r\n {{ label }}\r\n <i *ngIf=\"icon\" [class]=\"icon\" class=\"cc-btn-dropdown-icon\"></i>\r\n </span>\r\n </lib-button>\r\n\r\n <!-- Dropdown Menu -->\r\n <div class=\"cc-dropdown-menu\" [ngClass]=\"'cc-dropdown-menu--' + menuTheme\" *ngIf=\"isOpen\">\r\n <button \r\n type=\"button\" \r\n class=\"cc-dropdown-item\" \r\n *ngFor=\"let action of actions\"\r\n [disabled]=\"action.disabled\"\r\n [ngClass]=\"action.variant ? 'cc-dropdown-item--' + action.variant : (action.color === 'red' || action.color === 'danger') ? 'cc-dropdown-item--danger' : ''\"\r\n [style.color]=\"action.color && !action.variant && action.color !== 'red' && action.color !== 'danger' ? action.color : null\"\r\n (click)=\"onActionItemClick(action, $event)\">\r\n <i *ngIf=\"action.icon\" [class]=\"action.icon\" class=\"cc-dropdown-item-icon\"></i>\r\n <span>{{ action.label }}</span>\r\n </button>\r\n <div class=\"cc-dropdown-empty\" *ngIf=\"!actions || actions.length === 0\">\r\n No actions available\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Confirmation Modal for Critical Actions -->\r\n<cc-confirmation-modal \r\n *ngIf=\"isConfirmModalOpen\"\r\n [isOpen]=\"isConfirmModalOpen\" \r\n [config]=\"confirmConfig!\"\r\n (confirm)=\"invokePendingAction()\"\r\n (close)=\"closeConfirmModal()\"\r\n (cancel)=\"closeConfirmModal()\">\r\n <p>{{ confirmMessage }}</p>\r\n</cc-confirmation-modal>\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ConfirmationModalComponent } from './components/confirmation-modal/confirmation-modal.component';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\n@NgModule({\r\n declarations: [\r\n ConfirmationModalComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n MatIconModule, // For material icons support\r\n FormsModule // For ngModel in user examples (although mostly projected content, user might need it)\r\n ],\r\n exports: [\r\n ConfirmationModalComponent\r\n ]\r\n})\r\nexport class ConfirmationModalModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { RouterModule } from '@angular/router';\r\nimport { ButtonDropdownComponent } from './components/button-dropdown/button-dropdown.component';\r\nimport { ButtonModule } from '../button/button.module';\r\nimport { ConfirmationModalModule } from '../confirmation-modal/confirmation-modal.module';\r\n\r\n@NgModule({\r\n declarations: [\r\n ButtonDropdownComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n RouterModule,\r\n ButtonModule,\r\n ConfirmationModalModule\r\n ],\r\n exports: [\r\n ButtonDropdownComponent\r\n ]\r\n})\r\nexport class ButtonDropdownModule { }\r\n","import { Component, EventEmitter, Input, OnInit, Output, forwardRef } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\nimport { FilterSidebarChangeEvent, FilterSidebarConfig, FilterSidebarOutput, FilterItem } from '../../filter-sidebar.models';\r\n\r\n@Component({\r\n selector: 'lib-filter-sidebar',\r\n templateUrl: './filter-sidebar.component.html',\r\n styleUrls: ['./filter-sidebar.component.scss'],\r\n standalone: false,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => FilterSidebarComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class FilterSidebarComponent implements OnInit, ControlValueAccessor {\r\n @Input() config!: FilterSidebarConfig;\r\n @Input() initialFilters: FilterSidebarOutput = {};\r\n\r\n @Output() filterChange = new EventEmitter<FilterSidebarChangeEvent>();\r\n @Output() filterApply = new EventEmitter<FilterSidebarOutput>();\r\n @Output() filterClear = new EventEmitter<void>();\r\n @Output() showCodeSnippet = new EventEmitter<void>();\r\n @Output() close = new EventEmitter<void>();\r\n\r\n filters: FilterSidebarOutput = {};\r\n\r\n // ControlValueAccessor callbacks\r\n onChange: any = () => { };\r\n onTouched: any = () => { };\r\n\r\n isCollapsed = false;\r\n\r\n toggleCollapse(): void {\r\n this.isCollapsed = !this.isCollapsed;\r\n }\r\n\r\n constructor(\r\n private router: Router,\r\n private route: ActivatedRoute\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n if (this.initialFilters) {\r\n this.filters = { ...this.initialFilters };\r\n }\r\n\r\n // Initialize from URL query params if persistent\r\n if (this.config.settings?.persistent !== false) {\r\n this.route.queryParams.subscribe(params => {\r\n if (Object.keys(params).length > 0) {\r\n // Start with existing filters to preserve defaults not in URL\r\n const newFilters = { ...this.filters };\r\n\r\n Object.keys(params).forEach(key => {\r\n // Try to parse arrays or numbers if possible, otherwise string\r\n // This is a naive implementation, ideally config should dictate type\r\n const val = params[key];\r\n // If comma separated and looked like array? For now keep simple\r\n newFilters[key] = val;\r\n });\r\n\r\n this.filters = newFilters;\r\n }\r\n });\r\n }\r\n }\r\n\r\n // ControlValueAccessor Implementation\r\n writeValue(value: any): void {\r\n if (value) {\r\n this.filters = { ...value };\r\n } else {\r\n this.filters = {};\r\n }\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n // Component Logic\r\n onValueChange(key: string | undefined, value: any): void {\r\n if (!key) return;\r\n\r\n this.filters[key] = value;\r\n this.notifyChanges(key, value);\r\n }\r\n\r\n private notifyChanges(key: string, value: any): void {\r\n this.onChange(this.filters);\r\n\r\n // Update URL if persistent\r\n if (this.config.settings?.persistent !== false) {\r\n this.updateUrl();\r\n }\r\n\r\n this.filterChange.emit({\r\n key,\r\n value,\r\n allFilters: this.filters\r\n });\r\n }\r\n\r\n private updateUrl(): void {\r\n this.router.navigate([], {\r\n relativeTo: this.route,\r\n queryParams: this.filters,\r\n queryParamsHandling: 'merge',\r\n replaceUrl: true\r\n });\r\n }\r\n\r\n applyFilters(): void {\r\n this.filterApply.emit(this.filters);\r\n }\r\n\r\n clearFilters(): void {\r\n this.filters = {};\r\n this.onChange(this.filters);\r\n\r\n if (this.config.settings?.persistent !== false) {\r\n this.router.navigate([], {\r\n relativeTo: this.route,\r\n queryParams: {},\r\n });\r\n }\r\n\r\n this.filterClear.emit();\r\n }\r\n\r\n onClose(): void {\r\n this.close.emit();\r\n }\r\n\r\n onShowCodeSnippet(): void {\r\n this.showCodeSnippet.emit();\r\n }\r\n\r\n get sidebarStyles(): { [key: string]: string } {\r\n const styles: { [key: string]: string } = {};\r\n if (this.config?.styles) {\r\n if (this.config.styles.width) styles['--cc-filter-sidebar-width'] = this.config.styles.width;\r\n if (this.config.styles.padding) styles['--cc-filter-sidebar-padding'] = this.config.styles.padding;\r\n if (this.config.styles.gap) styles['--cc-filter-sidebar-gap'] = this.config.styles.gap;\r\n if (this.config.styles.backgroundColor) styles['--cc-filter-sidebar-bg'] = this.config.styles.backgroundColor;\r\n if (this.config.styles.headerHeight) styles['--cc-filter-header-height'] = this.config.styles.headerHeight;\r\n if (this.config.styles.borderRadius) styles['--cc-filter-sidebar-border-radius'] = this.config.styles.borderRadius;\r\n }\r\n return styles;\r\n }\r\n\r\n trackByFn(index: number, item: FilterItem): any {\r\n return item.key || index;\r\n }\r\n}\r\n","<div class=\"cc-filter-sidebar\" [ngStyle]=\"sidebarStyles\" [class.collapsed]=\"isCollapsed\">\r\n\r\n <!-- Header -->\r\n <div class=\"cc-filter-header\" *ngIf=\"config.header?.visible !== false\">\r\n <div class=\"cc-header-content\">\r\n <span class=\"cc-header-title\" *ngIf=\"config.header?.title\">\r\n <span *ngIf=\"config.header?.icon\" [class]=\"config.header?.icon\" class=\"cc-header-icon material-icons\">\r\n <!-- {{config.header?.icon }} -->\r\n </span>\r\n {{ config.header?.title }}\r\n </span>\r\n <ng-content select=\"[header-actions]\"></ng-content>\r\n </div>\r\n <button type=\"button\" *ngIf=\"config.settings?.collapsible\" (click)=\"toggleCollapse()\" class=\"cc-icon-btn\"\r\n [attr.aria-label]=\"isCollapsed ? config.labels?.expandAriaLabel : config.labels?.collapseAriaLabel\">\r\n <span class=\"material-icons\">{{ isCollapsed ? 'menu_open' : 'menu' }}</span>\r\n </button>\r\n <button type=\"button\" *ngIf=\"config.header?.showClose && !isCollapsed\" (click)=\"onClose()\"\r\n class=\"cc-icon-btn cc-close-btn\" [attr.aria-label]=\"config.labels?.closeAriaLabel\">\r\n <span class=\"material-icons\">close</span>\r\n </button>\r\n <!-- Code snippet debug (optional) -->\r\n <button type=\"button\" *ngIf=\"config.settings?.showCodeSnippet\" (click)=\"onShowCodeSnippet()\" class=\"cc-icon-btn\"\r\n [attr.aria-label]=\"config.labels?.codeSnippetAriaLabel\">\r\n <span class=\"material-icons\">code</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Content (Scrollable) -->\r\n <div class=\"cc-filter-content\" [class.hidden]=\"isCollapsed\">\r\n <ng-container *ngFor=\"let item of config.items; trackBy: trackByFn\">\r\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { item: item }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div class=\"cc-filter-footer\" *ngIf=\"config.footer?.visible !== false && !isCollapsed\">\r\n <lib-button variant=\"outline\" color=\"warn\" class=\"cc-btn-clear\"\r\n *ngIf=\"config.footer?.clearButton?.visible !== false\" (click)=\"clearFilters()\">\r\n {{ config.footer?.clearButton?.label }}\r\n </lib-button>\r\n <lib-button variant=\"primary\" color=\"warn\" class=\"cc-btn-apply\"\r\n *ngIf=\"config.footer?.applyButton?.visible !== false\" [disabled]=\"config.footer?.applyButton?.disabled ?? false\"\r\n (click)=\"applyFilters()\">\r\n {{ config.footer?.applyButton?.label }}\r\n </lib-button>\r\n </div>\r\n</div>\r\n\r\n<!-- Recursive Template for Items -->\r\n<ng-template #itemTemplate let-item=\"item\">\r\n <div class=\"cc-filter-item\" [ngClass]=\"['type-' + item.type]\"\r\n [style.display]=\"item.visible === false ? 'none' : 'block'\" [ngStyle]=\"item.styles\">\r\n\r\n <ng-container [ngSwitch]=\"item.type\">\r\n\r\n <!-- Input -->\r\n <lib-input *ngSwitchCase=\"'input'\" [config]=\"item.inputConfig\" [label]=\"item.label\"\r\n [ngModel]=\"filters[item.key]\" (valueChange)=\"onValueChange(item.key, $event)\">\r\n </lib-input>\r\n\r\n <!-- Dropdown -->\r\n <lib-dropdown *ngSwitchCase=\"'dropdown'\" [config]=\"item.dropdownConfig\" [label]=\"item.label\"\r\n [ngModel]=\"filters[item.key]\" (selectionChange)=\"onValueChange(item.key, $event)\">\r\n </lib-dropdown>\r\n\r\n <!-- Checkbox -->\r\n <lib-checkbox *ngSwitchCase=\"'checkbox'\" [config]=\"item.checkboxConfig\" [label]=\"item.label\"\r\n [checked]=\"!!filters[item.key]\" (checkedChange)=\"onValueChange(item.key, $event)\">\r\n </lib-checkbox>\r\n\r\n <!-- Radio -->\r\n <lib-radio *ngSwitchCase=\"'radio'\" [config]=\"item.radioConfig\" [label]=\"item.label\"\r\n [ngModel]=\"filters[item.key]\" (selectionChange)=\"onValueChange(item.key, $event)\">\r\n </lib-radio>\r\n\r\n <!-- Toggle -->\r\n <lib-toggle *ngSwitchCase=\"'toggle'\" [config]=\"item.toggleConfig\" [label]=\"item.label\"\r\n [checked]=\"filters[item.key]\" (toggleChange)=\"onValueChange(item.key, $event)\">\r\n </lib-toggle>\r\n\r\n <!-- Datepicker -->\r\n <lib-datepicker *ngSwitchCase=\"'datepicker'\" [config]=\"item.datepickerConfig\" [label]=\"item.label\"\r\n [ngModel]=\"filters[item.key]\" (dateChange)=\"onValueChange(item.key, $event)\">\r\n </lib-datepicker>\r\n\r\n <!-- Search -->\r\n <lib-search *ngSwitchCase=\"'active-search'\" [config]=\"item.searchConfig\" [label]=\"item.label\"\r\n [ngModel]=\"filters[item.key]\" (search)=\"onValueChange(item.key, $event)\">\r\n </lib-search>\r\n\r\n <!-- Group / Accordion -->\r\n <div *ngSwitchCase=\"'group'\" class=\"cc-accordion-item\" [class.expanded]=\"item.expanded\">\r\n <button type=\"button\" class=\"cc-accordion-header\" (click)=\"item.expanded = !item.expanded\">\r\n <span class=\"cc-accordion-title\">{{ item.label }}</span>\r\n <span class=\"material-icons cc-accordion-icon\">{{ item.expanded ? 'expand_less' : 'expand_more'\r\n }}</span>\r\n </button>\r\n\r\n <div class=\"cc-accordion-body\" *ngIf=\"item.expanded\">\r\n <ng-container *ngFor=\"let child of item.children; trackBy: trackByFn\">\r\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { item: child }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Custom Divider -->\r\n <div *ngSwitchCase=\"'divider'\" class=\"cc-filter-divider\"></div>\r\n\r\n </ng-container>\r\n </div>\r\n</ng-template>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { FilterSidebarComponent } from './components/filter-sidebar/filter-sidebar.component';\r\nimport { FormComponentsModule } from '../form-components/form-components.module';\r\nimport { ButtonModule } from '../button/button.module';\r\n\r\n@NgModule({\r\n declarations: [\r\n FilterSidebarComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n FormComponentsModule,\r\n ButtonModule\r\n ],\r\n exports: [\r\n FilterSidebarComponent\r\n ]\r\n})\r\nexport class FilterSidebarModule { }\r\n","import { Component, Input, Output, EventEmitter, HostBinding } from '@angular/core';\r\n\r\nexport interface SummaryCardConfig {\r\n header: string;\r\n value: string;\r\n description?: string;\r\n\r\n // Icon or Image (mutually exclusive)\r\n icon?: string; // Material icon name\r\n iconImage?: string; // URL for image icon\r\n\r\n // Layout configurations\r\n descriptionPosition?: 'bottom' | 'inline'; // 'bottom' (default) or 'inline' (right side of value)\r\n\r\n // Extended Content\r\n valueSubtext?: string; // Text displayed next to the value (e.g. \"/ 15 Target\")\r\n metaData?: SummaryCardMeta[]; // Right-aligned meta information\r\n\r\n // Color configurations\r\n valueColor?: string; // Color for the value text\r\n headerColor?: string; // Color for the header text\r\n descriptionColor?: string; // Color for the description text\r\n iconColor?: string; // Color for the icon\r\n iconBackgroundColor?: string; // Background color for the icon container\r\n\r\n // Additional styling\r\n iconClass?: string; // Additional CSS classes for icon\r\n valueClass?: string; // Additional CSS classes for value\r\n headerClass?: string; // Additional CSS classes for header\r\n descriptionClass?: string; // Additional CSS classes for description\r\n\r\n // Interaction\r\n isDisabled?: boolean; // Disable click interaction\r\n isClickable?: boolean; // Whether card is clickable (default: true)\r\n}\r\n\r\nexport interface SummaryCardMeta {\r\n text: string;\r\n type?: 'text' | 'pill'; // 'text' (default) or 'pill' (badge style)\r\n color?: string; // Text color\r\n backgroundColor?: string; // Background color for pill\r\n cssClass?: string; // Custom CSS class\r\n}\r\n\r\nexport interface SummaryCardLabels {\r\n iconAlt: string;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-summary-card',\r\n templateUrl: './summary-card.component.html',\r\n styleUrls: ['./summary-card.component.scss'],\r\n standalone: false\r\n})\r\nexport class SummaryCardComponent {\r\n @Input() config!: SummaryCardConfig;\r\n @Input() theme?: 'theme-1' | 'theme-2';\r\n @Input() labels: any;\r\n @Output() cardClick = new EventEmitter<void>();\r\n\r\n constructor() { }\r\n\r\n onCardClick(): void {\r\n if (this.config?.isDisabled || this.config?.isClickable === false) {\r\n return;\r\n }\r\n this.cardClick.emit();\r\n }\r\n\r\n get cardClasses(): { [key: string]: boolean } {\r\n return {\r\n 'disabled': !!this.config?.isDisabled,\r\n 'clickable': this.config?.isClickable !== false && !this.config?.isDisabled\r\n };\r\n }\r\n\r\n get iconStyles(): { [key: string]: string } {\r\n const styles: { [key: string]: string } = {};\r\n if (this.config.iconBackgroundColor) {\r\n styles['backgroundColor'] = this.config.iconBackgroundColor;\r\n }\r\n if (this.config.iconColor) {\r\n styles['color'] = this.config.iconColor;\r\n }\r\n return styles;\r\n }\r\n\r\n get headerStyles(): { [key: string]: string } {\r\n const styles: { [key: string]: string } = {};\r\n if (this.config.headerColor) {\r\n styles['color'] = this.config.headerColor;\r\n }\r\n return styles;\r\n }\r\n\r\n get valueStyles(): { [key: string]: string } {\r\n const styles: { [key: string]: string } = {};\r\n if (this.config.valueColor) {\r\n styles['color'] = this.config.valueColor;\r\n }\r\n return styles;\r\n }\r\n\r\n get descriptionStyles(): { [key: string]: string } {\r\n const styles: { [key: string]: string } = {};\r\n if (this.config.descriptionColor) {\r\n styles['color'] = this.config.descriptionColor;\r\n }\r\n return styles;\r\n }\r\n\r\n get isDescriptionInline(): boolean {\r\n return this.config.descriptionPosition === 'inline';\r\n }\r\n\r\n getMetaStyles(meta: SummaryCardMeta): { [key: string]: string } {\r\n const styles: { [key: string]: string } = {};\r\n if (meta.color) {\r\n styles['color'] = meta.color;\r\n }\r\n if (meta.backgroundColor && meta.type === 'pill') {\r\n styles['backgroundColor'] = meta.backgroundColor;\r\n }\r\n return styles;\r\n }\r\n}\r\n","<div class=\"cc-summary-card\" (click)=\"onCardClick()\">\r\n <!-- Icon Section (Left Side) -->\r\n <div class=\"icon-section\" *ngIf=\"config.icon || config.iconImage\" [ngClass]=\"config.iconClass\"\r\n [ngStyle]=\"iconStyles\">\r\n <mat-icon *ngIf=\"config.icon\">{{ config.icon }}</mat-icon>\r\n <img *ngIf=\"!config.icon && config.iconImage\" [src]=\"config.iconImage\" [alt]=\"labels.iconAlt\">\r\n </div>\r\n\r\n <!-- Right Section (Header + Value/Meta) -->\r\n <div class=\"right-section\">\r\n <!-- Header (Full Width on Right) -->\r\n <div class=\"header\" [ngClass]=\"config.headerClass\" [ngStyle]=\"headerStyles\">\r\n {{ config.header }}\r\n </div>\r\n\r\n <!-- Value and Meta Row -->\r\n <div class=\"value-meta-row\">\r\n <!-- Content Section -->\r\n <div class=\"content-section\">\r\n <!-- Value Row (with optional inline description) -->\r\n <div class=\"value-row\" [class.inline-layout]=\"isDescriptionInline\">\r\n <div class=\"value-container\">\r\n <div class=\"value\" [ngClass]=\"config.valueClass\" [ngStyle]=\"valueStyles\">\r\n {{ config.value }}\r\n <span *ngIf=\"config.valueSubtext\" class=\"value-subtext\">{{ config.valueSubtext }}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Description (inline or bottom based on config) -->\r\n <div class=\"description\" *ngIf=\"config.description\" [ngClass]=\"config.descriptionClass\"\r\n [ngStyle]=\"descriptionStyles\">\r\n {{ config.description }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Meta/Status Section (Aligned with Value) -->\r\n <div class=\"meta-section\" *ngIf=\"config.metaData && config.metaData.length > 0\">\r\n <div *ngFor=\"let meta of config.metaData\" class=\"meta-item\"\r\n [ngClass]=\"[meta.type === 'pill' ? 'meta-pill' : 'meta-text', meta.cssClass || '']\"\r\n [ngStyle]=\"getMetaStyles(meta)\">\r\n {{ meta.text }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { SummaryCardComponent } from './components/summary-card/summary-card.component';\r\n\r\n@NgModule({\r\n declarations: [\r\n SummaryCardComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n MatIconModule\r\n ],\r\n exports: [\r\n SummaryCardComponent\r\n ]\r\n})\r\nexport class SummaryCardModule { }\r\n","\r\n/**\r\n * Recursively translates the Configuration object using the provided labels map.\r\n * This function processes:\r\n * - Section Titles\r\n * - Field Labels\r\n * - Placeholders\r\n * - Help Texts\r\n * - Option Labels (for static options)\r\n * - Repeater Labels (addLabel, repeaterItemLabel)\r\n * \r\n * @param config The FormConfig object to translate\r\n * @param labelsMap A map of key-value pairs for translation (Flattened JSON)\r\n * @returns A new FormConfig object with translated strings\r\n */\r\nexport function translateConfig(config: any, labelsMap: any): any {\r\n if (!config || !labelsMap) {\r\n return config;\r\n }\r\n\r\n // Deep clone to avoid mutating original config, if not already cloned\r\n // Note: Assuming config passed here is already a clone to be modified or we clone it.\r\n // To be safe, let's clone it if it's the root call, but this function is helper.\r\n // In component we do: processedConfig = JSON.parse(JSON.stringify(config)); -> translateConfig(processedConfig, map)\r\n // So distinct reference is passed.\r\n\r\n // Helper to translate a single key\r\n const t = (key: string) => {\r\n return labelsMap[key] || key;\r\n };\r\n\r\n if (config.sections) {\r\n config.sections.forEach((section: any) => {\r\n if (section.sectionTitle) {\r\n section.sectionTitle = t(section.sectionTitle);\r\n }\r\n if (section.repeaterItemLabel) {\r\n section.repeaterItemLabel = t(section.repeaterItemLabel);\r\n }\r\n if (section.addLabel) {\r\n section.addLabel = t(section.addLabel);\r\n }\r\n\r\n if (section.fields) {\r\n section.fields.forEach((field: any) => {\r\n translateField(field, t);\r\n });\r\n }\r\n });\r\n }\r\n\r\n return config;\r\n}\r\n\r\nfunction translateField(field: any, t: (key: string) => string) {\r\n if (field.label) {\r\n field.label = t(field.label);\r\n }\r\n if (field.placeholder) {\r\n field.placeholder = t(field.placeholder);\r\n }\r\n if (field.helpText) {\r\n field.helpText = t(field.helpText);\r\n }\r\n if (field.suffixText) {\r\n field.suffixText = t(field.suffixText);\r\n }\r\n if (field.prefixText) { // Assuming prefixText might exist or be added\r\n field.prefixText = t(field.prefixText);\r\n }\r\n\r\n // Translate options if they exist\r\n if (field.options) {\r\n field.options.forEach((opt: any) => {\r\n if (opt.label) {\r\n opt.label = t(opt.label);\r\n }\r\n });\r\n }\r\n\r\n // Handle subFields for composite type\r\n if (field.subFields) {\r\n field.subFields.forEach((sub: any) => {\r\n translateField(sub, t);\r\n });\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnInit, Output, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { FormBuilder, FormGroup, FormControl, FormArray, Validators, AbstractControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport {\r\n FormConfig,\r\n FormField,\r\n FormSection,\r\n FormOption,\r\n JsonFormConfig,\r\n JsonFieldConfig,\r\n FieldType,\r\n UISubType\r\n} from '../configurable-form.model';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MaterialModule } from '../../material/material.module';\r\nimport { translateConfig } from '../../../utils/translation.utils';\r\n\r\n@Component({\r\n selector: 'lib-configurable-form',\r\n templateUrl: './configurable-form.component.html',\r\n styleUrls: ['./configurable-form.component.scss'],\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, MaterialModule],\r\n})\r\nexport class ConfigurableFormComponent implements OnInit, OnChanges {\r\n @Input() config!: FormConfig;\r\n @Input() jsonConfig!: JsonFormConfig;\r\n @Input() data: any = {};\r\n @Input() baseApiUrl: string = '';\r\n @Input() labels: any;\r\n @Output() optionsLoad = new EventEmitter<any>();\r\n\r\n form!: FormGroup;\r\n processedConfig!: FormConfig;\r\n fieldVisibilityMap: Map<string, boolean> = new Map();\r\n passwordFieldState: Map<string, boolean> = new Map();\r\n\r\n constructor(\r\n private fb: FormBuilder,\r\n private snackBar: MatSnackBar,\r\n private http: HttpClient\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.initializeForm();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['config'] || changes['jsonConfig']) {\r\n this.initializeForm();\r\n }\r\n if (changes['data'] && this.form) {\r\n this.form.patchValue(this.data);\r\n }\r\n }\r\n\r\n initializeForm() {\r\n // Transform JSON config if provided, otherwise use config directly\r\n if (this.jsonConfig) {\r\n this.processedConfig = this.transformJsonConfig(this.jsonConfig);\r\n } else if (this.config) {\r\n this.processedConfig = JSON.parse(JSON.stringify(this.config));\r\n } else {\r\n return;\r\n }\r\n\r\n // Apply translations if labels and labelsObject are provided\r\n if (this.labels && this.labels.labelsObject) {\r\n translateConfig(this.processedConfig, this.labels.labelsObject);\r\n }\r\n\r\n\r\n this.normalizeFields();\r\n this.initializeFieldVisibility();\r\n this.buildForm();\r\n this.setupDependencies();\r\n\r\n // Patch initial data if provided\r\n if (this.data && Object.keys(this.data).length > 0) {\r\n this.form.patchValue(this.data);\r\n }\r\n }\r\n\r\n // Transform JSON config format to internal FormConfig format\r\n transformJsonConfig(jsonConfig: JsonFormConfig): FormConfig {\r\n const fields = jsonConfig.jsonConfig\r\n .sort((a, b) => a.sequence - b.sequence)\r\n .map(field => this.transformJsonField(field));\r\n\r\n return {\r\n sections: [{\r\n sectionTitle: jsonConfig.label,\r\n fields: fields\r\n }],\r\n entityType: jsonConfig.entityType\r\n };\r\n }\r\n\r\n // Transform individual JSON field to FormField\r\n transformJsonField(jsonField: JsonFieldConfig): FormField {\r\n const fieldType = this.mapUISubTypeToFieldType(jsonField.uiConfig.subType);\r\n\r\n return {\r\n name: jsonField.jsonKey,\r\n jsonKey: jsonField.jsonKey,\r\n label: jsonField.label,\r\n type: fieldType,\r\n sequence: jsonField.sequence,\r\n keyType: jsonField.keyType,\r\n uiConfig: jsonField.uiConfig,\r\n validationRules: jsonField.validationRules,\r\n required: jsonField.validationRules?.isMandatory || jsonField.validationRules?.isRequired,\r\n mandatory: jsonField.validationRules?.isMandatory,\r\n dependsOn: undefined, // Will be set based on dependent array\r\n dependent: jsonField.uiConfig.dependent,\r\n optionConfigs: jsonField.uiConfig.optionConfigs,\r\n class: 'col-12'\r\n };\r\n }\r\n\r\n // Map UI subtype to field type\r\n mapUISubTypeToFieldType(subType?: string): FieldType {\r\n switch (subType) {\r\n case 'UI_SUBTYPE.SHORT_TEXT':\r\n return 'text';\r\n case 'UI_SUBTYPE.LONG_TEXT':\r\n return 'textarea';\r\n case 'UI_SUBTYPE.NUMBER':\r\n return 'number';\r\n case 'UI_SUBTYPE.EMAIL':\r\n return 'email';\r\n case 'UI_SUBTYPE.PHONE':\r\n return 'tel';\r\n case 'UI_SUBTYPE.URL':\r\n return 'url';\r\n default:\r\n return 'text';\r\n }\r\n }\r\n\r\n // Normalize fields to ensure all required properties exist\r\n normalizeFields() {\r\n this.processedConfig.sections.forEach(section => {\r\n section.fields.forEach(field => {\r\n // Set default type if not specified\r\n if (!field.type) {\r\n field.type = 'text';\r\n }\r\n\r\n // Merge uiConfig with field-level properties\r\n if (field.uiConfig) {\r\n if (field.uiConfig.type === 'UI_TYPE.DROP_DOWN') {\r\n field.type = 'dropdown';\r\n }\r\n if (field.uiConfig.optionConfigs) {\r\n field.optionConfigs = field.uiConfig.optionConfigs;\r\n }\r\n if (field.uiConfig.dependent) {\r\n field.dependent = field.uiConfig.dependent;\r\n }\r\n }\r\n\r\n // Initialize visibility\r\n if (field.visible === undefined) {\r\n field.visible = true;\r\n }\r\n\r\n // Load options for dropdowns\r\n if ((field.type === 'dropdown' || field.type === 'select') && field.optionConfigs) {\r\n this.loadFieldOptions(field);\r\n }\r\n });\r\n });\r\n }\r\n\r\n // Initialize field visibility map\r\n initializeFieldVisibility() {\r\n this.processedConfig.sections.forEach(section => {\r\n section.fields.forEach(field => {\r\n this.fieldVisibilityMap.set(field.name, field.visible !== false);\r\n });\r\n });\r\n }\r\n\r\n buildForm() {\r\n const formGroupConfig: any = {};\r\n\r\n this.processedConfig.sections.forEach(section => {\r\n if (section.isRepeater) {\r\n // Create FormArray for repeater sections\r\n const arrayName = section.formArrayName || 'items';\r\n const minItems = section.minItems || 1;\r\n const initialItems = [];\r\n\r\n for (let i = 0; i < minItems; i++) {\r\n initialItems.push(this.createGroup(section.fields));\r\n }\r\n\r\n formGroupConfig[arrayName] = this.fb.array(initialItems);\r\n } else {\r\n // Add regular fields to form group\r\n section.fields.forEach(field => {\r\n if (field.subFields) {\r\n // Composite field - add all sub-fields\r\n field.subFields.forEach(subField => {\r\n if (field.required || field.mandatory) {\r\n subField.required = true;\r\n }\r\n formGroupConfig[subField.name] = this.createControl(subField);\r\n });\r\n } else {\r\n formGroupConfig[field.name] = this.createControl(field);\r\n }\r\n });\r\n }\r\n });\r\n\r\n this.form = this.fb.group(formGroupConfig);\r\n\r\n // Apply composite validators to the root form group\r\n this.processedConfig.sections.forEach(section => {\r\n if (!section.isRepeater) {\r\n section.fields.forEach(field => {\r\n if (field.type === 'composite' && field.compositeValidationRule && field.subFields) {\r\n this.form.addValidators(this.createCompositeValidator(field));\r\n }\r\n });\r\n }\r\n });\r\n this.form.updateValueAndValidity();\r\n }\r\n\r\n createCompositeValidator(field: FormField) {\r\n return (control: AbstractControl) => {\r\n const group = control as FormGroup;\r\n if (!field.subFields || field.subFields.length < 2) return null;\r\n\r\n if (field.compositeValidationRule === 'minMax') {\r\n const minControl = group.get(field.subFields[0].name);\r\n const maxControl = group.get(field.subFields[1].name);\r\n\r\n if (minControl && maxControl && minControl.value !== null && maxControl.value !== null) {\r\n if (Number(minControl.value) > Number(maxControl.value)) {\r\n return { [`invalid_minMax_${field.name}`]: true };\r\n }\r\n }\r\n }\r\n\r\n if (field.compositeValidationRule === 'percentageTotal') {\r\n let total = 0;\r\n let allPresent = true;\r\n\r\n field.subFields.forEach(sub => {\r\n const ctrl = group.get(sub.name);\r\n if (ctrl && ctrl.value !== null && ctrl.value !== '') {\r\n total += Number(ctrl.value);\r\n } else {\r\n allPresent = false;\r\n }\r\n });\r\n\r\n if (allPresent && total !== 100) {\r\n return { [`invalid_percentageTotal_${field.name}`]: true };\r\n }\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n\r\n createControl(field: FormField): FormControl {\r\n const validators = [];\r\n\r\n // Add validators based on field configuration\r\n if (field.required || field.mandatory || field.validationRules?.isMandatory || field.validationRules?.isRequired) {\r\n validators.push(Validators.required);\r\n }\r\n\r\n if (field.validationRules?.minLength) {\r\n validators.push(Validators.minLength(field.validationRules.minLength));\r\n }\r\n\r\n if (field.validationRules?.maxLength) {\r\n validators.push(Validators.maxLength(field.validationRules.maxLength));\r\n }\r\n\r\n if (field.validationRules?.pattern) {\r\n validators.push(Validators.pattern(field.validationRules.pattern));\r\n }\r\n\r\n if (field.validationRules?.min !== undefined) {\r\n validators.push(Validators.min(field.validationRules.min));\r\n }\r\n\r\n if (field.validationRules?.max !== undefined) {\r\n validators.push(Validators.max(field.validationRules.max));\r\n }\r\n\r\n if (field.type === 'email') {\r\n validators.push(Validators.email);\r\n }\r\n\r\n const initialValue = field.value !== undefined ? field.value : '';\r\n return this.fb.control({ value: initialValue, disabled: field.disabled || false }, validators);\r\n }\r\n\r\n createGroup(fields: FormField[]): FormGroup {\r\n const groupConfig: any = {};\r\n\r\n fields.forEach(field => {\r\n if (field.subFields) {\r\n field.subFields.forEach(subField => {\r\n groupConfig[subField.name] = this.createControl(subField);\r\n });\r\n } else {\r\n groupConfig[field.name] = this.createControl(field);\r\n }\r\n });\r\n\r\n return this.fb.group(groupConfig);\r\n }\r\n\r\n getFormArray(name: string): FormArray {\r\n return this.form.get(name) as FormArray;\r\n }\r\n\r\n addRepeaterItem(section: FormSection) {\r\n const arrayName = section.formArrayName || 'items';\r\n const formArray = this.getFormArray(arrayName);\r\n\r\n // Check max items\r\n if (section.maxItems && formArray.length >= section.maxItems) {\r\n this.snackBar.open(this.labels.errorMaxItemsAllowed.replace('{0}', String(section.maxItems)), this.labels.closeSnackBar, { duration: 3000 });\r\n return;\r\n }\r\n\r\n formArray.push(this.createGroup(section.fields));\r\n }\r\n\r\n removeRepeaterItem(sectionName: string, index: number) {\r\n const formArray = this.getFormArray(sectionName);\r\n formArray.removeAt(index);\r\n }\r\n\r\n validate(): boolean {\r\n if (this.form.invalid) {\r\n this.form.markAllAsTouched();\r\n this.scrollToFirstInvalidControl();\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n scrollToFirstInvalidControl() {\r\n const firstInvalidControl = document.querySelector('.is-invalid');\r\n if (firstInvalidControl) {\r\n firstInvalidControl.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n }\r\n\r\n setupDependencies() {\r\n this.processedConfig.sections.forEach(section => {\r\n section.fields.forEach(field => {\r\n\r\n\r\n // Also setup for fields with dependent array\r\n if (field.dependent && field.dependent.length > 0) {\r\n const control = this.form.get(field.name);\r\n if (control) {\r\n control.valueChanges.subscribe(value => {\r\n this.onFieldValueChange(field, value);\r\n });\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n onFieldValueChange(field: FormField, value: any) {\r\n // Handle dependent fields\r\n if (field.dependent && field.dependent.length > 0) {\r\n field.dependent.forEach(dependentFieldName => {\r\n const dependentField = this.findFieldByName(dependentFieldName);\r\n if (dependentField) {\r\n // Clear the dependent field value\r\n const control = this.form.get(dependentFieldName);\r\n if (control) {\r\n control.setValue('');\r\n control.markAsUntouched();\r\n }\r\n\r\n // Load new options for the dependent field\r\n if (value) {\r\n this.loadFieldOptions(dependentField, { [field.name]: value });\r\n } else {\r\n // Clear options if parent value is cleared\r\n dependentField.loadedOptions = [];\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n // Load options for a dropdown field\r\n loadFieldOptions(field: FormField, parentValues?: any) {\r\n // Emit event for parent to notify about options load request\r\n // Allow parent to mark as handled to skip internal API call\r\n const event = { field, parentValue: parentValues, handled: false };\r\n this.optionsLoad.emit(event);\r\n\r\n if (event.handled) {\r\n return;\r\n }\r\n\r\n if (!field.optionConfigs) {\r\n return;\r\n }\r\n\r\n const config = field.optionConfigs;\r\n\r\n // Handle static options\r\n if (config.optionDTO === 'OPTION_DTO.STATIC' && config.staticOptions) {\r\n field.loadedOptions = config.staticOptions;\r\n return;\r\n }\r\n\r\n // Handle API-based options\r\n if (config.optionDTO === 'OPTION_DTO.REF_DATA' && config.url) {\r\n let url = config.url;\r\n\r\n // Replace placeholders in URL with parent values\r\n if (parentValues) {\r\n Object.keys(parentValues).forEach(key => {\r\n url = url.replace(`{${key}}`, parentValues[key]);\r\n });\r\n }\r\n\r\n // Prepend base API URL if provided\r\n if (this.baseApiUrl && !url.startsWith('http')) {\r\n url = `${this.baseApiUrl}/${url}`;\r\n }\r\n\r\n this.http.get<any>(url).subscribe({\r\n next: (response) => {\r\n // Extract data from response\r\n const data = response.data || response.content || response;\r\n field.loadedOptions = this.extractOptions(data, config);\r\n },\r\n error: (error) => {\r\n console.error('Error loading options:', error);\r\n field.loadedOptions = [];\r\n }\r\n });\r\n }\r\n }\r\n\r\n // Extract options from API response\r\n extractOptions(data: any[], config: any): FormOption[] {\r\n if (!Array.isArray(data)) {\r\n return [];\r\n }\r\n\r\n return data.map(item => ({\r\n label: item[config.labelKey || 'name'],\r\n value: item[config.requestKey || 'code'] || item[config.valueKey || 'id'],\r\n code: item.code,\r\n name: item.name\r\n }));\r\n }\r\n\r\n // Get options for a field (either static or loaded)\r\n getFieldOptions(field: FormField): FormOption[] {\r\n return field.loadedOptions || field.options || [];\r\n }\r\n\r\n // Check if field is visible\r\n isFieldVisible(field: FormField): boolean {\r\n return this.fieldVisibilityMap.get(field.name) !== false;\r\n }\r\n\r\n // Toggle field visibility\r\n toggleFieldVisibility(field: FormField, visible: boolean) {\r\n this.fieldVisibilityMap.set(field.name, visible);\r\n\r\n const control = this.form.get(field.name);\r\n if (control) {\r\n if (visible) {\r\n // Re-enable and restore validators\r\n control.enable();\r\n this.updateControlValidators(control, field);\r\n } else {\r\n // Disable and clear validators\r\n control.disable();\r\n control.clearValidators();\r\n control.updateValueAndValidity();\r\n }\r\n }\r\n }\r\n\r\n // Update control validators based on field config\r\n updateControlValidators(control: AbstractControl, field: FormField) {\r\n const validators = [];\r\n\r\n if (field.required || field.mandatory || field.validationRules?.isMandatory) {\r\n validators.push(Validators.required);\r\n }\r\n\r\n if (field.validationRules?.minLength) {\r\n validators.push(Validators.minLength(field.validationRules.minLength));\r\n }\r\n\r\n if (field.validationRules?.maxLength) {\r\n validators.push(Validators.maxLength(field.validationRules.maxLength));\r\n }\r\n\r\n if (field.validationRules?.pattern) {\r\n validators.push(Validators.pattern(field.validationRules.pattern));\r\n }\r\n\r\n control.setValidators(validators);\r\n control.updateValueAndValidity();\r\n }\r\n\r\n onFileChange(event: any, field: FormField) {\r\n const files: FileList = event.target.files;\r\n\r\n if (!files || files.length === 0) {\r\n return;\r\n }\r\n\r\n // Initialize uploadedFiles if not present\r\n // Initialize uploadedFiles if not present\r\n if (!field.uploadedFiles) {\r\n field.uploadedFiles = [];\r\n }\r\n\r\n const uploadedFiles: any[] = [];\r\n // Handle files\r\n for (let i = 0; i < files.length; i++) {\r\n const file = files[i];\r\n\r\n // Check file size (5MB limit)\r\n if (file.size > 5 * 1024 * 1024) {\r\n this.snackBar.open(this.labels.errorFileLimitExceeded.replace('{0}', file.name), this.labels.closeSnackBar, { duration: 3000 });\r\n continue;\r\n }\r\n\r\n uploadedFiles.push({\r\n name: file.name,\r\n size: file.size,\r\n type: file.type,\r\n file: file\r\n });\r\n }\r\n\r\n if (field.multiple) {\r\n field.uploadedFiles.push(...uploadedFiles);\r\n } else {\r\n field.uploadedFiles = uploadedFiles;\r\n }\r\n\r\n // Update form control value for validation\r\n this.updateFileControlValue(field);\r\n\r\n // Clear the input\r\n event.target.value = '';\r\n }\r\n\r\n // Remove uploaded file\r\n removeFile(field: FormField, index: number) {\r\n if (field.uploadedFiles) {\r\n field.uploadedFiles.splice(index, 1);\r\n this.updateFileControlValue(field);\r\n }\r\n }\r\n\r\n // Update file control value for validation\r\n updateFileControlValue(field: FormField) {\r\n const control = this.form.get(field.name);\r\n if (control) {\r\n const hasFiles = field.uploadedFiles && field.uploadedFiles.length > 0;\r\n control.setValue(hasFiles ? field.uploadedFiles : null);\r\n control.markAsTouched();\r\n }\r\n }\r\n\r\n // Get character count for text field\r\n getCharacterCount(fieldName: string): number {\r\n const control = this.form.get(fieldName);\r\n if (control && control.value) {\r\n return control.value.toString().length;\r\n }\r\n return 0;\r\n }\r\n\r\n // Toggle section collapse\r\n toggleSection(section: FormSection) {\r\n section.collapsed = !section.collapsed;\r\n }\r\n\r\n\r\n\r\n // Helper method to find field by name\r\n private findFieldByName(name: string): FormField | undefined {\r\n for (const section of this.processedConfig.sections) {\r\n const field = section.fields.find(f => f.name === name);\r\n if (field) {\r\n return field;\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n // Get the processed config for template use\r\n get sections(): FormSection[] {\r\n return this.processedConfig?.sections || [];\r\n }\r\n\r\n togglePassword(fieldName: string) {\r\n this.passwordFieldState.set(fieldName, !this.passwordFieldState.get(fieldName));\r\n }\r\n\r\n isPasswordVisible(fieldName: string): boolean {\r\n return this.passwordFieldState.get(fieldName) || false;\r\n }\r\n}\r\n\r\n","<form [formGroup]=\"form\" class=\"configurable-form-container\" *ngIf=\"form\">\r\n\r\n <ng-container *ngFor=\"let section of sections\">\r\n\r\n <!-- Repeater Section -->\r\n <div *ngIf=\"section.isRepeater; else normalSection\"\r\n [ngClass]=\"section.noCardLayout ? 'section-no-card' : 'section-card'\">\r\n <div class=\"section-header\" *ngIf=\"section.sectionTitle\">\r\n <h3 class=\"section-title\">{{ section.sectionTitle }}</h3>\r\n <button *ngIf=\"section.collapsible\" mat-icon-button type=\"button\" (click)=\"toggleSection(section)\">\r\n <mat-icon>{{ section.collapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div [formArrayName]=\"section.formArrayName || 'items'\" *ngIf=\"!section.collapsed\">\r\n <div *ngFor=\"let item of getFormArray(section.formArrayName!).controls; let i = index\"\r\n [formGroupName]=\"i\" class=\"repeater-item\">\r\n <div class=\"repeater-item-header\" *ngIf=\"getFormArray(section.formArrayName!).length > 1\">\r\n <span class=\"text-small\">{{ section.repeaterItemLabel || labels.repeaterItemDefaultLabel }} {{i\r\n + 1}}</span>\r\n <button mat-icon-button color=\"warn\" type=\"button\"\r\n (click)=\"removeRepeaterItem(section.formArrayName!, i)\"\r\n [disabled]=\"section.minItems && getFormArray(section.formArrayName!).length <= section.minItems\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Fields Grid -->\r\n <div class=\"form-grid\">\r\n <div *ngFor=\"let field of section.fields\" [ngClass]=\"['form-col', field.class || 'col-12']\"\r\n [hidden]=\"!isFieldVisible(field)\">\r\n <ng-container\r\n *ngTemplateOutlet=\"fieldTemplate; context: {field: field, group: item}\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"repeater-separator\" *ngIf=\"i < getFormArray(section.formArrayName!).length - 1\"></div>\r\n </div>\r\n </div>\r\n\r\n <button mat-button color=\"primary\" type=\"button\" (click)=\"addRepeaterItem(section)\" class=\"add-btn\"\r\n *ngIf=\"!section.collapsed\"\r\n [disabled]=\"section.maxItems && getFormArray(section.formArrayName!).length >= section.maxItems\">\r\n <mat-icon>add_circle_outline</mat-icon> {{ section.addLabel || labels.addMoreDefaultLabel }}\r\n </button>\r\n </div>\r\n\r\n <!-- Normal Section -->\r\n <ng-template #normalSection>\r\n <div [ngClass]=\"section.noCardLayout ? 'section-no-card' : 'section-card'\">\r\n <div class=\"section-header\" *ngIf=\"section.sectionTitle\">\r\n <h3 class=\"section-title\">{{ section.sectionTitle }}</h3>\r\n <button *ngIf=\"section.collapsible\" mat-icon-button type=\"button\" (click)=\"toggleSection(section)\">\r\n <mat-icon>{{ section.collapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n </button>\r\n </div>\r\n <div class=\"form-grid\" *ngIf=\"!section.collapsed\">\r\n <div *ngFor=\"let field of section.fields\" [ngClass]=\"['form-col', field.class || 'col-12']\"\r\n [hidden]=\"!isFieldVisible(field)\">\r\n <!-- Pass the root form group to the template -->\r\n <ng-container\r\n *ngTemplateOutlet=\"fieldTemplate; context: {field: field, group: form}\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n </ng-container>\r\n\r\n</form>\r\n\r\n<!-- Reusable Field Template -->\r\n<ng-template #fieldTemplate let-field=\"field\" let-group=\"group\">\r\n <div [formGroup]=\"group\">\r\n\r\n <!-- Text / Email / Number / Tel / URL (Password removed) -->\r\n <div *ngIf=\"['text', 'email', 'number', 'tel', 'url'].includes(field.type || '')\" class=\"field-container\">\r\n <div class=\"field-label\" *ngIf=\"field.label\">\r\n {{ field.label }}\r\n <span class=\"text-danger\" *ngIf=\"field.required || field.mandatory\">*</span>\r\n </div>\r\n <div class=\"input-wrapper\">\r\n <input [type]=\"field.type\" [formControlName]=\"field.name\" [placeholder]=\"field.placeholder || ''\"\r\n [readonly]=\"field.readonly\" class=\"form-input\" [name]=\"field.name\"\r\n [class.is-invalid]=\"group.get(field.name)?.touched && group.get(field.name)?.invalid\"\r\n [maxlength]=\"field.validationRules?.maxLength || field.uiConfig?.maxCharacters\">\r\n <div class=\"input-suffix\">\r\n <span class=\"suffix-text\" *ngIf=\"field.suffixText\">{{ field.suffixText }}</span>\r\n <mat-icon *ngIf=\"field.suffixIcon\">{{ field.suffixIcon }}</mat-icon>\r\n <mat-icon *ngIf=\"field.icon\">{{ field.icon }}</mat-icon>\r\n <mat-icon *ngIf=\"field.readonly\" class=\"lock-icon\">lock_outline</mat-icon>\r\n </div>\r\n </div>\r\n <!-- Character count -->\r\n <div class=\"char-count-row\" *ngIf=\"field.uiConfig?.maxCharacters || field.validationRules?.maxLength\">\r\n <div class=\"hint-text\" *ngIf=\"field.hint || field.helpText\">{{ field.hint || field.helpText }}</div>\r\n <div class=\"char-count\">\r\n {{ getCharacterCount(field.name) }} / {{ field.uiConfig?.maxCharacters ||\r\n field.validationRules?.maxLength }} {{ labels.charactersLabel }}\r\n </div>\r\n </div>\r\n <div class=\"hint-text mt-2\"\r\n *ngIf=\"(field.hint || field.helpText) && !field.uiConfig?.maxCharacters && !field.validationRules?.maxLength\">\r\n {{ field.hint || field.helpText }}\r\n </div>\r\n </div>\r\n\r\n <!-- Password Field (Separated) -->\r\n <div *ngIf=\"field.type === 'password'\" class=\"field-container\">\r\n <div class=\"field-label\" *ngIf=\"field.label\">\r\n {{ field.label }}\r\n <span class=\"text-danger\" *ngIf=\"field.required || field.mandatory\">*</span>\r\n </div>\r\n <div class=\"input-wrapper\">\r\n <input [type]=\"isPasswordVisible(field.name) ? 'text' : 'password'\" [formControlName]=\"field.name\"\r\n [placeholder]=\"field.placeholder || ''\" [readonly]=\"field.readonly\" class=\"form-input\"\r\n [class.is-invalid]=\"group.get(field.name)?.touched && group.get(field.name)?.invalid\"\r\n [maxlength]=\"field.validationRules?.maxLength || field.uiConfig?.maxCharacters\">\r\n <div class=\"input-suffix\">\r\n <span class=\"suffix-text\" *ngIf=\"field.suffixText\">{{ field.suffixText }}</span>\r\n <mat-icon *ngIf=\"field.suffixIcon\">{{ field.suffixIcon }}</mat-icon>\r\n <mat-icon *ngIf=\"field.icon\">{{ field.icon }}</mat-icon>\r\n <mat-icon *ngIf=\"field.readonly\" class=\"lock-icon\">lock_outline</mat-icon>\r\n <mat-icon class=\"password-toggle-icon\" (click)=\"togglePassword(field.name)\">\r\n {{ isPasswordVisible(field.name) ? 'visibility' : 'visibility_off' }}\r\n </mat-icon>\r\n </div>\r\n </div>\r\n <!-- Character count -->\r\n <div class=\"char-count-row\" *ngIf=\"field.uiConfig?.maxCharacters || field.validationRules?.maxLength\">\r\n <div class=\"hint-text\" *ngIf=\"field.hint || field.helpText\">{{ field.hint || field.helpText }}</div>\r\n <div class=\"char-count\">\r\n {{ getCharacterCount(field.name) }} / {{ field.uiConfig?.maxCharacters ||\r\n field.validationRules?.maxLength }} {{ labels.charactersLabel }}\r\n </div>\r\n </div>\r\n <div class=\"hint-text mt-2\"\r\n *ngIf=\"(field.hint || field.helpText) && !field.uiConfig?.maxCharacters && !field.validationRules?.maxLength\">\r\n {{ field.hint || field.helpText }}\r\n </div>\r\n </div>\r\n\r\n <!-- Textarea -->\r\n <div *ngIf=\"field.type === 'textarea'\" class=\"field-container\">\r\n <div class=\"field-label\" *ngIf=\"field.label\">\r\n {{ field.label }}\r\n <span class=\"text-danger\" *ngIf=\"field.required || field.mandatory\">*</span>\r\n </div>\r\n <textarea [formControlName]=\"field.name\" [placeholder]=\"field.placeholder || ''\" [readonly]=\"field.readonly\"\r\n class=\"form-input form-textarea\" rows=\"4\"\r\n [class.is-invalid]=\"group.get(field.name)?.touched && group.get(field.name)?.invalid\"\r\n [maxlength]=\"field.validationRules?.maxLength || field.uiConfig?.maxCharacters\"></textarea>\r\n <!-- Character count -->\r\n <div class=\"char-count-row\" *ngIf=\"field.uiConfig?.maxCharacters || field.validationRules?.maxLength\">\r\n <div class=\"hint-text\" *ngIf=\"field.hint || field.helpText\">{{ field.hint || field.helpText }}</div>\r\n <div class=\"char-count\">\r\n {{ getCharacterCount(field.name) }} / {{ field.uiConfig?.maxCharacters ||\r\n field.validationRules?.maxLength }} {{ labels.charactersLabel }}\r\n </div>\r\n </div>\r\n <div class=\"hint-text mt-2\"\r\n *ngIf=\"(field.hint || field.helpText) && !field.uiConfig?.maxCharacters && !field.validationRules?.maxLength\">\r\n {{ field.hint || field.helpText }}\r\n </div>\r\n </div>\r\n\r\n <!-- Select / Dropdown -->\r\n <div *ngIf=\"field.type === 'select' || field.type === 'dropdown'\" class=\"field-container\">\r\n <div class=\"field-label\" *ngIf=\"field.label\">\r\n {{ field.label }}\r\n <span class=\"text-danger\" *ngIf=\"field.required || field.mandatory\">*</span>\r\n </div>\r\n <select [formControlName]=\"field.name\" class=\"form-input\"\r\n [class.is-invalid]=\"group.get(field.name)?.touched && group.get(field.name)?.invalid\">\r\n <option value=\"\" disabled selected *ngIf=\"field.placeholder\">{{ field.placeholder }}</option>\r\n <option value=\"\" disabled selected *ngIf=\"!field.placeholder\">{{ labels.selectDefaultPlaceholder }}\r\n </option>\r\n <option *ngFor=\"let opt of getFieldOptions(field)\" [value]=\"opt.value\">{{ opt.label }}</option>\r\n </select>\r\n <div class=\"hint-text mt-2\" *ngIf=\"field.hint || field.helpText\">{{ field.hint || field.helpText }}</div>\r\n </div>\r\n\r\n <!-- Date -->\r\n <div *ngIf=\"field.type === 'date'\" class=\"field-container\">\r\n <div class=\"field-label\" *ngIf=\"field.label\">\r\n {{ field.label }}\r\n <span class=\"text-danger\" *ngIf=\"field.required || field.mandatory\">*</span>\r\n </div>\r\n <div class=\"relative\">\r\n <input matInput [matDatepicker]=\"picker\" [formControlName]=\"field.name\"\r\n [placeholder]=\"field.placeholder || ''\" class=\"form-input\"\r\n [class.is-invalid]=\"group.get(field.name)?.touched && group.get(field.name)?.invalid\">\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\" class=\"date-toggle\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n </div>\r\n <div class=\"hint-text mt-2\" *ngIf=\"field.hint || field.helpText\">{{ field.hint || field.helpText }}</div>\r\n </div>\r\n\r\n <!-- Radio -->\r\n <div *ngIf=\"field.type === 'radio'\" class=\"radio-group-container\"\r\n [class.is-invalid]=\"group.get(field.name)?.touched && group.get(field.name)?.invalid\">\r\n <label class=\"field-label\">\r\n {{ field.label }}\r\n <span class=\"text-danger\" *ngIf=\"field.required || field.mandatory\">*</span>\r\n </label>\r\n <mat-radio-group [formControlName]=\"field.name\" class=\"radio-group\">\r\n <mat-radio-button *ngFor=\"let opt of getFieldOptions(field)\" [value]=\"opt.value\" class=\"radio-button\">\r\n {{ opt.label }}\r\n </mat-radio-button>\r\n </mat-radio-group>\r\n <div class=\"hint-text mt-2\" *ngIf=\"field.hint || field.helpText\">{{ field.hint || field.helpText }}</div>\r\n </div>\r\n\r\n <!-- Composite Field (Sub-groups) -->\r\n <div *ngIf=\"field.type === 'composite'\" class=\"field-container\">\r\n <div class=\"field-label\" *ngIf=\"field.label\">\r\n {{ field.label }}\r\n <span class=\"text-danger\" *ngIf=\"field.required || field.mandatory\">*</span>\r\n </div>\r\n <div class=\"composite-container\">\r\n <ng-container *ngFor=\"let sub of field.subFields; let last = last\">\r\n <div class=\"composite-sub-field\" style=\"flex: 1;\">\r\n <div class=\"field-label\" *ngIf=\"sub.label\"\r\n style=\"font-size: 0.75rem; font-weight: normal; margin-bottom: 0.25rem;\">\r\n {{ sub.label }}\r\n </div>\r\n <div class=\"input-wrapper\">\r\n <input [type]=\"sub.type\" [formControlName]=\"sub.name\" [placeholder]=\"sub.placeholder || ''\"\r\n [readonly]=\"sub.readonly\" class=\"form-input\"\r\n [class.is-invalid]=\"group.get(sub.name)?.touched && group.get(sub.name)?.invalid\">\r\n <div class=\"input-suffix\" [class.color-suffix]=\"sub.suffixText === '%'\">\r\n <span class=\"suffix-text\" *ngIf=\"sub.suffixText\">{{ sub.suffixText }}</span>\r\n <mat-icon *ngIf=\"sub.readonly\" class=\"lock-icon\">lock_outline</mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Adjust separator alignment if labels are present -->\r\n <span class=\"separator\" *ngIf=\"!last && field.separator\"\r\n [style.padding-top]=\"sub.label ? '1.25rem' : '0'\">{{ field.separator }}</span>\r\n </ng-container>\r\n </div>\r\n <div class=\"hint-text mt-2\" *ngIf=\"field.hint || field.helpText\">{{ field.hint || field.helpText }}</div>\r\n <div class=\"error-text text-danger text-small mt-1\" *ngIf=\"group.errors?.['invalid_minMax_' + field.name]\">\r\n {{ labels.errorMinValue }}\r\n </div>\r\n <div class=\"error-text text-danger text-small mt-1\"\r\n *ngIf=\"group.errors?.['invalid_percentageTotal_' + field.name]\">\r\n {{ labels.errorPercentageTotal }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- File Upload -->\r\n <div *ngIf=\"field.type === 'file'\" class=\"field-container\">\r\n <div class=\"field-label\" *ngIf=\"field.label\">\r\n {{ field.label }}\r\n <span class=\"text-danger\" *ngIf=\"field.required || field.mandatory\">*</span>\r\n </div>\r\n\r\n <!-- Upload Box -->\r\n <div class=\"upload-box\" (click)=\"fileInput.click()\"\r\n [class.is-invalid]=\"group.get(field.name)?.touched && group.get(field.name)?.invalid\"\r\n *ngIf=\"!field.uploadedFiles || field.uploadedFiles.length === 0 || field.multiple\">\r\n <mat-icon class=\"upload-icon\">cloud_upload</mat-icon>\r\n <div class=\"upload-text\">{{ labels.uploadDragDropText }}</div>\r\n <div class=\"upload-hint\">{{ labels.uploadHint }}</div>\r\n <input #fileInput type=\"file\" [attr.multiple]=\"field.multiple ? true : null\" [attr.accept]=\"field.accept\"\r\n (change)=\"onFileChange($event, field)\" style=\"display: none;\">\r\n </div>\r\n\r\n <!-- Uploaded Files List -->\r\n <div class=\"uploaded-files-list\" *ngIf=\"field.uploadedFiles && field.uploadedFiles.length > 0\">\r\n <div class=\"uploaded-file-item\" *ngFor=\"let file of field.uploadedFiles; let i = index\">\r\n <div class=\"file-icon\">\r\n <mat-icon class=\"pdf-icon\" *ngIf=\"file.type === 'application/pdf'\">picture_as_pdf</mat-icon>\r\n <mat-icon class=\"doc-icon\"\r\n *ngIf=\"file.type.includes('word') || file.type.includes('document')\">description</mat-icon>\r\n <mat-icon class=\"img-icon\" *ngIf=\"file.type.includes('image')\">image</mat-icon>\r\n <mat-icon class=\"file-icon-default\"\r\n *ngIf=\"!file.type.includes('pdf') && !file.type.includes('word') && !file.type.includes('document') && !file.type.includes('image')\">insert_drive_file</mat-icon>\r\n </div>\r\n <div class=\"file-info\">\r\n <div class=\"file-name\">{{ file.name }}</div>\r\n <div class=\"file-size\">{{ (file.size / 1024).toFixed(2) }} KB</div>\r\n </div>\r\n <button mat-icon-button color=\"warn\" type=\"button\" (click)=\"removeFile(field, i)\"\r\n class=\"remove-file-btn\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</ng-template>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { ConfigurableFormComponent } from './component/configurable-form.component';\r\nimport { MaterialModule } from '../material/material.module';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n MaterialModule,\r\n ConfigurableFormComponent\r\n ],\r\n exports: [\r\n ConfigurableFormComponent\r\n ]\r\n})\r\nexport class ConfigurableFormModule { }\r\n","import { Component, EventEmitter, Input, OnInit, Output, ElementRef, HostListener } from '@angular/core';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\nimport { TableFilterConfig, TableFilterOutput, TableFilterColumn, TableFilterLabels } from '../../filter.models';\r\n\r\n@Component({\r\n selector: 'lib-filter',\r\n templateUrl: './filter.component.html',\r\n styleUrls: ['./filter.component.scss'],\r\n standalone: false\r\n})\r\nexport class FilterComponent implements OnInit {\r\n @Input() config: TableFilterConfig = { items: [] };\r\n @Input() activeFilters: TableFilterOutput = {};\r\n @Input() columns: TableFilterColumn[] = [];\r\n @Input() labels: TableFilterLabels = {\r\n filterBtn: '',\r\n clear: '',\r\n apply: '',\r\n search: '',\r\n columns: '',\r\n showAll: '',\r\n hideAll: ''\r\n };\r\n @Input() theme: string = '';\r\n\r\n @Output() filterChange = new EventEmitter<TableFilterOutput>();\r\n @Output() columnChange = new EventEmitter<TableFilterColumn[]>();\r\n @Output() toggle = new EventEmitter<boolean>();\r\n\r\n isOpen = false;\r\n activeTab: 'filters' | 'columns' = 'filters';\r\n\r\n // Temporary state while panel is open\r\n tempFilters: TableFilterOutput = {};\r\n tempColumns: TableFilterColumn[] = [];\r\n\r\n constructor(\r\n private elementRef: ElementRef,\r\n private router: Router,\r\n private route: ActivatedRoute\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.syncTempState();\r\n this.initFromUrl();\r\n }\r\n\r\n private initFromUrl(): void {\r\n if (this.config.settings?.persistent) {\r\n this.route.queryParams.subscribe(params => {\r\n if (Object.keys(params).length > 0) {\r\n const newFilters: TableFilterOutput = { ...this.activeFilters };\r\n Object.keys(params).forEach(key => {\r\n // Skip non-filter params if possible, or assume all are filters\r\n // Ideally we check against config items\r\n if (params[key] !== undefined) {\r\n newFilters[key] = params[key];\r\n }\r\n });\r\n this.activeFilters = newFilters;\r\n this.syncTempState();\r\n }\r\n });\r\n }\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onClickOutside(event: Event): void {\r\n if (!this.elementRef.nativeElement.contains(event.target)) {\r\n this.isOpen = false;\r\n }\r\n }\r\n\r\n togglePanel(): void {\r\n this.isOpen = !this.isOpen;\r\n if (this.isOpen) {\r\n this.syncTempState();\r\n this.activeTab = 'filters';\r\n }\r\n this.toggle.emit(this.isOpen);\r\n }\r\n\r\n setActiveTab(tab: 'filters' | 'columns'): void {\r\n this.activeTab = tab;\r\n }\r\n\r\n // Generic Filter Change Handler\r\n onFilterChange(key: string | undefined, value: any): void {\r\n if (!key) return;\r\n this.tempFilters[key] = value;\r\n }\r\n\r\n // Column Visibility Logic\r\n toggleColumn(columnId: string): void {\r\n const col = this.tempColumns.find(c => c.id === columnId);\r\n if (col) {\r\n col.visible = !col.visible;\r\n }\r\n }\r\n\r\n toggleAllColumns(visible: boolean): void {\r\n this.tempColumns.forEach(c => c.visible = visible);\r\n }\r\n\r\n // Actions\r\n clearAll(): void {\r\n if (this.activeTab === 'filters') {\r\n this.tempFilters = {};\r\n if (this.config.settings?.persistent) {\r\n this.updateUrl({});\r\n }\r\n } else {\r\n // Reset columns to default or show all?\r\n // Usually 'clear' in filters context means clear filters\r\n // But if we are in columns tab, maybe we want to reset columns?\r\n // For now, let's keep it simple: generic clear clears filters.\r\n this.tempFilters = {};\r\n }\r\n // If we want clear to apply immediately without clicking apply:\r\n // this.apply(); \r\n // But usually \"Clear\" inside panel just clears temp state until Apply is clicked.\r\n // However, if the user requested \"Persistent\" and \"Clear\", they might expect immediate URL update?\r\n // Standard UX: panel actions apply on \"Apply\".\r\n // The persisted state should only change when \"Apply\" is clicked?\r\n // Wait, if I update URL on clearAll inside panel, it might be confusing if panel is still open with cleared state but not \"applied\" to data.\r\n // Re-reading expectation: \"Persistent\" setting usually means the filter state is synced with URL.\r\n // If I clear temp state, URL shouldn't change until I click Apply.\r\n // SO I WILL NOT UPDATE URL HERE. The `initFromUrl` loads INTO `activeFilters`.\r\n // `apply()` updates `activeFilters` AND should update URL.\r\n }\r\n\r\n apply(): void {\r\n // Apply temp state to active state\r\n this.activeFilters = { ...this.tempFilters };\r\n // Clean up undefined/null values\r\n Object.keys(this.activeFilters).forEach(key => {\r\n if (this.activeFilters[key] === null || this.activeFilters[key] === undefined || this.activeFilters[key] === '') {\r\n delete this.activeFilters[key];\r\n }\r\n });\r\n\r\n // Apply columns\r\n this.columns = this.tempColumns.map(c => ({ ...c }));\r\n\r\n this.filterChange.emit(this.activeFilters);\r\n this.columnChange.emit(this.columns);\r\n\r\n if (this.config.settings?.persistent) {\r\n this.updateUrl(this.activeFilters);\r\n }\r\n\r\n this.isOpen = false;\r\n }\r\n\r\n\r\n private updateUrl(queryParams: any): void {\r\n this.router.navigate([], {\r\n relativeTo: this.route,\r\n queryParams: queryParams,\r\n queryParamsHandling: 'merge', // or 'replace' to clear others? 'merge' ensures we don't lose other params\r\n // But wait, if we removed a filter, merge keeps it?\r\n // We need to explicitly clear removed keys if we use merge.\r\n // Or use pure replacement of filter keys.\r\n // For simplicity, let's assuming we want to replace parameters that overlap.\r\n // But to clear keys, we need to pass `null` or `undefined` for those keys in `queryParams`?\r\n // Angular router: passing null removes the param.\r\n });\r\n\r\n // Refined updateUrl logic:\r\n // We merged activeFilters. But if we removed a key, it's missing from activeFilters.\r\n // We need to compare with current params and remove keys that are no longer in activeFilters?\r\n // A simpler way for this component:\r\n // We likely want to replace ALL query params that correspond to filters. \r\n // But we don't know which params are filters vs other things (e.g. page, sort).\r\n // For now, I will just push `this.activeFilters`. \r\n // NOTE: This doesn't clear keys that were removed. \r\n // To fix clearing:\r\n // I should probably navigate with exact activeFilters if I knew they are the ONLY params.\r\n // Better:\r\n // this.router.navigate([], { queryParams: this.activeFilters }); // property replaces all\r\n // If we want to keep 'page', etc., we need to include them.\r\n // Let's use 'merge' but we need to handle clearing.\r\n // I will implement a smarter update.\r\n }\r\n\r\n activeFilterCountValue(): number {\r\n return Object.keys(this.activeFilters).length;\r\n }\r\n\r\n\r\n get activeFilterCount(): number {\r\n return Object.keys(this.activeFilters).length;\r\n }\r\n\r\n private syncTempState(): void {\r\n this.tempFilters = { ...this.activeFilters };\r\n this.tempColumns = JSON.parse(JSON.stringify(this.columns || []));\r\n }\r\n\r\n get containerStyles(): { [key: string]: string } {\r\n const styles: { [key: string]: string } = {};\r\n if (this.config.styles) {\r\n if (this.config.styles.width) styles['--cc-filter-panel-width'] = this.config.styles.width;\r\n if (this.config.styles.padding) styles['--cc-filter-panel-padding'] = this.config.styles.padding;\r\n if (this.config.styles.gap) styles['--cc-filter-panel-gap'] = this.config.styles.gap;\r\n if (this.config.styles.backgroundColor) styles['--cc-filter-panel-bg'] = this.config.styles.backgroundColor;\r\n if (this.config.styles.borderRadius) styles['--cc-filter-panel-radius'] = this.config.styles.borderRadius;\r\n if (this.config.styles.headerHeight) styles['--cc-filter-panel-header-height'] = this.config.styles.headerHeight;\r\n }\r\n return styles;\r\n }\r\n\r\n trackByFn(index: number, item: any): any {\r\n return item.key || index;\r\n }\r\n}\r\n","<div class=\"cc-filter-container\" [class.is-open]=\"isOpen\" [ngStyle]=\"containerStyles\">\r\n\r\n <!-- Trigger Button -->\r\n <lib-button variant=\"outline\" (click)=\"togglePanel()\" class=\"cc-filter-trigger\"\r\n [class.active]=\"activeFilterCount > 0\">\r\n <span class=\"fas fa-filter\"></span> {{ labels?.filterBtn || 'Filter' }}\r\n <span *ngIf=\"activeFilterCount > 0\" class=\"cc-badge\">{{ activeFilterCount }}</span>\r\n </lib-button>\r\n\r\n <!-- Dropdown Panel -->\r\n <div class=\"cc-filter-panel mat-elevation-z4\" *ngIf=\"isOpen\" (click)=\"$event.stopPropagation()\">\r\n\r\n <!-- Header / Tabs -->\r\n <div class=\"cc-panel-header\">\r\n <div class=\"cc-tabs\">\r\n <div class=\"cc-tab\" [class.active]=\"activeTab === 'filters'\" (click)=\"setActiveTab('filters')\">\r\n {{ labels.filterBtn }}\r\n </div>\r\n <!-- Hide columns tab if no columns config provided -->\r\n <div class=\"cc-tab\" [class.active]=\"activeTab === 'columns'\" (click)=\"setActiveTab('columns')\"\r\n *ngIf=\"columns?.length\">\r\n {{ labels.columns }}\r\n </div>\r\n </div>\r\n <button type=\"button\" class=\"cc-icon-btn\" (click)=\"togglePanel()\">\r\n <span class=\"material-icons\">close</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Filters Tab Content -->\r\n <div class=\"cc-panel-content\" *ngIf=\"activeTab === 'filters'\">\r\n\r\n <!-- Dynamic Items -->\r\n <ng-container *ngFor=\"let item of config.items; trackBy: trackByFn\">\r\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { item: item }\"></ng-container>\r\n </ng-container>\r\n\r\n </div>\r\n\r\n <!-- Columns Tab Content -->\r\n <div class=\"cc-panel-content\" *ngIf=\"activeTab === 'columns'\">\r\n <div class=\"cc-columns-actions\">\r\n <lib-button variant=\"outline\" class=\"cc-btn-text\" (click)=\"toggleAllColumns(true)\">{{ labels.showAll\r\n }}</lib-button>\r\n <lib-button variant=\"outline\" class=\"cc-btn-text\" (click)=\"toggleAllColumns(false)\">{{ labels.hideAll\r\n }}</lib-button>\r\n </div>\r\n <div class=\"cc-columns-list\">\r\n <div *ngFor=\"let col of tempColumns\" class=\"cc-column-item\">\r\n <lib-checkbox [label]=\"col.label\" [checked]=\"col.visible\" (checkedChange)=\"toggleColumn(col.id)\">\r\n </lib-checkbox>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Actions -->\r\n <div class=\"cc-panel-footer\">\r\n <lib-button variant=\"outline\" color=\"warn\" class=\"cc-btn-text text-danger\" (click)=\"clearAll()\">\r\n {{ labels.clear }}\r\n </lib-button>\r\n <lib-button class=\"ms-2\" variant=\"primary\" (click)=\"apply()\">\r\n {{ labels.apply }}\r\n </lib-button>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n\r\n<!-- Recursive Template for Items -->\r\n<ng-template #itemTemplate let-item=\"item\">\r\n <div class=\"cc-filter-item\" [ngClass]=\"['type-' + item.type]\"\r\n [style.display]=\"item.visible === false ? 'none' : 'block'\" [ngStyle]=\"item.styles\">\r\n\r\n <ng-container [ngSwitch]=\"item.type\">\r\n\r\n <!-- Input -->\r\n <lib-input *ngSwitchCase=\"'input'\" [config]=\"item.inputConfig\" [label]=\"item.label\"\r\n [ngModel]=\"tempFilters[item.key]\" (valueChange)=\"onFilterChange(item.key, $event)\">\r\n </lib-input>\r\n\r\n <!-- Dropdown -->\r\n <lib-dropdown *ngSwitchCase=\"'dropdown'\" [config]=\"item.dropdownConfig\" [label]=\"item.label\"\r\n [ngModel]=\"tempFilters[item.key]\" (selectionChange)=\"onFilterChange(item.key, $event)\">\r\n </lib-dropdown>\r\n\r\n <!-- Checkbox -->\r\n <lib-checkbox *ngSwitchCase=\"'checkbox'\" [config]=\"item.checkboxConfig\" [label]=\"item.label\"\r\n [ngModel]=\"tempFilters[item.key]\" (checkedChange)=\"onFilterChange(item.key, $event)\">\r\n </lib-checkbox>\r\n\r\n <!-- Radio -->\r\n <lib-radio *ngSwitchCase=\"'radio'\" [config]=\"item.radioConfig\" [label]=\"item.label\"\r\n [ngModel]=\"tempFilters[item.key]\" (selectionChange)=\"onFilterChange(item.key, $event)\">\r\n </lib-radio>\r\n\r\n <!-- Toggle -->\r\n <lib-toggle *ngSwitchCase=\"'toggle'\" [config]=\"item.toggleConfig\" [label]=\"item.label\"\r\n [checked]=\"tempFilters[item.key]\" (toggleChange)=\"onFilterChange(item.key, $event)\">\r\n </lib-toggle>\r\n\r\n <!-- Datepicker -->\r\n <lib-datepicker *ngSwitchCase=\"'datepicker'\" [config]=\"item.datepickerConfig\" [label]=\"item.label\"\r\n [ngModel]=\"tempFilters[item.key]\" (dateChange)=\"onFilterChange(item.key, $event)\">\r\n </lib-datepicker>\r\n\r\n <!-- Search -->\r\n <lib-search *ngSwitchCase=\"'active-search'\" [config]=\"item.searchConfig\" [label]=\"item.label\"\r\n [ngModel]=\"tempFilters[item.key]\" (search)=\"onFilterChange(item.key, $event)\">\r\n </lib-search>\r\n\r\n <!-- Group / Accordion -->\r\n <div *ngSwitchCase=\"'group'\" class=\"cc-accordion-item\" [class.expanded]=\"item.expanded\">\r\n <button type=\"button\" class=\"cc-accordion-header\" (click)=\"item.expanded = !item.expanded\">\r\n <span class=\"cc-accordion-title\">{{ item.label }}</span>\r\n <span class=\"material-icons cc-accordion-icon\">{{ item.expanded ? 'expand_less' : 'expand_more'\r\n }}</span>\r\n </button>\r\n\r\n <div class=\"cc-accordion-body\" *ngIf=\"item.expanded\">\r\n <ng-container *ngFor=\"let child of item.children; trackBy: trackByFn\">\r\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { item: child }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Custom Divider -->\r\n <div *ngSwitchCase=\"'divider'\" class=\"cc-filter-divider\"></div>\r\n\r\n </ng-container>\r\n </div>\r\n</ng-template>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { ButtonModule } from '../button/button.module';\r\nimport { FormComponentsModule } from '../form-components/form-components.module';\r\nimport { FilterComponent } from './components/filter/filter.component';\r\n\r\n@NgModule({\r\n declarations: [\r\n FilterComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n ButtonModule,\r\n FormComponentsModule\r\n ],\r\n exports: [\r\n FilterComponent\r\n ]\r\n})\r\nexport class FilterModule { }\r\n","export const DEFAULT_ITEMS_PER_PAGE = 10;\r\nexport const DEFAULT_PAGE_SIZE_OPTIONS = [10, 20, 50];\r\nexport const PAGINATION_THEME_DEFAULT = 'theme-1';\r\nexport const PAGINATION_THEME_DARK = 'theme-2';\r\n\r\n// Nav\r\nexport const NAV_VARIANT_DEFAULT: 'filled' | 'underline' | 'pills' = 'filled';\r\nexport const NAV_ORIENTATION_DEFAULT: 'horizontal' | 'vertical' = 'horizontal';\r\n\r\n// Side Nav\r\nexport const DEFAULT_SIDE_NAV_TOOLTIP_POSITION = 'right';\r\n","import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, HostBinding } from '@angular/core';\r\nimport { TooltipPosition } from '@angular/material/tooltip';\r\nimport { SideNavSection, SideNavItem, SideNavStyleConfig } from '../../side-nav.models';\r\nimport { DEFAULT_SIDE_NAV_TOOLTIP_POSITION } from '../../../../utils/constants';\r\n\r\n@Component({\r\n selector: 'lib-side-nav',\r\n templateUrl: './side-nav.component.html',\r\n styleUrls: ['./side-nav.component.scss'],\r\n standalone: false\r\n})\r\nexport class SideNavComponent implements OnChanges {\r\n @Input() sections: SideNavSection[] = [];\r\n @Input() userRoles?: string[]; // If provided, filters items automatically based on roles\r\n @Input() activeId?: string;\r\n @Input() styleConfig?: SideNavStyleConfig;\r\n\r\n /** Control whether the nav is collapsed externally (two-way bindable) */\r\n @Input() collapsed: boolean = false;\r\n /** Width of the nav when expanded. Overrides the CSS variable default. */\r\n @Input() width?: string;\r\n /** Width of the nav when collapsed (icons only). Overrides the CSS variable default. */\r\n @Input() collapsedWidth?: string;\r\n /** Whether to show the collapse toggle button */\r\n @Input() showCollapseToggle: boolean = true;\r\n /** Whether to hide icons when the side nav is expanded */\r\n @Input() hideIconsWhenExpanded: boolean = false;\r\n /** Whether to show tooltips on nav items */\r\n @Input() showTooltips: boolean = true;\r\n /** Position of the tooltip */\r\n @Input() tooltipPosition: TooltipPosition = DEFAULT_SIDE_NAV_TOOLTIP_POSITION as TooltipPosition;\r\n\r\n /** Optional dictionary for label translation */\r\n @Input() labels?: { [key: string]: string };\r\n\r\n @Output() itemClicked = new EventEmitter<SideNavItem>();\r\n /** Emits whenever the collapsed state changes (supports two-way binding via [(collapsed)]) */\r\n @Output() collapsedChange = new EventEmitter<boolean>();\r\n\r\n /** Applies collapsed class to :host for the width CSS transition */\r\n @HostBinding('class.cc-side-nav-host-collapsed') get isHostCollapsed() {\r\n return this.collapsed;\r\n }\r\n\r\n filteredSections: SideNavSection[] = [];\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['sections'] || changes['userRoles'] || changes['labels']) {\r\n this.filterAndMapSections();\r\n }\r\n }\r\n\r\n private filterAndMapSections() {\r\n if (!this.sections) {\r\n this.filteredSections = [];\r\n return;\r\n }\r\n\r\n const clonedSections: SideNavSection[] = structuredClone(this.sections);\r\n\r\n this.filteredSections = clonedSections.map(section => {\r\n // Map section heading if labels are provided\r\n if (this.labels && section.heading) {\r\n section.heading = this.labels[section.heading] || section.heading;\r\n }\r\n\r\n // Filter and map items\r\n section.items = section.items.filter(item => {\r\n if (this.userRoles && this.userRoles.length > 0 && item.roles && item.roles.length > 0) {\r\n const hasRole = item.roles.some(role => this.userRoles?.includes(role));\r\n if (!hasRole) return false;\r\n }\r\n return true;\r\n }).map((item: any) => {\r\n // Map item labels and tooltips\r\n if (this.labels) {\r\n const mappedLabel = this.labels[item.labelKey || item.label] || item.labelKey || item.label;\r\n return {\r\n ...item,\r\n label: mappedLabel,\r\n tooltip: this.labels[item.tooltip || item.labelKey] || mappedLabel\r\n };\r\n }\r\n return item;\r\n });\r\n\r\n return section;\r\n }).filter(section => section.items.length > 0);\r\n }\r\n\r\n onItemClick(item: SideNavItem, event: Event) {\r\n if (item.disabled) {\r\n event.preventDefault();\r\n return;\r\n }\r\n this.activeId = item.id;\r\n this.itemClicked.emit(item);\r\n }\r\n\r\n toggleCollapse() {\r\n this.collapsed = !this.collapsed;\r\n this.collapsedChange.emit(this.collapsed);\r\n }\r\n\r\n get customStyles(): { [key: string]: string } {\r\n const styles: { [key: string]: string } = {};\r\n\r\n // Size overrides from direct inputs (take priority over styleConfig)\r\n if (this.width) styles['--cc-side-nav-width'] = this.width;\r\n if (this.collapsedWidth) styles['--cc-side-nav-collapsed-width'] = this.collapsedWidth;\r\n\r\n if (!this.styleConfig) return styles;\r\n\r\n if (this.styleConfig.bg) styles['--cc-side-nav-bg'] = this.styleConfig.bg;\r\n if (this.styleConfig.width) styles['--cc-side-nav-width'] = this.styleConfig.width;\r\n if (this.styleConfig.collapsedWidth) styles['--cc-side-nav-collapsed-width'] = this.styleConfig.collapsedWidth;\r\n if (this.styleConfig.fontFamily) styles['--cc-side-nav-font-family'] = this.styleConfig.fontFamily;\r\n if (this.styleConfig.headingColor) styles['--cc-side-nav-heading-color'] = this.styleConfig.headingColor;\r\n if (this.styleConfig.itemColor) styles['--cc-side-nav-item-color'] = this.styleConfig.itemColor;\r\n if (this.styleConfig.itemHoverBg) styles['--cc-side-nav-item-hover-bg'] = this.styleConfig.itemHoverBg;\r\n if (this.styleConfig.activeBg) styles['--cc-side-nav-active-bg'] = this.styleConfig.activeBg;\r\n if (this.styleConfig.activeColor) styles['--cc-side-nav-active-color'] = this.styleConfig.activeColor;\r\n if (this.styleConfig.activeHoverBg) styles['--cc-side-nav-active-hover-bg'] = this.styleConfig.activeHoverBg;\r\n\r\n return styles;\r\n }\r\n}","<nav class=\"cc-side-nav\" [class.collapsed]=\"collapsed\" role=\"navigation\" [ngStyle]=\"customStyles\">\r\n\r\n <!-- Fallback standalone toggle if no sections exist -->\r\n <div class=\"cc-side-nav-toggle-wrap standalone\" *ngIf=\"filteredSections.length === 0 && showCollapseToggle\">\r\n <button class=\"cc-side-nav-toggle\" (click)=\"toggleCollapse()\" type=\"button\"\r\n [attr.aria-label]=\"collapsed ? 'Expand navigation' : 'Collapse navigation'\">\r\n <span class=\"material-icons cc-side-nav-toggle-icon\">\r\n {{ collapsed ? 'menu_open' : 'menu' }}\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"cc-side-nav-section\" *ngFor=\"let section of filteredSections; let i = index\">\r\n\r\n <div class=\"cc-side-nav-heading-row\" *ngIf=\"section.heading || (i === 0 && showCollapseToggle)\">\r\n <h3 class=\"cc-side-nav-heading\" *ngIf=\"section.heading && !collapsed\">\r\n {{ section.heading }}\r\n </h3>\r\n\r\n <div class=\"cc-side-nav-toggle-wrap\" *ngIf=\"i === 0 && showCollapseToggle\"\r\n [class.no-heading]=\"!section.heading || collapsed\">\r\n <button class=\"cc-side-nav-toggle\" (click)=\"toggleCollapse()\" type=\"button\"\r\n [attr.aria-label]=\"collapsed ? 'Expand navigation' : 'Collapse navigation'\">\r\n <span class=\"material-icons cc-side-nav-toggle-icon\">\r\n {{ collapsed ? 'menu_open' : 'menu' }}\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <ul class=\"cc-side-nav-list\">\r\n <li *ngFor=\"let item of section.items\" class=\"cc-side-nav-list-item\">\r\n <a (click)=\"onItemClick(item, $event)\" class=\"cc-side-nav-link\" [class.active]=\"item.id === activeId\"\r\n [class.disabled]=\"item.disabled\" [matTooltip]=\"item.tooltip || item.label\"\r\n [matTooltipDisabled]=\"!showTooltips\" [matTooltipPosition]=\"tooltipPosition\"\r\n [matTooltipClass]=\"'cc-side-nav-tooltip'\" [attr.aria-current]=\"(item.id === activeId) ? 'page' : null\"\r\n [attr.aria-disabled]=\"item.disabled ? true : null\">\r\n <span *ngIf=\"item.icon && (collapsed || !hideIconsWhenExpanded)\" class=\"cc-side-nav-icon\">\r\n\r\n <span *ngIf=\"!item.icon.includes('fa') && !item.icon.includes('bi')\" class=\"material-icons\">\r\n {{ item.icon }}\r\n </span>\r\n\r\n <i *ngIf=\"item.icon.includes('fa') || item.icon.includes('bi')\" [class]=\"item.icon\"></i>\r\n\r\n </span>\r\n <span class=\"cc-side-nav-label\" *ngIf=\"!collapsed\">{{ item.label }}</span>\r\n <span class=\"cc-side-nav-arrow material-icons\"\r\n *ngIf=\"!collapsed && (item.id === activeId) && item.showArrow !== false\">chevron_right</span>\r\n </a>\r\n </li>\r\n </ul>\r\n\r\n </div>\r\n\r\n</nav>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { RouterModule } from '@angular/router';\r\nimport { MaterialModule } from '../material/material.module';\r\nimport { SideNavComponent } from './components/side-nav/side-nav.component';\r\n\r\n@NgModule({\r\n declarations: [SideNavComponent],\r\n imports: [\r\n CommonModule,\r\n RouterModule,\r\n MaterialModule\r\n ],\r\n exports: [SideNavComponent]\r\n})\r\nexport class SideNavModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MaterialModule } from './modules/material/material.module';\r\nimport { AlertModule } from './modules/alert/alert.module';\r\nimport { ButtonModule } from './modules/button/button.module';\r\nimport { ButtonDropdownModule } from './modules/button-dropdown/button-dropdown.module';\r\nimport { ConfirmationModalModule } from './modules/confirmation-modal/confirmation-modal.module';\r\nimport { FilterSidebarModule } from './modules/filter-sidebar/filter-sidebar.module';\r\nimport { SummaryCardModule } from './modules/summary-card/summary-card.module';\r\nimport { ConfigurableFormModule } from './modules/configurable-form/configurable-form.module';\r\nimport { FormComponentsModule } from './modules/form-components/form-components.module';\r\nimport { SmartFormModule } from './modules/smart-form/smart-form.module';\r\nimport { FilterModule } from './modules/filter/filter.module';\r\nimport { SideNavModule } from './modules/side-nav/side-nav.module';\r\nimport { FormBuilderModule } from './modules/form-builder/form-builder.module';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule,\r\n MaterialModule,\r\n AlertModule, ButtonModule, ButtonDropdownModule, ConfirmationModalModule, FilterSidebarModule, FilterModule,\r\n SummaryCardModule,\r\n ConfigurableFormModule,\r\n FormComponentsModule,\r\n SmartFormModule,\r\n SideNavModule,\r\n FormBuilderModule\r\n ],\r\n exports: [\r\n MaterialModule,\r\n AlertModule, ButtonModule, ButtonDropdownModule, ConfirmationModalModule, FilterSidebarModule, FilterModule,\r\n SummaryCardModule,\r\n ConfigurableFormModule,\r\n FormComponentsModule,\r\n SmartFormModule,\r\n SideNavModule,\r\n FormBuilderModule\r\n ],\r\n})\r\nexport class SharedUiModule { }\r\n","/**\n * Utility functions for LocalStorage operations\n */\nexport const getLocalStorageItem = (key: string): string | null => {\n return localStorage.getItem(key);\n};\n\nexport const setLocalStorageItem = (key: string, value: string): void => {\n localStorage.setItem(key, value);\n};\n\nexport const removeLocalStorageItem = (key: string): void => {\n localStorage.removeItem(key);\n};\n\nexport const clearLocalStorage = (): void => {\n localStorage.clear();\n};\n\n/**\n * Utility functions for SessionStorage operations\n */\nexport const getSessionStorageItem = (key: string): string | null => {\n return sessionStorage.getItem(key);\n};\n\nexport const setSessionStorageItem = (key: string, value: string): void => {\n sessionStorage.setItem(key, value);\n};\n\nexport const removeSessionStorageItem = (key: string): void => {\n sessionStorage.removeItem(key);\n};\n\nexport const clearSessionStorage = (): void => {\n sessionStorage.clear();\n};\n","import { FormConfig } from './configurable-form.model';\r\n\r\n/**\r\n * Example: Basic Form Configuration\r\n * This is a generic example for testing and demonstration purposes.\r\n */\r\nexport const EXAMPLE_FORM_CONFIG: FormConfig = {\r\n sections: [\r\n {\r\n sectionTitle: 'User Information',\r\n fields: [\r\n {\r\n name: 'fullName',\r\n label: 'Full Name',\r\n type: 'text',\r\n placeholder: 'Enter full name',\r\n required: true,\r\n class: 'col-12'\r\n },\r\n {\r\n name: 'email',\r\n label: 'Email Address',\r\n type: 'email',\r\n placeholder: 'Enter email address',\r\n required: true,\r\n class: 'col-6'\r\n },\r\n {\r\n name: 'phone',\r\n label: 'Phone Number',\r\n type: 'tel',\r\n placeholder: '+91 9999999999',\r\n class: 'col-6'\r\n },\r\n {\r\n name: 'role',\r\n label: 'Role',\r\n type: 'dropdown',\r\n placeholder: 'Select Role',\r\n options: [\r\n { label: 'Admin', value: 'admin' },\r\n { label: 'User', value: 'user' },\r\n { label: 'Guest', value: 'guest' }\r\n ],\r\n class: 'col-12'\r\n }\r\n ]\r\n },\r\n {\r\n sectionTitle: 'Preferences',\r\n fields: [\r\n {\r\n name: 'notifications',\r\n label: 'Receive Notifications',\r\n type: 'radio',\r\n options: [\r\n { label: 'Yes', value: 'yes' },\r\n { label: 'No', value: 'no' }\r\n ],\r\n value: 'yes',\r\n class: 'col-12'\r\n }\r\n ]\r\n },\r\n {\r\n sectionTitle: 'Documents',\r\n fields: [\r\n {\r\n name: 'profilePicture',\r\n label: 'Profile Picture',\r\n type: 'file',\r\n accept: '.jpg,.png',\r\n multiple: false,\r\n helpText: 'Upload a single profile picture (Max 5MB)',\r\n class: 'col-12'\r\n },\r\n {\r\n name: 'certificates',\r\n label: 'Certificates',\r\n type: 'file',\r\n accept: '.pdf,.doc,.docx',\r\n multiple: true,\r\n helpText: 'Upload multiple certificates (Max 5MB each)',\r\n class: 'col-12'\r\n }\r\n ]\r\n }\r\n ],\r\n entityType: 'User'\r\n};\r\n\r\n/**\r\n * Example: Target Group Configuration\r\n * Demonstrates composite fields for Age Group and Gender Split\r\n */\r\nexport const TARGET_GROUP_CONFIG: FormConfig = {\r\n sections: [\r\n {\r\n sectionTitle: 'Target Group Settings',\r\n fields: [\r\n {\r\n name: 'targetAgeGroup',\r\n label: 'Target Age Group',\r\n type: 'composite',\r\n separator: '-',\r\n subFields: [\r\n {\r\n label: \"Min Age\",\r\n name: 'minAge',\r\n type: 'number',\r\n placeholder: 'Min Age',\r\n validationRules: { min: 0 }\r\n },\r\n {\r\n label: \"Max Age\",\r\n name: 'maxAge',\r\n type: 'number',\r\n placeholder: 'Max Age',\r\n validationRules: { min: 0 }\r\n }\r\n ],\r\n compositeValidationRule: 'minMax',\r\n class: 'col-12'\r\n },\r\n {\r\n name: 'genderSplit',\r\n label: 'Target Gender Split',\r\n type: 'composite',\r\n subFields: [\r\n {\r\n label: \"Male\",\r\n name: 'malePercentage',\r\n type: 'number',\r\n placeholder: 'Male',\r\n suffixText: '%',\r\n validationRules: { min: 0, max: 100 }\r\n },\r\n {\r\n label: \"Female\",\r\n name: 'femalePercentage',\r\n type: 'number',\r\n placeholder: 'Female',\r\n suffixText: '%',\r\n validationRules: { min: 0, max: 100 }\r\n }\r\n ],\r\n compositeValidationRule: 'percentageTotal',\r\n class: 'col-12'\r\n }\r\n ]\r\n }\r\n ],\r\n\r\n};\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { DEFAULT_ITEMS_PER_PAGE, DEFAULT_PAGE_SIZE_OPTIONS, PAGINATION_THEME_DEFAULT } from '../../../../utils/constants';\n\nexport interface PaginationLabels {\n items: string;\n of: string;\n perPage: string;\n}\n\n@Component({\n selector: 'lib-pagination',\n templateUrl: './pagination.component.html',\n styleUrls: ['./pagination.component.scss'],\n standalone: false\n})\nexport class PaginationComponent implements OnInit, OnChanges {\n @Input() totalItems: number = 0;\n @Input() itemsPerPage: number = DEFAULT_ITEMS_PER_PAGE;\n @Input() currentPage: number = 1;\n @Input() pageSizeOptions: number[] = DEFAULT_PAGE_SIZE_OPTIONS;\n @Input() theme: 'theme-1' | 'theme-2' = PAGINATION_THEME_DEFAULT;\n @Input() labels: PaginationLabels = {\n items: 'items',\n of: 'of',\n perPage: 'Per Page'\n };\n\n @Output() pageChange = new EventEmitter<number>();\n @Output() itemsPerPageChange = new EventEmitter<number>();\n\n totalPages: number = 0;\n pages: (number | string)[] = [];\n startItem: number = 0;\n endItem: number = 0;\n\n constructor() { }\n\n ngOnInit(): void {\n this.calculatePagination();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['totalItems'] || changes['itemsPerPage'] || changes['currentPage']) {\n this.calculatePagination();\n }\n }\n\n calculatePagination(): void {\n this.totalPages = Math.ceil(this.totalItems / this.itemsPerPage);\n\n // Ensure current page is valid\n if (this.currentPage < 1) {\n this.currentPage = 1;\n } else if (this.currentPage > this.totalPages && this.totalPages > 0) {\n this.currentPage = this.totalPages;\n }\n\n this.startItem = (this.currentPage - 1) * this.itemsPerPage + 1;\n this.endItem = Math.min(this.currentPage * this.itemsPerPage, this.totalItems);\n\n if (this.totalItems === 0) {\n this.startItem = 0;\n this.endItem = 0;\n }\n\n this.pages = this.getVisiblePages(this.currentPage, this.totalPages);\n }\n\n getVisiblePages(current: number, total: number): (number | string)[] {\n if (total <= 7) {\n return Array.from({ length: total }, (_, i) => i + 1);\n }\n\n if (current <= 4) {\n return [1, 2, 3, 4, 5, '...', total];\n }\n\n if (current >= total - 3) {\n return [1, '...', total - 4, total - 3, total - 2, total - 1, total];\n }\n\n return [1, '...', current - 1, current, current + 1, '...', total];\n }\n\n onPageChange(page: number | string): void {\n if (typeof page === 'string') return;\n if (page < 1 || page > this.totalPages || page === this.currentPage) return;\n \n this.pageChange.emit(page);\n }\n\n onItemsPerPageChange(event: Event): void {\n const target = event.target as HTMLSelectElement;\n const newSize = Number(target.value);\n this.itemsPerPageChange.emit(newSize);\n }\n\n nextPage(): void {\n if (this.currentPage < this.totalPages) {\n this.onPageChange(this.currentPage + 1);\n }\n }\n\n prevPage(): void {\n if (this.currentPage > 1) {\n this.onPageChange(this.currentPage - 1);\n }\n }\n}\n","<div class=\"cc-pagination\" [ngClass]=\"theme\">\n <!-- Left Side: Items Info & Per Page -->\n <div class=\"pagination-left\" *ngIf=\"pageSizeOptions.length > 1 || totalItems > 0\">\n <span class=\"items-info\">\n {{ startItem }}-{{ endItem }} {{ labels.of }} {{ totalItems }} {{ labels.items }}\n </span>\n\n <div class=\"per-page-selector\" *ngIf=\"pageSizeOptions.length > 1\">\n <div class=\"select-wrapper\">\n <select [value]=\"itemsPerPage\" (change)=\"onItemsPerPageChange($event)\">\n <option *ngFor=\"let option of pageSizeOptions\" [value]=\"option\">\n {{ option }}\n </option>\n </select>\n <span class=\"select-arrow\"></span>\n </div>\n <span class=\"per-page-label\">{{ labels.perPage }}</span>\n </div>\n </div>\n\n <!-- Right Side: Page Controls -->\n <div class=\"pagination-right\">\n <button \n class=\"page-btn prev-btn\" \n [disabled]=\"currentPage === 1\" \n (click)=\"prevPage()\"\n aria-label=\"Previous Page\">\n <span class=\"icon\">‹</span>\n </button>\n\n <div class=\"page-numbers\">\n <ng-container *ngFor=\"let page of pages\">\n <button \n *ngIf=\"page !== '...'\"\n class=\"page-btn number-btn\" \n [class.active]=\"page === currentPage\"\n (click)=\"onPageChange(page)\">\n {{ page }}\n </button>\n <span *ngIf=\"page === '...'\" class=\"ellipsis\">...</span>\n </ng-container>\n </div>\n\n <button \n class=\"page-btn next-btn\" \n [disabled]=\"currentPage === totalPages || totalPages === 0\" \n (click)=\"nextPage()\"\n aria-label=\"Next Page\">\n <span class=\"icon\">›</span>\n </button>\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PaginationComponent } from './components/pagination/pagination.component';\n\n\n@NgModule({\n declarations: [\n PaginationComponent\n ],\n imports: [\n CommonModule\n ],\n exports: [\n PaginationComponent\n ]\n})\nexport class PaginationModule { }\n","import { Component, EventEmitter, Input, Output, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { NAV_VARIANT_DEFAULT, NAV_ORIENTATION_DEFAULT } from '../../../../utils/constants';\r\nimport { NavStyleConfig } from '../../nav.models';\r\n\r\nexport interface NavItem {\r\n id: string | number;\r\n label: string;\r\n icon?: string;\r\n badge?: string | number;\r\n disabled?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-nav',\r\n templateUrl: './nav.component.html',\r\n styleUrls: ['./nav.component.scss'],\r\n standalone: false\r\n})\r\nexport class NavComponent implements OnChanges {\r\n @Input() items: NavItem[] = [];\r\n @Input() activeId: string | number | null = null;\r\n @Input() variant: 'filled' | 'underline' | 'pills' = NAV_VARIANT_DEFAULT;\r\n @Input() orientation: 'horizontal' | 'vertical' = NAV_ORIENTATION_DEFAULT;\r\n @Input() styleConfig: NavStyleConfig = {};\r\n\r\n @Output() selectionChange = new EventEmitter<NavItem>();\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['styleConfig']) {\r\n console.log(' [NavComponent] styleConfig changed:', this.styleConfig);\r\n console.log(' [NavComponent] computedStyles:', this.computedStyles);\r\n }\r\n }\r\n\r\n get computedStyles(): { [key: string]: string | undefined } {\r\n const c = this.styleConfig;\r\n return {\r\n // Container (direct CSS)\r\n 'width': c.width,\r\n 'box-shadow': c.boxShadow,\r\n\r\n // Container (CSS Variables)\r\n '--cc-nav-container-bg': c.backgroundColor,\r\n '--cc-nav-container-radius': c.borderRadius,\r\n '--cc-nav-container-border': c.border,\r\n '--cc-nav-container-padding': c.padding,\r\n '--cc-nav-container-gap': c.gap,\r\n\r\n // Item (CSS Variables)\r\n '--cc-nav-font-size': c.fontSize,\r\n '--cc-nav-font-weight': c.fontWeight,\r\n '--cc-nav-item-color': c.itemColor,\r\n '--cc-nav-item-radius': c.itemRadius,\r\n '--cc-nav-item-padding': c.itemPadding,\r\n\r\n // Active Item (CSS Variables)\r\n '--cc-nav-item-active-bg': c.activeItemBg,\r\n '--cc-nav-item-active-color': c.activeItemColor,\r\n '--cc-nav-item-active-font-weight': c.activeItemFontWeight,\r\n '--cc-nav-item-active-border-color': c.activeItemBorderColor,\r\n\r\n // Hover Item (CSS Variables)\r\n '--cc-nav-item-hover-bg': c.hoverItemBg,\r\n '--cc-nav-item-hover-color': c.hoverItemColor,\r\n\r\n // Badge (CSS Variables)\r\n '--cc-nav-badge-bg': c.badgeBg,\r\n '--cc-nav-badge-color': c.badgeColor,\r\n };\r\n }\r\n\r\n onItemClick(item: NavItem): void {\r\n if (item.disabled) return;\r\n if (item.id === this.activeId) return;\r\n\r\n this.selectionChange.emit(item);\r\n }\r\n\r\n trackById(index: number, item: NavItem): string | number {\r\n return item.id;\r\n }\r\n}\r\n","<nav\r\n class=\"cc-nav\"\r\n [ngClass]=\"[variant, orientation]\"\r\n [ngStyle]=\"computedStyles\"\r\n role=\"tablist\"\r\n [attr.aria-orientation]=\"orientation\">\r\n\r\n <button\r\n *ngFor=\"let item of items; trackBy: trackById\"\r\n class=\"cc-nav-item\"\r\n [class.active]=\"item.id === activeId\"\r\n [class.disabled]=\"item.disabled\"\r\n [disabled]=\"item.disabled\"\r\n role=\"tab\"\r\n [attr.aria-selected]=\"item.id === activeId\"\r\n [attr.aria-disabled]=\"item.disabled || null\"\r\n (click)=\"onItemClick(item)\">\r\n\r\n <!-- Icon (optional) -->\r\n <span *ngIf=\"item.icon\" class=\"cc-nav-item-icon\">\r\n <i [ngClass]=\"item.icon\"></i>\r\n </span>\r\n\r\n <!-- Label -->\r\n <span class=\"cc-nav-item-label\">{{ item.label }}</span>\r\n\r\n <!-- Badge (optional) -->\r\n <span *ngIf=\"item.badge != null\" class=\"cc-nav-item-badge\">\r\n {{ item.badge }}\r\n </span>\r\n\r\n </button>\r\n\r\n</nav>\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NavComponent } from './components/nav/nav.component';\r\n\r\n\r\n@NgModule({\r\n declarations: [\r\n NavComponent\r\n ],\r\n imports: [\r\n CommonModule\r\n ],\r\n exports: [\r\n NavComponent\r\n ]\r\n})\r\nexport class NavModule { }\r\n","import { Component, EventEmitter, Input, OnInit, Output, OnChanges, SimpleChanges, AfterViewInit, OnDestroy, ViewChildren, QueryList, ElementRef, ChangeDetectorRef, NgZone, inject, LOCALE_ID, HostListener } from '@angular/core';\nimport { TableConfig, TableColumn, TableAction, TableFilter } from '../../models/table-config.model';\nimport { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http';\nimport { formatDate } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { catchError, finalize, map, debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { of, forkJoin, Subject } from 'rxjs';\n\n@Component({\n selector: 'lib-smart-table',\n templateUrl: './smart-table.component.html',\n styleUrls: ['./smart-table.component.scss'],\n standalone: false\n})\nexport class SmartTableComponent implements OnInit, OnChanges, AfterViewInit, OnDestroy {\n @Input() config!: TableConfig;\n \n @Output() action = new EventEmitter<{ action: TableAction, row: any }>();\n @Output() topAction = new EventEmitter<TableAction>(); // For top bar buttons\n @Output() filterChange = new EventEmitter<{ key: string, value: any }>();\n @Output() rowSelect = new EventEmitter<any[]>();\n @Output() columnClick = new EventEmitter<{ row: any, column: string }>();\n\n data: any[] = [];\n totalItems: number = 0;\n currentPage: number = 1;\n loading: boolean = false;\n \n // State\n activeSort: { key: string, direction: 'ASC' | 'DESC' } = { key: '', direction: 'ASC' };\n activeFilters: { [key: string]: any } = {};\n searchTerm: string = '';\n selectedRows: any[] = [];\n stickyColumnStyles: { [key: string]: any } = {};\n hasStickyColumns: boolean = false;\n openDropdownId: string | null = null;\n\n searchSubject = new Subject<string>();\n\n @ViewChildren('stickyHeader') stickyHeaders!: QueryList<ElementRef>;\n private resizeObserver: ResizeObserver | null = null;\n private locale = inject(LOCALE_ID);\n\n constructor(\n private http: HttpClient, \n private router: Router,\n private cdr: ChangeDetectorRef,\n private ngZone: NgZone\n ) { \n // Debounce search input\n this.searchSubject.pipe(\n debounceTime(this.config?.searchConfig?.debounceTime || 300),\n distinctUntilChanged()\n ).subscribe(term => {\n this.searchTerm = term;\n this.currentPage = 1;\n this.loadData();\n });\n }\n\n ngOnInit(): void {\n if (this.config) {\n if (this.config.sortBy) {\n this.activeSort.key = this.config.sortBy;\n }\n if (this.config.orderBy) {\n this.activeSort.direction = this.config.orderBy;\n }\n this.loadFilterOptions();\n this.loadData();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && !changes['config'].firstChange) {\n this.loadFilterOptions();\n this.loadData();\n setTimeout(() => this.calculateStickyPositions());\n }\n }\n\n ngAfterViewInit(): void {\n this.setupResizeObserver();\n }\n\n ngOnDestroy(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n }\n\n private setupResizeObserver(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n \n this.resizeObserver = new ResizeObserver(() => {\n this.ngZone.run(() => {\n this.calculateStickyPositions();\n });\n });\n\n if (this.stickyHeaders) {\n this.stickyHeaders.changes.subscribe(() => {\n this.observeHeaders();\n // Also recalculate immediately\n setTimeout(() => this.calculateStickyPositions());\n });\n this.observeHeaders();\n }\n }\n\n private observeHeaders(): void {\n if (!this.resizeObserver || !this.stickyHeaders) return;\n this.stickyHeaders.forEach(header => {\n this.resizeObserver!.observe(header.nativeElement);\n });\n }\n \n loadData(): void {\n if (!this.config?.apiUrl) return;\n \n this.loading = true;\n let params: HttpParams;\n\n // --- Query Params Construction ---\n if (this.config.queryParamsConfig) {\n const qpConfig = this.config.queryParamsConfig;\n const pageKey = qpConfig.pageKey || 'page';\n const sizeKey = qpConfig.sizeKey || 'pageSize';\n const pageIndex = this.currentPage + (qpConfig.pageIndexOffset || 0);\n\n let paramsObj: any = {\n [pageKey]: pageIndex.toString(),\n [sizeKey]: (this.config.pagination?.pageSize || 10).toString()\n };\n\n if (this.activeSort.key) paramsObj['sortBy'] = this.activeSort.key;\n // Note: Some APIs might use different keys for sort/order, can be extended later if needed\n if (this.activeSort.direction) paramsObj['orderBy'] = this.activeSort.direction;\n \n // Search Handling\n if (this.searchTerm) {\n const searchConfig = this.config.searchConfig;\n const searchKey = searchConfig?.searchKey || 'search';\n \n if (searchConfig?.handling === 'nested_string' && qpConfig.nestedStringConfig) {\n // Will be handled in nested string construction below\n } else {\n paramsObj[searchKey] = this.searchTerm;\n }\n }\n\n // Filter Handling (and Search if nested)\n if (qpConfig.filterHandling === 'nested_string' && qpConfig.nestedStringConfig) {\n const { paramName, baseValue, separator, assignment } = qpConfig.nestedStringConfig;\n let nestedString = baseValue || '';\n const assign = assignment || '=';\n\n // Add Filters\n Object.keys(this.activeFilters).forEach(key => {\n if (this.activeFilters[key]) {\n const prefix = nestedString ? separator : '';\n nestedString += `${prefix}${key}${assign}${this.activeFilters[key]}`;\n }\n });\n \n // Add Search if nested\n if (this.searchTerm && this.config.searchConfig?.handling === 'nested_string') {\n const searchKey = this.config.searchConfig.searchKey || 'SEARCH_TERM';\n const prefix = nestedString ? separator : '';\n nestedString += `${prefix}${searchKey}${assign}${this.searchTerm}`;\n }\n\n paramsObj[paramName] = nestedString;\n } else {\n // Standard handling\n Object.keys(this.activeFilters).forEach(key => {\n if (this.activeFilters[key]) paramsObj[key] = this.activeFilters[key];\n });\n }\n params = new HttpParams({ fromObject: paramsObj });\n\n } else {\n // --- Default Behavior (Backward Compatibility) ---\n let paramsObj: any = {};\n \n if (this.config.pagination?.enabled) {\n paramsObj['page'] = this.currentPage;\n paramsObj['pageSize'] = this.config.pagination.pageSize;\n }\n\n if (this.activeSort.key) {\n paramsObj['sortBy'] = this.activeSort.key;\n paramsObj['orderBy'] = this.activeSort.direction;\n }\n\n if (this.searchTerm) {\n const searchKey = this.config.searchConfig?.searchKey || 'search';\n paramsObj[searchKey] = this.searchTerm;\n }\n\n Object.keys(this.activeFilters).forEach(key => {\n if (this.activeFilters[key]) {\n paramsObj[key] = this.activeFilters[key];\n }\n });\n\n // Custom Request Params Mapper (if provided)\n if (this.config.requestParams) {\n const customParams = this.config.requestParams(\n this.currentPage, \n this.config.pagination?.pageSize || 10, \n this.activeSort.key, \n this.activeSort.direction, \n this.searchTerm, \n this.activeFilters\n );\n if (customParams instanceof HttpParams) {\n // If function returns HttpParams, use it directly (caveat: might lose previous params if not careful in mapper)\n params = customParams;\n } else {\n paramsObj = { ...paramsObj, ...customParams };\n params = new HttpParams({ fromObject: paramsObj });\n }\n } else {\n params = new HttpParams({ fromObject: paramsObj });\n }\n }\n\n // --- Data Fetching ---\n \n // Check for separate count API\n const totalCountConfig = this.config.pagination?.totalCountConfig;\n let request$: any; // Observable\n\n if (totalCountConfig?.source === 'separate' && totalCountConfig.apiUrl) {\n const headers = this.getHeaders();\n const method = this.config.apiMethod || 'GET';\n const body = this.config.apiPayload || {};\n\n const dataRequest$ = method === 'POST' ? this.http.post<any>(this.config.apiUrl, body, { params, headers }) : this.http.get<any>(this.config.apiUrl, { params, headers });\n const countRequest$ = method === 'POST' ? this.http.post<any>(totalCountConfig.apiUrl, body, { params, headers }) : this.http.get<any>(totalCountConfig.apiUrl, { params, headers });\n\n request$ = forkJoin({\n data: dataRequest$,\n count: countRequest$\n }).pipe(\n map(({ data, count }) => {\n const dataPath = this.config.dataResponsePath !== undefined ? this.config.dataResponsePath : '';\n return {\n data: this.getValueByPath(data, dataPath),\n total: this.getValueByPath(count, totalCountConfig.responsePath || '')\n };\n })\n );\n } else {\n \n const headers = this.getHeaders();\n const method = this.config.apiMethod || 'GET';\n const body = this.config.apiPayload || {};\n \n const baseRequest$ = method === 'POST' ? this.http.post<any>(this.config.apiUrl, body, { params, headers }) : this.http.get<any>(this.config.apiUrl, { params, headers });\n\n request$ = baseRequest$.pipe(\n map(response => {\n const dataPath = this.config.dataResponsePath !== undefined ? this.config.dataResponsePath : '';\n const totalPath = totalCountConfig?.responsePath || '';\n return {\n data: this.getValueByPath(response, dataPath),\n // If source is 'same', try to get total from response, else default 0\n total: totalCountConfig ? this.getValueByPath(response, totalPath) : 0\n };\n })\n );\n }\n\n request$.pipe(\n finalize(() => this.loading = false),\n catchError(err => {\n console.error('Table Data Fetch Error', err);\n return of({ data: [], total: 0 }); \n })\n )\n .subscribe((result: any) => {\n this.data = result.data || [];\n if (this.config.pagination) {\n this.totalItems = result.total || 0;\n }\n\n // Dynamic Column Generation\n if (!this.config.columns || this.config.columns.length === 0) {\n if (this.data.length > 0) {\n this.config.columns = Object.keys(this.data[0]).map(key => ({\n key: key,\n label: this.toTitleCase(key),\n type: 'text',\n sortable: false,\n editable: false\n }));\n }\n }\n });\n }\n\n // --- Actions ---\n\n onPageChange(page: number): void {\n this.currentPage = page;\n this.loadData();\n }\n\n onPageSizeChange(size: number): void {\n if (this.config.pagination) {\n this.config.pagination.pageSize = size;\n this.currentPage = 1; // Reset to first page\n this.loadData();\n }\n }\n\n onSort(col: TableColumn): void {\n if (!col.sortable) return;\n\n if (this.activeSort.key === col.key) {\n this.activeSort.direction = this.activeSort.direction === 'ASC' ? 'DESC' : 'ASC';\n } else {\n this.activeSort.key = col.key;\n this.activeSort.direction = 'ASC';\n }\n this.loadData();\n }\n\n onSearch(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.searchSubject.next(value);\n }\n\n onFilterChange(key: string, event: Event): void {\n const value = (event.target as HTMLSelectElement).value;\n this.activeFilters[key] = value;\n this.currentPage = 1;\n this.filterChange.emit({ key, value });\n this.loadData();\n }\n \n onAction(action: TableAction, row: any): void {\n if (action.type === 'callback' && action.callback) {\n action.callback(row);\n }\n \n if (action.type === 'route' && action.route) {\n const url = this.replaceParams(action.route, row);\n this.router.navigateByUrl(url);\n return;\n }\n\n if (action.type === 'api') {\n if (action.confirmationNeeded) {\n const message = action.confirmationMessage || this.config.labels?.defaultConfirmationMessage || 'Are you sure?';\n if (!confirm(message)) return;\n }\n if (action.apiUrl) {\n this.executeApiAction(action, row);\n } else {\n this.action.emit({ action, row });\n }\n } else {\n this.action.emit({ action, row });\n }\n }\n\n onActionItemClick(item: any, row: any, event: Event): void {\n event.stopPropagation();\n \n if (item.type === 'callback' && item.callback) {\n item.callback(row);\n }\n \n if (item.type === 'route' && item.route) {\n const url = this.replaceParams(item.route, row);\n this.router.navigateByUrl(url);\n return;\n }\n\n if (item.type === 'api') {\n if (item.confirmationNeeded) {\n const message = item.confirmationMessage || this.config.labels?.defaultConfirmationMessage || 'Are you sure?';\n if (!confirm(message)) return;\n }\n if (item.apiUrl) {\n this.executeApiAction(item as TableAction, row);\n } else {\n this.action.emit({ action: item as TableAction, row });\n }\n } else {\n this.action.emit({ action: item as TableAction, row });\n }\n }\n\n onTopAction(action: TableAction): void {\n if (action.type === 'callback' && action.callback) {\n action.callback(null); // No row for top action\n }\n \n if (action.type === 'route' && action.route) {\n // Since it's a top action, replaceParams with an empty object or handle statically \n const url = this.replaceParams(action.route, {});\n this.router.navigateByUrl(url);\n return;\n }\n\n if (action.type === 'api') {\n if (action.confirmationNeeded) {\n const message = action.confirmationMessage || this.config.labels?.defaultConfirmationMessage || 'Are you sure?';\n if (!confirm(message)) return;\n }\n if (action.apiUrl) {\n this.executeApiAction(action, null);\n } else {\n this.topAction.emit(action);\n }\n } else {\n this.topAction.emit(action);\n }\n }\n\n private executeApiAction(action: TableAction, row: any): void {\n if (!action.apiUrl) return;\n \n const url = row ? this.replaceParams(action.apiUrl, row) : action.apiUrl;\n const method = action.apiMethod || 'POST';\n const headers = this.getHeaders();\n const body = row ? row : {};\n \n this.loading = true;\n this.http.request(method, url, { body, headers }).pipe(\n finalize(() => this.loading = false)\n ).subscribe({\n next: () => {\n this.loadData(); // reload on success\n if (row) {\n this.action.emit({ action, row });\n } else {\n this.topAction.emit(action);\n }\n },\n error: (err) => {\n console.error('API Action Error', err);\n }\n });\n }\n\n // --- Selection ---\n\n onSelectAll(event: Event): void {\n const checked = (event.target as HTMLInputElement).checked;\n this.data.forEach(row => row.selected = checked);\n this.updateSelectedRows();\n }\n \n onRowSelect(row: any): void {\n this.updateSelectedRows();\n }\n \n updateSelectedRows(): void {\n this.selectedRows = this.data.filter(row => row.selected);\n this.rowSelect.emit(this.selectedRows);\n }\n\n // --- Helpers ---\n\n getCellValue(row: any, col: TableColumn): any {\n // Support nested properties via labelPath or key\n const path = col.labelPath || col.key;\n let val = this.getValueByPath(row, path);\n \n // Formatting (Date, etc.)\n if (col.type === 'date' && val) {\n if (col.dateFormat) {\n try {\n return formatDate(val, col.dateFormat, this.locale);\n } catch (e) {\n console.warn('Invalid date format or value', val, col.dateFormat);\n return val;\n }\n }\n return new Date(val).toLocaleDateString();\n }\n return val;\n }\n\n getBadgeClass(row: any, col: TableColumn): string {\n const val = this.getCellValue(row, col);\n const strVal = String(val);\n \n // Config approach\n if (col.badgeConfig && col.badgeConfig[strVal]) {\n return `badge-${col.badgeConfig[strVal]}`;\n }\n\n // Default Logic\n const status = strVal.toLowerCase();\n \n if (['active', 'completed', 'success', 'approved'].includes(status)) return 'badge-success';\n if (['pending', 'in progress', 'waiting'].includes(status)) return 'badge-warning';\n if (['rejected', 'failed', 'error', 'deleted'].includes(status)) return 'badge-danger';\n if (['draft', 'inactive'].includes(status)) return 'badge-neutral';\n \n return 'badge-info'; // default\n }\n \n getSortIcon(key: string): string {\n if (this.activeSort.key !== key) return 'fa-sort';\n return this.activeSort.direction === 'ASC' ? 'fa-sort-up' : 'fa-sort-down';\n }\n\n private replaceParams(template: string, row: any): string {\n return template.replace(/:([a-zA-Z0-9_]+)/g, (_, key) => row[key] || '');\n }\n \n private loadFilterOptions(): void {\n if (!this.config.filters) return;\n\n this.config.filters.forEach(filter => {\n if (filter.apiUrl && !filter.options) {\n const headers = this.getHeaders();\n let params = new HttpParams();\n\n if (filter.handling === 'nested_string' && filter.nestedStringConfig) {\n const { paramName, baseValue } = filter.nestedStringConfig;\n if (baseValue) {\n params = params.set(paramName, baseValue);\n }\n }\n\n const method = filter.apiMethod || 'GET';\n const body = filter.apiPayload || {};\n \n const request$ = method === 'POST' \n ? this.http.post<any>(filter.apiUrl, body, { headers, params }) \n : this.http.get<any>(filter.apiUrl, { headers, params });\n\n request$.subscribe({\n next: (response) => {\n const data = filter.dataPath ? this.getValueByPath(response, filter.dataPath) : response;\n if (!Array.isArray(data)) {\n console.error(`Filter data for ${filter.key} is not an array`, data);\n return;\n }\n filter.options = data.map((item: any) => {\n const label = filter.labelPath ? this.getValueByPath(item, filter.labelPath) :\n (filter.labelKey ? item[filter.labelKey] : item.label || item.name);\n const value = filter.valuePath ? this.getValueByPath(item, filter.valuePath) :\n (filter.valueKey ? item[filter.valueKey] : item.value || item.code);\n return { label, value };\n });\n\n // Auto-populate matching column options\n if (this.config.columns) {\n const matchingColumn = this.config.columns.find(col => col.key === filter.key);\n if (matchingColumn && matchingColumn.dataType === 'select' && !matchingColumn.options) {\n matchingColumn.options = filter.options;\n }\n }\n },\n error: (err) => console.error(`Failed to load filter options for ${filter.key}:`, err)\n });\n }\n });\n }\n\n private getValueByPath(obj: any, path: string): any {\n if (!path || path === '') return obj;\n return path.split('.').reduce((acc, part) => {\n const match = part.match(/(\\w+)\\[(\\d+)\\]/);\n if (match) {\n return acc?.[match[1]]?.[parseInt(match[2])];\n }\n return acc?.[part];\n }, obj);\n }\n\n private calculateStickyPositions(): void {\n // We calculate positions based on rendered widths\n if (!this.stickyHeaders || this.stickyHeaders.length === 0) return;\n\n this.stickyColumnStyles = {};\n let leftOffset = 0;\n this.hasStickyColumns = false;\n\n // Default sticky columns count is 3 if not specified\n const stickyCount = this.config.stickyColumnCount !== undefined ? this.config.stickyColumnCount : 3;\n\n // Checkbox width handling\n if (this.config.selectable) {\n const firstSticky = this.config.columns.find((c, i) => i < stickyCount || c.sticky);\n if (firstSticky) {\n // We can try to measure checkbox col if needed, but usually fixed 40px\n // Or better, if we have a checkbox col ref, assume 40px for now as it is fixed in CSS\n leftOffset = 40; \n }\n }\n\n const headerElements = this.stickyHeaders.toArray();\n\n this.config.columns.forEach((col, index) => {\n if (col.sticky || index < stickyCount) {\n col.sticky = true;\n this.hasStickyColumns = false; // Reset to true only after we set styles? No, wait. \n // Actually property is used in template to add class 'sticky-col'\n // but we need to update Styles based on previous cols widths\n \n // Find corresponding header element\n // Note: headerElements corresponds to columns indices\n const headerEl = headerElements[index]?.nativeElement;\n \n if (headerEl) {\n // Set style for current column\n this.stickyColumnStyles[col.key] = { \n left: `${leftOffset}px`\n // We DO NOT set width here, allowing it to be dynamic/auto\n };\n \n // Add THIS column's width to offset for the NEXT column\n // use getBoundingClientRect or offsetWidth\n leftOffset += headerEl.offsetWidth;\n }\n this.hasStickyColumns = true;\n }\n });\n \n this.cdr.detectChanges();\n }\n\n private toTitleCase(str: string): string {\n return str\n .replace(/([A-Z])/g, ' $1') // insert space before capital letters\n .replace(/^./, (str) => str.toUpperCase()) // capitalize the first letter\n .trim(); // remove any leading/trailing whitespace\n }\n \n get columnCount(): number {\n return this.config.columns.length;\n }\n\n onColumnClick(row: any, col: TableColumn): void {\n if (col.clickAction === 'callback') {\n this.columnClick.emit({ row, column: col.key });\n } else if (col.clickAction === 'route' && col.clickRoute) {\n const url = this.replaceParams(col.clickRoute, row);\n this.router.navigateByUrl(url);\n }\n }\n\n private getHeaders(): HttpHeaders {\n let headers = new HttpHeaders();\n if (this.config.token) {\n const headerName = this.config.tokenHeader || 'Authorization';\n headers = headers.set(headerName, this.config.token);\n }\n return headers;\n }\n\n toggleDropdown(id: string, event: Event): void {\n event.stopPropagation();\n this.openDropdownId = this.openDropdownId === id ? null : id;\n }\n\n @HostListener('document:click')\n closeDropdown(): void {\n this.openDropdownId = null;\n }\n}\n","<div class=\"smart-table-wrapper\">\n <!-- Top Toolbar -->\n <div class=\"st-toolbar\" *ngIf=\"config.searchConfig?.enabled || (config.filters && config.filters.length > 0) || (config.topBarButtons && config.topBarButtons.length > 0)\">\n \n <!-- Search -->\n <div class=\"st-search\" *ngIf=\"config.searchConfig?.enabled\">\n <i class=\"fa fa-search\"></i>\n <input type=\"text\" [placeholder]=\"config.labels?.searchPlaceholder || 'Search'\" (input)=\"onSearch($event)\">\n </div>\n\n <!-- Filters -->\n <div class=\"st-filters\" *ngIf=\"config.filters\">\n <div class=\"st-filter-item\" *ngFor=\"let filter of config.filters\">\n <select (change)=\"onFilterChange(filter.key, $event)\">\n <option value=\"\">{{ filter.label }}</option>\n <option *ngFor=\"let opt of filter.options\" [value]=\"opt.value\">{{ opt.label }}</option>\n </select>\n </div>\n </div>\n\n <!-- Top Bar Buttons -->\n <div class=\"st-actions\" *ngIf=\"config.topBarButtons\">\n <lib-button *ngFor=\"let btn of config.topBarButtons\" \n [variant]=\"btn.btnVariant || 'primary'\"\n [icon]=\"btn.icon || ''\"\n (click)=\"onTopAction(btn)\">\n {{ btn.label }}\n </lib-button>\n </div>\n </div>\n\n <!-- Table Container -->\n <div class=\"st-table-container\">\n <div class=\"st-check-loader\" *ngIf=\"loading\">\n <div class=\"spinner\"></div>\n </div>\n <table class=\"st-table\" [class.loading-data]=\"loading\">\n <thead>\n <tr>\n <th *ngIf=\"config.selectable\" class=\"st-checkbox-col\">\n <input type=\"checkbox\" (change)=\"onSelectAll($event)\">\n </th>\n <th *ngFor=\"let col of config.columns\" \n #stickyHeader\n [class.sortable]=\"col.sortable\"\n [class.sticky-col]=\"col.sticky\"\n [ngStyle]=\"stickyColumnStyles[col.key]\"\n (click)=\"onSort(col)\">\n {{ col.label }}\n <span *ngIf=\"col.sortable\" class=\"sort-icon\">\n <i class=\"fa\" [ngClass]=\"getSortIcon(col.key)\"></i>\n </span>\n </th>\n <th *ngIf=\"config.actions && config.actions.length > 0\">{{ config.labels?.actionColumnHeader || 'Actions' }}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of data; let rowIndex = index\">\n <td *ngIf=\"config.selectable\" class=\"st-checkbox-col\">\n <input type=\"checkbox\" [(ngModel)]=\"row.selected\" (change)=\"onRowSelect(row)\">\n </td>\n <td *ngFor=\"let col of config.columns\" \n [class.sticky-col]=\"col.sticky\" \n [ngStyle]=\"stickyColumnStyles[col.key]\"\n [class.clickable-cell]=\"col.clickAction\"\n (click)=\"onColumnClick(row, col)\">\n <!-- Text/Number/Date -->\n <span *ngIf=\"col.type !== 'custom' && col.type !== 'html' && col.type !== 'badge'\">\n {{ getCellValue(row, col) }}\n </span>\n <!-- HTML -->\n <div *ngIf=\"col.type === 'html'\" [innerHTML]=\"getCellValue(row, col)\"></div>\n <!-- Badge -->\n <span *ngIf=\"col.type === 'badge'\" class=\"st-badge\" [ngClass]=\"getBadgeClass(row, col)\">\n {{ getCellValue(row, col) }}\n </span>\n </td>\n \n <!-- Row Actions -->\n <td *ngIf=\"config.actions && config.actions.length > 0\" class=\"st-row-actions\">\n <div class=\"action-buttons\">\n <ng-container *ngFor=\"let action of config.actions; let i = index\">\n <ng-container *ngIf=\"action.type === 'dropdown'\">\n <div class=\"st-dropdown-container\" (click)=\"$event.stopPropagation()\">\n <button class=\"st-dropdown-btn\" (click)=\"toggleDropdown(rowIndex + '-' + i, $event)\">\n <i [class]=\"action.icon || 'fa fa-ellipsis-h'\"></i>\n </button>\n <div class=\"st-dropdown-menu\" *ngIf=\"openDropdownId === (rowIndex + '-' + i)\">\n <button class=\"st-dropdown-item\" *ngFor=\"let item of action.items\" (click)=\"onActionItemClick(item, row, $event); closeDropdown()\">\n <i *ngIf=\"item.icon\" [class]=\"item.icon + ' st-action-icon'\"></i>\n <span>{{ item.label }}</span>\n </button>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"action.type !== 'dropdown'\">\n <lib-button \n [variant]=\"action.btnVariant || 'secondary'\"\n [icon]=\"action.icon || ''\"\n (click)=\"onAction(action, row)\">\n {{ action.label }}\n </lib-button>\n </ng-container>\n </ng-container>\n </div>\n </td>\n </tr>\n <tr *ngIf=\"data.length === 0 && !loading\">\n <td [attr.colspan]=\"columnCount + (config.selectable ? 1 : 0) + (config.actions ? 1 : 0)\" class=\"no-data\">\n {{ config.labels?.noDataMessage || 'No data available' }}\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <!-- Pagination -->\n <div class=\"st-pagination\" *ngIf=\"config.pagination && config.pagination.enabled\">\n <lib-pagination\n [totalItems]=\"totalItems\"\n [itemsPerPage]=\"config.pagination.pageSize\"\n [currentPage]=\"currentPage\"\n [pageSizeOptions]=\"config.pagination.pageSizeOptions\"\n (pageChange)=\"onPageChange($event)\"\n (itemsPerPageChange)=\"onPageSizeChange($event)\">\n </lib-pagination>\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { SmartTableComponent } from './components/smart-table/smart-table.component';\nimport { PaginationModule } from '../pagination/pagination.module';\nimport { ButtonModule } from '../button/button.module';\nimport { MaterialModule } from '../material/material.module';\n\n\n@NgModule({\n declarations: [\n SmartTableComponent\n ],\n imports: [\n CommonModule,\n FormsModule,\n PaginationModule,\n ButtonModule,\n MaterialModule\n ],\n exports: [\n SmartTableComponent\n ]\n})\nexport class SmartTableModule { }\n","export function appendBaseUrlRecursively(obj: any, baseURL: string): void {\n if (obj && typeof obj === 'object') {\n if (obj.apiUrl && typeof obj.apiUrl === 'string' && !obj.apiUrl.startsWith('http://') && !obj.apiUrl.startsWith('https://')) {\n let finalApiUrl = obj.apiUrl;\n if (baseURL.endsWith('/') && finalApiUrl.startsWith('/')) {\n finalApiUrl = finalApiUrl.substring(1);\n } else if (!baseURL.endsWith('/') && !finalApiUrl.startsWith('/')) {\n finalApiUrl = '/' + finalApiUrl;\n }\n obj.apiUrl = baseURL + finalApiUrl;\n }\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n appendBaseUrlRecursively(obj[key], baseURL);\n }\n }\n }\n}\n","import { AbstractControl, FormGroup, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\nexport class ValidationUtils {\r\n\r\n\r\n\r\n static email(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) return null;\r\n const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;\r\n return emailRegex.test(control.value) ? null : { email: true };\r\n };\r\n }\r\n\r\n static phone(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) return null;\r\n const phoneRegex = /^\\+?[\\d\\s\\-\\(\\)]{10,}$/;\r\n return phoneRegex.test(control.value) ? null : { phone: true };\r\n };\r\n }\r\n\r\n static url(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) return null;\r\n const urlRegex = /^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$/;\r\n return urlRegex.test(control.value) ? null : { url: true };\r\n };\r\n }\r\n\r\n static minLength(min: number): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) return null;\r\n return control.value.length >= min ? null : { minLength: { min, actual: control.value.length } };\r\n };\r\n }\r\n\r\n static maxLength(max: number): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) return null;\r\n return control.value.length <= max ? null : { maxLength: { max, actual: control.value.length } };\r\n };\r\n }\r\n\r\n static pattern(pattern: string, message?: string): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) return null;\r\n const regex = new RegExp(pattern);\r\n return regex.test(control.value) ? null : { pattern: { message: message || 'Invalid format' } };\r\n };\r\n }\r\n\r\n static numberRange(min?: number, max?: number): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value && control.value !== 0) return null;\r\n const value = Number(control.value);\r\n if (min !== undefined && value < min) {\r\n return { min: { min, actual: value } };\r\n }\r\n if (max !== undefined && value > max) {\r\n return { max: { max, actual: value } };\r\n }\r\n return null;\r\n };\r\n }\r\n\r\n static dateRange(minDate?: string, maxDate?: string): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) return null;\r\n const date = new Date(control.value);\r\n if (minDate && date < new Date(minDate)) {\r\n return { minDate: { minDate } };\r\n }\r\n if (maxDate && date > new Date(maxDate)) {\r\n return { maxDate: { maxDate } };\r\n }\r\n return null;\r\n };\r\n }\r\n\r\n static getErrorMessage(errors: ValidationErrors | null): string {\r\n if (!errors) return '';\r\n\r\n if (errors['required']) return 'This field is required';\r\n if (errors['email']) return 'Please enter a valid email address';\r\n if (errors['phone']) return 'Please enter a valid phone number';\r\n if (errors['url']) return 'Please enter a valid URL';\r\n if (errors['minLength']) return `Minimum length is ${errors['minLength'].min} characters`;\r\n if (errors['maxLength']) return `Maximum length is ${errors['maxLength'].max} characters`;\r\n if (errors['min']) return `Minimum value is ${errors['min'].min}`;\r\n if (errors['max']) return `Maximum value is ${errors['max'].max}`;\r\n if (errors['minDate']) return `Date must be after ${errors['minDate'].minDate}`;\r\n if (errors['maxDate']) return `Date must be before ${errors['maxDate'].maxDate}`;\r\n if (errors['pattern']) return errors['pattern'].message || 'Invalid format';\r\n\r\n return 'Invalid value';\r\n }\r\n}\r\n","export const SAMPLE_FORMS = {\r\n // Simple Contact Form\r\n contactForm: `{\r\n \"entityType\": \"CONTACT\",\r\n \"label\": \"Contact Us\",\r\n \"description\": \"Send us a message\",\r\n \"formType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"children\": [\r\n {\r\n \"name\": \"name\",\r\n \"label\": \"Full Name\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true,\r\n \"hint\": \"Enter your full name\"\r\n },\r\n {\r\n \"name\": \"email\",\r\n \"label\": \"Email Address\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"EMAIL\",\r\n \"required\": true,\r\n \"hint\": \"your.email@example.com\"\r\n },\r\n {\r\n \"name\": \"meetingTime\",\r\n \"label\": \"Meeting Time\",\r\n \"type\": \"TIME\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"placeholder\": \"Select a time\"\r\n },\r\n {\r\n \"name\": \"message\",\r\n \"label\": \"Message\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"LONG\",\r\n \"required\": true,\r\n \"textConfig\": {\r\n \"length\": {\r\n \"min\": 10,\r\n \"max\": 500\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }`,\r\n\r\n // User Registration with Stepper\r\n registrationForm: `{\r\n \"entityType\": \"USER\",\r\n \"label\": \"User Registration\",\r\n \"description\": \"Create your account\",\r\n \"formType\": \"STEPPER\",\r\n \"stepperConfig\": {\r\n \"children\": [\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"Personal Information\",\r\n \"children\": [\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"firstName\",\r\n \"label\": \"First Name\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true\r\n },\r\n {\r\n \"name\": \"lastName\",\r\n \"label\": \"Last Name\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"fullName\",\r\n \"label\": \"Full Name\",\r\n \"type\": \"GENERATED\",\r\n \"subType\": \"FORMULA\",\r\n \"generatedConfig\": {\r\n \"formula\": \"function fullName(first, last) { return (first || '') + ' ' + (last || ''); }\",\r\n \"variables\": [\"firstName\", \"lastName\"]\r\n }\r\n },\r\n {\r\n \"name\": \"dateOfBirth\",\r\n \"label\": \"Date of Birth\",\r\n \"type\": \"DATE\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"dateConfig\": {\r\n \"allowFuture\": false\r\n }\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"Contact Information\",\r\n \"children\": [\r\n {\r\n \"name\": \"email\",\r\n \"label\": \"Email\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"EMAIL\",\r\n \"required\": true\r\n },\r\n {\r\n \"name\": \"phone\",\r\n \"label\": \"Phone Number\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"PHONE\",\r\n \"required\": true\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"Preferences\",\r\n \"children\": [\r\n {\r\n \"name\": \"notifications\",\r\n \"label\": \"Enable Email Notifications\",\r\n \"type\": \"SWITCH\",\r\n \"subType\": \"BOOL\",\r\n \"defaultValue\": true\r\n },\r\n {\r\n \"name\": \"interests\",\r\n \"label\": \"Interests\",\r\n \"type\": \"CHIP\",\r\n \"subType\": \"MULTIPLE\",\r\n \"optionConfig\": {\r\n \"optionList\": [\r\n { \"label\": \"Technology\", \"code\": \"TECH\" },\r\n { \"label\": \"Sports\", \"code\": \"SPORTS\" },\r\n { \"label\": \"Music\", \"code\": \"MUSIC\" },\r\n { \"label\": \"Travel\", \"code\": \"TRAVEL\" }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n ],\r\n \"showStep\": true,\r\n \"isHorizontal\": true\r\n }\r\n }`,\r\n\r\n // Survey Form with Conditional Fields\r\n surveyForm: `{\r\n \"entityType\": \"SURVEY\",\r\n \"label\": \"Customer Satisfaction Survey\",\r\n \"formType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"children\": [\r\n {\r\n \"name\": \"overallRating\",\r\n \"label\": \"Overall Experience\",\r\n \"type\": \"RATING\",\r\n \"subType\": \"STAR\",\r\n \"required\": true,\r\n \"ratingConfig\": {\r\n \"maxRating\": 5,\r\n \"allowHalf\": false\r\n }\r\n },\r\n {\r\n \"name\": \"wouldRecommend\",\r\n \"label\": \"Would you recommend us?\",\r\n \"type\": \"RADIO\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"optionConfig\": {\r\n \"optionList\": [\r\n { \"label\": \"Yes\", \"code\": \"YES\" },\r\n { \"label\": \"No\", \"code\": \"NO\" },\r\n { \"label\": \"Maybe\", \"code\": \"MAYBE\" }\r\n ]\r\n }\r\n },\r\n {\r\n \"name\": \"reasonForNo\",\r\n \"label\": \"Why not?\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"LONG\",\r\n \"visibilityExpression\": \"wouldRecommend === 'NO'\",\r\n \"required\": true\r\n },\r\n {\r\n \"name\": \"improvements\",\r\n \"label\": \"What can we improve?\",\r\n \"type\": \"CHECKBOX\",\r\n \"subType\": \"LIST\",\r\n \"optionConfig\": {\r\n \"optionList\": [\r\n { \"label\": \"Customer Service\", \"code\": \"SERVICE\" },\r\n { \"label\": \"Product Quality\", \"code\": \"QUALITY\" },\r\n { \"label\": \"Pricing\", \"code\": \"PRICE\" },\r\n { \"label\": \"Delivery Speed\", \"code\": \"DELIVERY\" }\r\n ]\r\n }\r\n },\r\n {\r\n \"name\": \"additionalComments\",\r\n \"label\": \"Additional Comments\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"LONG\",\r\n \"textConfig\": {\r\n \"length\": {\r\n \"max\": 1000\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }`,\r\n\r\n // Job Application Form\r\n jobApplicationForm: `{\r\n \"entityType\": \"JOB_APPLICATION\",\r\n \"label\": \"Job Application\",\r\n \"description\": \"Apply for a position at our company\",\r\n \"formType\": \"STEPPER\",\r\n \"stepperConfig\": {\r\n \"children\": [\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"Personal Details\",\r\n \"children\": [\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"firstName\",\r\n \"label\": \"First Name\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true\r\n },\r\n {\r\n \"name\": \"lastName\",\r\n \"label\": \"Last Name\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"email\",\r\n \"label\": \"Email\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"EMAIL\",\r\n \"required\": true\r\n },\r\n {\r\n \"name\": \"phone\",\r\n \"label\": \"Phone\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"PHONE\",\r\n \"required\": true\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"Experience\",\r\n \"allowMulti\": true,\r\n \"name\": \"experienceList\",\r\n \"children\": [\r\n {\r\n \"name\": \"company\",\r\n \"label\": \"Company Name\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true\r\n },\r\n {\r\n \"name\": \"position\",\r\n \"label\": \"Position\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true\r\n },\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"startDate\",\r\n \"label\": \"Start Date\",\r\n \"type\": \"DATE\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true\r\n },\r\n {\r\n \"name\": \"endDate\",\r\n \"label\": \"End Date\",\r\n \"type\": \"DATE\",\r\n \"subType\": \"SINGLE\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"responsibilities\",\r\n \"label\": \"Key Responsibilities\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"LONG\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"Skills & Qualifications\",\r\n \"children\": [\r\n {\r\n \"name\": \"skills\",\r\n \"label\": \"Technical Skills\",\r\n \"type\": \"CHIP\",\r\n \"subType\": \"MULTIPLE\",\r\n \"optionConfig\": {\r\n \"optionList\": [\r\n { \"label\": \"JavaScript\", \"code\": \"JS\" },\r\n { \"label\": \"TypeScript\", \"code\": \"TS\" },\r\n { \"label\": \"Angular\", \"code\": \"ANGULAR\" },\r\n { \"label\": \"React\", \"code\": \"REACT\" },\r\n { \"label\": \"Node.js\", \"code\": \"NODE\" },\r\n { \"label\": \"Python\", \"code\": \"PYTHON\" }\r\n ]\r\n }\r\n },\r\n {\r\n \"name\": \"yearsOfExperience\",\r\n \"label\": \"Years of Experience\",\r\n \"type\": \"NUMBER_INPUT\",\r\n \"subType\": \"INTEGER\",\r\n \"required\": true,\r\n \"numberConfig\": {\r\n \"min\": 0,\r\n \"max\": 50\r\n }\r\n },\r\n {\r\n \"name\": \"availableToStart\",\r\n \"label\": \"Available to Start\",\r\n \"type\": \"DATE\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"dateConfig\": {\r\n \"allowFuture\": true\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n ],\r\n \"showStep\": true,\r\n \"isHorizontal\": true\r\n }\r\n }`,\r\n\r\n // Donor Form based on UI\r\n donorForm: `{\r\n \"entityType\": \"DONOR\",\r\n \"label\": \"Donor Form\",\r\n \"formType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"children\": [\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"Donor Details\",\r\n \"name\": \"donorDetails\",\r\n \"children\": [\r\n {\r\n \"name\": \"legalName\",\r\n \"label\": \"Donor Legal Name\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true,\r\n \"placeholder\": \"Enter the name\"\r\n },\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"shortCode\",\r\n \"label\": \"Donor Short Code\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"colSpan\": 3,\r\n \"disabled\": true,\r\n \"defaultValue\": \"DLP-24-L1\",\r\n \"hint\": \"System-generated, unique internal code\"\r\n },\r\n {\r\n \"name\": \"donorType\",\r\n \"label\": \"Donor Type\",\r\n \"type\": \"DROPDOWN\",\r\n \"subType\": \"SINGLE\",\r\n \"colSpan\": 3,\r\n \"required\": true,\r\n \"placeholder\": \"Select\",\r\n \"optionConfig\": {\r\n \"optionList\": [\r\n { \"label\": \"Individual\", \"code\": \"INDIVIDUAL\" },\r\n { \"label\": \"Corporate\", \"code\": \"CORPORATE\" },\r\n { \"label\": \"Trust\", \"code\": \"TRUST\" }\r\n ]\r\n }\r\n },\r\n {\r\n \"name\": \"regNumber\",\r\n \"label\": \"Registration / Legal Entity Number\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"colSpan\": 3,\r\n \"placeholder\": \"Type\",\r\n \"hint\": \"CIN / Trust Reg. No / Govt ID (if applicable)\"\r\n },\r\n {\r\n \"name\": \"country\",\r\n \"label\": \"Country of Incorporation\",\r\n \"type\": \"DROPDOWN\",\r\n \"subType\": \"SINGLE\",\r\n \"colSpan\": 3,\r\n \"required\": true,\r\n \"placeholder\": \"Select\",\r\n \"optionConfig\": {\r\n \"optionList\": [\r\n { \"label\": \"India\", \"code\": \"IN\" },\r\n { \"label\": \"USA\", \"code\": \"US\" },\r\n { \"label\": \"UK\", \"code\": \"UK\" }\r\n ]\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"profilePicture\",\r\n \"label\": \"Profile Picture\",\r\n \"type\": \"FILE_UPLOAD\",\r\n \"subType\": \"SINGLE\",\r\n \"colSpan\": 3,\r\n \"attachmentConfig\": {\r\n \"multiple\": false,\r\n \"maxSizeMB\": 2,\r\n \"accept\": \"image/*\",\r\n \"acceptLabel\": \"JPG, PNG, SVG (max 2 MB)\"\r\n }\r\n },\r\n {\r\n \"name\": \"website\",\r\n \"label\": \"Organization Website (Optional)\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"colSpan\": 9,\r\n \"placeholder\": \"Add your website link or LinkedIn profile\",\r\n \"hint\": \"Add your website link to automatically fetch your logo, powered by Clearbit.\"\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"Primary Contact\",\r\n \"allowMulti\": true,\r\n \"name\": \"contacts\",\r\n \"children\": [\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"contactName\",\r\n \"label\": \"Full Name\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"colSpan\": 6,\r\n \"required\": true,\r\n \"placeholder\": \"Enter the name\"\r\n },\r\n {\r\n \"name\": \"designation\",\r\n \"label\": \"Designation/Title\",\r\n \"type\": \"DROPDOWN\",\r\n \"subType\": \"SINGLE\",\r\n \"colSpan\": 6,\r\n \"required\": true,\r\n \"placeholder\": \"Select\",\r\n \"optionConfig\": {\r\n \"optionList\": [\r\n { \"label\": \"CEO\", \"code\": \"CEO\" },\r\n { \"label\": \"Manager\", \"code\": \"MANAGER\" },\r\n { \"label\": \"Other\", \"code\": \"OTHER\" }\r\n ]\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"email\",\r\n \"label\": \"Email Address\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"EMAIL\",\r\n \"colSpan\": 4,\r\n \"required\": true,\r\n \"placeholder\": \"Enter your email address\"\r\n },\r\n {\r\n \"name\": \"phone\",\r\n \"label\": \"Phone Number\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"PHONE\",\r\n \"colSpan\": 4,\r\n \"required\": true,\r\n \"placeholder\": \"+91 7007713990\"\r\n },\r\n {\r\n \"name\": \"communicationPreference\",\r\n \"label\": \"Communication Preference\",\r\n \"type\": \"RADIO\",\r\n \"subType\": \"SINGLE\",\r\n \"colSpan\": 4,\r\n \"required\": true,\r\n \"optionConfig\": {\r\n \"optionList\": [\r\n { \"label\": \"Email\", \"code\": \"EMAIL\" },\r\n { \"label\": \"Phone Number\", \"code\": \"PHONE\" }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n }`,\r\n\r\n\r\n // ──────────────────────────────────────────────────────────────────────────\r\n // User Registration Form — Basic Details / Primary Address / User Role\r\n // ──────────────────────────────────────────────────────────────────────────\r\n userBasicDetailsForm: `{\r\n \"entityType\": \"USER_REGISTRATION\",\r\n \"label\": \"User Registration\",\r\n \"description\": \"Fill in your details to create a new account\",\r\n \"formType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"children\": [\r\n\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"Basic Details\",\r\n \"name\": \"basicDetails\",\r\n \"children\": [\r\n\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"firstName\",\r\n \"label\": \"First Name\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true,\r\n \"placeholder\": \"Enter first name\"\r\n },\r\n {\r\n \"name\": \"lastName\",\r\n \"label\": \"Last Name\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true,\r\n \"placeholder\": \"Enter last name\"\r\n }\r\n ]\r\n },\r\n\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"contactNo\",\r\n \"label\": \"Contact No\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"PHONE\",\r\n \"required\": true,\r\n \"placeholder\": \"+91 9999999999\",\r\n \"hint\": \"Enter a valid 10-digit mobile number\"\r\n },\r\n {\r\n \"name\": \"emailId\",\r\n \"label\": \"Email ID\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"EMAIL\",\r\n \"required\": true,\r\n \"placeholder\": \"example@domain.com\"\r\n }\r\n ]\r\n },\r\n\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"loginId\",\r\n \"label\": \"Login / User ID\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true,\r\n \"placeholder\": \"Choose a unique login ID\",\r\n \"hint\": \"Alphanumeric, no spaces\",\r\n \"textConfig\": {\r\n \"length\": { \"min\": 4, \"max\": 30 },\r\n \"pattern\": \"^[a-zA-Z0-9_]+$\",\r\n \"patternMessage\": \"Only letters, numbers and underscores are allowed\"\r\n }\r\n },\r\n {\r\n \"name\": \"password\",\r\n \"label\": \"Password\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"PASSWORD\",\r\n \"required\": true,\r\n \"placeholder\": \"Min. 8 characters\",\r\n \"hint\": \"Use at least 8 characters with letters and numbers\",\r\n \"textConfig\": {\r\n \"length\": { \"min\": 8, \"max\": 64 }\r\n }\r\n },\r\n {\r\n \"name\": \"confirmPassword\",\r\n \"label\": \"Confirm Password\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"PASSWORD\",\r\n \"required\": true,\r\n \"placeholder\": \"Re-enter your password\",\r\n \"textConfig\": {\r\n \"matchField\": \"password\"\r\n }\r\n }\r\n ]\r\n }\r\n\r\n ]\r\n }\r\n },\r\n\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"Primary Address\",\r\n \"name\": \"primaryAddress\",\r\n \"children\": [\r\n\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"addressLine1\",\r\n \"label\": \"Address Line 1\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true,\r\n \"placeholder\": \"House / Flat No., Building, Street\"\r\n },\r\n {\r\n \"name\": \"addressLine2\",\r\n \"label\": \"Address Line 2\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"placeholder\": \"Area / Locality / Colony (optional)\"\r\n }\r\n ]\r\n },\r\n\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"country\",\r\n \"label\": \"Country\",\r\n \"type\": \"DROPDOWN\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"placeholder\": \"Select Country\",\r\n \"optionConfig\": {\r\n \"optionList\": [\r\n { \"label\": \"India\", \"code\": \"REGION_COUNTRY.INDIA\" },\r\n { \"label\": \"USA\", \"code\": \"REGION_COUNTRY.USA\" }\r\n ]\r\n }\r\n },\r\n {\r\n \"name\": \"state\",\r\n \"label\": \"State\",\r\n \"type\": \"DROPDOWN\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"placeholder\": \"Select State\",\r\n \"optionConfig\": {\r\n \"apiUrl\": \"https://dev.platformcommons.org/ctld/api/globalrefdata/v1?refClass=GREF.REGION_STATE&parentRefClass=GREF.REGION_COUNTRY\",\r\n \"labelPath\": \"label\",\r\n \"valuePath\": \"dataCode\",\r\n \"dependencies\": {\r\n \"parentRefData\": \"country\"\r\n }\r\n }\r\n },\r\n {\r\n \"name\": \"city\",\r\n \"label\": \"City\",\r\n \"type\": \"DROPDOWN\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"placeholder\": \"Select City\",\r\n \"optionConfig\": {\r\n \"apiUrl\": \"https://dev.platformcommons.org/ctld/api/globalrefdata/v1?refClass=GREF.REGION_DISTRICT&parentRefClass=GREF.REGION_STATE\",\r\n \"labelPath\": \"label\",\r\n \"valuePath\": \"dataCode\",\r\n \"dependencies\": {\r\n \"parentRefData\": \"state\"\r\n }\r\n }\r\n }\r\n ]\r\n },\r\n\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"block\",\r\n \"label\": \"Block / Taluka\",\r\n \"type\": \"DROPDOWN\",\r\n \"subType\": \"SINGLE\",\r\n \"placeholder\": \"Select Block\",\r\n \"optionConfig\": {\r\n \"apiUrl\": \"https://dev.platformcommons.org/ctld/api/globalrefdata/v1?refClass=GREF.REGION_BLOCK&parentRefClass=GREF.REGION_DISTRICT\",\r\n \"labelPath\": \"label\",\r\n \"valuePath\": \"dataCode\",\r\n \"dependencies\": {\r\n \"parentRefData\": \"city\"\r\n }\r\n }\r\n },\r\n {\r\n \"name\": \"pinCode\",\r\n \"label\": \"PIN Code\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true,\r\n \"placeholder\": \"6-digit PIN code\",\r\n \"textConfig\": {\r\n \"length\": { \"min\": 6, \"max\": 6 },\r\n \"pattern\": \"^[0-9]{6}$\",\r\n \"patternMessage\": \"Enter a valid 6-digit PIN code\"\r\n }\r\n }\r\n ]\r\n }\r\n\r\n ]\r\n }\r\n },\r\n\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"User Role\",\r\n \"name\": \"userRole\",\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"role\",\r\n \"label\": \"User Role\",\r\n \"type\": \"DROPDOWN\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"placeholder\": \"Select a role\",\r\n \"optionConfig\": {\r\n \"apiUrl\": \"https://dev.platformcommons.org/gateway/commons-report-service/api/v1/datasets/name/VMS_GET_TENANT_ROLES/execute?params=TENANT_ID=1823\",\r\n \"labelPath\": \"roleName\",\r\n \"valuePath\": \"code\"\r\n }\r\n },\r\n {\r\n \"name\": \"reportingRole\",\r\n \"label\": \"Reporting Role\",\r\n \"type\": \"DROPDOWN\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"placeholder\": \"Select Reporting Role\",\r\n \"optionConfig\": {\r\n \"apiUrl\": \"https://dev.platformcommons.org/ctld/api/rolehierarchy/v1?criteria=roleCode.code='{{userRole}}' and isActive=1&includeAttributes=id,parentRoleCode\",\r\n \"dataPath\": \"payload\",\r\n \"labelPath\": \"parentRoleCode\",\r\n \"valuePath\": \"parentRoleCode\",\r\n \"dependencies\": {\r\n \"userRole\": \"role\"\r\n }\r\n }\r\n },\r\n {\r\n \"name\": \"reportingManager\",\r\n \"label\": \"Reporting Manager\",\r\n \"type\": \"DROPDOWN\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"placeholder\": \"Select Reporting Manager\",\r\n \"optionConfig\": {\r\n \"apiUrl\": \"https://dev.platformcommons.org/ctld/api/tenant/user/role/criteria/v1?criteria=role.code='{{reportingRole}}' and isActive=1 and user.isActive=1\",\r\n \"dataPath\": \"payload\",\r\n \"labelPath\": \"user.userName\",\r\n \"valuePath\": \"user.id\",\r\n \"dependencies\": {\r\n \"reportingRole\": \"reportingRole\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n\r\n ]\r\n }\r\n }`,\r\n\r\n // ──────────────────────────────────────────────────────────────────────────\r\n // Document Upload Form — demonstrates the FILE_UPLOAD field type\r\n // ──────────────────────────────────────────────────────────────────────────\r\n documentUploadForm: `{\r\n \"entityType\": \"DOCUMENT_UPLOAD\",\r\n \"label\": \"Documents\",\r\n \"description\": \"Upload the required documents\",\r\n \"formType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"children\": [\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"Documents\",\r\n \"name\": \"documents\",\r\n \"children\": [\r\n {\r\n \"name\": \"profilePicture\",\r\n \"label\": \"Profile Picture\",\r\n \"type\": \"FILE_UPLOAD\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"attachmentConfig\": {\r\n \"multiple\": false,\r\n \"maxSizeMB\": 5,\r\n \"accept\": \".jpg,.jpeg,.png,.webp,image/*\",\r\n \"acceptLabel\": \"JPG, PNG, WEBP\"\r\n }\r\n },\r\n {\r\n \"name\": \"certificates\",\r\n \"label\": \"Certificates\",\r\n \"type\": \"FILE_UPLOAD\",\r\n \"subType\": \"MULTIPLE\",\r\n \"attachmentConfig\": {\r\n \"multiple\": true,\r\n \"maxFiles\": 5,\r\n \"maxSizeMB\": 10,\r\n \"accept\": \".pdf,.doc,.docx,.jpg,.jpeg,.png\",\r\n \"acceptLabel\": \"PDF, DOCX, JPG, PNG\"\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n }`,\r\n\r\n // Demand Definition Form (matching user request image)\r\n demandDefinitionForm: `{\r\n \"entityType\": \"DEMAND\",\r\n \"label\": \"Demand Definition\",\r\n \"formType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"children\": [\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"beneficiaries\",\r\n \"label\": \"Required Beneficiaries\",\r\n \"type\": \"NUMBER_INPUT\",\r\n \"subType\": \"INTEGER\",\r\n \"required\": true,\r\n \"suffix\": \"Students\",\r\n \"placeholder\": \"0\",\r\n \"numberConfig\": { \"min\": 0 }\r\n },\r\n {\r\n \"name\": \"deliveryModel\",\r\n \"label\": \"Preferred Delivery Model\",\r\n \"type\": \"DROPDOWN\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"placeholder\": \"Select\",\r\n \"optionConfig\": {\r\n \"optionList\": [\r\n { \"label\": \"Onsite Delivery\", \"code\": \"ONSITE\" },\r\n { \"label\": \"Hybrid Model\", \"code\": \"HYBRID\" }\r\n ]\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"minAge\",\r\n \"label\": \"Min Target Age\",\r\n \"type\": \"NUMBER_INPUT\",\r\n \"subType\": \"INTEGER\",\r\n \"required\": true,\r\n \"placeholder\": \"0\",\r\n \"numberConfig\": { \"min\": 0, \"max\": 100 },\r\n \"onValidate\": \"!maxAge || minAge <= maxAge\",\r\n \"errorMessage\": \"Min Age cannot be greater than Max Age\"\r\n },\r\n {\r\n \"name\": \"maxAge\",\r\n \"label\": \"Max Target Age\",\r\n \"type\": \"NUMBER_INPUT\",\r\n \"subType\": \"INTEGER\",\r\n \"required\": true,\r\n \"placeholder\": \"100\",\r\n \"numberConfig\": { \"min\": 0, \"max\": 100 },\r\n \"onValidate\": \"!minAge || maxAge >= minAge\",\r\n \"errorMessage\": \"Max Age cannot be less than Min Age\"\r\n }\r\n ]\r\n },\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"male\",\r\n \"label\": \"Male Split (%)\",\r\n \"type\": \"NUMBER_INPUT\",\r\n \"subType\": \"INTEGER\",\r\n \"required\": true,\r\n \"suffix\": \"%\",\r\n \"placeholder\": \"50\",\r\n \"numberConfig\": { \"min\": 0, \"max\": 100 },\r\n \"onValidate\": \"(male || 0) + (female || 0) === 100\",\r\n \"errorMessage\": \"Male + Female % must equal 100%\"\r\n },\r\n {\r\n \"name\": \"female\",\r\n \"label\": \"Female Split (%)\",\r\n \"type\": \"NUMBER_INPUT\",\r\n \"subType\": \"INTEGER\",\r\n \"required\": true,\r\n \"suffix\": \"%\",\r\n \"placeholder\": \"50\",\r\n \"numberConfig\": { \"min\": 0, \"max\": 100 },\r\n \"onValidate\": \"(male || 0) + (female || 0) === 100\",\r\n \"errorMessage\": \"Male + Female % must equal 100%\"\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n }`,\r\n\r\n\r\n\r\n // Project Info Form (matching user request image)\r\n // Project Form (Combined Info + Demand)\r\n projectInfoForm: `{\r\n \"entityType\": \"PROJECT\",\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.TITLE\",\r\n \"formType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"children\": [\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.SECTION.INFO\",\r\n \"children\": [\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"projectName\",\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.NAME.LABEL\",\r\n \"placeholder\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.NAME.PH\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true,\r\n \"colSpan\": 6\r\n },\r\n {\r\n \"name\": \"programId\",\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.PROG_ID.LABEL\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"defaultValue\": \"DLP-24-L1\",\r\n \"readonly\": true,\r\n \"colSpan\": 6\r\n }\r\n ]\r\n },\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"linkedProgram\",\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.LINKED_PROG.LABEL\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"defaultValue\": \"National Skills Initiative\",\r\n \"readonly\": true,\r\n \"colSpan\": 4\r\n },\r\n {\r\n \"name\": \"linkedContract\",\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.LINKED_CONTRACT.LABEL\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"defaultValue\": \"NSI-Gov-Oct23\",\r\n \"readonly\": true,\r\n \"colSpan\": 4\r\n },\r\n {\r\n \"name\": \"assignedDistrict\",\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.DISTRICT.LABEL\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"defaultValue\": \"Bangalore Rural\",\r\n \"readonly\": true,\r\n \"colSpan\": 4\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.SECTION.DEMAND\",\r\n \"children\": [\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"requiredBeneficiaries\",\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.BENEFICIARIES.LABEL\",\r\n \"placeholder\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.BENEFICIARIES.PH\",\r\n \"type\": \"NUMBER_INPUT\",\r\n \"subType\": \"INTEGER\",\r\n \"required\": true,\r\n \"colSpan\": 6,\r\n \"numberConfig\": {\r\n \"min\": 1\r\n }\r\n },\r\n {\r\n \"name\": \"deliveryModel\",\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.DELIVERY_MODEL.LABEL\",\r\n \"type\": \"DROPDOWN\",\r\n \"subType\": \"SINGLE\",\r\n \"required\": true,\r\n \"colSpan\": 6,\r\n \"optionConfig\": {\r\n \"optionList\": [\r\n {\r\n \"label\": \"UI_PLAYGROUND.OPTION.IN_PERSON\",\r\n \"code\": \"IN_PERSON\"\r\n },\r\n {\r\n \"label\": \"UI_PLAYGROUND.OPTION.HYBRID\",\r\n \"code\": \"HYBRID\"\r\n },\r\n {\r\n \"label\": \"UI_PLAYGROUND.OPTION.ONLINE\",\r\n \"code\": \"ONLINE\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"minAge\",\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.AGE_MIN.LABEL\",\r\n \"type\": \"NUMBER_INPUT\",\r\n \"subType\": \"INTEGER\",\r\n \"required\": true,\r\n \"placeholder\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.AGE_MIN.LABEL\",\r\n \"numberConfig\": {\r\n \"min\": 0,\r\n \"max\": 100\r\n },\r\n \"onValidate\": \"!maxAge || minAge <= maxAge\",\r\n \"errorMessage\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.AGE_MIN.ERR\"\r\n },\r\n {\r\n \"name\": \"maxAge\",\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.AGE_MAX.LABEL\",\r\n \"type\": \"NUMBER_INPUT\",\r\n \"subType\": \"INTEGER\",\r\n \"required\": true,\r\n \"placeholder\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.AGE_MAX.LABEL\",\r\n \"numberConfig\": {\r\n \"min\": 0,\r\n \"max\": 100\r\n },\r\n \"onValidate\": \"!minAge || maxAge >= minAge\",\r\n \"errorMessage\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.AGE_MAX.ERR\"\r\n }\r\n ]\r\n },\r\n {\r\n \"type\": \"ROW\",\r\n \"subType\": \"HORIZONTAL\",\r\n \"children\": [\r\n {\r\n \"name\": \"maleSplit\",\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.MALE.LABEL\",\r\n \"type\": \"NUMBER_INPUT\",\r\n \"subType\": \"INTEGER\",\r\n \"required\": true,\r\n \"suffix\": \"%\",\r\n \"placeholder\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.MALE.LABEL\",\r\n \"numberConfig\": {\r\n \"min\": 0,\r\n \"max\": 100\r\n },\r\n \"onValidate\": \"(maleSplit || 0) + (femaleSplit || 0) === 100\",\r\n \"errorMessage\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.GENDER_SPLIT.ERR\"\r\n },\r\n {\r\n \"name\": \"femaleSplit\",\r\n \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.FEMALE.LABEL\",\r\n \"type\": \"NUMBER_INPUT\",\r\n \"subType\": \"INTEGER\",\r\n \"required\": true,\r\n \"suffix\": \"%\",\r\n \"placeholder\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.FEMALE.LABEL\",\r\n \"numberConfig\": {\r\n \"min\": 0,\r\n \"max\": 100\r\n },\r\n \"onValidate\": \"(maleSplit || 0) + (femaleSplit || 0) === 100\",\r\n \"errorMessage\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.GENDER_SPLIT.ERR\"\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n}\r\n }`,\r\n\r\n faqForm: `{\r\n \"entityType\": \"FAQ\",\r\n \"label\": \"Frequently Asked Questions\",\r\n \"description\": \"Answer attendee questions.\",\r\n \"formType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"children\": [\r\n {\r\n \"type\": \"GROUP\",\r\n \"subType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"label\": \"Frequently Asked Questions\",\r\n \"allowMulti\": true,\r\n \"name\": \"faqs\",\r\n \"multiSaveConfig\": {\r\n \"active\": true,\r\n \"summaryField\": \"question\",\r\n \"descriptionField\": \"answer\",\r\n \"addLabel\": \"Add a Question\"\r\n },\r\n \"children\": [\r\n {\r\n \"name\": \"question\",\r\n \"label\": \"Question\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"SHORT\",\r\n \"required\": true,\r\n \"placeholder\": \"What is Lorem Ipsum?\"\r\n },\r\n {\r\n \"name\": \"answer\",\r\n \"label\": \"Answer\",\r\n \"type\": \"TEXT_INPUT\",\r\n \"subType\": \"LONG\",\r\n \"required\": true,\r\n \"placeholder\": \"Contrary to popular belief...\"\r\n }\r\n ]\r\n }\r\n }\r\n ]\r\n }\r\n }`,\r\n\r\n // ── Location field example ──────────────────────────────────────────────\r\n locationForm: `{\r\n \"entityType\": \"EVENT\",\r\n \"label\": \"Event Location\",\r\n \"formType\": \"SECTION\",\r\n \"sectionConfig\": {\r\n \"children\": [\r\n {\r\n \"name\": \"eventLocation\",\r\n \"label\": \"Location\",\r\n \"type\": \"LOCATION\",\r\n \"required\": true,\r\n \"hint\": \"Set where your event takes place\",\r\n \"locationConfig\": {\r\n \"defaultTab\": \"VENUE\",\r\n \"maxLocations\": 5,\r\n \"venuePlaceholder\": \"Search for a venue address...\",\r\n \"onlinePlaceholder\": \"https://zoom.us/j/meeting-id\",\r\n \"showMap\": true,\r\n \"mapHeight\": \"300px\",\r\n \"googleMapsApiKey\": \"YOUR_GOOGLE_MAPS_API_KEY\"\r\n }\r\n }\r\n ]\r\n }\r\n }`,\r\n};\r\n\r\n/**\r\n * i18n label keys used by the LOCATION field type.\r\n * Add these to your labels JSON file(s) for all supported languages.\r\n *\r\n * LBL_LOC_VENUE – Tab: \"Venue\"\r\n * LBL_LOC_ONLINE – Tab: \"Online Event\"\r\n * LBL_LOC_TBA – Tab: \"To be Announced\"\r\n * LBL_LOC_ADDRESS – Section heading inside Venue tab: \"Location address\"\r\n * LBL_LOC_COUNT_SUFFIX – e.g. \"Locations Added!\"\r\n * LBL_LOC_ADD_ANOTHER – \"Add another Location\" button label\r\n * LBL_LOC_MAP_HINT – hint below the embedded map\r\n * LBL_LOC_ONLINE_URL – Label above online URL input: \"Event URL\"\r\n * LBL_LOC_TBA_DESC – Message shown inside TBA tab\r\n * PH_LOC_VENUE – Placeholder for venue search input\r\n * PH_LOC_ONLINE – Placeholder for online URL input\r\n */\r\n\r\n\r\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { SnackbarComponent } from './components/snackbar.component';\n\n@NgModule({\n declarations: [SnackbarComponent],\n imports: [CommonModule, MatSnackBarModule],\n exports: [SnackbarComponent]\n})\nexport class SnackbarModule {}\n","/*\r\n * Public API Surface of commons-shared-web-ui\r\n */\r\n\r\nexport * from './lib/modules/form-builder/form-builder.module';\r\nexport * from './lib/modules/form-builder/components/field-selection/field-selection.component';\r\nexport * from './lib/modules/form-builder/components/field-configurator/field-configurator.component';\r\nexport * from './lib/shared-ui.module';\r\nexport * from './lib/modules/material/material.module';\r\nexport * from './lib/utils/storage.utils';\r\nexport * from './lib/utils/string.utils';\r\nexport * from './lib/utils/translation.utils';\r\nexport * from './lib/modules/summary-card/summary-card.module';\r\nexport * from './lib/modules/summary-card/components/summary-card/summary-card.component';\r\nexport * from './lib/modules/configurable-form/configurable-form.module';\r\nexport * from './lib/modules/configurable-form/component/configurable-form.component';\r\n// Export Configurable Form resources namespaced to avoid collisions\r\nexport * from './lib/modules/configurable-form/configurable-form.model';\r\nexport * as ConfigurableFormExamples from './lib/modules/configurable-form/configurable-form.examples';\r\n\r\nexport * from './lib/modules/pagination/pagination.module';\r\nexport * from './lib/modules/pagination/components/pagination/pagination.component';\r\nexport * from './lib/modules/nav/nav.module';\r\nexport * from './lib/modules/nav/components/nav/nav.component';\r\nexport * from './lib/modules/nav/nav.models';\r\nexport * from './lib/modules/side-nav/side-nav.module';\r\nexport * from './lib/modules/side-nav/components/side-nav/side-nav.component';\r\nexport * from './lib/modules/side-nav/side-nav.models';\r\nexport * from './lib/utils/constants';\r\nexport * from './lib/modules/alert/alert.module';\r\nexport * from './lib/modules/alert/alert.models';\r\nexport * from './lib/modules/alert/components/alert/alert.component';\r\nexport * from './lib/modules/button/button.module';\r\nexport * from './lib/modules/button/button.models';\r\nexport * from './lib/modules/button/components/button/button.component';\r\nexport * from './lib/modules/button-dropdown/button-dropdown.module';\r\nexport * from './lib/modules/button-dropdown/button-dropdown.models';\r\nexport * from './lib/modules/button-dropdown/components/button-dropdown/button-dropdown.component';\r\nexport * from './lib/modules/confirmation-modal/confirmation-modal.module';\r\nexport * from './lib/modules/confirmation-modal/confirmation-modal.models';\r\nexport * from './lib/modules/confirmation-modal/components/confirmation-modal/confirmation-modal.component';\r\nexport * from './lib/modules/filter-sidebar/filter-sidebar.module';\r\nexport * from './lib/modules/filter-sidebar/filter-sidebar.models';\r\nexport * from './lib/modules/filter-sidebar/components/filter-sidebar/filter-sidebar.component';\r\nexport * from './lib/modules/filter/filter.module';\r\nexport * from './lib/modules/filter/filter.models';\r\nexport * from './lib/modules/filter/components/filter/filter.component';\r\nexport * from './lib/modules/form-components/form-components.module';\r\nexport * from './lib/modules/form-components/components/input/input.component';\r\nexport * from './lib/modules/form-components/components/input/input.models';\r\nexport * from './lib/modules/form-components/components/dropdown/dropdown.component';\r\nexport * from './lib/modules/form-components/components/dropdown/dropdown.models';\r\nexport * from './lib/modules/form-components/components/checkbox/checkbox.component';\r\nexport * from './lib/modules/form-components/components/checkbox/checkbox.models';\r\nexport * from './lib/modules/form-components/components/radio/radio.component';\r\nexport * from './lib/modules/form-components/components/radio/radio.models';\r\nexport * from './lib/modules/form-components/components/toggle/toggle.component';\r\nexport * from './lib/modules/form-components/components/toggle/toggle.models';\r\nexport * from './lib/modules/form-components/components/datepicker/datepicker.component';\r\nexport * from './lib/modules/form-components/components/datepicker/datepicker.models';\r\nexport * from './lib/modules/form-components/components/search/search.component';\r\nexport * from './lib/modules/form-components/components/search/search.models';\r\nexport * from './lib/modules/smart-table/smart-table.module';\r\nexport * from './lib/modules/smart-table/components/smart-table/smart-table.component';\r\nexport * from './lib/modules/smart-table/models/table-config.model';\r\nexport * from './lib/modules/smart-table/utils/smart-table.utils';\r\nexport * from './lib/modules/smart-form/smart-form.module';\r\nexport * from './lib/modules/smart-form/components/smart-form/smart-form.component';\r\nexport {\r\n FormSchema,\r\n SubmitConfig,\r\n FieldConfig,\r\n SectionConfig,\r\n StepperConfig,\r\n TextConfig,\r\n NumberConfig,\r\n DateConfig,\r\n EmailConfig,\r\n PhoneConfig,\r\n GeneratedConfig,\r\n RangeConfig,\r\n AttachmentConfig,\r\n LocationConfig,\r\n RatingConfig,\r\n ValidationResult,\r\n LengthConstraint,\r\n OptionItem\r\n} from './lib/modules/smart-form/models/form-schema.model';\r\nexport * from './lib/modules/smart-form/services/expression.service';\r\nexport * from './lib/modules/smart-form/services/smart-form-controller.service';\r\nexport * from './lib/modules/smart-form/utils/validation.utils';\r\nexport * as SmartFormExamples from './lib/modules/smart-form/smart-form.examples';\r\n\r\nexport * from './lib/modules/snackbar/snackbar.module';\r\nexport * from './lib/modules/snackbar/components/snackbar.component';\r\nexport * from './lib/modules/snackbar/models/snackbar.models';\r\nexport * from './lib/modules/snackbar/services/snackbar.service';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2.ExpressionService","i4","i8","i10.ButtonComponent","i12.TrustedUrlPipe","i2","i3","i4.ButtonComponent","i5.FormFieldComponent","takeUntil","i2.SmartFormController","i3.ExpressionService","i5.SnackbarService","i6","i7","i8.ButtonComponent","i9.FormSectionComponent","i3.ClickOutsideDirective","i1.CheckboxComponent","i1.ToggleComponent","i2.SelectionFieldNodeComponent","i2.SelectionSectionNodeComponent","i1.GroupNodeComponent","i1.SmartFormComponent","i1.ConfiguratorTreeComponent","i2.ConfiguratorConfigPanelComponent","i5.ConfirmationModalComponent","i4.InputComponent","i5.DropdownComponent","i6.CheckboxComponent","i7.RadioComponent","i8.ToggleComponent","i9.DatepickerComponent","i10.SearchComponent","i11.ButtonComponent","i9","i5.InputComponent","i6.DropdownComponent","i7.CheckboxComponent","i8.RadioComponent","i9.ToggleComponent","i10.DatepickerComponent","i11.SearchComponent","i5.PaginationComponent","i6.ButtonComponent"],"mappings":"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"}
|