@tanstack/angular-table 9.0.0-alpha.1 → 9.0.0-alpha.10
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/esm2022/flex-render.mjs +32 -17
- package/dist/esm2022/index.mjs +4 -4
- package/dist/fesm2022/tanstack-angular-table.mjs +35 -20
- package/dist/fesm2022/tanstack-angular-table.mjs.map +1 -1
- package/dist/flex-render.d.ts +6 -6
- package/dist/index.d.ts +1 -1
- package/package.json +8 -8
- package/src/flex-render.ts +38 -18
- package/src/index.ts +3 -3
- package/src/__tests__/createAngularTable.test.ts +0 -95
- package/src/__tests__/flex-render.test.ts +0 -156
- package/src/__tests__/lazy-init.test.ts +0 -124
- package/src/__tests__/test-setup.ts +0 -12
- package/src/__tests__/test-utils.ts +0 -62
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ChangeDetectorRef, ComponentRef, Directive,
|
|
1
|
+
import { ChangeDetectorRef, ComponentRef, Directive, Inject, inject, InjectionToken, Injector, Input, isSignal, TemplateRef, Type, ViewContainerRef, } from '@angular/core';
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
export class FlexRenderDirective {
|
|
4
4
|
viewContainerRef;
|
|
@@ -11,30 +11,28 @@ export class FlexRenderDirective {
|
|
|
11
11
|
this.templateRef = templateRef;
|
|
12
12
|
}
|
|
13
13
|
ref = null;
|
|
14
|
-
|
|
15
|
-
this.ref = this.render();
|
|
16
|
-
}
|
|
17
|
-
ngDoCheck() {
|
|
14
|
+
ngOnChanges(changes) {
|
|
18
15
|
if (this.ref instanceof ComponentRef) {
|
|
19
16
|
this.ref.injector.get(ChangeDetectorRef).markForCheck();
|
|
20
17
|
}
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
if (!changes['content']) {
|
|
19
|
+
return;
|
|
23
20
|
}
|
|
21
|
+
this.render();
|
|
24
22
|
}
|
|
25
23
|
render() {
|
|
26
24
|
this.viewContainerRef.clear();
|
|
27
25
|
const { content, props } = this;
|
|
28
|
-
if (
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
if (typeof content === 'string' || typeof content === 'number') {
|
|
32
|
-
return this.renderStringContent();
|
|
26
|
+
if (content === null || content === undefined) {
|
|
27
|
+
this.ref = null;
|
|
28
|
+
return;
|
|
33
29
|
}
|
|
34
30
|
if (typeof content === 'function') {
|
|
35
31
|
return this.renderContent(content(props));
|
|
36
32
|
}
|
|
37
|
-
|
|
33
|
+
else {
|
|
34
|
+
return this.renderContent(content);
|
|
35
|
+
}
|
|
38
36
|
}
|
|
39
37
|
renderContent(content) {
|
|
40
38
|
if (typeof content === 'string' || typeof content === 'number') {
|
|
@@ -46,6 +44,9 @@ export class FlexRenderDirective {
|
|
|
46
44
|
else if (content instanceof FlexRenderComponent) {
|
|
47
45
|
return this.renderComponent(content);
|
|
48
46
|
}
|
|
47
|
+
else if (content instanceof Type) {
|
|
48
|
+
return this.renderCustomComponent(content);
|
|
49
|
+
}
|
|
49
50
|
else {
|
|
50
51
|
return null;
|
|
51
52
|
}
|
|
@@ -83,6 +84,20 @@ export class FlexRenderDirective {
|
|
|
83
84
|
}
|
|
84
85
|
return componentRef;
|
|
85
86
|
}
|
|
87
|
+
renderCustomComponent(component) {
|
|
88
|
+
const componentRef = this.viewContainerRef.createComponent(component, {
|
|
89
|
+
injector: this.injector,
|
|
90
|
+
});
|
|
91
|
+
for (const prop in this.props) {
|
|
92
|
+
// Only signal based input can be added here
|
|
93
|
+
if (componentRef.instance?.hasOwnProperty(prop) &&
|
|
94
|
+
// @ts-ignore
|
|
95
|
+
isSignal(componentRef.instance[prop])) {
|
|
96
|
+
componentRef.setInput(prop, this.props[prop]);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return componentRef;
|
|
100
|
+
}
|
|
86
101
|
getTemplateRefContext() {
|
|
87
102
|
const getContext = () => this.props;
|
|
88
103
|
return {
|
|
@@ -91,10 +106,10 @@ export class FlexRenderDirective {
|
|
|
91
106
|
},
|
|
92
107
|
};
|
|
93
108
|
}
|
|
94
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
95
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
109
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: FlexRenderDirective, deps: [{ token: ViewContainerRef }, { token: TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
110
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.5", type: FlexRenderDirective, isStandalone: true, selector: "[flexRender]", inputs: { content: ["flexRender", "content"], props: ["flexRenderProps", "props"], injector: ["flexRenderInjector", "injector"] }, usesOnChanges: true, ngImport: i0 });
|
|
96
111
|
}
|
|
97
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
112
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: FlexRenderDirective, decorators: [{
|
|
98
113
|
type: Directive,
|
|
99
114
|
args: [{
|
|
100
115
|
selector: '[flexRender]',
|
|
@@ -130,4 +145,4 @@ const FlexRenderComponentProps = new InjectionToken('[@tanstack/angular-table] F
|
|
|
130
145
|
export function injectFlexRenderContext() {
|
|
131
146
|
return inject(FlexRenderComponentProps);
|
|
132
147
|
}
|
|
133
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxleC1yZW5kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmxleC1yZW5kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osU0FBUyxFQUVULGVBQWUsRUFDZixNQUFNLEVBQ04sTUFBTSxFQUNOLGNBQWMsRUFDZCxRQUFRLEVBQ1IsS0FBSyxFQUVMLFdBQVcsRUFFWCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUE7O0FBY3RCLE1BQU0sT0FBTyxtQkFBbUI7SUFrQlg7SUFFQTtJQWhCbkIsT0FBTyxHQUlTLFNBQVMsQ0FBQTtJQUd6QixLQUFLLEdBQVcsRUFBWSxDQUFBO0lBRzVCLFFBQVEsR0FBYSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7SUFFckMsWUFFbUIsZ0JBQWtDLEVBRWxDLFdBQTZCO1FBRjdCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFFbEMsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO0lBQzdDLENBQUM7SUFFSixHQUFHLEdBQTZELElBQUksQ0FBQTtJQUVwRSxRQUFRO1FBQ04sSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUE7SUFDMUIsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLElBQUksQ0FBQyxHQUFHLFlBQVksWUFBWSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsWUFBWSxFQUFFLENBQUE7UUFDekQsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsWUFBWSxlQUFlLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFBO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUM3QixN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TUFBTSx3QkFBd0IsR0FBRyxJQUFJLGNBQWMsQ0FDakQsK0RBQStELENBQ2hFLENBQUE7QUFFRCxNQUFNLFVBQVUsdUJBQXVCO0lBQ3JDLE9BQU8sTUFBTSxDQUFJLHdCQUF3QixDQUFDLENBQUE7QUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnRSZWYsXG4gIERpcmVjdGl2ZSxcbiAgdHlwZSBEb0NoZWNrLFxuICBFbWJlZGRlZFZpZXdSZWYsXG4gIEluamVjdCxcbiAgaW5qZWN0LFxuICBJbmplY3Rpb25Ub2tlbixcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICB0eXBlIE9uSW5pdCxcbiAgVGVtcGxhdGVSZWYsXG4gIHR5cGUgVHlwZSxcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcblxuZXhwb3J0IHR5cGUgRmxleFJlbmRlckNvbnRlbnQ8VFByb3BzIGV4dGVuZHMgTm9uTnVsbGFibGU8dW5rbm93bj4+ID1cbiAgfCBzdHJpbmdcbiAgfCBudW1iZXJcbiAgfCBGbGV4UmVuZGVyQ29tcG9uZW50PFRQcm9wcz5cbiAgfCBUZW1wbGF0ZVJlZjx7ICRpbXBsaWNpdDogVFByb3BzIH0+XG4gIHwgbnVsbFxuICB8IHVuZGVmaW5lZFxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbZmxleFJlbmRlcl0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBGbGV4UmVuZGVyRGlyZWN0aXZlPFRQcm9wcyBleHRlbmRzIE5vbk51bGxhYmxlPHVua25vd24+PlxuICBpbXBsZW1lbnRzIE9uSW5pdCwgRG9DaGVja1xue1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSwgYWxpYXM6ICdmbGV4UmVuZGVyJyB9KVxuICBjb250ZW50OlxuICAgIHwgbnVtYmVyXG4gICAgfCBzdHJpbmdcbiAgICB8ICgocHJvcHM6IFRQcm9wcykgPT4gRmxleFJlbmRlckNvbnRlbnQ8VFByb3BzPilcbiAgICB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlLCBhbGlhczogJ2ZsZXhSZW5kZXJQcm9wcycgfSlcbiAgcHJvcHM6IFRQcm9wcyA9IHt9IGFzIFRQcm9wc1xuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiBmYWxzZSwgYWxpYXM6ICdmbGV4UmVuZGVySW5qZWN0b3InIH0pXG4gIGluamVjdG9yOiBJbmplY3RvciA9IGluamVjdChJbmplY3RvcilcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFZpZXdDb250YWluZXJSZWYpXG4gICAgcHJpdmF0ZSByZWFkb25seSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIEBJbmplY3QoVGVtcGxhdGVSZWYpXG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PlxuICApIHt9XG5cbiAgcmVmPzogQ29tcG9uZW50UmVmPHVua25vd24+IHwgRW1iZWRkZWRWaWV3UmVmPHVua25vd24+IHwgbnVsbCA9IG51bGxcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZiA9IHRoaXMucmVuZGVyKClcbiAgfVxuXG4gIG5nRG9DaGVjaygpIHtcbiAgICBpZiAodGhpcy5yZWYgaW5zdGFuY2VvZiBDb21wb25lbnRSZWYpIHtcbiAgICAgIHRoaXMucmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZikubWFya0ZvckNoZWNrKClcbiAgICB9IGVsc2UgaWYgKHRoaXMucmVmIGluc3RhbmNlb2YgRW1iZWRkZWRWaWV3UmVmKSB7XG4gICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKVxuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLnZpZXdDb250YWluZXJSZWYuY2xlYXIoKVxuICAgIGNvbnN0IHsgY29udGVudCwgcHJvcHMgfSA9IHRoaXNcbiAgICBpZiAoIXRoaXMuY29udGVudCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBjb250ZW50ID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyU3RyaW5nQ29udGVudCgpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyQ29udGVudChjb250ZW50KHByb3BzKSlcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQ29udGVudChjb250ZW50OiBGbGV4UmVuZGVyQ29udGVudDxUUHJvcHM+KSB7XG4gICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgY29udGVudCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlclN0cmluZ0NvbnRlbnQoKVxuICAgIH1cbiAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmKSB7XG4gICAgICByZXR1cm4gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyhcbiAgICAgICAgY29udGVudCxcbiAgICAgICAgdGhpcy5nZXRUZW1wbGF0ZVJlZkNvbnRleHQoKVxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIEZsZXhSZW5kZXJDb21wb25lbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckNvbXBvbmVudChjb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyU3RyaW5nQ29udGVudCgpOiBFbWJlZGRlZFZpZXdSZWY8dW5rbm93bj4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gdHlwZW9mIHRoaXMuY29udGVudCA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgdHlwZW9mIHRoaXMuY29udGVudCA9PT0gJ251bWJlcidcbiAgICAgICAgPyB0aGlzLmNvbnRlbnRcbiAgICAgICAgOiB0aGlzLmNvbnRlbnQ/Lih0aGlzLnByb3BzKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLnRlbXBsYXRlUmVmLCB7XG4gICAgICBnZXQgJGltcGxpY2l0KCkge1xuICAgICAgICByZXR1cm4gY29udGV4dCgpXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHJlbmRlckNvbXBvbmVudChcbiAgICBmbGV4UmVuZGVyQ29tcG9uZW50OiBGbGV4UmVuZGVyQ29tcG9uZW50PFRQcm9wcz5cbiAgKTogQ29tcG9uZW50UmVmPHVua25vd24+IHtcbiAgICBjb25zdCB7IGNvbXBvbmVudCwgaW5wdXRzLCBpbmplY3RvciB9ID0gZmxleFJlbmRlckNvbXBvbmVudFxuXG4gICAgY29uc3QgZ2V0Q29udGV4dCA9ICgpID0+IHRoaXMucHJvcHNcblxuICAgIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHRoaXMucHJvcHMsIHtcbiAgICAgIGdldDogKF8sIGtleSkgPT4gZ2V0Q29udGV4dCgpPy5ba2V5IGFzIGtleW9mIHR5cGVvZiBfXSxcbiAgICB9KVxuXG4gICAgY29uc3QgY29tcG9uZW50SW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgcGFyZW50OiBpbmplY3RvciA/PyB0aGlzLmluamVjdG9yLFxuICAgICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBGbGV4UmVuZGVyQ29tcG9uZW50UHJvcHMsIHVzZVZhbHVlOiBwcm94eSB9XSxcbiAgICB9KVxuXG4gICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnQsIHtcbiAgICAgIGluamVjdG9yOiBjb21wb25lbnRJbmplY3RvcixcbiAgICB9KVxuICAgIGZvciAoY29uc3QgcHJvcCBpbiBpbnB1dHMpIHtcbiAgICAgIGlmIChjb21wb25lbnRSZWYuaW5zdGFuY2U/Lmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgIGNvbXBvbmVudFJlZi5zZXRJbnB1dChwcm9wLCBpbnB1dHNbcHJvcF0pXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnRSZWZcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGVtcGxhdGVSZWZDb250ZXh0KCkge1xuICAgIGNvbnN0IGdldENvbnRleHQgPSAoKSA9PiB0aGlzLnByb3BzXG4gICAgcmV0dXJuIHtcbiAgICAgIGdldCAkaW1wbGljaXQoKSB7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0KClcbiAgICAgIH0sXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGbGV4UmVuZGVyQ29tcG9uZW50PFQgZXh0ZW5kcyBOb25OdWxsYWJsZTx1bmtub3duPj4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBjb21wb25lbnQ6IFR5cGU8dW5rbm93bj4sXG4gICAgcmVhZG9ubHkgaW5wdXRzOiBUID0ge30gYXMgVCxcbiAgICByZWFkb25seSBpbmplY3Rvcj86IEluamVjdG9yXG4gICkge31cbn1cblxuY29uc3QgRmxleFJlbmRlckNvbXBvbmVudFByb3BzID0gbmV3IEluamVjdGlvblRva2VuPE5vbk51bGxhYmxlPHVua25vd24+PihcbiAgJ1tAdGFuc3RhY2svYW5ndWxhci10YWJsZV0gRmxleCByZW5kZXIgY29tcG9uZW50IGNvbnRleHQgcHJvcHMnXG4pXG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RGbGV4UmVuZGVyQ29udGV4dDxUIGV4dGVuZHMgTm9uTnVsbGFibGU8dW5rbm93bj4+KCk6IFQge1xuICByZXR1cm4gaW5qZWN0PFQ+KEZsZXhSZW5kZXJDb21wb25lbnRQcm9wcylcbn1cbiJdfQ==
|
|
148
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxleC1yZW5kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmxleC1yZW5kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osU0FBUyxFQUVULE1BQU0sRUFDTixNQUFNLEVBQ04sY0FBYyxFQUNkLFFBQVEsRUFDUixLQUFLLEVBQ0wsUUFBUSxFQUdSLFdBQVcsRUFDWCxJQUFJLEVBQ0osZ0JBQWdCLEdBQ2pCLE1BQU0sZUFBZSxDQUFBOztBQWV0QixNQUFNLE9BQU8sbUJBQW1CO0lBbUJYO0lBRUE7SUFqQm5CLE9BQU8sR0FLUyxTQUFTLENBQUE7SUFHekIsS0FBSyxHQUFXLEVBQVksQ0FBQTtJQUc1QixRQUFRLEdBQWEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRXJDLFlBRW1CLGdCQUFrQyxFQUVsQyxXQUE2QjtRQUY3QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBRWxDLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtJQUM3QyxDQUFDO0lBRUosR0FBRyxHQUE2RCxJQUFJLENBQUE7SUFFcEUsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksSUFBSSxDQUFDLEdBQUcsWUFBWSxZQUFZLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUN6RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE9BQU07UUFDUixDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFBO0lBQ2YsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDN0IsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUE7UUFDL0Is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QkFDakI7OzBCQW1CSSxNQUFNOzJCQUFDLGdCQUFnQjs7MEJBRXZCLE1BQU07MkJBQUMsV0FBVzt5Q0FoQnJCLE9BQU87c0JBRE4sS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRTtnQkFTOUMsS0FBSztzQkFESixLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUU7Z0JBSW5ELFFBQVE7c0JBRFAsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixFQUFFOztBQTRIekQsTUFBTSxPQUFPLG1CQUFtQjtJQUVuQjtJQUNBO0lBQ0E7SUFIWCxZQUNXLFNBQXdCLEVBQ3hCLFNBQVksRUFBTyxFQUNuQixRQUFtQjtRQUZuQixjQUFTLEdBQVQsU0FBUyxDQUFlO1FBQ3hCLFdBQU0sR0FBTixNQUFNLENBQWE7UUFDbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVztJQUMzQixDQUFDO0NBQ0w7QUFFRCxNQUFNLHdCQUF3QixHQUFHLElBQUksY0FBYyxDQUNqRCwrREFBK0QsQ0FDaEUsQ0FBQTtBQUVELE1BQU0sVUFBVSx1QkFBdUI7SUFDckMsT0FBTyxNQUFNLENBQUksd0JBQXdCLENBQUMsQ0FBQTtBQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudFJlZixcbiAgRGlyZWN0aXZlLFxuICBFbWJlZGRlZFZpZXdSZWYsXG4gIEluamVjdCxcbiAgaW5qZWN0LFxuICBJbmplY3Rpb25Ub2tlbixcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBpc1NpZ25hbCxcbiAgdHlwZSBPbkNoYW5nZXMsXG4gIHR5cGUgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFR5cGUsXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5cbmV4cG9ydCB0eXBlIEZsZXhSZW5kZXJDb250ZW50PFRQcm9wcyBleHRlbmRzIE5vbk51bGxhYmxlPHVua25vd24+PiA9XG4gIHwgc3RyaW5nXG4gIHwgbnVtYmVyXG4gIHwgVHlwZTxUUHJvcHM+XG4gIHwgRmxleFJlbmRlckNvbXBvbmVudDxUUHJvcHM+XG4gIHwgVGVtcGxhdGVSZWY8eyAkaW1wbGljaXQ6IFRQcm9wcyB9PlxuICB8IG51bGxcbiAgfCB1bmRlZmluZWRcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2ZsZXhSZW5kZXJdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgRmxleFJlbmRlckRpcmVjdGl2ZTxUUHJvcHMgZXh0ZW5kcyBOb25OdWxsYWJsZTx1bmtub3duPj5cbiAgaW1wbGVtZW50cyBPbkNoYW5nZXNcbntcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUsIGFsaWFzOiAnZmxleFJlbmRlcicgfSlcbiAgY29udGVudDpcbiAgICB8IG51bWJlclxuICAgIHwgc3RyaW5nXG4gICAgfCAoKHByb3BzOiBUUHJvcHMpID0+IEZsZXhSZW5kZXJDb250ZW50PFRQcm9wcz4pXG4gICAgfCBudWxsXG4gICAgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSwgYWxpYXM6ICdmbGV4UmVuZGVyUHJvcHMnIH0pXG4gIHByb3BzOiBUUHJvcHMgPSB7fSBhcyBUUHJvcHNcblxuICBASW5wdXQoeyByZXF1aXJlZDogZmFsc2UsIGFsaWFzOiAnZmxleFJlbmRlckluamVjdG9yJyB9KVxuICBpbmplY3RvcjogSW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpXG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChWaWV3Q29udGFpbmVyUmVmKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICBASW5qZWN0KFRlbXBsYXRlUmVmKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT5cbiAgKSB7fVxuXG4gIHJlZj86IENvbXBvbmVudFJlZjx1bmtub3duPiB8IEVtYmVkZGVkVmlld1JlZjx1bmtub3duPiB8IG51bGwgPSBudWxsXG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmICh0aGlzLnJlZiBpbnN0YW5jZW9mIENvbXBvbmVudFJlZikge1xuICAgICAgdGhpcy5yZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmKS5tYXJrRm9yQ2hlY2soKVxuICAgIH1cbiAgICBpZiAoIWNoYW5nZXNbJ2NvbnRlbnQnXSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMucmVuZGVyKClcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLnZpZXdDb250YWluZXJSZWYuY2xlYXIoKVxuICAgIGNvbnN0IHsgY29udGVudCwgcHJvcHMgfSA9IHRoaXNcbiAgICBpZiAoY29udGVudCA9PT0gbnVsbCB8fCBjb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmVmID0gbnVsbFxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyQ29udGVudChjb250ZW50KHByb3BzKSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyQ29udGVudChjb250ZW50KVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQ29udGVudChjb250ZW50OiBGbGV4UmVuZGVyQ29udGVudDxUUHJvcHM+KSB7XG4gICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgY29udGVudCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlclN0cmluZ0NvbnRlbnQoKVxuICAgIH1cbiAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmKSB7XG4gICAgICByZXR1cm4gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyhcbiAgICAgICAgY29udGVudCxcbiAgICAgICAgdGhpcy5nZXRUZW1wbGF0ZVJlZkNvbnRleHQoKVxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIEZsZXhSZW5kZXJDb21wb25lbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckNvbXBvbmVudChjb250ZW50KVxuICAgIH0gZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIFR5cGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckN1c3RvbUNvbXBvbmVudChjb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyU3RyaW5nQ29udGVudCgpOiBFbWJlZGRlZFZpZXdSZWY8dW5rbm93bj4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gdHlwZW9mIHRoaXMuY29udGVudCA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgdHlwZW9mIHRoaXMuY29udGVudCA9PT0gJ251bWJlcidcbiAgICAgICAgPyB0aGlzLmNvbnRlbnRcbiAgICAgICAgOiB0aGlzLmNvbnRlbnQ/Lih0aGlzLnByb3BzKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLnRlbXBsYXRlUmVmLCB7XG4gICAgICBnZXQgJGltcGxpY2l0KCkge1xuICAgICAgICByZXR1cm4gY29udGV4dCgpXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHJlbmRlckNvbXBvbmVudChcbiAgICBmbGV4UmVuZGVyQ29tcG9uZW50OiBGbGV4UmVuZGVyQ29tcG9uZW50PFRQcm9wcz5cbiAgKTogQ29tcG9uZW50UmVmPHVua25vd24+IHtcbiAgICBjb25zdCB7IGNvbXBvbmVudCwgaW5wdXRzLCBpbmplY3RvciB9ID0gZmxleFJlbmRlckNvbXBvbmVudFxuXG4gICAgY29uc3QgZ2V0Q29udGV4dCA9ICgpID0+IHRoaXMucHJvcHNcblxuICAgIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHRoaXMucHJvcHMsIHtcbiAgICAgIGdldDogKF8sIGtleSkgPT4gZ2V0Q29udGV4dCgpPy5ba2V5IGFzIGtleW9mIHR5cGVvZiBfXSxcbiAgICB9KVxuXG4gICAgY29uc3QgY29tcG9uZW50SW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgcGFyZW50OiBpbmplY3RvciA/PyB0aGlzLmluamVjdG9yLFxuICAgICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBGbGV4UmVuZGVyQ29tcG9uZW50UHJvcHMsIHVzZVZhbHVlOiBwcm94eSB9XSxcbiAgICB9KVxuXG4gICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnQsIHtcbiAgICAgIGluamVjdG9yOiBjb21wb25lbnRJbmplY3RvcixcbiAgICB9KVxuICAgIGZvciAoY29uc3QgcHJvcCBpbiBpbnB1dHMpIHtcbiAgICAgIGlmIChjb21wb25lbnRSZWYuaW5zdGFuY2U/Lmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgIGNvbXBvbmVudFJlZi5zZXRJbnB1dChwcm9wLCBpbnB1dHNbcHJvcF0pXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnRSZWZcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQ3VzdG9tQ29tcG9uZW50KFxuICAgIGNvbXBvbmVudDogVHlwZTx1bmtub3duPlxuICApOiBDb21wb25lbnRSZWY8dW5rbm93bj4ge1xuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50LCB7XG4gICAgICBpbmplY3RvcjogdGhpcy5pbmplY3RvcixcbiAgICB9KVxuICAgIGZvciAoY29uc3QgcHJvcCBpbiB0aGlzLnByb3BzKSB7XG4gICAgICAvLyBPbmx5IHNpZ25hbCBiYXNlZCBpbnB1dCBjYW4gYmUgYWRkZWQgaGVyZVxuICAgICAgaWYgKFxuICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2U/Lmhhc093blByb3BlcnR5KHByb3ApICYmXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaXNTaWduYWwoY29tcG9uZW50UmVmLmluc3RhbmNlW3Byb3BdKVxuICAgICAgKSB7XG4gICAgICAgIGNvbXBvbmVudFJlZi5zZXRJbnB1dChwcm9wLCB0aGlzLnByb3BzW3Byb3BdKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29tcG9uZW50UmVmXG4gIH1cblxuICBwcml2YXRlIGdldFRlbXBsYXRlUmVmQ29udGV4dCgpIHtcbiAgICBjb25zdCBnZXRDb250ZXh0ID0gKCkgPT4gdGhpcy5wcm9wc1xuICAgIHJldHVybiB7XG4gICAgICBnZXQgJGltcGxpY2l0KCkge1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dCgpXG4gICAgICB9LFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmxleFJlbmRlckNvbXBvbmVudDxUIGV4dGVuZHMgTm9uTnVsbGFibGU8dW5rbm93bj4+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgY29tcG9uZW50OiBUeXBlPHVua25vd24+LFxuICAgIHJlYWRvbmx5IGlucHV0czogVCA9IHt9IGFzIFQsXG4gICAgcmVhZG9ubHkgaW5qZWN0b3I/OiBJbmplY3RvclxuICApIHt9XG59XG5cbmNvbnN0IEZsZXhSZW5kZXJDb21wb25lbnRQcm9wcyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxOb25OdWxsYWJsZTx1bmtub3duPj4oXG4gICdbQHRhbnN0YWNrL2FuZ3VsYXItdGFibGVdIEZsZXggcmVuZGVyIGNvbXBvbmVudCBjb250ZXh0IHByb3BzJ1xuKVxuXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0RmxleFJlbmRlckNvbnRleHQ8VCBleHRlbmRzIE5vbk51bGxhYmxlPHVua25vd24+PigpOiBUIHtcbiAgcmV0dXJuIGluamVjdDxUPihGbGV4UmVuZGVyQ29tcG9uZW50UHJvcHMpXG59XG4iXX0=
|
package/dist/esm2022/index.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { computed, signal } from '@angular/core';
|
|
2
|
-
import {
|
|
2
|
+
import { _createTable, } from '@tanstack/table-core';
|
|
3
3
|
import { lazyInit } from './lazy-signal-initializer';
|
|
4
4
|
import { proxifyTable } from './proxy';
|
|
5
5
|
export * from '@tanstack/table-core';
|
|
6
6
|
export { FlexRenderComponent, FlexRenderDirective, injectFlexRenderContext, } from './flex-render';
|
|
7
|
-
export function
|
|
7
|
+
export function injectTable(options) {
|
|
8
8
|
return lazyInit(() => {
|
|
9
9
|
const resolvedOptions = {
|
|
10
10
|
state: {},
|
|
@@ -12,7 +12,7 @@ export function createAngularTable(options) {
|
|
|
12
12
|
renderFallbackValue: null,
|
|
13
13
|
...options(),
|
|
14
14
|
};
|
|
15
|
-
const table =
|
|
15
|
+
const table = _createTable(resolvedOptions);
|
|
16
16
|
// By default, manage table state here using the table's initial state
|
|
17
17
|
const state = signal(table.initialState);
|
|
18
18
|
// Compose table options using computed.
|
|
@@ -45,4 +45,4 @@ export function createAngularTable(options) {
|
|
|
45
45
|
return proxifyTable(tableSignal);
|
|
46
46
|
});
|
|
47
47
|
}
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBZSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDN0QsT0FBTyxFQUtMLFlBQVksR0FFYixNQUFNLHNCQUFzQixDQUFBO0FBQzdCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBRXRDLGNBQWMsc0JBQXNCLENBQUE7QUFFcEMsT0FBTyxFQUVMLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsdUJBQXVCLEdBQ3hCLE1BQU0sZUFBZSxDQUFBO0FBRXRCLE1BQU0sVUFBVSxXQUFXLENBQ3pCLE9BQWtDO0lBRWxDLE9BQU8sUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUNuQixNQUFNLGVBQWUsR0FBRztZQUN0QixLQUFLLEVBQUUsRUFBRTtZQUNULGFBQWEsRUFBRSxHQUFHLEVBQUUsR0FBRSxDQUFDO1lBQ3ZCLG1CQUFtQixFQUFFLElBQUk7WUFDekIsR0FBRyxPQUFPLEVBQUU7U0FDYixDQUFBO1FBRUQsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFBO1FBRTNDLHNFQUFzRTtRQUN0RSxNQUFNLEtBQUssR0FBRyxNQUFNLENBQWEsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBRXBELHdDQUF3QztRQUN4QyxnRUFBZ0U7UUFDaEUsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUE4QixHQUFHLEVBQUU7WUFDaEUsZ0NBQWdDO1lBQ2hDLE1BQU0sVUFBVSxHQUFHLEtBQUssRUFBRSxDQUFBO1lBQzFCLGtDQUFrQztZQUNsQyxNQUFNLFlBQVksR0FBRyxPQUFPLEVBQUUsQ0FBQTtZQUM5QixPQUFPO2dCQUNMLEdBQUcsS0FBSyxDQUFDLE9BQU87Z0JBQ2hCLEdBQUcsZUFBZTtnQkFDbEIsR0FBRyxZQUFZO2dCQUNmLEtBQUssRUFBRSxFQUFFLEdBQUcsVUFBVSxFQUFFLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRTtnQkFDL0MsYUFBYSxFQUFFLE9BQU8sQ0FBQyxFQUFFO29CQUN2QixNQUFNLEtBQUssR0FDVCxPQUFPLFlBQVksUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQTtvQkFDN0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtvQkFDaEIsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUMxQyxDQUFDO2FBQ0YsQ0FBQTtRQUNILENBQUMsQ0FBQyxDQUFBO1FBRUYsZ0dBQWdHO1FBQ2hHLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FDMUIsR0FBRyxFQUFFO1lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFBO1lBQ2xDLE9BQU8sS0FBSyxDQUFBO1FBQ2QsQ0FBQyxFQUNEO1lBQ0UsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUs7U0FDbkIsQ0FDRixDQUFBO1FBRUQsOEZBQThGO1FBQzlGLE9BQU8sWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQ2xDLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbXB1dGVkLCB0eXBlIFNpZ25hbCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7XG4gIFJvd0RhdGEsXG4gIFRhYmxlT3B0aW9ucyxcbiAgVGFibGVPcHRpb25zUmVzb2x2ZWQsXG4gIFRhYmxlU3RhdGUsXG4gIF9jcmVhdGVUYWJsZSxcbiAgdHlwZSBUYWJsZSxcbn0gZnJvbSAnQHRhbnN0YWNrL3RhYmxlLWNvcmUnXG5pbXBvcnQgeyBsYXp5SW5pdCB9IGZyb20gJy4vbGF6eS1zaWduYWwtaW5pdGlhbGl6ZXInXG5pbXBvcnQgeyBwcm94aWZ5VGFibGUgfSBmcm9tICcuL3Byb3h5J1xuXG5leHBvcnQgKiBmcm9tICdAdGFuc3RhY2svdGFibGUtY29yZSdcblxuZXhwb3J0IHtcbiAgdHlwZSBGbGV4UmVuZGVyQ29udGVudCxcbiAgRmxleFJlbmRlckNvbXBvbmVudCxcbiAgRmxleFJlbmRlckRpcmVjdGl2ZSxcbiAgaW5qZWN0RmxleFJlbmRlckNvbnRleHQsXG59IGZyb20gJy4vZmxleC1yZW5kZXInXG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RUYWJsZTxURGF0YSBleHRlbmRzIFJvd0RhdGE+KFxuICBvcHRpb25zOiAoKSA9PiBUYWJsZU9wdGlvbnM8VERhdGE+XG4pOiBUYWJsZTxURGF0YT4gJiBTaWduYWw8VGFibGU8VERhdGE+PiB7XG4gIHJldHVybiBsYXp5SW5pdCgoKSA9PiB7XG4gICAgY29uc3QgcmVzb2x2ZWRPcHRpb25zID0ge1xuICAgICAgc3RhdGU6IHt9LFxuICAgICAgb25TdGF0ZUNoYW5nZTogKCkgPT4ge30sXG4gICAgICByZW5kZXJGYWxsYmFja1ZhbHVlOiBudWxsLFxuICAgICAgLi4ub3B0aW9ucygpLFxuICAgIH1cblxuICAgIGNvbnN0IHRhYmxlID0gX2NyZWF0ZVRhYmxlKHJlc29sdmVkT3B0aW9ucylcblxuICAgIC8vIEJ5IGRlZmF1bHQsIG1hbmFnZSB0YWJsZSBzdGF0ZSBoZXJlIHVzaW5nIHRoZSB0YWJsZSdzIGluaXRpYWwgc3RhdGVcbiAgICBjb25zdCBzdGF0ZSA9IHNpZ25hbDxUYWJsZVN0YXRlPih0YWJsZS5pbml0aWFsU3RhdGUpXG5cbiAgICAvLyBDb21wb3NlIHRhYmxlIG9wdGlvbnMgdXNpbmcgY29tcHV0ZWQuXG4gICAgLy8gVGhpcyBpcyB0byBhbGxvdyBgdGFibGVTaWduYWxgIHRvIGxpc3RlbiBhbmQgc2V0IHRhYmxlIG9wdGlvblxuICAgIGNvbnN0IHVwZGF0ZWRPcHRpb25zID0gY29tcHV0ZWQ8VGFibGVPcHRpb25zUmVzb2x2ZWQ8VERhdGE+PigoKSA9PiB7XG4gICAgICAvLyBsaXN0ZW4gdG8gdGFibGUgc3RhdGUgY2hhbmdlZFxuICAgICAgY29uc3QgdGFibGVTdGF0ZSA9IHN0YXRlKClcbiAgICAgIC8vIGxpc3RlbiB0byBpbnB1dCBvcHRpb25zIGNoYW5nZWRcbiAgICAgIGNvbnN0IHRhYmxlT3B0aW9ucyA9IG9wdGlvbnMoKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4udGFibGUub3B0aW9ucyxcbiAgICAgICAgLi4ucmVzb2x2ZWRPcHRpb25zLFxuICAgICAgICAuLi50YWJsZU9wdGlvbnMsXG4gICAgICAgIHN0YXRlOiB7IC4uLnRhYmxlU3RhdGUsIC4uLnRhYmxlT3B0aW9ucy5zdGF0ZSB9LFxuICAgICAgICBvblN0YXRlQ2hhbmdlOiB1cGRhdGVyID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgICAgICB1cGRhdGVyIGluc3RhbmNlb2YgRnVuY3Rpb24gPyB1cGRhdGVyKHRhYmxlU3RhdGUpIDogdXBkYXRlclxuICAgICAgICAgIHN0YXRlLnNldCh2YWx1ZSlcbiAgICAgICAgICByZXNvbHZlZE9wdGlvbnMub25TdGF0ZUNoYW5nZT8uKHVwZGF0ZXIpXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIGNvbnZlcnQgdGFibGUgaW5zdGFuY2UgdG8gc2lnbmFsIGZvciBwcm94aWZ5IHRvIGxpc3RlbiB0byBhbnkgdGFibGUgc3RhdGUgYW5kIG9wdGlvbnMgY2hhbmdlc1xuICAgIGNvbnN0IHRhYmxlU2lnbmFsID0gY29tcHV0ZWQoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRhYmxlLnNldE9wdGlvbnModXBkYXRlZE9wdGlvbnMoKSlcbiAgICAgICAgcmV0dXJuIHRhYmxlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBlcXVhbDogKCkgPT4gZmFsc2UsXG4gICAgICB9XG4gICAgKVxuXG4gICAgLy8gcHJveGlmeSBUYWJsZSBpbnN0YW5jZSB0byBwcm92aWRlIGFiaWxpdHkgZm9yIGNvbnN1bWVyIHRvIGxpc3RlbiB0byBhbnkgdGFibGUgc3RhdGUgY2hhbmdlc1xuICAgIHJldHVybiBwcm94aWZ5VGFibGUodGFibGVTaWduYWwpXG4gIH0pXG59XG4iXX0=
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { untracked, computed, inject, Injector, ComponentRef, ChangeDetectorRef,
|
|
3
|
-
import {
|
|
2
|
+
import { untracked, computed, inject, Injector, ComponentRef, ChangeDetectorRef, TemplateRef, Type, isSignal, ViewContainerRef, Directive, Inject, Input, InjectionToken, signal } from '@angular/core';
|
|
3
|
+
import { _createTable } from '@tanstack/table-core';
|
|
4
4
|
export * from '@tanstack/table-core';
|
|
5
5
|
|
|
6
6
|
/**
|
|
@@ -138,30 +138,28 @@ class FlexRenderDirective {
|
|
|
138
138
|
this.templateRef = templateRef;
|
|
139
139
|
}
|
|
140
140
|
ref = null;
|
|
141
|
-
|
|
142
|
-
this.ref = this.render();
|
|
143
|
-
}
|
|
144
|
-
ngDoCheck() {
|
|
141
|
+
ngOnChanges(changes) {
|
|
145
142
|
if (this.ref instanceof ComponentRef) {
|
|
146
143
|
this.ref.injector.get(ChangeDetectorRef).markForCheck();
|
|
147
144
|
}
|
|
148
|
-
|
|
149
|
-
|
|
145
|
+
if (!changes['content']) {
|
|
146
|
+
return;
|
|
150
147
|
}
|
|
148
|
+
this.render();
|
|
151
149
|
}
|
|
152
150
|
render() {
|
|
153
151
|
this.viewContainerRef.clear();
|
|
154
152
|
const { content, props } = this;
|
|
155
|
-
if (
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
if (typeof content === 'string' || typeof content === 'number') {
|
|
159
|
-
return this.renderStringContent();
|
|
153
|
+
if (content === null || content === undefined) {
|
|
154
|
+
this.ref = null;
|
|
155
|
+
return;
|
|
160
156
|
}
|
|
161
157
|
if (typeof content === 'function') {
|
|
162
158
|
return this.renderContent(content(props));
|
|
163
159
|
}
|
|
164
|
-
|
|
160
|
+
else {
|
|
161
|
+
return this.renderContent(content);
|
|
162
|
+
}
|
|
165
163
|
}
|
|
166
164
|
renderContent(content) {
|
|
167
165
|
if (typeof content === 'string' || typeof content === 'number') {
|
|
@@ -173,6 +171,9 @@ class FlexRenderDirective {
|
|
|
173
171
|
else if (content instanceof FlexRenderComponent) {
|
|
174
172
|
return this.renderComponent(content);
|
|
175
173
|
}
|
|
174
|
+
else if (content instanceof Type) {
|
|
175
|
+
return this.renderCustomComponent(content);
|
|
176
|
+
}
|
|
176
177
|
else {
|
|
177
178
|
return null;
|
|
178
179
|
}
|
|
@@ -210,6 +211,20 @@ class FlexRenderDirective {
|
|
|
210
211
|
}
|
|
211
212
|
return componentRef;
|
|
212
213
|
}
|
|
214
|
+
renderCustomComponent(component) {
|
|
215
|
+
const componentRef = this.viewContainerRef.createComponent(component, {
|
|
216
|
+
injector: this.injector,
|
|
217
|
+
});
|
|
218
|
+
for (const prop in this.props) {
|
|
219
|
+
// Only signal based input can be added here
|
|
220
|
+
if (componentRef.instance?.hasOwnProperty(prop) &&
|
|
221
|
+
// @ts-ignore
|
|
222
|
+
isSignal(componentRef.instance[prop])) {
|
|
223
|
+
componentRef.setInput(prop, this.props[prop]);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return componentRef;
|
|
227
|
+
}
|
|
213
228
|
getTemplateRefContext() {
|
|
214
229
|
const getContext = () => this.props;
|
|
215
230
|
return {
|
|
@@ -218,10 +233,10 @@ class FlexRenderDirective {
|
|
|
218
233
|
},
|
|
219
234
|
};
|
|
220
235
|
}
|
|
221
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
222
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
236
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: FlexRenderDirective, deps: [{ token: ViewContainerRef }, { token: TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
237
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.5", type: FlexRenderDirective, isStandalone: true, selector: "[flexRender]", inputs: { content: ["flexRender", "content"], props: ["flexRenderProps", "props"], injector: ["flexRenderInjector", "injector"] }, usesOnChanges: true, ngImport: i0 });
|
|
223
238
|
}
|
|
224
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
239
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: FlexRenderDirective, decorators: [{
|
|
225
240
|
type: Directive,
|
|
226
241
|
args: [{
|
|
227
242
|
selector: '[flexRender]',
|
|
@@ -258,7 +273,7 @@ function injectFlexRenderContext() {
|
|
|
258
273
|
return inject(FlexRenderComponentProps);
|
|
259
274
|
}
|
|
260
275
|
|
|
261
|
-
function
|
|
276
|
+
function injectTable(options) {
|
|
262
277
|
return lazyInit(() => {
|
|
263
278
|
const resolvedOptions = {
|
|
264
279
|
state: {},
|
|
@@ -266,7 +281,7 @@ function createAngularTable(options) {
|
|
|
266
281
|
renderFallbackValue: null,
|
|
267
282
|
...options(),
|
|
268
283
|
};
|
|
269
|
-
const table =
|
|
284
|
+
const table = _createTable(resolvedOptions);
|
|
270
285
|
// By default, manage table state here using the table's initial state
|
|
271
286
|
const state = signal(table.initialState);
|
|
272
287
|
// Compose table options using computed.
|
|
@@ -304,5 +319,5 @@ function createAngularTable(options) {
|
|
|
304
319
|
* Generated bundle index. Do not edit.
|
|
305
320
|
*/
|
|
306
321
|
|
|
307
|
-
export { FlexRenderComponent, FlexRenderDirective,
|
|
322
|
+
export { FlexRenderComponent, FlexRenderDirective, injectFlexRenderContext, injectTable };
|
|
308
323
|
//# sourceMappingURL=tanstack-angular-table.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tanstack-angular-table.mjs","sources":["../../src/lazy-signal-initializer.ts","../../src/proxy.ts","../../src/flex-render.ts","../../src/index.ts","../../src/tanstack-angular-table.ts"],"sourcesContent":["import { untracked } from '@angular/core'\n\n/**\n * Implementation from @tanstack/angular-query\n * {@link https://github.com/TanStack/query/blob/main/packages/angular-query-experimental/src/util/lazy-init/lazy-init.ts}\n */\nexport function lazyInit<T extends object>(initializer: () => T): T {\n let object: T | null = null\n\n const initializeObject = () => {\n if (!object) {\n object = untracked(() => initializer())\n }\n }\n\n queueMicrotask(() => initializeObject())\n\n const table = () => {}\n\n return new Proxy<T>(table as T, {\n apply(target: T, thisArg: any, argArray: any[]): any {\n initializeObject()\n if (typeof object === 'function') {\n return Reflect.apply(object, thisArg, argArray)\n }\n return Reflect.apply(target as any, thisArg, argArray)\n },\n get(_, prop, receiver) {\n initializeObject()\n return Reflect.get(object as T, prop, receiver)\n },\n has(_, prop) {\n initializeObject()\n return Reflect.has(object as T, prop)\n },\n ownKeys() {\n initializeObject()\n return Reflect.ownKeys(object as T)\n },\n getOwnPropertyDescriptor() {\n return {\n enumerable: true,\n configurable: true,\n }\n },\n })\n}\n","import { computed, type Signal, untracked } from '@angular/core'\nimport { type Table } from '@tanstack/table-core'\n\ntype TableSignal<T> = Table<T> & Signal<Table<T>>\n\nexport function proxifyTable<T>(\n tableSignal: Signal<Table<T>>\n): Table<T> & Signal<Table<T>> {\n const internalState = tableSignal as TableSignal<T>\n\n return new Proxy(internalState, {\n apply() {\n return tableSignal()\n },\n get(target, property: keyof Table<T>): any {\n if (target[property]) {\n return target[property]\n }\n const table = untracked(tableSignal)\n /**\n * Attempt to convert all accessors into computed ones,\n * excluding handlers as they do not retain any reactive value\n */\n if (\n property.startsWith('get') &&\n !property.endsWith('Handler') &&\n !property.endsWith('Model')\n ) {\n const maybeFn = table[property] as Function | never\n if (typeof maybeFn === 'function') {\n Object.defineProperty(target, property, {\n value: toComputed(tableSignal, maybeFn),\n configurable: true,\n enumerable: true,\n })\n return target[property]\n }\n }\n // @ts-expect-error\n return (target[property] = table[property])\n },\n has(_, prop: keyof Table<T>) {\n return !!untracked(tableSignal)[prop]\n },\n ownKeys() {\n return Reflect.ownKeys(untracked(tableSignal))\n },\n getOwnPropertyDescriptor() {\n return {\n enumerable: true,\n configurable: true,\n }\n },\n })\n}\n\n/**\n * Here we'll handle all type of accessors:\n * - 0 argument -> e.g. table.getCanNextPage())\n * - 0~1 arguments -> e.g. table.getIsSomeRowsPinned(position?)\n * - 1 required argument -> e.g. table.getColumn(columnId)\n * - 1+ argument -> e.g. table.getRow(id, searchAll?)\n *\n * Since we are not able to detect automatically the accessors parameters,\n * we'll wrap all accessors into a cached function wrapping a computed\n * that return it's value based on the given parameters\n */\nfunction toComputed<T>(signal: Signal<Table<T>>, fn: Function) {\n const hasArgs = fn.length > 0\n if (!hasArgs) {\n return computed(() => {\n void signal()\n return fn()\n })\n }\n\n const computedCache: Record<string, Signal<unknown>> = {}\n\n return (...argsArray: any[]) => {\n const serializedArgs = serializeArgs(...argsArray)\n if (computedCache.hasOwnProperty(serializedArgs)) {\n return computedCache[serializedArgs]?.()\n }\n const computedSignal = computed(() => {\n void signal()\n return fn(...argsArray)\n })\n\n computedCache[serializedArgs] = computedSignal\n\n return computedSignal()\n }\n}\n\nfunction serializeArgs(...args: any[]) {\n return JSON.stringify(args)\n}\n","import {\n ChangeDetectorRef,\n ComponentRef,\n Directive,\n type DoCheck,\n EmbeddedViewRef,\n Inject,\n inject,\n InjectionToken,\n Injector,\n Input,\n type OnInit,\n TemplateRef,\n type Type,\n ViewContainerRef,\n} from '@angular/core'\n\nexport type FlexRenderContent<TProps extends NonNullable<unknown>> =\n | string\n | number\n | FlexRenderComponent<TProps>\n | TemplateRef<{ $implicit: TProps }>\n | null\n | undefined\n\n@Directive({\n selector: '[flexRender]',\n standalone: true,\n})\nexport class FlexRenderDirective<TProps extends NonNullable<unknown>>\n implements OnInit, DoCheck\n{\n @Input({ required: true, alias: 'flexRender' })\n content:\n | number\n | string\n | ((props: TProps) => FlexRenderContent<TProps>)\n | undefined = undefined\n\n @Input({ required: true, alias: 'flexRenderProps' })\n props: TProps = {} as TProps\n\n @Input({ required: false, alias: 'flexRenderInjector' })\n injector: Injector = inject(Injector)\n\n constructor(\n @Inject(ViewContainerRef)\n private readonly viewContainerRef: ViewContainerRef,\n @Inject(TemplateRef)\n private readonly templateRef: TemplateRef<any>\n ) {}\n\n ref?: ComponentRef<unknown> | EmbeddedViewRef<unknown> | null = null\n\n ngOnInit(): void {\n this.ref = this.render()\n }\n\n ngDoCheck() {\n if (this.ref instanceof ComponentRef) {\n this.ref.injector.get(ChangeDetectorRef).markForCheck()\n } else if (this.ref instanceof EmbeddedViewRef) {\n this.ref.markForCheck()\n }\n }\n\n render() {\n this.viewContainerRef.clear()\n const { content, props } = this\n if (!this.content) {\n return null\n }\n\n if (typeof content === 'string' || typeof content === 'number') {\n return this.renderStringContent()\n }\n if (typeof content === 'function') {\n return this.renderContent(content(props))\n }\n return null\n }\n\n private renderContent(content: FlexRenderContent<TProps>) {\n if (typeof content === 'string' || typeof content === 'number') {\n return this.renderStringContent()\n }\n if (content instanceof TemplateRef) {\n return this.viewContainerRef.createEmbeddedView(\n content,\n this.getTemplateRefContext()\n )\n } else if (content instanceof FlexRenderComponent) {\n return this.renderComponent(content)\n } else {\n return null\n }\n }\n\n private renderStringContent(): EmbeddedViewRef<unknown> {\n const context = () => {\n return typeof this.content === 'string' ||\n typeof this.content === 'number'\n ? this.content\n : this.content?.(this.props)\n }\n return this.viewContainerRef.createEmbeddedView(this.templateRef, {\n get $implicit() {\n return context()\n },\n })\n }\n\n private renderComponent(\n flexRenderComponent: FlexRenderComponent<TProps>\n ): ComponentRef<unknown> {\n const { component, inputs, injector } = flexRenderComponent\n\n const getContext = () => this.props\n\n const proxy = new Proxy(this.props, {\n get: (_, key) => getContext()?.[key as keyof typeof _],\n })\n\n const componentInjector = Injector.create({\n parent: injector ?? this.injector,\n providers: [{ provide: FlexRenderComponentProps, useValue: proxy }],\n })\n\n const componentRef = this.viewContainerRef.createComponent(component, {\n injector: componentInjector,\n })\n for (const prop in inputs) {\n if (componentRef.instance?.hasOwnProperty(prop)) {\n componentRef.setInput(prop, inputs[prop])\n }\n }\n return componentRef\n }\n\n private getTemplateRefContext() {\n const getContext = () => this.props\n return {\n get $implicit() {\n return getContext()\n },\n }\n }\n}\n\nexport class FlexRenderComponent<T extends NonNullable<unknown>> {\n constructor(\n readonly component: Type<unknown>,\n readonly inputs: T = {} as T,\n readonly injector?: Injector\n ) {}\n}\n\nconst FlexRenderComponentProps = new InjectionToken<NonNullable<unknown>>(\n '[@tanstack/angular-table] Flex render component context props'\n)\n\nexport function injectFlexRenderContext<T extends NonNullable<unknown>>(): T {\n return inject<T>(FlexRenderComponentProps)\n}\n","import { computed, type Signal, signal } from '@angular/core'\nimport {\n RowData,\n TableOptions,\n TableOptionsResolved,\n TableState,\n createTable,\n type Table,\n} from '@tanstack/table-core'\nimport { lazyInit } from './lazy-signal-initializer'\nimport { proxifyTable } from './proxy'\n\nexport * from '@tanstack/table-core'\n\nexport {\n type FlexRenderContent,\n FlexRenderComponent,\n FlexRenderDirective,\n injectFlexRenderContext,\n} from './flex-render'\n\nexport function createAngularTable<TData extends RowData>(\n options: () => TableOptions<TData>\n): Table<TData> & Signal<Table<TData>> {\n return lazyInit(() => {\n const resolvedOptions = {\n state: {},\n onStateChange: () => {},\n renderFallbackValue: null,\n ...options(),\n }\n\n const table = createTable(resolvedOptions)\n\n // By default, manage table state here using the table's initial state\n const state = signal<TableState>(table.initialState)\n\n // Compose table options using computed.\n // This is to allow `tableSignal` to listen and set table option\n const updatedOptions = computed<TableOptionsResolved<TData>>(() => {\n // listen to table state changed\n const tableState = state()\n // listen to input options changed\n const tableOptions = options()\n return {\n ...table.options,\n ...resolvedOptions,\n ...tableOptions,\n state: { ...tableState, ...tableOptions.state },\n onStateChange: updater => {\n const value =\n updater instanceof Function ? updater(tableState) : updater\n state.set(value)\n resolvedOptions.onStateChange?.(updater)\n },\n }\n })\n\n // convert table instance to signal for proxify to listen to any table state and options changes\n const tableSignal = computed(\n () => {\n table.setOptions(updatedOptions())\n return table\n },\n {\n equal: () => false,\n }\n )\n\n // proxify Table instance to provide ability for consumer to listen to any table state changes\n return proxifyTable(tableSignal)\n })\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tanstack-angular-table.mjs","sources":["../../src/lazy-signal-initializer.ts","../../src/proxy.ts","../../src/flex-render.ts","../../src/index.ts","../../src/tanstack-angular-table.ts"],"sourcesContent":["import { untracked } from '@angular/core'\n\n/**\n * Implementation from @tanstack/angular-query\n * {@link https://github.com/TanStack/query/blob/main/packages/angular-query-experimental/src/util/lazy-init/lazy-init.ts}\n */\nexport function lazyInit<T extends object>(initializer: () => T): T {\n let object: T | null = null\n\n const initializeObject = () => {\n if (!object) {\n object = untracked(() => initializer())\n }\n }\n\n queueMicrotask(() => initializeObject())\n\n const table = () => {}\n\n return new Proxy<T>(table as T, {\n apply(target: T, thisArg: any, argArray: any[]): any {\n initializeObject()\n if (typeof object === 'function') {\n return Reflect.apply(object, thisArg, argArray)\n }\n return Reflect.apply(target as any, thisArg, argArray)\n },\n get(_, prop, receiver) {\n initializeObject()\n return Reflect.get(object as T, prop, receiver)\n },\n has(_, prop) {\n initializeObject()\n return Reflect.has(object as T, prop)\n },\n ownKeys() {\n initializeObject()\n return Reflect.ownKeys(object as T)\n },\n getOwnPropertyDescriptor() {\n return {\n enumerable: true,\n configurable: true,\n }\n },\n })\n}\n","import { computed, type Signal, untracked } from '@angular/core'\nimport { type Table } from '@tanstack/table-core'\n\ntype TableSignal<T> = Table<T> & Signal<Table<T>>\n\nexport function proxifyTable<T>(\n tableSignal: Signal<Table<T>>\n): Table<T> & Signal<Table<T>> {\n const internalState = tableSignal as TableSignal<T>\n\n return new Proxy(internalState, {\n apply() {\n return tableSignal()\n },\n get(target, property: keyof Table<T>): any {\n if (target[property]) {\n return target[property]\n }\n const table = untracked(tableSignal)\n /**\n * Attempt to convert all accessors into computed ones,\n * excluding handlers as they do not retain any reactive value\n */\n if (\n property.startsWith('get') &&\n !property.endsWith('Handler') &&\n !property.endsWith('Model')\n ) {\n const maybeFn = table[property] as Function | never\n if (typeof maybeFn === 'function') {\n Object.defineProperty(target, property, {\n value: toComputed(tableSignal, maybeFn),\n configurable: true,\n enumerable: true,\n })\n return target[property]\n }\n }\n // @ts-expect-error\n return (target[property] = table[property])\n },\n has(_, prop: keyof Table<T>) {\n return !!untracked(tableSignal)[prop]\n },\n ownKeys() {\n return Reflect.ownKeys(untracked(tableSignal))\n },\n getOwnPropertyDescriptor() {\n return {\n enumerable: true,\n configurable: true,\n }\n },\n })\n}\n\n/**\n * Here we'll handle all type of accessors:\n * - 0 argument -> e.g. table.getCanNextPage())\n * - 0~1 arguments -> e.g. table.getIsSomeRowsPinned(position?)\n * - 1 required argument -> e.g. table.getColumn(columnId)\n * - 1+ argument -> e.g. table.getRow(id, searchAll?)\n *\n * Since we are not able to detect automatically the accessors parameters,\n * we'll wrap all accessors into a cached function wrapping a computed\n * that return it's value based on the given parameters\n */\nfunction toComputed<T>(signal: Signal<Table<T>>, fn: Function) {\n const hasArgs = fn.length > 0\n if (!hasArgs) {\n return computed(() => {\n void signal()\n return fn()\n })\n }\n\n const computedCache: Record<string, Signal<unknown>> = {}\n\n return (...argsArray: any[]) => {\n const serializedArgs = serializeArgs(...argsArray)\n if (computedCache.hasOwnProperty(serializedArgs)) {\n return computedCache[serializedArgs]?.()\n }\n const computedSignal = computed(() => {\n void signal()\n return fn(...argsArray)\n })\n\n computedCache[serializedArgs] = computedSignal\n\n return computedSignal()\n }\n}\n\nfunction serializeArgs(...args: any[]) {\n return JSON.stringify(args)\n}\n","import {\n ChangeDetectorRef,\n ComponentRef,\n Directive,\n EmbeddedViewRef,\n Inject,\n inject,\n InjectionToken,\n Injector,\n Input,\n isSignal,\n type OnChanges,\n type SimpleChanges,\n TemplateRef,\n Type,\n ViewContainerRef,\n} from '@angular/core'\n\nexport type FlexRenderContent<TProps extends NonNullable<unknown>> =\n | string\n | number\n | Type<TProps>\n | FlexRenderComponent<TProps>\n | TemplateRef<{ $implicit: TProps }>\n | null\n | undefined\n\n@Directive({\n selector: '[flexRender]',\n standalone: true,\n})\nexport class FlexRenderDirective<TProps extends NonNullable<unknown>>\n implements OnChanges\n{\n @Input({ required: true, alias: 'flexRender' })\n content:\n | number\n | string\n | ((props: TProps) => FlexRenderContent<TProps>)\n | null\n | undefined = undefined\n\n @Input({ required: true, alias: 'flexRenderProps' })\n props: TProps = {} as TProps\n\n @Input({ required: false, alias: 'flexRenderInjector' })\n injector: Injector = inject(Injector)\n\n constructor(\n @Inject(ViewContainerRef)\n private readonly viewContainerRef: ViewContainerRef,\n @Inject(TemplateRef)\n private readonly templateRef: TemplateRef<any>\n ) {}\n\n ref?: ComponentRef<unknown> | EmbeddedViewRef<unknown> | null = null\n\n ngOnChanges(changes: SimpleChanges) {\n if (this.ref instanceof ComponentRef) {\n this.ref.injector.get(ChangeDetectorRef).markForCheck()\n }\n if (!changes['content']) {\n return\n }\n this.render()\n }\n\n render() {\n this.viewContainerRef.clear()\n const { content, props } = this\n if (content === null || content === undefined) {\n this.ref = null\n return\n }\n if (typeof content === 'function') {\n return this.renderContent(content(props))\n } else {\n return this.renderContent(content)\n }\n }\n\n private renderContent(content: FlexRenderContent<TProps>) {\n if (typeof content === 'string' || typeof content === 'number') {\n return this.renderStringContent()\n }\n if (content instanceof TemplateRef) {\n return this.viewContainerRef.createEmbeddedView(\n content,\n this.getTemplateRefContext()\n )\n } else if (content instanceof FlexRenderComponent) {\n return this.renderComponent(content)\n } else if (content instanceof Type) {\n return this.renderCustomComponent(content)\n } else {\n return null\n }\n }\n\n private renderStringContent(): EmbeddedViewRef<unknown> {\n const context = () => {\n return typeof this.content === 'string' ||\n typeof this.content === 'number'\n ? this.content\n : this.content?.(this.props)\n }\n return this.viewContainerRef.createEmbeddedView(this.templateRef, {\n get $implicit() {\n return context()\n },\n })\n }\n\n private renderComponent(\n flexRenderComponent: FlexRenderComponent<TProps>\n ): ComponentRef<unknown> {\n const { component, inputs, injector } = flexRenderComponent\n\n const getContext = () => this.props\n\n const proxy = new Proxy(this.props, {\n get: (_, key) => getContext()?.[key as keyof typeof _],\n })\n\n const componentInjector = Injector.create({\n parent: injector ?? this.injector,\n providers: [{ provide: FlexRenderComponentProps, useValue: proxy }],\n })\n\n const componentRef = this.viewContainerRef.createComponent(component, {\n injector: componentInjector,\n })\n for (const prop in inputs) {\n if (componentRef.instance?.hasOwnProperty(prop)) {\n componentRef.setInput(prop, inputs[prop])\n }\n }\n return componentRef\n }\n\n private renderCustomComponent(\n component: Type<unknown>\n ): ComponentRef<unknown> {\n const componentRef = this.viewContainerRef.createComponent(component, {\n injector: this.injector,\n })\n for (const prop in this.props) {\n // Only signal based input can be added here\n if (\n componentRef.instance?.hasOwnProperty(prop) &&\n // @ts-ignore\n isSignal(componentRef.instance[prop])\n ) {\n componentRef.setInput(prop, this.props[prop])\n }\n }\n return componentRef\n }\n\n private getTemplateRefContext() {\n const getContext = () => this.props\n return {\n get $implicit() {\n return getContext()\n },\n }\n }\n}\n\nexport class FlexRenderComponent<T extends NonNullable<unknown>> {\n constructor(\n readonly component: Type<unknown>,\n readonly inputs: T = {} as T,\n readonly injector?: Injector\n ) {}\n}\n\nconst FlexRenderComponentProps = new InjectionToken<NonNullable<unknown>>(\n '[@tanstack/angular-table] Flex render component context props'\n)\n\nexport function injectFlexRenderContext<T extends NonNullable<unknown>>(): T {\n return inject<T>(FlexRenderComponentProps)\n}\n","import { computed, type Signal, signal } from '@angular/core'\nimport {\n RowData,\n TableOptions,\n TableOptionsResolved,\n TableState,\n _createTable,\n type Table,\n} from '@tanstack/table-core'\nimport { lazyInit } from './lazy-signal-initializer'\nimport { proxifyTable } from './proxy'\n\nexport * from '@tanstack/table-core'\n\nexport {\n type FlexRenderContent,\n FlexRenderComponent,\n FlexRenderDirective,\n injectFlexRenderContext,\n} from './flex-render'\n\nexport function injectTable<TData extends RowData>(\n options: () => TableOptions<TData>\n): Table<TData> & Signal<Table<TData>> {\n return lazyInit(() => {\n const resolvedOptions = {\n state: {},\n onStateChange: () => {},\n renderFallbackValue: null,\n ...options(),\n }\n\n const table = _createTable(resolvedOptions)\n\n // By default, manage table state here using the table's initial state\n const state = signal<TableState>(table.initialState)\n\n // Compose table options using computed.\n // This is to allow `tableSignal` to listen and set table option\n const updatedOptions = computed<TableOptionsResolved<TData>>(() => {\n // listen to table state changed\n const tableState = state()\n // listen to input options changed\n const tableOptions = options()\n return {\n ...table.options,\n ...resolvedOptions,\n ...tableOptions,\n state: { ...tableState, ...tableOptions.state },\n onStateChange: updater => {\n const value =\n updater instanceof Function ? updater(tableState) : updater\n state.set(value)\n resolvedOptions.onStateChange?.(updater)\n },\n }\n })\n\n // convert table instance to signal for proxify to listen to any table state and options changes\n const tableSignal = computed(\n () => {\n table.setOptions(updatedOptions())\n return table\n },\n {\n equal: () => false,\n }\n )\n\n // proxify Table instance to provide ability for consumer to listen to any table state changes\n return proxifyTable(tableSignal)\n })\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/dist/flex-render.d.ts
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import { ComponentRef,
|
|
1
|
+
import { ComponentRef, EmbeddedViewRef, Injector, type OnChanges, type SimpleChanges, TemplateRef, Type, ViewContainerRef } from '@angular/core';
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
|
-
export type FlexRenderContent<TProps extends NonNullable<unknown>> = string | number | FlexRenderComponent<TProps> | TemplateRef<{
|
|
3
|
+
export type FlexRenderContent<TProps extends NonNullable<unknown>> = string | number | Type<TProps> | FlexRenderComponent<TProps> | TemplateRef<{
|
|
4
4
|
$implicit: TProps;
|
|
5
5
|
}> | null | undefined;
|
|
6
|
-
export declare class FlexRenderDirective<TProps extends NonNullable<unknown>> implements
|
|
6
|
+
export declare class FlexRenderDirective<TProps extends NonNullable<unknown>> implements OnChanges {
|
|
7
7
|
private readonly viewContainerRef;
|
|
8
8
|
private readonly templateRef;
|
|
9
|
-
content: number | string | ((props: TProps) => FlexRenderContent<TProps>) | undefined;
|
|
9
|
+
content: number | string | ((props: TProps) => FlexRenderContent<TProps>) | null | undefined;
|
|
10
10
|
props: TProps;
|
|
11
11
|
injector: Injector;
|
|
12
12
|
constructor(viewContainerRef: ViewContainerRef, templateRef: TemplateRef<any>);
|
|
13
13
|
ref?: ComponentRef<unknown> | EmbeddedViewRef<unknown> | null;
|
|
14
|
-
|
|
15
|
-
ngDoCheck(): void;
|
|
14
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
16
15
|
render(): ComponentRef<unknown> | EmbeddedViewRef<unknown>;
|
|
17
16
|
private renderContent;
|
|
18
17
|
private renderStringContent;
|
|
19
18
|
private renderComponent;
|
|
19
|
+
private renderCustomComponent;
|
|
20
20
|
private getTemplateRefContext;
|
|
21
21
|
static ɵfac: i0.ɵɵFactoryDeclaration<FlexRenderDirective<any>, never>;
|
|
22
22
|
static ɵdir: i0.ɵɵDirectiveDeclaration<FlexRenderDirective<any>, "[flexRender]", never, { "content": { "alias": "flexRender"; "required": true; }; "props": { "alias": "flexRenderProps"; "required": true; }; "injector": { "alias": "flexRenderInjector"; "required": false; }; }, {}, never, never, true, never>;
|
package/dist/index.d.ts
CHANGED
|
@@ -2,4 +2,4 @@ import { type Signal } from '@angular/core';
|
|
|
2
2
|
import { RowData, TableOptions, type Table } from '@tanstack/table-core';
|
|
3
3
|
export * from '@tanstack/table-core';
|
|
4
4
|
export { type FlexRenderContent, FlexRenderComponent, FlexRenderDirective, injectFlexRenderContext, } from './flex-render';
|
|
5
|
-
export declare function
|
|
5
|
+
export declare function injectTable<TData extends RowData>(options: () => TableOptions<TData>): Table<TData> & Signal<Table<TData>>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/angular-table",
|
|
3
|
-
"version": "9.0.0-alpha.
|
|
3
|
+
"version": "9.0.0-alpha.10",
|
|
4
4
|
"description": "Headless UI for building powerful tables & datagrids for Angular.",
|
|
5
5
|
"author": "Tanner Linsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -42,15 +42,15 @@
|
|
|
42
42
|
"src"
|
|
43
43
|
],
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"tslib": "^2.6.
|
|
46
|
-
"@tanstack/table-core": "9.0.0-alpha.
|
|
45
|
+
"tslib": "^2.6.3",
|
|
46
|
+
"@tanstack/table-core": "9.0.0-alpha.10"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"@analogjs/vite-plugin-angular": "^1.
|
|
50
|
-
"@angular/core": "^
|
|
51
|
-
"@angular/platform-browser": "^
|
|
52
|
-
"@angular/platform-browser-dynamic": "^
|
|
53
|
-
"ng-packagr": "^
|
|
49
|
+
"@analogjs/vite-plugin-angular": "^1.5.0",
|
|
50
|
+
"@angular/core": "^18.0.3",
|
|
51
|
+
"@angular/platform-browser": "^18.0.3",
|
|
52
|
+
"@angular/platform-browser-dynamic": "^18.0.3",
|
|
53
|
+
"ng-packagr": "^18.0.0"
|
|
54
54
|
},
|
|
55
55
|
"peerDependencies": {
|
|
56
56
|
"@angular/core": ">=17"
|
package/src/flex-render.ts
CHANGED
|
@@ -2,22 +2,24 @@ import {
|
|
|
2
2
|
ChangeDetectorRef,
|
|
3
3
|
ComponentRef,
|
|
4
4
|
Directive,
|
|
5
|
-
type DoCheck,
|
|
6
5
|
EmbeddedViewRef,
|
|
7
6
|
Inject,
|
|
8
7
|
inject,
|
|
9
8
|
InjectionToken,
|
|
10
9
|
Injector,
|
|
11
10
|
Input,
|
|
12
|
-
|
|
11
|
+
isSignal,
|
|
12
|
+
type OnChanges,
|
|
13
|
+
type SimpleChanges,
|
|
13
14
|
TemplateRef,
|
|
14
|
-
|
|
15
|
+
Type,
|
|
15
16
|
ViewContainerRef,
|
|
16
17
|
} from '@angular/core'
|
|
17
18
|
|
|
18
19
|
export type FlexRenderContent<TProps extends NonNullable<unknown>> =
|
|
19
20
|
| string
|
|
20
21
|
| number
|
|
22
|
+
| Type<TProps>
|
|
21
23
|
| FlexRenderComponent<TProps>
|
|
22
24
|
| TemplateRef<{ $implicit: TProps }>
|
|
23
25
|
| null
|
|
@@ -28,13 +30,14 @@ export type FlexRenderContent<TProps extends NonNullable<unknown>> =
|
|
|
28
30
|
standalone: true,
|
|
29
31
|
})
|
|
30
32
|
export class FlexRenderDirective<TProps extends NonNullable<unknown>>
|
|
31
|
-
implements
|
|
33
|
+
implements OnChanges
|
|
32
34
|
{
|
|
33
35
|
@Input({ required: true, alias: 'flexRender' })
|
|
34
36
|
content:
|
|
35
37
|
| number
|
|
36
38
|
| string
|
|
37
39
|
| ((props: TProps) => FlexRenderContent<TProps>)
|
|
40
|
+
| null
|
|
38
41
|
| undefined = undefined
|
|
39
42
|
|
|
40
43
|
@Input({ required: true, alias: 'flexRenderProps' })
|
|
@@ -52,32 +55,28 @@ export class FlexRenderDirective<TProps extends NonNullable<unknown>>
|
|
|
52
55
|
|
|
53
56
|
ref?: ComponentRef<unknown> | EmbeddedViewRef<unknown> | null = null
|
|
54
57
|
|
|
55
|
-
|
|
56
|
-
this.ref = this.render()
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
ngDoCheck() {
|
|
58
|
+
ngOnChanges(changes: SimpleChanges) {
|
|
60
59
|
if (this.ref instanceof ComponentRef) {
|
|
61
60
|
this.ref.injector.get(ChangeDetectorRef).markForCheck()
|
|
62
|
-
} else if (this.ref instanceof EmbeddedViewRef) {
|
|
63
|
-
this.ref.markForCheck()
|
|
64
61
|
}
|
|
62
|
+
if (!changes['content']) {
|
|
63
|
+
return
|
|
64
|
+
}
|
|
65
|
+
this.render()
|
|
65
66
|
}
|
|
66
67
|
|
|
67
68
|
render() {
|
|
68
69
|
this.viewContainerRef.clear()
|
|
69
70
|
const { content, props } = this
|
|
70
|
-
if (
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
if (typeof content === 'string' || typeof content === 'number') {
|
|
75
|
-
return this.renderStringContent()
|
|
71
|
+
if (content === null || content === undefined) {
|
|
72
|
+
this.ref = null
|
|
73
|
+
return
|
|
76
74
|
}
|
|
77
75
|
if (typeof content === 'function') {
|
|
78
76
|
return this.renderContent(content(props))
|
|
77
|
+
} else {
|
|
78
|
+
return this.renderContent(content)
|
|
79
79
|
}
|
|
80
|
-
return null
|
|
81
80
|
}
|
|
82
81
|
|
|
83
82
|
private renderContent(content: FlexRenderContent<TProps>) {
|
|
@@ -91,6 +90,8 @@ export class FlexRenderDirective<TProps extends NonNullable<unknown>>
|
|
|
91
90
|
)
|
|
92
91
|
} else if (content instanceof FlexRenderComponent) {
|
|
93
92
|
return this.renderComponent(content)
|
|
93
|
+
} else if (content instanceof Type) {
|
|
94
|
+
return this.renderCustomComponent(content)
|
|
94
95
|
} else {
|
|
95
96
|
return null
|
|
96
97
|
}
|
|
@@ -137,6 +138,25 @@ export class FlexRenderDirective<TProps extends NonNullable<unknown>>
|
|
|
137
138
|
return componentRef
|
|
138
139
|
}
|
|
139
140
|
|
|
141
|
+
private renderCustomComponent(
|
|
142
|
+
component: Type<unknown>
|
|
143
|
+
): ComponentRef<unknown> {
|
|
144
|
+
const componentRef = this.viewContainerRef.createComponent(component, {
|
|
145
|
+
injector: this.injector,
|
|
146
|
+
})
|
|
147
|
+
for (const prop in this.props) {
|
|
148
|
+
// Only signal based input can be added here
|
|
149
|
+
if (
|
|
150
|
+
componentRef.instance?.hasOwnProperty(prop) &&
|
|
151
|
+
// @ts-ignore
|
|
152
|
+
isSignal(componentRef.instance[prop])
|
|
153
|
+
) {
|
|
154
|
+
componentRef.setInput(prop, this.props[prop])
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return componentRef
|
|
158
|
+
}
|
|
159
|
+
|
|
140
160
|
private getTemplateRefContext() {
|
|
141
161
|
const getContext = () => this.props
|
|
142
162
|
return {
|
package/src/index.ts
CHANGED
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
TableOptions,
|
|
5
5
|
TableOptionsResolved,
|
|
6
6
|
TableState,
|
|
7
|
-
|
|
7
|
+
_createTable,
|
|
8
8
|
type Table,
|
|
9
9
|
} from '@tanstack/table-core'
|
|
10
10
|
import { lazyInit } from './lazy-signal-initializer'
|
|
@@ -19,7 +19,7 @@ export {
|
|
|
19
19
|
injectFlexRenderContext,
|
|
20
20
|
} from './flex-render'
|
|
21
21
|
|
|
22
|
-
export function
|
|
22
|
+
export function injectTable<TData extends RowData>(
|
|
23
23
|
options: () => TableOptions<TData>
|
|
24
24
|
): Table<TData> & Signal<Table<TData>> {
|
|
25
25
|
return lazyInit(() => {
|
|
@@ -30,7 +30,7 @@ export function createAngularTable<TData extends RowData>(
|
|
|
30
30
|
...options(),
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
const table =
|
|
33
|
+
const table = _createTable(resolvedOptions)
|
|
34
34
|
|
|
35
35
|
// By default, manage table state here using the table's initial state
|
|
36
36
|
const state = signal<TableState>(table.initialState)
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { describe, test } from 'vitest'
|
|
2
|
-
import {
|
|
3
|
-
type ColumnDef,
|
|
4
|
-
createAngularTable,
|
|
5
|
-
getCoreRowModel,
|
|
6
|
-
type Table,
|
|
7
|
-
} from '../index'
|
|
8
|
-
import { Component, input, isSignal, signal, untracked } from '@angular/core'
|
|
9
|
-
import { TestBed } from '@angular/core/testing'
|
|
10
|
-
import { setSignalInputs } from './test-utils'
|
|
11
|
-
|
|
12
|
-
describe('createAngularTable', () => {
|
|
13
|
-
test('should render with required signal inputs', () => {
|
|
14
|
-
@Component({
|
|
15
|
-
selector: 'app-fake',
|
|
16
|
-
template: ``,
|
|
17
|
-
standalone: true,
|
|
18
|
-
})
|
|
19
|
-
class FakeComponent {
|
|
20
|
-
data = input.required<any[]>()
|
|
21
|
-
|
|
22
|
-
table = createAngularTable(() => ({
|
|
23
|
-
data: this.data(),
|
|
24
|
-
columns: [],
|
|
25
|
-
getCoreRowModel: getCoreRowModel(),
|
|
26
|
-
}))
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const fixture = TestBed.createComponent(FakeComponent)
|
|
30
|
-
setSignalInputs(fixture.componentInstance, {
|
|
31
|
-
data: [],
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
fixture.detectChanges()
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
describe('Proxy table', () => {
|
|
38
|
-
type Data = { id: string; title: string }
|
|
39
|
-
const data = signal<Data[]>([{ id: '1', title: 'Title' }])
|
|
40
|
-
const columns: ColumnDef<Data>[] = [
|
|
41
|
-
{ id: 'id', header: 'Id', cell: context => context.getValue() },
|
|
42
|
-
{ id: 'title', header: 'Title', cell: context => context.getValue() },
|
|
43
|
-
]
|
|
44
|
-
const table = createAngularTable(() => ({
|
|
45
|
-
data: data(),
|
|
46
|
-
columns: columns,
|
|
47
|
-
getCoreRowModel: getCoreRowModel(),
|
|
48
|
-
getRowId: row => row.id,
|
|
49
|
-
}))
|
|
50
|
-
const tablePropertyKeys = Object.keys(table())
|
|
51
|
-
|
|
52
|
-
test('table must be a signal', () => {
|
|
53
|
-
expect(isSignal(table)).toEqual(true)
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
test('supports "in" operator', () => {
|
|
57
|
-
expect('getCoreRowModel' in table).toBe(true)
|
|
58
|
-
expect('options' in table).toBe(true)
|
|
59
|
-
expect('notFound' in table).toBe(false)
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
test('supports "Object.keys"', () => {
|
|
63
|
-
const keys = Object.keys(table())
|
|
64
|
-
expect(Object.keys(table)).toEqual(keys)
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
test.each(
|
|
68
|
-
tablePropertyKeys.map(property => [
|
|
69
|
-
property,
|
|
70
|
-
testShouldBeComputedProperty(untracked(table), property),
|
|
71
|
-
])
|
|
72
|
-
)('property (%s) is computed -> (%s)', (name, expected) => {
|
|
73
|
-
const tableProperty = table[name as keyof typeof table]
|
|
74
|
-
expect(isSignal(tableProperty)).toEqual(expected)
|
|
75
|
-
})
|
|
76
|
-
})
|
|
77
|
-
})
|
|
78
|
-
|
|
79
|
-
const testShouldBeComputedProperty = (
|
|
80
|
-
table: Table<any>,
|
|
81
|
-
propertyName: string
|
|
82
|
-
) => {
|
|
83
|
-
if (propertyName.endsWith('Handler') || propertyName.endsWith('Model')) {
|
|
84
|
-
return false
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
if (propertyName.startsWith('get')) {
|
|
88
|
-
// Only properties with no arguments are computed
|
|
89
|
-
const fn = table[propertyName as keyof Table<any>]
|
|
90
|
-
// Cannot test if is lazy computed since we return the unwrapped value
|
|
91
|
-
return fn instanceof Function && fn.length === 0
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
return false
|
|
95
|
-
}
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from 'vitest'
|
|
2
|
-
import {
|
|
3
|
-
ChangeDetectionStrategy,
|
|
4
|
-
ChangeDetectorRef,
|
|
5
|
-
Component,
|
|
6
|
-
inject,
|
|
7
|
-
Input,
|
|
8
|
-
input,
|
|
9
|
-
type OnInit,
|
|
10
|
-
type TemplateRef,
|
|
11
|
-
ViewChild,
|
|
12
|
-
} from '@angular/core'
|
|
13
|
-
import { createColumnHelper } from '@tanstack/table-core'
|
|
14
|
-
import {
|
|
15
|
-
FlexRenderComponent,
|
|
16
|
-
FlexRenderDirective,
|
|
17
|
-
injectFlexRenderContext,
|
|
18
|
-
} from '../flex-render'
|
|
19
|
-
import { type ComponentFixture, TestBed } from '@angular/core/testing'
|
|
20
|
-
import { setFixtureSignalInput, setFixtureSignalInputs } from './test-utils'
|
|
21
|
-
|
|
22
|
-
interface Data {
|
|
23
|
-
id: string
|
|
24
|
-
title: string
|
|
25
|
-
description: string
|
|
26
|
-
status: 'success' | 'failed' | 'pending'
|
|
27
|
-
favorite?: boolean
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
describe('FlexRenderDirective', () => {
|
|
31
|
-
const helper = createColumnHelper<Data>()
|
|
32
|
-
|
|
33
|
-
test('should render primitives', async () => {
|
|
34
|
-
const fixture = TestBed.createComponent(TestRenderComponent)
|
|
35
|
-
|
|
36
|
-
// String
|
|
37
|
-
setFixtureSignalInputs(fixture, {
|
|
38
|
-
content: 'My value',
|
|
39
|
-
context: {},
|
|
40
|
-
})
|
|
41
|
-
expectPrimitiveValueIs(fixture, 'My value')
|
|
42
|
-
|
|
43
|
-
// Numbers
|
|
44
|
-
setFixtureSignalInputs(fixture, {
|
|
45
|
-
content: 0,
|
|
46
|
-
context: {},
|
|
47
|
-
})
|
|
48
|
-
expectPrimitiveValueIs(fixture, '0')
|
|
49
|
-
|
|
50
|
-
// Functions that returns primitives
|
|
51
|
-
setFixtureSignalInputs(fixture, {
|
|
52
|
-
content: () => 'My value 2',
|
|
53
|
-
context: {},
|
|
54
|
-
})
|
|
55
|
-
expectPrimitiveValueIs(fixture, 'My value 2')
|
|
56
|
-
|
|
57
|
-
// Null
|
|
58
|
-
setFixtureSignalInputs(fixture, {
|
|
59
|
-
content: () => null,
|
|
60
|
-
context: {},
|
|
61
|
-
})
|
|
62
|
-
expectPrimitiveValueIs(fixture, '')
|
|
63
|
-
|
|
64
|
-
// Undefined
|
|
65
|
-
setFixtureSignalInputs(fixture, {
|
|
66
|
-
content: () => undefined,
|
|
67
|
-
context: {},
|
|
68
|
-
})
|
|
69
|
-
expectPrimitiveValueIs(fixture, '')
|
|
70
|
-
})
|
|
71
|
-
|
|
72
|
-
test('should render TemplateRef', () => {
|
|
73
|
-
@Component({
|
|
74
|
-
template: `
|
|
75
|
-
<ng-template #template let-context>{{ context.property }}</ng-template>
|
|
76
|
-
`,
|
|
77
|
-
standalone: true,
|
|
78
|
-
})
|
|
79
|
-
class FakeTemplateRefComponent {
|
|
80
|
-
@ViewChild('template', { static: true })
|
|
81
|
-
templateRef!: TemplateRef<any>
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
const templateRef = TestBed.createComponent(FakeTemplateRefComponent)
|
|
85
|
-
.componentInstance.templateRef
|
|
86
|
-
|
|
87
|
-
const fixture = TestBed.createComponent(TestRenderComponent)
|
|
88
|
-
setFixtureSignalInputs(fixture, {
|
|
89
|
-
content: () => templateRef,
|
|
90
|
-
context: {
|
|
91
|
-
property: 'Property context value',
|
|
92
|
-
},
|
|
93
|
-
})
|
|
94
|
-
|
|
95
|
-
expect(fixture.nativeElement.textContent).toEqual('Property context value')
|
|
96
|
-
|
|
97
|
-
setFixtureSignalInput(fixture, 'context', { property: 'Updated value' })
|
|
98
|
-
fixture.detectChanges()
|
|
99
|
-
|
|
100
|
-
expect(fixture.nativeElement.textContent).toEqual('Updated value')
|
|
101
|
-
})
|
|
102
|
-
|
|
103
|
-
test('should render components', () => {
|
|
104
|
-
@Component({
|
|
105
|
-
template: `{{ context.property }}`,
|
|
106
|
-
standalone: true,
|
|
107
|
-
})
|
|
108
|
-
class FakeComponent {
|
|
109
|
-
context = injectFlexRenderContext<{ property: string }>()
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
const fixture = TestBed.createComponent(TestRenderComponent)
|
|
113
|
-
setFixtureSignalInputs(fixture, {
|
|
114
|
-
content: () => new FlexRenderComponent(FakeComponent),
|
|
115
|
-
context: {
|
|
116
|
-
property: 'Context value',
|
|
117
|
-
},
|
|
118
|
-
})
|
|
119
|
-
|
|
120
|
-
expect(fixture.nativeElement.textContent).toEqual('Context value')
|
|
121
|
-
|
|
122
|
-
setFixtureSignalInput(fixture, 'context', { property: 'Updated value' })
|
|
123
|
-
fixture.detectChanges()
|
|
124
|
-
|
|
125
|
-
expect(fixture.nativeElement.textContent).toEqual('Updated value')
|
|
126
|
-
})
|
|
127
|
-
})
|
|
128
|
-
|
|
129
|
-
@Component({
|
|
130
|
-
selector: 'app-test-render',
|
|
131
|
-
template: `
|
|
132
|
-
<ng-container *flexRender="content(); props: context(); let renderValue">
|
|
133
|
-
<span [innerHTML]="renderValue"></span>
|
|
134
|
-
</ng-container>
|
|
135
|
-
`,
|
|
136
|
-
standalone: true,
|
|
137
|
-
imports: [FlexRenderDirective],
|
|
138
|
-
})
|
|
139
|
-
class TestRenderComponent {
|
|
140
|
-
readonly content = input.required<FlexRenderDirectiveAllowedContent>()
|
|
141
|
-
|
|
142
|
-
readonly context = input.required<Record<string, unknown>>()
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
type FlexRenderDirectiveAllowedContent = FlexRenderDirective<
|
|
146
|
-
NonNullable<unknown>
|
|
147
|
-
>['content']
|
|
148
|
-
|
|
149
|
-
function expectPrimitiveValueIs(
|
|
150
|
-
fixture: ComponentFixture<unknown>,
|
|
151
|
-
value: unknown
|
|
152
|
-
) {
|
|
153
|
-
const span = fixture.nativeElement.querySelector('span')
|
|
154
|
-
expect(span).toBeDefined()
|
|
155
|
-
expect(span.innerHTML).toEqual(value)
|
|
156
|
-
}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from 'vitest'
|
|
2
|
-
import {
|
|
3
|
-
ChangeDetectionStrategy,
|
|
4
|
-
Component,
|
|
5
|
-
type WritableSignal,
|
|
6
|
-
computed,
|
|
7
|
-
effect,
|
|
8
|
-
input,
|
|
9
|
-
signal,
|
|
10
|
-
} from '@angular/core'
|
|
11
|
-
import { TestBed } from '@angular/core/testing'
|
|
12
|
-
import { lazyInit } from '../lazy-signal-initializer'
|
|
13
|
-
import { flushQueue, setFixtureSignalInputs } from './test-utils'
|
|
14
|
-
|
|
15
|
-
describe('lazyInit', () => {
|
|
16
|
-
test('should init lazily in next tick when not accessing manually', async () => {
|
|
17
|
-
const mockFn = vi.fn()
|
|
18
|
-
|
|
19
|
-
TestBed.runInInjectionContext(() => {
|
|
20
|
-
lazyInit(() => {
|
|
21
|
-
mockFn()
|
|
22
|
-
return {
|
|
23
|
-
data: signal(true),
|
|
24
|
-
}
|
|
25
|
-
})
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
expect(mockFn).not.toHaveBeenCalled()
|
|
29
|
-
|
|
30
|
-
await new Promise(setImmediate)
|
|
31
|
-
|
|
32
|
-
expect(mockFn).toHaveBeenCalled()
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
test('should init eagerly accessing manually', async () => {
|
|
36
|
-
const mockFn = vi.fn()
|
|
37
|
-
|
|
38
|
-
TestBed.runInInjectionContext(() => {
|
|
39
|
-
const lazySignal = lazyInit(() => {
|
|
40
|
-
mockFn()
|
|
41
|
-
return {
|
|
42
|
-
data: signal(true),
|
|
43
|
-
}
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
lazySignal.data()
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
expect(mockFn).toHaveBeenCalled()
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
test('should init lazily and only once', async () => {
|
|
53
|
-
const initCallFn = vi.fn()
|
|
54
|
-
const registerDataValue = vi.fn<[number]>()
|
|
55
|
-
|
|
56
|
-
let value!: { data: WritableSignal<number> }
|
|
57
|
-
const outerSignal = signal(0)
|
|
58
|
-
|
|
59
|
-
TestBed.runInInjectionContext(() => {
|
|
60
|
-
value = lazyInit(() => {
|
|
61
|
-
initCallFn()
|
|
62
|
-
|
|
63
|
-
void outerSignal()
|
|
64
|
-
|
|
65
|
-
return { data: signal(0) }
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
effect(() => registerDataValue(value.data()))
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
value.data()
|
|
72
|
-
|
|
73
|
-
await flushQueue()
|
|
74
|
-
|
|
75
|
-
expect(outerSignal).toBeDefined()
|
|
76
|
-
|
|
77
|
-
expect(initCallFn).toHaveBeenCalledTimes(1)
|
|
78
|
-
|
|
79
|
-
outerSignal.set(1)
|
|
80
|
-
await flushQueue()
|
|
81
|
-
outerSignal.set(2)
|
|
82
|
-
await flushQueue()
|
|
83
|
-
value.data.set(4)
|
|
84
|
-
await flushQueue()
|
|
85
|
-
|
|
86
|
-
expect(initCallFn).toHaveBeenCalledTimes(1)
|
|
87
|
-
expect(registerDataValue).toHaveBeenCalledTimes(2)
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
test('should support required signal input', async () => {
|
|
91
|
-
@Component({
|
|
92
|
-
standalone: true,
|
|
93
|
-
template: `{{ call }} - {{ lazySignal.data() }}`,
|
|
94
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
95
|
-
})
|
|
96
|
-
class Test {
|
|
97
|
-
readonly title = input.required<string>()
|
|
98
|
-
call = 0
|
|
99
|
-
|
|
100
|
-
lazySignal = lazyInit(() => {
|
|
101
|
-
this.call++
|
|
102
|
-
return {
|
|
103
|
-
data: computed(() => this.title()),
|
|
104
|
-
}
|
|
105
|
-
})
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
const fixture = TestBed.createComponent(Test)
|
|
109
|
-
|
|
110
|
-
setFixtureSignalInputs(fixture, { title: 'newValue' })
|
|
111
|
-
expect(fixture.debugElement.nativeElement.textContent).toBe('0 - newValue')
|
|
112
|
-
await flushQueue()
|
|
113
|
-
|
|
114
|
-
setFixtureSignalInputs(fixture, { title: 'updatedValue' })
|
|
115
|
-
expect(fixture.debugElement.nativeElement.textContent).toBe(
|
|
116
|
-
'1 - updatedValue'
|
|
117
|
-
)
|
|
118
|
-
|
|
119
|
-
setFixtureSignalInputs(fixture, { title: 'newUpdatedValue' })
|
|
120
|
-
expect(fixture.debugElement.nativeElement.textContent).toBe(
|
|
121
|
-
'1 - newUpdatedValue'
|
|
122
|
-
)
|
|
123
|
-
})
|
|
124
|
-
})
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import '@analogjs/vite-plugin-angular/setup-vitest'
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
BrowserDynamicTestingModule,
|
|
5
|
-
platformBrowserDynamicTesting,
|
|
6
|
-
} from '@angular/platform-browser-dynamic/testing'
|
|
7
|
-
import { getTestBed } from '@angular/core/testing'
|
|
8
|
-
|
|
9
|
-
getTestBed().initTestEnvironment(
|
|
10
|
-
BrowserDynamicTestingModule,
|
|
11
|
-
platformBrowserDynamicTesting()
|
|
12
|
-
)
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import type { InputSignal } from '@angular/core'
|
|
2
|
-
import { SIGNAL, signalSetFn } from '@angular/core/primitives/signals'
|
|
3
|
-
import type { ComponentFixture } from '@angular/core/testing'
|
|
4
|
-
|
|
5
|
-
type ToSignalInputUpdatableMap<T> = {
|
|
6
|
-
[K in keyof T as T[K] extends InputSignal<any>
|
|
7
|
-
? K
|
|
8
|
-
: never]: T[K] extends InputSignal<infer Value> ? Value : never
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Set required signal input value to component fixture
|
|
13
|
-
* @see https://github.com/angular/angular/issues/54013
|
|
14
|
-
*/
|
|
15
|
-
export function setSignalInputs<T extends NonNullable<unknown>>(
|
|
16
|
-
component: T,
|
|
17
|
-
inputs: ToSignalInputUpdatableMap<T>
|
|
18
|
-
) {
|
|
19
|
-
for (const inputKey in inputs) {
|
|
20
|
-
if (componentHasSignalInputProperty(component, inputKey)) {
|
|
21
|
-
signalSetFn(component[inputKey][SIGNAL], inputs[inputKey])
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export function setFixtureSignalInputs<T extends NonNullable<unknown>>(
|
|
27
|
-
componentFixture: ComponentFixture<T>,
|
|
28
|
-
inputs: ToSignalInputUpdatableMap<T>,
|
|
29
|
-
options: { detectChanges: boolean } = { detectChanges: true }
|
|
30
|
-
) {
|
|
31
|
-
setSignalInputs(componentFixture.componentInstance, inputs)
|
|
32
|
-
if (options.detectChanges) {
|
|
33
|
-
componentFixture.detectChanges()
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export function setFixtureSignalInput<
|
|
38
|
-
T extends NonNullable<unknown>,
|
|
39
|
-
InputMaps extends ToSignalInputUpdatableMap<T>,
|
|
40
|
-
InputName extends keyof InputMaps,
|
|
41
|
-
>(
|
|
42
|
-
componentFixture: ComponentFixture<T>,
|
|
43
|
-
inputName: InputName,
|
|
44
|
-
value: InputMaps[InputName]
|
|
45
|
-
) {
|
|
46
|
-
setSignalInputs(componentFixture.componentInstance, {
|
|
47
|
-
[inputName]: value,
|
|
48
|
-
} as ToSignalInputUpdatableMap<T>)
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function componentHasSignalInputProperty<TProperty extends string>(
|
|
52
|
-
component: object,
|
|
53
|
-
property: TProperty
|
|
54
|
-
): component is { [key in TProperty]: InputSignal<unknown> } {
|
|
55
|
-
return (
|
|
56
|
-
component.hasOwnProperty(property) && (component as any)[property][SIGNAL]
|
|
57
|
-
)
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export async function flushQueue() {
|
|
61
|
-
await new Promise(setImmediate)
|
|
62
|
-
}
|