@nova-design-system/nova-angular-19 3.17.0 → 3.18.0-beta.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/dist/nova-components/fesm2022/nova-components.mjs +300 -40
- package/dist/nova-components/fesm2022/nova-components.mjs.map +1 -1
- package/dist/nova-components/lib/components/index.d.ts +1 -0
- package/dist/nova-components/lib/components/nv-datatable-cell.directive.d.ts +37 -0
- package/dist/nova-components/lib/components/nv-datatable.component.d.ts +95 -3
- package/package.json +1 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Component, ChangeDetectionStrategy, untracked, computed, InjectionToken, inject, reflectComponentType, ViewContainerRef, Injectable, KeyValueDiffers, ChangeDetectorRef, OutputEmitterRef, TemplateRef, Type, Injector, runInInjectionContext, effect,
|
|
2
|
+
import { Component, ChangeDetectionStrategy, Directive, Input, untracked, computed, InjectionToken, inject, reflectComponentType, ViewContainerRef, Injectable, KeyValueDiffers, ChangeDetectorRef, OutputEmitterRef, TemplateRef, Type, Injector, runInInjectionContext, effect, Inject, signal, input, viewChild, CUSTOM_ELEMENTS_SCHEMA, ContentChild, ContentChildren, HostListener, NgModule, ElementRef, ViewChildren } from '@angular/core';
|
|
3
3
|
import { __decorate } from 'tslib';
|
|
4
4
|
import { fromEvent, BehaviorSubject } from 'rxjs';
|
|
5
5
|
import * as i2 from '@angular/common';
|
|
6
6
|
import { CommonModule } from '@angular/common';
|
|
7
|
-
import { memo, createTable, getCoreRowModel } from '@tanstack/table-core';
|
|
7
|
+
import { memo, createTable, getCoreRowModel, getPaginationRowModel } from '@tanstack/table-core';
|
|
8
8
|
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
9
9
|
export * from '@nova-design-system/nova-webcomponents/constants';
|
|
10
10
|
|
|
@@ -1330,6 +1330,41 @@ const DIRECTIVES = [
|
|
|
1330
1330
|
NvTooltip
|
|
1331
1331
|
];
|
|
1332
1332
|
|
|
1333
|
+
/**
|
|
1334
|
+
* Directive to mark ng-templates as cell templates for specific fields.
|
|
1335
|
+
*
|
|
1336
|
+
* @example
|
|
1337
|
+
* ```html
|
|
1338
|
+
* <nv-datatable [columns]="columns" [rows]="data">
|
|
1339
|
+
* <ng-template nvDatatableCell="name" let-context>
|
|
1340
|
+
* <div class="font-semibold">{{ context.value }}</div>
|
|
1341
|
+
* </ng-template>
|
|
1342
|
+
*
|
|
1343
|
+
* <ng-template nvDatatableCell="price" let-context>
|
|
1344
|
+
* <span class="font-mono">${{ context.value }}</span>
|
|
1345
|
+
* </ng-template>
|
|
1346
|
+
* </nv-datatable>
|
|
1347
|
+
* ```
|
|
1348
|
+
*/
|
|
1349
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1350
|
+
class NvDatatableCellDirective {
|
|
1351
|
+
constructor(template) {
|
|
1352
|
+
this.template = template;
|
|
1353
|
+
}
|
|
1354
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: NvDatatableCellDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
1355
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.1.5", type: NvDatatableCellDirective, isStandalone: true, selector: "ng-template[nvDatatableCell]", inputs: { nvDatatableCell: "nvDatatableCell" }, ngImport: i0 }); }
|
|
1356
|
+
}
|
|
1357
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: NvDatatableCellDirective, decorators: [{
|
|
1358
|
+
type: Directive,
|
|
1359
|
+
args: [{
|
|
1360
|
+
selector: 'ng-template[nvDatatableCell]',
|
|
1361
|
+
standalone: true,
|
|
1362
|
+
}]
|
|
1363
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef }], propDecorators: { nvDatatableCell: [{
|
|
1364
|
+
type: Input,
|
|
1365
|
+
args: [{ required: true }]
|
|
1366
|
+
}] } });
|
|
1367
|
+
|
|
1333
1368
|
/**
|
|
1334
1369
|
* Implementation from @tanstack/angular-query
|
|
1335
1370
|
* {@link https://github.com/TanStack/query/blob/main/packages/angular-query-experimental/src/util/lazy-init/lazy-init.ts}
|
|
@@ -2061,38 +2096,227 @@ function createAngularTable(options) {
|
|
|
2061
2096
|
* Nova Datatable built on TanStack Table (Angular).
|
|
2062
2097
|
*/
|
|
2063
2098
|
class NvDatatable {
|
|
2099
|
+
/** Public getter for table instance. */
|
|
2100
|
+
table() {
|
|
2101
|
+
return this.tableInstance();
|
|
2102
|
+
}
|
|
2064
2103
|
constructor() {
|
|
2065
2104
|
/** Column definitions */
|
|
2066
2105
|
this.columns = input([]);
|
|
2067
2106
|
/** Row data */
|
|
2068
2107
|
this.rows = input([]);
|
|
2108
|
+
/** Optional pagination configuration */
|
|
2109
|
+
this.pagination = input(undefined);
|
|
2110
|
+
/** Should the header stick to the top of the table when scrolling? */
|
|
2111
|
+
this.stickyHeader = input(false);
|
|
2112
|
+
/** Signal to track cell templates array */
|
|
2113
|
+
this.cellTemplatesSignal = signal([]);
|
|
2114
|
+
/** Map of field names to cell templates */
|
|
2115
|
+
this.cellTemplateMap = computed(() => {
|
|
2116
|
+
const map = new Map();
|
|
2117
|
+
this.cellTemplatesSignal().forEach((directive) => {
|
|
2118
|
+
map.set(directive.nvDatatableCell, directive.template);
|
|
2119
|
+
});
|
|
2120
|
+
return map;
|
|
2121
|
+
});
|
|
2122
|
+
/** Pagination state for server mode */
|
|
2123
|
+
this.paginationState = signal({
|
|
2124
|
+
pageIndex: 0,
|
|
2125
|
+
pageSize: this.pagination()?.initialPageSize || 10,
|
|
2126
|
+
});
|
|
2127
|
+
/** Reference to table rows for infinite scroll observer */
|
|
2128
|
+
this.tableRows = viewChild('tableRow');
|
|
2129
|
+
/** Intersection observer for infinite scroll */
|
|
2130
|
+
this.observer = null;
|
|
2131
|
+
/** Helper to check if using infinite scroll */
|
|
2132
|
+
this.isInfiniteScroll = computed(() => this.pagination()?.mode === 'infinite');
|
|
2069
2133
|
/** Computed table columns with proper typing and filtering. */
|
|
2070
|
-
this.tableColumns = computed(() =>
|
|
2071
|
-
|
|
2072
|
-
.
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2077
|
-
|
|
2078
|
-
|
|
2079
|
-
|
|
2134
|
+
this.tableColumns = computed(() => {
|
|
2135
|
+
const templateMap = this.cellTemplateMap();
|
|
2136
|
+
return this.columns()
|
|
2137
|
+
.filter((col) => !col.hidden)
|
|
2138
|
+
.map((col) => ({
|
|
2139
|
+
accessorKey: col.field,
|
|
2140
|
+
header: col.headerName || String(col.field),
|
|
2141
|
+
size: col.width,
|
|
2142
|
+
enableResizing: col.resizable ?? true,
|
|
2143
|
+
cell: (context) => {
|
|
2144
|
+
const fieldName = String(col.field);
|
|
2145
|
+
const cellTemplate = templateMap.get(fieldName);
|
|
2146
|
+
// Priority: template > renderCell > default
|
|
2147
|
+
if (cellTemplate) {
|
|
2148
|
+
// Return TemplateRef directly - FlexRender will handle it
|
|
2149
|
+
return cellTemplate;
|
|
2150
|
+
}
|
|
2151
|
+
// Fall back to renderCell if provided
|
|
2152
|
+
if (col.renderCell) {
|
|
2153
|
+
return col.renderCell(context);
|
|
2154
|
+
}
|
|
2155
|
+
// Default: just return the value
|
|
2156
|
+
return context.getValue();
|
|
2157
|
+
},
|
|
2158
|
+
}));
|
|
2159
|
+
});
|
|
2080
2160
|
/** TanStack table instance with Signals */
|
|
2081
|
-
this.tableInstance = createAngularTable(() =>
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
|
|
2161
|
+
this.tableInstance = createAngularTable(() => {
|
|
2162
|
+
const paginationConfig = this.pagination();
|
|
2163
|
+
if (!paginationConfig || paginationConfig.mode === 'infinite') {
|
|
2164
|
+
// No pagination or infinite scroll - simple config
|
|
2165
|
+
return {
|
|
2166
|
+
data: this.rows(),
|
|
2167
|
+
columns: this.tableColumns(),
|
|
2168
|
+
getCoreRowModel: getCoreRowModel(),
|
|
2169
|
+
};
|
|
2170
|
+
}
|
|
2171
|
+
else if (paginationConfig.mode === 'client') {
|
|
2172
|
+
// Client-side pagination
|
|
2173
|
+
return {
|
|
2174
|
+
data: this.rows(),
|
|
2175
|
+
columns: this.tableColumns(),
|
|
2176
|
+
getCoreRowModel: getCoreRowModel(),
|
|
2177
|
+
getPaginationRowModel: getPaginationRowModel(),
|
|
2178
|
+
initialState: {
|
|
2179
|
+
pagination: {
|
|
2180
|
+
pageIndex: 0,
|
|
2181
|
+
pageSize: paginationConfig.initialPageSize || 10,
|
|
2182
|
+
},
|
|
2183
|
+
},
|
|
2184
|
+
};
|
|
2185
|
+
}
|
|
2186
|
+
else {
|
|
2187
|
+
// Server-side pagination
|
|
2188
|
+
const pageSize = this.paginationState().pageSize;
|
|
2189
|
+
return {
|
|
2190
|
+
data: this.rows(),
|
|
2191
|
+
columns: this.tableColumns(),
|
|
2192
|
+
getCoreRowModel: getCoreRowModel(),
|
|
2193
|
+
manualPagination: true,
|
|
2194
|
+
pageCount: paginationConfig.totalPageCount !== undefined
|
|
2195
|
+
? paginationConfig.totalPageCount
|
|
2196
|
+
: paginationConfig.totalRowCount !== undefined
|
|
2197
|
+
? Math.ceil(paginationConfig.totalRowCount / pageSize)
|
|
2198
|
+
: -1,
|
|
2199
|
+
state: {
|
|
2200
|
+
pagination: this.paginationState(),
|
|
2201
|
+
},
|
|
2202
|
+
onPaginationChange: (updaterOrValue) => {
|
|
2203
|
+
if (typeof updaterOrValue === 'function') {
|
|
2204
|
+
this.paginationState.set(updaterOrValue(this.paginationState()));
|
|
2205
|
+
}
|
|
2206
|
+
else {
|
|
2207
|
+
this.paginationState.set(updaterOrValue);
|
|
2208
|
+
}
|
|
2209
|
+
},
|
|
2210
|
+
};
|
|
2211
|
+
}
|
|
2212
|
+
});
|
|
2213
|
+
/** Build pagination API for template */
|
|
2214
|
+
this.paginationAPI = computed(() => {
|
|
2215
|
+
const paginationConfig = this.pagination();
|
|
2216
|
+
if (!paginationConfig) {
|
|
2217
|
+
return null;
|
|
2218
|
+
}
|
|
2219
|
+
const table = this.table();
|
|
2220
|
+
const tablePaginationState = table.getState().pagination;
|
|
2221
|
+
const pageCount = table.getPageCount();
|
|
2222
|
+
const rowCount = paginationConfig.mode === 'server'
|
|
2223
|
+
? paginationConfig.totalRowCount || this.rows().length
|
|
2224
|
+
: this.rows().length;
|
|
2225
|
+
return {
|
|
2226
|
+
pageIndex: tablePaginationState.pageIndex,
|
|
2227
|
+
pageSize: tablePaginationState.pageSize,
|
|
2228
|
+
pageCount,
|
|
2229
|
+
rowCount,
|
|
2230
|
+
firstPage: () => table.setPageIndex(0),
|
|
2231
|
+
previousPage: () => table.previousPage(),
|
|
2232
|
+
nextPage: () => table.nextPage(),
|
|
2233
|
+
lastPage: () => table.setPageIndex(pageCount - 1),
|
|
2234
|
+
setPageIndex: (index) => table.setPageIndex(index),
|
|
2235
|
+
setPageSize: (size) => table.setPageSize(size),
|
|
2236
|
+
canPreviousPage: table.getCanPreviousPage(),
|
|
2237
|
+
canNextPage: table.getCanNextPage(),
|
|
2238
|
+
isLoading: paginationConfig.mode === 'infinite'
|
|
2239
|
+
? paginationConfig.isLoading
|
|
2240
|
+
: undefined,
|
|
2241
|
+
hasMore: paginationConfig.mode === 'infinite'
|
|
2242
|
+
? paginationConfig.hasMore
|
|
2243
|
+
: undefined,
|
|
2244
|
+
};
|
|
2245
|
+
});
|
|
2246
|
+
// Watch pagination state changes for server mode
|
|
2247
|
+
effect(() => {
|
|
2248
|
+
const paginationConfig = this.pagination();
|
|
2249
|
+
const state = this.paginationState();
|
|
2250
|
+
if (paginationConfig?.mode === 'server' &&
|
|
2251
|
+
paginationConfig.onPaginationChange) {
|
|
2252
|
+
paginationConfig.onPaginationChange({
|
|
2253
|
+
pageIndex: state.pageIndex,
|
|
2254
|
+
pageSize: state.pageSize,
|
|
2255
|
+
});
|
|
2256
|
+
}
|
|
2257
|
+
}, { allowSignalWrites: true });
|
|
2258
|
+
// Set up intersection observer for infinite scroll
|
|
2259
|
+
effect(() => {
|
|
2260
|
+
const paginationConfig = this.pagination();
|
|
2261
|
+
const rows = this.rows(); // Track rows changes
|
|
2262
|
+
// Clean up existing observer
|
|
2263
|
+
if (this.observer) {
|
|
2264
|
+
this.observer.disconnect();
|
|
2265
|
+
this.observer = null;
|
|
2266
|
+
}
|
|
2267
|
+
// Only set up observer for infinite scroll mode
|
|
2268
|
+
if (paginationConfig?.mode !== 'infinite' || rows.length === 0) {
|
|
2269
|
+
return;
|
|
2270
|
+
}
|
|
2271
|
+
// Use setTimeout to ensure DOM is updated
|
|
2272
|
+
setTimeout(() => {
|
|
2273
|
+
const threshold = paginationConfig.loadMoreThreshold || 500;
|
|
2274
|
+
// Find the last row element
|
|
2275
|
+
const tableRowElements = document.querySelectorAll('[data-is-last="true"]');
|
|
2276
|
+
const lastRowElement = tableRowElements[tableRowElements.length - 1];
|
|
2277
|
+
if (!lastRowElement) {
|
|
2278
|
+
return;
|
|
2279
|
+
}
|
|
2280
|
+
this.observer = new IntersectionObserver((entries) => {
|
|
2281
|
+
const entry = entries[0];
|
|
2282
|
+
if (entry.isIntersecting &&
|
|
2283
|
+
paginationConfig.mode === 'infinite' &&
|
|
2284
|
+
paginationConfig.hasMore &&
|
|
2285
|
+
!paginationConfig.isLoading &&
|
|
2286
|
+
paginationConfig.onLoadMore) {
|
|
2287
|
+
paginationConfig.onLoadMore();
|
|
2288
|
+
}
|
|
2289
|
+
}, {
|
|
2290
|
+
rootMargin: `${threshold}px`,
|
|
2291
|
+
root: null,
|
|
2292
|
+
});
|
|
2293
|
+
this.observer.observe(lastRowElement);
|
|
2294
|
+
}, 0);
|
|
2295
|
+
}, { allowSignalWrites: true });
|
|
2086
2296
|
}
|
|
2087
|
-
|
|
2088
|
-
|
|
2089
|
-
|
|
2297
|
+
ngAfterViewInit() {
|
|
2298
|
+
// Sync cell templates QueryList to signal
|
|
2299
|
+
if (this.cellTemplates) {
|
|
2300
|
+
this.cellTemplatesSignal.set(this.cellTemplates.toArray());
|
|
2301
|
+
// Subscribe to changes in the QueryList
|
|
2302
|
+
this.cellTemplates.changes.subscribe(() => {
|
|
2303
|
+
if (this.cellTemplates) {
|
|
2304
|
+
this.cellTemplatesSignal.set(this.cellTemplates.toArray());
|
|
2305
|
+
}
|
|
2306
|
+
});
|
|
2307
|
+
}
|
|
2308
|
+
}
|
|
2309
|
+
ngOnDestroy() {
|
|
2310
|
+
if (this.observer) {
|
|
2311
|
+
this.observer.disconnect();
|
|
2312
|
+
this.observer = null;
|
|
2313
|
+
}
|
|
2090
2314
|
}
|
|
2091
2315
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: NvDatatable, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2092
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.5", type: NvDatatable, isStandalone: true, selector: "nv-datatable", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
2316
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.5", type: NvDatatable, isStandalone: true, selector: "nv-datatable", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, pagination: { classPropertyName: "pagination", publicName: "pagination", isSignal: true, isRequired: false, transformFunction: null }, stickyHeader: { classPropertyName: "stickyHeader", publicName: "stickyHeader", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "paginationTemplate", first: true, predicate: ["paginationTemplate"], descendants: true, read: TemplateRef }, { propertyName: "cellTemplates", predicate: NvDatatableCellDirective }], viewQueries: [{ propertyName: "tableRows", first: true, predicate: ["tableRow"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
2093
2317
|
<nv-table>
|
|
2094
2318
|
<table>
|
|
2095
|
-
<thead>
|
|
2319
|
+
<thead [attr.data-sticky-top]="stickyHeader() ? 'true' : null">
|
|
2096
2320
|
@for (headerGroup of table().getHeaderGroups(); track headerGroup.id)
|
|
2097
2321
|
{
|
|
2098
2322
|
<tr>
|
|
@@ -2118,14 +2342,19 @@ class NvDatatable {
|
|
|
2118
2342
|
</thead>
|
|
2119
2343
|
|
|
2120
2344
|
<tbody>
|
|
2121
|
-
@for (row of table().getRowModel().rows; track row.id)
|
|
2122
|
-
|
|
2345
|
+
@for (row of table().getRowModel().rows; track row.id; let i = $index)
|
|
2346
|
+
{
|
|
2347
|
+
<tr
|
|
2348
|
+
[attr.data-testid]="'datatable-row-' + row.id"
|
|
2349
|
+
#tableRow
|
|
2350
|
+
[attr.data-is-last]="
|
|
2351
|
+
isInfiniteScroll() && i === table().getRowModel().rows.length - 1
|
|
2352
|
+
? 'true'
|
|
2353
|
+
: null
|
|
2354
|
+
"
|
|
2355
|
+
>
|
|
2123
2356
|
@for (cell of row.getVisibleCells(); track cell.id) {
|
|
2124
|
-
<td
|
|
2125
|
-
[attr.data-testid]="'datatable-cell-' + cell.id"
|
|
2126
|
-
style="padding: 8px; border-bottom: 1px solid #eee;"
|
|
2127
|
-
>
|
|
2128
|
-
<!-- Let FlexRender handle strings vs TemplateRef -->
|
|
2357
|
+
<td [attr.data-testid]="'datatable-cell-' + cell.id">
|
|
2129
2358
|
<ng-container
|
|
2130
2359
|
*flexRender="
|
|
2131
2360
|
cell.column.columnDef.cell;
|
|
@@ -2142,7 +2371,17 @@ class NvDatatable {
|
|
|
2142
2371
|
</tbody>
|
|
2143
2372
|
</table>
|
|
2144
2373
|
</nv-table>
|
|
2145
|
-
|
|
2374
|
+
|
|
2375
|
+
<!-- Render pagination if configured -->
|
|
2376
|
+
@if (paginationAPI()) {
|
|
2377
|
+
<ng-container
|
|
2378
|
+
*ngTemplateOutlet="
|
|
2379
|
+
paginationTemplate || null;
|
|
2380
|
+
context: { $implicit: paginationAPI() }
|
|
2381
|
+
"
|
|
2382
|
+
></ng-container>
|
|
2383
|
+
}
|
|
2384
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: FlexRenderDirective, selector: "[flexRender]", inputs: ["flexRender", "flexRenderProps", "flexRenderInjector"] }] }); }
|
|
2146
2385
|
}
|
|
2147
2386
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: NvDatatable, decorators: [{
|
|
2148
2387
|
type: Component,
|
|
@@ -2154,7 +2393,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImpor
|
|
|
2154
2393
|
template: `
|
|
2155
2394
|
<nv-table>
|
|
2156
2395
|
<table>
|
|
2157
|
-
<thead>
|
|
2396
|
+
<thead [attr.data-sticky-top]="stickyHeader() ? 'true' : null">
|
|
2158
2397
|
@for (headerGroup of table().getHeaderGroups(); track headerGroup.id)
|
|
2159
2398
|
{
|
|
2160
2399
|
<tr>
|
|
@@ -2180,14 +2419,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImpor
|
|
|
2180
2419
|
</thead>
|
|
2181
2420
|
|
|
2182
2421
|
<tbody>
|
|
2183
|
-
@for (row of table().getRowModel().rows; track row.id)
|
|
2184
|
-
|
|
2422
|
+
@for (row of table().getRowModel().rows; track row.id; let i = $index)
|
|
2423
|
+
{
|
|
2424
|
+
<tr
|
|
2425
|
+
[attr.data-testid]="'datatable-row-' + row.id"
|
|
2426
|
+
#tableRow
|
|
2427
|
+
[attr.data-is-last]="
|
|
2428
|
+
isInfiniteScroll() && i === table().getRowModel().rows.length - 1
|
|
2429
|
+
? 'true'
|
|
2430
|
+
: null
|
|
2431
|
+
"
|
|
2432
|
+
>
|
|
2185
2433
|
@for (cell of row.getVisibleCells(); track cell.id) {
|
|
2186
|
-
<td
|
|
2187
|
-
[attr.data-testid]="'datatable-cell-' + cell.id"
|
|
2188
|
-
style="padding: 8px; border-bottom: 1px solid #eee;"
|
|
2189
|
-
>
|
|
2190
|
-
<!-- Let FlexRender handle strings vs TemplateRef -->
|
|
2434
|
+
<td [attr.data-testid]="'datatable-cell-' + cell.id">
|
|
2191
2435
|
<ng-container
|
|
2192
2436
|
*flexRender="
|
|
2193
2437
|
cell.column.columnDef.cell;
|
|
@@ -2204,9 +2448,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImpor
|
|
|
2204
2448
|
</tbody>
|
|
2205
2449
|
</table>
|
|
2206
2450
|
</nv-table>
|
|
2451
|
+
|
|
2452
|
+
<!-- Render pagination if configured -->
|
|
2453
|
+
@if (paginationAPI()) {
|
|
2454
|
+
<ng-container
|
|
2455
|
+
*ngTemplateOutlet="
|
|
2456
|
+
paginationTemplate || null;
|
|
2457
|
+
context: { $implicit: paginationAPI() }
|
|
2458
|
+
"
|
|
2459
|
+
></ng-container>
|
|
2460
|
+
}
|
|
2207
2461
|
`,
|
|
2208
2462
|
}]
|
|
2209
|
-
}]
|
|
2463
|
+
}], ctorParameters: () => [], propDecorators: { paginationTemplate: [{
|
|
2464
|
+
type: ContentChild,
|
|
2465
|
+
args: ['paginationTemplate', { read: TemplateRef }]
|
|
2466
|
+
}], cellTemplates: [{
|
|
2467
|
+
type: ContentChildren,
|
|
2468
|
+
args: [NvDatatableCellDirective]
|
|
2469
|
+
}] } });
|
|
2210
2470
|
|
|
2211
2471
|
class ValueAccessor {
|
|
2212
2472
|
constructor(el) {
|
|
@@ -3385,5 +3645,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImpor
|
|
|
3385
3645
|
* Generated bundle index. Do not edit.
|
|
3386
3646
|
*/
|
|
3387
3647
|
|
|
3388
|
-
export { NotificationService, NotificationServiceComponent, NovaComponentsModule, NovaComponentsValueAccessorModule, NvAccordion, NvAccordionItem, NvAccordionValueAccessor, NvAlert, NvAlertValueAccessor, NvAvatar, NvBadge, NvBreadcrumb, NvBreadcrumbs, NvButton, NvButtongroup, NvCalendar, NvCalendarValueAccessor, NvCol, NvDatagrid, NvDatagridValueAccessor, NvDatagridcolumn, NvDatatable, NvDialog, NvDialogValueAccessor, NvDialogfooter, NvDialogheader, NvFieldcheckbox, NvFieldcheckboxValueAccessor, NvFielddate, NvFielddateValueAccessor, NvFielddaterange, NvFielddaterangeValueAccessor, NvFielddropdown, NvFielddropdownValueAccessor, NvFielddropdownitem, NvFielddropdownitemcheck, NvFieldmultiselect, NvFieldmultiselectValueAccessor, NvFieldnumber, NvFieldnumberValueAccessor, NvFieldpassword, NvFieldpasswordValueAccessor, NvFieldradio, NvFieldradioValueAccessor, NvFieldselect, NvFieldselectValueAccessor, NvFieldslider, NvFieldsliderValueAccessor, NvFieldtext, NvFieldtextValueAccessor, NvFieldtextarea, NvFieldtextareaValueAccessor, NvFieldtime, NvIcon, NvIconbutton, NvLoader, NvMenu, NvMenuitem, NvNotification, NvNotificationValueAccessor, NvNotificationcontainer, NvPopover, NvPopoverValueAccessor, NvRow, NvSplit, NvSplitValueAccessor, NvStack, NvTable, NvToggle, NvToggleValueAccessor, NvTogglebutton, NvTogglebuttongroup, NvTogglebuttongroupValueAccessor, NvTooltip, VALUE_ACCESSORS, flexRenderComponent as nvDatatableRenderComponent };
|
|
3648
|
+
export { NotificationService, NotificationServiceComponent, NovaComponentsModule, NovaComponentsValueAccessorModule, NvAccordion, NvAccordionItem, NvAccordionValueAccessor, NvAlert, NvAlertValueAccessor, NvAvatar, NvBadge, NvBreadcrumb, NvBreadcrumbs, NvButton, NvButtongroup, NvCalendar, NvCalendarValueAccessor, NvCol, NvDatagrid, NvDatagridValueAccessor, NvDatagridcolumn, NvDatatable, NvDatatableCellDirective, NvDialog, NvDialogValueAccessor, NvDialogfooter, NvDialogheader, NvFieldcheckbox, NvFieldcheckboxValueAccessor, NvFielddate, NvFielddateValueAccessor, NvFielddaterange, NvFielddaterangeValueAccessor, NvFielddropdown, NvFielddropdownValueAccessor, NvFielddropdownitem, NvFielddropdownitemcheck, NvFieldmultiselect, NvFieldmultiselectValueAccessor, NvFieldnumber, NvFieldnumberValueAccessor, NvFieldpassword, NvFieldpasswordValueAccessor, NvFieldradio, NvFieldradioValueAccessor, NvFieldselect, NvFieldselectValueAccessor, NvFieldslider, NvFieldsliderValueAccessor, NvFieldtext, NvFieldtextValueAccessor, NvFieldtextarea, NvFieldtextareaValueAccessor, NvFieldtime, NvIcon, NvIconbutton, NvLoader, NvMenu, NvMenuitem, NvNotification, NvNotificationValueAccessor, NvNotificationcontainer, NvPopover, NvPopoverValueAccessor, NvRow, NvSplit, NvSplitValueAccessor, NvStack, NvTable, NvToggle, NvToggleValueAccessor, NvTogglebutton, NvTogglebuttongroup, NvTogglebuttongroupValueAccessor, NvTooltip, VALUE_ACCESSORS, flexRenderComponent as nvDatatableRenderComponent };
|
|
3389
3649
|
//# sourceMappingURL=nova-components.mjs.map
|