ngx-simple-datatables 2.0.0 → 2.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/ngx-simple-datatables.mjs +11 -11
- package/fesm2022/ngx-simple-datatables.mjs.map +1 -1
- package/package.json +6 -8
- package/{lib/ngx-simple-datatables.component.d.ts → types/ngx-simple-datatables.d.ts} +32 -4
- package/esm2022/interfaces/column-config.interface.mjs +0 -2
- package/esm2022/lib/ngx-simple-datatables.component.mjs +0 -483
- package/esm2022/lib/ngx-simple-datatables.module.mjs +0 -20
- package/esm2022/lib/ngx-simple-datatables.service.mjs +0 -14
- package/esm2022/ngx-simple-datatables.mjs +0 -5
- package/esm2022/public-api.mjs +0 -7
- package/index.d.ts +0 -5
- package/interfaces/column-config.interface.d.ts +0 -12
- package/lib/ngx-simple-datatables.module.d.ts +0 -8
- package/lib/ngx-simple-datatables.service.d.ts +0 -6
- package/public-api.d.ts +0 -3
|
@@ -5,10 +5,10 @@ import { isPlatformBrowser, CommonModule } from '@angular/common';
|
|
|
5
5
|
|
|
6
6
|
class NgxSimpleDatatablesService {
|
|
7
7
|
constructor() { }
|
|
8
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
9
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
8
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgxSimpleDatatablesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
9
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgxSimpleDatatablesService, providedIn: "root" }); }
|
|
10
10
|
}
|
|
11
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
11
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgxSimpleDatatablesService, decorators: [{
|
|
12
12
|
type: Injectable,
|
|
13
13
|
args: [{
|
|
14
14
|
providedIn: "root",
|
|
@@ -455,12 +455,12 @@ class NgxSimpleDatatablesComponent {
|
|
|
455
455
|
}
|
|
456
456
|
}
|
|
457
457
|
}
|
|
458
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
459
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NgxSimpleDatatablesComponent, selector: "ngx-simple-datatables", inputs: { columns: "columns", data: "data", rowHeight: "rowHeight", headerHeight: "headerHeight", bufferSize: "bufferSize" }, queries: [{ propertyName: "headerTemplate", first: true, predicate: ["headerTemplate"], descendants: true, static: true }, { propertyName: "cellTemplate", first: true, predicate: ["cellTemplate"], descendants: true, static: true }], viewQueries: [{ propertyName: "tableContainer", first: true, predicate: ["tableContainer"], descendants: true, static: true }, { propertyName: "tableBody", first: true, predicate: ["tableBody"], descendants: true, static: true }, { propertyName: "headerRow", first: true, predicate: ["headerRow"], descendants: true, static: true }, { propertyName: "headeCenterRow", first: true, predicate: ["headeCenterRow"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"dynamic-table-container\" #tableContainer>\n <!-- Sticky Header -->\n <div class=\"table-header\" [style.height.px]=\"headerHeight\">\n <div class=\"header-row\" #headerRow (scroll)=\"onHeaderScroll($event)\">\n <!-- Left Frozen Columns -->\n <div class=\"frozen-left\" [style.width.px]=\"getLeftFrozenWidth()\" *ngIf=\"leftFrozenColumns.length > 0\"\n role=\"presentation\">\n <div class=\"header-cell\"\n *ngFor=\"let column of leftFrozenColumns; trackBy: trackByColumnField; let colIndex = index\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\"\n [class.sort-asc]=\"sortState.field === column.field && sortState.direction === 'asc'\"\n [class.sort-desc]=\"sortState.field === column.field && sortState.direction === 'desc'\"\n [attr.role]=\"'columnheader'\" [attr.aria-sort]=\"getAriaSort(column)\" [attr.aria-colindex]=\"colIndex + 1\"\n [attr.aria-label]=\"column.header + (column.sortable ? ' (click to sort)' : '')\" (click)=\"onSort(column)\"\n (keydown.enter)=\"onSort(column)\" (keydown.space)=\"onSort(column); $event.preventDefault()\"\n [tabindex]=\"column.sortable ? '0' : '-1'\" [attr.data-column-id]=\"column.field\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\" [ngTemplateOutletContext]=\"{ column: column }\">\n </ng-container>\n\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n\n <!-- Center Scrollable Columns -->\n <div class=\"center-columns\" #headeCenterRow role=\"presentation\" [ngStyle]=\"{'transform': headerTransform}\">\n <div class=\"header-cell\" *ngFor=\"let column of centerColumns; trackBy: trackByColumnField; let colIndex = index\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\"\n [class.sort-asc]=\"sortState.field === column.field && sortState.direction === 'asc'\"\n [class.sort-desc]=\"sortState.field === column.field && sortState.direction === 'desc'\"\n [attr.role]=\"'columnheader'\" [attr.aria-sort]=\"getAriaSort(column)\"\n [attr.aria-colindex]=\"leftFrozenColumns.length + colIndex + 1\"\n [attr.aria-label]=\"column.header + (column.sortable ? ' (click to sort)' : '')\" (click)=\"onSort(column)\"\n (keydown.enter)=\"onSort(column)\" (keydown.space)=\"onSort(column); $event.preventDefault()\"\n [tabindex]=\"column.sortable ? '0' : '-1'\" [attr.data-column-id]=\"column.field\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\"\n [ngTemplateOutletContext]=\"{ column: column }\"></ng-container>\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n\n <!-- Right Frozen Columns -->\n <div class=\"frozen-right\" [style.width.px]=\"getRightFrozenWidth()\" *ngIf=\"rightFrozenColumns.length > 0\">\n <div class=\"header-cell\" *ngFor=\"let column of rightFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\" (click)=\"onSort(column)\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\"\n [ngTemplateOutletContext]=\"{ column: column }\"></ng-container>\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Table Body with Virtual Scrolling -->\n <div class=\"table-body\" #tableBody [style.height]=\"'calc(100% - ' + headerHeight + 'px)'\"\n (scroll)=\"onBodyScroll($event)\">\n <!-- Virtual spacer for total height -->\n <div class=\"virtual-spacer\" [style.height.px]=\"totalHeight\"></div>\n\n <!-- Visible rows container -->\n <div class=\"visible-rows\" [style.transform]=\"'translateY(' + offsetY + 'px)'\">\n <div class=\"table-row\" *ngFor=\"let row of visibleRows; let i = index; trackBy: trackByRowIndex\"\n [style.height.px]=\"rowHeight\">\n\n <!-- Left Frozen Columns -->\n <div class=\"frozen-left\" [style.width.px]=\"getLeftFrozenWidth()\" *ngIf=\"leftFrozenColumns.length > 0\">\n <div class=\"table-cell\" *ngFor=\"let column of leftFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n\n <!-- Center Scrollable Columns -->\n <div class=\"center-columns\">\n <div class=\"table-cell\" *ngFor=\"let column of centerColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n\n <!-- Right Frozen Columns -->\n <div class=\"frozen-right\" [style.width.px]=\"getRightFrozenWidth()\" *ngIf=\"rightFrozenColumns.length > 0\">\n <div class=\"table-cell\" *ngFor=\"let column of rightFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>", styles: [":root{--ngx-simple-dt-bg: #ffffff;--ngx-simple-dt-border: 1px solid #e0e0e0;--ngx-simple-dt-border-radius: 8px;--ngx-simple-dt-box-shadow: 0 2px 8px rgba(0, 0, 0, .1);--ngx-simple-dt-transition: all .2s ease-in-out;--ngx-simple-dt-header-bg: #f8f9fa;--ngx-simple-dt-header-hover-bg: #e9ecef;--ngx-simple-dt-header-border: 1px solid #e0e0e0;--ngx-simple-dt-header-text: #495057;--ngx-simple-dt-header-height: 98px;--ngx-simple-dt-header-font-weight: 600;--ngx-simple-dt-header-padding: 0 16px;--ngx-simple-dt-cell-hover-bg: #f1f3f5;--ngx-simple-dt-cell-active-bg: #e9ecef;--ngx-simple-dt-row-height: 48px;--ngx-simple-dt-cell-padding: 0 16px;--ngx-simple-dt-cell-border: 1px solid #e9ecef;--ngx-simple-dt-cell-font-size: .875rem;--ngx-simple-dt-cell-line-height: 1.5;--ngx-simple-dt-row-bg: #ffffff;--ngx-simple-dt-row-hover-bg: #f8f9fa;--ngx-simple-dt-row-stripe-bg: #f8f9fa;--ngx-simple-dt-row-active-bg: #e9ecef;--ngx-simple-dt-row-border: 1px solid #e9ecef}.dynamic-table-container{width:100%;height:100%;position:relative;display:flex;flex-direction:column;overflow:hidden;background:var(--ngx-simple-dt-bg);border:var(--ngx-simple-dt-border);border-radius:var(--ngx-simple-dt-border-radius);box-shadow:var(--ngx-simple-dt-box-shadow);transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header{position:sticky;top:0;z-index:10;background:var(--ngx-simple-dt-header-bg);border-bottom:var(--ngx-simple-dt-header-border);overflow:hidden;height:var(--ngx-simple-dt-header-height);color:var(--ngx-simple-dt-header-text)}.dynamic-table-container .table-header .header-row{display:flex;min-width:100%;position:relative;height:100%}.dynamic-table-container .table-header .header-row .frozen-left,.dynamic-table-container .table-header .header-row .frozen-right{position:sticky;z-index:12;background:var(--ngx-simple-dt-header-bg);display:flex;box-shadow:2px 0 8px #0000000d;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .frozen-left{left:0;border-right:var(--ngx-simple-dt-header-border)}.dynamic-table-container .table-header .header-row .center-columns{display:flex;flex:1}.dynamic-table-container .table-header .header-row .frozen-right{right:0;border-left:var(--ngx-simple-dt-header-border)}.dynamic-table-container .table-header .header-row .header-cell{display:flex;align-items:center;justify-content:space-between;padding:var(--ngx-simple-dt-cell-padding);border-right:var(--ngx-simple-dt-cell-border);background:inherit;font-weight:var(--ngx-simple-dt-header-font-weight);position:relative;min-width:0;font-size:var(--ngx-simple-dt-cell-font-size);line-height:var(--ngx-simple-dt-cell-line-height);color:inherit;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell.sortable:hover{background:var(--ngx-simple-dt-header-hover-bg)}.dynamic-table-container .table-header .header-row .header-cell.sortable:active{background:var(--ngx-simple-dt-cell-active-bg)}.dynamic-table-container .table-header .header-row .header-cell .header-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dynamic-table-container .table-header .header-row .header-cell .sort-icon{margin-left:8px;font-size:12px;color:#6c757d;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell .sort-icon.sort-asc,.dynamic-table-container .table-header .header-row .header-cell .sort-icon.sort-desc{color:#0d6efd}.dynamic-table-container .table-header .header-row .header-cell .resize-handle{position:absolute;right:0;top:0;bottom:0;width:4px;cursor:col-resize;background:transparent;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell .resize-handle:hover,.dynamic-table-container .table-header .header-row .header-cell .resize-handle:active{background:#0d6efd}.dynamic-table-container .table-body{position:relative;flex:1;overflow:auto;scrollbar-width:thin;scrollbar-color:#ced4da #f8f9fa;-webkit-overflow-scrolling:touch}.dynamic-table-container .table-body::-webkit-scrollbar{width:8px;height:8px}.dynamic-table-container .table-body::-webkit-scrollbar-track{background:#f8f9fa;scroll-margin-left:100px}.dynamic-table-container .table-body::-webkit-scrollbar-thumb{background-color:#ced4da;border-radius:4px}.dynamic-table-container .table-body::-webkit-scrollbar-thumb:hover{background-color:#adb5bd}.dynamic-table-container .table-body .virtual-spacer{position:absolute;top:0;left:0;width:1px;pointer-events:none}.dynamic-table-container .table-body .visible-rows{position:absolute;top:0;left:0;right:0;min-width:fit-content}.dynamic-table-container .table-body .visible-rows .table-row{display:flex;min-width:100%;border-bottom:var(--ngx-simple-dt-row-border);background:var(--ngx-simple-dt-row-bg);transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-body .visible-rows .table-row:nth-child(2n){background:var(--ngx-simple-dt-row-stripe-bg)}.dynamic-table-container .table-body .visible-rows .table-row:hover{background:var(--ngx-simple-dt-row-hover-bg)}.dynamic-table-container .table-body .visible-rows .table-row:active{background:var(--ngx-simple-dt-row-active-bg)}.dynamic-table-container .table-body .visible-rows .table-row .frozen-left{position:sticky;left:0;z-index:5;background:#fff;border-right:2px solid #ccc;display:flex}.table-row:hover .dynamic-table-container .table-body .visible-rows .table-row .frozen-left{background:#f9f9f9}.dynamic-table-container .table-body .visible-rows .table-row .center-columns{display:flex;flex:0 0 auto}.dynamic-table-container .table-body .visible-rows .table-row .frozen-right{position:sticky;right:0;z-index:5;background:#fff;border-left:2px solid #ccc;display:flex}.table-row:hover .dynamic-table-container .table-body .visible-rows .table-row .frozen-right{background:#f9f9f9}.dynamic-table-container .table-body .visible-rows .table-row .table-cell{padding:var(--ngx-simple-dt-cell-padding);border-right:var(--ngx-simple-dt-cell-border);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--ngx-simple-dt-cell-font-size);line-height:var(--ngx-simple-dt-cell-line-height);display:flex;align-items:center;transition:var(--ngx-simple-dt-transition);min-width:0}.dynamic-table-container .frozen-left .table-cell,.dynamic-table-container .frozen-right .table-cell{background:inherit;box-shadow:2px 0 8px #0000000d}@media (max-width: 768px){.dynamic-table-container{font-size:14px}.dynamic-table-container .header-cell,.dynamic-table-container .table-cell{padding:0 8px}}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
458
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgxSimpleDatatablesComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: PLATFORM_ID }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
459
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.6", type: NgxSimpleDatatablesComponent, isStandalone: false, selector: "ngx-simple-datatables", inputs: { columns: "columns", data: "data", rowHeight: "rowHeight", headerHeight: "headerHeight", bufferSize: "bufferSize" }, queries: [{ propertyName: "headerTemplate", first: true, predicate: ["headerTemplate"], descendants: true, static: true }, { propertyName: "cellTemplate", first: true, predicate: ["cellTemplate"], descendants: true, static: true }], viewQueries: [{ propertyName: "tableContainer", first: true, predicate: ["tableContainer"], descendants: true, static: true }, { propertyName: "tableBody", first: true, predicate: ["tableBody"], descendants: true, static: true }, { propertyName: "headerRow", first: true, predicate: ["headerRow"], descendants: true, static: true }, { propertyName: "headeCenterRow", first: true, predicate: ["headeCenterRow"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"dynamic-table-container\" #tableContainer>\n <!-- Sticky Header -->\n <div class=\"table-header\" [style.height.px]=\"headerHeight\">\n <div class=\"header-row\" #headerRow (scroll)=\"onHeaderScroll($event)\">\n <!-- Left Frozen Columns -->\n <div class=\"frozen-left\" [style.width.px]=\"getLeftFrozenWidth()\" *ngIf=\"leftFrozenColumns.length > 0\"\n role=\"presentation\">\n <div class=\"header-cell\"\n *ngFor=\"let column of leftFrozenColumns; trackBy: trackByColumnField; let colIndex = index\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\"\n [class.sort-asc]=\"sortState.field === column.field && sortState.direction === 'asc'\"\n [class.sort-desc]=\"sortState.field === column.field && sortState.direction === 'desc'\"\n [attr.role]=\"'columnheader'\" [attr.aria-sort]=\"getAriaSort(column)\" [attr.aria-colindex]=\"colIndex + 1\"\n [attr.aria-label]=\"column.header + (column.sortable ? ' (click to sort)' : '')\" (click)=\"onSort(column)\"\n (keydown.enter)=\"onSort(column)\" (keydown.space)=\"onSort(column); $event.preventDefault()\"\n [tabindex]=\"column.sortable ? '0' : '-1'\" [attr.data-column-id]=\"column.field\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\" [ngTemplateOutletContext]=\"{ column: column }\">\n </ng-container>\n\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n\n <!-- Center Scrollable Columns -->\n <div class=\"center-columns\" #headeCenterRow role=\"presentation\" [ngStyle]=\"{'transform': headerTransform}\">\n <div class=\"header-cell\" *ngFor=\"let column of centerColumns; trackBy: trackByColumnField; let colIndex = index\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\"\n [class.sort-asc]=\"sortState.field === column.field && sortState.direction === 'asc'\"\n [class.sort-desc]=\"sortState.field === column.field && sortState.direction === 'desc'\"\n [attr.role]=\"'columnheader'\" [attr.aria-sort]=\"getAriaSort(column)\"\n [attr.aria-colindex]=\"leftFrozenColumns.length + colIndex + 1\"\n [attr.aria-label]=\"column.header + (column.sortable ? ' (click to sort)' : '')\" (click)=\"onSort(column)\"\n (keydown.enter)=\"onSort(column)\" (keydown.space)=\"onSort(column); $event.preventDefault()\"\n [tabindex]=\"column.sortable ? '0' : '-1'\" [attr.data-column-id]=\"column.field\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\"\n [ngTemplateOutletContext]=\"{ column: column }\"></ng-container>\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n\n <!-- Right Frozen Columns -->\n <div class=\"frozen-right\" [style.width.px]=\"getRightFrozenWidth()\" *ngIf=\"rightFrozenColumns.length > 0\">\n <div class=\"header-cell\" *ngFor=\"let column of rightFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\" (click)=\"onSort(column)\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\"\n [ngTemplateOutletContext]=\"{ column: column }\"></ng-container>\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Table Body with Virtual Scrolling -->\n <div class=\"table-body\" #tableBody [style.height]=\"'calc(100% - ' + headerHeight + 'px)'\"\n (scroll)=\"onBodyScroll($event)\">\n <!-- Virtual spacer for total height -->\n <div class=\"virtual-spacer\" [style.height.px]=\"totalHeight\"></div>\n\n <!-- Visible rows container -->\n <div class=\"visible-rows\" [style.transform]=\"'translateY(' + offsetY + 'px)'\">\n <div class=\"table-row\" *ngFor=\"let row of visibleRows; let i = index; trackBy: trackByRowIndex\"\n [style.height.px]=\"rowHeight\">\n\n <!-- Left Frozen Columns -->\n <div class=\"frozen-left\" [style.width.px]=\"getLeftFrozenWidth()\" *ngIf=\"leftFrozenColumns.length > 0\">\n <div class=\"table-cell\" *ngFor=\"let column of leftFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n\n <!-- Center Scrollable Columns -->\n <div class=\"center-columns\">\n <div class=\"table-cell\" *ngFor=\"let column of centerColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n\n <!-- Right Frozen Columns -->\n <div class=\"frozen-right\" [style.width.px]=\"getRightFrozenWidth()\" *ngIf=\"rightFrozenColumns.length > 0\">\n <div class=\"table-cell\" *ngFor=\"let column of rightFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>", styles: [":root{--ngx-simple-dt-bg: #ffffff;--ngx-simple-dt-border: 1px solid #e0e0e0;--ngx-simple-dt-border-radius: 8px;--ngx-simple-dt-box-shadow: 0 2px 8px rgba(0, 0, 0, .1);--ngx-simple-dt-transition: all .2s ease-in-out;--ngx-simple-dt-header-bg: #f8f9fa;--ngx-simple-dt-header-hover-bg: #e9ecef;--ngx-simple-dt-header-border: 1px solid #e0e0e0;--ngx-simple-dt-header-text: #495057;--ngx-simple-dt-header-height: 98px;--ngx-simple-dt-header-font-weight: 600;--ngx-simple-dt-header-padding: 0 16px;--ngx-simple-dt-cell-hover-bg: #f1f3f5;--ngx-simple-dt-cell-active-bg: #e9ecef;--ngx-simple-dt-row-height: 48px;--ngx-simple-dt-cell-padding: 0 16px;--ngx-simple-dt-cell-border: 1px solid #e9ecef;--ngx-simple-dt-cell-font-size: .875rem;--ngx-simple-dt-cell-line-height: 1.5;--ngx-simple-dt-row-bg: #ffffff;--ngx-simple-dt-row-hover-bg: #f8f9fa;--ngx-simple-dt-row-stripe-bg: #f8f9fa;--ngx-simple-dt-row-active-bg: #e9ecef;--ngx-simple-dt-row-border: 1px solid #e9ecef}.dynamic-table-container{width:100%;height:100%;position:relative;display:flex;flex-direction:column;overflow:hidden;background:var(--ngx-simple-dt-bg);border:var(--ngx-simple-dt-border);border-radius:var(--ngx-simple-dt-border-radius);box-shadow:var(--ngx-simple-dt-box-shadow);transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header{position:sticky;top:0;z-index:10;background:var(--ngx-simple-dt-header-bg);border-bottom:var(--ngx-simple-dt-header-border);overflow:hidden;height:var(--ngx-simple-dt-header-height);color:var(--ngx-simple-dt-header-text)}.dynamic-table-container .table-header .header-row{display:flex;min-width:100%;position:relative;height:100%}.dynamic-table-container .table-header .header-row .frozen-left,.dynamic-table-container .table-header .header-row .frozen-right{position:sticky;z-index:12;background:var(--ngx-simple-dt-header-bg);display:flex;box-shadow:2px 0 8px #0000000d;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .frozen-left{left:0;border-right:var(--ngx-simple-dt-header-border)}.dynamic-table-container .table-header .header-row .center-columns{display:flex;flex:1}.dynamic-table-container .table-header .header-row .frozen-right{right:0;border-left:var(--ngx-simple-dt-header-border)}.dynamic-table-container .table-header .header-row .header-cell{display:flex;align-items:center;justify-content:space-between;padding:var(--ngx-simple-dt-cell-padding);border-right:var(--ngx-simple-dt-cell-border);background:inherit;font-weight:var(--ngx-simple-dt-header-font-weight);position:relative;min-width:0;font-size:var(--ngx-simple-dt-cell-font-size);line-height:var(--ngx-simple-dt-cell-line-height);color:inherit;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell.sortable:hover{background:var(--ngx-simple-dt-header-hover-bg)}.dynamic-table-container .table-header .header-row .header-cell.sortable:active{background:var(--ngx-simple-dt-cell-active-bg)}.dynamic-table-container .table-header .header-row .header-cell .header-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dynamic-table-container .table-header .header-row .header-cell .sort-icon{margin-left:8px;font-size:12px;color:#6c757d;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell .sort-icon.sort-asc,.dynamic-table-container .table-header .header-row .header-cell .sort-icon.sort-desc{color:#0d6efd}.dynamic-table-container .table-header .header-row .header-cell .resize-handle{position:absolute;right:0;top:0;bottom:0;width:4px;cursor:col-resize;background:transparent;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell .resize-handle:hover,.dynamic-table-container .table-header .header-row .header-cell .resize-handle:active{background:#0d6efd}.dynamic-table-container .table-body{position:relative;flex:1;overflow:auto;scrollbar-width:thin;scrollbar-color:#ced4da #f8f9fa}.dynamic-table-container .table-body::-webkit-scrollbar{width:8px;height:8px}.dynamic-table-container .table-body::-webkit-scrollbar-track{background:#f8f9fa;scroll-margin-left:100px}.dynamic-table-container .table-body::-webkit-scrollbar-thumb{background-color:#ced4da;border-radius:4px}.dynamic-table-container .table-body::-webkit-scrollbar-thumb:hover{background-color:#adb5bd}.dynamic-table-container .table-body{-webkit-overflow-scrolling:touch}.dynamic-table-container .table-body .virtual-spacer{position:absolute;top:0;left:0;width:1px;pointer-events:none}.dynamic-table-container .table-body .visible-rows{position:absolute;top:0;left:0;right:0;min-width:fit-content}.dynamic-table-container .table-body .visible-rows .table-row{display:flex;min-width:100%;border-bottom:var(--ngx-simple-dt-row-border);background:var(--ngx-simple-dt-row-bg);transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-body .visible-rows .table-row:nth-child(2n){background:var(--ngx-simple-dt-row-stripe-bg)}.dynamic-table-container .table-body .visible-rows .table-row:hover{background:var(--ngx-simple-dt-row-hover-bg)}.dynamic-table-container .table-body .visible-rows .table-row:active{background:var(--ngx-simple-dt-row-active-bg)}.dynamic-table-container .table-body .visible-rows .table-row .frozen-left{position:sticky;left:0;z-index:5;background:#fff;border-right:2px solid #ccc;display:flex}.table-row:hover .dynamic-table-container .table-body .visible-rows .table-row .frozen-left{background:#f9f9f9}.dynamic-table-container .table-body .visible-rows .table-row .center-columns{display:flex;flex:0 0 auto}.dynamic-table-container .table-body .visible-rows .table-row .frozen-right{position:sticky;right:0;z-index:5;background:#fff;border-left:2px solid #ccc;display:flex}.table-row:hover .dynamic-table-container .table-body .visible-rows .table-row .frozen-right{background:#f9f9f9}.dynamic-table-container .table-body .visible-rows .table-row .table-cell{padding:var(--ngx-simple-dt-cell-padding);border-right:var(--ngx-simple-dt-cell-border);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--ngx-simple-dt-cell-font-size);line-height:var(--ngx-simple-dt-cell-line-height);display:flex;align-items:center;transition:var(--ngx-simple-dt-transition);min-width:0}.dynamic-table-container .frozen-left .table-cell,.dynamic-table-container .frozen-right .table-cell{background:inherit;box-shadow:2px 0 8px #0000000d}@media(max-width:768px){.dynamic-table-container{font-size:14px}.dynamic-table-container .header-cell,.dynamic-table-container .table-cell{padding:0 8px}}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
460
460
|
}
|
|
461
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
461
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgxSimpleDatatablesComponent, decorators: [{
|
|
462
462
|
type: Component,
|
|
463
|
-
args: [{ selector: "ngx-simple-datatables", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"dynamic-table-container\" #tableContainer>\n <!-- Sticky Header -->\n <div class=\"table-header\" [style.height.px]=\"headerHeight\">\n <div class=\"header-row\" #headerRow (scroll)=\"onHeaderScroll($event)\">\n <!-- Left Frozen Columns -->\n <div class=\"frozen-left\" [style.width.px]=\"getLeftFrozenWidth()\" *ngIf=\"leftFrozenColumns.length > 0\"\n role=\"presentation\">\n <div class=\"header-cell\"\n *ngFor=\"let column of leftFrozenColumns; trackBy: trackByColumnField; let colIndex = index\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\"\n [class.sort-asc]=\"sortState.field === column.field && sortState.direction === 'asc'\"\n [class.sort-desc]=\"sortState.field === column.field && sortState.direction === 'desc'\"\n [attr.role]=\"'columnheader'\" [attr.aria-sort]=\"getAriaSort(column)\" [attr.aria-colindex]=\"colIndex + 1\"\n [attr.aria-label]=\"column.header + (column.sortable ? ' (click to sort)' : '')\" (click)=\"onSort(column)\"\n (keydown.enter)=\"onSort(column)\" (keydown.space)=\"onSort(column); $event.preventDefault()\"\n [tabindex]=\"column.sortable ? '0' : '-1'\" [attr.data-column-id]=\"column.field\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\" [ngTemplateOutletContext]=\"{ column: column }\">\n </ng-container>\n\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n\n <!-- Center Scrollable Columns -->\n <div class=\"center-columns\" #headeCenterRow role=\"presentation\" [ngStyle]=\"{'transform': headerTransform}\">\n <div class=\"header-cell\" *ngFor=\"let column of centerColumns; trackBy: trackByColumnField; let colIndex = index\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\"\n [class.sort-asc]=\"sortState.field === column.field && sortState.direction === 'asc'\"\n [class.sort-desc]=\"sortState.field === column.field && sortState.direction === 'desc'\"\n [attr.role]=\"'columnheader'\" [attr.aria-sort]=\"getAriaSort(column)\"\n [attr.aria-colindex]=\"leftFrozenColumns.length + colIndex + 1\"\n [attr.aria-label]=\"column.header + (column.sortable ? ' (click to sort)' : '')\" (click)=\"onSort(column)\"\n (keydown.enter)=\"onSort(column)\" (keydown.space)=\"onSort(column); $event.preventDefault()\"\n [tabindex]=\"column.sortable ? '0' : '-1'\" [attr.data-column-id]=\"column.field\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\"\n [ngTemplateOutletContext]=\"{ column: column }\"></ng-container>\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n\n <!-- Right Frozen Columns -->\n <div class=\"frozen-right\" [style.width.px]=\"getRightFrozenWidth()\" *ngIf=\"rightFrozenColumns.length > 0\">\n <div class=\"header-cell\" *ngFor=\"let column of rightFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\" (click)=\"onSort(column)\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\"\n [ngTemplateOutletContext]=\"{ column: column }\"></ng-container>\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Table Body with Virtual Scrolling -->\n <div class=\"table-body\" #tableBody [style.height]=\"'calc(100% - ' + headerHeight + 'px)'\"\n (scroll)=\"onBodyScroll($event)\">\n <!-- Virtual spacer for total height -->\n <div class=\"virtual-spacer\" [style.height.px]=\"totalHeight\"></div>\n\n <!-- Visible rows container -->\n <div class=\"visible-rows\" [style.transform]=\"'translateY(' + offsetY + 'px)'\">\n <div class=\"table-row\" *ngFor=\"let row of visibleRows; let i = index; trackBy: trackByRowIndex\"\n [style.height.px]=\"rowHeight\">\n\n <!-- Left Frozen Columns -->\n <div class=\"frozen-left\" [style.width.px]=\"getLeftFrozenWidth()\" *ngIf=\"leftFrozenColumns.length > 0\">\n <div class=\"table-cell\" *ngFor=\"let column of leftFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n\n <!-- Center Scrollable Columns -->\n <div class=\"center-columns\">\n <div class=\"table-cell\" *ngFor=\"let column of centerColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n\n <!-- Right Frozen Columns -->\n <div class=\"frozen-right\" [style.width.px]=\"getRightFrozenWidth()\" *ngIf=\"rightFrozenColumns.length > 0\">\n <div class=\"table-cell\" *ngFor=\"let column of rightFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>", styles: [":root{--ngx-simple-dt-bg: #ffffff;--ngx-simple-dt-border: 1px solid #e0e0e0;--ngx-simple-dt-border-radius: 8px;--ngx-simple-dt-box-shadow: 0 2px 8px rgba(0, 0, 0, .1);--ngx-simple-dt-transition: all .2s ease-in-out;--ngx-simple-dt-header-bg: #f8f9fa;--ngx-simple-dt-header-hover-bg: #e9ecef;--ngx-simple-dt-header-border: 1px solid #e0e0e0;--ngx-simple-dt-header-text: #495057;--ngx-simple-dt-header-height: 98px;--ngx-simple-dt-header-font-weight: 600;--ngx-simple-dt-header-padding: 0 16px;--ngx-simple-dt-cell-hover-bg: #f1f3f5;--ngx-simple-dt-cell-active-bg: #e9ecef;--ngx-simple-dt-row-height: 48px;--ngx-simple-dt-cell-padding: 0 16px;--ngx-simple-dt-cell-border: 1px solid #e9ecef;--ngx-simple-dt-cell-font-size: .875rem;--ngx-simple-dt-cell-line-height: 1.5;--ngx-simple-dt-row-bg: #ffffff;--ngx-simple-dt-row-hover-bg: #f8f9fa;--ngx-simple-dt-row-stripe-bg: #f8f9fa;--ngx-simple-dt-row-active-bg: #e9ecef;--ngx-simple-dt-row-border: 1px solid #e9ecef}.dynamic-table-container{width:100%;height:100%;position:relative;display:flex;flex-direction:column;overflow:hidden;background:var(--ngx-simple-dt-bg);border:var(--ngx-simple-dt-border);border-radius:var(--ngx-simple-dt-border-radius);box-shadow:var(--ngx-simple-dt-box-shadow);transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header{position:sticky;top:0;z-index:10;background:var(--ngx-simple-dt-header-bg);border-bottom:var(--ngx-simple-dt-header-border);overflow:hidden;height:var(--ngx-simple-dt-header-height);color:var(--ngx-simple-dt-header-text)}.dynamic-table-container .table-header .header-row{display:flex;min-width:100%;position:relative;height:100%}.dynamic-table-container .table-header .header-row .frozen-left,.dynamic-table-container .table-header .header-row .frozen-right{position:sticky;z-index:12;background:var(--ngx-simple-dt-header-bg);display:flex;box-shadow:2px 0 8px #0000000d;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .frozen-left{left:0;border-right:var(--ngx-simple-dt-header-border)}.dynamic-table-container .table-header .header-row .center-columns{display:flex;flex:1}.dynamic-table-container .table-header .header-row .frozen-right{right:0;border-left:var(--ngx-simple-dt-header-border)}.dynamic-table-container .table-header .header-row .header-cell{display:flex;align-items:center;justify-content:space-between;padding:var(--ngx-simple-dt-cell-padding);border-right:var(--ngx-simple-dt-cell-border);background:inherit;font-weight:var(--ngx-simple-dt-header-font-weight);position:relative;min-width:0;font-size:var(--ngx-simple-dt-cell-font-size);line-height:var(--ngx-simple-dt-cell-line-height);color:inherit;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell.sortable:hover{background:var(--ngx-simple-dt-header-hover-bg)}.dynamic-table-container .table-header .header-row .header-cell.sortable:active{background:var(--ngx-simple-dt-cell-active-bg)}.dynamic-table-container .table-header .header-row .header-cell .header-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dynamic-table-container .table-header .header-row .header-cell .sort-icon{margin-left:8px;font-size:12px;color:#6c757d;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell .sort-icon.sort-asc,.dynamic-table-container .table-header .header-row .header-cell .sort-icon.sort-desc{color:#0d6efd}.dynamic-table-container .table-header .header-row .header-cell .resize-handle{position:absolute;right:0;top:0;bottom:0;width:4px;cursor:col-resize;background:transparent;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell .resize-handle:hover,.dynamic-table-container .table-header .header-row .header-cell .resize-handle:active{background:#0d6efd}.dynamic-table-container .table-body{position:relative;flex:1;overflow:auto;scrollbar-width:thin;scrollbar-color:#ced4da #f8f9fa;-webkit-overflow-scrolling:touch}.dynamic-table-container .table-body::-webkit-scrollbar{width:8px;height:8px}.dynamic-table-container .table-body::-webkit-scrollbar-track{background:#f8f9fa;scroll-margin-left:100px}.dynamic-table-container .table-body::-webkit-scrollbar-thumb{background-color:#ced4da;border-radius:4px}.dynamic-table-container .table-body::-webkit-scrollbar-thumb:hover{background-color:#adb5bd}.dynamic-table-container .table-body .virtual-spacer{position:absolute;top:0;left:0;width:1px;pointer-events:none}.dynamic-table-container .table-body .visible-rows{position:absolute;top:0;left:0;right:0;min-width:fit-content}.dynamic-table-container .table-body .visible-rows .table-row{display:flex;min-width:100%;border-bottom:var(--ngx-simple-dt-row-border);background:var(--ngx-simple-dt-row-bg);transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-body .visible-rows .table-row:nth-child(2n){background:var(--ngx-simple-dt-row-stripe-bg)}.dynamic-table-container .table-body .visible-rows .table-row:hover{background:var(--ngx-simple-dt-row-hover-bg)}.dynamic-table-container .table-body .visible-rows .table-row:active{background:var(--ngx-simple-dt-row-active-bg)}.dynamic-table-container .table-body .visible-rows .table-row .frozen-left{position:sticky;left:0;z-index:5;background:#fff;border-right:2px solid #ccc;display:flex}.table-row:hover .dynamic-table-container .table-body .visible-rows .table-row .frozen-left{background:#f9f9f9}.dynamic-table-container .table-body .visible-rows .table-row .center-columns{display:flex;flex:0 0 auto}.dynamic-table-container .table-body .visible-rows .table-row .frozen-right{position:sticky;right:0;z-index:5;background:#fff;border-left:2px solid #ccc;display:flex}.table-row:hover .dynamic-table-container .table-body .visible-rows .table-row .frozen-right{background:#f9f9f9}.dynamic-table-container .table-body .visible-rows .table-row .table-cell{padding:var(--ngx-simple-dt-cell-padding);border-right:var(--ngx-simple-dt-cell-border);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--ngx-simple-dt-cell-font-size);line-height:var(--ngx-simple-dt-cell-line-height);display:flex;align-items:center;transition:var(--ngx-simple-dt-transition);min-width:0}.dynamic-table-container .frozen-left .table-cell,.dynamic-table-container .frozen-right .table-cell{background:inherit;box-shadow:2px 0 8px #0000000d}@media (max-width: 768px){.dynamic-table-container{font-size:14px}.dynamic-table-container .header-cell,.dynamic-table-container .table-cell{padding:0 8px}}\n"] }]
|
|
463
|
+
args: [{ selector: "ngx-simple-datatables", changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<div class=\"dynamic-table-container\" #tableContainer>\n <!-- Sticky Header -->\n <div class=\"table-header\" [style.height.px]=\"headerHeight\">\n <div class=\"header-row\" #headerRow (scroll)=\"onHeaderScroll($event)\">\n <!-- Left Frozen Columns -->\n <div class=\"frozen-left\" [style.width.px]=\"getLeftFrozenWidth()\" *ngIf=\"leftFrozenColumns.length > 0\"\n role=\"presentation\">\n <div class=\"header-cell\"\n *ngFor=\"let column of leftFrozenColumns; trackBy: trackByColumnField; let colIndex = index\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\"\n [class.sort-asc]=\"sortState.field === column.field && sortState.direction === 'asc'\"\n [class.sort-desc]=\"sortState.field === column.field && sortState.direction === 'desc'\"\n [attr.role]=\"'columnheader'\" [attr.aria-sort]=\"getAriaSort(column)\" [attr.aria-colindex]=\"colIndex + 1\"\n [attr.aria-label]=\"column.header + (column.sortable ? ' (click to sort)' : '')\" (click)=\"onSort(column)\"\n (keydown.enter)=\"onSort(column)\" (keydown.space)=\"onSort(column); $event.preventDefault()\"\n [tabindex]=\"column.sortable ? '0' : '-1'\" [attr.data-column-id]=\"column.field\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\" [ngTemplateOutletContext]=\"{ column: column }\">\n </ng-container>\n\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n\n <!-- Center Scrollable Columns -->\n <div class=\"center-columns\" #headeCenterRow role=\"presentation\" [ngStyle]=\"{'transform': headerTransform}\">\n <div class=\"header-cell\" *ngFor=\"let column of centerColumns; trackBy: trackByColumnField; let colIndex = index\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\"\n [class.sort-asc]=\"sortState.field === column.field && sortState.direction === 'asc'\"\n [class.sort-desc]=\"sortState.field === column.field && sortState.direction === 'desc'\"\n [attr.role]=\"'columnheader'\" [attr.aria-sort]=\"getAriaSort(column)\"\n [attr.aria-colindex]=\"leftFrozenColumns.length + colIndex + 1\"\n [attr.aria-label]=\"column.header + (column.sortable ? ' (click to sort)' : '')\" (click)=\"onSort(column)\"\n (keydown.enter)=\"onSort(column)\" (keydown.space)=\"onSort(column); $event.preventDefault()\"\n [tabindex]=\"column.sortable ? '0' : '-1'\" [attr.data-column-id]=\"column.field\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\"\n [ngTemplateOutletContext]=\"{ column: column }\"></ng-container>\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n\n <!-- Right Frozen Columns -->\n <div class=\"frozen-right\" [style.width.px]=\"getRightFrozenWidth()\" *ngIf=\"rightFrozenColumns.length > 0\">\n <div class=\"header-cell\" *ngFor=\"let column of rightFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\" (click)=\"onSort(column)\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\"\n [ngTemplateOutletContext]=\"{ column: column }\"></ng-container>\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Table Body with Virtual Scrolling -->\n <div class=\"table-body\" #tableBody [style.height]=\"'calc(100% - ' + headerHeight + 'px)'\"\n (scroll)=\"onBodyScroll($event)\">\n <!-- Virtual spacer for total height -->\n <div class=\"virtual-spacer\" [style.height.px]=\"totalHeight\"></div>\n\n <!-- Visible rows container -->\n <div class=\"visible-rows\" [style.transform]=\"'translateY(' + offsetY + 'px)'\">\n <div class=\"table-row\" *ngFor=\"let row of visibleRows; let i = index; trackBy: trackByRowIndex\"\n [style.height.px]=\"rowHeight\">\n\n <!-- Left Frozen Columns -->\n <div class=\"frozen-left\" [style.width.px]=\"getLeftFrozenWidth()\" *ngIf=\"leftFrozenColumns.length > 0\">\n <div class=\"table-cell\" *ngFor=\"let column of leftFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n\n <!-- Center Scrollable Columns -->\n <div class=\"center-columns\">\n <div class=\"table-cell\" *ngFor=\"let column of centerColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n\n <!-- Right Frozen Columns -->\n <div class=\"frozen-right\" [style.width.px]=\"getRightFrozenWidth()\" *ngIf=\"rightFrozenColumns.length > 0\">\n <div class=\"table-cell\" *ngFor=\"let column of rightFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>", styles: [":root{--ngx-simple-dt-bg: #ffffff;--ngx-simple-dt-border: 1px solid #e0e0e0;--ngx-simple-dt-border-radius: 8px;--ngx-simple-dt-box-shadow: 0 2px 8px rgba(0, 0, 0, .1);--ngx-simple-dt-transition: all .2s ease-in-out;--ngx-simple-dt-header-bg: #f8f9fa;--ngx-simple-dt-header-hover-bg: #e9ecef;--ngx-simple-dt-header-border: 1px solid #e0e0e0;--ngx-simple-dt-header-text: #495057;--ngx-simple-dt-header-height: 98px;--ngx-simple-dt-header-font-weight: 600;--ngx-simple-dt-header-padding: 0 16px;--ngx-simple-dt-cell-hover-bg: #f1f3f5;--ngx-simple-dt-cell-active-bg: #e9ecef;--ngx-simple-dt-row-height: 48px;--ngx-simple-dt-cell-padding: 0 16px;--ngx-simple-dt-cell-border: 1px solid #e9ecef;--ngx-simple-dt-cell-font-size: .875rem;--ngx-simple-dt-cell-line-height: 1.5;--ngx-simple-dt-row-bg: #ffffff;--ngx-simple-dt-row-hover-bg: #f8f9fa;--ngx-simple-dt-row-stripe-bg: #f8f9fa;--ngx-simple-dt-row-active-bg: #e9ecef;--ngx-simple-dt-row-border: 1px solid #e9ecef}.dynamic-table-container{width:100%;height:100%;position:relative;display:flex;flex-direction:column;overflow:hidden;background:var(--ngx-simple-dt-bg);border:var(--ngx-simple-dt-border);border-radius:var(--ngx-simple-dt-border-radius);box-shadow:var(--ngx-simple-dt-box-shadow);transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header{position:sticky;top:0;z-index:10;background:var(--ngx-simple-dt-header-bg);border-bottom:var(--ngx-simple-dt-header-border);overflow:hidden;height:var(--ngx-simple-dt-header-height);color:var(--ngx-simple-dt-header-text)}.dynamic-table-container .table-header .header-row{display:flex;min-width:100%;position:relative;height:100%}.dynamic-table-container .table-header .header-row .frozen-left,.dynamic-table-container .table-header .header-row .frozen-right{position:sticky;z-index:12;background:var(--ngx-simple-dt-header-bg);display:flex;box-shadow:2px 0 8px #0000000d;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .frozen-left{left:0;border-right:var(--ngx-simple-dt-header-border)}.dynamic-table-container .table-header .header-row .center-columns{display:flex;flex:1}.dynamic-table-container .table-header .header-row .frozen-right{right:0;border-left:var(--ngx-simple-dt-header-border)}.dynamic-table-container .table-header .header-row .header-cell{display:flex;align-items:center;justify-content:space-between;padding:var(--ngx-simple-dt-cell-padding);border-right:var(--ngx-simple-dt-cell-border);background:inherit;font-weight:var(--ngx-simple-dt-header-font-weight);position:relative;min-width:0;font-size:var(--ngx-simple-dt-cell-font-size);line-height:var(--ngx-simple-dt-cell-line-height);color:inherit;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell.sortable:hover{background:var(--ngx-simple-dt-header-hover-bg)}.dynamic-table-container .table-header .header-row .header-cell.sortable:active{background:var(--ngx-simple-dt-cell-active-bg)}.dynamic-table-container .table-header .header-row .header-cell .header-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dynamic-table-container .table-header .header-row .header-cell .sort-icon{margin-left:8px;font-size:12px;color:#6c757d;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell .sort-icon.sort-asc,.dynamic-table-container .table-header .header-row .header-cell .sort-icon.sort-desc{color:#0d6efd}.dynamic-table-container .table-header .header-row .header-cell .resize-handle{position:absolute;right:0;top:0;bottom:0;width:4px;cursor:col-resize;background:transparent;transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-header .header-row .header-cell .resize-handle:hover,.dynamic-table-container .table-header .header-row .header-cell .resize-handle:active{background:#0d6efd}.dynamic-table-container .table-body{position:relative;flex:1;overflow:auto;scrollbar-width:thin;scrollbar-color:#ced4da #f8f9fa}.dynamic-table-container .table-body::-webkit-scrollbar{width:8px;height:8px}.dynamic-table-container .table-body::-webkit-scrollbar-track{background:#f8f9fa;scroll-margin-left:100px}.dynamic-table-container .table-body::-webkit-scrollbar-thumb{background-color:#ced4da;border-radius:4px}.dynamic-table-container .table-body::-webkit-scrollbar-thumb:hover{background-color:#adb5bd}.dynamic-table-container .table-body{-webkit-overflow-scrolling:touch}.dynamic-table-container .table-body .virtual-spacer{position:absolute;top:0;left:0;width:1px;pointer-events:none}.dynamic-table-container .table-body .visible-rows{position:absolute;top:0;left:0;right:0;min-width:fit-content}.dynamic-table-container .table-body .visible-rows .table-row{display:flex;min-width:100%;border-bottom:var(--ngx-simple-dt-row-border);background:var(--ngx-simple-dt-row-bg);transition:var(--ngx-simple-dt-transition)}.dynamic-table-container .table-body .visible-rows .table-row:nth-child(2n){background:var(--ngx-simple-dt-row-stripe-bg)}.dynamic-table-container .table-body .visible-rows .table-row:hover{background:var(--ngx-simple-dt-row-hover-bg)}.dynamic-table-container .table-body .visible-rows .table-row:active{background:var(--ngx-simple-dt-row-active-bg)}.dynamic-table-container .table-body .visible-rows .table-row .frozen-left{position:sticky;left:0;z-index:5;background:#fff;border-right:2px solid #ccc;display:flex}.table-row:hover .dynamic-table-container .table-body .visible-rows .table-row .frozen-left{background:#f9f9f9}.dynamic-table-container .table-body .visible-rows .table-row .center-columns{display:flex;flex:0 0 auto}.dynamic-table-container .table-body .visible-rows .table-row .frozen-right{position:sticky;right:0;z-index:5;background:#fff;border-left:2px solid #ccc;display:flex}.table-row:hover .dynamic-table-container .table-body .visible-rows .table-row .frozen-right{background:#f9f9f9}.dynamic-table-container .table-body .visible-rows .table-row .table-cell{padding:var(--ngx-simple-dt-cell-padding);border-right:var(--ngx-simple-dt-cell-border);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--ngx-simple-dt-cell-font-size);line-height:var(--ngx-simple-dt-cell-line-height);display:flex;align-items:center;transition:var(--ngx-simple-dt-transition);min-width:0}.dynamic-table-container .frozen-left .table-cell,.dynamic-table-container .frozen-right .table-cell{background:inherit;box-shadow:2px 0 8px #0000000d}@media(max-width:768px){.dynamic-table-container{font-size:14px}.dynamic-table-container .header-cell,.dynamic-table-container .table-cell{padding:0 8px}}\n"] }]
|
|
464
464
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: Object, decorators: [{
|
|
465
465
|
type: Inject,
|
|
466
466
|
args: [PLATFORM_ID]
|
|
@@ -497,11 +497,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
497
497
|
// NgModule wrapper to support Angular 14+ NgModule-based apps
|
|
498
498
|
// This keeps the component standalone while enabling module-style imports.
|
|
499
499
|
class NgxSimpleDatatablesModule {
|
|
500
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
501
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
502
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "
|
|
500
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgxSimpleDatatablesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
501
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.0.6", ngImport: i0, type: NgxSimpleDatatablesModule, declarations: [NgxSimpleDatatablesComponent], imports: [CommonModule], exports: [NgxSimpleDatatablesComponent] }); }
|
|
502
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgxSimpleDatatablesModule, imports: [CommonModule] }); }
|
|
503
503
|
}
|
|
504
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
504
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgxSimpleDatatablesModule, decorators: [{
|
|
505
505
|
type: NgModule,
|
|
506
506
|
args: [{
|
|
507
507
|
declarations: [NgxSimpleDatatablesComponent],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-simple-datatables.mjs","sources":["../../../projects/ngx-simple-datatables/src/lib/ngx-simple-datatables.service.ts","../../../projects/ngx-simple-datatables/src/lib/ngx-simple-datatables.component.ts","../../../projects/ngx-simple-datatables/src/lib/ngx-simple-datatables.component.html","../../../projects/ngx-simple-datatables/src/lib/ngx-simple-datatables.module.ts","../../../projects/ngx-simple-datatables/src/public-api.ts","../../../projects/ngx-simple-datatables/src/ngx-simple-datatables.ts"],"sourcesContent":["import { Injectable } from \"@angular/core\";\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class NgxSimpleDatatablesService {\n constructor() {}\n}\n","import { CommonModule, isPlatformBrowser } from \"@angular/common\";\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Input,\n TrackByFunction,\n ViewChild,\n Inject,\n PLATFORM_ID,\n ContentChild,\n TemplateRef,\n AfterContentInit,\n OnInit,\n OnDestroy,\n NgZone,\n ChangeDetectorRef as CDR,\n} from \"@angular/core\";\nimport { ColumnConfig, SortState } from \"../interfaces/column-config.interface\";\n\n@Component({\n selector: \"ngx-simple-datatables\",\n templateUrl: \"./ngx-simple-datatables.component.html\",\n styleUrls: [\"./ngx-simple-datatables.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgxSimpleDatatablesComponent\n implements OnInit, OnDestroy, AfterContentInit\n{\n @Input() columns: ColumnConfig[] = [];\n @Input() data: any[] = [];\n @Input() rowHeight = 40;\n @Input() headerHeight = 50;\n @Input() bufferSize = 10;\n\n @ViewChild(\"tableContainer\", { static: true })\n tableContainer!: ElementRef<HTMLDivElement>;\n @ViewChild(\"tableBody\", { static: true })\n tableBody!: ElementRef<HTMLDivElement>;\n @ViewChild(\"headerRow\", { static: true })\n headerRow!: ElementRef<HTMLDivElement>;\n @ViewChild(\"headeCenterRow\", { static: true })\n headeCenterRow!: ElementRef<HTMLDivElement>;\n\n @ContentChild(\"headerTemplate\", { static: true })\n headerTemplate!: TemplateRef<any>;\n @ContentChild(\"cellTemplate\", { static: true })\n cellTemplate!: TemplateRef<any>;\n\n // Virtualization properties\n visibleStartIndex = 0;\n visibleEndIndex = 0;\n visibleRows: any[] = [];\n totalHeight = 0;\n offsetY = 0;\n containerHeight = 0;\n\n // Column properties\n leftFrozenColumns: ColumnConfig[] = [];\n centerColumns: ColumnConfig[] = [];\n rightFrozenColumns: ColumnConfig[] = [];\n columnWidths: { [key: string]: number } = {};\n\n // Sorting\n sortState: SortState = { field: \"\", direction: null };\n\n // Resizing\n private isResizing = false;\n private resizingColumn = \"\";\n private startX = 0;\n private startWidth = 0;\n\n // Scroll listeners\n private scrollListener: ((event: Event) => void) | null = null;\n private resizeListener: ((event: Event) => void) | null = null;\n private isBrowser: boolean;\n private storageKey = \"ngx-simple-datatables-column-widths\";\n private scrollRequestId: number | null = null;\n private resizeTimer: ReturnType<typeof setTimeout> | null = null;\n private mouseMoveHandler: ((e: MouseEvent) => void) | null = null;\n private mouseUpHandler: ((e: MouseEvent) => void) | null = null;\n\n constructor(\n private cdr: ChangeDetectorRef,\n @Inject(PLATFORM_ID) private platformId: Object,\n private ngZone: NgZone\n ) {\n this.isBrowser = isPlatformBrowser(this.platformId);\n }\n\n ngOnInit() {\n this.initializeColumns();\n if (this.isBrowser) {\n this.setupEventListeners();\n }\n this.calculateVirtualization();\n }\n\n ngOnDestroy() {\n if (this.isBrowser) {\n this.removeEventListeners();\n\n // Clean up any pending animations or timeouts\n if (this.scrollRequestId) {\n cancelAnimationFrame(this.scrollRequestId);\n }\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer);\n }\n }\n }\n\n ngAfterContentInit() {\n // if (!this.headerTemplate) {\n // throw new Error(\"ngx-simple-datatables requires a headerTemplate.\");\n // }\n // if (!this.cellTemplate) {\n // throw new Error(\"ngx-simple-datatables requires a cellTemplate.\");\n // }\n }\n\n private initializeColumns() {\n this.leftFrozenColumns = this.columns.filter(\n (col) => col.freeze === \"left\"\n );\n this.rightFrozenColumns = this.columns.filter(\n (col) => col.freeze === \"right\"\n );\n this.centerColumns = this.columns.filter((col) => !col.freeze);\n\n // Load saved column widths if available\n const savedWidths = this.loadColumnWidths();\n\n // Initialize column widths\n this.columns.forEach((col) => {\n if (col.width) {\n this.columnWidths[col.field] = Number.parseInt(\n col.width.replace(\"px\", \"\")\n );\n } else if (savedWidths && savedWidths[col.field]) {\n this.columnWidths[col.field] = savedWidths[col.field];\n } else {\n this.columnWidths[col.field] = 150; // default width\n }\n });\n }\n\n private setupEventListeners() {\n // Store references for cleanup\n this.scrollListener = (event: Event) => this.onBodyScroll(event);\n this.resizeListener = () => this.onResize();\n this.mouseMoveHandler = (event: MouseEvent) => this.onMouseMove(event);\n this.mouseUpHandler = (event: MouseEvent) => this.onMouseUp();\n\n // Add event listeners\n if (this.isBrowser) {\n // For the header scroll (horizontal only)\n if (this.headerRow?.nativeElement) {\n this.headerRow.nativeElement.addEventListener(\"scroll\", () =>\n this.onHeaderScroll(null)\n );\n }\n\n // For the body scroll (both vertical and horizontal)\n if (this.tableBody?.nativeElement && this.scrollListener) {\n this.tableBody.nativeElement.addEventListener(\n \"scroll\",\n this.scrollListener\n );\n }\n\n // Window resize and mouse events\n if (this.resizeListener) {\n window.addEventListener(\"resize\", this.resizeListener);\n }\n\n if (this.mouseMoveHandler) {\n document.addEventListener(\"mousemove\", this.mouseMoveHandler);\n }\n\n if (this.mouseUpHandler) {\n document.addEventListener(\"mouseup\", this.mouseUpHandler);\n }\n }\n }\n\n private removeEventListeners() {\n if (this.isBrowser) {\n // Clear any pending animations or timeouts\n if (this.scrollRequestId) {\n cancelAnimationFrame(this.scrollRequestId);\n this.scrollRequestId = null;\n }\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer);\n this.resizeTimer = null;\n }\n\n // Reset all event listeners\n this.scrollListener = null;\n this.resizeListener = null;\n this.mouseMoveHandler = null;\n this.mouseUpHandler = null;\n }\n }\n\n private calculateVirtualization() {\n if (!this.tableContainer || !this.tableBody) return;\n\n // Update container height based on available space\n const container = this.tableBody.nativeElement;\n this.containerHeight = container.clientHeight - this.headerHeight;\n this.totalHeight = this.data.length * this.rowHeight;\n\n // Get scroll position\n const scrollTop = container.scrollTop;\n\n // Calculate visible rows\n const visibleRowCount =\n Math.ceil(this.containerHeight / this.rowHeight) + 1;\n\n // Calculate start and end indices with buffer\n this.visibleStartIndex = Math.max(\n 0,\n Math.floor(scrollTop / this.rowHeight) - this.bufferSize\n );\n\n this.visibleEndIndex = Math.min(\n this.data.length - 1,\n this.visibleStartIndex + visibleRowCount + this.bufferSize * 2\n );\n\n // Update visible rows\n this.visibleRows = this.data.slice(\n this.visibleStartIndex,\n this.visibleEndIndex + 1\n );\n\n console.log(scrollTop, this.visibleStartIndex, this.visibleEndIndex);\n\n // Update vertical offset for virtual scrolling\n this.offsetY = this.visibleStartIndex * this.rowHeight;\n\n // Trigger change detection in the next tick to avoid ExpressionChangedAfterItHasBeenCheckedError\n Promise.resolve().then(() => {\n this.cdr.detectChanges();\n });\n }\n\n // Track last scroll time to prevent feedback loops\n private lastScrollTime = 0;\n private readonly SCROLL_DEBOUNCE = 10; // ms\n\n // Track scroll position for header transform\n public headerTransform = \"translateX(0)\";\n\n // Handle body scroll events\n public onBodyScroll(event: Event) {\n if (!event) return;\n\n const now = Date.now();\n if (now - this.lastScrollTime < this.SCROLL_DEBOUNCE) return;\n this.lastScrollTime = now;\n\n const target = event.target as HTMLElement;\n\n // Sync header scroll with body (horizontally)\n // if (this.headerRow?.nativeElement) {\n // this.headerRow.nativeElement.scrollLeft = target.scrollLeft;\n this.syncHorizontalScroll(target.scrollLeft);\n // }\n\n // Handle virtualization (vertical scrolling)\n if (this.scrollRequestId) {\n cancelAnimationFrame(this.scrollRequestId);\n }\n\n this.scrollRequestId = requestAnimationFrame(() => {\n this.calculateVirtualization();\n this.scrollRequestId = null;\n });\n }\n\n // Handle header scroll events\n public onHeaderScroll(event: Event | null): void {\n if (!event) return;\n const now = Date.now();\n if (now - this.lastScrollTime < this.SCROLL_DEBOUNCE) return;\n this.lastScrollTime = now;\n\n // Sync body scroll with header (horizontally)\n const scrollLeft = (event.target as HTMLElement).scrollLeft;\n if (this.tableBody?.nativeElement) {\n this.tableBody.nativeElement.scrollLeft = scrollLeft;\n }\n }\n\n private onResize() {\n // Debounce resize events for better performance\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer);\n }\n\n this.resizeTimer = setTimeout(() => {\n this.calculateVirtualization();\n this.resizeTimer = null;\n }, 50);\n }\n\n private syncHorizontalScroll(scrollLeft: number) {\n if (!this.tableContainer) return;\n\n // Update the transform value\n this.headerTransform = `translateX(-${scrollLeft}px)`;\n // Trigger change detection\n this.cdr.detectChanges();\n }\n\n // Sorting functionality\n onSort(column: ColumnConfig) {\n if (!column.sortable) return;\n\n if (this.sortState.field === column.field) {\n // Toggle sort direction\n if (this.sortState.direction === \"asc\") {\n this.sortState.direction = \"desc\";\n } else if (this.sortState.direction === \"desc\") {\n this.sortState.direction = null;\n this.sortState.field = \"\";\n } else {\n this.sortState.direction = \"asc\";\n }\n } else {\n this.sortState.field = column.field;\n this.sortState.direction = \"asc\";\n }\n\n this.applySorting();\n }\n\n private applySorting() {\n if (!this.sortState.direction || !this.sortState.field) {\n // Reset to original order if no sorting\n return;\n }\n\n this.data.sort((a, b) => {\n const aValue = a[this.sortState.field];\n const bValue = b[this.sortState.field];\n\n let comparison = 0;\n if (aValue > bValue) comparison = 1;\n if (aValue < bValue) comparison = -1;\n\n return this.sortState.direction === \"desc\" ? -comparison : comparison;\n });\n\n this.calculateVirtualization();\n }\n\n getSortIcon(column: ColumnConfig): string {\n if (!column.sortable || this.sortState.field !== column.field) return \"\";\n if (this.sortState.direction === \"asc\") return \"▲\";\n if (this.sortState.direction === \"desc\") return \"▼\";\n return \"\";\n }\n\n // Column resizing functionality\n onResizeStart(event: MouseEvent, column: ColumnConfig) {\n event.preventDefault();\n this.isResizing = true;\n this.resizingColumn = column.field;\n this.startX = event.clientX;\n this.startWidth = this.columnWidths[column.field];\n\n if (this.isBrowser) {\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n }\n }\n\n private onMouseMove(event: MouseEvent) {\n if (!this.isResizing || !this.resizingColumn) return;\n\n this.ngZone.runOutsideAngular(() => {\n const deltaX = event.clientX - this.startX;\n const newWidth = Math.max(50, this.startWidth + deltaX); // Minimum width of 50px\n\n // Only update if width actually changed\n if (this.columnWidths[this.resizingColumn] !== newWidth) {\n this.columnWidths[this.resizingColumn] = newWidth;\n this.cdr.detectChanges();\n }\n });\n }\n\n private onMouseUp() {\n if (this.isResizing) {\n this.isResizing = false;\n if (this.isBrowser) {\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n // Save column widths when resizing is complete\n this.saveColumnWidths();\n }\n this.resizingColumn = \"\";\n }\n }\n\n // Utility methods\n getColumnWidth(column: ColumnConfig): string {\n return `${this.columnWidths[column.field]}px`;\n }\n\n getCellValue(row: any, column: ColumnConfig): string {\n const value = row[column.field];\n return column.formatter\n ? column.formatter(value, row)\n : value?.toString() || \"\";\n }\n\n getLeftFrozenWidth(): number {\n return this.leftFrozenColumns.reduce(\n (sum, col) => sum + this.columnWidths[col.field],\n 0\n );\n }\n\n getRightFrozenWidth(): number {\n return this.rightFrozenColumns.reduce(\n (sum, col) => sum + this.columnWidths[col.field],\n 0\n );\n }\n\n // TrackBy functions for performance\n trackByRowIndex: TrackByFunction<any> = (index: number) =>\n this.visibleStartIndex + index;\n trackByColumnField: TrackByFunction<ColumnConfig> = (\n index: number,\n column: ColumnConfig\n ) => column.field;\n\n // Accessibility methods\n getAriaSort(column: ColumnConfig): string | null {\n if (this.sortState.field !== column.field || !column.sortable) {\n return null;\n }\n return this.sortState.direction === \"asc\" ? \"ascending\" : \"descending\";\n }\n\n // Keyboard navigation\n onKeydown(event: KeyboardEvent): void {\n if (!this.tableContainer) return;\n\n const { key, ctrlKey, shiftKey } = event;\n const scrollAmount = shiftKey ? 100 : 30; // Larger scroll with shift key\n console.log(key);\n switch (key) {\n case \"ArrowLeft\":\n this.tableContainer.nativeElement.scrollLeft -= scrollAmount;\n break;\n case \"ArrowRight\":\n this.tableContainer.nativeElement.scrollLeft += scrollAmount;\n break;\n case \"ArrowUp\":\n if (ctrlKey) {\n this.tableContainer.nativeElement.scrollTo({\n top: 0,\n behavior: \"smooth\",\n });\n } else {\n this.tableContainer.nativeElement.scrollTop -= scrollAmount;\n }\n break;\n case \"ArrowDown\":\n if (ctrlKey) {\n this.tableContainer.nativeElement.scrollTo({\n top: this.tableContainer.nativeElement.scrollHeight,\n behavior: \"smooth\",\n });\n } else {\n this.tableContainer.nativeElement.scrollTop += scrollAmount;\n }\n break;\n case \"1\":\n if (ctrlKey) {\n this.tableContainer.nativeElement.scrollTo({\n top: 0,\n left: 0,\n behavior: \"smooth\",\n });\n } else {\n this.tableContainer.nativeElement.scrollTo({\n left: 0,\n behavior: \"smooth\",\n });\n }\n break;\n case \"0\":\n if (ctrlKey) {\n this.tableContainer.nativeElement.scrollTo({\n top: this.tableContainer.nativeElement.scrollHeight,\n left: this.tableContainer.nativeElement.scrollWidth,\n behavior: \"smooth\",\n });\n } else {\n this.tableContainer.nativeElement.scrollTo({\n left: this.tableContainer.nativeElement.scrollWidth,\n behavior: \"smooth\",\n });\n }\n break;\n default:\n return; // Exit for other keys\n }\n\n event.preventDefault();\n }\n\n // Save column widths to localStorage\n private saveColumnWidths(): void {\n if (this.isBrowser) {\n try {\n localStorage.setItem(\n this.storageKey,\n JSON.stringify(this.columnWidths)\n );\n } catch (e) {\n console.warn(\"Failed to save column widths to localStorage\", e);\n }\n }\n }\n\n // Load column widths from localStorage\n private loadColumnWidths(): Record<string, number> | null {\n if (!this.isBrowser) return null;\n\n try {\n const saved = localStorage.getItem(this.storageKey);\n return saved ? JSON.parse(saved) : null;\n } catch (e) {\n console.warn(\"Failed to load column widths from localStorage\", e);\n return null;\n }\n }\n\n // Clear saved column widths\n public clearSavedWidths(): void {\n if (this.isBrowser) {\n try {\n localStorage.removeItem(this.storageKey);\n // Reset to default widths\n this.columns.forEach((col) => {\n this.columnWidths[col.field] = col.width\n ? Number.parseInt(col.width.replace(\"px\", \"\"))\n : 150;\n });\n this.cdr.detectChanges();\n } catch (e) {\n console.warn(\"Failed to clear saved column widths\", e);\n }\n }\n }\n}\n","<div class=\"dynamic-table-container\" #tableContainer>\n <!-- Sticky Header -->\n <div class=\"table-header\" [style.height.px]=\"headerHeight\">\n <div class=\"header-row\" #headerRow (scroll)=\"onHeaderScroll($event)\">\n <!-- Left Frozen Columns -->\n <div class=\"frozen-left\" [style.width.px]=\"getLeftFrozenWidth()\" *ngIf=\"leftFrozenColumns.length > 0\"\n role=\"presentation\">\n <div class=\"header-cell\"\n *ngFor=\"let column of leftFrozenColumns; trackBy: trackByColumnField; let colIndex = index\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\"\n [class.sort-asc]=\"sortState.field === column.field && sortState.direction === 'asc'\"\n [class.sort-desc]=\"sortState.field === column.field && sortState.direction === 'desc'\"\n [attr.role]=\"'columnheader'\" [attr.aria-sort]=\"getAriaSort(column)\" [attr.aria-colindex]=\"colIndex + 1\"\n [attr.aria-label]=\"column.header + (column.sortable ? ' (click to sort)' : '')\" (click)=\"onSort(column)\"\n (keydown.enter)=\"onSort(column)\" (keydown.space)=\"onSort(column); $event.preventDefault()\"\n [tabindex]=\"column.sortable ? '0' : '-1'\" [attr.data-column-id]=\"column.field\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\" [ngTemplateOutletContext]=\"{ column: column }\">\n </ng-container>\n\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n\n <!-- Center Scrollable Columns -->\n <div class=\"center-columns\" #headeCenterRow role=\"presentation\" [ngStyle]=\"{'transform': headerTransform}\">\n <div class=\"header-cell\" *ngFor=\"let column of centerColumns; trackBy: trackByColumnField; let colIndex = index\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\"\n [class.sort-asc]=\"sortState.field === column.field && sortState.direction === 'asc'\"\n [class.sort-desc]=\"sortState.field === column.field && sortState.direction === 'desc'\"\n [attr.role]=\"'columnheader'\" [attr.aria-sort]=\"getAriaSort(column)\"\n [attr.aria-colindex]=\"leftFrozenColumns.length + colIndex + 1\"\n [attr.aria-label]=\"column.header + (column.sortable ? ' (click to sort)' : '')\" (click)=\"onSort(column)\"\n (keydown.enter)=\"onSort(column)\" (keydown.space)=\"onSort(column); $event.preventDefault()\"\n [tabindex]=\"column.sortable ? '0' : '-1'\" [attr.data-column-id]=\"column.field\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\"\n [ngTemplateOutletContext]=\"{ column: column }\"></ng-container>\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n\n <!-- Right Frozen Columns -->\n <div class=\"frozen-right\" [style.width.px]=\"getRightFrozenWidth()\" *ngIf=\"rightFrozenColumns.length > 0\">\n <div class=\"header-cell\" *ngFor=\"let column of rightFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\" (click)=\"onSort(column)\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\"\n [ngTemplateOutletContext]=\"{ column: column }\"></ng-container>\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Table Body with Virtual Scrolling -->\n <div class=\"table-body\" #tableBody [style.height]=\"'calc(100% - ' + headerHeight + 'px)'\"\n (scroll)=\"onBodyScroll($event)\">\n <!-- Virtual spacer for total height -->\n <div class=\"virtual-spacer\" [style.height.px]=\"totalHeight\"></div>\n\n <!-- Visible rows container -->\n <div class=\"visible-rows\" [style.transform]=\"'translateY(' + offsetY + 'px)'\">\n <div class=\"table-row\" *ngFor=\"let row of visibleRows; let i = index; trackBy: trackByRowIndex\"\n [style.height.px]=\"rowHeight\">\n\n <!-- Left Frozen Columns -->\n <div class=\"frozen-left\" [style.width.px]=\"getLeftFrozenWidth()\" *ngIf=\"leftFrozenColumns.length > 0\">\n <div class=\"table-cell\" *ngFor=\"let column of leftFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n\n <!-- Center Scrollable Columns -->\n <div class=\"center-columns\">\n <div class=\"table-cell\" *ngFor=\"let column of centerColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n\n <!-- Right Frozen Columns -->\n <div class=\"frozen-right\" [style.width.px]=\"getRightFrozenWidth()\" *ngIf=\"rightFrozenColumns.length > 0\">\n <div class=\"table-cell\" *ngFor=\"let column of rightFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgxSimpleDatatablesComponent } from './ngx-simple-datatables.component';\n\n// NgModule wrapper to support Angular 14+ NgModule-based apps\n// This keeps the component standalone while enabling module-style imports.\n@NgModule({\n declarations: [NgxSimpleDatatablesComponent],\n imports: [CommonModule],\n exports: [NgxSimpleDatatablesComponent],\n})\nexport class NgxSimpleDatatablesModule {}\n","/*\n * Public API Surface of ngx-simple-datatables\n */\n\nexport * from \"./lib/ngx-simple-datatables.service\";\nexport * from \"./lib/ngx-simple-datatables.component\";\nexport * from \"./lib/ngx-simple-datatables.module\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngx-simple-datatables.mjs","sources":["../../../projects/ngx-simple-datatables/src/lib/ngx-simple-datatables.service.ts","../../../projects/ngx-simple-datatables/src/lib/ngx-simple-datatables.component.ts","../../../projects/ngx-simple-datatables/src/lib/ngx-simple-datatables.component.html","../../../projects/ngx-simple-datatables/src/lib/ngx-simple-datatables.module.ts","../../../projects/ngx-simple-datatables/src/public-api.ts","../../../projects/ngx-simple-datatables/src/ngx-simple-datatables.ts"],"sourcesContent":["import { Injectable } from \"@angular/core\";\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class NgxSimpleDatatablesService {\n constructor() {}\n}\n","import { CommonModule, isPlatformBrowser } from \"@angular/common\";\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Input,\n TrackByFunction,\n ViewChild,\n Inject,\n PLATFORM_ID,\n ContentChild,\n TemplateRef,\n AfterContentInit,\n OnInit,\n OnDestroy,\n NgZone,\n ChangeDetectorRef as CDR,\n} from \"@angular/core\";\nimport { ColumnConfig, SortState } from \"../interfaces/column-config.interface\";\n\n@Component({\n selector: \"ngx-simple-datatables\",\n templateUrl: \"./ngx-simple-datatables.component.html\",\n styleUrls: [\"./ngx-simple-datatables.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class NgxSimpleDatatablesComponent\n implements OnInit, OnDestroy, AfterContentInit\n{\n @Input() columns: ColumnConfig[] = [];\n @Input() data: any[] = [];\n @Input() rowHeight = 40;\n @Input() headerHeight = 50;\n @Input() bufferSize = 10;\n\n @ViewChild(\"tableContainer\", { static: true })\n tableContainer!: ElementRef<HTMLDivElement>;\n @ViewChild(\"tableBody\", { static: true })\n tableBody!: ElementRef<HTMLDivElement>;\n @ViewChild(\"headerRow\", { static: true })\n headerRow!: ElementRef<HTMLDivElement>;\n @ViewChild(\"headeCenterRow\", { static: true })\n headeCenterRow!: ElementRef<HTMLDivElement>;\n\n @ContentChild(\"headerTemplate\", { static: true })\n headerTemplate!: TemplateRef<any>;\n @ContentChild(\"cellTemplate\", { static: true })\n cellTemplate!: TemplateRef<any>;\n\n // Virtualization properties\n visibleStartIndex = 0;\n visibleEndIndex = 0;\n visibleRows: any[] = [];\n totalHeight = 0;\n offsetY = 0;\n containerHeight = 0;\n\n // Column properties\n leftFrozenColumns: ColumnConfig[] = [];\n centerColumns: ColumnConfig[] = [];\n rightFrozenColumns: ColumnConfig[] = [];\n columnWidths: { [key: string]: number } = {};\n\n // Sorting\n sortState: SortState = { field: \"\", direction: null };\n\n // Resizing\n private isResizing = false;\n private resizingColumn = \"\";\n private startX = 0;\n private startWidth = 0;\n\n // Scroll listeners\n private scrollListener: ((event: Event) => void) | null = null;\n private resizeListener: ((event: Event) => void) | null = null;\n private isBrowser: boolean;\n private storageKey = \"ngx-simple-datatables-column-widths\";\n private scrollRequestId: number | null = null;\n private resizeTimer: ReturnType<typeof setTimeout> | null = null;\n private mouseMoveHandler: ((e: MouseEvent) => void) | null = null;\n private mouseUpHandler: ((e: MouseEvent) => void) | null = null;\n\n constructor(\n private cdr: ChangeDetectorRef,\n @Inject(PLATFORM_ID) private platformId: Object,\n private ngZone: NgZone\n ) {\n this.isBrowser = isPlatformBrowser(this.platformId);\n }\n\n ngOnInit() {\n this.initializeColumns();\n if (this.isBrowser) {\n this.setupEventListeners();\n }\n this.calculateVirtualization();\n }\n\n ngOnDestroy() {\n if (this.isBrowser) {\n this.removeEventListeners();\n\n // Clean up any pending animations or timeouts\n if (this.scrollRequestId) {\n cancelAnimationFrame(this.scrollRequestId);\n }\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer);\n }\n }\n }\n\n ngAfterContentInit() {\n // if (!this.headerTemplate) {\n // throw new Error(\"ngx-simple-datatables requires a headerTemplate.\");\n // }\n // if (!this.cellTemplate) {\n // throw new Error(\"ngx-simple-datatables requires a cellTemplate.\");\n // }\n }\n\n private initializeColumns() {\n this.leftFrozenColumns = this.columns.filter(\n (col) => col.freeze === \"left\"\n );\n this.rightFrozenColumns = this.columns.filter(\n (col) => col.freeze === \"right\"\n );\n this.centerColumns = this.columns.filter((col) => !col.freeze);\n\n // Load saved column widths if available\n const savedWidths = this.loadColumnWidths();\n\n // Initialize column widths\n this.columns.forEach((col) => {\n if (col.width) {\n this.columnWidths[col.field] = Number.parseInt(\n col.width.replace(\"px\", \"\")\n );\n } else if (savedWidths && savedWidths[col.field]) {\n this.columnWidths[col.field] = savedWidths[col.field];\n } else {\n this.columnWidths[col.field] = 150; // default width\n }\n });\n }\n\n private setupEventListeners() {\n // Store references for cleanup\n this.scrollListener = (event: Event) => this.onBodyScroll(event);\n this.resizeListener = () => this.onResize();\n this.mouseMoveHandler = (event: MouseEvent) => this.onMouseMove(event);\n this.mouseUpHandler = (event: MouseEvent) => this.onMouseUp();\n\n // Add event listeners\n if (this.isBrowser) {\n // For the header scroll (horizontal only)\n if (this.headerRow?.nativeElement) {\n this.headerRow.nativeElement.addEventListener(\"scroll\", () =>\n this.onHeaderScroll(null)\n );\n }\n\n // For the body scroll (both vertical and horizontal)\n if (this.tableBody?.nativeElement && this.scrollListener) {\n this.tableBody.nativeElement.addEventListener(\n \"scroll\",\n this.scrollListener\n );\n }\n\n // Window resize and mouse events\n if (this.resizeListener) {\n window.addEventListener(\"resize\", this.resizeListener);\n }\n\n if (this.mouseMoveHandler) {\n document.addEventListener(\"mousemove\", this.mouseMoveHandler);\n }\n\n if (this.mouseUpHandler) {\n document.addEventListener(\"mouseup\", this.mouseUpHandler);\n }\n }\n }\n\n private removeEventListeners() {\n if (this.isBrowser) {\n // Clear any pending animations or timeouts\n if (this.scrollRequestId) {\n cancelAnimationFrame(this.scrollRequestId);\n this.scrollRequestId = null;\n }\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer);\n this.resizeTimer = null;\n }\n\n // Reset all event listeners\n this.scrollListener = null;\n this.resizeListener = null;\n this.mouseMoveHandler = null;\n this.mouseUpHandler = null;\n }\n }\n\n private calculateVirtualization() {\n if (!this.tableContainer || !this.tableBody) return;\n\n // Update container height based on available space\n const container = this.tableBody.nativeElement;\n this.containerHeight = container.clientHeight - this.headerHeight;\n this.totalHeight = this.data.length * this.rowHeight;\n\n // Get scroll position\n const scrollTop = container.scrollTop;\n\n // Calculate visible rows\n const visibleRowCount =\n Math.ceil(this.containerHeight / this.rowHeight) + 1;\n\n // Calculate start and end indices with buffer\n this.visibleStartIndex = Math.max(\n 0,\n Math.floor(scrollTop / this.rowHeight) - this.bufferSize\n );\n\n this.visibleEndIndex = Math.min(\n this.data.length - 1,\n this.visibleStartIndex + visibleRowCount + this.bufferSize * 2\n );\n\n // Update visible rows\n this.visibleRows = this.data.slice(\n this.visibleStartIndex,\n this.visibleEndIndex + 1\n );\n\n console.log(scrollTop, this.visibleStartIndex, this.visibleEndIndex);\n\n // Update vertical offset for virtual scrolling\n this.offsetY = this.visibleStartIndex * this.rowHeight;\n\n // Trigger change detection in the next tick to avoid ExpressionChangedAfterItHasBeenCheckedError\n Promise.resolve().then(() => {\n this.cdr.detectChanges();\n });\n }\n\n // Track last scroll time to prevent feedback loops\n private lastScrollTime = 0;\n private readonly SCROLL_DEBOUNCE = 10; // ms\n\n // Track scroll position for header transform\n public headerTransform = \"translateX(0)\";\n\n // Handle body scroll events\n public onBodyScroll(event: Event) {\n if (!event) return;\n\n const now = Date.now();\n if (now - this.lastScrollTime < this.SCROLL_DEBOUNCE) return;\n this.lastScrollTime = now;\n\n const target = event.target as HTMLElement;\n\n // Sync header scroll with body (horizontally)\n // if (this.headerRow?.nativeElement) {\n // this.headerRow.nativeElement.scrollLeft = target.scrollLeft;\n this.syncHorizontalScroll(target.scrollLeft);\n // }\n\n // Handle virtualization (vertical scrolling)\n if (this.scrollRequestId) {\n cancelAnimationFrame(this.scrollRequestId);\n }\n\n this.scrollRequestId = requestAnimationFrame(() => {\n this.calculateVirtualization();\n this.scrollRequestId = null;\n });\n }\n\n // Handle header scroll events\n public onHeaderScroll(event: Event | null): void {\n if (!event) return;\n const now = Date.now();\n if (now - this.lastScrollTime < this.SCROLL_DEBOUNCE) return;\n this.lastScrollTime = now;\n\n // Sync body scroll with header (horizontally)\n const scrollLeft = (event.target as HTMLElement).scrollLeft;\n if (this.tableBody?.nativeElement) {\n this.tableBody.nativeElement.scrollLeft = scrollLeft;\n }\n }\n\n private onResize() {\n // Debounce resize events for better performance\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer);\n }\n\n this.resizeTimer = setTimeout(() => {\n this.calculateVirtualization();\n this.resizeTimer = null;\n }, 50);\n }\n\n private syncHorizontalScroll(scrollLeft: number) {\n if (!this.tableContainer) return;\n\n // Update the transform value\n this.headerTransform = `translateX(-${scrollLeft}px)`;\n // Trigger change detection\n this.cdr.detectChanges();\n }\n\n // Sorting functionality\n onSort(column: ColumnConfig) {\n if (!column.sortable) return;\n\n if (this.sortState.field === column.field) {\n // Toggle sort direction\n if (this.sortState.direction === \"asc\") {\n this.sortState.direction = \"desc\";\n } else if (this.sortState.direction === \"desc\") {\n this.sortState.direction = null;\n this.sortState.field = \"\";\n } else {\n this.sortState.direction = \"asc\";\n }\n } else {\n this.sortState.field = column.field;\n this.sortState.direction = \"asc\";\n }\n\n this.applySorting();\n }\n\n private applySorting() {\n if (!this.sortState.direction || !this.sortState.field) {\n // Reset to original order if no sorting\n return;\n }\n\n this.data.sort((a, b) => {\n const aValue = a[this.sortState.field];\n const bValue = b[this.sortState.field];\n\n let comparison = 0;\n if (aValue > bValue) comparison = 1;\n if (aValue < bValue) comparison = -1;\n\n return this.sortState.direction === \"desc\" ? -comparison : comparison;\n });\n\n this.calculateVirtualization();\n }\n\n getSortIcon(column: ColumnConfig): string {\n if (!column.sortable || this.sortState.field !== column.field) return \"\";\n if (this.sortState.direction === \"asc\") return \"▲\";\n if (this.sortState.direction === \"desc\") return \"▼\";\n return \"\";\n }\n\n // Column resizing functionality\n onResizeStart(event: MouseEvent, column: ColumnConfig) {\n event.preventDefault();\n this.isResizing = true;\n this.resizingColumn = column.field;\n this.startX = event.clientX;\n this.startWidth = this.columnWidths[column.field];\n\n if (this.isBrowser) {\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n }\n }\n\n private onMouseMove(event: MouseEvent) {\n if (!this.isResizing || !this.resizingColumn) return;\n\n this.ngZone.runOutsideAngular(() => {\n const deltaX = event.clientX - this.startX;\n const newWidth = Math.max(50, this.startWidth + deltaX); // Minimum width of 50px\n\n // Only update if width actually changed\n if (this.columnWidths[this.resizingColumn] !== newWidth) {\n this.columnWidths[this.resizingColumn] = newWidth;\n this.cdr.detectChanges();\n }\n });\n }\n\n private onMouseUp() {\n if (this.isResizing) {\n this.isResizing = false;\n if (this.isBrowser) {\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n // Save column widths when resizing is complete\n this.saveColumnWidths();\n }\n this.resizingColumn = \"\";\n }\n }\n\n // Utility methods\n getColumnWidth(column: ColumnConfig): string {\n return `${this.columnWidths[column.field]}px`;\n }\n\n getCellValue(row: any, column: ColumnConfig): string {\n const value = row[column.field];\n return column.formatter\n ? column.formatter(value, row)\n : value?.toString() || \"\";\n }\n\n getLeftFrozenWidth(): number {\n return this.leftFrozenColumns.reduce(\n (sum, col) => sum + this.columnWidths[col.field],\n 0\n );\n }\n\n getRightFrozenWidth(): number {\n return this.rightFrozenColumns.reduce(\n (sum, col) => sum + this.columnWidths[col.field],\n 0\n );\n }\n\n // TrackBy functions for performance\n trackByRowIndex: TrackByFunction<any> = (index: number) =>\n this.visibleStartIndex + index;\n trackByColumnField: TrackByFunction<ColumnConfig> = (\n index: number,\n column: ColumnConfig\n ) => column.field;\n\n // Accessibility methods\n getAriaSort(column: ColumnConfig): string | null {\n if (this.sortState.field !== column.field || !column.sortable) {\n return null;\n }\n return this.sortState.direction === \"asc\" ? \"ascending\" : \"descending\";\n }\n\n // Keyboard navigation\n onKeydown(event: KeyboardEvent): void {\n if (!this.tableContainer) return;\n\n const { key, ctrlKey, shiftKey } = event;\n const scrollAmount = shiftKey ? 100 : 30; // Larger scroll with shift key\n console.log(key);\n switch (key) {\n case \"ArrowLeft\":\n this.tableContainer.nativeElement.scrollLeft -= scrollAmount;\n break;\n case \"ArrowRight\":\n this.tableContainer.nativeElement.scrollLeft += scrollAmount;\n break;\n case \"ArrowUp\":\n if (ctrlKey) {\n this.tableContainer.nativeElement.scrollTo({\n top: 0,\n behavior: \"smooth\",\n });\n } else {\n this.tableContainer.nativeElement.scrollTop -= scrollAmount;\n }\n break;\n case \"ArrowDown\":\n if (ctrlKey) {\n this.tableContainer.nativeElement.scrollTo({\n top: this.tableContainer.nativeElement.scrollHeight,\n behavior: \"smooth\",\n });\n } else {\n this.tableContainer.nativeElement.scrollTop += scrollAmount;\n }\n break;\n case \"1\":\n if (ctrlKey) {\n this.tableContainer.nativeElement.scrollTo({\n top: 0,\n left: 0,\n behavior: \"smooth\",\n });\n } else {\n this.tableContainer.nativeElement.scrollTo({\n left: 0,\n behavior: \"smooth\",\n });\n }\n break;\n case \"0\":\n if (ctrlKey) {\n this.tableContainer.nativeElement.scrollTo({\n top: this.tableContainer.nativeElement.scrollHeight,\n left: this.tableContainer.nativeElement.scrollWidth,\n behavior: \"smooth\",\n });\n } else {\n this.tableContainer.nativeElement.scrollTo({\n left: this.tableContainer.nativeElement.scrollWidth,\n behavior: \"smooth\",\n });\n }\n break;\n default:\n return; // Exit for other keys\n }\n\n event.preventDefault();\n }\n\n // Save column widths to localStorage\n private saveColumnWidths(): void {\n if (this.isBrowser) {\n try {\n localStorage.setItem(\n this.storageKey,\n JSON.stringify(this.columnWidths)\n );\n } catch (e) {\n console.warn(\"Failed to save column widths to localStorage\", e);\n }\n }\n }\n\n // Load column widths from localStorage\n private loadColumnWidths(): Record<string, number> | null {\n if (!this.isBrowser) return null;\n\n try {\n const saved = localStorage.getItem(this.storageKey);\n return saved ? JSON.parse(saved) : null;\n } catch (e) {\n console.warn(\"Failed to load column widths from localStorage\", e);\n return null;\n }\n }\n\n // Clear saved column widths\n public clearSavedWidths(): void {\n if (this.isBrowser) {\n try {\n localStorage.removeItem(this.storageKey);\n // Reset to default widths\n this.columns.forEach((col) => {\n this.columnWidths[col.field] = col.width\n ? Number.parseInt(col.width.replace(\"px\", \"\"))\n : 150;\n });\n this.cdr.detectChanges();\n } catch (e) {\n console.warn(\"Failed to clear saved column widths\", e);\n }\n }\n }\n}\n","<div class=\"dynamic-table-container\" #tableContainer>\n <!-- Sticky Header -->\n <div class=\"table-header\" [style.height.px]=\"headerHeight\">\n <div class=\"header-row\" #headerRow (scroll)=\"onHeaderScroll($event)\">\n <!-- Left Frozen Columns -->\n <div class=\"frozen-left\" [style.width.px]=\"getLeftFrozenWidth()\" *ngIf=\"leftFrozenColumns.length > 0\"\n role=\"presentation\">\n <div class=\"header-cell\"\n *ngFor=\"let column of leftFrozenColumns; trackBy: trackByColumnField; let colIndex = index\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\"\n [class.sort-asc]=\"sortState.field === column.field && sortState.direction === 'asc'\"\n [class.sort-desc]=\"sortState.field === column.field && sortState.direction === 'desc'\"\n [attr.role]=\"'columnheader'\" [attr.aria-sort]=\"getAriaSort(column)\" [attr.aria-colindex]=\"colIndex + 1\"\n [attr.aria-label]=\"column.header + (column.sortable ? ' (click to sort)' : '')\" (click)=\"onSort(column)\"\n (keydown.enter)=\"onSort(column)\" (keydown.space)=\"onSort(column); $event.preventDefault()\"\n [tabindex]=\"column.sortable ? '0' : '-1'\" [attr.data-column-id]=\"column.field\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\" [ngTemplateOutletContext]=\"{ column: column }\">\n </ng-container>\n\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n\n <!-- Center Scrollable Columns -->\n <div class=\"center-columns\" #headeCenterRow role=\"presentation\" [ngStyle]=\"{'transform': headerTransform}\">\n <div class=\"header-cell\" *ngFor=\"let column of centerColumns; trackBy: trackByColumnField; let colIndex = index\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\"\n [class.sort-asc]=\"sortState.field === column.field && sortState.direction === 'asc'\"\n [class.sort-desc]=\"sortState.field === column.field && sortState.direction === 'desc'\"\n [attr.role]=\"'columnheader'\" [attr.aria-sort]=\"getAriaSort(column)\"\n [attr.aria-colindex]=\"leftFrozenColumns.length + colIndex + 1\"\n [attr.aria-label]=\"column.header + (column.sortable ? ' (click to sort)' : '')\" (click)=\"onSort(column)\"\n (keydown.enter)=\"onSort(column)\" (keydown.space)=\"onSort(column); $event.preventDefault()\"\n [tabindex]=\"column.sortable ? '0' : '-1'\" [attr.data-column-id]=\"column.field\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\"\n [ngTemplateOutletContext]=\"{ column: column }\"></ng-container>\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n\n <!-- Right Frozen Columns -->\n <div class=\"frozen-right\" [style.width.px]=\"getRightFrozenWidth()\" *ngIf=\"rightFrozenColumns.length > 0\">\n <div class=\"header-cell\" *ngFor=\"let column of rightFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\" [class.sortable]=\"column.sortable\" (click)=\"onSort(column)\">\n <ng-container *ngIf=\"!headerTemplate; else customHeader\">\n <span class=\"header-text\">{{ column.header }}</span>\n </ng-container>\n <ng-template #customHeader>\n <ng-container [ngTemplateOutlet]=\"headerTemplate\"\n [ngTemplateOutletContext]=\"{ column: column }\"></ng-container>\n </ng-template>\n <span class=\"sort-icon\" *ngIf=\"column.sortable\">{{ getSortIcon(column) }}</span>\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, column)\"></div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Table Body with Virtual Scrolling -->\n <div class=\"table-body\" #tableBody [style.height]=\"'calc(100% - ' + headerHeight + 'px)'\"\n (scroll)=\"onBodyScroll($event)\">\n <!-- Virtual spacer for total height -->\n <div class=\"virtual-spacer\" [style.height.px]=\"totalHeight\"></div>\n\n <!-- Visible rows container -->\n <div class=\"visible-rows\" [style.transform]=\"'translateY(' + offsetY + 'px)'\">\n <div class=\"table-row\" *ngFor=\"let row of visibleRows; let i = index; trackBy: trackByRowIndex\"\n [style.height.px]=\"rowHeight\">\n\n <!-- Left Frozen Columns -->\n <div class=\"frozen-left\" [style.width.px]=\"getLeftFrozenWidth()\" *ngIf=\"leftFrozenColumns.length > 0\">\n <div class=\"table-cell\" *ngFor=\"let column of leftFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n\n <!-- Center Scrollable Columns -->\n <div class=\"center-columns\">\n <div class=\"table-cell\" *ngFor=\"let column of centerColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n\n <!-- Right Frozen Columns -->\n <div class=\"frozen-right\" [style.width.px]=\"getRightFrozenWidth()\" *ngIf=\"rightFrozenColumns.length > 0\">\n <div class=\"table-cell\" *ngFor=\"let column of rightFrozenColumns; trackBy: trackByColumnField\"\n [style.width]=\"getColumnWidth(column)\">\n <ng-container *ngIf=\"!cellTemplate; else customCell\">\n {{ getCellValue(row, column) }}\n </ng-container>\n <ng-template #customCell>\n <ng-container [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ row: row, column: column }\"></ng-container>\n </ng-template>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgxSimpleDatatablesComponent } from './ngx-simple-datatables.component';\n\n// NgModule wrapper to support Angular 14+ NgModule-based apps\n// This keeps the component standalone while enabling module-style imports.\n@NgModule({\n declarations: [NgxSimpleDatatablesComponent],\n imports: [CommonModule],\n exports: [NgxSimpleDatatablesComponent],\n})\nexport class NgxSimpleDatatablesModule {}\n","/*\n * Public API Surface of ngx-simple-datatables\n */\n\nexport * from \"./lib/ngx-simple-datatables.service\";\nexport * from \"./lib/ngx-simple-datatables.component\";\nexport * from \"./lib/ngx-simple-datatables.module\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ngx-simple-datatables",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.21.0",
|
|
4
4
|
"description": "🚀 High-performance Angular Data Table Component with Virtual Scrolling, Sorting, Filtering, and Customizable Templates. Perfect for enterprise applications.",
|
|
5
5
|
"author": "Rintu raj C",
|
|
6
6
|
"license": "MIT",
|
|
@@ -19,11 +19,11 @@
|
|
|
19
19
|
"sorting",
|
|
20
20
|
"filtering",
|
|
21
21
|
"pagination",
|
|
22
|
-
"
|
|
22
|
+
"angular21"
|
|
23
23
|
],
|
|
24
24
|
"peerDependencies": {
|
|
25
|
-
"@angular/common": ">=
|
|
26
|
-
"@angular/core": ">=
|
|
25
|
+
"@angular/common": ">=19.0.0 <22",
|
|
26
|
+
"@angular/core": ">=19.0.0 <22"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"tslib": "^2.3.0"
|
|
@@ -34,15 +34,13 @@
|
|
|
34
34
|
"url": "https://github.com/rinturaj/ngx-simple-datatables/issues"
|
|
35
35
|
},
|
|
36
36
|
"module": "fesm2022/ngx-simple-datatables.mjs",
|
|
37
|
-
"typings": "
|
|
37
|
+
"typings": "types/ngx-simple-datatables.d.ts",
|
|
38
38
|
"exports": {
|
|
39
39
|
"./package.json": {
|
|
40
40
|
"default": "./package.json"
|
|
41
41
|
},
|
|
42
42
|
".": {
|
|
43
|
-
"types": "./
|
|
44
|
-
"esm2022": "./esm2022/ngx-simple-datatables.mjs",
|
|
45
|
-
"esm": "./esm2022/ngx-simple-datatables.mjs",
|
|
43
|
+
"types": "./types/ngx-simple-datatables.d.ts",
|
|
46
44
|
"default": "./fesm2022/ngx-simple-datatables.mjs"
|
|
47
45
|
}
|
|
48
46
|
}
|
|
@@ -1,7 +1,27 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import * as
|
|
4
|
-
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { OnInit, OnDestroy, AfterContentInit, ElementRef, TemplateRef, ChangeDetectorRef, NgZone, TrackByFunction } from '@angular/core';
|
|
3
|
+
import * as i2 from '@angular/common';
|
|
4
|
+
|
|
5
|
+
declare class NgxSimpleDatatablesService {
|
|
6
|
+
constructor();
|
|
7
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgxSimpleDatatablesService, never>;
|
|
8
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<NgxSimpleDatatablesService>;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
interface ColumnConfig {
|
|
12
|
+
field: string;
|
|
13
|
+
header: string;
|
|
14
|
+
width?: string;
|
|
15
|
+
freeze?: "left" | "right";
|
|
16
|
+
sortable?: boolean;
|
|
17
|
+
formatter?: (value: any, row: any) => string;
|
|
18
|
+
}
|
|
19
|
+
interface SortState {
|
|
20
|
+
field: string;
|
|
21
|
+
direction: "asc" | "desc" | null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
declare class NgxSimpleDatatablesComponent implements OnInit, OnDestroy, AfterContentInit {
|
|
5
25
|
private cdr;
|
|
6
26
|
private platformId;
|
|
7
27
|
private ngZone;
|
|
@@ -76,3 +96,11 @@ export declare class NgxSimpleDatatablesComponent implements OnInit, OnDestroy,
|
|
|
76
96
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgxSimpleDatatablesComponent, never>;
|
|
77
97
|
static ɵcmp: i0.ɵɵComponentDeclaration<NgxSimpleDatatablesComponent, "ngx-simple-datatables", never, { "columns": { "alias": "columns"; "required": false; }; "data": { "alias": "data"; "required": false; }; "rowHeight": { "alias": "rowHeight"; "required": false; }; "headerHeight": { "alias": "headerHeight"; "required": false; }; "bufferSize": { "alias": "bufferSize"; "required": false; }; }, {}, ["headerTemplate", "cellTemplate"], never, false, never>;
|
|
78
98
|
}
|
|
99
|
+
|
|
100
|
+
declare class NgxSimpleDatatablesModule {
|
|
101
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgxSimpleDatatablesModule, never>;
|
|
102
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<NgxSimpleDatatablesModule, [typeof NgxSimpleDatatablesComponent], [typeof i2.CommonModule], [typeof NgxSimpleDatatablesComponent]>;
|
|
103
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<NgxSimpleDatatablesModule>;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export { NgxSimpleDatatablesComponent, NgxSimpleDatatablesModule, NgxSimpleDatatablesService };
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLWNvbmZpZy5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2ltcGxlLWRhdGF0YWJsZXMvc3JjL2ludGVyZmFjZXMvY29sdW1uLWNvbmZpZy5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uQ29uZmlnIHtcbiAgZmllbGQ6IHN0cmluZztcbiAgaGVhZGVyOiBzdHJpbmc7XG4gIHdpZHRoPzogc3RyaW5nO1xuICBmcmVlemU/OiBcImxlZnRcIiB8IFwicmlnaHRcIjtcbiAgc29ydGFibGU/OiBib29sZWFuO1xuICBmb3JtYXR0ZXI/OiAodmFsdWU6IGFueSwgcm93OiBhbnkpID0+IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb3J0U3RhdGUge1xuICBmaWVsZDogc3RyaW5nO1xuICBkaXJlY3Rpb246IFwiYXNjXCIgfCBcImRlc2NcIiB8IG51bGw7XG59XG4iXX0=
|