{"version":3,"file":"fundamental-ngx-ui5-webcomponents-ai-utils.mjs","sources":["../../../../libs/ui5-webcomponents-ai/utils/cva.ts","../../../../libs/ui5-webcomponents-ai/utils/fundamental-ngx-ui5-webcomponents-ai-utils.ts"],"sourcesContent":["import {\n    AfterViewInit,\n    ChangeDetectorRef,\n    Directive,\n    ElementRef,\n    forwardRef,\n    inject,\n    InjectionToken\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/**\n * Configuration for the CVA behavior\n */\nexport interface CvaConfig {\n    /** The property to bind to (e.g., 'value', 'checked') */\n    property: string;\n    /** The event(s) to listen to (e.g., 'change', 'input', or 'change,input') */\n    events: string[];\n    /** Value transformer function (e.g., for boolean coercion) */\n    transformValue?: (value: any) => any;\n    /**\n     * Radio button mode: compares form control value with element's value attribute\n     * and sets checked state accordingly. When true, the CVA will:\n     * - Write: compare formControl.value === element.value, set element.checked\n     * - Read: return element.value (not just true/false)\n     */\n    isRadioButton?: boolean;\n}\n\n/** Injection token for CVA configuration */\nexport const CVA_CONFIG = new InjectionToken<CvaConfig>('CVA_CONFIG');\n\n@Directive({\n    selector: '[noop]',\n    standalone: true,\n    providers: [\n        {\n            provide: NG_VALUE_ACCESSOR,\n            useExisting: forwardRef(() => GenericControlValueAccessor),\n            multi: true\n        }\n    ]\n})\nexport class GenericControlValueAccessor<ValueType = any> implements ControlValueAccessor, AfterViewInit {\n    onChange!: (val: ValueType) => void;\n    onTouched!: () => void;\n\n    private elementRef = inject(ElementRef);\n    private cdr = inject(ChangeDetectorRef);\n    private config = inject(CVA_CONFIG, { optional: true });\n\n    private _value: ValueType | null = null;\n    private _valueSet = false;\n    private _initialized = false;\n    private _disabled = false;\n\n    // Default config if none provided\n    private get effectiveConfig(): CvaConfig {\n        return (\n            this.config || {\n                property: 'value',\n                events: ['change', 'input'],\n                transformValue: (v) => v || ''\n            }\n        );\n    }\n\n    ngAfterViewInit(): void {\n        // Initialize after the UI5 web component is ready\n        // Use requestAnimationFrame for zoneless compatibility instead of setTimeout\n        requestAnimationFrame(() => {\n            this.initializeComponent();\n        });\n    }\n\n    setDisabledState(isDisabled: boolean): void {\n        this._disabled = isDisabled;\n        const element = this.elementRef.nativeElement;\n        if (element && this._initialized) {\n            element.disabled = isDisabled;\n            // Manually trigger change detection for zoneless compatibility\n            this.cdr.markForCheck();\n        }\n    }\n\n    registerOnChange(fn: (newVal: ValueType) => void): void {\n        this.onChange = fn;\n    }\n\n    registerOnTouched(fn: () => void): void {\n        this.onTouched = fn;\n    }\n\n    writeValue(val: ValueType): void {\n        this._value = val;\n        this._valueSet = true;\n        if (this._initialized) {\n            this.updateElementValue(val);\n        }\n    }\n\n    private initializeComponent(): void {\n        const element = this.elementRef.nativeElement;\n        const config = this.effectiveConfig;\n        this._initialized = true;\n\n        // Set up event listeners on the UI5 web component\n\n        if (element && element.addEventListener) {\n            // Listen to all configured events\n            for (const eventName of config.events) {\n                element.addEventListener(eventName, (e: any) => {\n                    if (this.onChange) {\n                        const valueToEmit = this.getValueToEmit(config, e);\n                        if (valueToEmit !== undefined) {\n                            const transformedValue = config.transformValue\n                                ? config.transformValue(valueToEmit)\n                                : valueToEmit;\n                            this.onChange(transformedValue);\n                            // Manually trigger change detection for zoneless compatibility\n                            this.cdr.markForCheck();\n                        }\n                    }\n                });\n            }\n\n            // Listen to focusout for touched state\n            element.addEventListener('focusout', () => {\n                if (this.onTouched) {\n                    this.onTouched();\n                    // Manually trigger change detection for zoneless compatibility\n                    this.cdr.markForCheck();\n                }\n            });\n        }\n\n        // Only apply stored value if writeValue was called (form control exists).\n        // Without this check, we'd overwrite native element values (e.g., value=\"Hello\") with null.\n        if (this._valueSet) {\n            this.updateElementValue(this._value);\n        }\n\n        // Set initial disabled state if it was set before initialization\n        if (this._disabled) {\n            element.disabled = this._disabled;\n        }\n    }\n\n    private getValueToEmit(config: CvaConfig, event: any): ValueType | undefined {\n        // For radio buttons, emit the element's value when checked\n        // For other components, emit the property value\n        if (config.isRadioButton) {\n            // Only emit if this radio button was checked\n            if (event.target.checked) {\n                return event.target.value;\n            } else {\n                // Don't emit anything if radio was unchecked (another one was selected)\n                return;\n            }\n        } else {\n            return event.target[config.property];\n        }\n    }\n\n    private updateElementValue(value: ValueType | null): void {\n        const element = this.elementRef.nativeElement;\n        const config = this.effectiveConfig;\n\n        if (element && this._initialized) {\n            if (config.isRadioButton) {\n                // For radio buttons, compare the form value with this element's value\n                // and set checked accordingly\n                const isChecked = element.value === value;\n                element.checked = isChecked;\n            } else {\n                // For other components, set the property directly\n                const transformedValue = config.transformValue ? config.transformValue(value) : value;\n                element[config.property] = transformedValue;\n            }\n            // Manually trigger change detection for zoneless compatibility\n            this.cdr.markForCheck();\n        }\n    }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AA8BA;MACa,UAAU,GAAG,IAAI,cAAc,CAAY,YAAY;MAavD,2BAA2B,CAAA;AAXxC,IAAA,WAAA,GAAA;AAeY,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;QAC/B,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAE/C,IAAA,CAAA,MAAM,GAAqB,IAAI;QAC/B,IAAA,CAAA,SAAS,GAAG,KAAK;QACjB,IAAA,CAAA,YAAY,GAAG,KAAK;QACpB,IAAA,CAAA,SAAS,GAAG,KAAK;AAiI5B,IAAA;;AA9HG,IAAA,IAAY,eAAe,GAAA;AACvB,QAAA,QACI,IAAI,CAAC,MAAM,IAAI;AACX,YAAA,QAAQ,EAAE,OAAO;AACjB,YAAA,MAAM,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;YAC3B,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI;AAC/B,SAAA;IAET;IAEA,eAAe,GAAA;;;QAGX,qBAAqB,CAAC,MAAK;YACvB,IAAI,CAAC,mBAAmB,EAAE;AAC9B,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAChC,QAAA,IAAI,CAAC,SAAS,GAAG,UAAU;AAC3B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;AAC7C,QAAA,IAAI,OAAO,IAAI,IAAI,CAAC,YAAY,EAAE;AAC9B,YAAA,OAAO,CAAC,QAAQ,GAAG,UAAU;;AAE7B,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QAC3B;IACJ;AAEA,IAAA,gBAAgB,CAAC,EAA+B,EAAA;AAC5C,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACtB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC5B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACvB;AAEA,IAAA,UAAU,CAAC,GAAc,EAAA;AACrB,QAAA,IAAI,CAAC,MAAM,GAAG,GAAG;AACjB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC;QAChC;IACJ;IAEQ,mBAAmB,GAAA;AACvB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;AAC7C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe;AACnC,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;;AAIxB,QAAA,IAAI,OAAO,IAAI,OAAO,CAAC,gBAAgB,EAAE;;AAErC,YAAA,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE;gBACnC,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAM,KAAI;AAC3C,oBAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;wBACf,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;AAClD,wBAAA,IAAI,WAAW,KAAK,SAAS,EAAE;AAC3B,4BAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAC5B,kCAAE,MAAM,CAAC,cAAc,CAAC,WAAW;kCACjC,WAAW;AACjB,4BAAA,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC;;AAE/B,4BAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;wBAC3B;oBACJ;AACJ,gBAAA,CAAC,CAAC;YACN;;AAGA,YAAA,OAAO,CAAC,gBAAgB,CAAC,UAAU,EAAE,MAAK;AACtC,gBAAA,IAAI,IAAI,CAAC,SAAS,EAAE;oBAChB,IAAI,CAAC,SAAS,EAAE;;AAEhB,oBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;gBAC3B;AACJ,YAAA,CAAC,CAAC;QACN;;;AAIA,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC;QACxC;;AAGA,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS;QACrC;IACJ;IAEQ,cAAc,CAAC,MAAiB,EAAE,KAAU,EAAA;;;AAGhD,QAAA,IAAI,MAAM,CAAC,aAAa,EAAE;;AAEtB,YAAA,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE;AACtB,gBAAA,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK;YAC7B;iBAAO;;gBAEH;YACJ;QACJ;aAAO;YACH,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;QACxC;IACJ;AAEQ,IAAA,kBAAkB,CAAC,KAAuB,EAAA;AAC9C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;AAC7C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe;AAEnC,QAAA,IAAI,OAAO,IAAI,IAAI,CAAC,YAAY,EAAE;AAC9B,YAAA,IAAI,MAAM,CAAC,aAAa,EAAE;;;AAGtB,gBAAA,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,KAAK,KAAK;AACzC,gBAAA,OAAO,CAAC,OAAO,GAAG,SAAS;YAC/B;iBAAO;;AAEH,gBAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,KAAK;AACrF,gBAAA,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,gBAAgB;YAC/C;;AAEA,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QAC3B;IACJ;8GA3IS,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EARzB;AACP,YAAA;AACI,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,2BAA2B,CAAC;AAC1D,gBAAA,KAAK,EAAE;AACV;AACJ,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAEQ,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAXvC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,QAAQ;AAClB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,SAAS,EAAE;AACP,wBAAA;AACI,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,iCAAiC,CAAC;AAC1D,4BAAA,KAAK,EAAE;AACV;AACJ;AACJ,iBAAA;;;AC3CD;;AAEG;;;;"}