@tanstack/angular-table 8.20.1 → 8.21.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/build/lib/esm2022/flex-render/context.mjs +6 -0
- package/build/lib/esm2022/flex-render/flags.mjs +42 -0
- package/build/lib/esm2022/flex-render/flex-render-component-ref.mjs +173 -0
- package/build/lib/esm2022/flex-render/flex-render-component.mjs +44 -0
- package/build/lib/esm2022/flex-render/view.mjs +102 -0
- package/build/lib/esm2022/flex-render.mjs +133 -73
- package/build/lib/esm2022/index.mjs +3 -2
- package/build/lib/esm2022/proxy.mjs +7 -3
- package/build/lib/fesm2022/tanstack-angular-table.mjs +494 -76
- package/build/lib/fesm2022/tanstack-angular-table.mjs.map +1 -1
- package/build/lib/flex-render/context.d.ts +3 -0
- package/build/lib/flex-render/flags.d.ts +40 -0
- package/build/lib/flex-render/flex-render-component-ref.d.ts +39 -0
- package/build/lib/flex-render/flex-render-component.d.ts +60 -0
- package/build/lib/flex-render/view.d.ts +49 -0
- package/build/lib/flex-render.d.ts +13 -17
- package/build/lib/index.d.ts +2 -1
- package/package.json +7 -4
- package/src/flex-render/context.ts +9 -0
- package/src/flex-render/flags.ts +40 -0
- package/src/flex-render/flex-render-component-ref.ts +236 -0
- package/src/flex-render/flex-render-component.ts +119 -0
- package/src/flex-render/view.ts +153 -0
- package/src/flex-render.ts +196 -94
- package/src/index.ts +7 -1
- package/src/proxy.ts +5 -2
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { inject, InjectionToken } from '@angular/core';
|
|
2
|
+
export const FlexRenderComponentProps = new InjectionToken('[@tanstack/angular-table] Flex render component context props');
|
|
3
|
+
export function injectFlexRenderContext() {
|
|
4
|
+
return inject(FlexRenderComponentProps);
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9mbGV4LXJlbmRlci9jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRXRELE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLElBQUksY0FBYyxDQUV4RCwrREFBK0QsQ0FBQyxDQUFBO0FBRWxFLE1BQU0sVUFBVSx1QkFBdUI7SUFDckMsT0FBTyxNQUFNLENBQUksd0JBQXdCLENBQUMsQ0FBQTtBQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5cbmV4cG9ydCBjb25zdCBGbGV4UmVuZGVyQ29tcG9uZW50UHJvcHMgPSBuZXcgSW5qZWN0aW9uVG9rZW48XG4gIE5vbk51bGxhYmxlPHVua25vd24+XG4+KCdbQHRhbnN0YWNrL2FuZ3VsYXItdGFibGVdIEZsZXggcmVuZGVyIGNvbXBvbmVudCBjb250ZXh0IHByb3BzJylcblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdEZsZXhSZW5kZXJDb250ZXh0PFQgZXh0ZW5kcyBOb25OdWxsYWJsZTx1bmtub3duPj4oKTogVCB7XG4gIHJldHVybiBpbmplY3Q8VD4oRmxleFJlbmRlckNvbXBvbmVudFByb3BzKVxufVxuIl19
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flags used to manage and optimize the rendering lifecycle of content of the cell,
|
|
3
|
+
* while using FlexRenderDirective.
|
|
4
|
+
*/
|
|
5
|
+
export var FlexRenderFlags;
|
|
6
|
+
(function (FlexRenderFlags) {
|
|
7
|
+
/**
|
|
8
|
+
* Indicates that the view is being created for the first time or will be cleared during the next update phase.
|
|
9
|
+
* This is the initial state and will transition after the first ngDoCheck.
|
|
10
|
+
*/
|
|
11
|
+
FlexRenderFlags[FlexRenderFlags["ViewFirstRender"] = 1] = "ViewFirstRender";
|
|
12
|
+
/**
|
|
13
|
+
* Represents a state where the view is not dirty, meaning no changes require rendering updates.
|
|
14
|
+
*/
|
|
15
|
+
FlexRenderFlags[FlexRenderFlags["Pristine"] = 2] = "Pristine";
|
|
16
|
+
/**
|
|
17
|
+
* Indicates the `content` property has been modified or the view requires a complete re-render.
|
|
18
|
+
* When this flag is enabled, the view will be cleared and recreated from scratch.
|
|
19
|
+
*/
|
|
20
|
+
FlexRenderFlags[FlexRenderFlags["ContentChanged"] = 4] = "ContentChanged";
|
|
21
|
+
/**
|
|
22
|
+
* Indicates that the `props` property reference has changed.
|
|
23
|
+
* When this flag is enabled, the view context is updated based on the type of the content.
|
|
24
|
+
*
|
|
25
|
+
* For Component view, inputs will be updated and view will be marked as dirty.
|
|
26
|
+
* For TemplateRef and primitive values, view will be marked as dirty
|
|
27
|
+
*/
|
|
28
|
+
FlexRenderFlags[FlexRenderFlags["PropsReferenceChanged"] = 8] = "PropsReferenceChanged";
|
|
29
|
+
/**
|
|
30
|
+
* Indicates that the current rendered view needs to be checked for changes.
|
|
31
|
+
*/
|
|
32
|
+
FlexRenderFlags[FlexRenderFlags["DirtyCheck"] = 16] = "DirtyCheck";
|
|
33
|
+
/**
|
|
34
|
+
* Indicates that a signal within the `content(props)` result has changed
|
|
35
|
+
*/
|
|
36
|
+
FlexRenderFlags[FlexRenderFlags["DirtySignal"] = 32] = "DirtySignal";
|
|
37
|
+
/**
|
|
38
|
+
* Indicates that the first render effect has been checked at least one time.
|
|
39
|
+
*/
|
|
40
|
+
FlexRenderFlags[FlexRenderFlags["RenderEffectChecked"] = 64] = "RenderEffectChecked";
|
|
41
|
+
})(FlexRenderFlags || (FlexRenderFlags = {}));
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZmxleC1yZW5kZXIvZmxhZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBQ0gsTUFBTSxDQUFOLElBQVksZUFtQ1g7QUFuQ0QsV0FBWSxlQUFlO0lBQ3pCOzs7T0FHRztJQUNILDJFQUF3QixDQUFBO0lBQ3hCOztPQUVHO0lBQ0gsNkRBQWlCLENBQUE7SUFDakI7OztPQUdHO0lBQ0gseUVBQXVCLENBQUE7SUFDdkI7Ozs7OztPQU1HO0lBQ0gsdUZBQThCLENBQUE7SUFDOUI7O09BRUc7SUFDSCxrRUFBbUIsQ0FBQTtJQUNuQjs7T0FFRztJQUNILG9FQUFvQixDQUFBO0lBQ3BCOztPQUVHO0lBQ0gsb0ZBQTRCLENBQUE7QUFDOUIsQ0FBQyxFQW5DVyxlQUFlLEtBQWYsZUFBZSxRQW1DMUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZsYWdzIHVzZWQgdG8gbWFuYWdlIGFuZCBvcHRpbWl6ZSB0aGUgcmVuZGVyaW5nIGxpZmVjeWNsZSBvZiBjb250ZW50IG9mIHRoZSBjZWxsLFxuICogd2hpbGUgdXNpbmcgRmxleFJlbmRlckRpcmVjdGl2ZS5cbiAqL1xuZXhwb3J0IGVudW0gRmxleFJlbmRlckZsYWdzIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGF0IHRoZSB2aWV3IGlzIGJlaW5nIGNyZWF0ZWQgZm9yIHRoZSBmaXJzdCB0aW1lIG9yIHdpbGwgYmUgY2xlYXJlZCBkdXJpbmcgdGhlIG5leHQgdXBkYXRlIHBoYXNlLlxuICAgKiBUaGlzIGlzIHRoZSBpbml0aWFsIHN0YXRlIGFuZCB3aWxsIHRyYW5zaXRpb24gYWZ0ZXIgdGhlIGZpcnN0IG5nRG9DaGVjay5cbiAgICovXG4gIFZpZXdGaXJzdFJlbmRlciA9IDEgPDwgMCxcbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYSBzdGF0ZSB3aGVyZSB0aGUgdmlldyBpcyBub3QgZGlydHksIG1lYW5pbmcgbm8gY2hhbmdlcyByZXF1aXJlIHJlbmRlcmluZyB1cGRhdGVzLlxuICAgKi9cbiAgUHJpc3RpbmUgPSAxIDw8IDEsXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhlIGBjb250ZW50YCBwcm9wZXJ0eSBoYXMgYmVlbiBtb2RpZmllZCBvciB0aGUgdmlldyByZXF1aXJlcyBhIGNvbXBsZXRlIHJlLXJlbmRlci5cbiAgICogV2hlbiB0aGlzIGZsYWcgaXMgZW5hYmxlZCwgdGhlIHZpZXcgd2lsbCBiZSBjbGVhcmVkIGFuZCByZWNyZWF0ZWQgZnJvbSBzY3JhdGNoLlxuICAgKi9cbiAgQ29udGVudENoYW5nZWQgPSAxIDw8IDIsXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgYHByb3BzYCBwcm9wZXJ0eSByZWZlcmVuY2UgaGFzIGNoYW5nZWQuXG4gICAqIFdoZW4gdGhpcyBmbGFnIGlzIGVuYWJsZWQsIHRoZSB2aWV3IGNvbnRleHQgaXMgdXBkYXRlZCBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0aGUgY29udGVudC5cbiAgICpcbiAgICogRm9yIENvbXBvbmVudCB2aWV3LCBpbnB1dHMgd2lsbCBiZSB1cGRhdGVkIGFuZCB2aWV3IHdpbGwgYmUgbWFya2VkIGFzIGRpcnR5LlxuICAgKiBGb3IgVGVtcGxhdGVSZWYgYW5kIHByaW1pdGl2ZSB2YWx1ZXMsIHZpZXcgd2lsbCBiZSBtYXJrZWQgYXMgZGlydHlcbiAgICovXG4gIFByb3BzUmVmZXJlbmNlQ2hhbmdlZCA9IDEgPDwgMyxcbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IHJlbmRlcmVkIHZpZXcgbmVlZHMgdG8gYmUgY2hlY2tlZCBmb3IgY2hhbmdlcy5cbiAgICovXG4gIERpcnR5Q2hlY2sgPSAxIDw8IDQsXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhhdCBhIHNpZ25hbCB3aXRoaW4gdGhlIGBjb250ZW50KHByb3BzKWAgcmVzdWx0IGhhcyBjaGFuZ2VkXG4gICAqL1xuICBEaXJ0eVNpZ25hbCA9IDEgPDwgNSxcbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGF0IHRoZSBmaXJzdCByZW5kZXIgZWZmZWN0IGhhcyBiZWVuIGNoZWNrZWQgYXQgbGVhc3Qgb25lIHRpbWUuXG4gICAqL1xuICBSZW5kZXJFZmZlY3RDaGVja2VkID0gMSA8PCA2LFxufVxuIl19
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { ChangeDetectorRef, inject, Injectable, KeyValueDiffers, OutputEmitterRef, ViewContainerRef, } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class FlexRenderComponentFactory {
|
|
4
|
+
#viewContainerRef = inject(ViewContainerRef);
|
|
5
|
+
createComponent(flexRenderComponent, componentInjector) {
|
|
6
|
+
const componentRef = this.#viewContainerRef.createComponent(flexRenderComponent.component, {
|
|
7
|
+
injector: componentInjector,
|
|
8
|
+
});
|
|
9
|
+
const view = new FlexRenderComponentRef(componentRef, flexRenderComponent, componentInjector);
|
|
10
|
+
const { inputs, outputs } = flexRenderComponent;
|
|
11
|
+
if (inputs)
|
|
12
|
+
view.setInputs(inputs);
|
|
13
|
+
if (outputs)
|
|
14
|
+
view.setOutputs(outputs);
|
|
15
|
+
return view;
|
|
16
|
+
}
|
|
17
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: FlexRenderComponentFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
18
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: FlexRenderComponentFactory });
|
|
19
|
+
}
|
|
20
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: FlexRenderComponentFactory, decorators: [{
|
|
21
|
+
type: Injectable
|
|
22
|
+
}] });
|
|
23
|
+
export class FlexRenderComponentRef {
|
|
24
|
+
componentRef;
|
|
25
|
+
componentInjector;
|
|
26
|
+
#keyValueDiffersFactory;
|
|
27
|
+
#componentData;
|
|
28
|
+
#inputValueDiffer;
|
|
29
|
+
#outputRegistry;
|
|
30
|
+
constructor(componentRef, componentData, componentInjector) {
|
|
31
|
+
this.componentRef = componentRef;
|
|
32
|
+
this.componentInjector = componentInjector;
|
|
33
|
+
this.#componentData = componentData;
|
|
34
|
+
this.#keyValueDiffersFactory = componentInjector.get(KeyValueDiffers);
|
|
35
|
+
this.#outputRegistry = new FlexRenderComponentOutputManager(this.#keyValueDiffersFactory, this.outputs);
|
|
36
|
+
this.#inputValueDiffer = this.#keyValueDiffersFactory
|
|
37
|
+
.find(this.inputs)
|
|
38
|
+
.create();
|
|
39
|
+
this.#inputValueDiffer.diff(this.inputs);
|
|
40
|
+
this.componentRef.onDestroy(() => this.#outputRegistry.unsubscribeAll());
|
|
41
|
+
}
|
|
42
|
+
get component() {
|
|
43
|
+
return this.#componentData.component;
|
|
44
|
+
}
|
|
45
|
+
get inputs() {
|
|
46
|
+
return this.#componentData.inputs ?? {};
|
|
47
|
+
}
|
|
48
|
+
get outputs() {
|
|
49
|
+
return this.#componentData.outputs ?? {};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get component input and output diff by the given item
|
|
53
|
+
*/
|
|
54
|
+
diff(item) {
|
|
55
|
+
return {
|
|
56
|
+
inputDiff: this.#inputValueDiffer.diff(item.inputs ?? {}),
|
|
57
|
+
outputDiff: this.#outputRegistry.diff(item.outputs ?? {}),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
*
|
|
62
|
+
* @param compare Whether the current ref component instance is the same as the given one
|
|
63
|
+
*/
|
|
64
|
+
eqType(compare) {
|
|
65
|
+
return compare.component === this.component;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Tries to update current component refs input by the new given content component.
|
|
69
|
+
*/
|
|
70
|
+
update(content) {
|
|
71
|
+
const eq = this.eqType(content);
|
|
72
|
+
if (!eq)
|
|
73
|
+
return;
|
|
74
|
+
const { inputDiff, outputDiff } = this.diff(content);
|
|
75
|
+
if (inputDiff) {
|
|
76
|
+
inputDiff.forEachAddedItem(item => this.setInput(item.key, item.currentValue));
|
|
77
|
+
inputDiff.forEachChangedItem(item => this.setInput(item.key, item.currentValue));
|
|
78
|
+
inputDiff.forEachRemovedItem(item => this.setInput(item.key, undefined));
|
|
79
|
+
}
|
|
80
|
+
if (outputDiff) {
|
|
81
|
+
outputDiff.forEachAddedItem(item => {
|
|
82
|
+
this.setOutput(item.key, item.currentValue);
|
|
83
|
+
});
|
|
84
|
+
outputDiff.forEachChangedItem(item => {
|
|
85
|
+
if (item.currentValue) {
|
|
86
|
+
this.#outputRegistry.setListener(item.key, item.currentValue);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
this.#outputRegistry.unsubscribe(item.key);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
outputDiff.forEachRemovedItem(item => {
|
|
93
|
+
this.#outputRegistry.unsubscribe(item.key);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
this.#componentData = content;
|
|
97
|
+
}
|
|
98
|
+
markAsDirty() {
|
|
99
|
+
this.componentRef.injector.get(ChangeDetectorRef).markForCheck();
|
|
100
|
+
}
|
|
101
|
+
setInputs(inputs) {
|
|
102
|
+
for (const prop in inputs) {
|
|
103
|
+
this.setInput(prop, inputs[prop]);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
setInput(key, value) {
|
|
107
|
+
if (this.#componentData.allowedInputNames.includes(key)) {
|
|
108
|
+
this.componentRef.setInput(key, value);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
setOutputs(outputs) {
|
|
112
|
+
this.#outputRegistry.unsubscribeAll();
|
|
113
|
+
for (const prop in outputs) {
|
|
114
|
+
this.setOutput(prop, outputs[prop]);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
setOutput(outputName, emit) {
|
|
118
|
+
if (!this.#componentData.allowedOutputNames.includes(outputName))
|
|
119
|
+
return;
|
|
120
|
+
if (!emit) {
|
|
121
|
+
this.#outputRegistry.unsubscribe(outputName);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const hasListener = this.#outputRegistry.hasListener(outputName);
|
|
125
|
+
this.#outputRegistry.setListener(outputName, emit);
|
|
126
|
+
if (hasListener) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const instance = this.componentRef.instance;
|
|
130
|
+
const output = instance[outputName];
|
|
131
|
+
if (output && output instanceof OutputEmitterRef) {
|
|
132
|
+
output.subscribe(value => {
|
|
133
|
+
this.#outputRegistry.getListener(outputName)?.(value);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
class FlexRenderComponentOutputManager {
|
|
139
|
+
#outputSubscribers = {};
|
|
140
|
+
#outputListeners = {};
|
|
141
|
+
#valueDiffer;
|
|
142
|
+
constructor(keyValueDiffers, initialOutputs) {
|
|
143
|
+
this.#valueDiffer = keyValueDiffers.find(initialOutputs).create();
|
|
144
|
+
if (initialOutputs) {
|
|
145
|
+
this.#valueDiffer.diff(initialOutputs);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
hasListener(outputName) {
|
|
149
|
+
return outputName in this.#outputListeners;
|
|
150
|
+
}
|
|
151
|
+
setListener(outputName, callback) {
|
|
152
|
+
this.#outputListeners[outputName] = callback;
|
|
153
|
+
}
|
|
154
|
+
getListener(outputName) {
|
|
155
|
+
return this.#outputListeners[outputName];
|
|
156
|
+
}
|
|
157
|
+
unsubscribeAll() {
|
|
158
|
+
for (const prop in this.#outputSubscribers) {
|
|
159
|
+
this.unsubscribe(prop);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
unsubscribe(outputName) {
|
|
163
|
+
if (outputName in this.#outputSubscribers) {
|
|
164
|
+
this.#outputSubscribers[outputName]?.unsubscribe();
|
|
165
|
+
delete this.#outputSubscribers[outputName];
|
|
166
|
+
delete this.#outputListeners[outputName];
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
diff(outputs) {
|
|
170
|
+
return this.#valueDiffer.diff(outputs ?? {});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxleC1yZW5kZXItY29tcG9uZW50LXJlZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9mbGV4LXJlbmRlci9mbGV4LXJlbmRlci1jb21wb25lbnQtcmVmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFFakIsTUFBTSxFQUNOLFVBQVUsRUFHVixlQUFlLEVBQ2YsZ0JBQWdCLEVBRWhCLGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQTs7QUFJdEIsTUFBTSxPQUFPLDBCQUEwQjtJQUNyQyxpQkFBaUIsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUU1QyxlQUFlLENBQ2IsbUJBQTJDLEVBQzNDLGlCQUEyQjtRQUUzQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUN6RCxtQkFBbUIsQ0FBQyxTQUFTLEVBQzdCO1lBQ0UsUUFBUSxFQUFFLGlCQUFpQjtTQUM1QixDQUNGLENBQUE7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLHNCQUFzQixDQUNyQyxZQUFZLEVBQ1osbUJBQW1CLEVBQ25CLGlCQUFpQixDQUNsQixDQUFBO1FBRUQsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQTtRQUUvQyxJQUFJLE1BQU07WUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ2xDLElBQUksT0FBTztZQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFckMsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO3dHQXpCVSwwQkFBMEI7NEdBQTFCLDBCQUEwQjs7NEZBQTFCLDBCQUEwQjtrQkFEdEMsVUFBVTs7QUE2QlgsTUFBTSxPQUFPLHNCQUFzQjtJQVF0QjtJQUVBO0lBVEYsdUJBQXVCLENBQWlCO0lBQ2pELGNBQWMsQ0FBd0I7SUFDdEMsaUJBQWlCLENBQWlDO0lB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QUMxQyxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxPQUFzRTtRQUN6RSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUM5QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50UmVmLFxuICBpbmplY3QsXG4gIEluamVjdGFibGUsXG4gIEluamVjdG9yLFxuICBLZXlWYWx1ZURpZmZlcixcbiAgS2V5VmFsdWVEaWZmZXJzLFxuICBPdXRwdXRFbWl0dGVyUmVmLFxuICBPdXRwdXRSZWZTdWJzY3JpcHRpb24sXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBGbGV4UmVuZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9mbGV4LXJlbmRlci1jb21wb25lbnQnXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBGbGV4UmVuZGVyQ29tcG9uZW50RmFjdG9yeSB7XG4gICN2aWV3Q29udGFpbmVyUmVmID0gaW5qZWN0KFZpZXdDb250YWluZXJSZWYpXG5cbiAgY3JlYXRlQ29tcG9uZW50PFQ+KFxuICAgIGZsZXhSZW5kZXJDb21wb25lbnQ6IEZsZXhSZW5kZXJDb21wb25lbnQ8VD4sXG4gICAgY29tcG9uZW50SW5qZWN0b3I6IEluamVjdG9yXG4gICk6IEZsZXhSZW5kZXJDb21wb25lbnRSZWY8VD4ge1xuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuI3ZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KFxuICAgICAgZmxleFJlbmRlckNvbXBvbmVudC5jb21wb25lbnQsXG4gICAgICB7XG4gICAgICAgIGluamVjdG9yOiBjb21wb25lbnRJbmplY3RvcixcbiAgICAgIH1cbiAgICApXG4gICAgY29uc3QgdmlldyA9IG5ldyBGbGV4UmVuZGVyQ29tcG9uZW50UmVmKFxuICAgICAgY29tcG9uZW50UmVmLFxuICAgICAgZmxleFJlbmRlckNvbXBvbmVudCxcbiAgICAgIGNvbXBvbmVudEluamVjdG9yXG4gICAgKVxuXG4gICAgY29uc3QgeyBpbnB1dHMsIG91dHB1dHMgfSA9IGZsZXhSZW5kZXJDb21wb25lbnRcblxuICAgIGlmIChpbnB1dHMpIHZpZXcuc2V0SW5wdXRzKGlucHV0cylcbiAgICBpZiAob3V0cHV0cykgdmlldy5zZXRPdXRwdXRzKG91dHB1dHMpXG5cbiAgICByZXR1cm4gdmlld1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGbGV4UmVuZGVyQ29tcG9uZW50UmVmPFQ+IHtcbiAgcmVhZG9ubHkgI2tleVZhbHVlRGlmZmVyc0ZhY3Rvcnk6IEtleVZhbHVlRGlmZmVyc1xuICAjY29tcG9uZW50RGF0YTogRmxleFJlbmRlckNvbXBvbmVudDxUPlxuICAjaW5wdXRWYWx1ZURpZmZlcjogS2V5VmFsdWVEaWZmZXI8c3RyaW5nLCB1bmtub3duPlxuXG4gIHJlYWRvbmx5ICNvdXRwdXRSZWdpc3RyeTogRmxleFJlbmRlckNvbXBvbmVudE91dHB1dE1hbmFnZXJcblxuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxUPixcbiAgICBjb21wb25lbnREYXRhOiBGbGV4UmVuZGVyQ29tcG9uZW50PFQ+LFxuICAgIHJlYWRvbmx5IGNvbXBvbmVudEluamVjdG9yOiBJbmplY3RvclxuICApIHtcbiAgICB0aGlzLiNjb21wb25lbnREYXRhID0gY29tcG9uZW50RGF0YVxuICAgIHRoaXMuI2tleVZhbHVlRGlmZmVyc0ZhY3RvcnkgPSBjb21wb25lbnRJbmplY3Rvci5nZXQoS2V5VmFsdWVEaWZmZXJzKVxuXG4gICAgdGhpcy4jb3V0cHV0UmVnaXN0cnkgPSBuZXcgRmxleFJlbmRlckNvbXBvbmVudE91dHB1dE1hbmFnZXIoXG4gICAgICB0aGlzLiNrZXlWYWx1ZURpZmZlcnNGYWN0b3J5LFxuICAgICAgdGhpcy5vdXRwdXRzXG4gICAgKVxuXG4gICAgdGhpcy4jaW5wdXRWYWx1ZURpZmZlciA9IHRoaXMuI2tleVZhbHVlRGlmZmVyc0ZhY3RvcnlcbiAgICAgIC5maW5kKHRoaXMuaW5wdXRzKVxuICAgICAgLmNyZWF0ZSgpXG4gICAgdGhpcy4jaW5wdXRWYWx1ZURpZmZlci5kaWZmKHRoaXMuaW5wdXRzKVxuXG4gICAgdGhpcy5jb21wb25lbnRSZWYub25EZXN0cm95KCgpID0+IHRoaXMuI291dHB1dFJlZ2lzdHJ5LnVuc3Vic2NyaWJlQWxsKCkpXG4gIH1cblxuICBnZXQgY29tcG9uZW50KCkge1xuICAgIHJldHVybiB0aGlzLiNjb21wb25lbnREYXRhLmNvbXBvbmVudFxuICB9XG5cbiAgZ2V0IGlucHV0cygpIHtcbiAgICByZXR1cm4gdGhpcy4jY29tcG9uZW50RGF0YS5pbnB1dHMgPz8ge31cbiAgfVxuXG4gIGdldCBvdXRwdXRzKCkge1xuICAgIHJldHVybiB0aGlzLiNjb21wb25lbnREYXRhLm91dHB1dHMgPz8ge31cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29tcG9uZW50IGlucHV0IGFuZCBvdXRwdXQgZGlmZiBieSB0aGUgZ2l2ZW4gaXRlbVxuICAgKi9cbiAgZGlmZihpdGVtOiBGbGV4UmVuZGVyQ29tcG9uZW50PFQ+KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0RGlmZjogdGhpcy4jaW5wdXRWYWx1ZURpZmZlci5kaWZmKGl0ZW0uaW5wdXRzID8/IHt9KSxcbiAgICAgIG91dHB1dERpZmY6IHRoaXMuI291dHB1dFJlZ2lzdHJ5LmRpZmYoaXRlbS5vdXRwdXRzID8/IHt9KSxcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBjb21wYXJlIFdoZXRoZXIgdGhlIGN1cnJlbnQgcmVmIGNvbXBvbmVudCBpbnN0YW5jZSBpcyB0aGUgc2FtZSBhcyB0aGUgZ2l2ZW4gb25lXG4gICAqL1xuICBlcVR5cGUoY29tcGFyZTogRmxleFJlbmRlckNvbXBvbmVudDxUPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjb21wYXJlLmNvbXBvbmVudCA9PT0gdGhpcy5jb21wb25lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmllcyB0byB1cGRhdGUgY3VycmVudCBjb21wb25lbnQgcmVmcyBpbnB1dCBieSB0aGUgbmV3IGdpdmVuIGNvbnRlbnQgY29tcG9uZW50LlxuICAgKi9cbiAgdXBkYXRlKGNvbnRlbnQ6IEZsZXhSZW5kZXJDb21wb25lbnQ8VD4pIHtcbiAgICBjb25zdCBlcSA9IHRoaXMuZXFUeXBlKGNvbnRlbnQpXG4gICAgaWYgKCFlcSkgcmV0dXJuXG4gICAgY29uc3QgeyBpbnB1dERpZmYsIG91dHB1dERpZmYgfSA9IHRoaXMuZGlmZihjb250ZW50KVxuICAgIGlmIChpbnB1dERpZmYpIHtcbiAgICAgIGlucHV0RGlmZi5mb3JFYWNoQWRkZWRJdGVtKGl0ZW0gPT5cbiAgICAgICAgdGhpcy5zZXRJbnB1dChpdGVtLmtleSwgaXRlbS5jdXJyZW50VmFsdWUpXG4gICAgICApXG4gICAgICBpbnB1dERpZmYuZm9yRWFjaENoYW5nZWRJdGVtKGl0ZW0gPT5cbiAgICAgICAgdGhpcy5zZXRJbnB1dChpdGVtLmtleSwgaXRlbS5jdXJyZW50VmFsdWUpXG4gICAgICApXG4gICAgICBpbnB1dERpZmYuZm9yRWFjaFJlbW92ZWRJdGVtKGl0ZW0gPT4gdGhpcy5zZXRJbnB1dChpdGVtLmtleSwgdW5kZWZpbmVkKSlcbiAgICB9XG4gICAgaWYgKG91dHB1dERpZmYpIHtcbiAgICAgIG91dHB1dERpZmYuZm9yRWFjaEFkZGVkSXRlbShpdGVtID0+IHtcbiAgICAgICAgdGhpcy5zZXRPdXRwdXQoaXRlbS5rZXksIGl0ZW0uY3VycmVudFZhbHVlKVxuICAgICAgfSlcbiAgICAgIG91dHB1dERpZmYuZm9yRWFjaENoYW5nZWRJdGVtKGl0ZW0gPT4ge1xuICAgICAgICBpZiAoaXRlbS5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICB0aGlzLiNvdXRwdXRSZWdpc3RyeS5zZXRMaXN0ZW5lcihpdGVtLmtleSwgaXRlbS5jdXJyZW50VmFsdWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy4jb3V0cHV0UmVnaXN0cnkudW5zdWJzY3JpYmUoaXRlbS5rZXkpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBvdXRwdXREaWZmLmZvckVhY2hSZW1vdmVkSXRlbShpdGVtID0+IHtcbiAgICAgICAgdGhpcy4jb3V0cHV0UmVnaXN0cnkudW5zdWJzY3JpYmUoaXRlbS5rZXkpXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuI2NvbXBvbmVudERhdGEgPSBjb250ZW50XG4gIH1cblxuICBtYXJrQXNEaXJ0eSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYpLm1hcmtGb3JDaGVjaygpXG4gIH1cblxuICBzZXRJbnB1dHMoaW5wdXRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgIGZvciAoY29uc3QgcHJvcCBpbiBpbnB1dHMpIHtcbiAgICAgIHRoaXMuc2V0SW5wdXQocHJvcCwgaW5wdXRzW3Byb3BdKVxuICAgIH1cbiAgfVxuXG4gIHNldElucHV0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIGlmICh0aGlzLiNjb21wb25lbnREYXRhLmFsbG93ZWRJbnB1dE5hbWVzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KGtleSwgdmFsdWUpXG4gICAgfVxuICB9XG5cbiAgc2V0T3V0cHV0cyhcbiAgICBvdXRwdXRzOiBSZWNvcmQ8XG4gICAgICBzdHJpbmcsXG4gICAgICBPdXRwdXRFbWl0dGVyUmVmPHVua25vd24+WydlbWl0J10gfCBudWxsIHwgdW5kZWZpbmVkXG4gICAgPlxuICApIHtcbiAgICB0aGlzLiNvdXRwdXRSZWdpc3RyeS51bnN1YnNjcmliZUFsbCgpXG4gICAgZm9yIChjb25zdCBwcm9wIGluIG91dHB1dHMpIHtcbiAgICAgIHRoaXMuc2V0T3V0cHV0KHByb3AsIG91dHB1dHNbcHJvcF0pXG4gICAgfVxuICB9XG5cbiAgc2V0T3V0cHV0KFxuICAgIG91dHB1dE5hbWU6IHN0cmluZyxcbiAgICBlbWl0OiBPdXRwdXRFbWl0dGVyUmVmPHVua25vd24+WydlbWl0J10gfCB1bmRlZmluZWQgfCBudWxsXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy4jY29tcG9uZW50RGF0YS5hbGxvd2VkT3V0cHV0TmFtZXMuaW5jbHVkZXMob3V0cHV0TmFtZSkpIHJldHVyblxuICAgIGlmICghZW1pdCkge1xuICAgICAgdGhpcy4jb3V0cHV0UmVnaXN0cnkudW5zdWJzY3JpYmUob3V0cHV0TmFtZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGhhc0xpc3RlbmVyID0gdGhpcy4jb3V0cHV0UmVnaXN0cnkuaGFzTGlzdGVuZXIob3V0cHV0TmFtZSlcbiAgICB0aGlzLiNvdXRwdXRSZWdpc3RyeS5zZXRMaXN0ZW5lcihvdXRwdXROYW1lLCBlbWl0KVxuXG4gICAgaWYgKGhhc0xpc3RlbmVyKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlXG4gICAgY29uc3Qgb3V0cHV0ID0gaW5zdGFuY2Vbb3V0cHV0TmFtZSBhcyBrZXlvZiB0eXBlb2YgaW5zdGFuY2VdXG4gICAgaWYgKG91dHB1dCAmJiBvdXRwdXQgaW5zdGFuY2VvZiBPdXRwdXRFbWl0dGVyUmVmKSB7XG4gICAgICBvdXRwdXQuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgdGhpcy4jb3V0cHV0UmVnaXN0cnkuZ2V0TGlzdGVuZXIob3V0cHV0TmFtZSk/Lih2YWx1ZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbmNsYXNzIEZsZXhSZW5kZXJDb21wb25lbnRPdXRwdXRNYW5hZ2VyIHtcbiAgcmVhZG9ubHkgI291dHB1dFN1YnNjcmliZXJzOiBSZWNvcmQ8c3RyaW5nLCBPdXRwdXRSZWZTdWJzY3JpcHRpb24+ID0ge31cbiAgcmVhZG9ubHkgI291dHB1dExpc3RlbmVyczogUmVjb3JkPHN0cmluZywgKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiA9IHt9XG5cbiAgcmVhZG9ubHkgI3ZhbHVlRGlmZmVyOiBLZXlWYWx1ZURpZmZlcjxcbiAgICBzdHJpbmcsXG4gICAgdW5kZWZpbmVkIHwgbnVsbCB8IE91dHB1dEVtaXR0ZXJSZWY8dW5rbm93bj5bJ2VtaXQnXVxuICA+XG5cbiAgY29uc3RydWN0b3Ioa2V5VmFsdWVEaWZmZXJzOiBLZXlWYWx1ZURpZmZlcnMsIGluaXRpYWxPdXRwdXRzOiBhbnkpIHtcbiAgICB0aGlzLiN2YWx1ZURpZmZlciA9IGtleVZhbHVlRGlmZmVycy5maW5kKGluaXRpYWxPdXRwdXRzKS5jcmVhdGUoKVxuICAgIGlmIChpbml0aWFsT3V0cHV0cykge1xuICAgICAgdGhpcy4jdmFsdWVEaWZmZXIuZGlmZihpbml0aWFsT3V0cHV0cylcbiAgICB9XG4gIH1cblxuICBoYXNMaXN0ZW5lcihvdXRwdXROYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gb3V0cHV0TmFtZSBpbiB0aGlzLiNvdXRwdXRMaXN0ZW5lcnNcbiAgfVxuXG4gIHNldExpc3RlbmVyKG91dHB1dE5hbWU6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIHRoaXMuI291dHB1dExpc3RlbmVyc1tvdXRwdXROYW1lXSA9IGNhbGxiYWNrXG4gIH1cblxuICBnZXRMaXN0ZW5lcihvdXRwdXROYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy4jb3V0cHV0TGlzdGVuZXJzW291dHB1dE5hbWVdXG4gIH1cblxuICB1bnN1YnNjcmliZUFsbCgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gdGhpcy4jb3V0cHV0U3Vic2NyaWJlcnMpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUocHJvcClcbiAgICB9XG4gIH1cblxuICB1bnN1YnNjcmliZShvdXRwdXROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAob3V0cHV0TmFtZSBpbiB0aGlzLiNvdXRwdXRTdWJzY3JpYmVycykge1xuICAgICAgdGhpcy4jb3V0cHV0U3Vic2NyaWJlcnNbb3V0cHV0TmFtZV0/LnVuc3Vic2NyaWJlKClcbiAgICAgIGRlbGV0ZSB0aGlzLiNvdXRwdXRTdWJzY3JpYmVyc1tvdXRwdXROYW1lXVxuICAgICAgZGVsZXRlIHRoaXMuI291dHB1dExpc3RlbmVyc1tvdXRwdXROYW1lXVxuICAgIH1cbiAgfVxuXG4gIGRpZmYob3V0cHV0czogUmVjb3JkPHN0cmluZywgT3V0cHV0RW1pdHRlclJlZjx1bmtub3duPlsnZW1pdCddIHwgdW5kZWZpbmVkPikge1xuICAgIHJldHVybiB0aGlzLiN2YWx1ZURpZmZlci5kaWZmKG91dHB1dHMgPz8ge30pXG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { reflectComponentType, } from '@angular/core';
|
|
2
|
+
/**
|
|
3
|
+
* Helper function to create a [@link FlexRenderComponent] instance, with better type-safety.
|
|
4
|
+
*
|
|
5
|
+
* - options object must be passed when the given component instance contains at least one required signal input.
|
|
6
|
+
* - options/inputs is typed with the given component inputs
|
|
7
|
+
* - options/outputs is typed with the given component outputs
|
|
8
|
+
*/
|
|
9
|
+
export function flexRenderComponent(component, ...options) {
|
|
10
|
+
const { inputs, injector, outputs } = options?.[0] ?? {};
|
|
11
|
+
return new FlexRenderComponent(component, inputs, injector, outputs);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Wrapper class for a component that will be used as content for {@link FlexRenderDirective}
|
|
15
|
+
*
|
|
16
|
+
* Prefer {@link flexRenderComponent} helper for better type-safety
|
|
17
|
+
*/
|
|
18
|
+
export class FlexRenderComponent {
|
|
19
|
+
component;
|
|
20
|
+
inputs;
|
|
21
|
+
injector;
|
|
22
|
+
outputs;
|
|
23
|
+
mirror;
|
|
24
|
+
allowedInputNames = [];
|
|
25
|
+
allowedOutputNames = [];
|
|
26
|
+
constructor(component, inputs, injector, outputs) {
|
|
27
|
+
this.component = component;
|
|
28
|
+
this.inputs = inputs;
|
|
29
|
+
this.injector = injector;
|
|
30
|
+
this.outputs = outputs;
|
|
31
|
+
const mirror = reflectComponentType(component);
|
|
32
|
+
if (!mirror) {
|
|
33
|
+
throw new Error(`[@tanstack-table/angular] The provided symbol is not a component`);
|
|
34
|
+
}
|
|
35
|
+
this.mirror = mirror;
|
|
36
|
+
for (const input of this.mirror.inputs) {
|
|
37
|
+
this.allowedInputNames.push(input.propName);
|
|
38
|
+
}
|
|
39
|
+
for (const output of this.mirror.outputs) {
|
|
40
|
+
this.allowedOutputNames.push(output.propName);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxleC1yZW5kZXItY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2ZsZXgtcmVuZGVyL2ZsZXgtcmVuZGVyLWNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBS0wsb0JBQW9CLEdBRXJCLE1BQU0sZUFBZSxDQUFBO0FBNER0Qjs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBS2pDLFNBQTJCLEVBQzNCLEdBQUcsT0FFK0M7SUFFbEQsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ3hELE9BQU8sSUFBSSxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUN0RSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUFNbkI7SUFDQTtJQUNBO0lBQ0E7SUFSRixNQUFNLENBQTZCO0lBQ25DLGlCQUFpQixHQUFhLEVBQUUsQ0FBQTtJQUNoQyxrQkFBa0IsR0FBYSxFQUFFLENBQUE7SUFFMUMsWUFDVyxTQUEyQixFQUMzQixNQUEyQixFQUMzQixRQUFtQixFQUNuQixPQUE2QjtRQUg3QixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixXQUFNLEdBQU4sTUFBTSxDQUFxQjtRQUMzQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLFlBQU8sR0FBUCxPQUFPLENBQXNCO1FBRXRDLE1BQU0sTUFBTSxHQUFHLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQzlDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0VBQWtFLENBQ25FLENBQUE7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7UUFDcEIsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzdDLENBQUM7UUFDRCxLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDL0MsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudE1pcnJvcixcbiAgSW5qZWN0b3IsXG4gIElucHV0U2lnbmFsLFxuICBPdXRwdXRFbWl0dGVyUmVmLFxuICByZWZsZWN0Q29tcG9uZW50VHlwZSxcbiAgVHlwZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcblxudHlwZSBJbnB1dHM8VD4gPSB7XG4gIFtLIGluIGtleW9mIFQgYXMgVFtLXSBleHRlbmRzIElucHV0U2lnbmFsPGluZmVyIFI+XG4gICAgPyBLXG4gICAgOiBuZXZlcl0/OiBUW0tdIGV4dGVuZHMgSW5wdXRTaWduYWw8aW5mZXIgUj4gPyBSIDogbmV2ZXJcbn1cblxudHlwZSBPdXRwdXRzPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUIGFzIFRbS10gZXh0ZW5kcyBPdXRwdXRFbWl0dGVyUmVmPGluZmVyIFI+XG4gICAgPyBLXG4gICAgOiBuZXZlcl0/OiBUW0tdIGV4dGVuZHMgT3V0cHV0RW1pdHRlclJlZjxpbmZlciBSPlxuICAgID8gT3V0cHV0RW1pdHRlclJlZjxSPlsnZW1pdCddXG4gICAgOiBuZXZlclxufVxuXG50eXBlIE9wdGlvbmFsS2V5czxULCBLID0ga2V5b2YgVD4gPSBLIGV4dGVuZHMga2V5b2YgVFxuICA/IFRbS10gZXh0ZW5kcyBSZXF1aXJlZDxUPltLXVxuICAgID8gdW5kZWZpbmVkIGV4dGVuZHMgVFtLXVxuICAgICAgPyBLXG4gICAgICA6IG5ldmVyXG4gICAgOiBLXG4gIDogbmV2ZXJcblxuaW50ZXJmYWNlIEZsZXhSZW5kZXJSZXF1aXJlZE9wdGlvbnM8XG4gIFRJbnB1dHMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBUT3V0cHV0cyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4+IHtcbiAgLyoqXG4gICAqIENvbXBvbmVudCBpbnN0YW5jZSBpbnB1dHMuIFRoZXkgd2lsbCBiZSBzZXQgdmlhIFtjb21wb25lbnRSZWYuc2V0SW5wdXQgQVBJXShodHRwczovL2FuZ3VsYXIuZGV2L2FwaS9jb3JlL0NvbXBvbmVudFJlZiNzZXRJbnB1dClcbiAgICovXG4gIGlucHV0czogVElucHV0c1xuICAvKipcbiAgICogQ29tcG9uZW50IGluc3RhbmNlIG91dHB1dHMuXG4gICAqL1xuICBvdXRwdXRzPzogVE91dHB1dHNcbiAgLyoqXG4gICAqIE9wdGlvbmFsIHtAbGluayBJbmplY3Rvcn0gdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgdGhlIGNvbXBvbmVudFxuICAgKi9cbiAgaW5qZWN0b3I/OiBJbmplY3RvclxufVxuXG5pbnRlcmZhY2UgRmxleFJlbmRlck9wdGlvbnM8XG4gIFRJbnB1dHMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBUT3V0cHV0cyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4+IHtcbiAgLyoqXG4gICAqIENvbXBvbmVudCBpbnN0YW5jZSBpbnB1dHMuIFRoZXkgd2lsbCBiZSBzZXQgdmlhIFtjb21wb25lbnRSZWYuc2V0SW5wdXQgQVBJXShodHRwczovL2FuZ3VsYXIuZGV2L2FwaS9jb3JlL0NvbXBvbmVudFJlZiNzZXRJbnB1dClcbiAgICovXG4gIGlucHV0cz86IFRJbnB1dHNcbiAgLyoqXG4gICAqIENvbXBvbmVudCBpbnN0YW5jZSBvdXRwdXRzLlxuICAgKi9cbiAgb3V0cHV0cz86IFRPdXRwdXRzXG4gIC8qKlxuICAgKiBPcHRpb25hbCB7QGxpbmsgSW5qZWN0b3J9IHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRoZSBjb21wb25lbnRcbiAgICovXG4gIGluamVjdG9yPzogSW5qZWN0b3Jcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgW0BsaW5rIEZsZXhSZW5kZXJDb21wb25lbnRdIGluc3RhbmNlLCB3aXRoIGJldHRlciB0eXBlLXNhZmV0eS5cbiAqXG4gKiAtIG9wdGlvbnMgb2JqZWN0IG11c3QgYmUgcGFzc2VkIHdoZW4gdGhlIGdpdmVuIGNvbXBvbmVudCBpbnN0YW5jZSBjb250YWlucyBhdCBsZWFzdCBvbmUgcmVxdWlyZWQgc2lnbmFsIGlucHV0LlxuICogLSBvcHRpb25zL2lucHV0cyBpcyB0eXBlZCB3aXRoIHRoZSBnaXZlbiBjb21wb25lbnQgaW5wdXRzXG4gKiAtIG9wdGlvbnMvb3V0cHV0cyBpcyB0eXBlZCB3aXRoIHRoZSBnaXZlbiBjb21wb25lbnQgb3V0cHV0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmxleFJlbmRlckNvbXBvbmVudDxcbiAgVENvbXBvbmVudCA9IGFueSxcbiAgVElucHV0cyBleHRlbmRzIElucHV0czxUQ29tcG9uZW50PiA9IElucHV0czxUQ29tcG9uZW50PixcbiAgVE91dHB1dHMgZXh0ZW5kcyBPdXRwdXRzPFRDb21wb25lbnQ+ID0gT3V0cHV0czxUQ29tcG9uZW50Pixcbj4oXG4gIGNvbXBvbmVudDogVHlwZTxUQ29tcG9uZW50PixcbiAgLi4ub3B0aW9uczogT3B0aW9uYWxLZXlzPFRJbnB1dHM+IGV4dGVuZHMgbmV2ZXJcbiAgICA/IFtGbGV4UmVuZGVyT3B0aW9uczxUSW5wdXRzLCBUT3V0cHV0cz4/XVxuICAgIDogW0ZsZXhSZW5kZXJSZXF1aXJlZE9wdGlvbnM8VElucHV0cywgVE91dHB1dHM+XVxuKSB7XG4gIGNvbnN0IHsgaW5wdXRzLCBpbmplY3Rvciwgb3V0cHV0cyB9ID0gb3B0aW9ucz8uWzBdID8/IHt9XG4gIHJldHVybiBuZXcgRmxleFJlbmRlckNvbXBvbmVudChjb21wb25lbnQsIGlucHV0cywgaW5qZWN0b3IsIG91dHB1dHMpXG59XG5cbi8qKlxuICogV3JhcHBlciBjbGFzcyBmb3IgYSBjb21wb25lbnQgdGhhdCB3aWxsIGJlIHVzZWQgYXMgY29udGVudCBmb3Ige0BsaW5rIEZsZXhSZW5kZXJEaXJlY3RpdmV9XG4gKlxuICogUHJlZmVyIHtAbGluayBmbGV4UmVuZGVyQ29tcG9uZW50fSBoZWxwZXIgZm9yIGJldHRlciB0eXBlLXNhZmV0eVxuICovXG5leHBvcnQgY2xhc3MgRmxleFJlbmRlckNvbXBvbmVudDxUQ29tcG9uZW50ID0gYW55PiB7XG4gIHJlYWRvbmx5IG1pcnJvcjogQ29tcG9uZW50TWlycm9yPFRDb21wb25lbnQ+XG4gIHJlYWRvbmx5IGFsbG93ZWRJbnB1dE5hbWVzOiBzdHJpbmdbXSA9IFtdXG4gIHJlYWRvbmx5IGFsbG93ZWRPdXRwdXROYW1lczogc3RyaW5nW10gPSBbXVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGNvbXBvbmVudDogVHlwZTxUQ29tcG9uZW50PixcbiAgICByZWFkb25seSBpbnB1dHM/OiBJbnB1dHM8VENvbXBvbmVudD4sXG4gICAgcmVhZG9ubHkgaW5qZWN0b3I/OiBJbmplY3RvcixcbiAgICByZWFkb25seSBvdXRwdXRzPzogT3V0cHV0czxUQ29tcG9uZW50PlxuICApIHtcbiAgICBjb25zdCBtaXJyb3IgPSByZWZsZWN0Q29tcG9uZW50VHlwZShjb21wb25lbnQpXG4gICAgaWYgKCFtaXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFtAdGFuc3RhY2stdGFibGUvYW5ndWxhcl0gVGhlIHByb3ZpZGVkIHN5bWJvbCBpcyBub3QgYSBjb21wb25lbnRgXG4gICAgICApXG4gICAgfVxuICAgIHRoaXMubWlycm9yID0gbWlycm9yXG4gICAgZm9yIChjb25zdCBpbnB1dCBvZiB0aGlzLm1pcnJvci5pbnB1dHMpIHtcbiAgICAgIHRoaXMuYWxsb3dlZElucHV0TmFtZXMucHVzaChpbnB1dC5wcm9wTmFtZSlcbiAgICB9XG4gICAgZm9yIChjb25zdCBvdXRwdXQgb2YgdGhpcy5taXJyb3Iub3V0cHV0cykge1xuICAgICAgdGhpcy5hbGxvd2VkT3V0cHV0TmFtZXMucHVzaChvdXRwdXQucHJvcE5hbWUpXG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { TemplateRef, Type } from '@angular/core';
|
|
2
|
+
import { FlexRenderComponent } from './flex-render-component';
|
|
3
|
+
export function mapToFlexRenderTypedContent(content) {
|
|
4
|
+
if (content === null || content === undefined) {
|
|
5
|
+
return { kind: 'null' };
|
|
6
|
+
}
|
|
7
|
+
if (typeof content === 'string' || typeof content === 'number') {
|
|
8
|
+
return { kind: 'primitive', content };
|
|
9
|
+
}
|
|
10
|
+
if (content instanceof FlexRenderComponent) {
|
|
11
|
+
return { kind: 'flexRenderComponent', content };
|
|
12
|
+
}
|
|
13
|
+
else if (content instanceof TemplateRef) {
|
|
14
|
+
return { kind: 'templateRef', content };
|
|
15
|
+
}
|
|
16
|
+
else if (content instanceof Type) {
|
|
17
|
+
return { kind: 'component', content };
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
return { kind: 'primitive', content };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export class FlexRenderView {
|
|
24
|
+
view;
|
|
25
|
+
#previousContent;
|
|
26
|
+
#content;
|
|
27
|
+
constructor(initialContent, view) {
|
|
28
|
+
this.#content = initialContent;
|
|
29
|
+
this.view = view;
|
|
30
|
+
}
|
|
31
|
+
get previousContent() {
|
|
32
|
+
return this.#previousContent ?? { kind: 'null' };
|
|
33
|
+
}
|
|
34
|
+
get content() {
|
|
35
|
+
return this.#content;
|
|
36
|
+
}
|
|
37
|
+
set content(content) {
|
|
38
|
+
this.#previousContent = this.#content;
|
|
39
|
+
this.#content = content;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export class FlexRenderTemplateView extends FlexRenderView {
|
|
43
|
+
constructor(initialContent, view) {
|
|
44
|
+
super(initialContent, view);
|
|
45
|
+
}
|
|
46
|
+
updateProps(props) {
|
|
47
|
+
this.view.markForCheck();
|
|
48
|
+
}
|
|
49
|
+
dirtyCheck() {
|
|
50
|
+
// Basically a no-op. When the view is created via EmbeddedViewRef, we don't need to do any manual update
|
|
51
|
+
// since this type of content has a proxy as a context, then every time the root component is checked for changes,
|
|
52
|
+
// the property getter will be re-evaluated.
|
|
53
|
+
//
|
|
54
|
+
// If in a future we need to manually mark the view as dirty, just uncomment next line
|
|
55
|
+
// this.view.markForCheck()
|
|
56
|
+
}
|
|
57
|
+
onDestroy(callback) {
|
|
58
|
+
this.view.onDestroy(callback);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export class FlexRenderComponentView extends FlexRenderView {
|
|
62
|
+
constructor(initialContent, view) {
|
|
63
|
+
super(initialContent, view);
|
|
64
|
+
}
|
|
65
|
+
updateProps(props) {
|
|
66
|
+
switch (this.content.kind) {
|
|
67
|
+
case 'component': {
|
|
68
|
+
this.view.setInputs(props);
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
case 'flexRenderComponent': {
|
|
72
|
+
// No-op. When FlexRenderFlags.PropsReferenceChanged is set,
|
|
73
|
+
// FlexRenderComponent will be updated into `dirtyCheck`.
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
dirtyCheck() {
|
|
79
|
+
switch (this.content.kind) {
|
|
80
|
+
case 'component': {
|
|
81
|
+
// Component context is currently valuated with the cell context. Since it's reference
|
|
82
|
+
// shouldn't change, we force mark the component as dirty in order to re-evaluate function invocation in view.
|
|
83
|
+
// NOTE: this should behave like having a component with ChangeDetectionStrategy.Default
|
|
84
|
+
this.view.markAsDirty();
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
case 'flexRenderComponent': {
|
|
88
|
+
// Given context instance will always have a different reference than the previous one,
|
|
89
|
+
// so instead of recreating the entire view, we will only update the current view
|
|
90
|
+
if (this.view.eqType(this.content.content)) {
|
|
91
|
+
this.view.update(this.content.content);
|
|
92
|
+
}
|
|
93
|
+
this.view.markAsDirty();
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
onDestroy(callback) {
|
|
99
|
+
this.view.componentRef.onDestroy(callback);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9mbGV4LXJlbmRlci92aWV3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBbUIsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUVsRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQVk3RCxNQUFNLFVBQVUsMkJBQTJCLENBQ3pDLE9BQStCO0lBRS9CLElBQUksT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDOUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQTtJQUN6QixDQUFDO0lBQ0QsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDL0QsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUE7SUFDdkMsQ0FBQztJQUNELElBQUksT0FBTyxZQUFZLG1CQUFtQixFQUFFLENBQUM7UUFDM0MsT0FBTyxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxPQUFPLEVBQUUsQ0FBQTtJQUNqRCxDQUFDO1NBQU0sSUFBSSxPQUFPLFlBQVksV0FBVyxFQUFFLENBQUM7UUFDMUMsT0FBTyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLENBQUE7SUFDekMsQ0FBQztTQUFNLElBQUksT0FBTyxZQUFZLElBQUksRUFBRSxDQUFDO1FBQ25DLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxDQUFBO0lBQ3ZDLENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUE7SUFDdkMsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLE9BQWdCLGNBQWM7SUFHekIsSUFBSSxDQUFPO0lB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eFJlbmRlckNvbXBvbmVudFJlZiB9IGZyb20gJy4vZmxleC1yZW5kZXItY29tcG9uZW50LXJlZidcbmltcG9ydCB7IEVtYmVkZGVkVmlld1JlZiwgVGVtcGxhdGVSZWYsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHR5cGUgeyBGbGV4UmVuZGVyQ29udGVudCB9IGZyb20gJy4uL2ZsZXgtcmVuZGVyJ1xuaW1wb3J0IHsgRmxleFJlbmRlckNvbXBvbmVudCB9IGZyb20gJy4vZmxleC1yZW5kZXItY29tcG9uZW50J1xuXG5leHBvcnQgdHlwZSBGbGV4UmVuZGVyVHlwZWRDb250ZW50ID1cbiAgfCB7IGtpbmQ6ICdudWxsJyB9XG4gIHwge1xuICAgICAga2luZDogJ3ByaW1pdGl2ZSdcbiAgICAgIGNvbnRlbnQ6IHN0cmluZyB8IG51bWJlciB8IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICB9XG4gIHwgeyBraW5kOiAnZmxleFJlbmRlckNvbXBvbmVudCc7IGNvbnRlbnQ6IEZsZXhSZW5kZXJDb21wb25lbnQ8dW5rbm93bj4gfVxuICB8IHsga2luZDogJ3RlbXBsYXRlUmVmJzsgY29udGVudDogVGVtcGxhdGVSZWY8dW5rbm93bj4gfVxuICB8IHsga2luZDogJ2NvbXBvbmVudCc7IGNvbnRlbnQ6IFR5cGU8dW5rbm93bj4gfVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9GbGV4UmVuZGVyVHlwZWRDb250ZW50KFxuICBjb250ZW50OiBGbGV4UmVuZGVyQ29udGVudDxhbnk+XG4pOiBGbGV4UmVuZGVyVHlwZWRDb250ZW50IHtcbiAgaWYgKGNvbnRlbnQgPT09IG51bGwgfHwgY29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHsga2luZDogJ251bGwnIH1cbiAgfVxuICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBjb250ZW50ID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB7IGtpbmQ6ICdwcmltaXRpdmUnLCBjb250ZW50IH1cbiAgfVxuICBpZiAoY29udGVudCBpbnN0YW5jZW9mIEZsZXhSZW5kZXJDb21wb25lbnQpIHtcbiAgICByZXR1cm4geyBraW5kOiAnZmxleFJlbmRlckNvbXBvbmVudCcsIGNvbnRlbnQgfVxuICB9IGVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZikge1xuICAgIHJldHVybiB7IGtpbmQ6ICd0ZW1wbGF0ZVJlZicsIGNvbnRlbnQgfVxuICB9IGVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBUeXBlKSB7XG4gICAgcmV0dXJuIHsga2luZDogJ2NvbXBvbmVudCcsIGNvbnRlbnQgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB7IGtpbmQ6ICdwcmltaXRpdmUnLCBjb250ZW50IH1cbiAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRmxleFJlbmRlclZpZXc8XG4gIFRWaWV3IGV4dGVuZHMgRmxleFJlbmRlckNvbXBvbmVudFJlZjxhbnk+IHwgRW1iZWRkZWRWaWV3UmVmPHVua25vd24+IHwgbnVsbCxcbj4ge1xuICByZWFkb25seSB2aWV3OiBUVmlld1xuICAjcHJldmlvdXNDb250ZW50OiBGbGV4UmVuZGVyVHlwZWRDb250ZW50IHwgdW5kZWZpbmVkXG4gICNjb250ZW50OiBGbGV4UmVuZGVyVHlwZWRDb250ZW50XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIGluaXRpYWxDb250ZW50OiBFeGNsdWRlPEZsZXhSZW5kZXJUeXBlZENvbnRlbnQsIHsga2luZDogJ251bGwnIH0+LFxuICAgIHZpZXc6IFRWaWV3XG4gICkge1xuICAgIHRoaXMuI2NvbnRlbnQgPSBpbml0aWFsQ29udGVudFxuICAgIHRoaXMudmlldyA9IHZpZXdcbiAgfVxuXG4gIGdldCBwcmV2aW91c0NvbnRlbnQoKTogRmxleFJlbmRlclR5cGVkQ29udGVudCB7XG4gICAgcmV0dXJuIHRoaXMuI3ByZXZpb3VzQ29udGVudCA/PyB7IGtpbmQ6ICdudWxsJyB9XG4gIH1cblxuICBnZXQgY29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy4jY29udGVudFxuICB9XG5cbiAgc2V0IGNvbnRlbnQoY29udGVudDogRmxleFJlbmRlclR5cGVkQ29udGVudCkge1xuICAgIHRoaXMuI3ByZXZpb3VzQ29udGVudCA9IHRoaXMuI2NvbnRlbnRcbiAgICB0aGlzLiNjb250ZW50ID0gY29udGVudFxuICB9XG5cbiAgYWJzdHJhY3QgdXBkYXRlUHJvcHMocHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkXG5cbiAgYWJzdHJhY3QgZGlydHlDaGVjaygpOiB2b2lkXG5cbiAgYWJzdHJhY3Qgb25EZXN0cm95KGNhbGxiYWNrOiBGdW5jdGlvbik6IHZvaWRcbn1cblxuZXhwb3J0IGNsYXNzIEZsZXhSZW5kZXJUZW1wbGF0ZVZpZXcgZXh0ZW5kcyBGbGV4UmVuZGVyVmlldzxcbiAgRW1iZWRkZWRWaWV3UmVmPHVua25vd24+XG4+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgaW5pdGlhbENvbnRlbnQ6IEV4dHJhY3Q8XG4gICAgICBGbGV4UmVuZGVyVHlwZWRDb250ZW50LFxuICAgICAgeyBraW5kOiAncHJpbWl0aXZlJyB8ICd0ZW1wbGF0ZVJlZicgfVxuICAgID4sXG4gICAgdmlldzogRW1iZWRkZWRWaWV3UmVmPHVua25vd24+XG4gICkge1xuICAgIHN1cGVyKGluaXRpYWxDb250ZW50LCB2aWV3KVxuICB9XG5cbiAgb3ZlcnJpZGUgdXBkYXRlUHJvcHMocHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0aGlzLnZpZXcubWFya0ZvckNoZWNrKClcbiAgfVxuXG4gIG92ZXJyaWRlIGRpcnR5Q2hlY2soKSB7XG4gICAgLy8gQmFzaWNhbGx5IGEgbm8tb3AuIFdoZW4gdGhlIHZpZXcgaXMgY3JlYXRlZCB2aWEgRW1iZWRkZWRWaWV3UmVmLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueSBtYW51YWwgdXBkYXRlXG4gICAgLy8gc2luY2UgdGhpcyB0eXBlIG9mIGNvbnRlbnQgaGFzIGEgcHJveHkgYXMgYSBjb250ZXh0LCB0aGVuIGV2ZXJ5IHRpbWUgdGhlIHJvb3QgY29tcG9uZW50IGlzIGNoZWNrZWQgZm9yIGNoYW5nZXMsXG4gICAgLy8gdGhlIHByb3BlcnR5IGdldHRlciB3aWxsIGJlIHJlLWV2YWx1YXRlZC5cbiAgICAvL1xuICAgIC8vIElmIGluIGEgZnV0dXJlIHdlIG5lZWQgdG8gbWFudWFsbHkgbWFyayB0aGUgdmlldyBhcyBkaXJ0eSwganVzdCB1bmNvbW1lbnQgbmV4dCBsaW5lXG4gICAgLy8gdGhpcy52aWV3Lm1hcmtGb3JDaGVjaygpXG4gIH1cblxuICBvdmVycmlkZSBvbkRlc3Ryb3koY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgdGhpcy52aWV3Lm9uRGVzdHJveShjYWxsYmFjaylcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmxleFJlbmRlckNvbXBvbmVudFZpZXcgZXh0ZW5kcyBGbGV4UmVuZGVyVmlldzxcbiAgRmxleFJlbmRlckNvbXBvbmVudFJlZjx1bmtub3duPlxuPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGluaXRpYWxDb250ZW50OiBFeHRyYWN0PFxuICAgICAgRmxleFJlbmRlclR5cGVkQ29udGVudCxcbiAgICAgIHsga2luZDogJ2NvbXBvbmVudCcgfCAnZmxleFJlbmRlckNvbXBvbmVudCcgfVxuICAgID4sXG4gICAgdmlldzogRmxleFJlbmRlckNvbXBvbmVudFJlZjx1bmtub3duPlxuICApIHtcbiAgICBzdXBlcihpbml0aWFsQ29udGVudCwgdmlldylcbiAgfVxuXG4gIG92ZXJyaWRlIHVwZGF0ZVByb3BzKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgc3dpdGNoICh0aGlzLmNvbnRlbnQua2luZCkge1xuICAgICAgY2FzZSAnY29tcG9uZW50Jzoge1xuICAgICAgICB0aGlzLnZpZXcuc2V0SW5wdXRzKHByb3BzKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnZmxleFJlbmRlckNvbXBvbmVudCc6IHtcbiAgICAgICAgLy8gTm8tb3AuIFdoZW4gRmxleFJlbmRlckZsYWdzLlByb3BzUmVmZXJlbmNlQ2hhbmdlZCBpcyBzZXQsXG4gICAgICAgIC8vIEZsZXhSZW5kZXJDb21wb25lbnQgd2lsbCBiZSB1cGRhdGVkIGludG8gYGRpcnR5Q2hlY2tgLlxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGRpcnR5Q2hlY2soKSB7XG4gICAgc3dpdGNoICh0aGlzLmNvbnRlbnQua2luZCkge1xuICAgICAgY2FzZSAnY29tcG9uZW50Jzoge1xuICAgICAgICAvLyBDb21wb25lbnQgY29udGV4dCBpcyBjdXJyZW50bHkgdmFsdWF0ZWQgd2l0aCB0aGUgY2VsbCBjb250ZXh0LiBTaW5jZSBpdCdzIHJlZmVyZW5jZVxuICAgICAgICAvLyBzaG91bGRuJ3QgY2hhbmdlLCB3ZSBmb3JjZSBtYXJrIHRoZSBjb21wb25lbnQgYXMgZGlydHkgaW4gb3JkZXIgdG8gcmUtZXZhbHVhdGUgZnVuY3Rpb24gaW52b2NhdGlvbiBpbiB2aWV3LlxuICAgICAgICAvLyBOT1RFOiB0aGlzIHNob3VsZCBiZWhhdmUgbGlrZSBoYXZpbmcgYSBjb21wb25lbnQgd2l0aCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0XG4gICAgICAgIHRoaXMudmlldy5tYXJrQXNEaXJ0eSgpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdmbGV4UmVuZGVyQ29tcG9uZW50Jzoge1xuICAgICAgICAvLyBHaXZlbiBjb250ZXh0IGluc3RhbmNlIHdpbGwgYWx3YXlzIGhhdmUgYSBkaWZmZXJlbnQgcmVmZXJlbmNlIHRoYW4gdGhlIHByZXZpb3VzIG9uZSxcbiAgICAgICAgLy8gc28gaW5zdGVhZCBvZiByZWNyZWF0aW5nIHRoZSBlbnRpcmUgdmlldywgd2Ugd2lsbCBvbmx5IHVwZGF0ZSB0aGUgY3VycmVudCB2aWV3XG4gICAgICAgIGlmICh0aGlzLnZpZXcuZXFUeXBlKHRoaXMuY29udGVudC5jb250ZW50KSkge1xuICAgICAgICAgIHRoaXMudmlldy51cGRhdGUodGhpcy5jb250ZW50LmNvbnRlbnQpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aWV3Lm1hcmtBc0RpcnR5KClcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBvbkRlc3Ryb3koY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgdGhpcy52aWV3LmNvbXBvbmVudFJlZi5vbkRlc3Ryb3koY2FsbGJhY2spXG4gIH1cbn1cbiJdfQ==
|