@nova-design-system/nova-angular-18 3.16.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/esm2022/lib/components/index.mjs +2 -1
- package/dist/nova-components/esm2022/lib/components/nv-datatable-cell.directive.mjs +37 -0
- package/dist/nova-components/esm2022/lib/components/nv-datatable.component.mjs +267 -40
- package/dist/nova-components/esm2022/lib/nova-components.module.mjs +3 -3
- package/dist/nova-components/esm2022/lib/stencil-generated/component-value-accessors.mjs +37 -1
- package/dist/nova-components/esm2022/lib/stencil-generated/components.mjs +29 -1
- package/dist/nova-components/esm2022/lib/stencil-generated/index.mjs +2 -1
- package/dist/nova-components/fesm2022/nova-components.mjs +366 -42
- 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/dist/nova-components/lib/nova-components.module.d.ts +2 -2
- package/dist/nova-components/lib/stencil-generated/component-value-accessors.d.ts +8 -1
- package/dist/nova-components/lib/stencil-generated/components.d.ts +13 -0
- package/dist/nova-components/lib/stencil-generated/index.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { ChangeDetectionStrategy, Component, untracked, computed, InjectionToken, inject, reflectComponentType, ViewContainerRef, Injectable, KeyValueDiffers, ChangeDetectorRef, OutputEmitterRef, TemplateRef, Type, Injector, runInInjectionContext, effect,
|
|
2
|
+
import { ChangeDetectionStrategy, Component, Input, Directive, untracked, computed, InjectionToken, inject, reflectComponentType, ViewContainerRef, Injectable, KeyValueDiffers, ChangeDetectorRef, OutputEmitterRef, TemplateRef, Type, Injector, runInInjectionContext, effect, Inject, signal, input, viewChild, ContentChildren, ContentChild, CUSTOM_ELEMENTS_SCHEMA, HostListener, APP_INITIALIZER, NgModule, ElementRef, ViewChildren } from '@angular/core';
|
|
3
3
|
import { defineCustomElements } from '@nova-design-system/nova-webcomponents/loader';
|
|
4
4
|
import { __decorate } from 'tslib';
|
|
5
5
|
import { fromEvent, BehaviorSubject } from 'rxjs';
|
|
6
6
|
import * as i2 from '@angular/common';
|
|
7
7
|
import { CommonModule } from '@angular/common';
|
|
8
|
-
import { memo, createTable, getCoreRowModel } from '@tanstack/table-core';
|
|
8
|
+
import { memo, createTable, getCoreRowModel, getPaginationRowModel } from '@tanstack/table-core';
|
|
9
9
|
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
10
10
|
export * from '@nova-design-system/nova-webcomponents/constants';
|
|
11
11
|
|
|
@@ -1101,6 +1101,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
1101
1101
|
standalone: false
|
|
1102
1102
|
}]
|
|
1103
1103
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.NgZone }] });
|
|
1104
|
+
let NvSplit = class NvSplit {
|
|
1105
|
+
constructor(c, r, z) {
|
|
1106
|
+
this.z = z;
|
|
1107
|
+
c.detach();
|
|
1108
|
+
this.el = r.nativeElement;
|
|
1109
|
+
proxyOutputs(this, this.el, ['sizesChanged']);
|
|
1110
|
+
}
|
|
1111
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NvSplit, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1112
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NvSplit, selector: "nv-split", inputs: { direction: "direction", gutterSize: "gutterSize", minSizes: "minSizes", sizes: "sizes" }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1113
|
+
};
|
|
1114
|
+
NvSplit = __decorate([
|
|
1115
|
+
ProxyCmp({
|
|
1116
|
+
inputs: ['direction', 'gutterSize', 'minSizes', 'sizes'],
|
|
1117
|
+
methods: ['setSizes', 'getSizes', 'collapse', 'destroy']
|
|
1118
|
+
})
|
|
1119
|
+
], NvSplit);
|
|
1120
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NvSplit, decorators: [{
|
|
1121
|
+
type: Component,
|
|
1122
|
+
args: [{
|
|
1123
|
+
selector: 'nv-split',
|
|
1124
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1125
|
+
template: '<ng-content></ng-content>',
|
|
1126
|
+
// eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
|
|
1127
|
+
inputs: ['direction', 'gutterSize', 'minSizes', 'sizes'],
|
|
1128
|
+
standalone: false
|
|
1129
|
+
}]
|
|
1130
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.NgZone }] });
|
|
1104
1131
|
let NvStack = class NvStack {
|
|
1105
1132
|
constructor(c, r, z) {
|
|
1106
1133
|
this.z = z;
|
|
@@ -1295,6 +1322,7 @@ const DIRECTIVES = [
|
|
|
1295
1322
|
NvNotificationcontainer,
|
|
1296
1323
|
NvPopover,
|
|
1297
1324
|
NvRow,
|
|
1325
|
+
NvSplit,
|
|
1298
1326
|
NvStack,
|
|
1299
1327
|
NvTable,
|
|
1300
1328
|
NvToggle,
|
|
@@ -1303,6 +1331,41 @@ const DIRECTIVES = [
|
|
|
1303
1331
|
NvTooltip
|
|
1304
1332
|
];
|
|
1305
1333
|
|
|
1334
|
+
/**
|
|
1335
|
+
* Directive to mark ng-templates as cell templates for specific fields.
|
|
1336
|
+
*
|
|
1337
|
+
* @example
|
|
1338
|
+
* ```html
|
|
1339
|
+
* <nv-datatable [columns]="columns" [rows]="data">
|
|
1340
|
+
* <ng-template nvDatatableCell="name" let-context>
|
|
1341
|
+
* <div class="font-semibold">{{ context.value }}</div>
|
|
1342
|
+
* </ng-template>
|
|
1343
|
+
*
|
|
1344
|
+
* <ng-template nvDatatableCell="price" let-context>
|
|
1345
|
+
* <span class="font-mono">${{ context.value }}</span>
|
|
1346
|
+
* </ng-template>
|
|
1347
|
+
* </nv-datatable>
|
|
1348
|
+
* ```
|
|
1349
|
+
*/
|
|
1350
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1351
|
+
class NvDatatableCellDirective {
|
|
1352
|
+
constructor(template) {
|
|
1353
|
+
this.template = template;
|
|
1354
|
+
}
|
|
1355
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NvDatatableCellDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
1356
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: NvDatatableCellDirective, isStandalone: true, selector: "ng-template[nvDatatableCell]", inputs: { nvDatatableCell: "nvDatatableCell" }, ngImport: i0 }); }
|
|
1357
|
+
}
|
|
1358
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NvDatatableCellDirective, decorators: [{
|
|
1359
|
+
type: Directive,
|
|
1360
|
+
args: [{
|
|
1361
|
+
selector: 'ng-template[nvDatatableCell]',
|
|
1362
|
+
standalone: true,
|
|
1363
|
+
}]
|
|
1364
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef }], propDecorators: { nvDatatableCell: [{
|
|
1365
|
+
type: Input,
|
|
1366
|
+
args: [{ required: true }]
|
|
1367
|
+
}] } });
|
|
1368
|
+
|
|
1306
1369
|
/**
|
|
1307
1370
|
* Implementation from @tanstack/angular-query
|
|
1308
1371
|
* {@link https://github.com/TanStack/query/blob/main/packages/angular-query-experimental/src/util/lazy-init/lazy-init.ts}
|
|
@@ -2034,38 +2097,227 @@ function createAngularTable(options) {
|
|
|
2034
2097
|
* Nova Datatable built on TanStack Table (Angular).
|
|
2035
2098
|
*/
|
|
2036
2099
|
class NvDatatable {
|
|
2100
|
+
/** Public getter for table instance. */
|
|
2101
|
+
table() {
|
|
2102
|
+
return this.tableInstance();
|
|
2103
|
+
}
|
|
2037
2104
|
constructor() {
|
|
2038
2105
|
/** Column definitions */
|
|
2039
2106
|
this.columns = input([]);
|
|
2040
2107
|
/** Row data */
|
|
2041
2108
|
this.rows = input([]);
|
|
2109
|
+
/** Optional pagination configuration */
|
|
2110
|
+
this.pagination = input(undefined);
|
|
2111
|
+
/** Should the header stick to the top of the table when scrolling? */
|
|
2112
|
+
this.stickyHeader = input(false);
|
|
2113
|
+
/** Signal to track cell templates array */
|
|
2114
|
+
this.cellTemplatesSignal = signal([]);
|
|
2115
|
+
/** Map of field names to cell templates */
|
|
2116
|
+
this.cellTemplateMap = computed(() => {
|
|
2117
|
+
const map = new Map();
|
|
2118
|
+
this.cellTemplatesSignal().forEach((directive) => {
|
|
2119
|
+
map.set(directive.nvDatatableCell, directive.template);
|
|
2120
|
+
});
|
|
2121
|
+
return map;
|
|
2122
|
+
});
|
|
2123
|
+
/** Pagination state for server mode */
|
|
2124
|
+
this.paginationState = signal({
|
|
2125
|
+
pageIndex: 0,
|
|
2126
|
+
pageSize: this.pagination()?.initialPageSize || 10,
|
|
2127
|
+
});
|
|
2128
|
+
/** Reference to table rows for infinite scroll observer */
|
|
2129
|
+
this.tableRows = viewChild('tableRow');
|
|
2130
|
+
/** Intersection observer for infinite scroll */
|
|
2131
|
+
this.observer = null;
|
|
2132
|
+
/** Helper to check if using infinite scroll */
|
|
2133
|
+
this.isInfiniteScroll = computed(() => this.pagination()?.mode === 'infinite');
|
|
2042
2134
|
/** Computed table columns with proper typing and filtering. */
|
|
2043
|
-
this.tableColumns = computed(() =>
|
|
2044
|
-
|
|
2045
|
-
.
|
|
2046
|
-
|
|
2047
|
-
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2135
|
+
this.tableColumns = computed(() => {
|
|
2136
|
+
const templateMap = this.cellTemplateMap();
|
|
2137
|
+
return this.columns()
|
|
2138
|
+
.filter((col) => !col.hidden)
|
|
2139
|
+
.map((col) => ({
|
|
2140
|
+
accessorKey: col.field,
|
|
2141
|
+
header: col.headerName || String(col.field),
|
|
2142
|
+
size: col.width,
|
|
2143
|
+
enableResizing: col.resizable ?? true,
|
|
2144
|
+
cell: (context) => {
|
|
2145
|
+
const fieldName = String(col.field);
|
|
2146
|
+
const cellTemplate = templateMap.get(fieldName);
|
|
2147
|
+
// Priority: template > renderCell > default
|
|
2148
|
+
if (cellTemplate) {
|
|
2149
|
+
// Return TemplateRef directly - FlexRender will handle it
|
|
2150
|
+
return cellTemplate;
|
|
2151
|
+
}
|
|
2152
|
+
// Fall back to renderCell if provided
|
|
2153
|
+
if (col.renderCell) {
|
|
2154
|
+
return col.renderCell(context);
|
|
2155
|
+
}
|
|
2156
|
+
// Default: just return the value
|
|
2157
|
+
return context.getValue();
|
|
2158
|
+
},
|
|
2159
|
+
}));
|
|
2160
|
+
});
|
|
2053
2161
|
/** TanStack table instance with Signals */
|
|
2054
|
-
this.tableInstance = createAngularTable(() =>
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
2058
|
-
|
|
2162
|
+
this.tableInstance = createAngularTable(() => {
|
|
2163
|
+
const paginationConfig = this.pagination();
|
|
2164
|
+
if (!paginationConfig || paginationConfig.mode === 'infinite') {
|
|
2165
|
+
// No pagination or infinite scroll - simple config
|
|
2166
|
+
return {
|
|
2167
|
+
data: this.rows(),
|
|
2168
|
+
columns: this.tableColumns(),
|
|
2169
|
+
getCoreRowModel: getCoreRowModel(),
|
|
2170
|
+
};
|
|
2171
|
+
}
|
|
2172
|
+
else if (paginationConfig.mode === 'client') {
|
|
2173
|
+
// Client-side pagination
|
|
2174
|
+
return {
|
|
2175
|
+
data: this.rows(),
|
|
2176
|
+
columns: this.tableColumns(),
|
|
2177
|
+
getCoreRowModel: getCoreRowModel(),
|
|
2178
|
+
getPaginationRowModel: getPaginationRowModel(),
|
|
2179
|
+
initialState: {
|
|
2180
|
+
pagination: {
|
|
2181
|
+
pageIndex: 0,
|
|
2182
|
+
pageSize: paginationConfig.initialPageSize || 10,
|
|
2183
|
+
},
|
|
2184
|
+
},
|
|
2185
|
+
};
|
|
2186
|
+
}
|
|
2187
|
+
else {
|
|
2188
|
+
// Server-side pagination
|
|
2189
|
+
const pageSize = this.paginationState().pageSize;
|
|
2190
|
+
return {
|
|
2191
|
+
data: this.rows(),
|
|
2192
|
+
columns: this.tableColumns(),
|
|
2193
|
+
getCoreRowModel: getCoreRowModel(),
|
|
2194
|
+
manualPagination: true,
|
|
2195
|
+
pageCount: paginationConfig.totalPageCount !== undefined
|
|
2196
|
+
? paginationConfig.totalPageCount
|
|
2197
|
+
: paginationConfig.totalRowCount !== undefined
|
|
2198
|
+
? Math.ceil(paginationConfig.totalRowCount / pageSize)
|
|
2199
|
+
: -1,
|
|
2200
|
+
state: {
|
|
2201
|
+
pagination: this.paginationState(),
|
|
2202
|
+
},
|
|
2203
|
+
onPaginationChange: (updaterOrValue) => {
|
|
2204
|
+
if (typeof updaterOrValue === 'function') {
|
|
2205
|
+
this.paginationState.set(updaterOrValue(this.paginationState()));
|
|
2206
|
+
}
|
|
2207
|
+
else {
|
|
2208
|
+
this.paginationState.set(updaterOrValue);
|
|
2209
|
+
}
|
|
2210
|
+
},
|
|
2211
|
+
};
|
|
2212
|
+
}
|
|
2213
|
+
});
|
|
2214
|
+
/** Build pagination API for template */
|
|
2215
|
+
this.paginationAPI = computed(() => {
|
|
2216
|
+
const paginationConfig = this.pagination();
|
|
2217
|
+
if (!paginationConfig) {
|
|
2218
|
+
return null;
|
|
2219
|
+
}
|
|
2220
|
+
const table = this.table();
|
|
2221
|
+
const tablePaginationState = table.getState().pagination;
|
|
2222
|
+
const pageCount = table.getPageCount();
|
|
2223
|
+
const rowCount = paginationConfig.mode === 'server'
|
|
2224
|
+
? paginationConfig.totalRowCount || this.rows().length
|
|
2225
|
+
: this.rows().length;
|
|
2226
|
+
return {
|
|
2227
|
+
pageIndex: tablePaginationState.pageIndex,
|
|
2228
|
+
pageSize: tablePaginationState.pageSize,
|
|
2229
|
+
pageCount,
|
|
2230
|
+
rowCount,
|
|
2231
|
+
firstPage: () => table.setPageIndex(0),
|
|
2232
|
+
previousPage: () => table.previousPage(),
|
|
2233
|
+
nextPage: () => table.nextPage(),
|
|
2234
|
+
lastPage: () => table.setPageIndex(pageCount - 1),
|
|
2235
|
+
setPageIndex: (index) => table.setPageIndex(index),
|
|
2236
|
+
setPageSize: (size) => table.setPageSize(size),
|
|
2237
|
+
canPreviousPage: table.getCanPreviousPage(),
|
|
2238
|
+
canNextPage: table.getCanNextPage(),
|
|
2239
|
+
isLoading: paginationConfig.mode === 'infinite'
|
|
2240
|
+
? paginationConfig.isLoading
|
|
2241
|
+
: undefined,
|
|
2242
|
+
hasMore: paginationConfig.mode === 'infinite'
|
|
2243
|
+
? paginationConfig.hasMore
|
|
2244
|
+
: undefined,
|
|
2245
|
+
};
|
|
2246
|
+
});
|
|
2247
|
+
// Watch pagination state changes for server mode
|
|
2248
|
+
effect(() => {
|
|
2249
|
+
const paginationConfig = this.pagination();
|
|
2250
|
+
const state = this.paginationState();
|
|
2251
|
+
if (paginationConfig?.mode === 'server' &&
|
|
2252
|
+
paginationConfig.onPaginationChange) {
|
|
2253
|
+
paginationConfig.onPaginationChange({
|
|
2254
|
+
pageIndex: state.pageIndex,
|
|
2255
|
+
pageSize: state.pageSize,
|
|
2256
|
+
});
|
|
2257
|
+
}
|
|
2258
|
+
}, { allowSignalWrites: true });
|
|
2259
|
+
// Set up intersection observer for infinite scroll
|
|
2260
|
+
effect(() => {
|
|
2261
|
+
const paginationConfig = this.pagination();
|
|
2262
|
+
const rows = this.rows(); // Track rows changes
|
|
2263
|
+
// Clean up existing observer
|
|
2264
|
+
if (this.observer) {
|
|
2265
|
+
this.observer.disconnect();
|
|
2266
|
+
this.observer = null;
|
|
2267
|
+
}
|
|
2268
|
+
// Only set up observer for infinite scroll mode
|
|
2269
|
+
if (paginationConfig?.mode !== 'infinite' || rows.length === 0) {
|
|
2270
|
+
return;
|
|
2271
|
+
}
|
|
2272
|
+
// Use setTimeout to ensure DOM is updated
|
|
2273
|
+
setTimeout(() => {
|
|
2274
|
+
const threshold = paginationConfig.loadMoreThreshold || 500;
|
|
2275
|
+
// Find the last row element
|
|
2276
|
+
const tableRowElements = document.querySelectorAll('[data-is-last="true"]');
|
|
2277
|
+
const lastRowElement = tableRowElements[tableRowElements.length - 1];
|
|
2278
|
+
if (!lastRowElement) {
|
|
2279
|
+
return;
|
|
2280
|
+
}
|
|
2281
|
+
this.observer = new IntersectionObserver((entries) => {
|
|
2282
|
+
const entry = entries[0];
|
|
2283
|
+
if (entry.isIntersecting &&
|
|
2284
|
+
paginationConfig.mode === 'infinite' &&
|
|
2285
|
+
paginationConfig.hasMore &&
|
|
2286
|
+
!paginationConfig.isLoading &&
|
|
2287
|
+
paginationConfig.onLoadMore) {
|
|
2288
|
+
paginationConfig.onLoadMore();
|
|
2289
|
+
}
|
|
2290
|
+
}, {
|
|
2291
|
+
rootMargin: `${threshold}px`,
|
|
2292
|
+
root: null,
|
|
2293
|
+
});
|
|
2294
|
+
this.observer.observe(lastRowElement);
|
|
2295
|
+
}, 0);
|
|
2296
|
+
}, { allowSignalWrites: true });
|
|
2059
2297
|
}
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2298
|
+
ngAfterViewInit() {
|
|
2299
|
+
// Sync cell templates QueryList to signal
|
|
2300
|
+
if (this.cellTemplates) {
|
|
2301
|
+
this.cellTemplatesSignal.set(this.cellTemplates.toArray());
|
|
2302
|
+
// Subscribe to changes in the QueryList
|
|
2303
|
+
this.cellTemplates.changes.subscribe(() => {
|
|
2304
|
+
if (this.cellTemplates) {
|
|
2305
|
+
this.cellTemplatesSignal.set(this.cellTemplates.toArray());
|
|
2306
|
+
}
|
|
2307
|
+
});
|
|
2308
|
+
}
|
|
2309
|
+
}
|
|
2310
|
+
ngOnDestroy() {
|
|
2311
|
+
if (this.observer) {
|
|
2312
|
+
this.observer.disconnect();
|
|
2313
|
+
this.observer = null;
|
|
2314
|
+
}
|
|
2063
2315
|
}
|
|
2064
2316
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NvDatatable, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2065
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", 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: `
|
|
2317
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", 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: `
|
|
2066
2318
|
<nv-table>
|
|
2067
2319
|
<table>
|
|
2068
|
-
<thead>
|
|
2320
|
+
<thead [attr.data-sticky-top]="stickyHeader() ? 'true' : null">
|
|
2069
2321
|
@for (headerGroup of table().getHeaderGroups(); track headerGroup.id)
|
|
2070
2322
|
{
|
|
2071
2323
|
<tr>
|
|
@@ -2091,14 +2343,19 @@ class NvDatatable {
|
|
|
2091
2343
|
</thead>
|
|
2092
2344
|
|
|
2093
2345
|
<tbody>
|
|
2094
|
-
@for (row of table().getRowModel().rows; track row.id)
|
|
2095
|
-
|
|
2346
|
+
@for (row of table().getRowModel().rows; track row.id; let i = $index)
|
|
2347
|
+
{
|
|
2348
|
+
<tr
|
|
2349
|
+
[attr.data-testid]="'datatable-row-' + row.id"
|
|
2350
|
+
#tableRow
|
|
2351
|
+
[attr.data-is-last]="
|
|
2352
|
+
isInfiniteScroll() && i === table().getRowModel().rows.length - 1
|
|
2353
|
+
? 'true'
|
|
2354
|
+
: null
|
|
2355
|
+
"
|
|
2356
|
+
>
|
|
2096
2357
|
@for (cell of row.getVisibleCells(); track cell.id) {
|
|
2097
|
-
<td
|
|
2098
|
-
[attr.data-testid]="'datatable-cell-' + cell.id"
|
|
2099
|
-
style="padding: 8px; border-bottom: 1px solid #eee;"
|
|
2100
|
-
>
|
|
2101
|
-
<!-- Let FlexRender handle strings vs TemplateRef -->
|
|
2358
|
+
<td [attr.data-testid]="'datatable-cell-' + cell.id">
|
|
2102
2359
|
<ng-container
|
|
2103
2360
|
*flexRender="
|
|
2104
2361
|
cell.column.columnDef.cell;
|
|
@@ -2115,7 +2372,17 @@ class NvDatatable {
|
|
|
2115
2372
|
</tbody>
|
|
2116
2373
|
</table>
|
|
2117
2374
|
</nv-table>
|
|
2118
|
-
|
|
2375
|
+
|
|
2376
|
+
<!-- Render pagination if configured -->
|
|
2377
|
+
@if (paginationAPI()) {
|
|
2378
|
+
<ng-container
|
|
2379
|
+
*ngTemplateOutlet="
|
|
2380
|
+
paginationTemplate || null;
|
|
2381
|
+
context: { $implicit: paginationAPI() }
|
|
2382
|
+
"
|
|
2383
|
+
></ng-container>
|
|
2384
|
+
}
|
|
2385
|
+
`, 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"] }] }); }
|
|
2119
2386
|
}
|
|
2120
2387
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NvDatatable, decorators: [{
|
|
2121
2388
|
type: Component,
|
|
@@ -2127,7 +2394,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
2127
2394
|
template: `
|
|
2128
2395
|
<nv-table>
|
|
2129
2396
|
<table>
|
|
2130
|
-
<thead>
|
|
2397
|
+
<thead [attr.data-sticky-top]="stickyHeader() ? 'true' : null">
|
|
2131
2398
|
@for (headerGroup of table().getHeaderGroups(); track headerGroup.id)
|
|
2132
2399
|
{
|
|
2133
2400
|
<tr>
|
|
@@ -2153,14 +2420,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
2153
2420
|
</thead>
|
|
2154
2421
|
|
|
2155
2422
|
<tbody>
|
|
2156
|
-
@for (row of table().getRowModel().rows; track row.id)
|
|
2157
|
-
|
|
2423
|
+
@for (row of table().getRowModel().rows; track row.id; let i = $index)
|
|
2424
|
+
{
|
|
2425
|
+
<tr
|
|
2426
|
+
[attr.data-testid]="'datatable-row-' + row.id"
|
|
2427
|
+
#tableRow
|
|
2428
|
+
[attr.data-is-last]="
|
|
2429
|
+
isInfiniteScroll() && i === table().getRowModel().rows.length - 1
|
|
2430
|
+
? 'true'
|
|
2431
|
+
: null
|
|
2432
|
+
"
|
|
2433
|
+
>
|
|
2158
2434
|
@for (cell of row.getVisibleCells(); track cell.id) {
|
|
2159
|
-
<td
|
|
2160
|
-
[attr.data-testid]="'datatable-cell-' + cell.id"
|
|
2161
|
-
style="padding: 8px; border-bottom: 1px solid #eee;"
|
|
2162
|
-
>
|
|
2163
|
-
<!-- Let FlexRender handle strings vs TemplateRef -->
|
|
2435
|
+
<td [attr.data-testid]="'datatable-cell-' + cell.id">
|
|
2164
2436
|
<ng-container
|
|
2165
2437
|
*flexRender="
|
|
2166
2438
|
cell.column.columnDef.cell;
|
|
@@ -2177,9 +2449,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
2177
2449
|
</tbody>
|
|
2178
2450
|
</table>
|
|
2179
2451
|
</nv-table>
|
|
2452
|
+
|
|
2453
|
+
<!-- Render pagination if configured -->
|
|
2454
|
+
@if (paginationAPI()) {
|
|
2455
|
+
<ng-container
|
|
2456
|
+
*ngTemplateOutlet="
|
|
2457
|
+
paginationTemplate || null;
|
|
2458
|
+
context: { $implicit: paginationAPI() }
|
|
2459
|
+
"
|
|
2460
|
+
></ng-container>
|
|
2461
|
+
}
|
|
2180
2462
|
`,
|
|
2181
2463
|
}]
|
|
2182
|
-
}]
|
|
2464
|
+
}], ctorParameters: () => [], propDecorators: { paginationTemplate: [{
|
|
2465
|
+
type: ContentChild,
|
|
2466
|
+
args: ['paginationTemplate', { read: TemplateRef }]
|
|
2467
|
+
}], cellTemplates: [{
|
|
2468
|
+
type: ContentChildren,
|
|
2469
|
+
args: [NvDatatableCellDirective]
|
|
2470
|
+
}] } });
|
|
2183
2471
|
|
|
2184
2472
|
class ValueAccessor {
|
|
2185
2473
|
constructor(el) {
|
|
@@ -2885,6 +3173,41 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
2885
3173
|
type: HostListener,
|
|
2886
3174
|
args: ['openChanged', ['$event']]
|
|
2887
3175
|
}] } });
|
|
3176
|
+
class NvSplitValueAccessor extends ValueAccessor {
|
|
3177
|
+
constructor(el) {
|
|
3178
|
+
super(el);
|
|
3179
|
+
}
|
|
3180
|
+
handleSizesChanged(event) {
|
|
3181
|
+
this.handleChangeEvent(event.target.sizes);
|
|
3182
|
+
}
|
|
3183
|
+
writeValue(value) {
|
|
3184
|
+
this.el.nativeElement.sizes = this.lastValue = value;
|
|
3185
|
+
}
|
|
3186
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NvSplitValueAccessor, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
3187
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: NvSplitValueAccessor, selector: "nv-split", host: { listeners: { "sizesChanged": "handleSizesChanged($event)" } }, providers: [
|
|
3188
|
+
{
|
|
3189
|
+
provide: NG_VALUE_ACCESSOR,
|
|
3190
|
+
useExisting: NvSplitValueAccessor,
|
|
3191
|
+
multi: true,
|
|
3192
|
+
},
|
|
3193
|
+
], usesInheritance: true, ngImport: i0 }); }
|
|
3194
|
+
}
|
|
3195
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NvSplitValueAccessor, decorators: [{
|
|
3196
|
+
type: Directive,
|
|
3197
|
+
args: [{
|
|
3198
|
+
selector: 'nv-split',
|
|
3199
|
+
providers: [
|
|
3200
|
+
{
|
|
3201
|
+
provide: NG_VALUE_ACCESSOR,
|
|
3202
|
+
useExisting: NvSplitValueAccessor,
|
|
3203
|
+
multi: true,
|
|
3204
|
+
},
|
|
3205
|
+
],
|
|
3206
|
+
}]
|
|
3207
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { handleSizesChanged: [{
|
|
3208
|
+
type: HostListener,
|
|
3209
|
+
args: ['sizesChanged', ['$event']]
|
|
3210
|
+
}] } });
|
|
2888
3211
|
class NvToggleValueAccessor extends ValueAccessor {
|
|
2889
3212
|
constructor(el) {
|
|
2890
3213
|
super(el);
|
|
@@ -2975,6 +3298,7 @@ const VALUE_ACCESSORS = [
|
|
|
2975
3298
|
NvFieldtextareaValueAccessor,
|
|
2976
3299
|
NvNotificationValueAccessor,
|
|
2977
3300
|
NvPopoverValueAccessor,
|
|
3301
|
+
NvSplitValueAccessor,
|
|
2978
3302
|
NvToggleValueAccessor,
|
|
2979
3303
|
NvTogglebuttongroupValueAccessor,
|
|
2980
3304
|
];
|
|
@@ -2993,7 +3317,7 @@ function provideNovaComponents() {
|
|
|
2993
3317
|
}
|
|
2994
3318
|
class NovaComponentsModule {
|
|
2995
3319
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NovaComponentsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
2996
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: NovaComponentsModule, declarations: [NvAccordion, NvAccordionItem, NvAlert, NvAvatar, NvBadge, NvBreadcrumb, NvBreadcrumbs, NvButton, NvButtongroup, NvCalendar, NvCol, NvDatagrid, NvDatagridcolumn, NvDialog, NvDialogfooter, NvDialogheader, NvFieldcheckbox, NvFielddate, NvFielddaterange, NvFielddropdown, NvFielddropdownitem, NvFielddropdownitemcheck, NvFieldmultiselect, NvFieldnumber, NvFieldpassword, NvFieldradio, NvFieldselect, NvFieldslider, NvFieldtext, NvFieldtextarea, NvFieldtime, NvIcon, NvIconbutton, NvLoader, NvMenu, NvMenuitem, NvNotification, NvNotificationcontainer, NvPopover, NvRow, NvStack, NvTable, NvToggle, NvTogglebutton, NvTogglebuttongroup, NvTooltip], imports: [NvDatatable], exports: [NvAccordion, NvAccordionItem, NvAlert, NvAvatar, NvBadge, NvBreadcrumb, NvBreadcrumbs, NvButton, NvButtongroup, NvCalendar, NvCol, NvDatagrid, NvDatagridcolumn, NvDialog, NvDialogfooter, NvDialogheader, NvFieldcheckbox, NvFielddate, NvFielddaterange, NvFielddropdown, NvFielddropdownitem, NvFielddropdownitemcheck, NvFieldmultiselect, NvFieldnumber, NvFieldpassword, NvFieldradio, NvFieldselect, NvFieldslider, NvFieldtext, NvFieldtextarea, NvFieldtime, NvIcon, NvIconbutton, NvLoader, NvMenu, NvMenuitem, NvNotification, NvNotificationcontainer, NvPopover, NvRow, NvStack, NvTable, NvToggle, NvTogglebutton, NvTogglebuttongroup, NvTooltip, NvDatatable] }); }
|
|
3320
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: NovaComponentsModule, declarations: [NvAccordion, NvAccordionItem, NvAlert, NvAvatar, NvBadge, NvBreadcrumb, NvBreadcrumbs, NvButton, NvButtongroup, NvCalendar, NvCol, NvDatagrid, NvDatagridcolumn, NvDialog, NvDialogfooter, NvDialogheader, NvFieldcheckbox, NvFielddate, NvFielddaterange, NvFielddropdown, NvFielddropdownitem, NvFielddropdownitemcheck, NvFieldmultiselect, NvFieldnumber, NvFieldpassword, NvFieldradio, NvFieldselect, NvFieldslider, NvFieldtext, NvFieldtextarea, NvFieldtime, NvIcon, NvIconbutton, NvLoader, NvMenu, NvMenuitem, NvNotification, NvNotificationcontainer, NvPopover, NvRow, NvSplit, NvStack, NvTable, NvToggle, NvTogglebutton, NvTogglebuttongroup, NvTooltip], imports: [NvDatatable], exports: [NvAccordion, NvAccordionItem, NvAlert, NvAvatar, NvBadge, NvBreadcrumb, NvBreadcrumbs, NvButton, NvButtongroup, NvCalendar, NvCol, NvDatagrid, NvDatagridcolumn, NvDialog, NvDialogfooter, NvDialogheader, NvFieldcheckbox, NvFielddate, NvFielddaterange, NvFielddropdown, NvFielddropdownitem, NvFielddropdownitemcheck, NvFieldmultiselect, NvFieldnumber, NvFieldpassword, NvFieldradio, NvFieldselect, NvFieldslider, NvFieldtext, NvFieldtextarea, NvFieldtime, NvIcon, NvIconbutton, NvLoader, NvMenu, NvMenuitem, NvNotification, NvNotificationcontainer, NvPopover, NvRow, NvSplit, NvStack, NvTable, NvToggle, NvTogglebutton, NvTogglebuttongroup, NvTooltip, NvDatatable] }); }
|
|
2997
3321
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NovaComponentsModule, providers: [provideNovaComponents()], imports: [NvDatatable] }); }
|
|
2998
3322
|
}
|
|
2999
3323
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NovaComponentsModule, decorators: [{
|
|
@@ -3007,7 +3331,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
3007
3331
|
}] });
|
|
3008
3332
|
class NovaComponentsValueAccessorModule {
|
|
3009
3333
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NovaComponentsValueAccessorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
3010
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: NovaComponentsValueAccessorModule, declarations: [NvAccordionValueAccessor, NvAlertValueAccessor, NvCalendarValueAccessor, NvDatagridValueAccessor, NvDialogValueAccessor, NvFieldcheckboxValueAccessor, NvFielddateValueAccessor, NvFielddaterangeValueAccessor, NvFielddropdownValueAccessor, NvFieldmultiselectValueAccessor, NvFieldnumberValueAccessor, NvFieldpasswordValueAccessor, NvFieldradioValueAccessor, NvFieldselectValueAccessor, NvFieldsliderValueAccessor, NvFieldtextValueAccessor, NvFieldtextareaValueAccessor, NvNotificationValueAccessor, NvPopoverValueAccessor, NvToggleValueAccessor, NvTogglebuttongroupValueAccessor], exports: [NvAccordionValueAccessor, NvAlertValueAccessor, NvCalendarValueAccessor, NvDatagridValueAccessor, NvDialogValueAccessor, NvFieldcheckboxValueAccessor, NvFielddateValueAccessor, NvFielddaterangeValueAccessor, NvFielddropdownValueAccessor, NvFieldmultiselectValueAccessor, NvFieldnumberValueAccessor, NvFieldpasswordValueAccessor, NvFieldradioValueAccessor, NvFieldselectValueAccessor, NvFieldsliderValueAccessor, NvFieldtextValueAccessor, NvFieldtextareaValueAccessor, NvNotificationValueAccessor, NvPopoverValueAccessor, NvToggleValueAccessor, NvTogglebuttongroupValueAccessor] }); }
|
|
3334
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: NovaComponentsValueAccessorModule, declarations: [NvAccordionValueAccessor, NvAlertValueAccessor, NvCalendarValueAccessor, NvDatagridValueAccessor, NvDialogValueAccessor, NvFieldcheckboxValueAccessor, NvFielddateValueAccessor, NvFielddaterangeValueAccessor, NvFielddropdownValueAccessor, NvFieldmultiselectValueAccessor, NvFieldnumberValueAccessor, NvFieldpasswordValueAccessor, NvFieldradioValueAccessor, NvFieldselectValueAccessor, NvFieldsliderValueAccessor, NvFieldtextValueAccessor, NvFieldtextareaValueAccessor, NvNotificationValueAccessor, NvPopoverValueAccessor, NvSplitValueAccessor, NvToggleValueAccessor, NvTogglebuttongroupValueAccessor], exports: [NvAccordionValueAccessor, NvAlertValueAccessor, NvCalendarValueAccessor, NvDatagridValueAccessor, NvDialogValueAccessor, NvFieldcheckboxValueAccessor, NvFielddateValueAccessor, NvFielddaterangeValueAccessor, NvFielddropdownValueAccessor, NvFieldmultiselectValueAccessor, NvFieldnumberValueAccessor, NvFieldpasswordValueAccessor, NvFieldradioValueAccessor, NvFieldselectValueAccessor, NvFieldsliderValueAccessor, NvFieldtextValueAccessor, NvFieldtextareaValueAccessor, NvNotificationValueAccessor, NvPopoverValueAccessor, NvSplitValueAccessor, NvToggleValueAccessor, NvTogglebuttongroupValueAccessor] }); }
|
|
3011
3335
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NovaComponentsValueAccessorModule }); }
|
|
3012
3336
|
}
|
|
3013
3337
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NovaComponentsValueAccessorModule, decorators: [{
|
|
@@ -3335,5 +3659,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
3335
3659
|
* Generated bundle index. Do not edit.
|
|
3336
3660
|
*/
|
|
3337
3661
|
|
|
3338
|
-
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, NvStack, NvTable, NvToggle, NvToggleValueAccessor, NvTogglebutton, NvTogglebuttongroup, NvTogglebuttongroupValueAccessor, NvTooltip, VALUE_ACCESSORS, flexRenderComponent as nvDatatableRenderComponent, provideNovaComponents };
|
|
3662
|
+
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, provideNovaComponents };
|
|
3339
3663
|
//# sourceMappingURL=nova-components.mjs.map
|