ngx-simple-datatables 2.0.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.
@@ -5,10 +5,10 @@ import { isPlatformBrowser, CommonModule } from '@angular/common';
5
5
 
6
6
  class NgxSimpleDatatablesService {
7
7
  constructor() { }
8
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxSimpleDatatablesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
9
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxSimpleDatatablesService, providedIn: "root" }); }
8
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgxSimpleDatatablesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
9
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgxSimpleDatatablesService, providedIn: "root" }); }
10
10
  }
11
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxSimpleDatatablesService, decorators: [{
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgxSimpleDatatablesService, decorators: [{
12
12
  type: Injectable,
13
13
  args: [{
14
14
  providedIn: "root",
@@ -455,12 +455,12 @@ class NgxSimpleDatatablesComponent {
455
455
  }
456
456
  }
457
457
  }
458
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxSimpleDatatablesComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: PLATFORM_ID }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
459
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NgxSimpleDatatablesComponent, selector: "ngx-simple-datatables", inputs: { columns: "columns", data: "data", rowHeight: "rowHeight", headerHeight: "headerHeight", bufferSize: "bufferSize" }, queries: [{ propertyName: "headerTemplate", first: true, predicate: ["headerTemplate"], descendants: true, static: true }, { propertyName: "cellTemplate", first: true, predicate: ["cellTemplate"], descendants: true, static: true }], viewQueries: [{ propertyName: "tableContainer", first: true, predicate: ["tableContainer"], descendants: true, static: true }, { propertyName: "tableBody", first: true, predicate: ["tableBody"], descendants: true, static: true }, { propertyName: "headerRow", first: true, predicate: ["headerRow"], descendants: true, static: true }, { propertyName: "headeCenterRow", first: true, predicate: ["headeCenterRow"], descendants: true, static: true }], ngImport: i0, template: "<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>", styles: [":root{--ngx-simple-dt-bg: #ffffff;--ngx-simple-dt-border: 1px solid #e0e0e0;--ngx-simple-dt-border-radius: 8px;--ngx-simple-dt-box-shadow: 0 2px 8px rgba(0, 0, 0, .1);--ngx-simple-dt-transition: all .2s ease-in-out;--ngx-simple-dt-header-bg: #f8f9fa;--ngx-simple-dt-header-hover-bg: #e9ecef;--ngx-simple-dt-header-border: 1px solid #e0e0e0;--ngx-simple-dt-header-text: #495057;--ngx-simple-dt-header-height: 98px;--ngx-simple-dt-header-font-weight: 600;--ngx-simple-dt-header-padding: 0 16px;--ngx-simple-dt-cell-hover-bg: #f1f3f5;--ngx-simple-dt-cell-active-bg: #e9ecef;--ngx-simple-dt-row-height: 48px;--ngx-simple-dt-cell-padding: 0 16px;--ngx-simple-dt-cell-border: 1px solid #e9ecef;--ngx-simple-dt-cell-font-size: .875rem;--ngx-simple-dt-cell-line-height: 1.5;--ngx-simple-dt-row-bg: #ffffff;--ngx-simple-dt-row-hover-bg: #f8f9fa;--ngx-simple-dt-row-stripe-bg: #f8f9fa;--ngx-simple-dt-row-active-bg: #e9ecef;--ngx-simple-dt-row-border: 1px solid #e9ecef}.dynamic-table-container{width:100%;height:100%;position:relative;display:flex;flex-direction:column;overflow:hidden;background:var(--ngx-simple-dt-bg);border:var(--ngx-simple-dt-border);border-radius:var(--ngx-simple-dt-border-radius);box-shadow:var(--ngx-simple-dt-box-shadow);transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header{position:sticky;top:0;z-index:10;background:var(--ngx-simple-dt-header-bg);border-bottom:var(--ngx-simple-dt-header-border);overflow:hidden;height:var(--ngx-simple-dt-header-height);color:var(--ngx-simple-dt-header-text)}.dynamic-table-container .table-header .header-row{display:flex;min-width:100%;position:relative;height:100%}.dynamic-table-container .table-header .header-row .frozen-left,.dynamic-table-container .table-header .header-row .frozen-right{position:sticky;z-index:12;background:var(--ngx-simple-dt-header-bg);display:flex;box-shadow:2px 0 8px #0000000d;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .frozen-left{left:0;border-right:var(--ngx-simple-dt-header-border)}.dynamic-table-container .table-header .header-row .center-columns{display:flex;flex:1}.dynamic-table-container .table-header .header-row .frozen-right{right:0;border-left:var(--ngx-simple-dt-header-border)}.dynamic-table-container .table-header .header-row .header-cell{display:flex;align-items:center;justify-content:space-between;padding:var(--ngx-simple-dt-cell-padding);border-right:var(--ngx-simple-dt-cell-border);background:inherit;font-weight:var(--ngx-simple-dt-header-font-weight);position:relative;min-width:0;font-size:var(--ngx-simple-dt-cell-font-size);line-height:var(--ngx-simple-dt-cell-line-height);color:inherit;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell.sortable:hover{background:var(--ngx-simple-dt-header-hover-bg)}.dynamic-table-container .table-header .header-row .header-cell.sortable:active{background:var(--ngx-simple-dt-cell-active-bg)}.dynamic-table-container .table-header .header-row .header-cell .header-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dynamic-table-container .table-header .header-row .header-cell .sort-icon{margin-left:8px;font-size:12px;color:#6c757d;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell .sort-icon.sort-asc,.dynamic-table-container .table-header .header-row .header-cell .sort-icon.sort-desc{color:#0d6efd}.dynamic-table-container .table-header .header-row .header-cell .resize-handle{position:absolute;right:0;top:0;bottom:0;width:4px;cursor:col-resize;background:transparent;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell .resize-handle:hover,.dynamic-table-container .table-header .header-row .header-cell .resize-handle:active{background:#0d6efd}.dynamic-table-container .table-body{position:relative;flex:1;overflow:auto;scrollbar-width:thin;scrollbar-color:#ced4da #f8f9fa;-webkit-overflow-scrolling:touch}.dynamic-table-container .table-body::-webkit-scrollbar{width:8px;height:8px}.dynamic-table-container .table-body::-webkit-scrollbar-track{background:#f8f9fa;scroll-margin-left:100px}.dynamic-table-container .table-body::-webkit-scrollbar-thumb{background-color:#ced4da;border-radius:4px}.dynamic-table-container .table-body::-webkit-scrollbar-thumb:hover{background-color:#adb5bd}.dynamic-table-container .table-body .virtual-spacer{position:absolute;top:0;left:0;width:1px;pointer-events:none}.dynamic-table-container .table-body .visible-rows{position:absolute;top:0;left:0;right:0;min-width:fit-content}.dynamic-table-container .table-body .visible-rows .table-row{display:flex;min-width:100%;border-bottom:var(--ngx-simple-dt-row-border);background:var(--ngx-simple-dt-row-bg);transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-body .visible-rows .table-row:nth-child(2n){background:var(--ngx-simple-dt-row-stripe-bg)}.dynamic-table-container .table-body .visible-rows .table-row:hover{background:var(--ngx-simple-dt-row-hover-bg)}.dynamic-table-container .table-body .visible-rows .table-row:active{background:var(--ngx-simple-dt-row-active-bg)}.dynamic-table-container .table-body .visible-rows .table-row .frozen-left{position:sticky;left:0;z-index:5;background:#fff;border-right:2px solid #ccc;display:flex}.table-row:hover .dynamic-table-container .table-body .visible-rows .table-row .frozen-left{background:#f9f9f9}.dynamic-table-container .table-body .visible-rows .table-row .center-columns{display:flex;flex:0 0 auto}.dynamic-table-container .table-body .visible-rows .table-row .frozen-right{position:sticky;right:0;z-index:5;background:#fff;border-left:2px solid #ccc;display:flex}.table-row:hover .dynamic-table-container .table-body .visible-rows .table-row .frozen-right{background:#f9f9f9}.dynamic-table-container .table-body .visible-rows .table-row .table-cell{padding:var(--ngx-simple-dt-cell-padding);border-right:var(--ngx-simple-dt-cell-border);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--ngx-simple-dt-cell-font-size);line-height:var(--ngx-simple-dt-cell-line-height);display:flex;align-items:center;transition:var(--ngx-simple-dt-transition);min-width:0}.dynamic-table-container .frozen-left .table-cell,.dynamic-table-container .frozen-right .table-cell{background:inherit;box-shadow:2px 0 8px #0000000d}@media (max-width: 768px){.dynamic-table-container{font-size:14px}.dynamic-table-container .header-cell,.dynamic-table-container .table-cell{padding:0 8px}}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
458
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgxSimpleDatatablesComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: PLATFORM_ID }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
459
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.6", type: NgxSimpleDatatablesComponent, isStandalone: false, selector: "ngx-simple-datatables", inputs: { columns: "columns", data: "data", rowHeight: "rowHeight", headerHeight: "headerHeight", bufferSize: "bufferSize" }, queries: [{ propertyName: "headerTemplate", first: true, predicate: ["headerTemplate"], descendants: true, static: true }, { propertyName: "cellTemplate", first: true, predicate: ["cellTemplate"], descendants: true, static: true }], viewQueries: [{ propertyName: "tableContainer", first: true, predicate: ["tableContainer"], descendants: true, static: true }, { propertyName: "tableBody", first: true, predicate: ["tableBody"], descendants: true, static: true }, { propertyName: "headerRow", first: true, predicate: ["headerRow"], descendants: true, static: true }, { propertyName: "headeCenterRow", first: true, predicate: ["headeCenterRow"], descendants: true, static: true }], ngImport: i0, template: "<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>", styles: [":root{--ngx-simple-dt-bg: #ffffff;--ngx-simple-dt-border: 1px solid #e0e0e0;--ngx-simple-dt-border-radius: 8px;--ngx-simple-dt-box-shadow: 0 2px 8px rgba(0, 0, 0, .1);--ngx-simple-dt-transition: all .2s ease-in-out;--ngx-simple-dt-header-bg: #f8f9fa;--ngx-simple-dt-header-hover-bg: #e9ecef;--ngx-simple-dt-header-border: 1px solid #e0e0e0;--ngx-simple-dt-header-text: #495057;--ngx-simple-dt-header-height: 98px;--ngx-simple-dt-header-font-weight: 600;--ngx-simple-dt-header-padding: 0 16px;--ngx-simple-dt-cell-hover-bg: #f1f3f5;--ngx-simple-dt-cell-active-bg: #e9ecef;--ngx-simple-dt-row-height: 48px;--ngx-simple-dt-cell-padding: 0 16px;--ngx-simple-dt-cell-border: 1px solid #e9ecef;--ngx-simple-dt-cell-font-size: .875rem;--ngx-simple-dt-cell-line-height: 1.5;--ngx-simple-dt-row-bg: #ffffff;--ngx-simple-dt-row-hover-bg: #f8f9fa;--ngx-simple-dt-row-stripe-bg: #f8f9fa;--ngx-simple-dt-row-active-bg: #e9ecef;--ngx-simple-dt-row-border: 1px solid #e9ecef}.dynamic-table-container{width:100%;height:100%;position:relative;display:flex;flex-direction:column;overflow:hidden;background:var(--ngx-simple-dt-bg);border:var(--ngx-simple-dt-border);border-radius:var(--ngx-simple-dt-border-radius);box-shadow:var(--ngx-simple-dt-box-shadow);transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header{position:sticky;top:0;z-index:10;background:var(--ngx-simple-dt-header-bg);border-bottom:var(--ngx-simple-dt-header-border);overflow:hidden;height:var(--ngx-simple-dt-header-height);color:var(--ngx-simple-dt-header-text)}.dynamic-table-container .table-header .header-row{display:flex;min-width:100%;position:relative;height:100%}.dynamic-table-container .table-header .header-row .frozen-left,.dynamic-table-container .table-header .header-row .frozen-right{position:sticky;z-index:12;background:var(--ngx-simple-dt-header-bg);display:flex;box-shadow:2px 0 8px #0000000d;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .frozen-left{left:0;border-right:var(--ngx-simple-dt-header-border)}.dynamic-table-container .table-header .header-row .center-columns{display:flex;flex:1}.dynamic-table-container .table-header .header-row .frozen-right{right:0;border-left:var(--ngx-simple-dt-header-border)}.dynamic-table-container .table-header .header-row .header-cell{display:flex;align-items:center;justify-content:space-between;padding:var(--ngx-simple-dt-cell-padding);border-right:var(--ngx-simple-dt-cell-border);background:inherit;font-weight:var(--ngx-simple-dt-header-font-weight);position:relative;min-width:0;font-size:var(--ngx-simple-dt-cell-font-size);line-height:var(--ngx-simple-dt-cell-line-height);color:inherit;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell.sortable:hover{background:var(--ngx-simple-dt-header-hover-bg)}.dynamic-table-container .table-header .header-row .header-cell.sortable:active{background:var(--ngx-simple-dt-cell-active-bg)}.dynamic-table-container .table-header .header-row .header-cell .header-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dynamic-table-container .table-header .header-row .header-cell .sort-icon{margin-left:8px;font-size:12px;color:#6c757d;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell .sort-icon.sort-asc,.dynamic-table-container .table-header .header-row .header-cell .sort-icon.sort-desc{color:#0d6efd}.dynamic-table-container .table-header .header-row .header-cell .resize-handle{position:absolute;right:0;top:0;bottom:0;width:4px;cursor:col-resize;background:transparent;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell .resize-handle:hover,.dynamic-table-container .table-header .header-row .header-cell .resize-handle:active{background:#0d6efd}.dynamic-table-container .table-body{position:relative;flex:1;overflow:auto;scrollbar-width:thin;scrollbar-color:#ced4da #f8f9fa}.dynamic-table-container .table-body::-webkit-scrollbar{width:8px;height:8px}.dynamic-table-container .table-body::-webkit-scrollbar-track{background:#f8f9fa;scroll-margin-left:100px}.dynamic-table-container .table-body::-webkit-scrollbar-thumb{background-color:#ced4da;border-radius:4px}.dynamic-table-container .table-body::-webkit-scrollbar-thumb:hover{background-color:#adb5bd}.dynamic-table-container .table-body{-webkit-overflow-scrolling:touch}.dynamic-table-container .table-body .virtual-spacer{position:absolute;top:0;left:0;width:1px;pointer-events:none}.dynamic-table-container .table-body .visible-rows{position:absolute;top:0;left:0;right:0;min-width:fit-content}.dynamic-table-container .table-body .visible-rows .table-row{display:flex;min-width:100%;border-bottom:var(--ngx-simple-dt-row-border);background:var(--ngx-simple-dt-row-bg);transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-body .visible-rows .table-row:nth-child(2n){background:var(--ngx-simple-dt-row-stripe-bg)}.dynamic-table-container .table-body .visible-rows .table-row:hover{background:var(--ngx-simple-dt-row-hover-bg)}.dynamic-table-container .table-body .visible-rows .table-row:active{background:var(--ngx-simple-dt-row-active-bg)}.dynamic-table-container .table-body .visible-rows .table-row .frozen-left{position:sticky;left:0;z-index:5;background:#fff;border-right:2px solid #ccc;display:flex}.table-row:hover .dynamic-table-container .table-body .visible-rows .table-row .frozen-left{background:#f9f9f9}.dynamic-table-container .table-body .visible-rows .table-row .center-columns{display:flex;flex:0 0 auto}.dynamic-table-container .table-body .visible-rows .table-row .frozen-right{position:sticky;right:0;z-index:5;background:#fff;border-left:2px solid #ccc;display:flex}.table-row:hover .dynamic-table-container .table-body .visible-rows .table-row .frozen-right{background:#f9f9f9}.dynamic-table-container .table-body .visible-rows .table-row .table-cell{padding:var(--ngx-simple-dt-cell-padding);border-right:var(--ngx-simple-dt-cell-border);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--ngx-simple-dt-cell-font-size);line-height:var(--ngx-simple-dt-cell-line-height);display:flex;align-items:center;transition:var(--ngx-simple-dt-transition);min-width:0}.dynamic-table-container .frozen-left .table-cell,.dynamic-table-container .frozen-right .table-cell{background:inherit;box-shadow:2px 0 8px #0000000d}@media(max-width:768px){.dynamic-table-container{font-size:14px}.dynamic-table-container .header-cell,.dynamic-table-container .table-cell{padding:0 8px}}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
460
460
  }
461
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxSimpleDatatablesComponent, decorators: [{
461
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgxSimpleDatatablesComponent, decorators: [{
462
462
  type: Component,
463
- args: [{ selector: "ngx-simple-datatables", changeDetection: ChangeDetectionStrategy.OnPush, template: "<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>", styles: [":root{--ngx-simple-dt-bg: #ffffff;--ngx-simple-dt-border: 1px solid #e0e0e0;--ngx-simple-dt-border-radius: 8px;--ngx-simple-dt-box-shadow: 0 2px 8px rgba(0, 0, 0, .1);--ngx-simple-dt-transition: all .2s ease-in-out;--ngx-simple-dt-header-bg: #f8f9fa;--ngx-simple-dt-header-hover-bg: #e9ecef;--ngx-simple-dt-header-border: 1px solid #e0e0e0;--ngx-simple-dt-header-text: #495057;--ngx-simple-dt-header-height: 98px;--ngx-simple-dt-header-font-weight: 600;--ngx-simple-dt-header-padding: 0 16px;--ngx-simple-dt-cell-hover-bg: #f1f3f5;--ngx-simple-dt-cell-active-bg: #e9ecef;--ngx-simple-dt-row-height: 48px;--ngx-simple-dt-cell-padding: 0 16px;--ngx-simple-dt-cell-border: 1px solid #e9ecef;--ngx-simple-dt-cell-font-size: .875rem;--ngx-simple-dt-cell-line-height: 1.5;--ngx-simple-dt-row-bg: #ffffff;--ngx-simple-dt-row-hover-bg: #f8f9fa;--ngx-simple-dt-row-stripe-bg: #f8f9fa;--ngx-simple-dt-row-active-bg: #e9ecef;--ngx-simple-dt-row-border: 1px solid #e9ecef}.dynamic-table-container{width:100%;height:100%;position:relative;display:flex;flex-direction:column;overflow:hidden;background:var(--ngx-simple-dt-bg);border:var(--ngx-simple-dt-border);border-radius:var(--ngx-simple-dt-border-radius);box-shadow:var(--ngx-simple-dt-box-shadow);transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header{position:sticky;top:0;z-index:10;background:var(--ngx-simple-dt-header-bg);border-bottom:var(--ngx-simple-dt-header-border);overflow:hidden;height:var(--ngx-simple-dt-header-height);color:var(--ngx-simple-dt-header-text)}.dynamic-table-container .table-header .header-row{display:flex;min-width:100%;position:relative;height:100%}.dynamic-table-container .table-header .header-row .frozen-left,.dynamic-table-container .table-header .header-row .frozen-right{position:sticky;z-index:12;background:var(--ngx-simple-dt-header-bg);display:flex;box-shadow:2px 0 8px #0000000d;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .frozen-left{left:0;border-right:var(--ngx-simple-dt-header-border)}.dynamic-table-container .table-header .header-row .center-columns{display:flex;flex:1}.dynamic-table-container .table-header .header-row .frozen-right{right:0;border-left:var(--ngx-simple-dt-header-border)}.dynamic-table-container .table-header .header-row .header-cell{display:flex;align-items:center;justify-content:space-between;padding:var(--ngx-simple-dt-cell-padding);border-right:var(--ngx-simple-dt-cell-border);background:inherit;font-weight:var(--ngx-simple-dt-header-font-weight);position:relative;min-width:0;font-size:var(--ngx-simple-dt-cell-font-size);line-height:var(--ngx-simple-dt-cell-line-height);color:inherit;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell.sortable:hover{background:var(--ngx-simple-dt-header-hover-bg)}.dynamic-table-container .table-header .header-row .header-cell.sortable:active{background:var(--ngx-simple-dt-cell-active-bg)}.dynamic-table-container .table-header .header-row .header-cell .header-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dynamic-table-container .table-header .header-row .header-cell .sort-icon{margin-left:8px;font-size:12px;color:#6c757d;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell .sort-icon.sort-asc,.dynamic-table-container .table-header .header-row .header-cell .sort-icon.sort-desc{color:#0d6efd}.dynamic-table-container .table-header .header-row .header-cell .resize-handle{position:absolute;right:0;top:0;bottom:0;width:4px;cursor:col-resize;background:transparent;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell .resize-handle:hover,.dynamic-table-container .table-header .header-row .header-cell .resize-handle:active{background:#0d6efd}.dynamic-table-container .table-body{position:relative;flex:1;overflow:auto;scrollbar-width:thin;scrollbar-color:#ced4da #f8f9fa;-webkit-overflow-scrolling:touch}.dynamic-table-container .table-body::-webkit-scrollbar{width:8px;height:8px}.dynamic-table-container .table-body::-webkit-scrollbar-track{background:#f8f9fa;scroll-margin-left:100px}.dynamic-table-container .table-body::-webkit-scrollbar-thumb{background-color:#ced4da;border-radius:4px}.dynamic-table-container .table-body::-webkit-scrollbar-thumb:hover{background-color:#adb5bd}.dynamic-table-container .table-body .virtual-spacer{position:absolute;top:0;left:0;width:1px;pointer-events:none}.dynamic-table-container .table-body .visible-rows{position:absolute;top:0;left:0;right:0;min-width:fit-content}.dynamic-table-container .table-body .visible-rows .table-row{display:flex;min-width:100%;border-bottom:var(--ngx-simple-dt-row-border);background:var(--ngx-simple-dt-row-bg);transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-body .visible-rows .table-row:nth-child(2n){background:var(--ngx-simple-dt-row-stripe-bg)}.dynamic-table-container .table-body .visible-rows .table-row:hover{background:var(--ngx-simple-dt-row-hover-bg)}.dynamic-table-container .table-body .visible-rows .table-row:active{background:var(--ngx-simple-dt-row-active-bg)}.dynamic-table-container .table-body .visible-rows .table-row .frozen-left{position:sticky;left:0;z-index:5;background:#fff;border-right:2px solid #ccc;display:flex}.table-row:hover .dynamic-table-container .table-body .visible-rows .table-row .frozen-left{background:#f9f9f9}.dynamic-table-container .table-body .visible-rows .table-row .center-columns{display:flex;flex:0 0 auto}.dynamic-table-container .table-body .visible-rows .table-row .frozen-right{position:sticky;right:0;z-index:5;background:#fff;border-left:2px solid #ccc;display:flex}.table-row:hover .dynamic-table-container .table-body .visible-rows .table-row .frozen-right{background:#f9f9f9}.dynamic-table-container .table-body .visible-rows .table-row .table-cell{padding:var(--ngx-simple-dt-cell-padding);border-right:var(--ngx-simple-dt-cell-border);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--ngx-simple-dt-cell-font-size);line-height:var(--ngx-simple-dt-cell-line-height);display:flex;align-items:center;transition:var(--ngx-simple-dt-transition);min-width:0}.dynamic-table-container .frozen-left .table-cell,.dynamic-table-container .frozen-right .table-cell{background:inherit;box-shadow:2px 0 8px #0000000d}@media (max-width: 768px){.dynamic-table-container{font-size:14px}.dynamic-table-container .header-cell,.dynamic-table-container .table-cell{padding:0 8px}}\n"] }]
463
+ args: [{ selector: "ngx-simple-datatables", changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<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>", styles: [":root{--ngx-simple-dt-bg: #ffffff;--ngx-simple-dt-border: 1px solid #e0e0e0;--ngx-simple-dt-border-radius: 8px;--ngx-simple-dt-box-shadow: 0 2px 8px rgba(0, 0, 0, .1);--ngx-simple-dt-transition: all .2s ease-in-out;--ngx-simple-dt-header-bg: #f8f9fa;--ngx-simple-dt-header-hover-bg: #e9ecef;--ngx-simple-dt-header-border: 1px solid #e0e0e0;--ngx-simple-dt-header-text: #495057;--ngx-simple-dt-header-height: 98px;--ngx-simple-dt-header-font-weight: 600;--ngx-simple-dt-header-padding: 0 16px;--ngx-simple-dt-cell-hover-bg: #f1f3f5;--ngx-simple-dt-cell-active-bg: #e9ecef;--ngx-simple-dt-row-height: 48px;--ngx-simple-dt-cell-padding: 0 16px;--ngx-simple-dt-cell-border: 1px solid #e9ecef;--ngx-simple-dt-cell-font-size: .875rem;--ngx-simple-dt-cell-line-height: 1.5;--ngx-simple-dt-row-bg: #ffffff;--ngx-simple-dt-row-hover-bg: #f8f9fa;--ngx-simple-dt-row-stripe-bg: #f8f9fa;--ngx-simple-dt-row-active-bg: #e9ecef;--ngx-simple-dt-row-border: 1px solid #e9ecef}.dynamic-table-container{width:100%;height:100%;position:relative;display:flex;flex-direction:column;overflow:hidden;background:var(--ngx-simple-dt-bg);border:var(--ngx-simple-dt-border);border-radius:var(--ngx-simple-dt-border-radius);box-shadow:var(--ngx-simple-dt-box-shadow);transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header{position:sticky;top:0;z-index:10;background:var(--ngx-simple-dt-header-bg);border-bottom:var(--ngx-simple-dt-header-border);overflow:hidden;height:var(--ngx-simple-dt-header-height);color:var(--ngx-simple-dt-header-text)}.dynamic-table-container .table-header .header-row{display:flex;min-width:100%;position:relative;height:100%}.dynamic-table-container .table-header .header-row .frozen-left,.dynamic-table-container .table-header .header-row .frozen-right{position:sticky;z-index:12;background:var(--ngx-simple-dt-header-bg);display:flex;box-shadow:2px 0 8px #0000000d;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .frozen-left{left:0;border-right:var(--ngx-simple-dt-header-border)}.dynamic-table-container .table-header .header-row .center-columns{display:flex;flex:1}.dynamic-table-container .table-header .header-row .frozen-right{right:0;border-left:var(--ngx-simple-dt-header-border)}.dynamic-table-container .table-header .header-row .header-cell{display:flex;align-items:center;justify-content:space-between;padding:var(--ngx-simple-dt-cell-padding);border-right:var(--ngx-simple-dt-cell-border);background:inherit;font-weight:var(--ngx-simple-dt-header-font-weight);position:relative;min-width:0;font-size:var(--ngx-simple-dt-cell-font-size);line-height:var(--ngx-simple-dt-cell-line-height);color:inherit;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell.sortable:hover{background:var(--ngx-simple-dt-header-hover-bg)}.dynamic-table-container .table-header .header-row .header-cell.sortable:active{background:var(--ngx-simple-dt-cell-active-bg)}.dynamic-table-container .table-header .header-row .header-cell .header-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dynamic-table-container .table-header .header-row .header-cell .sort-icon{margin-left:8px;font-size:12px;color:#6c757d;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell .sort-icon.sort-asc,.dynamic-table-container .table-header .header-row .header-cell .sort-icon.sort-desc{color:#0d6efd}.dynamic-table-container .table-header .header-row .header-cell .resize-handle{position:absolute;right:0;top:0;bottom:0;width:4px;cursor:col-resize;background:transparent;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell .resize-handle:hover,.dynamic-table-container .table-header .header-row .header-cell .resize-handle:active{background:#0d6efd}.dynamic-table-container .table-body{position:relative;flex:1;overflow:auto;scrollbar-width:thin;scrollbar-color:#ced4da #f8f9fa}.dynamic-table-container .table-body::-webkit-scrollbar{width:8px;height:8px}.dynamic-table-container .table-body::-webkit-scrollbar-track{background:#f8f9fa;scroll-margin-left:100px}.dynamic-table-container .table-body::-webkit-scrollbar-thumb{background-color:#ced4da;border-radius:4px}.dynamic-table-container .table-body::-webkit-scrollbar-thumb:hover{background-color:#adb5bd}.dynamic-table-container .table-body{-webkit-overflow-scrolling:touch}.dynamic-table-container .table-body .virtual-spacer{position:absolute;top:0;left:0;width:1px;pointer-events:none}.dynamic-table-container .table-body .visible-rows{position:absolute;top:0;left:0;right:0;min-width:fit-content}.dynamic-table-container .table-body .visible-rows .table-row{display:flex;min-width:100%;border-bottom:var(--ngx-simple-dt-row-border);background:var(--ngx-simple-dt-row-bg);transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-body .visible-rows .table-row:nth-child(2n){background:var(--ngx-simple-dt-row-stripe-bg)}.dynamic-table-container .table-body .visible-rows .table-row:hover{background:var(--ngx-simple-dt-row-hover-bg)}.dynamic-table-container .table-body .visible-rows .table-row:active{background:var(--ngx-simple-dt-row-active-bg)}.dynamic-table-container .table-body .visible-rows .table-row .frozen-left{position:sticky;left:0;z-index:5;background:#fff;border-right:2px solid #ccc;display:flex}.table-row:hover .dynamic-table-container .table-body .visible-rows .table-row .frozen-left{background:#f9f9f9}.dynamic-table-container .table-body .visible-rows .table-row .center-columns{display:flex;flex:0 0 auto}.dynamic-table-container .table-body .visible-rows .table-row .frozen-right{position:sticky;right:0;z-index:5;background:#fff;border-left:2px solid #ccc;display:flex}.table-row:hover .dynamic-table-container .table-body .visible-rows .table-row .frozen-right{background:#f9f9f9}.dynamic-table-container .table-body .visible-rows .table-row .table-cell{padding:var(--ngx-simple-dt-cell-padding);border-right:var(--ngx-simple-dt-cell-border);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--ngx-simple-dt-cell-font-size);line-height:var(--ngx-simple-dt-cell-line-height);display:flex;align-items:center;transition:var(--ngx-simple-dt-transition);min-width:0}.dynamic-table-container .frozen-left .table-cell,.dynamic-table-container .frozen-right .table-cell{background:inherit;box-shadow:2px 0 8px #0000000d}@media(max-width:768px){.dynamic-table-container{font-size:14px}.dynamic-table-container .header-cell,.dynamic-table-container .table-cell{padding:0 8px}}\n"] }]
464
464
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: Object, decorators: [{
465
465
  type: Inject,
466
466
  args: [PLATFORM_ID]
@@ -497,11 +497,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
497
497
  // NgModule wrapper to support Angular 14+ NgModule-based apps
498
498
  // This keeps the component standalone while enabling module-style imports.
499
499
  class NgxSimpleDatatablesModule {
500
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxSimpleDatatablesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
501
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: NgxSimpleDatatablesModule, declarations: [NgxSimpleDatatablesComponent], imports: [CommonModule], exports: [NgxSimpleDatatablesComponent] }); }
502
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxSimpleDatatablesModule, imports: [CommonModule] }); }
500
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgxSimpleDatatablesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
501
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.0.6", ngImport: i0, type: NgxSimpleDatatablesModule, declarations: [NgxSimpleDatatablesComponent], imports: [CommonModule], exports: [NgxSimpleDatatablesComponent] }); }
502
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgxSimpleDatatablesModule, imports: [CommonModule] }); }
503
503
  }
504
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxSimpleDatatablesModule, decorators: [{
504
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgxSimpleDatatablesModule, decorators: [{
505
505
  type: NgModule,
506
506
  args: [{
507
507
  declarations: [NgxSimpleDatatablesComponent],
@@ -1 +1 @@
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})\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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"}
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,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-simple-datatables",
3
- "version": "2.0.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",
@@ -19,11 +19,11 @@
19
19
  "sorting",
20
20
  "filtering",
21
21
  "pagination",
22
- "angular17"
22
+ "angular21"
23
23
  ],
24
24
  "peerDependencies": {
25
- "@angular/common": ">=13.0.0 <18",
26
- "@angular/core": ">=13.0.0 <18"
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"
@@ -34,15 +34,13 @@
34
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 NgxSimpleDatatablesComponent 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;
@@ -76,3 +96,11 @@ export declare class NgxSimpleDatatablesComponent implements OnInit, OnDestroy,
76
96
  static ɵfac: i0.ɵɵFactoryDeclaration<NgxSimpleDatatablesComponent, never>;
77
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>;
78
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>;
104
+ }
105
+
106
+ export { NgxSimpleDatatablesComponent, NgxSimpleDatatablesModule, NgxSimpleDatatablesService };
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLWNvbmZpZy5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2ltcGxlLWRhdGF0YWJsZXMvc3JjL2ludGVyZmFjZXMvY29sdW1uLWNvbmZpZy5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uQ29uZmlnIHtcbiAgZmllbGQ6IHN0cmluZztcbiAgaGVhZGVyOiBzdHJpbmc7XG4gIHdpZHRoPzogc3RyaW5nO1xuICBmcmVlemU/OiBcImxlZnRcIiB8IFwicmlnaHRcIjtcbiAgc29ydGFibGU/OiBib29sZWFuO1xuICBmb3JtYXR0ZXI/OiAodmFsdWU6IGFueSwgcm93OiBhbnkpID0+IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb3J0U3RhdGUge1xuICBmaWVsZDogc3RyaW5nO1xuICBkaXJlY3Rpb246IFwiYXNjXCIgfCBcImRlc2NcIiB8IG51bGw7XG59XG4iXX0=