ngx-simple-datatables 1.17.0 → 2.0.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.
@@ -0,0 +1,20 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { NgxSimpleDatatablesComponent } from './ngx-simple-datatables.component';
4
+ import * as i0 from "@angular/core";
5
+ // NgModule wrapper to support Angular 14+ NgModule-based apps
6
+ // This keeps the component standalone while enabling module-style imports.
7
+ export class NgxSimpleDatatablesModule {
8
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxSimpleDatatablesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
9
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: NgxSimpleDatatablesModule, declarations: [NgxSimpleDatatablesComponent], imports: [CommonModule], exports: [NgxSimpleDatatablesComponent] }); }
10
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxSimpleDatatablesModule, imports: [CommonModule] }); }
11
+ }
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxSimpleDatatablesModule, decorators: [{
13
+ type: NgModule,
14
+ args: [{
15
+ declarations: [NgxSimpleDatatablesComponent],
16
+ imports: [CommonModule],
17
+ exports: [NgxSimpleDatatablesComponent],
18
+ }]
19
+ }] });
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXNpbXBsZS1kYXRhdGFibGVzLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zaW1wbGUtZGF0YXRhYmxlcy9zcmMvbGliL25neC1zaW1wbGUtZGF0YXRhYmxlcy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7O0FBRWpGLDhEQUE4RDtBQUM5RCwyRUFBMkU7QUFNM0UsTUFBTSxPQUFPLHlCQUF5QjsrR0FBekIseUJBQXlCO2dIQUF6Qix5QkFBeUIsaUJBSnJCLDRCQUE0QixhQUNqQyxZQUFZLGFBQ1osNEJBQTRCO2dIQUUzQix5QkFBeUIsWUFIMUIsWUFBWTs7NEZBR1gseUJBQXlCO2tCQUxyQyxRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxDQUFDLDRCQUE0QixDQUFDO29CQUM1QyxPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7b0JBQ3ZCLE9BQU8sRUFBRSxDQUFDLDRCQUE0QixDQUFDO2lCQUN4QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmd4U2ltcGxlRGF0YXRhYmxlc0NvbXBvbmVudCB9IGZyb20gJy4vbmd4LXNpbXBsZS1kYXRhdGFibGVzLmNvbXBvbmVudCc7XG5cbi8vIE5nTW9kdWxlIHdyYXBwZXIgdG8gc3VwcG9ydCBBbmd1bGFyIDE0KyBOZ01vZHVsZS1iYXNlZCBhcHBzXG4vLyBUaGlzIGtlZXBzIHRoZSBjb21wb25lbnQgc3RhbmRhbG9uZSB3aGlsZSBlbmFibGluZyBtb2R1bGUtc3R5bGUgaW1wb3J0cy5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW05neFNpbXBsZURhdGF0YWJsZXNDb21wb25lbnRdLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgZXhwb3J0czogW05neFNpbXBsZURhdGF0YWJsZXNDb21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3hTaW1wbGVEYXRhdGFibGVzTW9kdWxlIHt9XG4iXX0=
@@ -0,0 +1,14 @@
1
+ import { Injectable } from "@angular/core";
2
+ import * as i0 from "@angular/core";
3
+ export class NgxSimpleDatatablesService {
4
+ constructor() { }
5
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxSimpleDatatablesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
6
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxSimpleDatatablesService, providedIn: "root" }); }
7
+ }
8
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxSimpleDatatablesService, decorators: [{
9
+ type: Injectable,
10
+ args: [{
11
+ providedIn: "root",
12
+ }]
13
+ }], ctorParameters: () => [] });
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXNpbXBsZS1kYXRhdGFibGVzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2ltcGxlLWRhdGF0YWJsZXMvc3JjL2xpYi9uZ3gtc2ltcGxlLWRhdGF0YWJsZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUszQyxNQUFNLE9BQU8sMEJBQTBCO0lBQ3JDLGdCQUFlLENBQUM7K0dBREwsMEJBQTBCO21IQUExQiwwQkFBMEIsY0FGekIsTUFBTTs7NEZBRVAsMEJBQTBCO2tCQUh0QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46IFwicm9vdFwiLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3hTaW1wbGVEYXRhdGFibGVzU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKCkge31cbn1cbiJdfQ==
@@ -2,4 +2,4 @@
2
2
  * Generated bundle index. Do not edit.
3
3
  */
4
4
  export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXNpbXBsZS1kYXRhdGFibGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNpbXBsZS1kYXRhdGFibGUvc3JjL25neC1zaW1wbGUtZGF0YXRhYmxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXNpbXBsZS1kYXRhdGFibGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNpbXBsZS1kYXRhdGFibGVzL3NyYy9uZ3gtc2ltcGxlLWRhdGF0YWJsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -1,6 +1,7 @@
1
1
  /*
2
- * Public API Surface of ngx-simple-datatable
2
+ * Public API Surface of ngx-simple-datatables
3
3
  */
4
- export * from './lib/ngx-simple-datatable.service';
5
- export * from './lib/ngx-simple-datatable.component';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1zaW1wbGUtZGF0YXRhYmxlL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxvQ0FBb0MsQ0FBQztBQUNuRCxjQUFjLHNDQUFzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBuZ3gtc2ltcGxlLWRhdGF0YWJsZVxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL25neC1zaW1wbGUtZGF0YXRhYmxlLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbmd4LXNpbXBsZS1kYXRhdGFibGUuY29tcG9uZW50JztcbiJdfQ==
4
+ export * from "./lib/ngx-simple-datatables.service";
5
+ export * from "./lib/ngx-simple-datatables.component";
6
+ export * from "./lib/ngx-simple-datatables.module";
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1zaW1wbGUtZGF0YXRhYmxlcy9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyx1Q0FBdUMsQ0FBQztBQUN0RCxjQUFjLG9DQUFvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBuZ3gtc2ltcGxlLWRhdGF0YWJsZXNcbiAqL1xuXG5leHBvcnQgKiBmcm9tIFwiLi9saWIvbmd4LXNpbXBsZS1kYXRhdGFibGVzLnNlcnZpY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xpYi9uZ3gtc2ltcGxlLWRhdGF0YWJsZXMuY29tcG9uZW50XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9saWIvbmd4LXNpbXBsZS1kYXRhdGFibGVzLm1vZHVsZVwiO1xuIl19
@@ -1,21 +1,21 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, PLATFORM_ID, ContentChild, ViewChild, Input, Inject, ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { Injectable, PLATFORM_ID, ContentChild, ViewChild, Input, Inject, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
3
3
  import * as i1 from '@angular/common';
4
4
  import { isPlatformBrowser, CommonModule } from '@angular/common';
5
5
 
6
- class NgxSimpleDatatableService {
6
+ class NgxSimpleDatatablesService {
7
7
  constructor() { }
8
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxSimpleDatatableService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
9
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxSimpleDatatableService, providedIn: 'root' }); }
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" }); }
10
10
  }
11
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxSimpleDatatableService, decorators: [{
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxSimpleDatatablesService, decorators: [{
12
12
  type: Injectable,
13
13
  args: [{
14
- providedIn: 'root'
14
+ providedIn: "root",
15
15
  }]
16
16
  }], ctorParameters: () => [] });
17
17
 
18
- class NgxSimpleDatatableComponent {
18
+ class NgxSimpleDatatablesComponent {
19
19
  constructor(cdr, platformId, ngZone) {
20
20
  this.cdr = cdr;
21
21
  this.platformId = platformId;
@@ -47,7 +47,7 @@ class NgxSimpleDatatableComponent {
47
47
  // Scroll listeners
48
48
  this.scrollListener = null;
49
49
  this.resizeListener = null;
50
- this.storageKey = "ngx-simple-datatable-column-widths";
50
+ this.storageKey = "ngx-simple-datatables-column-widths";
51
51
  this.scrollRequestId = null;
52
52
  this.resizeTimer = null;
53
53
  this.mouseMoveHandler = null;
@@ -83,10 +83,10 @@ class NgxSimpleDatatableComponent {
83
83
  }
84
84
  ngAfterContentInit() {
85
85
  // if (!this.headerTemplate) {
86
- // throw new Error("ngx-simple-datatable requires a headerTemplate.");
86
+ // throw new Error("ngx-simple-datatables requires a headerTemplate.");
87
87
  // }
88
88
  // if (!this.cellTemplate) {
89
- // throw new Error("ngx-simple-datatable requires a cellTemplate.");
89
+ // throw new Error("ngx-simple-datatables requires a cellTemplate.");
90
90
  // }
91
91
  }
92
92
  initializeColumns() {
@@ -455,12 +455,12 @@ class NgxSimpleDatatableComponent {
455
455
  }
456
456
  }
457
457
  }
458
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxSimpleDatatableComponent, 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: NgxSimpleDatatableComponent, isStandalone: true, selector: "ngx-simple-datatable", 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: "ngmodule", type: CommonModule }, { 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: "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 }); }
460
460
  }
461
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxSimpleDatatableComponent, decorators: [{
461
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxSimpleDatatablesComponent, decorators: [{
462
462
  type: Component,
463
- args: [{ selector: "ngx-simple-datatable", standalone: true, imports: [CommonModule], 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, 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"] }]
464
464
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: Object, decorators: [{
465
465
  type: Inject,
466
466
  args: [PLATFORM_ID]
@@ -494,13 +494,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
494
494
  args: ["cellTemplate", { static: true }]
495
495
  }] } });
496
496
 
497
+ // NgModule wrapper to support Angular 14+ NgModule-based apps
498
+ // This keeps the component standalone while enabling module-style imports.
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] }); }
503
+ }
504
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxSimpleDatatablesModule, decorators: [{
505
+ type: NgModule,
506
+ args: [{
507
+ declarations: [NgxSimpleDatatablesComponent],
508
+ imports: [CommonModule],
509
+ exports: [NgxSimpleDatatablesComponent],
510
+ }]
511
+ }] });
512
+
497
513
  /*
498
- * Public API Surface of ngx-simple-datatable
514
+ * Public API Surface of ngx-simple-datatables
499
515
  */
500
516
 
501
517
  /**
502
518
  * Generated bundle index. Do not edit.
503
519
  */
504
520
 
505
- export { NgxSimpleDatatableComponent, NgxSimpleDatatableService };
521
+ export { NgxSimpleDatatablesComponent, NgxSimpleDatatablesModule, NgxSimpleDatatablesService };
506
522
  //# sourceMappingURL=ngx-simple-datatables.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-simple-datatables.mjs","sources":["../../../projects/ngx-simple-datatable/src/lib/ngx-simple-datatable.service.ts","../../../projects/ngx-simple-datatable/src/lib/ngx-simple-datatable.component.ts","../../../projects/ngx-simple-datatable/src/lib/ngx-simple-datatable.component.html","../../../projects/ngx-simple-datatable/src/public-api.ts","../../../projects/ngx-simple-datatable/src/ngx-simple-datatables.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NgxSimpleDatatableService {\n\n constructor() { }\n}\n","import { CommonModule, isPlatformBrowser } from \"@angular/common\";\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Input,\n TrackByFunction,\n ViewChild,\n Inject,\n PLATFORM_ID,\n ContentChild,\n TemplateRef,\n AfterContentInit,\n OnInit,\n OnDestroy,\n NgZone,\n ChangeDetectorRef as CDR,\n} from \"@angular/core\";\nimport { ColumnConfig, SortState } from \"../interfaces/column-config.interface\";\n\n@Component({\n selector: \"ngx-simple-datatable\",\n standalone: true,\n imports: [CommonModule],\n templateUrl: \"./ngx-simple-datatable.component.html\",\n styleUrls: [\"./ngx-simple-datatable.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgxSimpleDatatableComponent\n implements OnInit, OnDestroy, AfterContentInit\n{\n @Input() columns: ColumnConfig[] = [];\n @Input() data: any[] = [];\n @Input() rowHeight = 40;\n @Input() headerHeight = 50;\n @Input() bufferSize = 10;\n\n @ViewChild(\"tableContainer\", { static: true })\n tableContainer!: ElementRef<HTMLDivElement>;\n @ViewChild(\"tableBody\", { static: true })\n tableBody!: ElementRef<HTMLDivElement>;\n @ViewChild(\"headerRow\", { static: true })\n headerRow!: ElementRef<HTMLDivElement>;\n @ViewChild(\"headeCenterRow\", { static: true })\n headeCenterRow!: ElementRef<HTMLDivElement>;\n\n @ContentChild(\"headerTemplate\", { static: true })\n headerTemplate!: TemplateRef<any>;\n @ContentChild(\"cellTemplate\", { static: true })\n cellTemplate!: TemplateRef<any>;\n\n // Virtualization properties\n visibleStartIndex = 0;\n visibleEndIndex = 0;\n visibleRows: any[] = [];\n totalHeight = 0;\n offsetY = 0;\n containerHeight = 0;\n\n // Column properties\n leftFrozenColumns: ColumnConfig[] = [];\n centerColumns: ColumnConfig[] = [];\n rightFrozenColumns: ColumnConfig[] = [];\n columnWidths: { [key: string]: number } = {};\n\n // Sorting\n sortState: SortState = { field: \"\", direction: null };\n\n // Resizing\n private isResizing = false;\n private resizingColumn = \"\";\n private startX = 0;\n private startWidth = 0;\n\n // Scroll listeners\n private scrollListener: ((event: Event) => void) | null = null;\n private resizeListener: ((event: Event) => void) | null = null;\n private isBrowser: boolean;\n private storageKey = \"ngx-simple-datatable-column-widths\";\n private scrollRequestId: number | null = null;\n private resizeTimer: ReturnType<typeof setTimeout> | null = null;\n private mouseMoveHandler: ((e: MouseEvent) => void) | null = null;\n private mouseUpHandler: ((e: MouseEvent) => void) | null = null;\n\n constructor(\n private cdr: ChangeDetectorRef,\n @Inject(PLATFORM_ID) private platformId: Object,\n private ngZone: NgZone\n ) {\n this.isBrowser = isPlatformBrowser(this.platformId);\n }\n\n ngOnInit() {\n this.initializeColumns();\n if (this.isBrowser) {\n this.setupEventListeners();\n }\n this.calculateVirtualization();\n }\n\n ngOnDestroy() {\n if (this.isBrowser) {\n this.removeEventListeners();\n\n // Clean up any pending animations or timeouts\n if (this.scrollRequestId) {\n cancelAnimationFrame(this.scrollRequestId);\n }\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer);\n }\n }\n }\n\n ngAfterContentInit() {\n // if (!this.headerTemplate) {\n // throw new Error(\"ngx-simple-datatable requires a headerTemplate.\");\n // }\n // if (!this.cellTemplate) {\n // throw new Error(\"ngx-simple-datatable requires a cellTemplate.\");\n // }\n }\n\n private initializeColumns() {\n this.leftFrozenColumns = this.columns.filter(\n (col) => col.freeze === \"left\"\n );\n this.rightFrozenColumns = this.columns.filter(\n (col) => col.freeze === \"right\"\n );\n this.centerColumns = this.columns.filter((col) => !col.freeze);\n\n // Load saved column widths if available\n const savedWidths = this.loadColumnWidths();\n\n // Initialize column widths\n this.columns.forEach((col) => {\n if (col.width) {\n this.columnWidths[col.field] = Number.parseInt(\n col.width.replace(\"px\", \"\")\n );\n } else if (savedWidths && savedWidths[col.field]) {\n this.columnWidths[col.field] = savedWidths[col.field];\n } else {\n this.columnWidths[col.field] = 150; // default width\n }\n });\n }\n\n private setupEventListeners() {\n // Store references for cleanup\n this.scrollListener = (event: Event) => this.onBodyScroll(event);\n this.resizeListener = () => this.onResize();\n this.mouseMoveHandler = (event: MouseEvent) => this.onMouseMove(event);\n this.mouseUpHandler = (event: MouseEvent) => this.onMouseUp();\n\n // Add event listeners\n if (this.isBrowser) {\n // For the header scroll (horizontal only)\n if (this.headerRow?.nativeElement) {\n this.headerRow.nativeElement.addEventListener(\"scroll\", () =>\n this.onHeaderScroll(null)\n );\n }\n\n // For the body scroll (both vertical and horizontal)\n if (this.tableBody?.nativeElement && this.scrollListener) {\n this.tableBody.nativeElement.addEventListener(\n \"scroll\",\n this.scrollListener\n );\n }\n\n // Window resize and mouse events\n if (this.resizeListener) {\n window.addEventListener(\"resize\", this.resizeListener);\n }\n\n if (this.mouseMoveHandler) {\n document.addEventListener(\"mousemove\", this.mouseMoveHandler);\n }\n\n if (this.mouseUpHandler) {\n document.addEventListener(\"mouseup\", this.mouseUpHandler);\n }\n }\n }\n\n private removeEventListeners() {\n if (this.isBrowser) {\n // Clear any pending animations or timeouts\n if (this.scrollRequestId) {\n cancelAnimationFrame(this.scrollRequestId);\n this.scrollRequestId = null;\n }\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer);\n this.resizeTimer = null;\n }\n\n // Reset all event listeners\n this.scrollListener = null;\n this.resizeListener = null;\n this.mouseMoveHandler = null;\n this.mouseUpHandler = null;\n }\n }\n\n private calculateVirtualization() {\n if (!this.tableContainer || !this.tableBody) return;\n\n // Update container height based on available space\n const container = this.tableBody.nativeElement;\n this.containerHeight = container.clientHeight - this.headerHeight;\n this.totalHeight = this.data.length * this.rowHeight;\n\n // Get scroll position\n const scrollTop = container.scrollTop;\n\n // Calculate visible rows\n const visibleRowCount =\n Math.ceil(this.containerHeight / this.rowHeight) + 1;\n\n // Calculate start and end indices with buffer\n this.visibleStartIndex = Math.max(\n 0,\n Math.floor(scrollTop / this.rowHeight) - this.bufferSize\n );\n\n this.visibleEndIndex = Math.min(\n this.data.length - 1,\n this.visibleStartIndex + visibleRowCount + this.bufferSize * 2\n );\n\n // Update visible rows\n this.visibleRows = this.data.slice(\n this.visibleStartIndex,\n this.visibleEndIndex + 1\n );\n\n console.log(scrollTop, this.visibleStartIndex, this.visibleEndIndex);\n\n // Update vertical offset for virtual scrolling\n this.offsetY = this.visibleStartIndex * this.rowHeight;\n\n // Trigger change detection in the next tick to avoid ExpressionChangedAfterItHasBeenCheckedError\n Promise.resolve().then(() => {\n this.cdr.detectChanges();\n });\n }\n\n // Track last scroll time to prevent feedback loops\n private lastScrollTime = 0;\n private readonly SCROLL_DEBOUNCE = 10; // ms\n\n // Track scroll position for header transform\n public headerTransform = \"translateX(0)\";\n\n // Handle body scroll events\n public onBodyScroll(event: Event) {\n if (!event) return;\n\n const now = Date.now();\n if (now - this.lastScrollTime < this.SCROLL_DEBOUNCE) return;\n this.lastScrollTime = now;\n\n const target = event.target as HTMLElement;\n\n // Sync header scroll with body (horizontally)\n // if (this.headerRow?.nativeElement) {\n // this.headerRow.nativeElement.scrollLeft = target.scrollLeft;\n this.syncHorizontalScroll(target.scrollLeft);\n // }\n\n // Handle virtualization (vertical scrolling)\n if (this.scrollRequestId) {\n cancelAnimationFrame(this.scrollRequestId);\n }\n\n this.scrollRequestId = requestAnimationFrame(() => {\n this.calculateVirtualization();\n this.scrollRequestId = null;\n });\n }\n\n // Handle header scroll events\n public onHeaderScroll(event: Event | null): void {\n if (!event) return;\n const now = Date.now();\n if (now - this.lastScrollTime < this.SCROLL_DEBOUNCE) return;\n this.lastScrollTime = now;\n\n // Sync body scroll with header (horizontally)\n const scrollLeft = (event.target as HTMLElement).scrollLeft;\n if (this.tableBody?.nativeElement) {\n this.tableBody.nativeElement.scrollLeft = scrollLeft;\n }\n }\n\n private onResize() {\n // Debounce resize events for better performance\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer);\n }\n\n this.resizeTimer = setTimeout(() => {\n this.calculateVirtualization();\n this.resizeTimer = null;\n }, 50);\n }\n\n private syncHorizontalScroll(scrollLeft: number) {\n if (!this.tableContainer) return;\n\n // Update the transform value\n this.headerTransform = `translateX(-${scrollLeft}px)`;\n // Trigger change detection\n this.cdr.detectChanges();\n }\n\n // Sorting functionality\n onSort(column: ColumnConfig) {\n if (!column.sortable) return;\n\n if (this.sortState.field === column.field) {\n // Toggle sort direction\n if (this.sortState.direction === \"asc\") {\n this.sortState.direction = \"desc\";\n } else if (this.sortState.direction === \"desc\") {\n this.sortState.direction = null;\n this.sortState.field = \"\";\n } else {\n this.sortState.direction = \"asc\";\n }\n } else {\n this.sortState.field = column.field;\n this.sortState.direction = \"asc\";\n }\n\n this.applySorting();\n }\n\n private applySorting() {\n if (!this.sortState.direction || !this.sortState.field) {\n // Reset to original order if no sorting\n return;\n }\n\n this.data.sort((a, b) => {\n const aValue = a[this.sortState.field];\n const bValue = b[this.sortState.field];\n\n let comparison = 0;\n if (aValue > bValue) comparison = 1;\n if (aValue < bValue) comparison = -1;\n\n return this.sortState.direction === \"desc\" ? -comparison : comparison;\n });\n\n this.calculateVirtualization();\n }\n\n getSortIcon(column: ColumnConfig): string {\n if (!column.sortable || this.sortState.field !== column.field) return \"\";\n if (this.sortState.direction === \"asc\") return \"▲\";\n if (this.sortState.direction === \"desc\") return \"▼\";\n return \"\";\n }\n\n // Column resizing functionality\n onResizeStart(event: MouseEvent, column: ColumnConfig) {\n event.preventDefault();\n this.isResizing = true;\n this.resizingColumn = column.field;\n this.startX = event.clientX;\n this.startWidth = this.columnWidths[column.field];\n\n if (this.isBrowser) {\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n }\n }\n\n private onMouseMove(event: MouseEvent) {\n if (!this.isResizing || !this.resizingColumn) return;\n\n this.ngZone.runOutsideAngular(() => {\n const deltaX = event.clientX - this.startX;\n const newWidth = Math.max(50, this.startWidth + deltaX); // Minimum width of 50px\n\n // Only update if width actually changed\n if (this.columnWidths[this.resizingColumn] !== newWidth) {\n this.columnWidths[this.resizingColumn] = newWidth;\n this.cdr.detectChanges();\n }\n });\n }\n\n private onMouseUp() {\n if (this.isResizing) {\n this.isResizing = false;\n if (this.isBrowser) {\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n // Save column widths when resizing is complete\n this.saveColumnWidths();\n }\n this.resizingColumn = \"\";\n }\n }\n\n // Utility methods\n getColumnWidth(column: ColumnConfig): string {\n return `${this.columnWidths[column.field]}px`;\n }\n\n getCellValue(row: any, column: ColumnConfig): string {\n const value = row[column.field];\n return column.formatter\n ? column.formatter(value, row)\n : value?.toString() || \"\";\n }\n\n getLeftFrozenWidth(): number {\n return this.leftFrozenColumns.reduce(\n (sum, col) => sum + this.columnWidths[col.field],\n 0\n );\n }\n\n getRightFrozenWidth(): number {\n return this.rightFrozenColumns.reduce(\n (sum, col) => sum + this.columnWidths[col.field],\n 0\n );\n }\n\n // TrackBy functions for performance\n trackByRowIndex: TrackByFunction<any> = (index: number) =>\n this.visibleStartIndex + index;\n trackByColumnField: TrackByFunction<ColumnConfig> = (\n index: number,\n column: ColumnConfig\n ) => column.field;\n\n // Accessibility methods\n getAriaSort(column: ColumnConfig): string | null {\n if (this.sortState.field !== column.field || !column.sortable) {\n return null;\n }\n return this.sortState.direction === \"asc\" ? \"ascending\" : \"descending\";\n }\n\n // Keyboard navigation\n onKeydown(event: KeyboardEvent): void {\n if (!this.tableContainer) return;\n\n const { key, ctrlKey, shiftKey } = event;\n const scrollAmount = shiftKey ? 100 : 30; // Larger scroll with shift key\n console.log(key);\n switch (key) {\n case \"ArrowLeft\":\n this.tableContainer.nativeElement.scrollLeft -= scrollAmount;\n break;\n case \"ArrowRight\":\n this.tableContainer.nativeElement.scrollLeft += scrollAmount;\n break;\n case \"ArrowUp\":\n if (ctrlKey) {\n this.tableContainer.nativeElement.scrollTo({\n top: 0,\n behavior: \"smooth\",\n });\n } else {\n this.tableContainer.nativeElement.scrollTop -= scrollAmount;\n }\n break;\n case \"ArrowDown\":\n if (ctrlKey) {\n this.tableContainer.nativeElement.scrollTo({\n top: this.tableContainer.nativeElement.scrollHeight,\n behavior: \"smooth\",\n });\n } else {\n this.tableContainer.nativeElement.scrollTop += scrollAmount;\n }\n break;\n case \"1\":\n if (ctrlKey) {\n this.tableContainer.nativeElement.scrollTo({\n top: 0,\n left: 0,\n behavior: \"smooth\",\n });\n } else {\n this.tableContainer.nativeElement.scrollTo({\n left: 0,\n behavior: \"smooth\",\n });\n }\n break;\n case \"0\":\n if (ctrlKey) {\n this.tableContainer.nativeElement.scrollTo({\n top: this.tableContainer.nativeElement.scrollHeight,\n left: this.tableContainer.nativeElement.scrollWidth,\n behavior: \"smooth\",\n });\n } else {\n this.tableContainer.nativeElement.scrollTo({\n left: this.tableContainer.nativeElement.scrollWidth,\n behavior: \"smooth\",\n });\n }\n break;\n default:\n return; // Exit for other keys\n }\n\n event.preventDefault();\n }\n\n // Save column widths to localStorage\n private saveColumnWidths(): void {\n if (this.isBrowser) {\n try {\n localStorage.setItem(\n this.storageKey,\n JSON.stringify(this.columnWidths)\n );\n } catch (e) {\n console.warn(\"Failed to save column widths to localStorage\", e);\n }\n }\n }\n\n // Load column widths from localStorage\n private loadColumnWidths(): Record<string, number> | null {\n if (!this.isBrowser) return null;\n\n try {\n const saved = localStorage.getItem(this.storageKey);\n return saved ? JSON.parse(saved) : null;\n } catch (e) {\n console.warn(\"Failed to load column widths from localStorage\", e);\n return null;\n }\n }\n\n // Clear saved column widths\n public clearSavedWidths(): void {\n if (this.isBrowser) {\n try {\n localStorage.removeItem(this.storageKey);\n // Reset to default widths\n this.columns.forEach((col) => {\n this.columnWidths[col.field] = col.width\n ? Number.parseInt(col.width.replace(\"px\", \"\"))\n : 150;\n });\n this.cdr.detectChanges();\n } catch (e) {\n console.warn(\"Failed to clear saved column widths\", e);\n }\n }\n }\n}\n","<div class=\"dynamic-table-container\" #tableContainer>\n <!-- Sticky Header -->\n <div class=\"table-header\" [style.height.px]=\"headerHeight\">\n <div class=\"header-row\" #headerRow (scroll)=\"onHeaderScroll($event)\">\n <!-- Left Frozen Columns -->\n <div class=\"frozen-left\" [style.width.px]=\"getLeftFrozenWidth()\" *ngIf=\"leftFrozenColumns.length > 0\"\n role=\"presentation\">\n <div class=\"header-cell\"\n *ngFor=\"let column of leftFrozenColumns; trackBy: trackByColumnField; let colIndex = index\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\"\n [class.sort-asc]=\"sortState.field === column.field && sortState.direction === 'asc'\"\n [class.sort-desc]=\"sortState.field === column.field && sortState.direction === 'desc'\"\n [attr.role]=\"'columnheader'\" [attr.aria-sort]=\"getAriaSort(column)\" [attr.aria-colindex]=\"colIndex + 1\"\n [attr.aria-label]=\"column.header + (column.sortable ? ' (click to sort)' : '')\" (click)=\"onSort(column)\"\n (keydown.enter)=\"onSort(column)\" (keydown.space)=\"onSort(column); $event.preventDefault()\"\n [tabindex]=\"column.sortable ? '0' : '-1'\" [attr.data-column-id]=\"column.field\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\" [ngTemplateOutletContext]=\"{ column: column }\">\n </ng-container>\n\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n\n <!-- Center Scrollable Columns -->\n <div class=\"center-columns\" #headeCenterRow role=\"presentation\" [ngStyle]=\"{'transform': headerTransform}\">\n <div class=\"header-cell\" *ngFor=\"let column of centerColumns; trackBy: trackByColumnField; let colIndex = index\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\"\n [class.sort-asc]=\"sortState.field === column.field && sortState.direction === 'asc'\"\n [class.sort-desc]=\"sortState.field === column.field && sortState.direction === 'desc'\"\n [attr.role]=\"'columnheader'\" [attr.aria-sort]=\"getAriaSort(column)\"\n [attr.aria-colindex]=\"leftFrozenColumns.length + colIndex + 1\"\n [attr.aria-label]=\"column.header + (column.sortable ? ' (click to sort)' : '')\" (click)=\"onSort(column)\"\n (keydown.enter)=\"onSort(column)\" (keydown.space)=\"onSort(column); $event.preventDefault()\"\n [tabindex]=\"column.sortable ? '0' : '-1'\" [attr.data-column-id]=\"column.field\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\"\n [ngTemplateOutletContext]=\"{ column: column }\"></ng-container>\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n\n <!-- Right Frozen Columns -->\n <div class=\"frozen-right\" [style.width.px]=\"getRightFrozenWidth()\" *ngIf=\"rightFrozenColumns.length > 0\">\n <div class=\"header-cell\" *ngFor=\"let column of rightFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\" (click)=\"onSort(column)\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\"\n [ngTemplateOutletContext]=\"{ column: column }\"></ng-container>\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Table Body with Virtual Scrolling -->\n <div class=\"table-body\" #tableBody [style.height]=\"'calc(100% - ' + headerHeight + 'px)'\"\n (scroll)=\"onBodyScroll($event)\">\n <!-- Virtual spacer for total height -->\n <div class=\"virtual-spacer\" [style.height.px]=\"totalHeight\"></div>\n\n <!-- Visible rows container -->\n <div class=\"visible-rows\" [style.transform]=\"'translateY(' + offsetY + 'px)'\">\n <div class=\"table-row\" *ngFor=\"let row of visibleRows; let i = index; trackBy: trackByRowIndex\"\n [style.height.px]=\"rowHeight\">\n\n <!-- Left Frozen Columns -->\n <div class=\"frozen-left\" [style.width.px]=\"getLeftFrozenWidth()\" *ngIf=\"leftFrozenColumns.length > 0\">\n <div class=\"table-cell\" *ngFor=\"let column of leftFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n\n <!-- Center Scrollable Columns -->\n <div class=\"center-columns\">\n <div class=\"table-cell\" *ngFor=\"let column of centerColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n\n <!-- Right Frozen Columns -->\n <div class=\"frozen-right\" [style.width.px]=\"getRightFrozenWidth()\" *ngIf=\"rightFrozenColumns.length > 0\">\n <div class=\"table-cell\" *ngFor=\"let column of rightFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>","/*\n * Public API Surface of ngx-simple-datatable\n */\n\nexport * from './lib/ngx-simple-datatable.service';\nexport * from './lib/ngx-simple-datatable.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-simple-datatables.mjs","sources":["../../../projects/ngx-simple-datatables/src/lib/ngx-simple-datatables.service.ts","../../../projects/ngx-simple-datatables/src/lib/ngx-simple-datatables.component.ts","../../../projects/ngx-simple-datatables/src/lib/ngx-simple-datatables.component.html","../../../projects/ngx-simple-datatables/src/lib/ngx-simple-datatables.module.ts","../../../projects/ngx-simple-datatables/src/public-api.ts","../../../projects/ngx-simple-datatables/src/ngx-simple-datatables.ts"],"sourcesContent":["import { Injectable } from \"@angular/core\";\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class NgxSimpleDatatablesService {\n constructor() {}\n}\n","import { CommonModule, isPlatformBrowser } from \"@angular/common\";\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Input,\n TrackByFunction,\n ViewChild,\n Inject,\n PLATFORM_ID,\n ContentChild,\n TemplateRef,\n AfterContentInit,\n OnInit,\n OnDestroy,\n NgZone,\n ChangeDetectorRef as CDR,\n} from \"@angular/core\";\nimport { ColumnConfig, SortState } from \"../interfaces/column-config.interface\";\n\n@Component({\n selector: \"ngx-simple-datatables\",\n templateUrl: \"./ngx-simple-datatables.component.html\",\n styleUrls: [\"./ngx-simple-datatables.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\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,7 +1,7 @@
1
1
  import { ChangeDetectorRef, ElementRef, TrackByFunction, TemplateRef, AfterContentInit, OnInit, OnDestroy, NgZone } from "@angular/core";
2
2
  import { ColumnConfig, SortState } from "../interfaces/column-config.interface";
3
3
  import * as i0 from "@angular/core";
4
- export declare class NgxSimpleDatatableComponent implements OnInit, OnDestroy, AfterContentInit {
4
+ export declare class NgxSimpleDatatablesComponent implements OnInit, OnDestroy, AfterContentInit {
5
5
  private cdr;
6
6
  private platformId;
7
7
  private ngZone;
@@ -73,6 +73,6 @@ export declare class NgxSimpleDatatableComponent implements OnInit, OnDestroy, A
73
73
  private saveColumnWidths;
74
74
  private loadColumnWidths;
75
75
  clearSavedWidths(): void;
76
- static ɵfac: i0.ɵɵFactoryDeclaration<NgxSimpleDatatableComponent, never>;
77
- static ɵcmp: i0.ɵɵComponentDeclaration<NgxSimpleDatatableComponent, "ngx-simple-datatable", never, { "columns": { "alias": "columns"; "required": false; }; "data": { "alias": "data"; "required": false; }; "rowHeight": { "alias": "rowHeight"; "required": false; }; "headerHeight": { "alias": "headerHeight"; "required": false; }; "bufferSize": { "alias": "bufferSize"; "required": false; }; }, {}, ["headerTemplate", "cellTemplate"], never, true, never>;
76
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgxSimpleDatatablesComponent, never>;
77
+ 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
78
  }
@@ -0,0 +1,8 @@
1
+ import * as i0 from "@angular/core";
2
+ import * as i1 from "./ngx-simple-datatables.component";
3
+ import * as i2 from "@angular/common";
4
+ export declare class NgxSimpleDatatablesModule {
5
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgxSimpleDatatablesModule, never>;
6
+ static ɵmod: i0.ɵɵNgModuleDeclaration<NgxSimpleDatatablesModule, [typeof i1.NgxSimpleDatatablesComponent], [typeof i2.CommonModule], [typeof i1.NgxSimpleDatatablesComponent]>;
7
+ static ɵinj: i0.ɵɵInjectorDeclaration<NgxSimpleDatatablesModule>;
8
+ }
@@ -0,0 +1,6 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class NgxSimpleDatatablesService {
3
+ constructor();
4
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgxSimpleDatatablesService, never>;
5
+ static ɵprov: i0.ɵɵInjectableDeclaration<NgxSimpleDatatablesService>;
6
+ }