@ipi-soft/ng-components
Version:
Custom Angular Components
1 lines • 44.2 kB
Source Map (JSON)
{"version":3,"file":"ipi-soft-ng-components-select.mjs","sources":["../../../../projects/ipi-soft/ng-components/select/src/select.component.ts","../../../../projects/ipi-soft/ng-components/select/src/select.component.html","../../../../projects/ipi-soft/ng-components/select/ipi-soft-ng-components-select.ts"],"sourcesContent":["import { \n Component, OnInit, ViewChild, Input,\n Output, inject, PLATFORM_ID, ElementRef,\n ChangeDetectorRef, HostListener, EventEmitter,\n OnDestroy, AfterViewInit, SimpleChanges } from '@angular/core';\nimport { NgClass, isPlatformServer } from '@angular/common';\nimport { FormGroup, FormsModule, ReactiveFormsModule, AbstractControl } from '@angular/forms';\nimport { RouterLink } from '@angular/router';\n\nimport { Subscription, debounceTime, fromEvent, tap } from 'rxjs';\n\nimport { IpiChipComponent } from '@ipi-soft/ng-components/chip';\nimport { IpiImageComponent } from '@ipi-soft/ng-components/image';\nimport { IpiCheckboxComponent } from '@ipi-soft/ng-components/checkbox';\n\nimport { OSService, MobileOS } from '@ipi-soft/ng-components/services';\n\nimport { IpiTooltipDirective, TooltipPosition } from '@ipi-soft/ng-components/tooltip';\n\nexport interface IpiSelectOptions {\n label: string;\n tooltip?: string;\n data: IpiSelectData[];\n multiple?: boolean;\n counterAsValue?: boolean;\n placeholder?: string;\n helperText?: string;\n helperRoute?: string;\n prefixImg?: string;\n suffixImg?: string;\n formGroup?: FormGroup;\n searchable?: boolean;\n formControlName?: string;\n errors?: ControlErrors;\n}\n\nexport interface IpiSelectData {\n label: string;\n value: any;\n description?: string;\n isHover?: boolean;\n}\n\nexport interface ControlErrors {\n [x: string]: string;\n}\n\n@Component({\n selector: 'ipi-select',\n templateUrl: './select.component.html',\n styleUrls: ['./select.component.css'],\n imports: [\n NgClass,\n RouterLink,\n FormsModule,\n IpiChipComponent,\n IpiImageComponent,\n IpiTooltipDirective,\n ReactiveFormsModule,\n IpiCheckboxComponent,\n ]\n})\n\nexport class IpiSelectComponent implements OnInit, AfterViewInit, OnDestroy {\n\n @ViewChild('input') input: ElementRef<HTMLInputElement> | null = null;\n\n @ViewChild('label') label: ElementRef<HTMLLabelElement> | null = null;\n @ViewChild('dropdown') dropdown: ElementRef<HTMLDivElement> | null = null;\n @ViewChild('inputWrapper') inputWrapper: ElementRef<HTMLInputElement> | null = null;\n\n @Input() options!: IpiSelectOptions;\n\n @Output() selectChange = new EventEmitter<IpiSelectData>();\n @Output() helperTextChange = new EventEmitter<void>();\n\n constructor(\n private osService: OSService,\n private elementRef: ElementRef,\n private changeDetectorRef: ChangeDetectorRef) {\n\n this.changeDetectorRef.detach();\n\n this.handleEvents();\n }\n\n public firstDropdown = 0;\n public isDropdown = false;\n public control!: AbstractControl;\n\n public tooltipPosition = TooltipPosition;\n\n private platformId = inject(PLATFORM_ID);\n\n private isDropdownReversed = false;\n\n private shouldPreventEvents = false;\n\n private documentKeyupValue = '';\n private documentKeyupValueResetTime = 1000;\n private documentKeyUpSubscription: Subscription | null = null;\n\n private controlSubscription: Subscription | null = null;\n\n public filteredData: IpiSelectData[] = [];\n\n private lastSearch = '';\n\n private keyListener = (event: KeyboardEvent) => this.blockArrowScroll(event);\n private wheelListener = (event: WheelEvent | TouchEvent) => this.blockScroll(event);\n\n public ngOnInit(): void {\n this.control = this.getControl()!;\n\n this.changeDetectorRef.detectChanges();\n\n if (isPlatformServer(this.platformId)) {\n return;\n }\n\n this.documentKeyUpSubscription = fromEvent<KeyboardEvent>(this.elementRef.nativeElement, 'keydown')\n .pipe(\n tap(event => { this.keyup(event) }),\n debounceTime(this.documentKeyupValueResetTime),\n )\n .subscribe(() => { this.documentKeyupValue = '' });\n }\n\n public ngAfterViewInit(): void {\n this.filteredData = [...this.options.data];\n\n setTimeout(() => {\n if (this.options.formGroup && this.options.formControlName) { \n this.setVisibleValue(this.options.formGroup.controls[this.options.formControlName].value);\n }\n })\n\n if (this.options.searchable) {\n this.controlSubscription = this.control.valueChanges.subscribe((value) => {\n this.setVisibleValue(value);\n\n setTimeout(() => {\n this.changeDetectorRef.detectChanges();\n })\n })\n }\n\n this.changeDetectorRef.detectChanges();\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n if (changes['options'] && !changes['options'].firstChange) {\n this.changeDetectorRef.detectChanges();\n }\n }\n\n public ngOnDestroy(): void {\n if (isPlatformServer(this.platformId)) {\n return;\n }\n\n window.removeEventListener('wheel', this.wheelListener);\n window.removeEventListener('keydown', this.keyListener);\n window.removeEventListener('touchmove', this.wheelListener);\n\n if (this.documentKeyUpSubscription) {\n this.documentKeyUpSubscription.unsubscribe();\n }\n\n if (this.controlSubscription) {\n this.controlSubscription.unsubscribe();\n }\n }\n\n public onHelperText(): void {\n this.helperTextChange.emit();\n }\n\n public setValue(value: any): void {\n this.changeDetectorRef.detectChanges();\n\n if (!this.options.multiple) {\n value = this.removeProperty(value, 'isHover');\n }\n\n this.control.setValue(value);\n this.input!.nativeElement.value = value.label ? value.label : '';\n\n this.selectChange.emit(value);\n\n if (value.value == null) {\n return;\n }\n\n setTimeout(() => {\n this.removeDropdown();\n\n if (!this.options.multiple) {\n this.lastSearch = '';\n }\n })\n }\n\n public setMultipleValue(data: any, event?: Event): void {\n if (event) {\n event.preventDefault();\n }\n\n const newValue = this.control.value;\n let indexOfValue = -1;\n\n for (let i = 0; i < newValue.length; i++) {\n if (newValue[i].value === data.value) {\n indexOfValue = i;\n }\n\n if (JSON.stringify(newValue[i].value) === JSON.stringify(data.value)) {\n indexOfValue = i;\n }\n }\n\n if (indexOfValue === -1) {\n newValue.push({ label: data.label, value: data.value });\n } else {\n newValue.splice(indexOfValue, 1);\n }\n\n this.lastSearch = '';\n this.input!.nativeElement.value = '';\n this.filteredData = this.options.data;\n\n this.control.setValue(newValue);\n this.selectChange.emit(newValue);\n }\n\n public setVisibleValue(newValue: any | any[]): void {\n if (newValue === null) {\n this.input!.nativeElement.value = '';\n\n return;\n }\n\n if (this.options.counterAsValue) {\n if (this.options.searchable) {\n return;\n }\n\n if (this.showMultipleCount() > 0) {\n this.input!.nativeElement.value = this.showMultipleCount() + ' selected';\n }\n\n return;\n }\n\n let visibleValue = '';\n\n for (let data of this.filteredData) { \n // when newValue is object and not array\n if (data.value === newValue.value) {\n visibleValue = data.label;\n\n break;\n }\n\n if (this.options.multiple && !this.options.searchable) {\n // when newValue is array\n for (let item of newValue) {\n if (data.value === item.value) {\n visibleValue += item.label + ', ';\n\n break;\n }\n }\n }\n\n if (newValue.value) {\n // Edge case for when we use { label, value } pattern as value\n if (newValue.value.value && this.getControl()?.value.value.value === newValue.value.value) {\n visibleValue = data.label;\n\n break;\n }\n }\n }\n\n this.input!.nativeElement.value = visibleValue;\n\n this.changeDetectorRef.detectChanges();\n }\n\n public showMultipleCount(): number {\n if (!this.control.value.length) {\n return 0;\n }\n\n return this.control.value.length;\n }\n\n public isValueSelected(value: IpiSelectData): boolean {\n if (value.value == null || this.control.value == null) {\n return false;\n }\n\n return value.value === this.control.value.value;\n }\n\n public isMultipleSelected(value: IpiSelectData): boolean {\n for (let i = 0; i < this.control.value.length; i++) {\n if (value.value === this.control.value[i]) {\n return true;\n }\n\n if (this.control.value[i].value === value.value) {\n return true;\n }\n\n if (JSON.stringify(this.control.value[i].value) === JSON.stringify(value.value)) {\n return true;\n }\n }\n\n return false;\n }\n\n public activateDropdown(): void {\n if (this.checkIfControlDisabled()) {\n return;\n }\n\n this.isDropdown = true;\n this.input!.nativeElement.focus();\n\n if (this.firstDropdown === 0) {\n this.firstDropdown += 1;\n\n setTimeout(() => this.generateDropdownPosition(true));\n\n // Reattaching is needed to properly update the hovered options by KeyboardEvents\n this.changeDetectorRef.reattach();\n }\n\n this.onSearch(this.lastSearch, false);\n }\n\n @HostListener('document:click', ['$event'])\n public deactivateControl(event: MouseEvent | KeyboardEvent): void {\n if (event instanceof KeyboardEvent) {\n this.removeDropdown();\n\n return;\n }\n\n if (!this.dropdown || !this.inputWrapper) {\n return;\n }\n \n const dropdownRect = this.dropdown.nativeElement.getBoundingClientRect();\n const inputWrapperRect = this.inputWrapper.nativeElement.getBoundingClientRect();\n\n const isClickInsideDropdown = this.isWithinBounds(event, dropdownRect);\n const isClickInsideInputWrapper = this.isWithinBounds(event, inputWrapperRect);\n\n if (isClickInsideDropdown || isClickInsideInputWrapper) {\n return;\n }\n \n this.removeDropdown();\n }\n\n public onFocusIn(): void {\n this.shouldPreventEvents = true;\n\n this.activateDropdown();\n\n setTimeout(() => {\n this.shouldPreventEvents = false;\n }, 200);\n }\n\n public onFocusOut(): void {\n this.shouldPreventEvents = true;\n\n setTimeout(() => {\n this.shouldPreventEvents = false;\n }, 200);\n\n this.removeDropdown();\n }\n\n public toggleDropdown(): void {\n if (this.shouldPreventEvents) {\n return;\n }\n\n if (this.isDropdown) {\n this.removeDropdown();\n } else {\n this.activateDropdown();\n }\n }\n\n private generateDropdownPosition(checkRevserse: boolean = false): void {\n if (!this.dropdown) {\n // method will keep executing until dropdown is rendered\n setTimeout(() => this.generateDropdownPosition(true));\n\n return;\n }\n\n const dropdownEl = this.dropdown.nativeElement!;\n const elementRefRect = this.elementRef.nativeElement.getBoundingClientRect();\n\n if (this.osService.mobileOS === MobileOS.iOS) {\n elementRefRect.y += window.visualViewport!.offsetTop;\n elementRefRect.x += window.visualViewport!.offsetLeft;\n }\n\n dropdownEl.style.left = elementRefRect.x + 'px';\n dropdownEl.style.width = elementRefRect.width + 'px';\n dropdownEl.style.top = elementRefRect.y + elementRefRect.height + 'px';\n\n if (checkRevserse) {\n if (window.innerHeight < dropdownEl.getBoundingClientRect().bottom) {\n dropdownEl.style.top = 'unset';\n dropdownEl.style.bottom = window.innerHeight - elementRefRect.y + 10 + 'px';\n \n this.isDropdownReversed = true;\n }\n }\n\n if (this.isDropdownReversed) {\n dropdownEl.style.top = 'unset';\n dropdownEl.style.bottom = window.innerHeight - elementRefRect.y + 10 + 'px';\n }\n\n this.changeDetectorRef.detectChanges();\n }\n\n public removeDropdown(): void {\n this.isDropdown = false;\n this.isDropdownReversed = false;\n this.firstDropdown = 0;\n this.changeDetectorRef.detectChanges();\n\n this.input!.nativeElement.blur();\n\n this.changeDetectorRef.detach();\n }\n\n public handleKeydown(event: any): void {\n if (event.code === 'Backspace') {\n this.onSearch('', true);\n }\n }\n\n public preventFocusChange(event: MouseEvent): void {\n if (this.input?.nativeElement === document.activeElement) {\n event.preventDefault();\n\n return;\n }\n }\n\n public onSearch(value: string, shouldResetHover?: boolean): void {\n this.lastSearch = value;\n\n if (!value) {\n // Reset to original data if input is empty\n this.filteredData = [...this.options.data];\n\n return;\n }\n \n const searchTerm = value.toLowerCase();\n\n this.filteredData = this.options.data.filter(item =>\n item.label.toLowerCase().includes(searchTerm)\n );\n\n if (this.filteredData.length && shouldResetHover) {\n for (let i = 0; i < this.filteredData.length; i++) {\n this.filteredData[i].isHover = false;\n }\n\n this.filteredData[0].isHover = true;\n }\n }\n\n public getPlaceholder(): string {\n const options = this.options!;\n const formGroup = options.formGroup;\n const formControlName = options.formControlName;\n\n let placeholder = '';\n\n if (options.placeholder) {\n placeholder = options.placeholder;\n }\n\n if (formGroup && formControlName && options.errors && this.checkIfControlInvalid()) {\n for (const error in options.errors) {\n if (formGroup.controls[formControlName].hasError(error)) {\n placeholder = options.errors[error];\n }\n }\n }\n\n if ((this.control.value instanceof Array && this.control.value.length) || (this.control.value && !(this.control.value instanceof Array))) {\n return '';\n }\n\n return placeholder;\n }\n\n public checkIfControlInvalid(): boolean {\n return this.control.touched && this.control.invalid;\n }\n\n public checkIfControlDisabled(): boolean {\n return this.control.disabled;\n }\n\n private getControl(): AbstractControl | null {\n if (this.options && this.options.formGroup && this.options.formControlName) {\n return this.options.formGroup.controls[this.options.formControlName];\n }\n\n return null;\n }\n\n private isWithinBounds(event: MouseEvent, rect: DOMRect): boolean {\n return (\n event.clientX >= rect.left &&\n event.clientX <= rect.right &&\n event.clientY >= rect.top &&\n event.clientY <= rect.bottom\n );\n }\n\n private handleEvents(): void {\n if (isPlatformServer(this.platformId)) {\n return;\n }\n \n window.addEventListener('wheel', this.wheelListener, { passive: false });\n window.addEventListener('touchmove', this.wheelListener, { passive: false });\n window.addEventListener('keydown', this.keyListener);\n }\n\n private keyup(event: KeyboardEvent): void {\n if (document.activeElement !== this.input?.nativeElement) {\n this.deactivateControl(event);\n\n return;\n }\n\n if (document.activeElement === this.input?.nativeElement) {\n if (document.activeElement !== this.input?.nativeElement) {\n return; \n }\n\n switch (event.code) {\n case 'Enter':\n this.documentEnterKeyup(event);\n\n return;\n case 'Space':\n if (!this.options.searchable) {\n this.documentEnterKeyup(event);\n }\n\n return;\n case 'Backspace':\n if (!this.options.multiple && this.options.searchable && this.control.value.value != null) {\n this.onSearch('', false);\n\n this.setValue('');\n }\n\n return;\n case 'Escape':\n this.deactivateControl(event);\n\n return;\n case 'ArrowDown':\n this.documentArrowsKeyup(true);\n \n return;\n case 'ArrowUp':\n this.documentArrowsKeyup(false);\n\n return;\n }\n\n this.documentKeyup(event);\n }\n }\n\n private documentEnterKeyup(event: KeyboardEvent): void {\n for (let i = 0; i < this.filteredData.length; i++) {\n if (this.filteredData[i].isHover) {\n switch(this.options.multiple) {\n case true:\n this.setMultipleValue(this.filteredData[i], event);\n\n this.changeDetectorRef.detectChanges();\n\n return;\n default:\n this.setValue(this.filteredData[i]);\n\n this.removeDropdown();\n }\n }\n }\n }\n\n private documentArrowsKeyup(isDownArrow: boolean): void {\n if (!this.dropdown || !this.filteredData.length) {\n return;\n }\n\n const dataLength = this.filteredData.length;\n const controlValue = this.control.getRawValue();\n const isControlValue = controlValue && controlValue !== '';\n\n let hoverIndex: number | null = null;\n let valueIndex: number | null = null;\n\n for (let i = 0; i < dataLength; i++) {\n if (this.filteredData[i].isHover) { \n hoverIndex = i;\n }\n\n if (isControlValue && this.filteredData[i].value === controlValue) { \n valueIndex = i;\n }\n\n this.filteredData[i].isHover = false;\n }\n\n const currentIndex = hoverIndex ? hoverIndex : valueIndex ? valueIndex : 0;\n let newIndex = isDownArrow ? currentIndex + 1 : currentIndex - 1;\n\n newIndex = newIndex < 0 ? 0 : newIndex;\n newIndex = newIndex >= dataLength ? dataLength - 1 : newIndex;\n\n this.filteredData[newIndex].isHover = true;\n\n const element = this.dropdown.nativeElement.children[newIndex] as HTMLDivElement;\n element.scrollIntoView({ block: 'nearest' });\n }\n\n private documentKeyup(event: KeyboardEvent): void {\n if (!this.isDropdown || this.options.searchable) {\n return;\n }\n\n for (let i = 0; i < this.filteredData.length; i++) {\n this.filteredData[i].isHover = false;\n }\n\n this.documentKeyupValue = this.documentKeyupValue + event.key.toLowerCase();\n\n let newIndex: number | null = null;\n\n for (let i = 0; i < this.filteredData.length; i++) {\n const subLabel = this.filteredData[i].label.substring(0, this.documentKeyupValue.length).toLowerCase();\n\n if (subLabel === this.documentKeyupValue) {\n newIndex = i;\n\n break;\n }\n\n this.filteredData[i].isHover = false;\n }\n\n if (newIndex !== null) {\n this.filteredData[newIndex].isHover = true;\n\n const element = this.dropdown?.nativeElement.children[newIndex] as HTMLDivElement;\n element.scrollIntoView({ block: 'start' });\n }\n }\n\n private removeProperty(obj: IpiSelectData, propertyName: keyof IpiSelectData): Partial<IpiSelectData> {\n let { [propertyName]: removedProperty, ...data } = obj;\n return data;\n }\n\n private blockArrowScroll(event: any) {\n if (!this.dropdown) {\n return;\n }\n\n if (event.key ==='ArrowDown' || event.key ==='ArrowUp') {\n event.preventDefault();\n }\n }\n\n private blockScroll(event: WheelEvent | TouchEvent): void {\n if (!this.dropdown) {\n return;\n }\n \n if (this.isDescendant(this.dropdown.nativeElement, event.target as HTMLElement)) {\n if (this.dropdown.nativeElement.scrollHeight === this.dropdown.nativeElement.clientHeight) {\n event.preventDefault();\n }\n return;\n }\n \n event.preventDefault();\n }\n \n private isDescendant(parent: HTMLElement, child: HTMLElement | null): boolean {\n while (child !== null) {\n if (child === parent) {\n return true;\n }\n child = child.parentElement;\n }\n\n return false;\n }\n\n}\n","@if (options) {\n @if (options.formGroup && options.formControlName) {\n <div class=\"container\" (mousedown)=\"preventFocusChange($event)\">\n @if (options.label !== '') {\n <div class=\"header\">\n <div class=\"label-wrapper\">\n <label>{{ options.label }}</label>\n \n @if (options.tooltip) {\n <svg class=\"tooltip-icon\" [ipiTooltip]=\"options.tooltip\" [tooltipPosition]=\"tooltipPosition.Above\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g>\n <path d=\"M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M7.5 7.5H8V11h.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.25 5.25a.25.25 0 1 1-.5 0 .25.25 0 0 1 .5 0z\" fill=\"#fff\"/>\n </g>\n </svg>\n }\n </div>\n \n @if (options.helperText) {\n <div class=\"header-helper\" (click)=\"onHelperText()\" [routerLink]=\"options.helperRoute\">{{ options.helperText }}</div>\n }\n </div>\n }\n\n <div #inputWrapper class=\"input-field-wrapper\" (click)=\"toggleDropdown()\" [formGroup]=\"options.formGroup\" [ngClass]=\"{ 'invalid': checkIfControlInvalid(), 'disabled': checkIfControlDisabled() }\">\n @if (options.prefixImg) {\n <ipi-img class=\"prefix\" [src]=\"'assets/img/' + this.options.prefixImg\" [ariaLabel]=\"'Select prefix icon'\"></ipi-img>\n }\n\n @if (options.searchable && options.multiple && this.showMultipleCount() > 0) {\n @if (options.counterAsValue) {\n <span class=\"multiple-count\">\n {{ this.showMultipleCount() }} selected\n </span>\n } @else {\n <div class=\"chips\">\n @for (data of options.data; track $index) {\n @if (isMultipleSelected(data)) {\n <ipi-chip [closeIcon]=\"true\" (closeChange)=\"setMultipleValue(data)\">{{ data.label }}</ipi-chip>\n }\n }\n </div>\n }\n }\n\n @if (options.searchable) {\n <!-- used for formControl data binding and reactivness -->\n <input #hiddenInput\n class=\"hidden\"\n [formControlName]=\"options.formControlName\">\n\n <!-- used for searching and data displaying -->\n <input #input\n [placeholder]=\"getPlaceholder()\"\n [readOnly]=\"!options.searchable\"\n [ngClass]=\"{ 'no-icon': !options.prefixImg }\"\n [disabled]=\"checkIfControlDisabled()\"\n (keydown)=\"handleKeydown($event)\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut()\"\n (input)=\"onSearch(input.value, true)\"\n autocorrect=\"off\"\n spellcheck=\"false\">\n } @else {\n <input #input\n readonly\n [disabled]=\"checkIfControlDisabled()\"\n [placeholder]=\"getPlaceholder()\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut()\"\n [formControlName]=\"options.formControlName\"\n [ngClass]=\"{ 'no-icon': !options.prefixImg }\"\n (ngModelChange)=\"setVisibleValue($event)\"/>\n }\n \n <div class=\"arrow-wrapper\">\n <div class=\"arrow\" [class]=\"{ checked: this.isDropdown }\"></div>\n </div>\n </div>\n\n @if (isDropdown) {\n <div #dropdown class=\"dropdown\">\n\n @if (filteredData.length) {\n @for (data of filteredData; track $index) {\n @if (options.multiple) {\n <div class=\"option checkbox\" [ngClass]=\"{ selected: isMultipleSelected(data), preselected: data.isHover}\" (click)=\"setMultipleValue(data, $event)\">\n <ipi-checkbox [checked]=\"isMultipleSelected(data)\">\n <div class=\"multiple-checkbox-container\">\n <span>{{ data.label }}</span>\n\n @if (data.description) {\n <span>{{ data.description }}</span>\n }\n </div>\n </ipi-checkbox>\n </div>\n\n @if (data.description && filteredData.length - 1 !== $index) {\n <div class=\"options-divider\"></div>\n }\n } @else {\n <div class=\"option\" [ngClass]=\"{ selected: isValueSelected(data), preselected: data.isHover}\" (click)=\"setValue(data)\">\n {{ data.label }}\n </div>\n }\n }\n } @else {\n <div class=\"option disabled\">\n No options to select from.\n </div>\n }\n </div>\n }\n </div>\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}