@nova-design-system/nova-angular-18 3.15.0 → 3.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/nova-components/esm2022/lib/components/datatable.utils/flex-render/context.mjs +6 -0
- package/dist/nova-components/esm2022/lib/components/datatable.utils/flex-render/flags.mjs +42 -0
- package/dist/nova-components/esm2022/lib/components/datatable.utils/flex-render/flex-render-component-ref.mjs +171 -0
- package/dist/nova-components/esm2022/lib/components/datatable.utils/flex-render/flex-render-component.mjs +39 -0
- package/dist/nova-components/esm2022/lib/components/datatable.utils/flex-render/view.mjs +101 -0
- package/dist/nova-components/esm2022/lib/components/datatable.utils/flex-render.mjs +211 -0
- package/dist/nova-components/esm2022/lib/components/datatable.utils/index.mjs +49 -0
- package/dist/nova-components/esm2022/lib/components/datatable.utils/lazy-signal-initializer.mjs +43 -0
- package/dist/nova-components/esm2022/lib/components/datatable.utils/proxy.mjs +87 -0
- package/dist/nova-components/esm2022/lib/components/index.mjs +2 -0
- package/dist/nova-components/esm2022/lib/components/nv-datatable.component.mjs +158 -0
- package/dist/nova-components/esm2022/lib/nova-components.module.mjs +7 -5
- package/dist/nova-components/esm2022/lib/stencil-generated/component-value-accessors.mjs +37 -1
- package/dist/nova-components/esm2022/lib/stencil-generated/components.mjs +5 -34
- package/dist/nova-components/esm2022/lib/stencil-generated/index.mjs +1 -2
- package/dist/nova-components/esm2022/public-api.mjs +2 -1
- package/dist/nova-components/fesm2022/nova-components.mjs +927 -40
- package/dist/nova-components/fesm2022/nova-components.mjs.map +1 -1
- package/dist/nova-components/lib/components/datatable.utils/flex-render/context.d.ts +3 -0
- package/dist/nova-components/lib/components/datatable.utils/flex-render/flags.d.ts +40 -0
- package/dist/nova-components/lib/components/datatable.utils/flex-render/flex-render-component-ref.d.ts +39 -0
- package/dist/nova-components/lib/components/datatable.utils/flex-render/flex-render-component.d.ts +60 -0
- package/dist/nova-components/lib/components/datatable.utils/flex-render/view.d.ts +49 -0
- package/dist/nova-components/lib/components/datatable.utils/flex-render.d.ts +26 -0
- package/dist/nova-components/lib/components/datatable.utils/index.d.ts +6 -0
- package/dist/nova-components/lib/components/datatable.utils/lazy-signal-initializer.d.ts +5 -0
- package/dist/nova-components/lib/components/datatable.utils/proxy.d.ts +3 -0
- package/dist/nova-components/lib/components/index.d.ts +1 -0
- package/dist/nova-components/lib/components/nv-datatable.component.d.ts +46 -0
- package/dist/nova-components/lib/nova-components.module.d.ts +4 -3
- package/dist/nova-components/lib/stencil-generated/component-value-accessors.d.ts +8 -1
- package/dist/nova-components/lib/stencil-generated/components.d.ts +3 -21
- package/dist/nova-components/lib/stencil-generated/index.d.ts +1 -1
- package/dist/nova-components/public-api.d.ts +1 -0
- package/package.json +5 -3
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { ChangeDetectorRef, Directive, effect, Inject, inject, Injector, Input, runInInjectionContext, TemplateRef, ViewContainerRef, } from '@angular/core';
|
|
2
|
+
import { FlexRenderComponentProps } from './flex-render/context';
|
|
3
|
+
import { FlexRenderFlags } from './flex-render/flags';
|
|
4
|
+
import { flexRenderComponent, } from './flex-render/flex-render-component';
|
|
5
|
+
import { FlexRenderComponentFactory } from './flex-render/flex-render-component-ref';
|
|
6
|
+
import { FlexRenderComponentView, FlexRenderTemplateView, mapToFlexRenderTypedContent, } from './flex-render/view';
|
|
7
|
+
import { memo } from '@tanstack/table-core';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
export { injectFlexRenderContext, } from './flex-render/context';
|
|
10
|
+
export class FlexRenderDirective {
|
|
11
|
+
#flexRenderComponentFactory;
|
|
12
|
+
#changeDetectorRef;
|
|
13
|
+
#latestContent;
|
|
14
|
+
#getContentValue;
|
|
15
|
+
constructor(viewContainerRef, templateRef) {
|
|
16
|
+
this.viewContainerRef = viewContainerRef;
|
|
17
|
+
this.templateRef = templateRef;
|
|
18
|
+
this.#flexRenderComponentFactory = inject(FlexRenderComponentFactory);
|
|
19
|
+
this.#changeDetectorRef = inject(ChangeDetectorRef);
|
|
20
|
+
this.content = undefined;
|
|
21
|
+
this.props = {};
|
|
22
|
+
this.injector = inject(Injector);
|
|
23
|
+
this.renderFlags = FlexRenderFlags.ViewFirstRender;
|
|
24
|
+
this.renderView = null;
|
|
25
|
+
this.#latestContent = () => {
|
|
26
|
+
const { content, props } = this;
|
|
27
|
+
return typeof content !== 'function'
|
|
28
|
+
? content
|
|
29
|
+
: runInInjectionContext(this.injector, () => content(props));
|
|
30
|
+
};
|
|
31
|
+
this.#getContentValue = memo(() => [this.#latestContent(), this.props, this.content], latestContent => {
|
|
32
|
+
return mapToFlexRenderTypedContent(latestContent);
|
|
33
|
+
}, { key: 'flexRenderContentValue', debug: () => false });
|
|
34
|
+
this.#currentEffectRef = null;
|
|
35
|
+
}
|
|
36
|
+
ngOnChanges(changes) {
|
|
37
|
+
if (changes['props']) {
|
|
38
|
+
this.renderFlags |= FlexRenderFlags.PropsReferenceChanged;
|
|
39
|
+
}
|
|
40
|
+
if (changes['content']) {
|
|
41
|
+
this.renderFlags |=
|
|
42
|
+
FlexRenderFlags.ContentChanged | FlexRenderFlags.ViewFirstRender;
|
|
43
|
+
this.update();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
ngDoCheck() {
|
|
47
|
+
if (this.renderFlags & FlexRenderFlags.ViewFirstRender) {
|
|
48
|
+
// On the initial render, the view is created during the `ngOnChanges` hook.
|
|
49
|
+
// Since `ngDoCheck` is called immediately afterward, there's no need to check for changes in this phase.
|
|
50
|
+
this.renderFlags &= ~FlexRenderFlags.ViewFirstRender;
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
this.renderFlags |= FlexRenderFlags.DirtyCheck;
|
|
54
|
+
const latestContent = this.#getContentValue();
|
|
55
|
+
if (latestContent.kind === 'null' || !this.renderView) {
|
|
56
|
+
this.renderFlags |= FlexRenderFlags.ContentChanged;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
this.renderView.content = latestContent;
|
|
60
|
+
const { kind: previousKind } = this.renderView.previousContent;
|
|
61
|
+
if (latestContent.kind !== previousKind) {
|
|
62
|
+
this.renderFlags |= FlexRenderFlags.ContentChanged;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
this.update();
|
|
66
|
+
}
|
|
67
|
+
update() {
|
|
68
|
+
if (this.renderFlags &
|
|
69
|
+
(FlexRenderFlags.ContentChanged | FlexRenderFlags.ViewFirstRender)) {
|
|
70
|
+
this.render();
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (this.renderFlags & FlexRenderFlags.PropsReferenceChanged) {
|
|
74
|
+
if (this.renderView)
|
|
75
|
+
this.renderView.updateProps(this.props);
|
|
76
|
+
this.renderFlags &= ~FlexRenderFlags.PropsReferenceChanged;
|
|
77
|
+
}
|
|
78
|
+
if (this.renderFlags &
|
|
79
|
+
(FlexRenderFlags.DirtyCheck | FlexRenderFlags.DirtySignal)) {
|
|
80
|
+
if (this.renderView)
|
|
81
|
+
this.renderView.dirtyCheck();
|
|
82
|
+
this.renderFlags &= ~(FlexRenderFlags.DirtyCheck | FlexRenderFlags.DirtySignal);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
#currentEffectRef;
|
|
86
|
+
render() {
|
|
87
|
+
if (this.#shouldRecreateEntireView() && this.#currentEffectRef) {
|
|
88
|
+
this.#currentEffectRef.destroy();
|
|
89
|
+
this.#currentEffectRef = null;
|
|
90
|
+
this.renderFlags &= ~FlexRenderFlags.RenderEffectChecked;
|
|
91
|
+
}
|
|
92
|
+
this.viewContainerRef.clear();
|
|
93
|
+
this.renderFlags =
|
|
94
|
+
FlexRenderFlags.Pristine |
|
|
95
|
+
(this.renderFlags & FlexRenderFlags.ViewFirstRender) |
|
|
96
|
+
(this.renderFlags & FlexRenderFlags.RenderEffectChecked);
|
|
97
|
+
const resolvedContent = this.#getContentValue();
|
|
98
|
+
if (resolvedContent.kind === 'null') {
|
|
99
|
+
this.renderView = null;
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
this.renderView = this.#renderViewByContent(resolvedContent);
|
|
103
|
+
}
|
|
104
|
+
// If the content is a function `content(props)`, we initialize an effect
|
|
105
|
+
// in order to react to changes if the given definition use signals.
|
|
106
|
+
if (!this.#currentEffectRef && typeof this.content === 'function') {
|
|
107
|
+
this.#currentEffectRef = effect(() => {
|
|
108
|
+
this.#latestContent();
|
|
109
|
+
if (!(this.renderFlags & FlexRenderFlags.RenderEffectChecked)) {
|
|
110
|
+
this.renderFlags |= FlexRenderFlags.RenderEffectChecked;
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
this.renderFlags |= FlexRenderFlags.DirtySignal;
|
|
114
|
+
// This will mark the view as changed,
|
|
115
|
+
// so we'll try to check for updates into ngDoCheck
|
|
116
|
+
this.#changeDetectorRef.markForCheck();
|
|
117
|
+
}, { injector: this.viewContainerRef.injector });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
#shouldRecreateEntireView() {
|
|
121
|
+
return (this.renderFlags &
|
|
122
|
+
FlexRenderFlags.ContentChanged &
|
|
123
|
+
FlexRenderFlags.ViewFirstRender);
|
|
124
|
+
}
|
|
125
|
+
#renderViewByContent(content) {
|
|
126
|
+
if (content.kind === 'primitive') {
|
|
127
|
+
return this.#renderStringContent(content);
|
|
128
|
+
}
|
|
129
|
+
else if (content.kind === 'templateRef') {
|
|
130
|
+
return this.#renderTemplateRefContent(content);
|
|
131
|
+
}
|
|
132
|
+
else if (content.kind === 'flexRenderComponent') {
|
|
133
|
+
return this.#renderComponent(content);
|
|
134
|
+
}
|
|
135
|
+
else if (content.kind === 'component') {
|
|
136
|
+
return this.#renderCustomComponent(content);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
#renderStringContent(template) {
|
|
143
|
+
const context = () => {
|
|
144
|
+
return typeof this.content === 'string' ||
|
|
145
|
+
typeof this.content === 'number'
|
|
146
|
+
? this.content
|
|
147
|
+
: this.content?.(this.props);
|
|
148
|
+
};
|
|
149
|
+
const ref = this.viewContainerRef.createEmbeddedView(this.templateRef, {
|
|
150
|
+
get $implicit() {
|
|
151
|
+
return context();
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
return new FlexRenderTemplateView(template, ref);
|
|
155
|
+
}
|
|
156
|
+
#renderTemplateRefContent(template) {
|
|
157
|
+
const latestContext = () => this.props;
|
|
158
|
+
const view = this.viewContainerRef.createEmbeddedView(template.content, {
|
|
159
|
+
get $implicit() {
|
|
160
|
+
return latestContext();
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
return new FlexRenderTemplateView(template, view);
|
|
164
|
+
}
|
|
165
|
+
#renderComponent(flexRenderComponent) {
|
|
166
|
+
const { inputs, outputs, injector } = flexRenderComponent.content;
|
|
167
|
+
const getContext = () => this.props;
|
|
168
|
+
const proxy = new Proxy(this.props, {
|
|
169
|
+
get: (_, key) => getContext()[key],
|
|
170
|
+
});
|
|
171
|
+
const componentInjector = Injector.create({
|
|
172
|
+
parent: injector ?? this.injector,
|
|
173
|
+
providers: [{ provide: FlexRenderComponentProps, useValue: proxy }],
|
|
174
|
+
});
|
|
175
|
+
const view = this.#flexRenderComponentFactory.createComponent(flexRenderComponent.content, componentInjector);
|
|
176
|
+
return new FlexRenderComponentView(flexRenderComponent, view);
|
|
177
|
+
}
|
|
178
|
+
#renderCustomComponent(component) {
|
|
179
|
+
const view = this.#flexRenderComponentFactory.createComponent(flexRenderComponent(component.content, {
|
|
180
|
+
inputs: this.props,
|
|
181
|
+
injector: this.injector,
|
|
182
|
+
}), this.injector);
|
|
183
|
+
return new FlexRenderComponentView(component, view);
|
|
184
|
+
}
|
|
185
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FlexRenderDirective, deps: [{ token: ViewContainerRef }, { token: TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
186
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: FlexRenderDirective, isStandalone: true, selector: "[flexRender]", inputs: { content: ["flexRender", "content"], props: ["flexRenderProps", "props"], injector: ["flexRenderInjector", "injector"] }, providers: [FlexRenderComponentFactory], usesOnChanges: true, ngImport: i0 }); }
|
|
187
|
+
}
|
|
188
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FlexRenderDirective, decorators: [{
|
|
189
|
+
type: Directive,
|
|
190
|
+
args: [{
|
|
191
|
+
selector: '[flexRender]',
|
|
192
|
+
standalone: true,
|
|
193
|
+
providers: [FlexRenderComponentFactory],
|
|
194
|
+
}]
|
|
195
|
+
}], ctorParameters: () => [{ type: i0.ViewContainerRef, decorators: [{
|
|
196
|
+
type: Inject,
|
|
197
|
+
args: [ViewContainerRef]
|
|
198
|
+
}] }, { type: i0.TemplateRef, decorators: [{
|
|
199
|
+
type: Inject,
|
|
200
|
+
args: [TemplateRef]
|
|
201
|
+
}] }], propDecorators: { content: [{
|
|
202
|
+
type: Input,
|
|
203
|
+
args: [{ required: true, alias: 'flexRender' }]
|
|
204
|
+
}], props: [{
|
|
205
|
+
type: Input,
|
|
206
|
+
args: [{ required: true, alias: 'flexRenderProps' }]
|
|
207
|
+
}], injector: [{
|
|
208
|
+
type: Input,
|
|
209
|
+
args: [{ required: false, alias: 'flexRenderInjector' }]
|
|
210
|
+
}] } });
|
|
211
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxleC1yZW5kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ub3ZhLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2RhdGF0YWJsZS51dGlscy9mbGV4LXJlbmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxNQUFNLEVBRU4sTUFBTSxFQUNOLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUVMLHFCQUFxQixFQUVyQixXQUFXLEVBRVgsZ0JBQWdCLEdBQ2pCLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUNyRCxPQUFPLEVBQ0wsbUJBQW1CLEdBRXBCLE1BQU0scUNBQXFDLENBQUE7QUFDNUMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0seUNBQXlDLENBQUE7QUFDcEYsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixzQkFBc0IsRUFHdEIsMkJBQTJCLEdBQzVCLE1BQU0sb0JBQW9CLENBQUE7QUFDM0IsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHNCQUFzQixDQUFBOztBQUUzQyxPQUFPLEVBQ0wsdUJBQXVCLEdBRXhCLE1BQU0sdUJBQXVCLENBQUE7QUFpQjlCLE1BQU0sT0FBTyxtQkFBbUI7SUFHckIsMkJBQTJCLENBQXFDO0lBQ2hFLGtCQUFrQixDQUE0QjtJQW1COUMsY0FBYyxDQUt0QjtJQUVELGdCQUFnQixDQU1mO0lBRUQsWUFFbUIsZ0JBQWtDLEVBRWxDLFdBQTZCO1FBRjdCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFFbEMsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO1FBdkN2QyxnQ0FBMkIsR0FBRyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtRQUNo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QU8sSUFBSSx1QkFBdUIsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUMvRCxDQUFDO0lBRUQsc0JBQXNCLENBQ3BCLFNBQWlFO1FBRWpFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxlQUFlLENBQzNELG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUU7WUFDckMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2xCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtTQUN4QixDQUFDLEVBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FDZCxDQUFBO1FBQ0QsT0FBTyxJQUFJLHVCQUF1QixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUNyRCxDQUFDOytHQXZPVSxtQkFBbUIsa0JBdUNwQixnQkFBZ0IsYUFFaEIsV0FBVzttR0F6Q1YsbUJBQW1CLDhMQUZuQixDQUFDLDBCQUEwQixDQUFDOzs0RkFFNUIsbUJBQW1CO2tCQUwvQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxjQUFjO29CQUN4QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsU0FBUyxFQUFFLENBQUMsMEJBQTBCLENBQUM7aUJBQ3hDOzswQkF3Q0ksTUFBTTsyQkFBQyxnQkFBZ0I7OzBCQUV2QixNQUFNOzJCQUFDLFdBQVc7eUNBbENyQixPQUFPO3NCQUROLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUU7Z0JBUzlDLEtBQUs7c0JBREosS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFO2dCQUluRCxRQUFRO3NCQURQLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBEaXJlY3RpdmUsXG4gIERvQ2hlY2ssXG4gIGVmZmVjdCxcbiAgdHlwZSBFZmZlY3RSZWYsXG4gIEluamVjdCxcbiAgaW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgcnVuSW5JbmplY3Rpb25Db250ZXh0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVHlwZSxcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IEZsZXhSZW5kZXJDb21wb25lbnRQcm9wcyB9IGZyb20gJy4vZmxleC1yZW5kZXIvY29udGV4dCdcbmltcG9ydCB7IEZsZXhSZW5kZXJGbGFncyB9IGZyb20gJy4vZmxleC1yZW5kZXIvZmxhZ3MnXG5pbXBvcnQge1xuICBmbGV4UmVuZGVyQ29tcG9uZW50LFxuICBGbGV4UmVuZGVyQ29tcG9uZW50LFxufSBmcm9tICcuL2ZsZXgtcmVuZGVyL2ZsZXgtcmVuZGVyLWNvbXBvbmVudCdcbmltcG9ydCB7IEZsZXhSZW5kZXJDb21wb25lbnRGYWN0b3J5IH0gZnJvbSAnLi9mbGV4LXJlbmRlci9mbGV4LXJlbmRlci1jb21wb25lbnQtcmVmJ1xuaW1wb3J0IHtcbiAgRmxleFJlbmRlckNvbXBvbmVudFZpZXcsXG4gIEZsZXhSZW5kZXJUZW1wbGF0ZVZpZXcsXG4gIHR5cGUgRmxleFJlbmRlclR5cGVkQ29udGVudCxcbiAgRmxleFJlbmRlclZpZXcsXG4gIG1hcFRvRmxleFJlbmRlclR5cGVkQ29udGVudCxcbn0gZnJvbSAnLi9mbGV4LXJlbmRlci92aWV3J1xuaW1wb3J0IHsgbWVtbyB9IGZyb20gJ0B0YW5zdGFjay90YWJsZS1jb3JlJ1xuXG5leHBvcnQge1xuICBpbmplY3RGbGV4UmVuZGVyQ29udGV4dCxcbiAgdHlwZSBGbGV4UmVuZGVyQ29tcG9uZW50UHJvcHMsXG59IGZyb20gJy4vZmxleC1yZW5kZXIvY29udGV4dCdcblxuZXhwb3J0IHR5cGUgRmxleFJlbmRlckNvbnRlbnQ8VFByb3BzIGV4dGVuZHMgTm9uTnVsbGFibGU8dW5rbm93bj4+ID1cbiAgfCBzdHJpbmdcbiAgfCBudW1iZXJcbiAgfCBUeXBlPFRQcm9wcz5cbiAgfCBGbGV4UmVuZGVyQ29tcG9uZW50PFRQcm9wcz5cbiAgfCBUZW1wbGF0ZVJlZjx7ICRpbXBsaWNpdDogVFByb3BzIH0+XG4gIHwgbnVsbFxuICB8IFJlY29yZDxhbnksIGFueT5cbiAgfCB1bmRlZmluZWRcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2ZsZXhSZW5kZXJdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgcHJvdmlkZXJzOiBbRmxleFJlbmRlckNvbXBvbmVudEZhY3RvcnldLFxufSlcbmV4cG9ydCBjbGFzcyBGbGV4UmVuZGVyRGlyZWN0aXZlPFRQcm9wcyBleHRlbmRzIE5vbk51bGxhYmxlPHVua25vd24+PlxuICBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgRG9DaGVja1xue1xuICByZWFkb25seSAjZmxleFJlbmRlckNvbXBvbmVudEZhY3RvcnkgPSBpbmplY3QoRmxleFJlbmRlckNvbXBvbmVudEZhY3RvcnkpXG4gIHJlYWRvbmx5ICNjaGFuZ2VEZXRlY3RvclJlZiA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZilcblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSwgYWxpYXM6ICdmbGV4UmVuZGVyJyB9KVxuICBjb250ZW50OlxuICAgIHwgbnVtYmVyXG4gICAgfCBzdHJpbmdcbiAgICB8ICgocHJvcHM6IFRQcm9wcykgPT4gRmxleFJlbmRlckNvbnRlbnQ8VFByb3BzPilcbiAgICB8IG51bGxcbiAgICB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlLCBhbGlhczogJ2ZsZXhSZW5kZXJQcm9wcycgfSlcbiAgcHJvcHM6IFRQcm9wcyA9IHt9IGFzIFRQcm9wc1xuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiBmYWxzZSwgYWxpYXM6ICdmbGV4UmVuZGVySW5qZWN0b3InIH0pXG4gIGluamVjdG9yOiBJbmplY3RvciA9IGluamVjdChJbmplY3RvcilcblxuICByZW5kZXJGbGFncyA9IEZsZXhSZW5kZXJGbGFncy5WaWV3Rmlyc3RSZW5kZXJcbiAgcmVuZGVyVmlldzogRmxleFJlbmRlclZpZXc8YW55PiB8IG51bGwgPSBudWxsXG5cbiAgcmVhZG9ubHkgI2xhdGVzdENvbnRlbnQgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250ZW50LCBwcm9wcyB9ID0gdGhpc1xuICAgIHJldHVybiB0eXBlb2YgY29udGVudCAhPT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBjb250ZW50XG4gICAgICA6IHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLmluamVjdG9yLCAoKSA9PiBjb250ZW50KHByb3BzKSlcbiAgfVxuXG4gICNnZXRDb250ZW50VmFsdWUgPSBtZW1vKFxuICAgICgpID0+IFt0aGlzLiNsYXRlc3RDb250ZW50KCksIHRoaXMucHJvcHMsIHRoaXMuY29udGVudF0sXG4gICAgbGF0ZXN0Q29udGVudCA9PiB7XG4gICAgICByZXR1cm4gbWFwVG9GbGV4UmVuZGVyVHlwZWRDb250ZW50KGxhdGVzdENvbnRlbnQpXG4gICAgfSxcbiAgICB7IGtleTogJ2ZsZXhSZW5kZXJDb250ZW50VmFsdWUnLCBkZWJ1ZzogKCkgPT4gZmFsc2UgfVxuICApXG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChWaWV3Q29udGFpbmVyUmVmKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICBASW5qZWN0KFRlbXBsYXRlUmVmKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT5cbiAgKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlc1sncHJvcHMnXSkge1xuICAgICAgdGhpcy5yZW5kZXJGbGFncyB8PSBGbGV4UmVuZGVyRmxhZ3MuUHJvcHNSZWZlcmVuY2VDaGFuZ2VkXG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydjb250ZW50J10pIHtcbiAgICAgIHRoaXMucmVuZGVyRmxhZ3MgfD1cbiAgICAgICAgRmxleFJlbmRlckZsYWdzLkNvbnRlbnRDaGFuZ2VkIHwgRmxleFJlbmRlckZsYWdzLlZpZXdGaXJzdFJlbmRlclxuICAgICAgdGhpcy51cGRhdGUoKVxuICAgIH1cbiAgfVxuXG4gIG5nRG9DaGVjaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZW5kZXJGbGFncyAmIEZsZXhSZW5kZXJGbGFncy5WaWV3Rmlyc3RSZW5kZXIpIHtcbiAgICAgIC8vIE9uIHRoZSBpbml0aWFsIHJlbmRlciwgdGhlIHZpZXcgaXMgY3JlYXRlZCBkdXJpbmcgdGhlIGBuZ09uQ2hhbmdlc2AgaG9vay5cbiAgICAgIC8vIFNpbmNlIGBuZ0RvQ2hlY2tgIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlcndhcmQsIHRoZXJlJ3Mgbm8gbmVlZCB0byBjaGVjayBmb3IgY2hhbmdlcyBpbiB0aGlzIHBoYXNlLlxuICAgICAgdGhpcy5yZW5kZXJGbGFncyAmPSB+RmxleFJlbmRlckZsYWdzLlZpZXdGaXJzdFJlbmRlclxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXJGbGFncyB8PSBGbGV4UmVuZGVyRmxhZ3MuRGlydHlDaGVja1xuXG4gICAgY29uc3QgbGF0ZXN0Q29udGVudCA9IHRoaXMuI2dldENvbnRlbnRWYWx1ZSgpXG4gICAgaWYgKGxhdGVzdENvbnRlbnQua2luZCA9PT0gJ251bGwnIHx8ICF0aGlzLnJlbmRlclZpZXcpIHtcbiAgICAgIHRoaXMucmVuZGVyRmxhZ3MgfD0gRmxleFJlbmRlckZsYWdzLkNvbnRlbnRDaGFuZ2VkXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVuZGVyVmlldy5jb250ZW50ID0gbGF0ZXN0Q29udGVudFxuICAgICAgY29uc3QgeyBraW5kOiBwcmV2aW91c0tpbmQgfSA9IHRoaXMucmVuZGVyVmlldy5wcmV2aW91c0NvbnRlbnRcbiAgICAgIGlmIChsYXRlc3RDb250ZW50LmtpbmQgIT09IHByZXZpb3VzS2luZCkge1xuICAgICAgICB0aGlzLnJlbmRlckZsYWdzIHw9IEZsZXhSZW5kZXJGbGFncy5Db250ZW50Q2hhbmdlZFxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZSgpXG4gIH1cblxuICB1cGRhdGUoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5yZW5kZXJGbGFncyAmXG4gICAgICAoRmxleFJlbmRlckZsYWdzLkNvbnRlbnRDaGFuZ2VkIHwgRmxleFJlbmRlckZsYWdzLlZpZXdGaXJzdFJlbmRlcilcbiAgICApIHtcbiAgICAgIHRoaXMucmVuZGVyKClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAodGhpcy5yZW5kZXJGbGFncyAmIEZsZXhSZW5kZXJGbGFncy5Qcm9wc1JlZmVyZW5jZUNoYW5nZWQpIHtcbiAgICAgIGlmICh0aGlzLnJlbmRlclZpZXcpIHRoaXMucmVuZGVyVmlldy51cGRhdGVQcm9wcyh0aGlzLnByb3BzKVxuICAgICAgdGhpcy5yZW5kZXJGbGFncyAmPSB+RmxleFJlbmRlckZsYWdzLlByb3BzUmVmZXJlbmNlQ2hhbmdlZFxuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLnJlbmRlckZsYWdzICZcbiAgICAgIChGbGV4UmVuZGVyRmxhZ3MuRGlydHlDaGVjayB8IEZsZXhSZW5kZXJGbGFncy5EaXJ0eVNpZ25hbClcbiAgICApIHtcbiAgICAgIGlmICh0aGlzLnJlbmRlclZpZXcpIHRoaXMucmVuZGVyVmlldy5kaXJ0eUNoZWNrKClcbiAgICAgIHRoaXMucmVuZGVyRmxhZ3MgJj0gfihcbiAgICAgICAgRmxleFJlbmRlckZsYWdzLkRpcnR5Q2hlY2sgfCBGbGV4UmVuZGVyRmxhZ3MuRGlydHlTaWduYWxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICAjY3VycmVudEVmZmVjdFJlZjogRWZmZWN0UmVmIHwgbnVsbCA9IG51bGxcblxuICByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuI3Nob3VsZFJlY3JlYXRlRW50aXJlVmlldygpICYmIHRoaXMuI2N1cnJlbnRFZmZlY3RSZWYpIHtcbiAgICAgIHRoaXMuI2N1cnJlbnRFZmZlY3RSZWYuZGVzdHJveSgpXG4gICAgICB0aGlzLiNjdXJyZW50RWZmZWN0UmVmID0gbnVsbFxuICAgICAgdGhpcy5yZW5kZXJGbGFncyAmPSB+RmxleFJlbmRlckZsYWdzLlJlbmRlckVmZmVjdENoZWNrZWRcbiAgICB9XG5cbiAgICB0aGlzLnZpZXdDb250YWluZXJSZWYuY2xlYXIoKVxuICAgIHRoaXMucmVuZGVyRmxhZ3MgPVxuICAgICAgRmxleFJlbmRlckZsYWdzLlByaXN0aW5lIHxcbiAgICAgICh0aGlzLnJlbmRlckZsYWdzICYgRmxleFJlbmRlckZsYWdzLlZpZXdGaXJzdFJlbmRlcikgfFxuICAgICAgKHRoaXMucmVuZGVyRmxhZ3MgJiBGbGV4UmVuZGVyRmxhZ3MuUmVuZGVyRWZmZWN0Q2hlY2tlZClcblxuICAgIGNvbnN0IHJlc29sdmVkQ29udGVudCA9IHRoaXMuI2dldENvbnRlbnRWYWx1ZSgpXG4gICAgaWYgKHJlc29sdmVkQ29udGVudC5raW5kID09PSAnbnVsbCcpIHtcbiAgICAgIHRoaXMucmVuZGVyVmlldyA9IG51bGxcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW5kZXJWaWV3ID0gdGhpcy4jcmVuZGVyVmlld0J5Q29udGVudChyZXNvbHZlZENvbnRlbnQpXG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGNvbnRlbnQgaXMgYSBmdW5jdGlvbiBgY29udGVudChwcm9wcylgLCB3ZSBpbml0aWFsaXplIGFuIGVmZmVjdFxuICAgIC8vIGluIG9yZGVyIHRvIHJlYWN0IHRvIGNoYW5nZXMgaWYgdGhlIGdpdmVuIGRlZmluaXRpb24gdXNlIHNpZ25hbHMuXG4gICAgaWYgKCF0aGlzLiNjdXJyZW50RWZmZWN0UmVmICYmIHR5cGVvZiB0aGlzLmNvbnRlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuI2N1cnJlbnRFZmZlY3RSZWYgPSBlZmZlY3QoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLiNsYXRlc3RDb250ZW50KClcbiAgICAgICAgICBpZiAoISh0aGlzLnJlbmRlckZsYWdzICYgRmxleFJlbmRlckZsYWdzLlJlbmRlckVmZmVjdENoZWNrZWQpKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckZsYWdzIHw9IEZsZXhSZW5kZXJGbGFncy5SZW5kZXJFZmZlY3RDaGVja2VkXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5yZW5kZXJGbGFncyB8PSBGbGV4UmVuZGVyRmxhZ3MuRGlydHlTaWduYWxcbiAgICAgICAgICAvLyBUaGlzIHdpbGwgbWFyayB0aGUgdmlldyBhcyBjaGFuZ2VkLFxuICAgICAgICAgIC8vIHNvIHdlJ2xsIHRyeSB0byBjaGVjayBmb3IgdXBkYXRlcyBpbnRvIG5nRG9DaGVja1xuICAgICAgICAgIHRoaXMuI2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpXG4gICAgICAgIH0sXG4gICAgICAgIHsgaW5qZWN0b3I6IHRoaXMudmlld0NvbnRhaW5lclJlZi5pbmplY3RvciB9XG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgI3Nob3VsZFJlY3JlYXRlRW50aXJlVmlldygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5yZW5kZXJGbGFncyAmXG4gICAgICBGbGV4UmVuZGVyRmxhZ3MuQ29udGVudENoYW5nZWQgJlxuICAgICAgRmxleFJlbmRlckZsYWdzLlZpZXdGaXJzdFJlbmRlclxuICAgIClcbiAgfVxuXG4gICNyZW5kZXJWaWV3QnlDb250ZW50KFxuICAgIGNvbnRlbnQ6IEZsZXhSZW5kZXJUeXBlZENvbnRlbnRcbiAgKTogRmxleFJlbmRlclZpZXc8YW55PiB8IG51bGwge1xuICAgIGlmIChjb250ZW50LmtpbmQgPT09ICdwcmltaXRpdmUnKSB7XG4gICAgICByZXR1cm4gdGhpcy4jcmVuZGVyU3RyaW5nQ29udGVudChjb250ZW50KVxuICAgIH0gZWxzZSBpZiAoY29udGVudC5raW5kID09PSAndGVtcGxhdGVSZWYnKSB7XG4gICAgICByZXR1cm4gdGhpcy4jcmVuZGVyVGVtcGxhdGVSZWZDb250ZW50KGNvbnRlbnQpXG4gICAgfSBlbHNlIGlmIChjb250ZW50LmtpbmQgPT09ICdmbGV4UmVuZGVyQ29tcG9uZW50Jykge1xuICAgICAgcmV0dXJuIHRoaXMuI3JlbmRlckNvbXBvbmVudChjb250ZW50KVxuICAgIH0gZWxzZSBpZiAoY29udGVudC5raW5kID09PSAnY29tcG9uZW50Jykge1xuICAgICAgcmV0dXJuIHRoaXMuI3JlbmRlckN1c3RvbUNvbXBvbmVudChjb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gICNyZW5kZXJTdHJpbmdDb250ZW50KFxuICAgIHRlbXBsYXRlOiBFeHRyYWN0PEZsZXhSZW5kZXJUeXBlZENvbnRlbnQsIHsga2luZDogJ3ByaW1pdGl2ZScgfT5cbiAgKTogRmxleFJlbmRlclRlbXBsYXRlVmlldyB7XG4gICAgY29uc3QgY29udGV4dCA9ICgpID0+IHtcbiAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5jb250ZW50ID09PSAnc3RyaW5nJyB8fFxuICAgICAgICB0eXBlb2YgdGhpcy5jb250ZW50ID09PSAnbnVtYmVyJ1xuICAgICAgICA/IHRoaXMuY29udGVudFxuICAgICAgICA6IHRoaXMuY29udGVudD8uKHRoaXMucHJvcHMpXG4gICAgfVxuICAgIGNvbnN0IHJlZiA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy50ZW1wbGF0ZVJlZiwge1xuICAgICAgZ2V0ICRpbXBsaWNpdCgpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQoKVxuICAgICAgfSxcbiAgICB9KVxuICAgIHJldHVybiBuZXcgRmxleFJlbmRlclRlbXBsYXRlVmlldyh0ZW1wbGF0ZSwgcmVmKVxuICB9XG5cbiAgI3JlbmRlclRlbXBsYXRlUmVmQ29udGVudChcbiAgICB0ZW1wbGF0ZTogRXh0cmFjdDxGbGV4UmVuZGVyVHlwZWRDb250ZW50LCB7IGtpbmQ6ICd0ZW1wbGF0ZVJlZicgfT5cbiAgKTogRmxleFJlbmRlclRlbXBsYXRlVmlldyB7XG4gICAgY29uc3QgbGF0ZXN0Q29udGV4dCA9ICgpID0+IHRoaXMucHJvcHNcbiAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0ZW1wbGF0ZS5jb250ZW50LCB7XG4gICAgICBnZXQgJGltcGxpY2l0KCkge1xuICAgICAgICByZXR1cm4gbGF0ZXN0Q29udGV4dCgpXG4gICAgICB9LFxuICAgIH0pXG4gICAgcmV0dXJuIG5ldyBGbGV4UmVuZGVyVGVtcGxhdGVWaWV3KHRlbXBsYXRlLCB2aWV3KVxuICB9XG5cbiAgI3JlbmRlckNvbXBvbmVudChcbiAgICBmbGV4UmVuZGVyQ29tcG9uZW50OiBFeHRyYWN0PFxuICAgICAgRmxleFJlbmRlclR5cGVkQ29udGVudCxcbiAgICAgIHsga2luZDogJ2ZsZXhSZW5kZXJDb21wb25lbnQnIH1cbiAgICA+XG4gICk6IEZsZXhSZW5kZXJDb21wb25lbnRWaWV3IHtcbiAgICBjb25zdCB7IGlucHV0cywgb3V0cHV0cywgaW5qZWN0b3IgfSA9IGZsZXhSZW5kZXJDb21wb25lbnQuY29udGVudFxuXG4gICAgY29uc3QgZ2V0Q29udGV4dCA9ICgpID0+IHRoaXMucHJvcHNcbiAgICBjb25zdCBwcm94eSA9IG5ldyBQcm94eSh0aGlzLnByb3BzLCB7XG4gICAgICBnZXQ6IChfLCBrZXkpID0+IGdldENvbnRleHQoKVtrZXkgYXMga2V5b2YgdHlwZW9mIF9dLFxuICAgIH0pXG4gICAgY29uc3QgY29tcG9uZW50SW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgcGFyZW50OiBpbmplY3RvciA/PyB0aGlzLmluamVjdG9yLFxuICAgICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBGbGV4UmVuZGVyQ29tcG9uZW50UHJvcHMsIHVzZVZhbHVlOiBwcm94eSB9XSxcbiAgICB9KVxuICAgIGNvbnN0IHZpZXcgPSB0aGlzLiNmbGV4UmVuZGVyQ29tcG9uZW50RmFjdG9yeS5jcmVhdGVDb21wb25lbnQoXG4gICAgICBmbGV4UmVuZGVyQ29tcG9uZW50LmNvbnRlbnQsXG4gICAgICBjb21wb25lbnRJbmplY3RvclxuICAgIClcbiAgICByZXR1cm4gbmV3IEZsZXhSZW5kZXJDb21wb25lbnRWaWV3KGZsZXhSZW5kZXJDb21wb25lbnQsIHZpZXcpXG4gIH1cblxuICAjcmVuZGVyQ3VzdG9tQ29tcG9uZW50KFxuICAgIGNvbXBvbmVudDogRXh0cmFjdDxGbGV4UmVuZGVyVHlwZWRDb250ZW50LCB7IGtpbmQ6ICdjb21wb25lbnQnIH0+XG4gICk6IEZsZXhSZW5kZXJDb21wb25lbnRWaWV3IHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy4jZmxleFJlbmRlckNvbXBvbmVudEZhY3RvcnkuY3JlYXRlQ29tcG9uZW50KFxuICAgICAgZmxleFJlbmRlckNvbXBvbmVudChjb21wb25lbnQuY29udGVudCwge1xuICAgICAgICBpbnB1dHM6IHRoaXMucHJvcHMsXG4gICAgICAgIGluamVjdG9yOiB0aGlzLmluamVjdG9yLFxuICAgICAgfSksXG4gICAgICB0aGlzLmluamVjdG9yXG4gICAgKVxuICAgIHJldHVybiBuZXcgRmxleFJlbmRlckNvbXBvbmVudFZpZXcoY29tcG9uZW50LCB2aWV3KVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { computed, signal } from '@angular/core';
|
|
2
|
+
import { createTable, } from '@tanstack/table-core';
|
|
3
|
+
import { lazyInit } from './lazy-signal-initializer';
|
|
4
|
+
import { proxifyTable } from './proxy';
|
|
5
|
+
export * from '@tanstack/table-core';
|
|
6
|
+
export { FlexRenderDirective, FlexRenderDirective as FlexRender, injectFlexRenderContext, } from './flex-render';
|
|
7
|
+
export { FlexRenderComponent, flexRenderComponent, } from './flex-render/flex-render-component';
|
|
8
|
+
export function createAngularTable(options) {
|
|
9
|
+
return lazyInit(() => {
|
|
10
|
+
const resolvedOptions = {
|
|
11
|
+
state: {},
|
|
12
|
+
onStateChange: () => { },
|
|
13
|
+
renderFallbackValue: null,
|
|
14
|
+
...options(),
|
|
15
|
+
};
|
|
16
|
+
const table = createTable(resolvedOptions);
|
|
17
|
+
// By default, manage table state here using the table's initial state
|
|
18
|
+
const state = signal(table.initialState);
|
|
19
|
+
// Compose table options using computed.
|
|
20
|
+
// This is to allow `tableSignal` to listen and set table option
|
|
21
|
+
const updatedOptions = computed(() => {
|
|
22
|
+
// listen to table state changed
|
|
23
|
+
const tableState = state();
|
|
24
|
+
// listen to input options changed
|
|
25
|
+
const tableOptions = options();
|
|
26
|
+
return {
|
|
27
|
+
...table.options,
|
|
28
|
+
...resolvedOptions,
|
|
29
|
+
...tableOptions,
|
|
30
|
+
state: { ...tableState, ...tableOptions.state },
|
|
31
|
+
onStateChange: updater => {
|
|
32
|
+
const value = updater instanceof Function ? updater(tableState) : updater;
|
|
33
|
+
state.set(value);
|
|
34
|
+
resolvedOptions.onStateChange?.(updater);
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
// convert table instance to signal for proxify to listen to any table state and options changes
|
|
39
|
+
const tableSignal = computed(() => {
|
|
40
|
+
table.setOptions(updatedOptions());
|
|
41
|
+
return table;
|
|
42
|
+
}, {
|
|
43
|
+
equal: () => false,
|
|
44
|
+
});
|
|
45
|
+
// proxify Table instance to provide ability for consumer to listen to any table state changes
|
|
46
|
+
return proxifyTable(tableSignal);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ub3ZhLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2RhdGF0YWJsZS51dGlscy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFlLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUM3RCxPQUFPLEVBS0wsV0FBVyxHQUVaLE1BQU0sc0JBQXNCLENBQUE7QUFDN0IsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFFdEMsY0FBYyxzQkFBc0IsQ0FBQTtBQUVwQyxPQUFPLEVBRUwsbUJBQW1CLEVBQ25CLG1CQUFtQixJQUFJLFVBQVUsRUFDakMsdUJBQXVCLEdBRXhCLE1BQU0sZUFBZSxDQUFBO0FBRXRCLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsbUJBQW1CLEdBQ3BCLE1BQU0scUNBQXFDLENBQUE7QUFFNUMsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxPQUFrQztJQUVsQyxPQUFPLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDbkIsTUFBTSxlQUFlLEdBQUc7WUFDdEIsS0FBSyxFQUFFLEVBQUU7WUFDVCxhQUFhLEVBQUUsR0FBRyxFQUFFLEdBQUUsQ0FBQztZQUN2QixtQkFBbUIsRUFBRSxJQUFJO1lBQ3pCLEdBQUcsT0FBTyxFQUFFO1NBQ2IsQ0FBQTtRQUVELE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQTtRQUUxQyxzRUFBc0U7UUFDdEUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFhLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUVwRCx3Q0FBd0M7UUFDeEMsZ0VBQWdFO1FBQ2hFLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBOEIsR0FBRyxFQUFFO1lBQ2hFLGdDQUFnQztZQUNoQyxNQUFNLFVBQVUsR0FBRyxLQUFLLEVBQUUsQ0FBQTtZQUMxQixrQ0FBa0M7WUFDbEMsTUFBTSxZQUFZLEdBQUcsT0FBTyxFQUFFLENBQUE7WUFDOUIsT0FBTztnQkFDTCxHQUFHLEtBQUssQ0FBQyxPQUFPO2dCQUNoQixHQUFHLGVBQWU7Z0JBQ2xCLEdBQUcsWUFBWTtnQkFDZixLQUFLLEVBQUUsRUFBRSxHQUFHLFVBQVUsRUFBRSxHQUFHLFlBQVksQ0FBQyxLQUFLLEVBQUU7Z0JBQy9DLGFBQWEsRUFBRSxPQUFPLENBQUMsRUFBRTtvQkFDdkIsTUFBTSxLQUFLLEdBQ1QsT0FBTyxZQUFZLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUE7b0JBQzdELEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7b0JBQ2hCLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtnQkFDMUMsQ0FBQzthQUNGLENBQUE7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUVGLGdHQUFnRztRQUNoRyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQzFCLEdBQUcsRUFBRTtZQUNILEtBQUssQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQTtZQUNsQyxPQUFPLEtBQUssQ0FBQTtRQUNkLENBQUMsRUFDRDtZQUNFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLO1NBQ25CLENBQ0YsQ0FBQTtRQUVELDhGQUE4RjtRQUM5RixPQUFPLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUNsQyxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wdXRlZCwgdHlwZSBTaWduYWwsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQge1xuICBSb3dEYXRhLFxuICBUYWJsZU9wdGlvbnMsXG4gIFRhYmxlT3B0aW9uc1Jlc29sdmVkLFxuICBUYWJsZVN0YXRlLFxuICBjcmVhdGVUYWJsZSxcbiAgdHlwZSBUYWJsZSxcbn0gZnJvbSAnQHRhbnN0YWNrL3RhYmxlLWNvcmUnXG5pbXBvcnQgeyBsYXp5SW5pdCB9IGZyb20gJy4vbGF6eS1zaWduYWwtaW5pdGlhbGl6ZXInXG5pbXBvcnQgeyBwcm94aWZ5VGFibGUgfSBmcm9tICcuL3Byb3h5J1xuXG5leHBvcnQgKiBmcm9tICdAdGFuc3RhY2svdGFibGUtY29yZSdcblxuZXhwb3J0IHtcbiAgdHlwZSBGbGV4UmVuZGVyQ29udGVudCxcbiAgRmxleFJlbmRlckRpcmVjdGl2ZSxcbiAgRmxleFJlbmRlckRpcmVjdGl2ZSBhcyBGbGV4UmVuZGVyLFxuICBpbmplY3RGbGV4UmVuZGVyQ29udGV4dCxcbiAgdHlwZSBGbGV4UmVuZGVyQ29tcG9uZW50UHJvcHMsXG59IGZyb20gJy4vZmxleC1yZW5kZXInXG5cbmV4cG9ydCB7XG4gIEZsZXhSZW5kZXJDb21wb25lbnQsXG4gIGZsZXhSZW5kZXJDb21wb25lbnQsXG59IGZyb20gJy4vZmxleC1yZW5kZXIvZmxleC1yZW5kZXItY29tcG9uZW50J1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQW5ndWxhclRhYmxlPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oXG4gIG9wdGlvbnM6ICgpID0+IFRhYmxlT3B0aW9uczxURGF0YT5cbik6IFRhYmxlPFREYXRhPiAmIFNpZ25hbDxUYWJsZTxURGF0YT4+IHtcbiAgcmV0dXJuIGxhenlJbml0KCgpID0+IHtcbiAgICBjb25zdCByZXNvbHZlZE9wdGlvbnMgPSB7XG4gICAgICBzdGF0ZToge30sXG4gICAgICBvblN0YXRlQ2hhbmdlOiAoKSA9PiB7fSxcbiAgICAgIHJlbmRlckZhbGxiYWNrVmFsdWU6IG51bGwsXG4gICAgICAuLi5vcHRpb25zKCksXG4gICAgfVxuXG4gICAgY29uc3QgdGFibGUgPSBjcmVhdGVUYWJsZShyZXNvbHZlZE9wdGlvbnMpXG5cbiAgICAvLyBCeSBkZWZhdWx0LCBtYW5hZ2UgdGFibGUgc3RhdGUgaGVyZSB1c2luZyB0aGUgdGFibGUncyBpbml0aWFsIHN0YXRlXG4gICAgY29uc3Qgc3RhdGUgPSBzaWduYWw8VGFibGVTdGF0ZT4odGFibGUuaW5pdGlhbFN0YXRlKVxuXG4gICAgLy8gQ29tcG9zZSB0YWJsZSBvcHRpb25zIHVzaW5nIGNvbXB1dGVkLlxuICAgIC8vIFRoaXMgaXMgdG8gYWxsb3cgYHRhYmxlU2lnbmFsYCB0byBsaXN0ZW4gYW5kIHNldCB0YWJsZSBvcHRpb25cbiAgICBjb25zdCB1cGRhdGVkT3B0aW9ucyA9IGNvbXB1dGVkPFRhYmxlT3B0aW9uc1Jlc29sdmVkPFREYXRhPj4oKCkgPT4ge1xuICAgICAgLy8gbGlzdGVuIHRvIHRhYmxlIHN0YXRlIGNoYW5nZWRcbiAgICAgIGNvbnN0IHRhYmxlU3RhdGUgPSBzdGF0ZSgpXG4gICAgICAvLyBsaXN0ZW4gdG8gaW5wdXQgb3B0aW9ucyBjaGFuZ2VkXG4gICAgICBjb25zdCB0YWJsZU9wdGlvbnMgPSBvcHRpb25zKClcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRhYmxlLm9wdGlvbnMsXG4gICAgICAgIC4uLnJlc29sdmVkT3B0aW9ucyxcbiAgICAgICAgLi4udGFibGVPcHRpb25zLFxuICAgICAgICBzdGF0ZTogeyAuLi50YWJsZVN0YXRlLCAuLi50YWJsZU9wdGlvbnMuc3RhdGUgfSxcbiAgICAgICAgb25TdGF0ZUNoYW5nZTogdXBkYXRlciA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPVxuICAgICAgICAgICAgdXBkYXRlciBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gdXBkYXRlcih0YWJsZVN0YXRlKSA6IHVwZGF0ZXJcbiAgICAgICAgICBzdGF0ZS5zZXQodmFsdWUpXG4gICAgICAgICAgcmVzb2x2ZWRPcHRpb25zLm9uU3RhdGVDaGFuZ2U/Lih1cGRhdGVyKVxuICAgICAgICB9LFxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyBjb252ZXJ0IHRhYmxlIGluc3RhbmNlIHRvIHNpZ25hbCBmb3IgcHJveGlmeSB0byBsaXN0ZW4gdG8gYW55IHRhYmxlIHN0YXRlIGFuZCBvcHRpb25zIGNoYW5nZXNcbiAgICBjb25zdCB0YWJsZVNpZ25hbCA9IGNvbXB1dGVkKFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0YWJsZS5zZXRPcHRpb25zKHVwZGF0ZWRPcHRpb25zKCkpXG4gICAgICAgIHJldHVybiB0YWJsZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZXF1YWw6ICgpID0+IGZhbHNlLFxuICAgICAgfVxuICAgIClcblxuICAgIC8vIHByb3hpZnkgVGFibGUgaW5zdGFuY2UgdG8gcHJvdmlkZSBhYmlsaXR5IGZvciBjb25zdW1lciB0byBsaXN0ZW4gdG8gYW55IHRhYmxlIHN0YXRlIGNoYW5nZXNcbiAgICByZXR1cm4gcHJveGlmeVRhYmxlKHRhYmxlU2lnbmFsKVxuICB9KVxufVxuIl19
|
package/dist/nova-components/esm2022/lib/components/datatable.utils/lazy-signal-initializer.mjs
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { untracked } from '@angular/core';
|
|
2
|
+
/**
|
|
3
|
+
* Implementation from @tanstack/angular-query
|
|
4
|
+
* {@link https://github.com/TanStack/query/blob/main/packages/angular-query-experimental/src/util/lazy-init/lazy-init.ts}
|
|
5
|
+
*/
|
|
6
|
+
export function lazyInit(initializer) {
|
|
7
|
+
let object = null;
|
|
8
|
+
const initializeObject = () => {
|
|
9
|
+
if (!object) {
|
|
10
|
+
object = untracked(() => initializer());
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
queueMicrotask(() => initializeObject());
|
|
14
|
+
const table = () => { };
|
|
15
|
+
return new Proxy(table, {
|
|
16
|
+
apply(target, thisArg, argArray) {
|
|
17
|
+
initializeObject();
|
|
18
|
+
if (typeof object === 'function') {
|
|
19
|
+
return Reflect.apply(object, thisArg, argArray);
|
|
20
|
+
}
|
|
21
|
+
return Reflect.apply(target, thisArg, argArray);
|
|
22
|
+
},
|
|
23
|
+
get(_, prop, receiver) {
|
|
24
|
+
initializeObject();
|
|
25
|
+
return Reflect.get(object, prop, receiver);
|
|
26
|
+
},
|
|
27
|
+
has(_, prop) {
|
|
28
|
+
initializeObject();
|
|
29
|
+
return Reflect.has(object, prop);
|
|
30
|
+
},
|
|
31
|
+
ownKeys() {
|
|
32
|
+
initializeObject();
|
|
33
|
+
return Reflect.ownKeys(object);
|
|
34
|
+
},
|
|
35
|
+
getOwnPropertyDescriptor() {
|
|
36
|
+
return {
|
|
37
|
+
enumerable: true,
|
|
38
|
+
configurable: true,
|
|
39
|
+
};
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF6eS1zaWduYWwtaW5pdGlhbGl6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ub3ZhLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2RhdGF0YWJsZS51dGlscy9sYXp5LXNpZ25hbC1pbml0aWFsaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRXpDOzs7R0FHRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQW1CLFdBQW9CO0lBQzdELElBQUksTUFBTSxHQUFhLElBQUksQ0FBQTtJQUUzQixNQUFNLGdCQUFnQixHQUFHLEdBQUcsRUFBRTtRQUM1QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUE7UUFDekMsQ0FBQztJQUNILENBQUMsQ0FBQTtJQUVELGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUE7SUFFeEMsTUFBTSxLQUFLLEdBQUcsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFBO0lBRXRCLE9BQU8sSUFBSSxLQUFLLENBQUksS0FBVSxFQUFFO1FBQzlCLEtBQUssQ0FBQyxNQUFTLEVBQUUsT0FBWSxFQUFFLFFBQWU7WUFDNUMsZ0JBQWdCLEVBQUUsQ0FBQTtZQUNsQixJQUFJLE9BQU8sTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUNqQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQTtZQUNqRCxDQUFDO1lBQ0QsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQWEsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDeEQsQ0FBQztRQUNELEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVE7WUFDbkIsZ0JBQWdCLEVBQUUsQ0FBQTtZQUNsQixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBVyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUNqRCxDQUFDO1FBQ0QsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJO1lBQ1QsZ0JBQWdCLEVBQUUsQ0FBQTtZQUNsQixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBVyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3ZDLENBQUM7UUFDRCxPQUFPO1lBQ0wsZ0JBQWdCLEVBQUUsQ0FBQTtZQUNsQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBVyxDQUFDLENBQUE7UUFDckMsQ0FBQztRQUNELHdCQUF3QjtZQUN0QixPQUFPO2dCQUNMLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixZQUFZLEVBQUUsSUFBSTthQUNuQixDQUFBO1FBQ0gsQ0FBQztLQUNGLENBQUMsQ0FBQTtBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1bnRyYWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIGZyb20gQHRhbnN0YWNrL2FuZ3VsYXItcXVlcnlcbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vVGFuU3RhY2svcXVlcnkvYmxvYi9tYWluL3BhY2thZ2VzL2FuZ3VsYXItcXVlcnktZXhwZXJpbWVudGFsL3NyYy91dGlsL2xhenktaW5pdC9sYXp5LWluaXQudHN9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXp5SW5pdDxUIGV4dGVuZHMgb2JqZWN0Pihpbml0aWFsaXplcjogKCkgPT4gVCk6IFQge1xuICBsZXQgb2JqZWN0OiBUIHwgbnVsbCA9IG51bGxcblxuICBjb25zdCBpbml0aWFsaXplT2JqZWN0ID0gKCkgPT4ge1xuICAgIGlmICghb2JqZWN0KSB7XG4gICAgICBvYmplY3QgPSB1bnRyYWNrZWQoKCkgPT4gaW5pdGlhbGl6ZXIoKSlcbiAgICB9XG4gIH1cblxuICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBpbml0aWFsaXplT2JqZWN0KCkpXG5cbiAgY29uc3QgdGFibGUgPSAoKSA9PiB7fVxuXG4gIHJldHVybiBuZXcgUHJveHk8VD4odGFibGUgYXMgVCwge1xuICAgIGFwcGx5KHRhcmdldDogVCwgdGhpc0FyZzogYW55LCBhcmdBcnJheTogYW55W10pOiBhbnkge1xuICAgICAgaW5pdGlhbGl6ZU9iamVjdCgpXG4gICAgICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShvYmplY3QsIHRoaXNBcmcsIGFyZ0FycmF5KVxuICAgICAgfVxuICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkodGFyZ2V0IGFzIGFueSwgdGhpc0FyZywgYXJnQXJyYXkpXG4gICAgfSxcbiAgICBnZXQoXywgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgIGluaXRpYWxpemVPYmplY3QoKVxuICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KG9iamVjdCBhcyBULCBwcm9wLCByZWNlaXZlcilcbiAgICB9LFxuICAgIGhhcyhfLCBwcm9wKSB7XG4gICAgICBpbml0aWFsaXplT2JqZWN0KClcbiAgICAgIHJldHVybiBSZWZsZWN0LmhhcyhvYmplY3QgYXMgVCwgcHJvcClcbiAgICB9LFxuICAgIG93bktleXMoKSB7XG4gICAgICBpbml0aWFsaXplT2JqZWN0KClcbiAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMob2JqZWN0IGFzIFQpXG4gICAgfSxcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB9XG4gICAgfSxcbiAgfSlcbn1cbiJdfQ==
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { computed, untracked } from '@angular/core';
|
|
2
|
+
export function proxifyTable(tableSignal) {
|
|
3
|
+
const internalState = tableSignal;
|
|
4
|
+
return new Proxy(internalState, {
|
|
5
|
+
apply() {
|
|
6
|
+
return tableSignal();
|
|
7
|
+
},
|
|
8
|
+
get(target, property) {
|
|
9
|
+
if (target[property]) {
|
|
10
|
+
return target[property];
|
|
11
|
+
}
|
|
12
|
+
const table = untracked(tableSignal);
|
|
13
|
+
/**
|
|
14
|
+
* Attempt to convert all accessors into computed ones,
|
|
15
|
+
* excluding handlers as they do not retain any reactive value
|
|
16
|
+
*/
|
|
17
|
+
if (property.startsWith('get') &&
|
|
18
|
+
!property.endsWith('Handler')
|
|
19
|
+
// e.g. getCoreRowModel, getSelectedRowModel etc.
|
|
20
|
+
// We need that after a signal change even `rowModel` may mark the view as dirty.
|
|
21
|
+
// This allows to always get the latest `getContext` value while using flexRender
|
|
22
|
+
// && !property.endsWith('Model')
|
|
23
|
+
) {
|
|
24
|
+
const maybeFn = table[property];
|
|
25
|
+
if (typeof maybeFn === 'function') {
|
|
26
|
+
Object.defineProperty(target, property, {
|
|
27
|
+
value: toComputed(tableSignal, maybeFn),
|
|
28
|
+
configurable: true,
|
|
29
|
+
enumerable: true,
|
|
30
|
+
});
|
|
31
|
+
return target[property];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// @ts-expect-error
|
|
35
|
+
return (target[property] = table[property]);
|
|
36
|
+
},
|
|
37
|
+
has(_, prop) {
|
|
38
|
+
return !!untracked(tableSignal)[prop];
|
|
39
|
+
},
|
|
40
|
+
ownKeys() {
|
|
41
|
+
return Reflect.ownKeys(untracked(tableSignal));
|
|
42
|
+
},
|
|
43
|
+
getOwnPropertyDescriptor() {
|
|
44
|
+
return {
|
|
45
|
+
enumerable: true,
|
|
46
|
+
configurable: true,
|
|
47
|
+
};
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Here we'll handle all type of accessors:
|
|
53
|
+
* - 0 argument -> e.g. table.getCanNextPage())
|
|
54
|
+
* - 0~1 arguments -> e.g. table.getIsSomeRowsPinned(position?)
|
|
55
|
+
* - 1 required argument -> e.g. table.getColumn(columnId)
|
|
56
|
+
* - 1+ argument -> e.g. table.getRow(id, searchAll?)
|
|
57
|
+
*
|
|
58
|
+
* Since we are not able to detect automatically the accessors parameters,
|
|
59
|
+
* we'll wrap all accessors into a cached function wrapping a computed
|
|
60
|
+
* that return it's value based on the given parameters
|
|
61
|
+
*/
|
|
62
|
+
function toComputed(signal, fn) {
|
|
63
|
+
const hasArgs = fn.length > 0;
|
|
64
|
+
if (!hasArgs) {
|
|
65
|
+
return computed(() => {
|
|
66
|
+
void signal();
|
|
67
|
+
return fn();
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
const computedCache = {};
|
|
71
|
+
return (...argsArray) => {
|
|
72
|
+
const serializedArgs = serializeArgs(...argsArray);
|
|
73
|
+
if (computedCache.hasOwnProperty(serializedArgs)) {
|
|
74
|
+
return computedCache[serializedArgs]?.();
|
|
75
|
+
}
|
|
76
|
+
const computedSignal = computed(() => {
|
|
77
|
+
void signal();
|
|
78
|
+
return fn(...argsArray);
|
|
79
|
+
});
|
|
80
|
+
computedCache[serializedArgs] = computedSignal;
|
|
81
|
+
return computedSignal();
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function serializeArgs(...args) {
|
|
85
|
+
return JSON.stringify(args);
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ub3ZhLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2RhdGF0YWJsZS51dGlscy9wcm94eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFlLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUtoRSxNQUFNLFVBQVUsWUFBWSxDQUMxQixXQUE2QjtJQUU3QixNQUFNLGFBQWEsR0FBRyxXQUE2QixDQUFBO0lBRW5ELE9BQU8sSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFO1FBQzlCLEtBQUs7WUFDSCxPQUFPLFdBQVcsRUFBRSxDQUFBO1FBQ3RCLENBQUM7UUFDRCxHQUFHLENBQUMsTUFBTSxFQUFFLFFBQXdCO1lBQ2xDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JCLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ3pCLENBQUM7WUFDRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUE7WUFDcEM7OztlQUdHO1lBQ0gsSUFDRSxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztnQkFDMUIsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztZQUM3QixpREFBaUQ7WUFDakQsaUZBQWlGO1lBQ2pGLGlGQUFpRjtZQUNqRixpQ0FBaUM7Y0FDakMsQ0FBQztnQkFDRCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFxQixDQUFBO2dCQUNuRCxJQUFJLE9BQU8sT0FBTyxLQUFLLFVBQVUsRUFBRSxDQUFDO29CQUNsQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUU7d0JBQ3RDLEtBQUssRUFBRSxVQUFVLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQzt3QkFDdkMsWUFBWSxFQUFFLElBQUk7d0JBQ2xCLFVBQVUsRUFBRSxJQUFJO3FCQUNqQixDQUFDLENBQUE7b0JBQ0YsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7Z0JBQ3pCLENBQUM7WUFDSCxDQUFDO1lBQ0QsbUJBQW1CO1lBQ25CLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDN0MsQ0FBQztRQUNELEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBb0I7WUFDekIsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3ZDLENBQUM7UUFDRCxPQUFPO1lBQ0wsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFBO1FBQ2hELENBQUM7UUFDRCx3QkFBd0I7WUFDdEIsT0FBTztnQkFDTCxVQUFVLEVBQUUsSUFBSTtnQkFDaEIsWUFBWSxFQUFFLElBQUk7YUFDbkIsQ0FBQTtRQUNILENBQUM7S0FDRixDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsVUFBVSxDQUFJLE1BQXdCLEVBQUUsRUFBWTtJQUMzRCxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtJQUM3QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixPQUFPLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDbkIsS0FBSyxNQUFNLEVBQUUsQ0FBQTtZQUNiLE9BQU8sRUFBRSxFQUFFLENBQUE7UUFDYixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBb0MsRUFBRSxDQUFBO0lBRXpELE9BQU8sQ0FBQyxHQUFHLFNBQWdCLEVBQUUsRUFBRTtRQUM3QixNQUFNLGNBQWMsR0FBRyxhQUFhLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQTtRQUNsRCxJQUFJLGFBQWEsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUNqRCxPQUFPLGFBQWEsQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLENBQUE7UUFDMUMsQ0FBQztRQUNELE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDbkMsS0FBSyxNQUFNLEVBQUUsQ0FBQTtZQUNiLE9BQU8sRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUE7UUFDekIsQ0FBQyxDQUFDLENBQUE7UUFFRixhQUFhLENBQUMsY0FBYyxDQUFDLEdBQUcsY0FBYyxDQUFBO1FBRTlDLE9BQU8sY0FBYyxFQUFFLENBQUE7SUFDekIsQ0FBQyxDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLEdBQUcsSUFBVztJQUNuQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDN0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbXB1dGVkLCB0eXBlIFNpZ25hbCwgdW50cmFja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IHR5cGUgVGFibGUgfSBmcm9tICdAdGFuc3RhY2svdGFibGUtY29yZSdcblxudHlwZSBUYWJsZVNpZ25hbDxUPiA9IFRhYmxlPFQ+ICYgU2lnbmFsPFRhYmxlPFQ+PlxuXG5leHBvcnQgZnVuY3Rpb24gcHJveGlmeVRhYmxlPFQ+KFxuICB0YWJsZVNpZ25hbDogU2lnbmFsPFRhYmxlPFQ+PlxuKTogVGFibGU8VD4gJiBTaWduYWw8VGFibGU8VD4+IHtcbiAgY29uc3QgaW50ZXJuYWxTdGF0ZSA9IHRhYmxlU2lnbmFsIGFzIFRhYmxlU2lnbmFsPFQ+XG5cbiAgcmV0dXJuIG5ldyBQcm94eShpbnRlcm5hbFN0YXRlLCB7XG4gICAgYXBwbHkoKSB7XG4gICAgICByZXR1cm4gdGFibGVTaWduYWwoKVxuICAgIH0sXG4gICAgZ2V0KHRhcmdldCwgcHJvcGVydHk6IGtleW9mIFRhYmxlPFQ+KTogYW55IHtcbiAgICAgIGlmICh0YXJnZXRbcHJvcGVydHldKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXRbcHJvcGVydHldXG4gICAgICB9XG4gICAgICBjb25zdCB0YWJsZSA9IHVudHJhY2tlZCh0YWJsZVNpZ25hbClcbiAgICAgIC8qKlxuICAgICAgICogQXR0ZW1wdCB0byBjb252ZXJ0IGFsbCBhY2Nlc3NvcnMgaW50byBjb21wdXRlZCBvbmVzLFxuICAgICAgICogZXhjbHVkaW5nIGhhbmRsZXJzIGFzIHRoZXkgZG8gbm90IHJldGFpbiBhbnkgcmVhY3RpdmUgdmFsdWVcbiAgICAgICAqL1xuICAgICAgaWYgKFxuICAgICAgICBwcm9wZXJ0eS5zdGFydHNXaXRoKCdnZXQnKSAmJlxuICAgICAgICAhcHJvcGVydHkuZW5kc1dpdGgoJ0hhbmRsZXInKVxuICAgICAgICAvLyBlLmcuIGdldENvcmVSb3dNb2RlbCwgZ2V0U2VsZWN0ZWRSb3dNb2RlbCBldGMuXG4gICAgICAgIC8vIFdlIG5lZWQgdGhhdCBhZnRlciBhIHNpZ25hbCBjaGFuZ2UgZXZlbiBgcm93TW9kZWxgIG1heSBtYXJrIHRoZSB2aWV3IGFzIGRpcnR5LlxuICAgICAgICAvLyBUaGlzIGFsbG93cyB0byBhbHdheXMgZ2V0IHRoZSBsYXRlc3QgYGdldENvbnRleHRgIHZhbHVlIHdoaWxlIHVzaW5nIGZsZXhSZW5kZXJcbiAgICAgICAgLy8gJiYgIXByb3BlcnR5LmVuZHNXaXRoKCdNb2RlbCcpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgbWF5YmVGbiA9IHRhYmxlW3Byb3BlcnR5XSBhcyBGdW5jdGlvbiB8IG5ldmVyXG4gICAgICAgIGlmICh0eXBlb2YgbWF5YmVGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5LCB7XG4gICAgICAgICAgICB2YWx1ZTogdG9Db21wdXRlZCh0YWJsZVNpZ25hbCwgbWF5YmVGbiksXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wZXJ0eV1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgcmV0dXJuICh0YXJnZXRbcHJvcGVydHldID0gdGFibGVbcHJvcGVydHldKVxuICAgIH0sXG4gICAgaGFzKF8sIHByb3A6IGtleW9mIFRhYmxlPFQ+KSB7XG4gICAgICByZXR1cm4gISF1bnRyYWNrZWQodGFibGVTaWduYWwpW3Byb3BdXG4gICAgfSxcbiAgICBvd25LZXlzKCkge1xuICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyh1bnRyYWNrZWQodGFibGVTaWduYWwpKVxuICAgIH0sXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgfVxuICAgIH0sXG4gIH0pXG59XG5cbi8qKlxuICogSGVyZSB3ZSdsbCBoYW5kbGUgYWxsIHR5cGUgb2YgYWNjZXNzb3JzOlxuICogLSAwIGFyZ3VtZW50IC0+IGUuZy4gdGFibGUuZ2V0Q2FuTmV4dFBhZ2UoKSlcbiAqIC0gMH4xIGFyZ3VtZW50cyAtPiBlLmcuIHRhYmxlLmdldElzU29tZVJvd3NQaW5uZWQocG9zaXRpb24/KVxuICogLSAxIHJlcXVpcmVkIGFyZ3VtZW50IC0+IGUuZy4gdGFibGUuZ2V0Q29sdW1uKGNvbHVtbklkKVxuICogLSAxKyBhcmd1bWVudCAtPiBlLmcuIHRhYmxlLmdldFJvdyhpZCwgc2VhcmNoQWxsPylcbiAqXG4gKiBTaW5jZSB3ZSBhcmUgbm90IGFibGUgdG8gZGV0ZWN0IGF1dG9tYXRpY2FsbHkgdGhlIGFjY2Vzc29ycyBwYXJhbWV0ZXJzLFxuICogd2UnbGwgd3JhcCBhbGwgYWNjZXNzb3JzIGludG8gYSBjYWNoZWQgZnVuY3Rpb24gd3JhcHBpbmcgYSBjb21wdXRlZFxuICogdGhhdCByZXR1cm4gaXQncyB2YWx1ZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gcGFyYW1ldGVyc1xuICovXG5mdW5jdGlvbiB0b0NvbXB1dGVkPFQ+KHNpZ25hbDogU2lnbmFsPFRhYmxlPFQ+PiwgZm46IEZ1bmN0aW9uKSB7XG4gIGNvbnN0IGhhc0FyZ3MgPSBmbi5sZW5ndGggPiAwXG4gIGlmICghaGFzQXJncykge1xuICAgIHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG4gICAgICB2b2lkIHNpZ25hbCgpXG4gICAgICByZXR1cm4gZm4oKVxuICAgIH0pXG4gIH1cblxuICBjb25zdCBjb21wdXRlZENhY2hlOiBSZWNvcmQ8c3RyaW5nLCBTaWduYWw8dW5rbm93bj4+ID0ge31cblxuICByZXR1cm4gKC4uLmFyZ3NBcnJheTogYW55W10pID0+IHtcbiAgICBjb25zdCBzZXJpYWxpemVkQXJncyA9IHNlcmlhbGl6ZUFyZ3MoLi4uYXJnc0FycmF5KVxuICAgIGlmIChjb21wdXRlZENhY2hlLmhhc093blByb3BlcnR5KHNlcmlhbGl6ZWRBcmdzKSkge1xuICAgICAgcmV0dXJuIGNvbXB1dGVkQ2FjaGVbc2VyaWFsaXplZEFyZ3NdPy4oKVxuICAgIH1cbiAgICBjb25zdCBjb21wdXRlZFNpZ25hbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHZvaWQgc2lnbmFsKClcbiAgICAgIHJldHVybiBmbiguLi5hcmdzQXJyYXkpXG4gICAgfSlcblxuICAgIGNvbXB1dGVkQ2FjaGVbc2VyaWFsaXplZEFyZ3NdID0gY29tcHV0ZWRTaWduYWxcblxuICAgIHJldHVybiBjb21wdXRlZFNpZ25hbCgpXG4gIH1cbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplQXJncyguLi5hcmdzOiBhbnlbXSkge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJncylcbn1cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from './nv-datatable.component';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ub3ZhLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL252LWRhdGF0YWJsZS5jb21wb25lbnQnO1xuIl19
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/* eslint-disable jsdoc/require-jsdoc */
|
|
2
|
+
/* eslint-disable jsdoc/require-returns */
|
|
3
|
+
import { Component, computed, input, CUSTOM_ELEMENTS_SCHEMA, } from '@angular/core';
|
|
4
|
+
import { CommonModule } from '@angular/common';
|
|
5
|
+
import { createAngularTable, getCoreRowModel, FlexRenderDirective, } from './datatable.utils'; // local copy of @tanstack/angular-table (required for storybook, the built version is not working)
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export { flexRenderComponent as nvDatatableRenderComponent } from './datatable.utils';
|
|
8
|
+
/**
|
|
9
|
+
* Nova Datatable built on TanStack Table (Angular).
|
|
10
|
+
*/
|
|
11
|
+
export class NvDatatable {
|
|
12
|
+
constructor() {
|
|
13
|
+
/** Column definitions */
|
|
14
|
+
this.columns = input([]);
|
|
15
|
+
/** Row data */
|
|
16
|
+
this.rows = input([]);
|
|
17
|
+
/** Computed table columns with proper typing and filtering. */
|
|
18
|
+
this.tableColumns = computed(() => this.columns()
|
|
19
|
+
.filter((col) => !col.hidden)
|
|
20
|
+
.map((col) => ({
|
|
21
|
+
accessorKey: col.field,
|
|
22
|
+
header: col.headerName || String(col.field),
|
|
23
|
+
size: col.width,
|
|
24
|
+
enableResizing: col.resizable ?? true,
|
|
25
|
+
cell: col.renderCell ??
|
|
26
|
+
((context) => context.getValue()),
|
|
27
|
+
})));
|
|
28
|
+
/** TanStack table instance with Signals */
|
|
29
|
+
this.tableInstance = createAngularTable(() => ({
|
|
30
|
+
data: this.rows(),
|
|
31
|
+
columns: this.tableColumns(),
|
|
32
|
+
getCoreRowModel: getCoreRowModel(),
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
/** Public getter for table instance. */
|
|
36
|
+
table() {
|
|
37
|
+
return this.tableInstance();
|
|
38
|
+
}
|
|
39
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NvDatatable, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
40
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: NvDatatable, isStandalone: true, selector: "nv-datatable", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
41
|
+
<nv-table>
|
|
42
|
+
<table>
|
|
43
|
+
<thead>
|
|
44
|
+
@for (headerGroup of table().getHeaderGroups(); track headerGroup.id)
|
|
45
|
+
{
|
|
46
|
+
<tr>
|
|
47
|
+
@for (header of headerGroup.headers; track header.id) {
|
|
48
|
+
<th
|
|
49
|
+
[attr.data-testid]="'datatable-header-' + header.id"
|
|
50
|
+
[style.width]="
|
|
51
|
+
header.column.columnDef.size
|
|
52
|
+
? header.column.columnDef.size + 'px'
|
|
53
|
+
: null
|
|
54
|
+
"
|
|
55
|
+
[attr.data-no-resize]="
|
|
56
|
+
!header.column.columnDef.enableResizing ? 'true' : null
|
|
57
|
+
"
|
|
58
|
+
>
|
|
59
|
+
@if (!header.isPlaceholder) {
|
|
60
|
+
{{ header.column.columnDef.header }}
|
|
61
|
+
}
|
|
62
|
+
</th>
|
|
63
|
+
}
|
|
64
|
+
</tr>
|
|
65
|
+
}
|
|
66
|
+
</thead>
|
|
67
|
+
|
|
68
|
+
<tbody>
|
|
69
|
+
@for (row of table().getRowModel().rows; track row.id) {
|
|
70
|
+
<tr [attr.data-testid]="'datatable-row-' + row.id">
|
|
71
|
+
@for (cell of row.getVisibleCells(); track cell.id) {
|
|
72
|
+
<td
|
|
73
|
+
[attr.data-testid]="'datatable-cell-' + cell.id"
|
|
74
|
+
style="padding: 8px; border-bottom: 1px solid #eee;"
|
|
75
|
+
>
|
|
76
|
+
<!-- Let FlexRender handle strings vs TemplateRef -->
|
|
77
|
+
<ng-container
|
|
78
|
+
*flexRender="
|
|
79
|
+
cell.column.columnDef.cell;
|
|
80
|
+
props: cell.getContext();
|
|
81
|
+
let cellContent
|
|
82
|
+
"
|
|
83
|
+
>
|
|
84
|
+
{{ cellContent }}
|
|
85
|
+
</ng-container>
|
|
86
|
+
</td>
|
|
87
|
+
}
|
|
88
|
+
</tr>
|
|
89
|
+
}
|
|
90
|
+
</tbody>
|
|
91
|
+
</table>
|
|
92
|
+
</nv-table>
|
|
93
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: FlexRenderDirective, selector: "[flexRender]", inputs: ["flexRender", "flexRenderProps", "flexRenderInjector"] }] }); }
|
|
94
|
+
}
|
|
95
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NvDatatable, decorators: [{
|
|
96
|
+
type: Component,
|
|
97
|
+
args: [{
|
|
98
|
+
selector: 'nv-datatable',
|
|
99
|
+
standalone: true,
|
|
100
|
+
imports: [CommonModule, FlexRenderDirective],
|
|
101
|
+
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
102
|
+
template: `
|
|
103
|
+
<nv-table>
|
|
104
|
+
<table>
|
|
105
|
+
<thead>
|
|
106
|
+
@for (headerGroup of table().getHeaderGroups(); track headerGroup.id)
|
|
107
|
+
{
|
|
108
|
+
<tr>
|
|
109
|
+
@for (header of headerGroup.headers; track header.id) {
|
|
110
|
+
<th
|
|
111
|
+
[attr.data-testid]="'datatable-header-' + header.id"
|
|
112
|
+
[style.width]="
|
|
113
|
+
header.column.columnDef.size
|
|
114
|
+
? header.column.columnDef.size + 'px'
|
|
115
|
+
: null
|
|
116
|
+
"
|
|
117
|
+
[attr.data-no-resize]="
|
|
118
|
+
!header.column.columnDef.enableResizing ? 'true' : null
|
|
119
|
+
"
|
|
120
|
+
>
|
|
121
|
+
@if (!header.isPlaceholder) {
|
|
122
|
+
{{ header.column.columnDef.header }}
|
|
123
|
+
}
|
|
124
|
+
</th>
|
|
125
|
+
}
|
|
126
|
+
</tr>
|
|
127
|
+
}
|
|
128
|
+
</thead>
|
|
129
|
+
|
|
130
|
+
<tbody>
|
|
131
|
+
@for (row of table().getRowModel().rows; track row.id) {
|
|
132
|
+
<tr [attr.data-testid]="'datatable-row-' + row.id">
|
|
133
|
+
@for (cell of row.getVisibleCells(); track cell.id) {
|
|
134
|
+
<td
|
|
135
|
+
[attr.data-testid]="'datatable-cell-' + cell.id"
|
|
136
|
+
style="padding: 8px; border-bottom: 1px solid #eee;"
|
|
137
|
+
>
|
|
138
|
+
<!-- Let FlexRender handle strings vs TemplateRef -->
|
|
139
|
+
<ng-container
|
|
140
|
+
*flexRender="
|
|
141
|
+
cell.column.columnDef.cell;
|
|
142
|
+
props: cell.getContext();
|
|
143
|
+
let cellContent
|
|
144
|
+
"
|
|
145
|
+
>
|
|
146
|
+
{{ cellContent }}
|
|
147
|
+
</ng-container>
|
|
148
|
+
</td>
|
|
149
|
+
}
|
|
150
|
+
</tr>
|
|
151
|
+
}
|
|
152
|
+
</tbody>
|
|
153
|
+
</table>
|
|
154
|
+
</nv-table>
|
|
155
|
+
`,
|
|
156
|
+
}]
|
|
157
|
+
}] });
|
|
158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnYtZGF0YXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25vdmEtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvbnYtZGF0YXRhYmxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3Q0FBd0M7QUFDeEMsMENBQTBDO0FBRTFDLE9BQU8sRUFDTCxTQUFTLEVBQ1QsUUFBUSxFQUNSLEtBQUssRUFFTCxzQkFBc0IsR0FDdkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsZUFBZSxFQUNmLG1CQUFtQixHQUlwQixNQUFNLG1CQUFtQixDQUFDLENBQUMsbUdBQW1HOztBQUkvSCxPQUFPLEVBQUUsbUJBQW1CLElBQUksMEJBQTBCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQW1DdEY7O0dBRUc7QUE2REgsTUFBTSxPQUFPLFdBQVc7SUE1RHhCO1FBNkRFLHlCQUF5QjtRQUN6QixZQUFPLEdBQUcsS0FBSyxDQUF5QixFQUFFLENBQUMsQ0FBQztRQUM1QyxlQUFlO1FBQ2YsU0FBSSxHQUFHLEtBQUssQ0FBTSxFQUFFLENBQUMsQ0FBQztRQUV0QiwrREFBK0Q7UUFDL0QsaUJBQVksR0FBRyxRQUFRLENBQWlCLEdBQUcsRUFBRSxDQUMzQyxJQUFJLENBQUMsT0FBTyxFQUFFO2FBQ1gsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7YUFDNUIsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2IsV0FBVyxFQUFFLEdBQUcsQ0FBQyxLQUFlO1lBQ2hDLE1BQU0sRUFBRSxHQUFHLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQzNDLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSztZQUNmLGNBQWMsRUFBRSxHQUFHLENBQUMsU0FBUyxJQUFJLElBQUk7WUFDckMsSUFBSSxFQUNGLEdBQUcsQ0FBQyxVQUFVO2dCQUNkLENBQUMsQ0FBQyxPQUFnQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDN0QsQ0FBQyxDQUFDLENBQ04sQ0FBQztRQUVGLDJDQUEyQztRQUNuQyxrQkFBYSxHQUFHLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDaEQsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDakIsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDNUIsZUFBZSxFQUFFLGVBQWUsRUFBRTtTQUNuQyxDQUFDLENBQUMsQ0FBQztLQU1MO0lBSkMsd0NBQXdDO0lBQ3hDLEtBQUs7UUFDSCxPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM5QixDQUFDOytHQS9CVSxXQUFXO21HQUFYLFdBQVcsdVVBdkRaOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFEVCwyREF2RFMsWUFBWSwrQkFBRSxtQkFBbUI7OzRGQXlEaEMsV0FBVztrQkE1RHZCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGNBQWM7b0JBQ3hCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLENBQUM7b0JBQzVDLE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDO29CQUNqQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcURUO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUganNkb2MvcmVxdWlyZS1qc2RvYyAqL1xuLyogZXNsaW50LWRpc2FibGUganNkb2MvcmVxdWlyZS1yZXR1cm5zICovXG5cbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGlucHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgY3JlYXRlQW5ndWxhclRhYmxlLFxuICBnZXRDb3JlUm93TW9kZWwsXG4gIEZsZXhSZW5kZXJEaXJlY3RpdmUsXG4gIHR5cGUgRmxleFJlbmRlckNvbXBvbmVudCxcbiAgdHlwZSBDb2x1bW5EZWYsXG4gIHR5cGUgQ2VsbENvbnRleHQsXG59IGZyb20gJy4vZGF0YXRhYmxlLnV0aWxzJzsgLy8gbG9jYWwgY29weSBvZiBAdGFuc3RhY2svYW5ndWxhci10YWJsZSAocmVxdWlyZWQgZm9yIHN0b3J5Ym9vaywgdGhlIGJ1aWx0IHZlcnNpb24gaXMgbm90IHdvcmtpbmcpXG5cbmV4cG9ydCB0eXBlIHsgQ2VsbENvbnRleHQgYXMgTnZEYXRhdGFibGVDZWxsQ29udGV4dCB9O1xuXG5leHBvcnQgeyBmbGV4UmVuZGVyQ29tcG9uZW50IGFzIG52RGF0YXRhYmxlUmVuZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRhdGFibGUudXRpbHMnO1xuXG4vKiogVHlwZSBkZWZpbml0aW9uIGZvciBhIGRhdGF0YWJsZSByb3cuICovXG5leHBvcnQgdHlwZSBOdkRhdGF0YWJsZVJvdyA9IFJlY29yZDxcbiAgc3RyaW5nLFxuICBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCB8IHR5cGVvZiBEYXRlXG4+O1xuXG4vKiogUGFyYW1ldGVycyBmb3IgY3VzdG9tIGNlbGwgcmVuZGVyaW5nIGZ1bmN0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdlRhYmxlUmVuZGVyQ2VsbFBhcmFtczxUIGV4dGVuZHMgTnZEYXRhdGFibGVSb3csIFY+IHtcbiAgdmFsdWU6IFY7XG4gIHJvdzogVDtcbiAgZmllbGQ6IGtleW9mIFQ7XG4gIHJvd0luZGV4OiBudW1iZXI7XG59XG5cbi8qKiBDb2x1bW4gZGVmaW5pdGlvbiBmb3IgTnZEYXRhdGFibGUuICovXG5leHBvcnQgaW50ZXJmYWNlIE52RGF0YXRhYmxlQ29sdW1uPFQgZXh0ZW5kcyBOdkRhdGF0YWJsZVJvdz4ge1xuICBmaWVsZDoga2V5b2YgVDtcbiAgaGVhZGVyTmFtZT86IHN0cmluZztcbiAgd2lkdGg/OiBudW1iZXI7XG4gIHJlc2l6YWJsZT86IGJvb2xlYW47XG4gIGhpZGRlbj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDdXN0b20gY2VsbCByZW5kZXJlciBmdW5jdGlvbiB0aGF0IGNhbiByZXR1cm4gZWl0aGVyIGEgc3RyaW5nIG9yIEFuZ3VsYXIgVGVtcGxhdGVSZWYuXG4gICAqIFVzZSBgJGltcGxpY2l0YCBpbiB5b3VyIHRlbXBsYXRlIHRvIHJlY2VpdmUgdGhlIENlbGxDb250ZXh0LlxuICAgKi9cbiAgcmVuZGVyQ2VsbD86IChjb250ZXh0OiBDZWxsQ29udGV4dDxULCB1bmtub3duPikgPT5cbiAgICB8IHN0cmluZ1xuICAgIHwgRmxleFJlbmRlckNvbXBvbmVudFxuICAgIHwgVGVtcGxhdGVSZWY8e1xuICAgICAgICAkaW1wbGljaXQ6IENlbGxDb250ZXh0PFQsIHVua25vd24+O1xuICAgICAgfT47XG59XG5cbi8qKlxuICogTm92YSBEYXRhdGFibGUgYnVpbHQgb24gVGFuU3RhY2sgVGFibGUgKEFuZ3VsYXIpLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdudi1kYXRhdGFibGUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGbGV4UmVuZGVyRGlyZWN0aXZlXSxcbiAgc2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxudi10YWJsZT5cbiAgICAgIDx0YWJsZT5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIEBmb3IgKGhlYWRlckdyb3VwIG9mIHRhYmxlKCkuZ2V0SGVhZGVyR3JvdXBzKCk7IHRyYWNrIGhlYWRlckdyb3VwLmlkKVxuICAgICAgICAgIHtcbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICBAZm9yIChoZWFkZXIgb2YgaGVhZGVyR3JvdXAuaGVhZGVyczsgdHJhY2sgaGVhZGVyLmlkKSB7XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2RhdGF0YWJsZS1oZWFkZXItJyArIGhlYWRlci5pZFwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJcbiAgICAgICAgICAgICAgICBoZWFkZXIuY29sdW1uLmNvbHVtbkRlZi5zaXplXG4gICAgICAgICAgICAgICAgICA/IGhlYWRlci5jb2x1bW4uY29sdW1uRGVmLnNpemUgKyAncHgnXG4gICAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS1uby1yZXNpemVdPVwiXG4gICAgICAgICAgICAgICAgIWhlYWRlci5jb2x1bW4uY29sdW1uRGVmLmVuYWJsZVJlc2l6aW5nID8gJ3RydWUnIDogbnVsbFxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBAaWYgKCFoZWFkZXIuaXNQbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgICB7eyBoZWFkZXIuY29sdW1uLmNvbHVtbkRlZi5oZWFkZXIgfX1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3RyPlxuICAgICAgICAgIH1cbiAgICAgICAgPC90aGVhZD5cblxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgQGZvciAocm93IG9mIHRhYmxlKCkuZ2V0Um93TW9kZWwoKS5yb3dzOyB0cmFjayByb3cuaWQpIHtcbiAgICAgICAgICA8dHIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2RhdGF0YWJsZS1yb3ctJyArIHJvdy5pZFwiPlxuICAgICAgICAgICAgQGZvciAoY2VsbCBvZiByb3cuZ2V0VmlzaWJsZUNlbGxzKCk7IHRyYWNrIGNlbGwuaWQpIHtcbiAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInZGF0YXRhYmxlLWNlbGwtJyArIGNlbGwuaWRcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDhweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZWU7XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPCEtLSBMZXQgRmxleFJlbmRlciBoYW5kbGUgc3RyaW5ncyB2cyBUZW1wbGF0ZVJlZiAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpmbGV4UmVuZGVyPVwiXG4gICAgICAgICAgICAgICAgICBjZWxsLmNvbHVtbi5jb2x1bW5EZWYuY2VsbDtcbiAgICAgICAgICAgICAgICAgIHByb3BzOiBjZWxsLmdldENvbnRleHQoKTtcbiAgICAgICAgICAgICAgICAgIGxldCBjZWxsQ29udGVudFxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBjZWxsQ29udGVudCB9fVxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIDwvbnYtdGFibGU+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIE52RGF0YXRhYmxlPFQgZXh0ZW5kcyBOdkRhdGF0YWJsZVJvdyA9IE52RGF0YXRhYmxlUm93PiB7XG4gIC8qKiBDb2x1bW4gZGVmaW5pdGlvbnMgKi9cbiAgY29sdW1ucyA9IGlucHV0PE52RGF0YXRhYmxlQ29sdW1uPFQ+W10+KFtdKTtcbiAgLyoqIFJvdyBkYXRhICovXG4gIHJvd3MgPSBpbnB1dDxUW10+KFtdKTtcblxuICAvKiogQ29tcHV0ZWQgdGFibGUgY29sdW1ucyB3aXRoIHByb3BlciB0eXBpbmcgYW5kIGZpbHRlcmluZy4gKi9cbiAgdGFibGVDb2x1bW5zID0gY29tcHV0ZWQ8Q29sdW1uRGVmPFQ+W10+KCgpID0+XG4gICAgdGhpcy5jb2x1bW5zKClcbiAgICAgIC5maWx0ZXIoKGNvbCkgPT4gIWNvbC5oaWRkZW4pXG4gICAgICAubWFwKChjb2wpID0+ICh7XG4gICAgICAgIGFjY2Vzc29yS2V5OiBjb2wuZmllbGQgYXMgc3RyaW5nLFxuICAgICAgICBoZWFkZXI6IGNvbC5oZWFkZXJOYW1lIHx8IFN0cmluZyhjb2wuZmllbGQpLFxuICAgICAgICBzaXplOiBjb2wud2lkdGgsXG4gICAgICAgIGVuYWJsZVJlc2l6aW5nOiBjb2wucmVzaXphYmxlID8/IHRydWUsXG4gICAgICAgIGNlbGw6XG4gICAgICAgICAgY29sLnJlbmRlckNlbGwgPz9cbiAgICAgICAgICAoKGNvbnRleHQ6IENlbGxDb250ZXh0PFQsIHVua25vd24+KSA9PiBjb250ZXh0LmdldFZhbHVlKCkpLFxuICAgICAgfSkpLFxuICApO1xuXG4gIC8qKiBUYW5TdGFjayB0YWJsZSBpbnN0YW5jZSB3aXRoIFNpZ25hbHMgKi9cbiAgcHJpdmF0ZSB0YWJsZUluc3RhbmNlID0gY3JlYXRlQW5ndWxhclRhYmxlKCgpID0+ICh7XG4gICAgZGF0YTogdGhpcy5yb3dzKCksXG4gICAgY29sdW1uczogdGhpcy50YWJsZUNvbHVtbnMoKSxcbiAgICBnZXRDb3JlUm93TW9kZWw6IGdldENvcmVSb3dNb2RlbCgpLFxuICB9KSk7XG5cbiAgLyoqIFB1YmxpYyBnZXR0ZXIgZm9yIHRhYmxlIGluc3RhbmNlLiAqL1xuICB0YWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZUluc3RhbmNlKCk7XG4gIH1cbn1cbiJdfQ==
|