@tanstack/angular-table 9.0.0-alpha.45 → 9.0.0-alpha.47
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/fesm2022/tanstack-angular-table.mjs +85 -44
- package/dist/fesm2022/tanstack-angular-table.mjs.map +1 -1
- package/dist/types/tanstack-angular-table.d.ts +32 -48
- package/package.json +6 -6
- package/src/flex-render/flexRenderComponentFactory.ts +10 -0
- package/src/flex-render/view.ts +19 -0
- package/src/helpers/createTableHook.ts +24 -11
- package/src/helpers/table.ts +3 -5
- package/src/index.ts +2 -0
- package/src/injectTable.ts +30 -97
- package/src/reactivity.ts +11 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, input, inject, Directive, reflectComponentType, Injectable, KeyValueDiffers, ChangeDetectorRef, OutputEmitterRef, TemplateRef, Type, runInInjectionContext, computed, effect, untracked, Injector, ViewContainerRef, DestroyRef, signal, assertInInjectionContext } from '@angular/core';
|
|
2
|
+
import { InjectionToken, input, inject, Directive, reflectComponentType, Injectable, KeyValueDiffers, ChangeDetectorRef, OutputEmitterRef, TemplateRef, Type, runInInjectionContext, computed, effect, untracked, Injector, ViewContainerRef, DestroyRef, NgZone, signal, assertInInjectionContext } from '@angular/core';
|
|
3
3
|
import { constructTable, createColumnHelper } from '@tanstack/table-core';
|
|
4
4
|
export * from '@tanstack/table-core';
|
|
5
|
-
import { injectSelector, shallow } from '@tanstack/angular-store';
|
|
6
5
|
import { toObservable } from '@angular/core/rxjs-interop';
|
|
6
|
+
export { shallow } from '@tanstack/angular-store';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Injection token that provides access to the current cell.
|
|
@@ -55,15 +55,15 @@ class TanStackTableCell {
|
|
|
55
55
|
* Provided as a required signal input so DI consumers always read the latest value.
|
|
56
56
|
*/
|
|
57
57
|
cell = input.required({ ...(ngDevMode ? { debugName: "cell" } : /* istanbul ignore next */ {}), alias: 'tanStackTableCell' });
|
|
58
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
59
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.
|
|
58
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: TanStackTableCell, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
59
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.12", type: TanStackTableCell, isStandalone: true, selector: "[tanStackTableCell]", inputs: { cell: { classPropertyName: "cell", publicName: "tanStackTableCell", isSignal: true, isRequired: true, transformFunction: null } }, providers: [
|
|
60
60
|
{
|
|
61
61
|
provide: TanStackTableCellToken,
|
|
62
62
|
useFactory: () => inject(TanStackTableCell).cell,
|
|
63
63
|
},
|
|
64
64
|
], exportAs: ["cell"], ngImport: i0 });
|
|
65
65
|
}
|
|
66
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
66
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: TanStackTableCell, decorators: [{
|
|
67
67
|
type: Directive,
|
|
68
68
|
args: [{
|
|
69
69
|
selector: '[tanStackTableCell]',
|
|
@@ -132,15 +132,15 @@ class TanStackTableHeader {
|
|
|
132
132
|
* Provided as a required signal input so DI consumers always read the latest value.
|
|
133
133
|
*/
|
|
134
134
|
header = input.required({ ...(ngDevMode ? { debugName: "header" } : /* istanbul ignore next */ {}), alias: 'tanStackTableHeader' });
|
|
135
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
136
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.
|
|
135
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: TanStackTableHeader, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
136
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.12", type: TanStackTableHeader, isStandalone: true, selector: "[tanStackTableHeader]", inputs: { header: { classPropertyName: "header", publicName: "tanStackTableHeader", isSignal: true, isRequired: true, transformFunction: null } }, providers: [
|
|
137
137
|
{
|
|
138
138
|
provide: TanStackTableHeaderToken,
|
|
139
139
|
useFactory: () => inject(TanStackTableHeader).header,
|
|
140
140
|
},
|
|
141
141
|
], exportAs: ["header"], ngImport: i0 });
|
|
142
142
|
}
|
|
143
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
143
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: TanStackTableHeader, decorators: [{
|
|
144
144
|
type: Directive,
|
|
145
145
|
args: [{
|
|
146
146
|
selector: '[tanStackTableHeader]',
|
|
@@ -211,15 +211,15 @@ class TanStackTable {
|
|
|
211
211
|
* Provided as a required signal input so DI consumers always read the latest value.
|
|
212
212
|
*/
|
|
213
213
|
table = input.required({ ...(ngDevMode ? { debugName: "table" } : /* istanbul ignore next */ {}), alias: 'tanStackTable' });
|
|
214
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
215
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.
|
|
214
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: TanStackTable, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
215
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.12", type: TanStackTable, isStandalone: true, selector: "[tanStackTable]", inputs: { table: { classPropertyName: "table", publicName: "tanStackTable", isSignal: true, isRequired: true, transformFunction: null } }, providers: [
|
|
216
216
|
{
|
|
217
217
|
provide: TanStackTableToken,
|
|
218
218
|
useFactory: () => inject(TanStackTable).table,
|
|
219
219
|
},
|
|
220
220
|
], exportAs: ["table"], ngImport: i0 });
|
|
221
221
|
}
|
|
222
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
222
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: TanStackTable, decorators: [{
|
|
223
223
|
type: Directive,
|
|
224
224
|
args: [{
|
|
225
225
|
selector: '[tanStackTable]',
|
|
@@ -355,6 +355,10 @@ class FlexRenderComponentInstance {
|
|
|
355
355
|
}
|
|
356
356
|
}
|
|
357
357
|
|
|
358
|
+
/**
|
|
359
|
+
* Creates and manages Angular component instances used by flex-rendered table
|
|
360
|
+
* content.
|
|
361
|
+
*/
|
|
358
362
|
class FlexRenderComponentFactory {
|
|
359
363
|
#viewContainerRef;
|
|
360
364
|
constructor(viewContainerRef) {
|
|
@@ -374,12 +378,18 @@ class FlexRenderComponentFactory {
|
|
|
374
378
|
view.setOutputs(outputs);
|
|
375
379
|
return view;
|
|
376
380
|
}
|
|
377
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
378
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
381
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: FlexRenderComponentFactory, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
382
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: FlexRenderComponentFactory });
|
|
379
383
|
}
|
|
380
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
384
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: FlexRenderComponentFactory, decorators: [{
|
|
381
385
|
type: Injectable
|
|
382
386
|
}], ctorParameters: () => [{ type: i0.ViewContainerRef }] });
|
|
387
|
+
/**
|
|
388
|
+
* Runtime wrapper around an Angular component rendered by `FlexRenderDirective`.
|
|
389
|
+
*
|
|
390
|
+
* It diffs inputs and outputs across table updates so component renderers can
|
|
391
|
+
* be reused instead of recreated on every cell/header render.
|
|
392
|
+
*/
|
|
383
393
|
class FlexRenderComponentRef {
|
|
384
394
|
componentRef;
|
|
385
395
|
componentInjector;
|
|
@@ -531,6 +541,13 @@ class FlexRenderComponentOutputManager {
|
|
|
531
541
|
}
|
|
532
542
|
}
|
|
533
543
|
|
|
544
|
+
/**
|
|
545
|
+
* Normalizes arbitrary Angular flex-render content into the renderer's internal
|
|
546
|
+
* tagged representation.
|
|
547
|
+
*
|
|
548
|
+
* This lets the directive decide whether to reuse, update, or recreate an
|
|
549
|
+
* embedded view or component view.
|
|
550
|
+
*/
|
|
534
551
|
function mapToFlexRenderTypedContent(content) {
|
|
535
552
|
if (content === null || content === undefined) {
|
|
536
553
|
return { kind: 'null' };
|
|
@@ -570,6 +587,12 @@ class FlexRenderView {
|
|
|
570
587
|
this.#content = content;
|
|
571
588
|
}
|
|
572
589
|
}
|
|
590
|
+
/**
|
|
591
|
+
* Tracks an Angular embedded template view rendered by `FlexRenderDirective`.
|
|
592
|
+
*
|
|
593
|
+
* Template views receive updated props through their proxied context and can be
|
|
594
|
+
* reused while the rendered content kind stays compatible.
|
|
595
|
+
*/
|
|
573
596
|
class FlexRenderTemplateView extends FlexRenderView {
|
|
574
597
|
constructor(initialContent, view) {
|
|
575
598
|
super(initialContent, view);
|
|
@@ -600,6 +623,12 @@ class FlexRenderTemplateView extends FlexRenderView {
|
|
|
600
623
|
this.content.content === compare.content));
|
|
601
624
|
}
|
|
602
625
|
}
|
|
626
|
+
/**
|
|
627
|
+
* Tracks an Angular component view rendered by `FlexRenderDirective`.
|
|
628
|
+
*
|
|
629
|
+
* Component views own input/output updates for `flexRenderComponent(...)`
|
|
630
|
+
* results and component classes rendered directly from column definitions.
|
|
631
|
+
*/
|
|
603
632
|
class FlexRenderComponentView extends FlexRenderView {
|
|
604
633
|
constructor(initialContent, view) {
|
|
605
634
|
super(initialContent, view);
|
|
@@ -955,10 +984,10 @@ class FlexRenderCell {
|
|
|
955
984
|
renderer.destroy();
|
|
956
985
|
});
|
|
957
986
|
}
|
|
958
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
959
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.
|
|
987
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: FlexRenderCell, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
988
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.12", type: FlexRenderCell, isStandalone: true, selector: "ng-template[flexRenderCell], ng-template[flexRenderFooter], ng-template[flexRenderHeader]", inputs: { cell: { classPropertyName: "cell", publicName: "flexRenderCell", isSignal: true, isRequired: false, transformFunction: null }, header: { classPropertyName: "header", publicName: "flexRenderHeader", isSignal: true, isRequired: false, transformFunction: null }, footer: { classPropertyName: "footer", publicName: "flexRenderFooter", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
|
|
960
989
|
}
|
|
961
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
990
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: FlexRenderCell, decorators: [{
|
|
962
991
|
type: Directive,
|
|
963
992
|
args: [{
|
|
964
993
|
selector: 'ng-template[flexRenderCell], ng-template[flexRenderFooter], ng-template[flexRenderHeader]',
|
|
@@ -1032,10 +1061,10 @@ class FlexRenderDirective {
|
|
|
1032
1061
|
renderer.destroy();
|
|
1033
1062
|
});
|
|
1034
1063
|
}
|
|
1035
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
1036
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.
|
|
1064
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: FlexRenderDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1065
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.12", type: FlexRenderDirective, isStandalone: true, selector: "ng-template[flexRender]", inputs: { content: { classPropertyName: "content", publicName: "flexRender", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "flexRenderProps", isSignal: true, isRequired: false, transformFunction: null }, injector: { classPropertyName: "injector", publicName: "flexRenderInjector", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
|
|
1037
1066
|
}
|
|
1038
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
1067
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: FlexRenderDirective, decorators: [{
|
|
1039
1068
|
type: Directive,
|
|
1040
1069
|
args: [{
|
|
1041
1070
|
selector: 'ng-template[flexRender]',
|
|
@@ -1105,9 +1134,19 @@ function signalToWritableAtom(signal, injector) {
|
|
|
1105
1134
|
},
|
|
1106
1135
|
});
|
|
1107
1136
|
}
|
|
1137
|
+
/**
|
|
1138
|
+
* Creates the table-core reactivity bindings used by the Angular adapter.
|
|
1139
|
+
*
|
|
1140
|
+
* Readonly table atoms are backed by Angular `computed` signals and writable
|
|
1141
|
+
* atoms by Angular `signal`. Subscriptions bridge through `toObservable` with
|
|
1142
|
+
* the caller's injector so table APIs can be consumed from Angular `computed`
|
|
1143
|
+
* and `effect` calls.
|
|
1144
|
+
*/
|
|
1108
1145
|
function angularReactivity(injector) {
|
|
1146
|
+
const ngZone = injector.get(NgZone);
|
|
1109
1147
|
return {
|
|
1110
1148
|
createOptionsStore: true,
|
|
1149
|
+
schedule: (fn) => ngZone.runOutsideAngular(() => queueMicrotask(fn)),
|
|
1111
1150
|
createReadonlyAtom: (fn, options) => {
|
|
1112
1151
|
const signal = computed(() => fn(), {
|
|
1113
1152
|
equal: options?.compare,
|
|
@@ -1183,10 +1222,11 @@ function angularReactivity(injector) {
|
|
|
1183
1222
|
*
|
|
1184
1223
|
* @returns An Angular-reactive TanStack Table instance.
|
|
1185
1224
|
*/
|
|
1186
|
-
function injectTable(options
|
|
1225
|
+
function injectTable(options) {
|
|
1187
1226
|
assertInInjectionContext(injectTable);
|
|
1188
1227
|
const injector = inject(Injector);
|
|
1189
|
-
|
|
1228
|
+
const ngZone = inject(NgZone);
|
|
1229
|
+
return ngZone.runOutsideAngular(() => lazyInit(() => {
|
|
1190
1230
|
const table = constructTable({
|
|
1191
1231
|
...options(),
|
|
1192
1232
|
_features: {
|
|
@@ -1206,27 +1246,29 @@ function injectTable(options, selector) {
|
|
|
1206
1246
|
...newOptions,
|
|
1207
1247
|
})));
|
|
1208
1248
|
}, { injector, debugName: 'tableOptionsUpdate' });
|
|
1209
|
-
table.computed = function Subscribe(props) {
|
|
1210
|
-
const source = props.source ?? table.store;
|
|
1211
|
-
return injectSelector(source, props.selector, {
|
|
1212
|
-
compare: props.equal ?? shallow,
|
|
1213
|
-
injector,
|
|
1214
|
-
});
|
|
1215
|
-
};
|
|
1216
|
-
Object.defineProperty(table, 'state', {
|
|
1217
|
-
value: computed(() => selector?.(table.store.get()) ?? table.store.get()),
|
|
1218
|
-
});
|
|
1219
|
-
Object.defineProperty(table, 'value', {
|
|
1220
|
-
value: computed(() => {
|
|
1221
|
-
table.store.get();
|
|
1222
|
-
table.optionsStore.get();
|
|
1223
|
-
return table;
|
|
1224
|
-
}, { equal: () => false }),
|
|
1225
|
-
});
|
|
1226
1249
|
return table;
|
|
1227
|
-
});
|
|
1250
|
+
}));
|
|
1228
1251
|
}
|
|
1229
1252
|
|
|
1253
|
+
/**
|
|
1254
|
+
* Creates app-scoped Angular table helpers with features, row models, and
|
|
1255
|
+
* renderable component maps pre-bound.
|
|
1256
|
+
*
|
|
1257
|
+
* Use this when an app or design system wants typed `injectAppTable`,
|
|
1258
|
+
* pre-bound column helpers, and typed table/cell/header context injection
|
|
1259
|
+
* helpers without repeating the same feature and component generics.
|
|
1260
|
+
*
|
|
1261
|
+
* @example
|
|
1262
|
+
* ```ts
|
|
1263
|
+
* const { injectAppTable, createAppColumnHelper } = createTableHook({
|
|
1264
|
+
* _features,
|
|
1265
|
+
* _rowModels: {},
|
|
1266
|
+
* tableComponents: {},
|
|
1267
|
+
* cellComponents: {},
|
|
1268
|
+
* headerComponents: {},
|
|
1269
|
+
* })
|
|
1270
|
+
* ```
|
|
1271
|
+
*/
|
|
1230
1272
|
function createTableHook({ tableComponents, cellComponents, headerComponents, ...defaultTableOptions }) {
|
|
1231
1273
|
function injectTableContext$1() {
|
|
1232
1274
|
return injectTableContext();
|
|
@@ -1243,7 +1285,7 @@ function createTableHook({ tableComponents, cellComponents, headerComponents, ..
|
|
|
1243
1285
|
function injectFlexRenderCellContext() {
|
|
1244
1286
|
return injectFlexRenderContext();
|
|
1245
1287
|
}
|
|
1246
|
-
function injectAppTable(tableOptions
|
|
1288
|
+
function injectAppTable(tableOptions) {
|
|
1247
1289
|
function appCell(cell) {
|
|
1248
1290
|
return cell;
|
|
1249
1291
|
}
|
|
@@ -1265,7 +1307,7 @@ function createTableHook({ tableComponents, cellComponents, headerComponents, ..
|
|
|
1265
1307
|
},
|
|
1266
1308
|
};
|
|
1267
1309
|
return injectTable(() => {
|
|
1268
|
-
|
|
1310
|
+
return {
|
|
1269
1311
|
...defaultTableOptions,
|
|
1270
1312
|
...tableOptions(),
|
|
1271
1313
|
_features: {
|
|
@@ -1273,8 +1315,7 @@ function createTableHook({ tableComponents, cellComponents, headerComponents, ..
|
|
|
1273
1315
|
appTableFeatures,
|
|
1274
1316
|
},
|
|
1275
1317
|
};
|
|
1276
|
-
|
|
1277
|
-
}, selector);
|
|
1318
|
+
});
|
|
1278
1319
|
}
|
|
1279
1320
|
function createAppColumnHelper() {
|
|
1280
1321
|
// The runtime implementation is the same - components are attached at render time
|