ngx-simple-datatables 1.17.0 → 2.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-simple-datatables.mjs","sources":["../../../projects/ngx-simple-datatable/src/lib/ngx-simple-datatable.service.ts","../../../projects/ngx-simple-datatable/src/lib/ngx-simple-datatable.component.ts","../../../projects/ngx-simple-datatable/src/lib/ngx-simple-datatable.component.html","../../../projects/ngx-simple-datatable/src/public-api.ts","../../../projects/ngx-simple-datatable/src/ngx-simple-datatables.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NgxSimpleDatatableService {\n\n constructor() { }\n}\n","import { CommonModule, isPlatformBrowser } from \"@angular/common\";\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Input,\n TrackByFunction,\n ViewChild,\n Inject,\n PLATFORM_ID,\n ContentChild,\n TemplateRef,\n AfterContentInit,\n OnInit,\n OnDestroy,\n NgZone,\n ChangeDetectorRef as CDR,\n} from \"@angular/core\";\nimport { ColumnConfig, SortState } from \"../interfaces/column-config.interface\";\n\n@Component({\n selector: \"ngx-simple-datatable\",\n standalone: true,\n imports: [CommonModule],\n templateUrl: \"./ngx-simple-datatable.component.html\",\n styleUrls: [\"./ngx-simple-datatable.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgxSimpleDatatableComponent\n implements OnInit, OnDestroy, AfterContentInit\n{\n @Input() columns: ColumnConfig[] = [];\n @Input() data: any[] = [];\n @Input() rowHeight = 40;\n @Input() headerHeight = 50;\n @Input() bufferSize = 10;\n\n @ViewChild(\"tableContainer\", { static: true })\n tableContainer!: ElementRef<HTMLDivElement>;\n @ViewChild(\"tableBody\", { static: true })\n tableBody!: ElementRef<HTMLDivElement>;\n @ViewChild(\"headerRow\", { static: true })\n headerRow!: ElementRef<HTMLDivElement>;\n @ViewChild(\"headeCenterRow\", { static: true })\n headeCenterRow!: ElementRef<HTMLDivElement>;\n\n @ContentChild(\"headerTemplate\", { static: true })\n headerTemplate!: TemplateRef<any>;\n @ContentChild(\"cellTemplate\", { static: true })\n cellTemplate!: TemplateRef<any>;\n\n // Virtualization properties\n visibleStartIndex = 0;\n visibleEndIndex = 0;\n visibleRows: any[] = [];\n totalHeight = 0;\n offsetY = 0;\n containerHeight = 0;\n\n // Column properties\n leftFrozenColumns: ColumnConfig[] = [];\n centerColumns: ColumnConfig[] = [];\n rightFrozenColumns: ColumnConfig[] = [];\n columnWidths: { [key: string]: number } = {};\n\n // Sorting\n sortState: SortState = { field: \"\", direction: null };\n\n // Resizing\n private isResizing = false;\n private resizingColumn = \"\";\n private startX = 0;\n private startWidth = 0;\n\n // Scroll listeners\n private scrollListener: ((event: Event) => void) | null = null;\n private resizeListener: ((event: Event) => void) | null = null;\n private isBrowser: boolean;\n private storageKey = \"ngx-simple-datatable-column-widths\";\n private scrollRequestId: number | null = null;\n private resizeTimer: ReturnType<typeof setTimeout> | null = null;\n private mouseMoveHandler: ((e: MouseEvent) => void) | null = null;\n private mouseUpHandler: ((e: MouseEvent) => void) | null = null;\n\n constructor(\n private cdr: ChangeDetectorRef,\n @Inject(PLATFORM_ID) private platformId: Object,\n private ngZone: NgZone\n ) {\n this.isBrowser = isPlatformBrowser(this.platformId);\n }\n\n ngOnInit() {\n this.initializeColumns();\n if (this.isBrowser) {\n this.setupEventListeners();\n }\n this.calculateVirtualization();\n }\n\n ngOnDestroy() {\n if (this.isBrowser) {\n this.removeEventListeners();\n\n // Clean up any pending animations or timeouts\n if (this.scrollRequestId) {\n cancelAnimationFrame(this.scrollRequestId);\n }\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer);\n }\n }\n }\n\n ngAfterContentInit() {\n // if (!this.headerTemplate) {\n // throw new Error(\"ngx-simple-datatable requires a headerTemplate.\");\n // }\n // if (!this.cellTemplate) {\n // throw new Error(\"ngx-simple-datatable requires a cellTemplate.\");\n // }\n }\n\n private initializeColumns() {\n this.leftFrozenColumns = this.columns.filter(\n (col) => col.freeze === \"left\"\n );\n this.rightFrozenColumns = this.columns.filter(\n (col) => col.freeze === \"right\"\n );\n this.centerColumns = this.columns.filter((col) => !col.freeze);\n\n // Load saved column widths if available\n const savedWidths = this.loadColumnWidths();\n\n // Initialize column widths\n this.columns.forEach((col) => {\n if (col.width) {\n this.columnWidths[col.field] = Number.parseInt(\n col.width.replace(\"px\", \"\")\n );\n } else if (savedWidths && savedWidths[col.field]) {\n this.columnWidths[col.field] = savedWidths[col.field];\n } else {\n this.columnWidths[col.field] = 150; // default width\n }\n });\n }\n\n private setupEventListeners() {\n // Store references for cleanup\n this.scrollListener = (event: Event) => this.onBodyScroll(event);\n this.resizeListener = () => this.onResize();\n this.mouseMoveHandler = (event: MouseEvent) => this.onMouseMove(event);\n this.mouseUpHandler = (event: MouseEvent) => this.onMouseUp();\n\n // Add event listeners\n if (this.isBrowser) {\n // For the header scroll (horizontal only)\n if (this.headerRow?.nativeElement) {\n this.headerRow.nativeElement.addEventListener(\"scroll\", () =>\n this.onHeaderScroll(null)\n );\n }\n\n // For the body scroll (both vertical and horizontal)\n if (this.tableBody?.nativeElement && this.scrollListener) {\n this.tableBody.nativeElement.addEventListener(\n \"scroll\",\n this.scrollListener\n );\n }\n\n // Window resize and mouse events\n if (this.resizeListener) {\n window.addEventListener(\"resize\", this.resizeListener);\n }\n\n if (this.mouseMoveHandler) {\n document.addEventListener(\"mousemove\", this.mouseMoveHandler);\n }\n\n if (this.mouseUpHandler) {\n document.addEventListener(\"mouseup\", this.mouseUpHandler);\n }\n }\n }\n\n private removeEventListeners() {\n if (this.isBrowser) {\n // Clear any pending animations or timeouts\n if (this.scrollRequestId) {\n cancelAnimationFrame(this.scrollRequestId);\n this.scrollRequestId = null;\n }\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer);\n this.resizeTimer = null;\n }\n\n // Reset all event listeners\n this.scrollListener = null;\n this.resizeListener = null;\n this.mouseMoveHandler = null;\n this.mouseUpHandler = null;\n }\n }\n\n private calculateVirtualization() {\n if (!this.tableContainer || !this.tableBody) return;\n\n // Update container height based on available space\n const container = this.tableBody.nativeElement;\n this.containerHeight = container.clientHeight - this.headerHeight;\n this.totalHeight = this.data.length * this.rowHeight;\n\n // Get scroll position\n const scrollTop = container.scrollTop;\n\n // Calculate visible rows\n const visibleRowCount =\n Math.ceil(this.containerHeight / this.rowHeight) + 1;\n\n // Calculate start and end indices with buffer\n this.visibleStartIndex = Math.max(\n 0,\n Math.floor(scrollTop / this.rowHeight) - this.bufferSize\n );\n\n this.visibleEndIndex = Math.min(\n this.data.length - 1,\n this.visibleStartIndex + visibleRowCount + this.bufferSize * 2\n );\n\n // Update visible rows\n this.visibleRows = this.data.slice(\n this.visibleStartIndex,\n this.visibleEndIndex + 1\n );\n\n console.log(scrollTop, this.visibleStartIndex, this.visibleEndIndex);\n\n // Update vertical offset for virtual scrolling\n this.offsetY = this.visibleStartIndex * this.rowHeight;\n\n // Trigger change detection in the next tick to avoid ExpressionChangedAfterItHasBeenCheckedError\n Promise.resolve().then(() => {\n this.cdr.detectChanges();\n });\n }\n\n // Track last scroll time to prevent feedback loops\n private lastScrollTime = 0;\n private readonly SCROLL_DEBOUNCE = 10; // ms\n\n // Track scroll position for header transform\n public headerTransform = \"translateX(0)\";\n\n // Handle body scroll events\n public onBodyScroll(event: Event) {\n if (!event) return;\n\n const now = Date.now();\n if (now - this.lastScrollTime < this.SCROLL_DEBOUNCE) return;\n this.lastScrollTime = now;\n\n const target = event.target as HTMLElement;\n\n // Sync header scroll with body (horizontally)\n // if (this.headerRow?.nativeElement) {\n // this.headerRow.nativeElement.scrollLeft = target.scrollLeft;\n this.syncHorizontalScroll(target.scrollLeft);\n // }\n\n // Handle virtualization (vertical scrolling)\n if (this.scrollRequestId) {\n cancelAnimationFrame(this.scrollRequestId);\n }\n\n this.scrollRequestId = requestAnimationFrame(() => {\n this.calculateVirtualization();\n this.scrollRequestId = null;\n });\n }\n\n // Handle header scroll events\n public onHeaderScroll(event: Event | null): void {\n if (!event) return;\n const now = Date.now();\n if (now - this.lastScrollTime < this.SCROLL_DEBOUNCE) return;\n this.lastScrollTime = now;\n\n // Sync body scroll with header (horizontally)\n const scrollLeft = (event.target as HTMLElement).scrollLeft;\n if (this.tableBody?.nativeElement) {\n this.tableBody.nativeElement.scrollLeft = scrollLeft;\n }\n }\n\n private onResize() {\n // Debounce resize events for better performance\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer);\n }\n\n this.resizeTimer = setTimeout(() => {\n this.calculateVirtualization();\n this.resizeTimer = null;\n }, 50);\n }\n\n private syncHorizontalScroll(scrollLeft: number) {\n if (!this.tableContainer) return;\n\n // Update the transform value\n this.headerTransform = `translateX(-${scrollLeft}px)`;\n // Trigger change detection\n this.cdr.detectChanges();\n }\n\n // Sorting functionality\n onSort(column: ColumnConfig) {\n if (!column.sortable) return;\n\n if (this.sortState.field === column.field) {\n // Toggle sort direction\n if (this.sortState.direction === \"asc\") {\n this.sortState.direction = \"desc\";\n } else if (this.sortState.direction === \"desc\") {\n this.sortState.direction = null;\n this.sortState.field = \"\";\n } else {\n this.sortState.direction = \"asc\";\n }\n } else {\n this.sortState.field = column.field;\n this.sortState.direction = \"asc\";\n }\n\n this.applySorting();\n }\n\n private applySorting() {\n if (!this.sortState.direction || !this.sortState.field) {\n // Reset to original order if no sorting\n return;\n }\n\n this.data.sort((a, b) => {\n const aValue = a[this.sortState.field];\n const bValue = b[this.sortState.field];\n\n let comparison = 0;\n if (aValue > bValue) comparison = 1;\n if (aValue < bValue) comparison = -1;\n\n return this.sortState.direction === \"desc\" ? -comparison : comparison;\n });\n\n this.calculateVirtualization();\n }\n\n getSortIcon(column: ColumnConfig): string {\n if (!column.sortable || this.sortState.field !== column.field) return \"\";\n if (this.sortState.direction === \"asc\") return \"▲\";\n if (this.sortState.direction === \"desc\") return \"▼\";\n return \"\";\n }\n\n // Column resizing functionality\n onResizeStart(event: MouseEvent, column: ColumnConfig) {\n event.preventDefault();\n this.isResizing = true;\n this.resizingColumn = column.field;\n this.startX = event.clientX;\n this.startWidth = this.columnWidths[column.field];\n\n if (this.isBrowser) {\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n }\n }\n\n private onMouseMove(event: MouseEvent) {\n if (!this.isResizing || !this.resizingColumn) return;\n\n this.ngZone.runOutsideAngular(() => {\n const deltaX = event.clientX - this.startX;\n const newWidth = Math.max(50, this.startWidth + deltaX); // Minimum width of 50px\n\n // Only update if width actually changed\n if (this.columnWidths[this.resizingColumn] !== newWidth) {\n this.columnWidths[this.resizingColumn] = newWidth;\n this.cdr.detectChanges();\n }\n });\n }\n\n private onMouseUp() {\n if (this.isResizing) {\n this.isResizing = false;\n if (this.isBrowser) {\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n // Save column widths when resizing is complete\n this.saveColumnWidths();\n }\n this.resizingColumn = \"\";\n }\n }\n\n // Utility methods\n getColumnWidth(column: ColumnConfig): string {\n return `${this.columnWidths[column.field]}px`;\n }\n\n getCellValue(row: any, column: ColumnConfig): string {\n const value = row[column.field];\n return column.formatter\n ? column.formatter(value, row)\n : value?.toString() || \"\";\n }\n\n getLeftFrozenWidth(): number {\n return this.leftFrozenColumns.reduce(\n (sum, col) => sum + this.columnWidths[col.field],\n 0\n );\n }\n\n getRightFrozenWidth(): number {\n return this.rightFrozenColumns.reduce(\n (sum, col) => sum + this.columnWidths[col.field],\n 0\n );\n }\n\n // TrackBy functions for performance\n trackByRowIndex: TrackByFunction<any> = (index: number) =>\n this.visibleStartIndex + index;\n trackByColumnField: TrackByFunction<ColumnConfig> = (\n index: number,\n column: ColumnConfig\n ) => column.field;\n\n // Accessibility methods\n getAriaSort(column: ColumnConfig): string | null {\n if (this.sortState.field !== column.field || !column.sortable) {\n return null;\n }\n return this.sortState.direction === \"asc\" ? \"ascending\" : \"descending\";\n }\n\n // Keyboard navigation\n onKeydown(event: KeyboardEvent): void {\n if (!this.tableContainer) return;\n\n const { key, ctrlKey, shiftKey } = event;\n const scrollAmount = shiftKey ? 100 : 30; // Larger scroll with shift key\n console.log(key);\n switch (key) {\n case \"ArrowLeft\":\n this.tableContainer.nativeElement.scrollLeft -= scrollAmount;\n break;\n case \"ArrowRight\":\n this.tableContainer.nativeElement.scrollLeft += scrollAmount;\n break;\n case \"ArrowUp\":\n if (ctrlKey) {\n this.tableContainer.nativeElement.scrollTo({\n top: 0,\n behavior: \"smooth\",\n });\n } else {\n this.tableContainer.nativeElement.scrollTop -= scrollAmount;\n }\n break;\n case \"ArrowDown\":\n if (ctrlKey) {\n this.tableContainer.nativeElement.scrollTo({\n top: this.tableContainer.nativeElement.scrollHeight,\n behavior: \"smooth\",\n });\n } else {\n this.tableContainer.nativeElement.scrollTop += scrollAmount;\n }\n break;\n case \"1\":\n if (ctrlKey) {\n this.tableContainer.nativeElement.scrollTo({\n top: 0,\n left: 0,\n behavior: \"smooth\",\n });\n } else {\n this.tableContainer.nativeElement.scrollTo({\n left: 0,\n behavior: \"smooth\",\n });\n }\n break;\n case \"0\":\n if (ctrlKey) {\n this.tableContainer.nativeElement.scrollTo({\n top: this.tableContainer.nativeElement.scrollHeight,\n left: this.tableContainer.nativeElement.scrollWidth,\n behavior: \"smooth\",\n });\n } else {\n this.tableContainer.nativeElement.scrollTo({\n left: this.tableContainer.nativeElement.scrollWidth,\n behavior: \"smooth\",\n });\n }\n break;\n default:\n return; // Exit for other keys\n }\n\n event.preventDefault();\n }\n\n // Save column widths to localStorage\n private saveColumnWidths(): void {\n if (this.isBrowser) {\n try {\n localStorage.setItem(\n this.storageKey,\n JSON.stringify(this.columnWidths)\n );\n } catch (e) {\n console.warn(\"Failed to save column widths to localStorage\", e);\n }\n }\n }\n\n // Load column widths from localStorage\n private loadColumnWidths(): Record<string, number> | null {\n if (!this.isBrowser) return null;\n\n try {\n const saved = localStorage.getItem(this.storageKey);\n return saved ? JSON.parse(saved) : null;\n } catch (e) {\n console.warn(\"Failed to load column widths from localStorage\", e);\n return null;\n }\n }\n\n // Clear saved column widths\n public clearSavedWidths(): void {\n if (this.isBrowser) {\n try {\n localStorage.removeItem(this.storageKey);\n // Reset to default widths\n this.columns.forEach((col) => {\n this.columnWidths[col.field] = col.width\n ? Number.parseInt(col.width.replace(\"px\", \"\"))\n : 150;\n });\n this.cdr.detectChanges();\n } catch (e) {\n console.warn(\"Failed to clear saved column widths\", e);\n }\n }\n }\n}\n","<div class=\"dynamic-table-container\" #tableContainer>\n <!-- Sticky Header -->\n <div class=\"table-header\" [style.height.px]=\"headerHeight\">\n <div class=\"header-row\" #headerRow (scroll)=\"onHeaderScroll($event)\">\n <!-- Left Frozen Columns -->\n <div class=\"frozen-left\" [style.width.px]=\"getLeftFrozenWidth()\" *ngIf=\"leftFrozenColumns.length > 0\"\n role=\"presentation\">\n <div class=\"header-cell\"\n *ngFor=\"let column of leftFrozenColumns; trackBy: trackByColumnField; let colIndex = index\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\"\n [class.sort-asc]=\"sortState.field === column.field && sortState.direction === 'asc'\"\n [class.sort-desc]=\"sortState.field === column.field && sortState.direction === 'desc'\"\n [attr.role]=\"'columnheader'\" [attr.aria-sort]=\"getAriaSort(column)\" [attr.aria-colindex]=\"colIndex + 1\"\n [attr.aria-label]=\"column.header + (column.sortable ? ' (click to sort)' : '')\" (click)=\"onSort(column)\"\n (keydown.enter)=\"onSort(column)\" (keydown.space)=\"onSort(column); $event.preventDefault()\"\n [tabindex]=\"column.sortable ? '0' : '-1'\" [attr.data-column-id]=\"column.field\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\" [ngTemplateOutletContext]=\"{ column: column }\">\n </ng-container>\n\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n\n <!-- Center Scrollable Columns -->\n <div class=\"center-columns\" #headeCenterRow role=\"presentation\" [ngStyle]=\"{'transform': headerTransform}\">\n <div class=\"header-cell\" *ngFor=\"let column of centerColumns; trackBy: trackByColumnField; let colIndex = index\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\"\n [class.sort-asc]=\"sortState.field === column.field && sortState.direction === 'asc'\"\n [class.sort-desc]=\"sortState.field === column.field && sortState.direction === 'desc'\"\n [attr.role]=\"'columnheader'\" [attr.aria-sort]=\"getAriaSort(column)\"\n [attr.aria-colindex]=\"leftFrozenColumns.length + colIndex + 1\"\n [attr.aria-label]=\"column.header + (column.sortable ? ' (click to sort)' : '')\" (click)=\"onSort(column)\"\n (keydown.enter)=\"onSort(column)\" (keydown.space)=\"onSort(column); $event.preventDefault()\"\n [tabindex]=\"column.sortable ? '0' : '-1'\" [attr.data-column-id]=\"column.field\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\"\n [ngTemplateOutletContext]=\"{ column: column }\"></ng-container>\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n\n <!-- Right Frozen Columns -->\n <div class=\"frozen-right\" [style.width.px]=\"getRightFrozenWidth()\" *ngIf=\"rightFrozenColumns.length > 0\">\n <div class=\"header-cell\" *ngFor=\"let column of rightFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\" (click)=\"onSort(column)\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\"\n [ngTemplateOutletContext]=\"{ column: column }\"></ng-container>\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Table Body with Virtual Scrolling -->\n <div class=\"table-body\" #tableBody [style.height]=\"'calc(100% - ' + headerHeight + 'px)'\"\n (scroll)=\"onBodyScroll($event)\">\n <!-- Virtual spacer for total height -->\n <div class=\"virtual-spacer\" [style.height.px]=\"totalHeight\"></div>\n\n <!-- Visible rows container -->\n <div class=\"visible-rows\" [style.transform]=\"'translateY(' + offsetY + 'px)'\">\n <div class=\"table-row\" *ngFor=\"let row of visibleRows; let i = index; trackBy: trackByRowIndex\"\n [style.height.px]=\"rowHeight\">\n\n <!-- Left Frozen Columns -->\n <div class=\"frozen-left\" [style.width.px]=\"getLeftFrozenWidth()\" *ngIf=\"leftFrozenColumns.length > 0\">\n <div class=\"table-cell\" *ngFor=\"let column of leftFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n\n <!-- Center Scrollable Columns -->\n <div class=\"center-columns\">\n <div class=\"table-cell\" *ngFor=\"let column of centerColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n\n <!-- Right Frozen Columns -->\n <div class=\"frozen-right\" [style.width.px]=\"getRightFrozenWidth()\" *ngIf=\"rightFrozenColumns.length > 0\">\n <div class=\"table-cell\" *ngFor=\"let column of rightFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>","/*\n * Public API Surface of ngx-simple-datatable\n */\n\nexport * from './lib/ngx-simple-datatable.service';\nexport * from './lib/ngx-simple-datatable.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-simple-datatables.mjs","sources":["../../../projects/ngx-simple-datatables/src/lib/ngx-simple-datatables.service.ts","../../../projects/ngx-simple-datatables/src/lib/ngx-simple-datatables.component.ts","../../../projects/ngx-simple-datatables/src/lib/ngx-simple-datatables.component.html","../../../projects/ngx-simple-datatables/src/lib/ngx-simple-datatables.module.ts","../../../projects/ngx-simple-datatables/src/public-api.ts","../../../projects/ngx-simple-datatables/src/ngx-simple-datatables.ts"],"sourcesContent":["import { Injectable } from \"@angular/core\";\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class NgxSimpleDatatablesService {\n constructor() {}\n}\n","import { CommonModule, isPlatformBrowser } from \"@angular/common\";\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Input,\n TrackByFunction,\n ViewChild,\n Inject,\n PLATFORM_ID,\n ContentChild,\n TemplateRef,\n AfterContentInit,\n OnInit,\n OnDestroy,\n NgZone,\n ChangeDetectorRef as CDR,\n} from \"@angular/core\";\nimport { ColumnConfig, SortState } from \"../interfaces/column-config.interface\";\n\n@Component({\n selector: \"ngx-simple-datatables\",\n templateUrl: \"./ngx-simple-datatables.component.html\",\n styleUrls: [\"./ngx-simple-datatables.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class NgxSimpleDatatablesComponent\n implements OnInit, OnDestroy, AfterContentInit\n{\n @Input() columns: ColumnConfig[] = [];\n @Input() data: any[] = [];\n @Input() rowHeight = 40;\n @Input() headerHeight = 50;\n @Input() bufferSize = 10;\n\n @ViewChild(\"tableContainer\", { static: true })\n tableContainer!: ElementRef<HTMLDivElement>;\n @ViewChild(\"tableBody\", { static: true })\n tableBody!: ElementRef<HTMLDivElement>;\n @ViewChild(\"headerRow\", { static: true })\n headerRow!: ElementRef<HTMLDivElement>;\n @ViewChild(\"headeCenterRow\", { static: true })\n headeCenterRow!: ElementRef<HTMLDivElement>;\n\n @ContentChild(\"headerTemplate\", { static: true })\n headerTemplate!: TemplateRef<any>;\n @ContentChild(\"cellTemplate\", { static: true })\n cellTemplate!: TemplateRef<any>;\n\n // Virtualization properties\n visibleStartIndex = 0;\n visibleEndIndex = 0;\n visibleRows: any[] = [];\n totalHeight = 0;\n offsetY = 0;\n containerHeight = 0;\n\n // Column properties\n leftFrozenColumns: ColumnConfig[] = [];\n centerColumns: ColumnConfig[] = [];\n rightFrozenColumns: ColumnConfig[] = [];\n columnWidths: { [key: string]: number } = {};\n\n // Sorting\n sortState: SortState = { field: \"\", direction: null };\n\n // Resizing\n private isResizing = false;\n private resizingColumn = \"\";\n private startX = 0;\n private startWidth = 0;\n\n // Scroll listeners\n private scrollListener: ((event: Event) => void) | null = null;\n private resizeListener: ((event: Event) => void) | null = null;\n private isBrowser: boolean;\n private storageKey = \"ngx-simple-datatables-column-widths\";\n private scrollRequestId: number | null = null;\n private resizeTimer: ReturnType<typeof setTimeout> | null = null;\n private mouseMoveHandler: ((e: MouseEvent) => void) | null = null;\n private mouseUpHandler: ((e: MouseEvent) => void) | null = null;\n\n constructor(\n private cdr: ChangeDetectorRef,\n @Inject(PLATFORM_ID) private platformId: Object,\n private ngZone: NgZone\n ) {\n this.isBrowser = isPlatformBrowser(this.platformId);\n }\n\n ngOnInit() {\n this.initializeColumns();\n if (this.isBrowser) {\n this.setupEventListeners();\n }\n this.calculateVirtualization();\n }\n\n ngOnDestroy() {\n if (this.isBrowser) {\n this.removeEventListeners();\n\n // Clean up any pending animations or timeouts\n if (this.scrollRequestId) {\n cancelAnimationFrame(this.scrollRequestId);\n }\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer);\n }\n }\n }\n\n ngAfterContentInit() {\n // if (!this.headerTemplate) {\n // throw new Error(\"ngx-simple-datatables requires a headerTemplate.\");\n // }\n // if (!this.cellTemplate) {\n // throw new Error(\"ngx-simple-datatables requires a cellTemplate.\");\n // }\n }\n\n private initializeColumns() {\n this.leftFrozenColumns = this.columns.filter(\n (col) => col.freeze === \"left\"\n );\n this.rightFrozenColumns = this.columns.filter(\n (col) => col.freeze === \"right\"\n );\n this.centerColumns = this.columns.filter((col) => !col.freeze);\n\n // Load saved column widths if available\n const savedWidths = this.loadColumnWidths();\n\n // Initialize column widths\n this.columns.forEach((col) => {\n if (col.width) {\n this.columnWidths[col.field] = Number.parseInt(\n col.width.replace(\"px\", \"\")\n );\n } else if (savedWidths && savedWidths[col.field]) {\n this.columnWidths[col.field] = savedWidths[col.field];\n } else {\n this.columnWidths[col.field] = 150; // default width\n }\n });\n }\n\n private setupEventListeners() {\n // Store references for cleanup\n this.scrollListener = (event: Event) => this.onBodyScroll(event);\n this.resizeListener = () => this.onResize();\n this.mouseMoveHandler = (event: MouseEvent) => this.onMouseMove(event);\n this.mouseUpHandler = (event: MouseEvent) => this.onMouseUp();\n\n // Add event listeners\n if (this.isBrowser) {\n // For the header scroll (horizontal only)\n if (this.headerRow?.nativeElement) {\n this.headerRow.nativeElement.addEventListener(\"scroll\", () =>\n this.onHeaderScroll(null)\n );\n }\n\n // For the body scroll (both vertical and horizontal)\n if (this.tableBody?.nativeElement && this.scrollListener) {\n this.tableBody.nativeElement.addEventListener(\n \"scroll\",\n this.scrollListener\n );\n }\n\n // Window resize and mouse events\n if (this.resizeListener) {\n window.addEventListener(\"resize\", this.resizeListener);\n }\n\n if (this.mouseMoveHandler) {\n document.addEventListener(\"mousemove\", this.mouseMoveHandler);\n }\n\n if (this.mouseUpHandler) {\n document.addEventListener(\"mouseup\", this.mouseUpHandler);\n }\n }\n }\n\n private removeEventListeners() {\n if (this.isBrowser) {\n // Clear any pending animations or timeouts\n if (this.scrollRequestId) {\n cancelAnimationFrame(this.scrollRequestId);\n this.scrollRequestId = null;\n }\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer);\n this.resizeTimer = null;\n }\n\n // Reset all event listeners\n this.scrollListener = null;\n this.resizeListener = null;\n this.mouseMoveHandler = null;\n this.mouseUpHandler = null;\n }\n }\n\n private calculateVirtualization() {\n if (!this.tableContainer || !this.tableBody) return;\n\n // Update container height based on available space\n const container = this.tableBody.nativeElement;\n this.containerHeight = container.clientHeight - this.headerHeight;\n this.totalHeight = this.data.length * this.rowHeight;\n\n // Get scroll position\n const scrollTop = container.scrollTop;\n\n // Calculate visible rows\n const visibleRowCount =\n Math.ceil(this.containerHeight / this.rowHeight) + 1;\n\n // Calculate start and end indices with buffer\n this.visibleStartIndex = Math.max(\n 0,\n Math.floor(scrollTop / this.rowHeight) - this.bufferSize\n );\n\n this.visibleEndIndex = Math.min(\n this.data.length - 1,\n this.visibleStartIndex + visibleRowCount + this.bufferSize * 2\n );\n\n // Update visible rows\n this.visibleRows = this.data.slice(\n this.visibleStartIndex,\n this.visibleEndIndex + 1\n );\n\n console.log(scrollTop, this.visibleStartIndex, this.visibleEndIndex);\n\n // Update vertical offset for virtual scrolling\n this.offsetY = this.visibleStartIndex * this.rowHeight;\n\n // Trigger change detection in the next tick to avoid ExpressionChangedAfterItHasBeenCheckedError\n Promise.resolve().then(() => {\n this.cdr.detectChanges();\n });\n }\n\n // Track last scroll time to prevent feedback loops\n private lastScrollTime = 0;\n private readonly SCROLL_DEBOUNCE = 10; // ms\n\n // Track scroll position for header transform\n public headerTransform = \"translateX(0)\";\n\n // Handle body scroll events\n public onBodyScroll(event: Event) {\n if (!event) return;\n\n const now = Date.now();\n if (now - this.lastScrollTime < this.SCROLL_DEBOUNCE) return;\n this.lastScrollTime = now;\n\n const target = event.target as HTMLElement;\n\n // Sync header scroll with body (horizontally)\n // if (this.headerRow?.nativeElement) {\n // this.headerRow.nativeElement.scrollLeft = target.scrollLeft;\n this.syncHorizontalScroll(target.scrollLeft);\n // }\n\n // Handle virtualization (vertical scrolling)\n if (this.scrollRequestId) {\n cancelAnimationFrame(this.scrollRequestId);\n }\n\n this.scrollRequestId = requestAnimationFrame(() => {\n this.calculateVirtualization();\n this.scrollRequestId = null;\n });\n }\n\n // Handle header scroll events\n public onHeaderScroll(event: Event | null): void {\n if (!event) return;\n const now = Date.now();\n if (now - this.lastScrollTime < this.SCROLL_DEBOUNCE) return;\n this.lastScrollTime = now;\n\n // Sync body scroll with header (horizontally)\n const scrollLeft = (event.target as HTMLElement).scrollLeft;\n if (this.tableBody?.nativeElement) {\n this.tableBody.nativeElement.scrollLeft = scrollLeft;\n }\n }\n\n private onResize() {\n // Debounce resize events for better performance\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer);\n }\n\n this.resizeTimer = setTimeout(() => {\n this.calculateVirtualization();\n this.resizeTimer = null;\n }, 50);\n }\n\n private syncHorizontalScroll(scrollLeft: number) {\n if (!this.tableContainer) return;\n\n // Update the transform value\n this.headerTransform = `translateX(-${scrollLeft}px)`;\n // Trigger change detection\n this.cdr.detectChanges();\n }\n\n // Sorting functionality\n onSort(column: ColumnConfig) {\n if (!column.sortable) return;\n\n if (this.sortState.field === column.field) {\n // Toggle sort direction\n if (this.sortState.direction === \"asc\") {\n this.sortState.direction = \"desc\";\n } else if (this.sortState.direction === \"desc\") {\n this.sortState.direction = null;\n this.sortState.field = \"\";\n } else {\n this.sortState.direction = \"asc\";\n }\n } else {\n this.sortState.field = column.field;\n this.sortState.direction = \"asc\";\n }\n\n this.applySorting();\n }\n\n private applySorting() {\n if (!this.sortState.direction || !this.sortState.field) {\n // Reset to original order if no sorting\n return;\n }\n\n this.data.sort((a, b) => {\n const aValue = a[this.sortState.field];\n const bValue = b[this.sortState.field];\n\n let comparison = 0;\n if (aValue > bValue) comparison = 1;\n if (aValue < bValue) comparison = -1;\n\n return this.sortState.direction === \"desc\" ? -comparison : comparison;\n });\n\n this.calculateVirtualization();\n }\n\n getSortIcon(column: ColumnConfig): string {\n if (!column.sortable || this.sortState.field !== column.field) return \"\";\n if (this.sortState.direction === \"asc\") return \"▲\";\n if (this.sortState.direction === \"desc\") return \"▼\";\n return \"\";\n }\n\n // Column resizing functionality\n onResizeStart(event: MouseEvent, column: ColumnConfig) {\n event.preventDefault();\n this.isResizing = true;\n this.resizingColumn = column.field;\n this.startX = event.clientX;\n this.startWidth = this.columnWidths[column.field];\n\n if (this.isBrowser) {\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n }\n }\n\n private onMouseMove(event: MouseEvent) {\n if (!this.isResizing || !this.resizingColumn) return;\n\n this.ngZone.runOutsideAngular(() => {\n const deltaX = event.clientX - this.startX;\n const newWidth = Math.max(50, this.startWidth + deltaX); // Minimum width of 50px\n\n // Only update if width actually changed\n if (this.columnWidths[this.resizingColumn] !== newWidth) {\n this.columnWidths[this.resizingColumn] = newWidth;\n this.cdr.detectChanges();\n }\n });\n }\n\n private onMouseUp() {\n if (this.isResizing) {\n this.isResizing = false;\n if (this.isBrowser) {\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n // Save column widths when resizing is complete\n this.saveColumnWidths();\n }\n this.resizingColumn = \"\";\n }\n }\n\n // Utility methods\n getColumnWidth(column: ColumnConfig): string {\n return `${this.columnWidths[column.field]}px`;\n }\n\n getCellValue(row: any, column: ColumnConfig): string {\n const value = row[column.field];\n return column.formatter\n ? column.formatter(value, row)\n : value?.toString() || \"\";\n }\n\n getLeftFrozenWidth(): number {\n return this.leftFrozenColumns.reduce(\n (sum, col) => sum + this.columnWidths[col.field],\n 0\n );\n }\n\n getRightFrozenWidth(): number {\n return this.rightFrozenColumns.reduce(\n (sum, col) => sum + this.columnWidths[col.field],\n 0\n );\n }\n\n // TrackBy functions for performance\n trackByRowIndex: TrackByFunction<any> = (index: number) =>\n this.visibleStartIndex + index;\n trackByColumnField: TrackByFunction<ColumnConfig> = (\n index: number,\n column: ColumnConfig\n ) => column.field;\n\n // Accessibility methods\n getAriaSort(column: ColumnConfig): string | null {\n if (this.sortState.field !== column.field || !column.sortable) {\n return null;\n }\n return this.sortState.direction === \"asc\" ? \"ascending\" : \"descending\";\n }\n\n // Keyboard navigation\n onKeydown(event: KeyboardEvent): void {\n if (!this.tableContainer) return;\n\n const { key, ctrlKey, shiftKey } = event;\n const scrollAmount = shiftKey ? 100 : 30; // Larger scroll with shift key\n console.log(key);\n switch (key) {\n case \"ArrowLeft\":\n this.tableContainer.nativeElement.scrollLeft -= scrollAmount;\n break;\n case \"ArrowRight\":\n this.tableContainer.nativeElement.scrollLeft += scrollAmount;\n break;\n case \"ArrowUp\":\n if (ctrlKey) {\n this.tableContainer.nativeElement.scrollTo({\n top: 0,\n behavior: \"smooth\",\n });\n } else {\n this.tableContainer.nativeElement.scrollTop -= scrollAmount;\n }\n break;\n case \"ArrowDown\":\n if (ctrlKey) {\n this.tableContainer.nativeElement.scrollTo({\n top: this.tableContainer.nativeElement.scrollHeight,\n behavior: \"smooth\",\n });\n } else {\n this.tableContainer.nativeElement.scrollTop += scrollAmount;\n }\n break;\n case \"1\":\n if (ctrlKey) {\n this.tableContainer.nativeElement.scrollTo({\n top: 0,\n left: 0,\n behavior: \"smooth\",\n });\n } else {\n this.tableContainer.nativeElement.scrollTo({\n left: 0,\n behavior: \"smooth\",\n });\n }\n break;\n case \"0\":\n if (ctrlKey) {\n this.tableContainer.nativeElement.scrollTo({\n top: this.tableContainer.nativeElement.scrollHeight,\n left: this.tableContainer.nativeElement.scrollWidth,\n behavior: \"smooth\",\n });\n } else {\n this.tableContainer.nativeElement.scrollTo({\n left: this.tableContainer.nativeElement.scrollWidth,\n behavior: \"smooth\",\n });\n }\n break;\n default:\n return; // Exit for other keys\n }\n\n event.preventDefault();\n }\n\n // Save column widths to localStorage\n private saveColumnWidths(): void {\n if (this.isBrowser) {\n try {\n localStorage.setItem(\n this.storageKey,\n JSON.stringify(this.columnWidths)\n );\n } catch (e) {\n console.warn(\"Failed to save column widths to localStorage\", e);\n }\n }\n }\n\n // Load column widths from localStorage\n private loadColumnWidths(): Record<string, number> | null {\n if (!this.isBrowser) return null;\n\n try {\n const saved = localStorage.getItem(this.storageKey);\n return saved ? JSON.parse(saved) : null;\n } catch (e) {\n console.warn(\"Failed to load column widths from localStorage\", e);\n return null;\n }\n }\n\n // Clear saved column widths\n public clearSavedWidths(): void {\n if (this.isBrowser) {\n try {\n localStorage.removeItem(this.storageKey);\n // Reset to default widths\n this.columns.forEach((col) => {\n this.columnWidths[col.field] = col.width\n ? Number.parseInt(col.width.replace(\"px\", \"\"))\n : 150;\n });\n this.cdr.detectChanges();\n } catch (e) {\n console.warn(\"Failed to clear saved column widths\", e);\n }\n }\n }\n}\n","<div class=\"dynamic-table-container\" #tableContainer>\n <!-- Sticky Header -->\n <div class=\"table-header\" [style.height.px]=\"headerHeight\">\n <div class=\"header-row\" #headerRow (scroll)=\"onHeaderScroll($event)\">\n <!-- Left Frozen Columns -->\n <div class=\"frozen-left\" [style.width.px]=\"getLeftFrozenWidth()\" *ngIf=\"leftFrozenColumns.length > 0\"\n role=\"presentation\">\n <div class=\"header-cell\"\n *ngFor=\"let column of leftFrozenColumns; trackBy: trackByColumnField; let colIndex = index\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\"\n [class.sort-asc]=\"sortState.field === column.field && sortState.direction === 'asc'\"\n [class.sort-desc]=\"sortState.field === column.field && sortState.direction === 'desc'\"\n [attr.role]=\"'columnheader'\" [attr.aria-sort]=\"getAriaSort(column)\" [attr.aria-colindex]=\"colIndex + 1\"\n [attr.aria-label]=\"column.header + (column.sortable ? ' (click to sort)' : '')\" (click)=\"onSort(column)\"\n (keydown.enter)=\"onSort(column)\" (keydown.space)=\"onSort(column); $event.preventDefault()\"\n [tabindex]=\"column.sortable ? '0' : '-1'\" [attr.data-column-id]=\"column.field\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\" [ngTemplateOutletContext]=\"{ column: column }\">\n </ng-container>\n\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n\n <!-- Center Scrollable Columns -->\n <div class=\"center-columns\" #headeCenterRow role=\"presentation\" [ngStyle]=\"{'transform': headerTransform}\">\n <div class=\"header-cell\" *ngFor=\"let column of centerColumns; trackBy: trackByColumnField; let colIndex = index\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\"\n [class.sort-asc]=\"sortState.field === column.field && sortState.direction === 'asc'\"\n [class.sort-desc]=\"sortState.field === column.field && sortState.direction === 'desc'\"\n [attr.role]=\"'columnheader'\" [attr.aria-sort]=\"getAriaSort(column)\"\n [attr.aria-colindex]=\"leftFrozenColumns.length + colIndex + 1\"\n [attr.aria-label]=\"column.header + (column.sortable ? ' (click to sort)' : '')\" (click)=\"onSort(column)\"\n (keydown.enter)=\"onSort(column)\" (keydown.space)=\"onSort(column); $event.preventDefault()\"\n [tabindex]=\"column.sortable ? '0' : '-1'\" [attr.data-column-id]=\"column.field\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\"\n [ngTemplateOutletContext]=\"{ column: column }\"></ng-container>\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n\n <!-- Right Frozen Columns -->\n <div class=\"frozen-right\" [style.width.px]=\"getRightFrozenWidth()\" *ngIf=\"rightFrozenColumns.length > 0\">\n <div class=\"header-cell\" *ngFor=\"let column of rightFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\" (click)=\"onSort(column)\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\"\n [ngTemplateOutletContext]=\"{ column: column }\"></ng-container>\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Table Body with Virtual Scrolling -->\n <div class=\"table-body\" #tableBody [style.height]=\"'calc(100% - ' + headerHeight + 'px)'\"\n (scroll)=\"onBodyScroll($event)\">\n <!-- Virtual spacer for total height -->\n <div class=\"virtual-spacer\" [style.height.px]=\"totalHeight\"></div>\n\n <!-- Visible rows container -->\n <div class=\"visible-rows\" [style.transform]=\"'translateY(' + offsetY + 'px)'\">\n <div class=\"table-row\" *ngFor=\"let row of visibleRows; let i = index; trackBy: trackByRowIndex\"\n [style.height.px]=\"rowHeight\">\n\n <!-- Left Frozen Columns -->\n <div class=\"frozen-left\" [style.width.px]=\"getLeftFrozenWidth()\" *ngIf=\"leftFrozenColumns.length > 0\">\n <div class=\"table-cell\" *ngFor=\"let column of leftFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n\n <!-- Center Scrollable Columns -->\n <div class=\"center-columns\">\n <div class=\"table-cell\" *ngFor=\"let column of centerColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n\n <!-- Right Frozen Columns -->\n <div class=\"frozen-right\" [style.width.px]=\"getRightFrozenWidth()\" *ngIf=\"rightFrozenColumns.length > 0\">\n <div class=\"table-cell\" *ngFor=\"let column of rightFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgxSimpleDatatablesComponent } from './ngx-simple-datatables.component';\n\n// NgModule wrapper to support Angular 14+ NgModule-based apps\n// This keeps the component standalone while enabling module-style imports.\n@NgModule({\n declarations: [NgxSimpleDatatablesComponent],\n imports: [CommonModule],\n exports: [NgxSimpleDatatablesComponent],\n})\nexport class NgxSimpleDatatablesModule {}\n","/*\n * Public API Surface of ngx-simple-datatables\n */\n\nexport * from \"./lib/ngx-simple-datatables.service\";\nexport * from \"./lib/ngx-simple-datatables.component\";\nexport * from \"./lib/ngx-simple-datatables.module\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "ngx-simple-datatables",
3
- "version": "1.17.0",
3
+ "version": "2.21.0",
4
4
  "description": "🚀 High-performance Angular Data Table Component with Virtual Scrolling, Sorting, Filtering, and Customizable Templates. Perfect for enterprise applications.",
5
5
  "author": "Rintu raj C",
6
6
  "license": "MIT",
7
7
  "repository": {
8
8
  "type": "git",
9
- "url": "https://github.com/rinturaj/ngx-simple-datatable.git"
9
+ "url": "https://github.com/rinturaj/ngx-simple-datatables.git"
10
10
  },
11
11
  "keywords": [
12
12
  "angular",
@@ -19,30 +19,28 @@
19
19
  "sorting",
20
20
  "filtering",
21
21
  "pagination",
22
- "angular17"
22
+ "angular21"
23
23
  ],
24
24
  "peerDependencies": {
25
- "@angular/common": "^17.3.0",
26
- "@angular/core": "^17.3.0"
25
+ "@angular/common": ">=19.0.0 <22",
26
+ "@angular/core": ">=19.0.0 <22"
27
27
  },
28
28
  "dependencies": {
29
29
  "tslib": "^2.3.0"
30
30
  },
31
31
  "sideEffects": false,
32
- "homepage": "https://github.com/rinturaj/ngx-simple-datatable#readme",
32
+ "homepage": "https://github.com/rinturaj/ngx-simple-datatables#readme",
33
33
  "bugs": {
34
- "url": "https://github.com/rinturaj/ngx-simple-datatable/issues"
34
+ "url": "https://github.com/rinturaj/ngx-simple-datatables/issues"
35
35
  },
36
36
  "module": "fesm2022/ngx-simple-datatables.mjs",
37
- "typings": "index.d.ts",
37
+ "typings": "types/ngx-simple-datatables.d.ts",
38
38
  "exports": {
39
39
  "./package.json": {
40
40
  "default": "./package.json"
41
41
  },
42
42
  ".": {
43
- "types": "./index.d.ts",
44
- "esm2022": "./esm2022/ngx-simple-datatables.mjs",
45
- "esm": "./esm2022/ngx-simple-datatables.mjs",
43
+ "types": "./types/ngx-simple-datatables.d.ts",
46
44
  "default": "./fesm2022/ngx-simple-datatables.mjs"
47
45
  }
48
46
  }
@@ -1,7 +1,27 @@
1
- import { ChangeDetectorRef, ElementRef, TrackByFunction, TemplateRef, AfterContentInit, OnInit, OnDestroy, NgZone } from "@angular/core";
2
- import { ColumnConfig, SortState } from "../interfaces/column-config.interface";
3
- import * as i0 from "@angular/core";
4
- export declare class NgxSimpleDatatableComponent implements OnInit, OnDestroy, AfterContentInit {
1
+ import * as i0 from '@angular/core';
2
+ import { OnInit, OnDestroy, AfterContentInit, ElementRef, TemplateRef, ChangeDetectorRef, NgZone, TrackByFunction } from '@angular/core';
3
+ import * as i2 from '@angular/common';
4
+
5
+ declare class NgxSimpleDatatablesService {
6
+ constructor();
7
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgxSimpleDatatablesService, never>;
8
+ static ɵprov: i0.ɵɵInjectableDeclaration<NgxSimpleDatatablesService>;
9
+ }
10
+
11
+ interface ColumnConfig {
12
+ field: string;
13
+ header: string;
14
+ width?: string;
15
+ freeze?: "left" | "right";
16
+ sortable?: boolean;
17
+ formatter?: (value: any, row: any) => string;
18
+ }
19
+ interface SortState {
20
+ field: string;
21
+ direction: "asc" | "desc" | null;
22
+ }
23
+
24
+ declare class NgxSimpleDatatablesComponent implements OnInit, OnDestroy, AfterContentInit {
5
25
  private cdr;
6
26
  private platformId;
7
27
  private ngZone;
@@ -73,6 +93,14 @@ export declare class NgxSimpleDatatableComponent implements OnInit, OnDestroy, A
73
93
  private saveColumnWidths;
74
94
  private loadColumnWidths;
75
95
  clearSavedWidths(): void;
76
- static ɵfac: i0.ɵɵFactoryDeclaration<NgxSimpleDatatableComponent, never>;
77
- static ɵcmp: i0.ɵɵComponentDeclaration<NgxSimpleDatatableComponent, "ngx-simple-datatable", never, { "columns": { "alias": "columns"; "required": false; }; "data": { "alias": "data"; "required": false; }; "rowHeight": { "alias": "rowHeight"; "required": false; }; "headerHeight": { "alias": "headerHeight"; "required": false; }; "bufferSize": { "alias": "bufferSize"; "required": false; }; }, {}, ["headerTemplate", "cellTemplate"], never, true, never>;
96
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgxSimpleDatatablesComponent, never>;
97
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgxSimpleDatatablesComponent, "ngx-simple-datatables", never, { "columns": { "alias": "columns"; "required": false; }; "data": { "alias": "data"; "required": false; }; "rowHeight": { "alias": "rowHeight"; "required": false; }; "headerHeight": { "alias": "headerHeight"; "required": false; }; "bufferSize": { "alias": "bufferSize"; "required": false; }; }, {}, ["headerTemplate", "cellTemplate"], never, false, never>;
98
+ }
99
+
100
+ declare class NgxSimpleDatatablesModule {
101
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgxSimpleDatatablesModule, never>;
102
+ static ɵmod: i0.ɵɵNgModuleDeclaration<NgxSimpleDatatablesModule, [typeof NgxSimpleDatatablesComponent], [typeof i2.CommonModule], [typeof NgxSimpleDatatablesComponent]>;
103
+ static ɵinj: i0.ɵɵInjectorDeclaration<NgxSimpleDatatablesModule>;
78
104
  }
105
+
106
+ export { NgxSimpleDatatablesComponent, NgxSimpleDatatablesModule, NgxSimpleDatatablesService };
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLWNvbmZpZy5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2ltcGxlLWRhdGF0YWJsZS9zcmMvaW50ZXJmYWNlcy9jb2x1bW4tY29uZmlnLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBDb2x1bW5Db25maWcge1xuICBmaWVsZDogc3RyaW5nO1xuICBoZWFkZXI6IHN0cmluZztcbiAgd2lkdGg/OiBzdHJpbmc7XG4gIGZyZWV6ZT86IFwibGVmdFwiIHwgXCJyaWdodFwiO1xuICBzb3J0YWJsZT86IGJvb2xlYW47XG4gIGZvcm1hdHRlcj86ICh2YWx1ZTogYW55LCByb3c6IGFueSkgPT4gc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvcnRTdGF0ZSB7XG4gIGZpZWxkOiBzdHJpbmc7XG4gIGRpcmVjdGlvbjogXCJhc2NcIiB8IFwiZGVzY1wiIHwgbnVsbDtcbn1cbiJdfQ==