@ipi-soft/ng-components
Version:
Custom Angular Components
1 lines • 53.3 kB
Source Map (JSON)
{"version":3,"file":"ipi-soft-ng-components-table.mjs","sources":["../../../../projects/ipi-soft/ng-components/table/src/table.component.ts","../../../../projects/ipi-soft/ng-components/table/src/table.component.html","../../../../projects/ipi-soft/ng-components/table/ipi-soft-ng-components-table.ts"],"sourcesContent":["import { Component, ViewChildren, QueryList, ViewChild, ElementRef, Input, Output, EventEmitter, ChangeDetectorRef, HostListener, SimpleChanges } from '@angular/core';\nimport { NgTemplateOutlet, NgStyle, NgClass, DecimalPipe, formatDate } from '@angular/common';\nimport { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';\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';\nimport { IpiSelectComponent, IpiSelectOptions } from '@ipi-soft/ng-components/select';\n\nimport { OSService, MobileOS } from '@ipi-soft/ng-components/services';\n\nimport { IpiTooltipDirective, TooltipPosition } from '@ipi-soft/ng-components/tooltip';\n\nexport interface IpiTableColumn {\n label?: string;\n value?: string;\n type?: IpiTableColumnType;\n width?: string;\n editable?: boolean;\n prefix?: string;\n suffix?: string;\n singleActions?: Action[];\n multipleActions?: Action[];\n dateFormat?: IpiDateFormatOptions;\n chipLabel?: { [key: string]: string };\n class?: string | { [key: string]: string };\n}\n\nexport enum IpiTableColumnType {\n Text,\n Date,\n Currency,\n Chip,\n Number,\n NumberMath,\n Actions,\n Checkbox,\n}\n\nexport type ActionShowType = Array<{ property: string; values: any[]; exists?: boolean; }> \n\nexport interface Action {\n icon: string;\n label: string;\n class?: string;\n showOn?: ActionShowType;\n disabled?: boolean;\n execute?: (row: any) => void;\n}\n\nexport interface IpiTableChange {\n from: number;\n to: number;\n filter?: string;\n sort?: any;\n}\n\nexport interface IpiDateFormatOptions {\n format: string;\n locale: string;\n timezone?: string;\n}\n\ninterface PageFormControls {\n pageSize: FormControl<{ label: string, value: number }>;\n}\n\n@Component({\n standalone: true,\n selector: 'ipi-table',\n templateUrl: './table.component.html',\n styleUrls: ['./table.component.css'],\n imports: [\n NgStyle,\n NgClass,\n DecimalPipe,\n NgTemplateOutlet,\n IpiChipComponent,\n IpiImageComponent,\n IpiSelectComponent,\n IpiTooltipDirective,\n IpiCheckboxComponent,\n ]\n})\n\nexport class IpiTableComponent {\n\n constructor(\n private osService: OSService,\n private formBuilder: FormBuilder,\n private changeDetectorRef: ChangeDetectorRef) {\n changeDetectorRef.detach();\n }\n\n @ViewChild('dropdownElement') DropdownElement: ElementRef<any> | null = null;\n\n @ViewChildren('moreActionsList') moreActionsList!: QueryList<ElementRef>;\n\n @Input() data!: any[];\n @Input() dataLength!: number;\n @Input() serverSide!: boolean;\n @Input() isLoading!: boolean;\n @Input() columns!: IpiTableColumn[];\n\n @Input() filter!: string;\n\n @Input() sortIndex = 0;\n @Input() sortable = true;\n @Input() sortDirection: 'asc' | 'desc' = 'asc';\n\n @Input() pageSize = 10;\n @Input() currentPage = 0;\n @Input() pageable = false;\n @Input() pageSizeOptions = [ 10, 25, 50, 100, 1000 ];\n\n @Output() tableChange = new EventEmitter<IpiTableChange>()\n\n public tooltipPosition = TooltipPosition;\n\n public TableColumnType = IpiTableColumnType;\n\n public totalPages!: number;\n public visibleRange!: string;\n\n public filteredData!: any[];\n\n public pageSizeSelectOptions!: IpiSelectOptions;\n\n public currentActiveRow: any;\n public isDropdown: boolean = false;\n\n public formGroup!: FormGroup<PageFormControls>;\n\n private _dataLength!: number;\n\n @HostListener('document:click', ['$event'])\n public onClick(event: any): void {\n // TO DO: When two tables exists the dropdown from first table is not closed\n if (event.target !== this.DropdownElement?.nativeElement && event.target) {\n if (this.currentActiveRow) {\n this.currentActiveRow.isDropdown = false;\n }\n\n this.changeDetectorRef.detectChanges();\n }\n }\n\n @HostListener('document:scroll', ['$event'])\n public onScroll(): void {\n\n for (let item of this.moreActionsList) {\n if (item.nativeElement.classList.contains('opened') && this.DropdownElement) {\n let actionPos = item.nativeElement.getBoundingClientRect();\n\n if (this.osService.mobileOS === MobileOS.iOS) {\n actionPos.y += window.visualViewport!.offsetTop;\n }\n\n this.DropdownElement.nativeElement.style.top = `${ actionPos.y + actionPos.height }px`;\n\n break;\n }\n }\n }\n\n @HostListener('window:resize')\n public onResize(): void {\n\n for (let item of this.moreActionsList) {\n if (item.nativeElement.classList.contains('opened') && this.DropdownElement) { \n let actionPos = item.nativeElement.getBoundingClientRect();\n\n if (this.osService.mobileOS === MobileOS.iOS) {\n actionPos.x += window.visualViewport!.offsetLeft;\n }\n\n const dropdownWidth = this.DropdownElement.nativeElement.offsetWidth;\n\n const left = actionPos.x + dropdownWidth / 2 < window.innerWidth - 10 ? actionPos.x : window.innerWidth - 10 - dropdownWidth;\n \n this.DropdownElement.nativeElement.style.transform = left === actionPos.x ? 'translateX(-50%)' : '';\n this.DropdownElement.nativeElement.style.left = left + 'px';\n\n break;\n }\n }\n }\n\n public ngAfterViewInit(): void {\n const from = this.currentPage * this.pageSize;\n const to = from + this.pageSize;\n\n if (this.serverSide && !this.data) {\n this.tableChange.emit({ from, to, sort: { columnValue: this.columns[this.sortIndex].value, sortDirection: this.sortDirection } });\n }\n\n if (!this.serverSide) {\n this.buildPaginationSelectDependecies();\n }\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n if (changes['isLoading'] && changes['isLoading'].currentValue === false) {\n if (this.data) {\n this._dataLength = this.data.length;\n }\n }\n\n if (changes['data'] && changes['data'].currentValue) {\n if (this.serverSide) {\n this.filteredData = this.data;\n\n this.preprocessData();\n } else {\n this.filteredData = this.filter ? this.filterData() : this.data;\n\n this.preprocessData();\n\n setTimeout(() => {\n this.sortColumn(this.columns[this.sortIndex], false);\n })\n }\n\n this._dataLength = this.dataLength ? this.dataLength : this.filteredData.length;\n }\n\n if (changes['filter'] && !changes['filter'].firstChange) {\n // The two ways of filtering data -> local and serverSide\n if (!this.serverSide) {\n this.filteredData = this.filterData();\n this._dataLength = this.filteredData.length;\n\n setTimeout(() => {\n this.goToFirstPage();\n });\n\n } else {\n setTimeout(() => {\n this.currentPage = 0;\n\n this.tableChange.emit({ from: 0, to: 0 + this.pageSize, filter: this.filter, sort: { columnValue: this.columns[this.sortIndex].value, sortDirection: this.sortDirection } });\n });\n }\n\n }\n\n if (changes['pageable'] && changes['pageable'].currentValue !== undefined) {\n this.buildPaginationSelectDependecies();\n }\n\n const from = this.currentPage * this.pageSize;\n const to = Math.min(this._dataLength, from + this.pageSize);\n \n this.calculateTotalPages();\n this.updateVisibleRange(from, to);\n\n this.changeDetectorRef.detectChanges();\n }\n\n public getPageData(): any[] {\n if (!this.filteredData) {\n return [];\n }\n\n if (!this.pageable) {\n return this.filteredData;\n }\n\n if (!this.serverSide) {\n const start = this.currentPage * this.pageSize;\n const end = start + this.pageSize;\n\n return this.filteredData.slice(start, end);\n }\n\n return this.filteredData;\n }\n\n public updateVisibleRange(start: number, end: number): void {\n this.visibleRange = `Showing ${ start + 1 } to ${end} of ${this._dataLength} results`;\n\n this.changeDetectorRef.detectChanges();\n }\n\n public calculateTotalPages(): void {\n this.totalPages = Math.ceil(this._dataLength / this.pageSize);\n }\n\n public goToPage(page: number): void {\n this.currentPage = page;\n this.calculatePages();\n }\n\n public goToPreviousPage(): void {\n this.currentPage--;\n this.calculatePages();\n }\n\n public goToNextPage(): void {\n this.currentPage++;\n this.calculatePages();\n }\n\n public goToFirstPage(): void {\n this.currentPage = 0;\n this.calculatePages();\n }\n\n public goToLastPage(): void {\n this.currentPage = this.totalPages - 1;\n this.calculatePages();\n }\n\n public cellEdit(event: KeyboardEvent, column: string, currentPageRowIndex: number): void {\n const dataIndex = currentPageRowIndex + (this.currentPage * this.pageSize);\n\n if (column.indexOf('.') === -1) {\n this.filteredData[dataIndex][column] = (event.target as HTMLDivElement).innerText;\n } else { // Nested properties\n let data = this.filteredData[dataIndex];\n const fullPath = column.split('.');\n\n for (let i = 0; i < fullPath.length; i++) {\n if (i < fullPath.length - 1) {\n data = data[fullPath[i]];\n } else {\n data[fullPath[i]] = (event.target as HTMLDivElement).innerText;\n }\n }\n }\n }\n\n public formatDate(dateAsString: string, formatDateOptions: IpiDateFormatOptions = { format: 'shortDate', locale: 'en-US', timezone: undefined }): string {\n return formatDate(dateAsString, formatDateOptions.format, formatDateOptions.locale, formatDateOptions.timezone);\n }\n\n public getClass(row: any, column: IpiTableColumn): { [key: string]: boolean } | string {\n if (!column.class) {\n return '';\n }\n\n if (typeof column.class === 'string') {\n return column.class;\n }\n\n return {\n [column.class[this.getDescendantProp(row, column)]]: true\n };\n }\n\n public getDescendantProp(row: any, column: IpiTableColumn): any {\n if (!column.value || column.value === null) {\n return column.label;\n }\n\n // Case only on preprocessing - returns any numbers that have been passed in the column.value string\n if (isFinite(Number(column.value))) {\n return parseFloat(column.value);\n }\n\n if (column.type === this.TableColumnType.NumberMath) {\n return row[column.value];\n }\n\n return column.value.split('.')\n .reduce((prev: any, curr: string) => {\n if (prev && curr in prev) {\n return prev[curr];\n } else {\n return undefined;\n }\n }, row);\n }\n\n public getChipLabel(row: any, column: IpiTableColumn): string {\n if (!column.chipLabel) {\n return column.label ? column.label : this.getDescendantProp(row, column);\n }\n\n return column.chipLabel[this.getDescendantProp(row, column)];\n }\n\n public getCheckboxState(row: any, column: IpiTableColumn): boolean {\n let state = this.getDescendantProp(row, column);\n\n if (typeof state !== 'boolean') {\n return false;\n }\n\n return state;\n }\n\n public handleActionShow(action: Action, row: any, column?: IpiTableColumn): boolean {\n if (!action.showOn || action.showOn.length === 0) {\n return true;\n }\n\n return action.showOn.every((condition) => {\n const rowValue = this.getDescendantProp(row, { value: condition.property });\n\n const ifValueExists = !!rowValue;\n \n if (condition.exists != null && condition.exists === ifValueExists) {\n return ifValueExists;\n }\n\n return condition.values.includes(rowValue);\n });\n }\n\n public sortColumn(column: any, changeSortDirection = true): void {\n if (!this.sortable) {\n return;\n }\n\n if (!column.value) {\n return;\n }\n\n if (changeSortDirection) {\n\n if (this.sortIndex == this.columns.indexOf(column)) {\n switch (this.sortDirection) {\n case 'asc':\n this.sortDirection = 'desc';\n break;\n case 'desc':\n this.sortDirection = 'asc';\n break;\n default:\n this.sortDirection = 'asc';\n break;\n }\n } else {\n this.sortDirection = 'asc';\n this.sortIndex = this.columns.indexOf(column);\n }\n\n }\n\n if (this.serverSide) {\n this.currentPage = 0;\n\n const start = this.currentPage * this.pageSize;\n const end = Math.min(this._dataLength, start + this.pageSize);\n\n this.tableChange.emit({ from: start, to: end, filter: this.filter, sort: { columnValue: this.columns[this.sortIndex].value, sortDirection: this.sortDirection } });\n } else {\n this.goToFirstPage();\n\n this.sortData(this.filteredData, column);\n }\n\n if (this.currentActiveRow) {\n this.currentActiveRow.isDropdown = false;\n }\n\n this.changeDetectorRef.detectChanges();\n }\n\n public async toggleActionDropdown(row: any, event: any): Promise<void> {\n // Prevent the event to be processed by the Hostlistener\n event.stopPropagation();\n\n let actionPos!: DOMRect;\n\n if (this.currentActiveRow) {\n this.currentActiveRow.isDropdown = false;\n }\n\n row.isDropdown = !row.isDropdown;\n\n this.currentActiveRow = row;\n\n this.changeDetectorRef.detectChanges();\n\n for (let i of this.moreActionsList) {\n if (i.nativeElement.classList.contains('opened')) {\n actionPos = i.nativeElement.getBoundingClientRect();\n }\n }\n\n if(this.DropdownElement) {\n if (this.osService.mobileOS === MobileOS.iOS) {\n actionPos.y += window.visualViewport!.offsetTop;\n actionPos.x += window.visualViewport!.offsetLeft;\n }\n\n const dropdownWidth = this.DropdownElement.nativeElement.offsetWidth;\n\n const left = actionPos.x + dropdownWidth / 2 < window.innerWidth - 10 ? actionPos.x : window.innerWidth - 10 - dropdownWidth;\n\n this.DropdownElement.nativeElement.style.transform = left === actionPos.x ? 'translateX(-50%)' : '';\n this.DropdownElement.nativeElement.style.left = left + 'px';\n this.DropdownElement.nativeElement.style.top = `${ actionPos.y + actionPos.height }px`;\n }\n }\n\n private preprocessData(): void {\n if (!this.data || this.data.length === 0) {\n return;\n }\n\n this.columns.forEach(column => {\n if (!column.value || column.type !== this.TableColumnType.NumberMath) {\n return;\n }\n\n this.data.forEach(row => {\n const result = this.calculateNumberMathCell(row, column);\n row[column.value as any] = result;\n });\n });\n }\n\n private calculateNumberMathCell(row: any, column: any): any {\n const expression = column.value.replace(\n /([a-zA-Z_][a-zA-Z0-9_.]*|\\d*\\.?\\d+)/g,\n (match: any) => {\n let value = this.getDescendantProp(row, { value: match });\n\n return (typeof value === 'number') ? value : parseFloat(value) || 0;\n }\n );\n\n let fn = new Function(`return ${expression};`);\n let result = fn();\n\n if (Number.isFinite(result)) {\n return result;\n }\n\n return this.getDescendantProp(row, column);\n }\n\n private filterData(): any[] {\n if (!this.data || this.data.length === 0) {\n return [];\n }\n\n let arrayToReturn: any[] = [ ];\n\n for (let row of this.data) {\n for (let column of this.columns) {\n if (!column.value) { continue; }\n\n let access = row[column.value];\n\n if (column.value.indexOf('.') !== -1 && column.type !== this.TableColumnType.NumberMath) {\n access = this.getAccessIfColumnValueIsObject(row, column);\n }\n\n if (access === undefined) {\n break;\n }\n\n const rowPropAsString = JSON.stringify(access).toLowerCase();\n\n if (rowPropAsString.includes(this.filter.toLowerCase())) {\n arrayToReturn.push(row);\n\n break;\n }\n }\n }\n\n return arrayToReturn;\n }\n\n private sortData(data: any[], column: IpiTableColumn): any[] {\n if (!data || data.length === 0 || !Array.isArray(data)) {\n return [];\n }\n\n if (column) {\n this.sortByProperty(data, column);\n }\n\n return data;\n }\n\n private sortByProperty(arr: any, column: any): number | void {\n if (this.sortDirection === 'desc') {\n this.sortReverse(arr, column);\n return;\n }\n\n return arr.sort((a: any, b: any) => {\n let valueA = a[column.value];\n let valueB = b[column.value];\n\n let access = column.value;\n\n if (access.indexOf('.') !== -1 && column.type !== this.TableColumnType.NumberMath) {\n valueA = this.getAccessIfColumnValueIsObject(a, column);\n valueB = this.getAccessIfColumnValueIsObject(b, column);\n } else {\n if (typeof valueA === 'string' && valueB !== undefined) {\n valueA = valueA.toLowerCase();\n valueB = valueB.toLowerCase();\n }\n }\n\n if (typeof valueA === 'number' && typeof valueB === 'number') {\n return valueA - valueB;\n }\n \n if (!valueA && valueB) return -1;\n if (valueA && !valueB) return 1;\n\n if (!valueA && !valueB) return 0;\n\n if (valueA < valueB) return -1;\n if (valueA > valueB) return 1;\n\n return 0;\n });\n }\n\n private sortReverse(arr: any, column: any) {\n return arr.sort((a: any, b: any) => {\n let valueA = a[column.value];\n let valueB = b[column.value];\n\n let access = column.value;\n\n if (access.indexOf('.') !== -1 && column.type !== this.TableColumnType.NumberMath) {\n valueA = this.getAccessIfColumnValueIsObject(a, column);\n valueB = this.getAccessIfColumnValueIsObject(b, column);\n } else {\n if (typeof valueA === 'string' && valueB !== undefined) {\n valueA = valueA.toLowerCase();\n valueB = valueB.toLowerCase();\n }\n }\n\n if (typeof valueA === 'number' && typeof valueB === 'number') {\n return valueB - valueA;\n }\n\n if (!valueA && valueB) return 1;\n if (valueA && !valueB) return -1;\n\n if (!valueA && !valueB) return 0;\n\n if (valueA < valueB) return 1;\n if (valueA > valueB) return -1;\n\n return 0;\n });\n }\n\n private getAccessIfColumnValueIsObject(row: any, column: IpiTableColumn): any {\n if (!column.value || column.value === null) {\n return undefined;\n }\n\n const keys = column.value.split('.');\n\n let access = row[keys[0]];\n\n for (let i = 1; i < keys.length; i++) {\n if (access && keys[i] in access) {\n access = access[keys[i]];\n } else {\n return undefined;\n }\n }\n\n return access;\n }\n\n private buildPaginationSelectDependecies(): void {\n const formControls: PageFormControls = {\n pageSize: this.formBuilder.control({ label: this.pageSize.toString(), value: this.pageSize }, { nonNullable: true, validators: [ Validators.required ] })\n };\n\n this.formGroup = this.formBuilder.group(formControls);\n\n const selectData = this.pageSizeOptions.map(item => ({\n label: item.toString(),\n value: item\n }));\n\n this.pageSizeSelectOptions = {\n label: '',\n data: selectData,\n formGroup: this.formGroup,\n formControlName: 'pageSize'\n };\n\n this.subscribeToFormValueChanges();\n }\n\n private subscribeToFormValueChanges(): void {\n this.formGroup.controls.pageSize.valueChanges.subscribe((value) => {\n if (this.pageSize === value.value) {\n return;\n }\n\n const currentPageFirstRowIndex = this.currentPage * this.pageSize;\n this.pageSize = value.value;\n\n this.currentPage = Math.floor(currentPageFirstRowIndex / this.pageSize);\n\n const start = this.currentPage * this.pageSize;\n const end = Math.min(this._dataLength, start + this.pageSize);\n\n if (this.serverSide) {\n this.tableChange.emit({ from: start, to: end, filter: this.filter, sort: { columnValue: this.columns[this.sortIndex].value, sortDirection: this.sortDirection } });\n }\n\n this.calculateTotalPages();\n this.updateVisibleRange(start, end);\n\n setTimeout(() => {\n this.changeDetectorRef.detectChanges();\n });\n });\n }\n\n private calculatePages(): void {\n const start = this.currentPage * this.pageSize;\n const end = Math.min(this._dataLength, start + this.pageSize);\n\n if (!this.serverSide) {\n this.updateVisibleRange(start, end);\n } else {\n this.tableChange.emit({ from: start, to: end, filter: this.filter, sort: { columnValue: this.columns[this.sortIndex].value, sortDirection: this.sortDirection } });\n }\n\n this.changeDetectorRef.detectChanges();\n }\n}\n","<div class=\"container\">\n <table>\n <thead>\n <tr>\n @for (column of columns; track $index) {\n <th [ngStyle]=\"{ width: column.width ? column.width : '' }\">\n <div class=\"cell\">\n <span>{{ column.label }}</span>\n \n @if (column.type !== TableColumnType.Actions && sortable) {\n <div class=\"arranger\" (click)=\"sortColumn(column)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3.11445 5.50005H8.88795C9.31895 5.50005 9.54795 4.99005 9.26145 4.66755L6.37495 1.42005C6.32813 1.3672 6.27063 1.32489 6.20624 1.29591C6.14186 1.26694 6.07205 1.25195 6.00145 1.25195C5.93084 1.25195 5.86104 1.26694 5.79666 1.29591C5.73227 1.32489 5.67477 1.3672 5.62795 1.42005L2.74045 4.66755C2.45395 4.99005 2.68295 5.50005 3.11445 5.50005ZM5.62745 10.5795C5.67427 10.6324 5.73177 10.6747 5.79616 10.7037C5.86054 10.7327 5.93034 10.7476 6.00095 10.7476C6.07155 10.7476 6.14136 10.7327 6.20574 10.7037C6.27013 10.6747 6.32763 10.6324 6.37445 10.5795L9.26095 7.33205C9.54795 7.01005 9.31895 6.50005 8.88745 6.50005H3.11445C2.68345 6.50005 2.45445 7.01005 2.74095 7.33255L5.62745 10.5795Z\" fill=\"#C6C6C6\"/>\n </svg>\n </div>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n\n <tbody [ngClass]=\"{ 'is-loading': this.isLoading }\">\n @for (row of getPageData(); track $index) { \n <tr>\n @for (column of columns; track $index) {\n <td tabindex=\"-1\">\n @switch (column.type) {\n @case (undefined) {\n <ng-container *ngTemplateOutlet=\"textCell; context: { row, column, $index }\"></ng-container>\n }\n\n @case (TableColumnType.Number) {\n <ng-container *ngTemplateOutlet=\"numberCell; context: { row, column }\"></ng-container>\n }\n\n @case (TableColumnType.Currency) {\n <ng-container *ngTemplateOutlet=\"currencyCell; context: { row, column }\"></ng-container>\n }\n\n @case (TableColumnType.NumberMath) {\n <ng-container *ngTemplateOutlet=\"numberMathCell; context: { row, column }\"></ng-container>\n }\n\n @case (TableColumnType.Date) {\n <ng-container *ngTemplateOutlet=\"dateCell; context: { row, column }\"></ng-container>\n }\n\n @case (TableColumnType.Chip) {\n <ng-container *ngTemplateOutlet=\"chipCell; context: { row, column }\"></ng-container>\n }\n\n @case (TableColumnType.Checkbox) {\n <ng-container *ngTemplateOutlet=\"checkboxCell; context: { row, column }\"></ng-container>\n }\n\n @case (TableColumnType.Actions) {\n <ng-container *ngTemplateOutlet=\"actionCell; context: { row, column }\"></ng-container>\n }\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n\n @if (filter && filteredData && filteredData.length === 0) {\n <div class=\"row no-data\">\n <span>No data matching the filter:</span>\n\n <span>\"{{ filter }}\"</span>\n </div>\n }\n\n @if (!filter && data && data.length === 0) {\n <div class=\"row no-data\">No data available.</div>\n }\n\n @if (pageable && getPageData().length !== 0) {\n <div class=\"paging\">\n <div class=\"visible-range\">{{ visibleRange }}</div>\n\n <ng-container *ngTemplateOutlet=\"pagePicker; context: { totalPages: totalPages }\"></ng-container>\n\n <div class=\"page-size-option-picker\">\n <span>Items per page:</span>\n\n <ipi-select class=\"table\" [options]=\"pageSizeSelectOptions\"></ipi-select>\n </div>\n </div>\n }\n</div>\n\n<ng-template #textCell let-row=\"row\" let-column=\"column\" let-index=\"$index\">\n <div class=\"cell\"\n [ngClass]=\"getClass(row, column)\"\n [attr.contenteditable]=\"column.editable\"\n (keyup)=\"cellEdit($event, column.value, index)\">\n\n {{ column.prefix ? column.prefix : '' }}{{ getDescendantProp(row, column) }}{{ column.suffix ? column.suffix : '' }}\n </div>\n</ng-template>\n\n<ng-template #dateCell let-row=\"row\" let-column=\"column\">\n <div class=\"cell\"\n [ngClass]=\"getClass(row, column)\">\n {{ formatDate(getDescendantProp(row, column), column.dateFormat) }}\n </div>\n</ng-template>\n\n<ng-template #currencyCell let-row=\"row\" let-column=\"column\">\n <div class=\"cell\"\n [ngClass]=\"getClass(row, column)\"\n [ngStyle]=\"{ width: column.width ? column.width : '' }\">\n\n @if (getDescendantProp(row, column) !== undefined) {\n {{ column.prefix ? column.prefix : '' }}{{ (getDescendantProp(row, column) / 100) | number }}\n }\n </div>\n</ng-template>\n\n<ng-template #numberCell let-row=\"row\" let-column=\"column\" let-index=\"i\">\n <div class=\"cell\"\n [ngClass]=\"getClass(row, column)\"\n [attr.contenteditable]=\"column.editable\"\n (keyup)=\"cellEdit($event, column.value, index)\">\n\n {{ column.prefix ? column.prefix : '' }}{{ getDescendantProp(row, column) | number}}{{ column.suffix ? column.suffix : '' }}\n </div>\n</ng-template>\n\n<ng-template #numberMathCell let-row=\"row\" let-column=\"column\" let-index=\"i\">\n <div class=\"cell\"\n [ngClass]=\"getClass(row, column)\"\n [attr.contenteditable]=\"column.editable\"\n (keyup)=\"cellEdit($event, column.value, index)\">\n\n {{ column.prefix ? column.prefix : '' }}{{ getDescendantProp(row, column) | number}}{{ column.suffix ? column.suffix : '' }}\n </div>\n</ng-template>\n\n<ng-template #actionCell let-row=\"row\" let-column=\"column\">\n <div class=\"cell actions\">\n\n @for (action of column.singleActions; track $index) {\n @if (handleActionShow(action, row, column)) {\n <div IpiTooltip (click)=\"action.execute && action.execute(row)\" [ipiTooltip]=\"action.label\" [tooltipPosition]=\"tooltipPosition.Above\" class=\"action-icon-wrapper\" [ngClass]=\"{ 'disabled': action.disabled }\">\n <ipi-img [src]=\" 'assets/img/' + action.icon\" [ngClass]=\"action.class\" [ariaLabel]=\"'Action icon for ' + action.label\"></ipi-img>\n </div>\n }\n }\n\n @if (column.multipleActions) {\n <div class=\"action-icon-wrapper\" #moreActionsList [ngClass]=\"{ 'opened': row.isDropdown }\" (click)=\"toggleActionDropdown(row, $event)\">\n <svg class=\"multiple-action-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\">\n <path d=\"M10.3047 8C10.3047 8.34612 10.2021 8.68446 10.0098 8.97225C9.81747 9.26004 9.54416 9.48434 9.22438 9.61679C8.90461 9.74924 8.55275 9.7839 8.21328 9.71638C7.87381 9.64885 7.56199 9.48218 7.31725 9.23744C7.07251 8.9927 6.90584 8.68088 6.83831 8.34141C6.77079 8.00194 6.80545 7.65008 6.9379 7.33031C7.07035 7.01053 7.29465 6.73722 7.58244 6.54493C7.87023 6.35264 8.20857 6.25 8.55469 6.25C9.01868 6.25046 9.46353 6.43498 9.79162 6.76307C10.1197 7.09116 10.3042 7.53601 10.3047 8ZM8.55469 4.75C8.90081 4.75 9.23915 4.64737 9.52694 4.45507C9.81472 4.26278 10.039 3.98947 10.1715 3.6697C10.3039 3.34993 10.3386 2.99806 10.2711 2.65859C10.2035 2.31913 10.0369 2.00731 9.79213 1.76256C9.54738 1.51782 9.23556 1.35115 8.8961 1.28363C8.55663 1.2161 8.20476 1.25076 7.88499 1.38321C7.56522 1.51566 7.29191 1.73997 7.09962 2.02775C6.90732 2.31554 6.80469 2.65388 6.80469 3C6.80515 3.46399 6.98967 3.90884 7.31776 4.23693C7.64585 4.56502 8.0907 4.74954 8.55469 4.75ZM8.55469 11.25C8.20857 11.25 7.87023 11.3526 7.58244 11.5449C7.29465 11.7372 7.07035 12.0105 6.9379 12.3303C6.80545 12.6501 6.77079 13.0019 6.83831 13.3414C6.90584 13.6809 7.07251 13.9927 7.31725 14.2374C7.56199 14.4822 7.87381 14.6489 8.21328 14.7164C8.55275 14.7839 8.90461 14.7492 9.22438 14.6168C9.54416 14.4843 9.81747 14.26 10.0098 13.9722C10.2021 13.6845 10.3047 13.3461 10.3047 13C10.3042 12.536 10.1197 12.0912 9.79162 11.7631C9.46353 11.435 9.01868 11.2505 8.55469 11.25Z\" fill=\"#5D6068\"/>\n </svg>\n </div>\n }\n\n </div>\n\n @if (row.isDropdown) {\n <ng-container class=\"dropdown-element\" *ngTemplateOutlet=\"multipleActionsDropdown; context: { row, column }\"></ng-container>\n }\n</ng-template>\n\n<ng-template #chipCell let-row=\"row\" let-column=\"column\">\n <div class=\"cell chip\">\n @if (getChipLabel(row, column)) {\n <ipi-chip [ngClass]=\"getClass(row, column)\"> {{ getChipLabel(row, column) }}</ipi-chip>\n }\n </div>\n</ng-template>\n\n<ng-template #checkboxCell let-row=\"row\" let-column=\"column\">\n <div class=\"cell checkbox\">\n <ipi-checkbox [checked]=\"getCheckboxState(row, column)\" [disabled]=\"true\"></ipi-checkbox>\n </div>\n</ng-template>\n\n<ng-template #multipleActionsDropdown let-row=\"row\" let-column=\"column\">\n <div #multipleActionsDropdownElement #dropdownElement class=\"more-actions-dropdown\">\n @for (action of column.multipleActions; track $index) {\n\n @if (handleActionShow(action, row, column)) {\n <div class=\"dropdown-row\" (click)=\"action.execute && action.execute(row)\">\n <ipi-img [src]=\"'assets/img/' + action.icon\" [ngClass]=\"action.class\" [ariaLabel]=\"'Action icon for ' + action.label\"></ipi-img>\n\n <span>{{ action.label }}</span>\n </div>\n }\n\n }\n </div>\n</ng-template>\n\n<ng-template #pagePicker let-totalPages=\"totalPages\">\n <div class=\"page-picker\">\n <!-- If page one should be visible -->\n @if (currentPage + 1 >= 3) {\n <span (click)=\"goToPage(0)\">1</span>\n <span class=\"style-excluded\">...</span>\n }\n\n <!-- Middle part of the page-picker -->\n <ng-container *ngTemplateOutlet=\"page; context: { page: currentPage - 1 } \"></ng-container>\n <ng-container *ngTemplateOutlet=\"page; context: { page: currentPage, class: 'highlighted' } \"></ng-container>\n <ng-container *ngTemplateOutlet=\"page; context: { page: currentPage + 1 } \"></ng-container>\n\n <!-- If last page should be visible -->\n @if (currentPage + 1 <= totalPages - 2) {\n <span class=\"style-excluded\">...</span>\n <span (click)=\"goToPage(totalPages - 1)\">{{ totalPages }}</span>\n }\n\n </div>\n</ng-template>\n\n<ng-template #page let-page=\"page\" let-class=\"class\">\n @if (page >= 0 && page < totalPages) {\n <span [ngClass]=\"class\" (click)=\"goToPage(page)\">{{ page + 1 }}</span>\n }\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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