{"version":3,"file":"flex-controls-controls.mjs","sources":["../../../../libs/flex-controls/controls/control-value-accessor.ts","../../../../libs/flex-controls/controls/control.ts","../../../../libs/flex-controls/controls/control-host.ts","../../../../libs/flex-controls/controls/control-selector.ts","../../../../libs/flex-controls/controls/control-array-host.ts","../../../../libs/flex-controls/controls/control-object-host.ts","../../../../libs/flex-controls/controls/flex-controls-controls.ts"],"sourcesContent":["import {ChangeDetectorRef, Directive, HostBinding, inject, Input} from '@angular/core';\nimport {ControlValueAccessor, NgControl} from '@angular/forms';\nimport {EMPTY_FUNCTION} from 'flex-controls/constants';\nimport {hasValue} from 'flex-controls/helpers';\n\n/** Class implements basic ControlValueAccessor things */\n@Directive()\nexport abstract class FlControlValueAccessor<T> implements ControlValueAccessor {\n    model: T | null = null;\n    protected isDisabled: boolean = false;\n\n    onTouched: () => void = EMPTY_FUNCTION;\n    private onChange: (value: T | null) => void = EMPTY_FUNCTION;\n    protected readonly ngControl: NgControl | null\n    protected readonly changeDetectorRef: ChangeDetectorRef;\n\n    protected constructor() {\n      this.ngControl = inject(NgControl, {optional: true, self: true});;\n      this.changeDetectorRef = inject(ChangeDetectorRef);\n        if (this.ngControl) {\n            this.ngControl.valueAccessor = this;\n        }\n    }\n\n    get hasValue(): boolean {\n        return hasValue(this.model);\n    }\n\n    @Input()\n    @HostBinding('attr.data-disabled')\n    get disabled(): boolean {\n        return this.computeDisabled();\n    }\n\n    set disabled(isDisabled: boolean) {\n        this.setDisabledState(isDisabled);\n    }\n\n    /** We use this getter to set disabled attribute for native HTML tags */\n    @HostBinding('attr.disabled')\n    get nativeDisabled(): true | null {\n        return this.disabled ? true : null;\n    }\n\n    protected computeDisabled(): boolean {\n        return this.isDisabled;\n    }\n\n    registerOnChange(fn: (value: T | null) => void): void {\n        this.onChange = fn;\n    }\n\n    registerOnTouched(fn: () => void): void {\n        this.onTouched = fn;\n    }\n\n    writeValue(obj: T | null): void {\n        if (this.model !== obj) {\n            this.update(obj);\n        }\n    }\n\n    writeValueFromHost(obj: T | null): void {\n        if (this.model !== obj) {\n            this.update(obj);\n            this.onChange(obj);\n        }\n    }\n\n    /**\n     * Updates the model. Use this method to update model from your Control\n     *\n     * @param value - new value\n     */\n    updateModel(value: T | null): void {\n        if (!this.disabled) {\n            this.model = value;\n            this.onChange(this.model);\n            this.changeDetectorRef.markForCheck();\n        }\n    }\n\n    /**\n     * Triggered when some updates are incoming. Override this method to refresh your Control's view\n     *\n     * @param value - new value\n     * @protected\n     */\n    // eslint-disable-next-line @typescript-eslint/no-empty-function,@typescript-eslint/no-unused-vars\n    protected incomingUpdate(value: T | null): void {}\n\n    setDisabledState(isDisabled: boolean): void {\n        this.isDisabled = isDisabled;\n        this.changeDetectorRef.markForCheck();\n    }\n\n    private update(value: T | null): void {\n        this.model = value;\n        this.incomingUpdate && this.incomingUpdate(value);\n        this.changeDetectorRef.markForCheck();\n    }\n}\n","import {Directive, OnDestroy, OnInit} from '@angular/core';\nimport {Observable, Subject} from 'rxjs';\nimport {FlBaseControl, FlBaseControlHost} from 'flex-controls/interfaces';\nimport {FlControlValueAccessor} from './control-value-accessor';\nimport {EMPTY_FUNCTION} from 'flex-controls/constants';\n\n/** Uses to implement any control that you want */\n@Directive()\nexport abstract class FlControl<T> extends FlControlValueAccessor<T> implements FlBaseControl<T>, OnInit, OnDestroy {\n    protected requestUpdate: () => void = EMPTY_FUNCTION;\n    private onControlChange: (value: T | null) => void = EMPTY_FUNCTION;\n    private valueChange$: Subject<T | null> = new Subject<T | null>();\n\n    constructor(protected host?: FlBaseControlHost<T>) {\n        super();\n    }\n\n    ngOnInit(): void {\n        /*\n         * We have to register control with Promise.resolve because NgModel uses it too to set first\n         * value (https://github.com/angular/angular/blob/7df9127088bda3c9d29937a04287b87dc2045ea7/packages/forms/src/directives/ng_model.ts#L314)\n         */\n        Promise.resolve().then(() => this.host?.registerControl(this));\n    }\n\n    protected override computeDisabled(): boolean {\n        return super.computeDisabled() || !!this.host?.disabled;\n    }\n\n    registerOnControlChange(fn: (value: T | null) => void): void {\n        this.onControlChange = (value: T | null) => {\n            fn(value);\n            this.valueChange$.next(value);\n        };\n    }\n\n    registerRequestUpdate(fn: () => void): void {\n        this.requestUpdate = fn;\n    }\n\n    get valueChange(): Observable<T | null> {\n        return this.valueChange$.asObservable();\n    }\n\n    /** Updates model and run changes */\n    override updateModel(value: T | null): void {\n        if (!this.disabled) {\n            super.updateModel(value);\n            this.onControlChange(value);\n        }\n    }\n\n    override writeValue(value: T | null): void {\n        if (this.model !== value) {\n            super.writeValue(value);\n            this.onControlChange(value);\n        }\n    }\n\n    ngOnDestroy(): void {\n        this.host?.unregisterControl(this);\n    }\n}\n","import {Directive} from '@angular/core';\nimport {Observable, Subject} from 'rxjs';\nimport {filter, map} from 'rxjs/operators';\nimport {FlBaseControl, FlBaseControlHost} from 'flex-controls/interfaces';\nimport {AbstractConstructor, Constructor} from 'flex-controls/types';\nimport {FlControl} from './control';\n\n/** Uses to implement base host which accepts the model as is */\n@Directive()\nexport abstract class FlControlHost<T> extends FlControl<T> implements FlBaseControlHost<T, T> {\n    private controls: Set<FlControl<T>> = new Set<FlControl<T>>();\n    private updatesFrom: FlControl<T> | null = null;\n    private controlChange$: Subject<[FlBaseControl<T>, T | null]> = new Subject<[FlBaseControl<T>, T | null]>();\n\n    constructor(protected override host?: FlBaseControlHost<T>) {\n        super(host);\n    }\n\n    registerControl(control: FlControl<T>): void {\n        this.controls.add(control);\n\n        /*\n         * We have to update control because its can be created dynamically.\n         * We use Promise.resolve because NgModel uses it too to set first value (https://github.com/angular/angular/blob/7df9127088bda3c9d29937a04287b87dc2045ea7/packages/forms/src/directives/ng_model.ts#L314)\n         * so there's no need to use angular life cycle hooks\n         */\n        Promise.resolve().then(() => {\n            control.writeValueFromHost(this.model);\n        });\n\n        control.registerOnControlChange((value: T | null) => {\n            if (this.model !== value) {\n                this.updatesFrom = control;\n                this.updateModel(value);\n                this.incomingUpdate(value);\n                this.controlChange$.next([control, value]);\n            }\n        });\n\n        control.registerRequestUpdate(() => {\n            control.writeValueFromHost(this.model);\n        });\n    }\n\n    unregisterControl(control: FlControl<T>): void {\n        this.controls.delete(control);\n    }\n\n    get controlChange(): Observable<T | null> {\n        return this.controlChange$.pipe(map(([, value]: [FlBaseControl<T>, T | null]) => value));\n    }\n\n    typedControlChange(\n        type: Constructor<FlBaseControl<T>> | AbstractConstructor<FlBaseControl<T>>,\n    ): Observable<T | null> {\n        return this.controlChange$.pipe(\n            filter(([control]: [FlBaseControl<T>, T | null]) => control instanceof type),\n            map(([, value]: [FlBaseControl<T>, T | null]) => value),\n        );\n    }\n\n    override updateModel(obj: T | null): void {\n        super.updateModel(obj);\n        this.updateControls(this.model);\n    }\n\n    protected override incomingUpdate(value: T | null): void {\n        this.updateControls(value);\n    }\n\n    private updateControls(value: T | null): void {\n        this.controls.forEach((control: FlControl<T>) => {\n            if (control !== this.updatesFrom) {\n                control.writeValueFromHost(value);\n            }\n        });\n        this.updatesFrom = null;\n    }\n}\n","import {Directive, HostBinding, Input, OnChanges, SimpleChanges} from '@angular/core';\nimport {FlCompareHost} from 'flex-controls/classes';\nimport {FL_DEFAULT_COMPARE} from 'flex-controls/constants';\nimport {flMakePure} from 'flex-controls/decorators';\nimport {FlBaseControlHost} from 'flex-controls/interfaces';\nimport {FlControl} from './control';\n\n/** Uses to implement controls with state (like checkbox, radio-button, chip, etc.) */\n@Directive()\nexport abstract class FlControlSelector<T> extends FlControl<T | boolean> implements OnChanges {\n    @Input()\n    value: T | true = true;\n\n    constructor(\n        protected compareHost?: FlCompareHost<T | boolean | null>,\n        protected override host?: FlBaseControlHost<T>,\n        protected hasIntermediate?: boolean,\n    ) {\n        super(host);\n    }\n\n    ngOnChanges({value}: SimpleChanges): void {\n        /*\n         * We have to request host for updates, because when we use ngFor directive\n         * with trackBy function, Angular doesn't re-create components, it just changes their inputs,\n         * so we have to request for updates our host, to determine right checked state\n         */\n        if (value) {\n            this.requestUpdate();\n        }\n    }\n\n    /** Выбирает текущее значение  */\n    select(): void {\n        this.updateModel(this.value);\n    }\n\n    /** Снимает выделение */\n    deselect(): void {\n        this.updateModel(false);\n    }\n\n    /** Устанавливает состояние intermediate */\n    intermediate(): void {\n        this.updateModel(null);\n    }\n\n    /** Инвертирует текущее состояние */\n    toggle(): void {\n        this.updateModel(this.checked === false ? this.value : false);\n    }\n\n    @HostBinding('attr.data-intermediate')\n    get isIntermediate(): boolean {\n        return this.model === null && !!this.hasIntermediate;\n    }\n\n    @HostBinding('attr.data-checked')\n    get checked(): boolean | null {\n        return this.compare(this.value, this.model) ? true : this.isIntermediate ? null : false;\n    }\n\n    @flMakePure\n    protected compare(value1: T | boolean | null, value2: T | boolean | null): boolean {\n        return this.compareHost?.compareFn(value1, value2) ?? FL_DEFAULT_COMPARE(value1, value2);\n    }\n}\n","import {Directive, Input} from '@angular/core';\nimport {Observable, Subject} from 'rxjs';\nimport {filter, map} from 'rxjs/operators';\nimport {FlCompareHost, FlSetCompare} from 'flex-controls/classes';\nimport {FL_DEFAULT_COMPARE} from 'flex-controls/constants';\nimport {FlBaseControl, FlBaseControlHost} from 'flex-controls/interfaces';\nimport {AbstractConstructor, FlCompareFunction} from 'flex-controls/types';\nimport {FlControl} from './control';\nimport {FlControlSelector} from './control-selector';\n\n/** Uses to implement host that stores multiple values */\n@Directive()\nexport abstract class FlControlArrayHost<T>\n    extends FlControl<T[]>\n    implements FlBaseControlHost<T[], T | T[]>, FlCompareHost<T>\n{\n    /** Uses to compare two values (usefull to compare two objects, for example by id) */\n    @Input()\n    compareFn: FlCompareFunction<T> = FL_DEFAULT_COMPARE;\n\n    private controls: Set<FlControl<T | T[]>> = new Set<FlControl<T | T[]>>();\n    private updatesFrom: FlControl<T | T[]> | null = null;\n    private proxyModel: FlSetCompare<T> = new FlSetCompare<T>();\n    private controlChange$: Subject<[FlBaseControl<T | T[]>, T | T[] | null]> = new Subject<\n        [FlBaseControl<T | T[]>, T | T[] | null]\n    >();\n\n    constructor(protected override host?: FlBaseControlHost<T[]>) {\n        super(host);\n    }\n\n    registerControl(control: FlControl<T | T[]>): void {\n        /* ArrayHost doesn't support ControlSelector with true value, because it doesnt make a sense */\n        if (control instanceof FlControlSelector && control.value === true) {\n            return;\n        }\n\n        this.controls.add(control);\n\n        /*\n         * We have to update control because its can be created dynamically.\n         * We use Promise.resolve because NgModel uses it too to set first value (https://github.com/angular/angular/blob/7df9127088bda3c9d29937a04287b87dc2045ea7/packages/forms/src/directives/ng_model.ts#L314)\n         * so there's no need to use angular life cycle hooks\n         */\n        Promise.resolve().then(() => this.updateControl(control));\n\n        control.registerOnControlChange((value: T | T[] | null) => {\n            this.updatesFrom = control;\n            this.updateModel(this.getNewModel(control, value));\n            this.incomingUpdate(this.model);\n            this.controlChange$.next([control, value]);\n        });\n\n        control.registerRequestUpdate(() => {\n            this.updateControl(control);\n        });\n    }\n\n    unregisterControl(control: FlControl<T | T[]>): void {\n        this.controls.delete(control);\n    }\n\n    get controlChange(): Observable<T | T[] | null> {\n        return this.controlChange$.pipe(map(([, value]: [FlBaseControl<T | T[]>, T | T[] | null]) => value));\n    }\n\n    typedControlChange(type: AbstractConstructor<FlBaseControl<T | T[]>>): Observable<T | T[] | null> {\n        return this.controlChange$.pipe(\n            filter(([control]: [FlBaseControl<T | T[]>, T | T[] | null]) => control instanceof type),\n            map(([, value]: [FlBaseControl<T | T[]>, T | T[] | null]) => value),\n        );\n    }\n\n    override updateModel(obj: T[] | null): void {\n        super.updateModel(obj);\n        this.updateControls();\n    }\n\n    protected override incomingUpdate(obj: T[] | null): void {\n        this.proxyModel = new FlSetCompare(this.compareFn, obj);\n        this.updateControls();\n    }\n\n    private updateControls(): void {\n        this.controls.forEach((control: FlControl<T | T[]>) => {\n            if (control !== this.updatesFrom) {\n                this.updateControl(control);\n            }\n        });\n        this.updatesFrom = null;\n    }\n\n    private getNewModel(control: FlControl<T | T[]>, updates: T | T[] | null): T[] | null {\n        if (control instanceof FlControlSelector) {\n            control.checked ? this.proxyModel.add(control.value) : this.proxyModel.delete(control.value);\n        } else if (Array.isArray(updates)) {\n            this.proxyModel = new FlSetCompare<T>(this.compareFn, updates);\n        } else {\n            this.proxyModel = new FlSetCompare<T>(this.compareFn);\n            return null;\n        }\n\n        return this.proxyModel.toArray();\n    }\n\n    private updateControl(control: FlControl<T | T[]>): void {\n        if (control instanceof FlControlSelector) {\n            control.writeValueFromHost(this.proxyModel.has(control.value) ? control.value : false);\n        } else {\n            control.writeValueFromHost(this.model);\n        }\n    }\n}\n","import {Directive} from '@angular/core';\nimport {Observable, Subject} from 'rxjs';\nimport {filter, map} from 'rxjs/operators';\nimport {FlBaseControl, FlBaseControlHost} from 'flex-controls/interfaces';\nimport {AbstractConstructor, FlControlObjectHostGetValue, FlControlObjectHostSetValue} from 'flex-controls/types';\nimport {FlControl} from './control';\n\n/** Uses to implement host that stores value to an object key */\n@Directive()\nexport abstract class FlControlObjectHost<T, C> extends FlControl<T> implements FlBaseControlHost<T, C> {\n    private controls: Set<FlControl<C>> = new Set<FlControl<C>>();\n    private updatesFrom: FlControl<C> | null = null;\n    private controlChange$: Subject<[FlBaseControl<C>, C | null]> = new Subject<[FlBaseControl<C>, C | null]>();\n\n    constructor(\n        private getValue: FlControlObjectHostGetValue<T, C>,\n        private setValue: FlControlObjectHostSetValue<T, C>,\n        protected override host?: FlBaseControlHost<T>,\n    ) {\n        super(host);\n    }\n\n    registerControl(control: FlControl<C>): void {\n        this.controls.add(control);\n\n        /*\n         * We have to update control because its can be created dynamically.\n         * We use Promise.resolve because NgModel uses it too to set first value (https://github.com/angular/angular/blob/7df9127088bda3c9d29937a04287b87dc2045ea7/packages/forms/src/directives/ng_model.ts#L314)\n         * so there's no need to use angular life cycle hooks\n         */\n        Promise.resolve().then(() => control.writeValueFromHost(this.getValue(this.model)));\n\n        control.registerOnControlChange((value: C | null) => {\n            this.updatesFrom = control;\n            this.updateModel(this.setValue(this.model, value));\n            this.controlChange$.next([control, value]);\n        });\n\n        control.registerRequestUpdate(() => {\n            control.writeValueFromHost(this.getValue(this.model));\n        });\n    }\n\n    unregisterControl(control: FlControl<C>): void {\n        this.controls.delete(control);\n    }\n\n    get controlChange(): Observable<C | null> {\n        return this.controlChange$.pipe(map(([, value]: [FlBaseControl<C>, C | null]) => value));\n    }\n\n    typedControlChange(type: AbstractConstructor<FlBaseControl<C>>): Observable<C | null> {\n        return this.controlChange$.pipe(\n            filter(([control]: [FlBaseControl<C>, C | null]) => control instanceof type),\n            map(([, value]: [FlBaseControl<C>, C | null]) => value),\n        );\n    }\n\n    override updateModel(obj: T | null): void {\n        super.updateModel(obj);\n        this.updateControls(this.model);\n    }\n\n    protected override incomingUpdate(obj: T | null): void {\n        this.updateControls(obj);\n    }\n\n    protected updateControls(value: T | null): void {\n        this.controls.forEach((control: FlControl<C>) => {\n            if (control !== this.updatesFrom) {\n                control.writeValueFromHost(this.getValue(value));\n            }\n        });\n        this.updatesFrom = null;\n    }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}