{"version":3,"file":"bootkit-ng1-components-select.mjs","sources":["../../../projects/ng1/components/select/select.component.ts","../../../projects/ng1/components/select/select.component.html","../../../projects/ng1/components/select/select.module.ts","../../../projects/ng1/components/select/public-api.ts","../../../projects/ng1/components/select/bootkit-ng1-components-select.ts"],"sourcesContent":["import { Component, ElementRef, Renderer2, input, signal, model, HostListener, inject, forwardRef, ViewChild, TemplateRef, ContentChild, ViewEncapsulation, ChangeDetectionStrategy, booleanAttribute, ChangeDetectorRef, effect, computed, untracked, Output, EventEmitter, EnvironmentInjector } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { dataSourceAttribute, DataSource, DataSourceLike, DataRequest } from '@bootkit/ng1/data';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { ConnectedPosition, FlexibleConnectedPositionStrategy, Overlay, OverlayModule, ScrollStrategy, STANDARD_DROPDOWN_BELOW_POSITIONS, ViewportRuler } from '@angular/cdk/overlay';\nimport { Subscription } from 'rxjs';\nimport { objectFormatterAttribute, defaultFormatter } from '@bootkit/ng1/localization';\nimport { ListComponent, ListModule, ListItemSelectEvent } from '@bootkit/ng1/components/list';\nimport {\n    CssClassAttribute, equalityComparerAttribute, defaultEqualityComparer, valueWriterAttribute, defaultValueWriter,\n    IdGeneratorAttribute, defaultFilter, filterPredicateAttribute\n} from '@bootkit/ng1/common';\n\n/**\n * Select component that allows users to choose an option from a dropdown list.\n */\n@Component({\n    selector: 'ng1-select',\n    exportAs: 'ng1Select',\n    templateUrl: './select.component.html',\n    styleUrl: './select.component.scss',\n    standalone: true,\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    imports: [CommonModule, ListModule, OverlayModule],\n    providers: [{\n        provide: NG_VALUE_ACCESSOR,\n        useExisting: forwardRef(() => SelectComponent),\n        multi: true\n    }],\n    host: {\n        '[class.ng1-select-open]': 'open()',\n        '[class.ng1-select-filterable]': 'filterable()',\n        '[class.ng1-select-loading]': 'source().isLoading()',\n        '[attr.disabled]': '_isDisabled() ? \"\" : undefined',\n        '[attr.aria-disabled]': '_isDisabled() ? \"\" : undefined',\n        '[attr.tabindex]': '_isDisabled() ? undefined : 0',\n    }\n})\nexport class SelectComponent implements ControlValueAccessor {\n    // private _resizeObserver?: ResizeObserver;\n    private _viewpoerRulerSubscription?: Subscription;\n    private readonly _injector = inject(EnvironmentInjector);\n    @ViewChild('filterInput') private _filterElementRef?: ElementRef;\n    @ViewChild(ListComponent) private _listComponent?: ListComponent;\n    private _changeCallback!: (value: any) => void;\n    private _touchCallback!: () => void;\n    protected readonly _sourceItems = signal<any[] | undefined>(undefined);\n    protected readonly _selectedItems = new Set<any>();\n    protected readonly _isDisabled = signal<boolean>(false);\n    protected _scrollStrategy!: ScrollStrategy;\n    protected _positions: ConnectedPosition[];\n    private readonly _overlay = inject(Overlay);\n    protected readonly _elementRef = inject(ElementRef<HTMLDivElement>);\n    protected readonly _filterValue = signal('');\n    private readonly _renderer = inject(Renderer2);\n    private readonly _viewportRuler = inject(ViewportRuler);\n    private readonly _changeDetectorRef = inject(ChangeDetectorRef);\n    private readonly _value = signal<any>(undefined);\n\n    /**\n     * Template for rendering each item in the select component.\n     */\n    @ContentChild(TemplateRef) public itemTemplate?: TemplateRef<any>;\n\n    /**\n     * The data source for the select component.\n     * This can be an array of data, a function that returns an observable of data,\n     * or an instance of DataSource.\n     */\n    public readonly source = input.required<DataSource<any>, DataSourceLike<any>>({\n        transform: v => dataSourceAttribute(v)\n    });\n\n    /** \n     * Indicates whether multi selection is enabled or not.\n     */\n    public readonly multiple = input(false, {\n        transform: booleanAttribute\n    });\n\n    /**\n     * Indicates whether to show selection indicator (checkbox/radio) next to each item.\n     * Default is false.\n     */\n    public readonly showSelectionIndicator = input(false, {\n        transform: booleanAttribute\n    });\n\n    /** \n     * Indicates whether the dropdown is open or closed.\n     */\n    public readonly open = model(false);\n\n    /**\n    * A comparer to compare items for selection.\n    */\n    public readonly compareBy = input(defaultEqualityComparer, {\n        transform: equalityComparerAttribute\n    });\n\n    /**\n     * A fromatter to convert each item to a string for display.\n     */\n    public readonly formatBy = input(defaultFormatter, {\n        transform: objectFormatterAttribute(this._injector)\n    });\n\n    /**\n     * Custom value writer to extract the value of any object while writing values.\n     */\n    public readonly writeBy = input(defaultValueWriter, {\n        transform: valueWriterAttribute\n    });\n\n    /**\n     * Indicates whether the select component is filterable.\n     */\n    public readonly filterable = input(false, { transform: booleanAttribute });\n\n    /**\n     * Custom filter function to filter items based on a filter value.\n     * Default checks if the item contains the filter value (case-insensitive).\n     */\n    public readonly filterBy = input(defaultFilter, {\n        transform: filterPredicateAttribute\n    });\n\n    /**\n     * Placeholder text for the filter input field.\n     */\n    public readonly filterPlaceholder = input<string | undefined>(undefined);\n\n    /**\n     * CSS class or classes to apply to the items.\n     */\n    public readonly itemClass = input(undefined, {\n        transform: CssClassAttribute\n    });\n\n    /**\n     * A function that generates unique ids for each item in the list.\n     * If set to a function, it will be called with the item as an argument to generate the id.\n     * If set to undefined, no ids will be generated for the items.\n     * @default undefined\n     */\n    public readonly idGenerator = input(undefined, {\n        transform: IdGeneratorAttribute\n    });\n\n    /**\n     * Event emitted when the selected value changes.\n     */\n    @Output() public readonly itemSelect = new EventEmitter<ItemSelectEvent>();\n\n    constructor() {\n        ['form-select'].forEach(c => this._renderer.addClass(this._elementRef.nativeElement, c));\n        this._scrollStrategy = this._overlay.scrollStrategies.block();\n        this._positions = STANDARD_DROPDOWN_BELOW_POSITIONS;\n        // this._positions = getConnectedPositions('bottom', 'start', true);\n\n        effect(() => {\n            let source = this.source();\n            source.load(new DataRequest()).subscribe(res => {\n                untracked(() => {\n                    this._sourceItems.set(res.data);\n                    this._findAndSelectItems();\n                    this._changeDetectorRef.markForCheck();\n                })\n            });\n        });\n    }\n\n    /**\n     * Indicates whether the given value is selected.\n     * @param item \n     * @returns \n     */\n    public isSelected(value: any): boolean {\n        return this._selectedItems.has(value);\n    }\n\n    /**\n     * Selects the given value.\n     * @param item \n     */\n    public select(value: any): void {\n        if (this.multiple()) {\n            if (!this._selectedItems.has(value)) {\n                this._selectedItems.add(value);\n                this._updateValue();\n                this._changeCallback?.(this._value());\n            }\n        } else {\n            this._selectedItems.clear();\n            this._selectedItems.add(value);\n            this._updateValue();\n            this._changeCallback?.(this._value());\n        }\n    }\n\n    /**\n     * Deselects the given value.\n     * @param item \n     */\n    public deselect(value: any): void {\n        this._selectedItems.delete(value);\n        this._updateValue();\n        this._changeCallback?.(this._value());\n    }\n\n    /**\n     * Toggles the selection state of the given value.\n     * @param item\n    */\n    public toggle(value: any): void {\n        if (this.isSelected(value)) {\n            this.deselect(value);\n        } else {\n            this.select(value);\n        }\n    }\n\n    writeValue(obj: any): void {\n        if (this.multiple()) {\n            if (obj === null || obj === undefined) {\n                obj = [];\n            } else if (!Array.isArray(obj)) {\n                throw Error('invalid value. Expected an array in multiple selection mode.');\n            }\n        }\n\n        this._value.set(obj);\n        this._findAndSelectItems();\n        this._changeDetectorRef.markForCheck();\n    }\n\n    registerOnChange(fn: any): void {\n        this._changeCallback = fn;\n    }\n\n    registerOnTouched(fn: any): void {\n        this._touchCallback = fn;\n    }\n\n    setDisabledState?(isDisabled: boolean): void {\n        this._isDisabled.set(isDisabled);\n    }\n\n    private _findAndSelectItems(): void {\n        let value = this._value();\n        let compareBy = this.compareBy();\n        let sourceItems = this._sourceItems();\n        this._selectedItems.clear();\n        if (sourceItems == undefined || sourceItems.length == 0) {\n            return;\n        }\n\n        let findAndSelect = (v: any) => {\n            let index = sourceItems.findIndex(sourceItem => compareBy(sourceItem, v));\n            if (index > -1) {\n                let item = sourceItems.at(index)!;\n                this._selectedItems.add(item);\n            }\n        };\n\n        if (this.multiple()) {\n            if (Array.isArray(value)) {\n                (value as any[]).forEach(v => findAndSelect(v));\n            }\n        } else {\n            findAndSelect(value);\n        }\n    }\n\n    private _updateValue(): void {\n        let value: any;\n\n        if (this.multiple()) {\n            let values: any[] = [];\n            this._selectedItems.forEach(v => {\n                values.push(this.writeBy()(v));\n            });\n            value = values;\n        } else {\n            if (this._selectedItems.size > 0) {\n                let first = this._selectedItems.values().next().value;\n                value = this.writeBy()(first);\n            } else {\n                value = undefined;\n            }\n        }\n\n        this._value.set(value);\n    }\n\n    protected _onOverlayAttach() {\n        this._listenToResizeEvents();\n\n        setTimeout(() => {\n            if (this.filterable()) {\n                this._filterElementRef?.nativeElement.focus();\n            }\n\n            this._listComponent!.writeValue(this._value());\n            // if (this._activeOptionIndex() > -1) {\n            //     this._listComponent?.active(this._activeOptionIndex());\n            // }\n        }, 0);\n    }\n\n    protected _onOverlayDetach() {\n        this._unlistenFromResizeEvents();\n        this._elementRef!.nativeElement.focus();\n        this._filterValue.set('');\n        this.open.set(false);\n    }\n\n    protected _onListSelectionChange(e: ListItemSelectEvent) {\n        let value = e.item.value();\n\n        if (this.multiple()) {\n            this.toggle(value);\n        } else {\n            this.select(value);\n        }\n\n        this.itemSelect.emit({ value: e.value, select: this });\n        this._changeDetectorRef.detectChanges();\n        if (!this.multiple()) {\n            this.open.set(false);\n        }\n    }\n\n    protected _filterPredicate = computed(() => {\n        let filterValue = this._filterValue();\n        let filterBy = this.filterBy();\n\n        return (item: any) => filterBy(item, filterValue);\n    })\n\n    protected _onFilterKeydown(e: KeyboardEvent) {\n        let keys = ['ArrowDown', 'ArrowUp', 'Enter', 'Home', 'End'];\n\n        if (e.key === 'Tab') {\n            e.preventDefault();\n            this.open.set(false);\n        }\n\n        if (keys.includes(e.key)) {\n            e.preventDefault();\n            const newEvent = new KeyboardEvent(e.type, e);\n            this._listComponent?.elementRef.nativeElement.dispatchEvent(newEvent);\n        }\n    }\n\n    private _listenToResizeEvents() {\n        this._viewportRuler.change().subscribe(x => {\n            this.open.set(false);\n        });\n\n        // this._resizeObserver = new ResizeObserver(e => {\n        //     // update overlay size\n        //     // const width = (e[0].target as HTMLDivElement).offsetWidth;\n        //     // this._connectedOverlay.overlayRef.updateSize({ width });\n        // });\n\n        // this._resizeObserver.observe(this._elementRef.nativeElement);\n    }\n\n    private _unlistenFromResizeEvents() {\n        this._viewpoerRulerSubscription?.unsubscribe();\n        this._viewpoerRulerSubscription = undefined;\n\n        // this._resizeObserver?.disconnect();\n        // this._resizeObserver = undefined;\n    }\n\n    @HostListener('keydown', ['$event'])\n    protected _onHostKeydown(e: KeyboardEvent) {\n        let sourceItems = this._sourceItems()\n        let itemsCount = sourceItems?.length || 0;\n\n        if (this._isDisabled() || !sourceItems || itemsCount === 0) {\n            return;\n        }\n\n        if (this.open()) {\n            const newEvent = new KeyboardEvent(e.type, e);\n            this._listComponent?.elementRef.nativeElement.dispatchEvent(newEvent);\n            return;\n        } else {\n            if (e.key == 'Enter') {\n                this.open.set(true);\n                e.preventDefault();\n                return;\n            }\n        }\n\n        if (this.multiple()) {\n            return;\n        }\n\n        let selectedItemindex: number;\n        if (this._selectedItems.size == 0) {\n            selectedItemindex = -1\n        } else {\n            let firstValue = this._selectedItems.values().next().value;\n            selectedItemindex = sourceItems.findIndex(i => i === firstValue);\n        }\n\n        let newItemIndex = selectedItemindex;\n\n        switch (e.key) {\n            case 'ArrowDown':\n                if (selectedItemindex < itemsCount - 1) {\n                    newItemIndex = selectedItemindex + 1;\n                    this.select(sourceItems[newItemIndex]);\n                }\n                e.preventDefault();\n                break;\n            case 'ArrowUp':\n                if (selectedItemindex > 0) {\n                    newItemIndex = selectedItemindex - 1;\n                    this.select(sourceItems[newItemIndex]);\n                }\n                e.preventDefault();\n                break;\n            case 'Home':\n                if (itemsCount > 0) {\n                    newItemIndex = 0;\n                    this.select(sourceItems[0]);\n                }\n                e.preventDefault();\n                break;\n            case 'End':\n                if (itemsCount > 0) {\n                    newItemIndex = itemsCount - 1;\n                    this.select(sourceItems[newItemIndex]);\n                }\n                e.preventDefault();\n                break;\n        }\n\n        if (selectedItemindex != newItemIndex!) {\n            this.itemSelect.emit({ value: sourceItems[newItemIndex], select: this });\n            this._changeDetectorRef.markForCheck();\n        }\n    }\n\n    @HostListener('click', ['$event'])\n    protected _onHostClick(e: MouseEvent) {\n        if (this._isDisabled() || this.source().isLoading()) {\n            return;\n        }\n\n        this.open.update(x => !x);\n        this._touchCallback?.();\n    }\n}\n\n\n/**\n * Event emitted when the selection state of the select component changes by user interaction.\n */\nexport interface ItemSelectEvent {\n    /**\n     * The value of the item that was selected or deselected.\n     */\n    value: any;\n\n    /**\n     * The select component that emitted the event.\n     */\n    readonly select: SelectComponent\n}\n","@if (multiple()) {\n\t@for (item of _selectedItems.values(); track $index; let last=$last) {\n\t\t{{formatBy()(item)}}\n\t\t@if (!last) {\n\t\t\t,\n\t\t}\n\t}\n} @else {\n\t@if (_selectedItems.size > 0) {\n\t\t{{formatBy()(_selectedItems.values().next().value)}}\n\t}\n}\n\n@if (source().isLoading()) {\n\t<div class=\"spinner-grow text-secondary spinner-grow-sm ng1-select-spinner\" role=\"status\">\n\t\t<span class=\"visually-hidden\">Loading...</span>\n\t</div>\n\n\t&nbsp;\n\t<!-- This space is required to prevent layout shift after loading indicator hides. -->\n}\n\n<ng-template\n\tcdkConnectedOverlay\n\t[cdkConnectedOverlayOrigin]=\"_elementRef.nativeElement\"\n\t[cdkConnectedOverlayOpen]=\"open()\"\n\t[cdkConnectedOverlayScrollStrategy]=\"_scrollStrategy\"\n\t[cdkConnectedOverlayPositions]=\"_positions\"\n\t[cdkConnectedOverlayPush]=\"false\"\n\t[cdkConnectedOverlayFlexibleDimensions]=\"true\"\n\t[cdkConnectedOverlayPanelClass]=\"['ng1-select-dropdown']\"\n\t[cdkConnectedOverlayWidth]=\"_elementRef.nativeElement.clientWidth\"\n\t(overlayOutsideClick)=\"this.open.set(false)\"\n\t(attach)=\"_onOverlayAttach();\"\n\t(detach)=\"_onOverlayDetach()\">\n\t@if (filterable()) {\n\t\t<div class=\"ng1-select-filter-container\">\n\t\t\t<input\n\t\t\t\t#filterInput\n\t\t\t\ttype=\"text\"\n\t\t\t\tclass=\"ng1-select-filter-input\"\n\t\t\t\t[attr.placeholder]=\"filterPlaceholder()\"\n\t\t\t\t(input)=\"_filterValue.set($event.target.value)\"\n\t\t\t\t(keydown)=\"_onFilterKeydown($event)\" />\n\t\t</div>\n\t}\n\n\t<ng1-select-list\n\t\t#list\n\t\t[source]=\"_sourceItems()\"\n\t\t[multiple]=\"multiple()\"\n\t\t[formatBy]=\"formatBy()\"\n\t\t[compareBy]=\"compareBy()\"\n\t\t[itemClass]=\"itemClass()\"\n\t\t[showSelectionIndicator]=\"showSelectionIndicator()\"\n\t\t[itemTemplate]=\"itemTemplate\"\n\t\t[filterBy]=\"_filterPredicate()\"\n\t\tfocusMode=\"none\"\n\t\t(mousedown)=\"$event.preventDefault(); $event.stopImmediatePropagation()\"\n\t\t(itemSelect)=\"_onListSelectionChange($event)\">\n\t</ng1-select-list>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { SelectComponent } from './select.component';\n\nconst Items = [SelectComponent]\n\n/**\n * Select module.\n */\n@NgModule({\n    imports: Items,\n    exports: Items\n})\nexport class SelectModule { }\n","// export  *  from './types';\nexport * from './select.component';\nexport * from './select.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}