UNPKG

@ipi-soft/ng-components

Version:

Custom Angular Components

1 lines 28.4 kB
{"version":3,"file":"ipi-soft-ng-components-listbox.mjs","sources":["../../../../projects/ipi-soft/ng-components/listbox/src/listbox.component.ts","../../../../projects/ipi-soft/ng-components/listbox/src/listbox.component.html","../../../../projects/ipi-soft/ng-components/listbox/ipi-soft-ng-components-listbox.ts"],"sourcesContent":["import { Component, SimpleChanges, ViewChild, ElementRef, ChangeDetectorRef, Input, Output, EventEmitter, HostListener } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { FormGroup, AbstractControl } from '@angular/forms';\n\nimport { Subscription, debounceTime, fromEvent, tap } from 'rxjs';\n\nimport { IpiSelectData } from '@ipi-soft/ng-components/select';\nimport { IpiTooltipDirective, TooltipPosition } from '@ipi-soft/ng-components/tooltip';\nimport { IpiControlErrors } from '@ipi-soft/ng-components/input';\n\nexport interface IpiListBoxOptions {\n data: IpiSelectData[];\n label?: string;\n tooltip?: string;\n formGroup?: FormGroup;\n formControlName?: string;\n errors?: IpiControlErrors;\n}\n\nenum MouseDirection {\n Up,\n Down\n}\n\ninterface MouseCustomData {\n hoverItemIndex: number;\n targetItemIndex: number;\n mouseDirection: MouseDirection;\n}\n\n@Component({\n selector: 'ipi-listbox',\n templateUrl: './listbox.component.html',\n styleUrls: ['./listbox.component.css'],\n imports: [\n NgClass,\n IpiTooltipDirective,\n ]\n})\n\nexport class IpiListboxComponent {\n\n constructor (\n private elementRef: ElementRef,\n private changeDetectorRef: ChangeDetectorRef) {\n this.changeDetectorRef.detach();\n }\n\n @ViewChild('listbox') listbox: ElementRef<HTMLDivElement> | null = null;\n\n @Input() options!: IpiListBoxOptions;\n\n @Output() selectChange = new EventEmitter<IpiSelectData[]>();\n\n public tooltipPosition = TooltipPosition;\n\n public controlError!: string;\n public controlInvalid = false;\n public control: AbstractControl | null = null; \n public controlSubscription: Subscription | null = null;\n\n private documentKeyupValue = '';\n private documentKeyupValueResetTime = 1000;\n private documentKeyDownSubscription!: Subscription;\n\n private isMetaHold = false;\n private isShiftHold = false;\n\n private lastSelectedItemIndex = 0;\n private lastSelectedItemIndexOnShiftHold = 0;\n\n private selectedItems!: (IpiSelectData | null)[];\n\n public ngOnInit(): void {\n this.control = this.getControl();\n \n this.selectedItems = new Array(this.options.data.length).fill(null);\n\n this.changeDetectorRef.detectChanges();\n }\n\n public ngAfterViewInit(): void {\n this.documentKeyDownSubscription = fromEvent<KeyboardEvent>(this.elementRef.nativeElement, 'keydown')\n .pipe(\n tap(event => { this.keydown(event) }),\n debounceTime(this.documentKeyupValueResetTime))\n .subscribe(() => { this.documentKeyupValue = '' });\n }\n\n public ngOnDestroy(): void {\n this.documentKeyDownSubscription.unsubscribe();\n\n if (this.controlSubscription) {\n this.controlSubscription?.unsubscribe();\n }\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n if (changes['options'] && changes['options'].currentValue['data'] && this.selectedItems) {\n this.selectedItems.length = 0;\n\n this.changeDetectorRef.detectChanges();\n }\n }\n\n public mousedown(targetItem: HTMLDivElement): void {\n const items = this.listbox!.nativeElement.children[0].children;\n\n if (this.isShiftHold) {\n const itemValue = parseInt(targetItem.getAttribute('value')!);\n const max = Math.max(itemValue, this.lastSelectedItemIndexOnShiftHold);\n const min = Math.min(itemValue, this.lastSelectedItemIndexOnShiftHold);\n\n const itemsToAdd = [];\n const itemsToRemove = [];\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i] as HTMLDivElement;\n\n if (i >= min && i <= max) {\n item.classList.add('selected');\n itemsToAdd.push(parseInt(item.getAttribute('value')!));\n } else {\n item.classList.remove('selected');\n itemsToRemove.push(parseInt(item.getAttribute('value')!));\n }\n }\n\n this.removeSelectedItems(itemsToRemove);\n this.addSelectedItems(itemsToAdd);\n\n return;\n }\n\n if (this.isMetaHold) {\n const isSelected = targetItem.classList.contains('selected');\n\n if (isSelected) {\n targetItem.classList.remove('selected');\n this.removeSelectedItems(parseInt(targetItem.getAttribute('value')!));\n } else {\n targetItem.classList.add('selected');\n this.addSelectedItems(parseInt(targetItem.getAttribute('value')!));\n }\n\n return;\n }\n\n const mouseCustomData: MouseCustomData = {\n hoverItemIndex: 0,\n targetItemIndex: 0,\n mouseDirection: MouseDirection.Up\n };\n\n const itemsToRemove = [];\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i] as HTMLDivElement;\n\n item.classList.remove('selected');\n itemsToRemove.push(parseInt(item.getAttribute('value')!));\n\n if (targetItem === item) {\n mouseCustomData.hoverItemIndex = i;\n mouseCustomData.targetItemIndex = i;\n }\n\n item.onmouseover = () => {\n this.mouseover(i, items, mouseCustomData);\n };\n }\n\n targetItem.classList.add('selected');\n this.removeSelectedItems(itemsToRemove);\n this.addSelectedItems(parseInt(targetItem.getAttribute('value')!));\n }\n\n @HostListener('document:mouseup', ['$event'])\n public mouseup(): void {\n const items = this.listbox!.nativeElement.children[0].children;\n\n for (let i = 0; i < items.length; i++) {\n (items[i] as HTMLDivElement).onmouseover = null;\n }\n }\n\n @HostListener('keyup', ['$event'])\n public keyup(event: KeyboardEvent): void {\n if (event.code.toLowerCase().includes('shift')) {\n this.isShiftHold = false;\n\n return;\n }\n\n if (event.code.toLowerCase().includes('meta') || event.code.toLowerCase().includes('control')) {\n this.isMetaHold = false;\n }\n }\n\n private mouseover(i: number, items: HTMLCollection, mouseCustomData: MouseCustomData): void {\n if (i > mouseCustomData.targetItemIndex) {\n mouseCustomData.mouseDirection = MouseDirection.Down;\n }\n\n if (i < mouseCustomData.targetItemIndex) {\n mouseCustomData.mouseDirection = MouseDirection.Up;\n }\n\n if (mouseCustomData.mouseDirection === MouseDirection.Down) {\n if (i >= mouseCustomData.hoverItemIndex) {\n this.lastSelectedItemIndex = parseInt(items[i].getAttribute('value')!);\n\n items[i].classList.add('selected');\n this.addSelectedItems(parseInt(items[i].getAttribute('value')!));\n } else {\n items[i + 1].classList.remove('selected');\n this.removeSelectedItems(parseInt(items[i + 1].getAttribute('value')!));\n }\n } else {\n if (i <= mouseCustomData.hoverItemIndex) {\n this.lastSelectedItemIndex = parseInt(items[i].getAttribute('value')!);\n\n items[i].classList.add('selected');\n this.addSelectedItems(parseInt(items[i].getAttribute('value')!));\n } else {\n items[i - 1].classList.remove('selected');\n this.removeSelectedItems(parseInt(items[i - 1].getAttribute('value')!));\n }\n }\n\n mouseCustomData.hoverItemIndex = i;\n }\n\n private keydown(event: KeyboardEvent): void {\n if ((document.activeElement !== this.listbox?.nativeElement) && (document.activeElement !== this.listbox?.nativeElement.childNodes[0])) {\n return;\n }\n\n if (event.code.toLowerCase().includes('shift')) {\n this.isShiftHold = true;\n this.lastSelectedItemIndexOnShiftHold = this.lastSelectedItemIndex;\n }\n\n if (event.code.toLowerCase().includes('meta') || event.code.toLowerCase().includes('control')) {\n this.isMetaHold = true;\n }\n\n if (event.code.toLowerCase().includes('arrowdown')) {\n event.preventDefault();\n\n this.documentArrowsKeyup(true);\n\n return;\n }\n\n if (event.code.toLowerCase().includes('arrowup')) {\n event.preventDefault();\n\n this.documentArrowsKeyup(false);\n\n return;\n }\n\n this.documentKeyup(event)\n }\n\n private documentArrowsKeyup(isDownArrow: boolean): void {\n const dataLength = this.options.data.length;\n\n let newIndex = isDownArrow ? this.lastSelectedItemIndex + 1 : this.lastSelectedItemIndex - 1;\n\n const items = this.listbox!.nativeElement.children[0].children;\n\n if (this.isShiftHold) {\n if (newIndex < 0 || newIndex === dataLength) {\n return;\n }\n\n const isSelected = items[newIndex].classList.contains('selected');\n\n if (isSelected) {\n const indexForDeselect = isDownArrow ? newIndex - 1 : newIndex + 1;\n\n items[indexForDeselect].classList.remove('selected');\n this.removeSelectedItems(parseInt(items[indexForDeselect].getAttribute('value')!));\n } else {\n items[newIndex].classList.add('selected');\n this.addSelectedItems(parseInt(items[newIndex].getAttribute('value')!));\n }\n\n this.lastSelectedItemIndex = newIndex;\n items[newIndex].scrollIntoView({ block: 'nearest' });\n\n return;\n }\n\n const itemsToRemove = [];\n\n for (let i = 0; i < items.length; i++) {\n items[i].classList.remove('selected');\n itemsToRemove.push(parseInt(items[i].getAttribute('value')!));\n }\n\n this.removeSelectedItems(itemsToRemove);\n\n newIndex = newIndex < 0 ? 0 : newIndex;\n newIndex = newIndex >= dataLength ? dataLength - 1 : newIndex;\n\n items[newIndex].classList.add('selected');\n items[newIndex].scrollIntoView({ block: 'nearest' });\n this.addSelectedItems(parseInt(items[newIndex].getAttribute('value')!));\n }\n\n private documentKeyup(event: KeyboardEvent): void {\n if (this.isMetaHold && event.key.toLowerCase() === 'a') {\n event.preventDefault();\n\n const items = this.listbox!.nativeElement.children[0].children;\n\n const itemsToAdd = [];\n\n for (let i = 0; i < items.length; i++) {2\n items[i].classList.add('selected');\n itemsToAdd.push(parseInt(items[i].getAttribute('value')!));\n }\n\n this.addSelectedItems(itemsToAdd);\n\n return;\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.options.data.length; i++) {\n const subLabel = this.options.data[i].label.substring(0, this.documentKeyupValue.length).toLowerCase();\n\n if (subLabel === this.documentKeyupValue) {\n newIndex = i;\n\n break;\n }\n }\n\n if (newIndex !== null) {\n const items = this.listbox!.nativeElement.children[0].children;\n\n const itemsToRemove = [];\n\n for (let i = 0; i < items.length; i++) {\n items[i].classList.remove('selected');\n itemsToRemove.push(parseInt(items[i].getAttribute('value')!));\n }\n\n this.removeSelectedItems(itemsToRemove);\n\n items[newIndex].classList.add('selected');\n items[newIndex].scrollIntoView({ block: 'center' });\n this.addSelectedItems(parseInt(items[newIndex].getAttribute('value')!));\n }\n }\n\n private addSelectedItems(index: number | number[]) {\n const isIndexNumber = typeof index === 'number';\n\n this.lastSelectedItemIndex = isIndexNumber ? index : index.slice(-1)[0];\n\n if (isIndexNumber) {\n this.selectedItems[index] = this.options.data[index];\n } else {\n for (let i of index) {\n this.selectedItems[i] = this.options.data[i];\n }\n }\n\n if (this.control) {\n this.control.setValue(this.selectedItems.filter(value => value !== null));\n }\n\n this.selectChange.emit(this.selectedItems.filter(Boolean) as IpiSelectData[]);\n\n this.changeDetectorRef.detectChanges();\n }\n\n private removeSelectedItems(index: number | number[]) {\n const isIndexNumber = typeof index === 'number';\n\n if (isIndexNumber) {\n this.selectedItems[index] = null;\n } else {\n for (let i of index) {\n this.selectedItems[i] = null;\n }\n }\n\n if (this.control) {\n this.control?.setValue(this.selectedItems.filter(value => value !== null));\n }\n\n this.selectChange.emit(this.selectedItems.filter(Boolean) as IpiSelectData[]);\n\n this.changeDetectorRef.detectChanges();\n }\n\n private getControl(): AbstractControl | null {\n if (this.options.formGroup && this.options.formControlName) {\n this.controlSubscription = this.options.formGroup.controls[this.options.formControlName].valueChanges.subscribe(() => {\n if (!this.control) {\n return;\n }\n \n this.checkIfControlInvalid(this.control);\n\n this.getControlError(this.control);\n });\n\n return this.options.formGroup.get(this.options.formControlName);\n }\n \n return null;\n }\n\n private checkIfControlInvalid(control: AbstractControl): void {\n this.controlInvalid = control.invalid;\n }\n\n private getControlError(control: AbstractControl): void {\n this.controlError = '';\n\n const options = this.options!;\n\n if (options.errors && this.controlInvalid) {\n for (const error in options.errors) {\n if (control.hasError(error)) {\n this.controlError = options.errors[error];\n\n return;\n }\n }\n\n }\n }\n\n}\n","@if (options) {\n <div class=\"listbox-header\">\n @if (options.label) {\n <label>{{ options.label }}</label>\n }\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 <div #listbox tabindex=\"0\" class=\"container\" [ngClass]=\"{ 'error': controlInvalid }\">\n <div class=\"container-inner\">\n @for (data of options.data; track data.value) {\n <div #item [attr.value]=\"$index\" class=\"item\" (mousedown)=\"mousedown(item)\">\n {{ data.label }}\n </div>\n }\n </div>\n </div>\n\n <div class=\"footer\" [ngClass]=\"{ 'error': controlInvalid }\">\n {{ controlError }}\n </div>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}