@edm-sdui/sdui 1.0.35 → 1.0.37
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/edm-sdui-sdui-1.0.37.tgz +0 -0
- package/esm2022/lib/components/uicomponent/tag/tag.component.mjs +10 -154
- package/esm2022/lib/components/uicomponent/tags-row/tag/tag.component.mjs +203 -0
- package/esm2022/lib/components/uicomponent/tags-row/tags-row.component.mjs +17 -7
- package/esm2022/lib/core/services/uiscreen.service.mjs +3 -1
- package/esm2022/lib/core/uicomposition/enums/uicomponent-type.mjs +2 -1
- package/esm2022/lib/core/uicomposition/mapping/component-mapping.mjs +2 -1
- package/esm2022/lib/directives/uiview.directive.mjs +30 -8
- package/esm2022/lib/sdui.component.mjs +2 -2
- package/esm2022/lib/sdui.module.mjs +4 -1
- package/fesm2022/edm-sdui-sdui.mjs +135 -43
- package/fesm2022/edm-sdui-sdui.mjs.map +1 -1
- package/lib/components/uicomponent/tag/tag.component.d.ts +5 -20
- package/lib/components/uicomponent/tag/tag.component.d.ts.map +1 -1
- package/lib/components/uicomponent/tags-row/tag/tag.component.d.ts +34 -0
- package/lib/components/uicomponent/tags-row/tag/tag.component.d.ts.map +1 -0
- package/lib/components/uicomponent/tags-row/tags-row.component.d.ts +5 -3
- package/lib/components/uicomponent/tags-row/tags-row.component.d.ts.map +1 -1
- package/lib/core/services/uiscreen.service.d.ts.map +1 -1
- package/lib/core/uicomposition/enums/uicomponent-type.d.ts +1 -0
- package/lib/core/uicomposition/enums/uicomponent-type.d.ts.map +1 -1
- package/lib/core/uicomposition/mapping/component-mapping.d.ts.map +1 -1
- package/lib/directives/uiview.directive.d.ts.map +1 -1
- package/lib/sdui.module.d.ts +17 -16
- package/lib/sdui.module.d.ts.map +1 -1
- package/package.json +1 -1
- package/edm-sdui-sdui-1.0.35.tgz +0 -0
|
Binary file
|
|
@@ -4,78 +4,28 @@ import { textStyleMappingLineHeight } from "../../../core/uitheme/mapping/text-s
|
|
|
4
4
|
import { FontSizeMappingService } from "../../../core/services/font-size-mapping.service";
|
|
5
5
|
import { UISize } from "../../../core/uitheme/enums/uisize";
|
|
6
6
|
import { sizeMappingHeight } from "../../../core/uitheme/mapping/size-mapping";
|
|
7
|
-
import { ScrollSpyService } from "../../../core/services/scroll-spy.service";
|
|
8
|
-
import { Subject } from "rxjs";
|
|
9
7
|
import * as i0 from "@angular/core";
|
|
10
8
|
import * as i1 from "../../../core/services/font-size-mapping.service";
|
|
11
|
-
import * as i2 from "
|
|
12
|
-
import * as i3 from "
|
|
13
|
-
import * as i4 from "../../../directives/uiview.directive";
|
|
9
|
+
import * as i2 from "@angular/common";
|
|
10
|
+
import * as i3 from "../../../directives/uiview.directive";
|
|
14
11
|
export class TagComponent {
|
|
15
|
-
|
|
16
|
-
static { this.scrollSpy$ = null; }
|
|
17
|
-
static { this.scrollSpySub = null; }
|
|
18
|
-
static { this.scrollSpyInitTries = 0; }
|
|
19
|
-
static { this.scrollSpyContainer = null; }
|
|
20
|
-
static { this.activeId = null; }
|
|
21
|
-
constructor(uiComponent, renderer, fontSizeMappingService, scrollSpy) {
|
|
12
|
+
constructor(uiComponent, renderer, fontSizeMappingService) {
|
|
22
13
|
this.uiComponent = uiComponent;
|
|
23
14
|
this.renderer = renderer;
|
|
24
15
|
this.fontSizeMappingService = fontSizeMappingService;
|
|
25
|
-
this.scrollSpy = scrollSpy;
|
|
26
|
-
this.destroy$ = new Subject();
|
|
27
16
|
}
|
|
28
17
|
ngOnInit() {
|
|
29
18
|
}
|
|
30
19
|
ngAfterViewInit() {
|
|
31
20
|
if (this.uiComponent.element) {
|
|
32
21
|
this.applyElement(this.uiComponent.element);
|
|
22
|
+
}
|
|
23
|
+
if (this.uiComponent.element) {
|
|
33
24
|
this.applyLabelElement(this.uiComponent.element);
|
|
34
|
-
// Map: tag.action.param -> section div id
|
|
35
|
-
const actionParam = this.uiComponent?.element?.action?.param;
|
|
36
|
-
if (actionParam != null && this.tagElementRef?.nativeElement) {
|
|
37
|
-
this.renderer.setAttribute(this.tagElementRef.nativeElement, 'data-tag', String(actionParam));
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
console.warn('[TagComponent] tag without action.param', this.uiComponent?.element);
|
|
41
|
-
}
|
|
42
|
-
// Reaplica seleção se este tag corresponde ao ativo atual.
|
|
43
|
-
this.syncSelectionState();
|
|
44
|
-
// IMPORTANT: TagComponent renders once per tag.
|
|
45
|
-
// We initialize the scroll observer only once, but we MUST NOT tie it to the first instance lifecycle,
|
|
46
|
-
// because the first instance may be destroyed (e.g. rerender) and the subscription would die.
|
|
47
|
-
this.initScrollSpyOnce();
|
|
48
25
|
}
|
|
49
26
|
}
|
|
50
27
|
applyElement(element) {
|
|
51
28
|
}
|
|
52
|
-
markSelectedTag(id) {
|
|
53
|
-
const tags = Array.from(document.querySelectorAll('.tag'));
|
|
54
|
-
const dataTags = tags.map(t => t.getAttribute('data-tag'));
|
|
55
|
-
console.log('[TagComponent] markSelectedTag', { id, dataTags });
|
|
56
|
-
TagComponent.activeId = id;
|
|
57
|
-
for (const t of tags)
|
|
58
|
-
t.classList.remove('tag--selected');
|
|
59
|
-
const active = document.querySelector(`.tag[data-tag="${CSS.escape(id)}"]`);
|
|
60
|
-
if (!active) {
|
|
61
|
-
console.warn('[TagComponent] active tag not found for id', id);
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
active.classList.add('tag--selected');
|
|
65
|
-
this.ensureTagVisible(active);
|
|
66
|
-
console.log('[TagComponent] tag--selected applied to', active);
|
|
67
|
-
}
|
|
68
|
-
syncSelectionState() {
|
|
69
|
-
const dataTag = this.tagElementRef?.nativeElement?.getAttribute('data-tag');
|
|
70
|
-
if (!dataTag)
|
|
71
|
-
return;
|
|
72
|
-
if (TagComponent.activeId && TagComponent.activeId === dataTag) {
|
|
73
|
-
this.tagElementRef.nativeElement.classList.add('tag--selected');
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
this.tagElementRef.nativeElement.classList.remove('tag--selected');
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
29
|
applyLabelElement(element) {
|
|
80
30
|
if (element.textColor) {
|
|
81
31
|
const color = colorMapping[element.textColor];
|
|
@@ -90,114 +40,20 @@ export class TagComponent {
|
|
|
90
40
|
}
|
|
91
41
|
this.renderer.setStyle(this.tagElementRef.nativeElement, 'height', sizeMappingHeight[UISize.ASSET_8]);
|
|
92
42
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
if (TagComponent.scrollSpySub) {
|
|
96
|
-
const currentContainer = this.resolveScrollContainer();
|
|
97
|
-
const stale = !TagComponent.scrollSpyContainer?.isConnected || (currentContainer && TagComponent.scrollSpyContainer !== currentContainer);
|
|
98
|
-
if (!stale)
|
|
99
|
-
return;
|
|
100
|
-
try {
|
|
101
|
-
TagComponent.scrollSpySub.unsubscribe();
|
|
102
|
-
}
|
|
103
|
-
catch { }
|
|
104
|
-
TagComponent.scrollSpySub = null;
|
|
105
|
-
TagComponent.scrollSpy$ = null;
|
|
106
|
-
TagComponent.scrollSpyContainer = null;
|
|
107
|
-
TagComponent.scrollSpyInitialized = false;
|
|
108
|
-
}
|
|
109
|
-
// Ensure container exists; TagComponent can render before the scroll container is in the DOM.
|
|
110
|
-
const containerExists = !!this.resolveScrollContainer();
|
|
111
|
-
if (!containerExists) {
|
|
112
|
-
TagComponent.scrollSpyInitTries++;
|
|
113
|
-
if (TagComponent.scrollSpyInitTries <= 30) {
|
|
114
|
-
requestAnimationFrame(() => this.initScrollSpyOnce());
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
console.warn('[TagComponent] ScrollSpy: .scrollable-container not found after retries');
|
|
118
|
-
}
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
try {
|
|
122
|
-
TagComponent.scrollSpyInitialized = true;
|
|
123
|
-
const currentContainer = this.resolveScrollContainer();
|
|
124
|
-
TagComponent.scrollSpy$ = this.scrollSpy.observeActiveId({
|
|
125
|
-
container: currentContainer,
|
|
126
|
-
anchorSelector: '[data-anchor-target], .column[id]',
|
|
127
|
-
getOffsetTop: () => (document.querySelector('.tags-row--can-fix') ? 140 : 180),
|
|
128
|
-
resolveId: (anchor) => {
|
|
129
|
-
const section = anchor.closest('[data-anchor-target]');
|
|
130
|
-
if (section?.id)
|
|
131
|
-
return section.id;
|
|
132
|
-
if (anchor.id)
|
|
133
|
-
return anchor.id;
|
|
134
|
-
return anchor.closest('[id]')?.id || null;
|
|
135
|
-
},
|
|
136
|
-
debug: false,
|
|
137
|
-
});
|
|
138
|
-
TagComponent.scrollSpyContainer = currentContainer;
|
|
139
|
-
TagComponent.scrollSpySub = TagComponent.scrollSpy$.subscribe({
|
|
140
|
-
next: (activeId) => {
|
|
141
|
-
console.log('[TagComponent] ScrollSpy next', activeId);
|
|
142
|
-
if (!activeId)
|
|
143
|
-
return;
|
|
144
|
-
this.markSelectedTag(activeId);
|
|
145
|
-
},
|
|
146
|
-
error: (err) => {
|
|
147
|
-
console.error('[TagComponent] ScrollSpy subscription error', err);
|
|
148
|
-
},
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
catch (e) {
|
|
152
|
-
console.error('[TagComponent] ScrollSpy init failed', e);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
resolveScrollContainer() {
|
|
156
|
-
const explicit = document.querySelector('.scrollable-container');
|
|
157
|
-
if (explicit && explicit.scrollHeight > explicit.clientHeight) {
|
|
158
|
-
return explicit;
|
|
159
|
-
}
|
|
160
|
-
const anchorSample = document.querySelector('.column[id]') ||
|
|
161
|
-
document.querySelector('[data-anchor-target]');
|
|
162
|
-
if (anchorSample) {
|
|
163
|
-
return this.scrollSpy.getScrollParent(anchorSample);
|
|
164
|
-
}
|
|
165
|
-
return document.scrollingElement || document.documentElement;
|
|
166
|
-
}
|
|
167
|
-
ensureTagVisible(tagEl) {
|
|
168
|
-
const container = tagEl.closest('.tags-row');
|
|
169
|
-
if (!container)
|
|
170
|
-
return;
|
|
171
|
-
const containerRect = container.getBoundingClientRect();
|
|
172
|
-
const tagRect = tagEl.getBoundingClientRect();
|
|
173
|
-
const padding = 12; // keep a small side breathing room
|
|
174
|
-
if (tagRect.left < containerRect.left + padding) {
|
|
175
|
-
const delta = tagRect.left - containerRect.left - padding;
|
|
176
|
-
container.scrollBy({ left: delta, behavior: 'smooth' });
|
|
177
|
-
}
|
|
178
|
-
else if (tagRect.right > containerRect.right - padding) {
|
|
179
|
-
const delta = tagRect.right - containerRect.right + padding;
|
|
180
|
-
container.scrollBy({ left: delta, behavior: 'smooth' });
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
ngOnDestroy() {
|
|
184
|
-
this.destroy$.next();
|
|
185
|
-
this.destroy$.complete();
|
|
186
|
-
}
|
|
187
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TagComponent, deps: [{ token: 'uiComponent' }, { token: i0.Renderer2 }, { token: i1.FontSizeMappingService }, { token: i2.ScrollSpyService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
188
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: TagComponent, isStandalone: false, selector: "edm-sdui-tag", viewQueries: [{ propertyName: "tagElementRef", first: true, predicate: ["tagElement"], descendants: true }, { propertyName: "tagNameElementRef", first: true, predicate: ["tagNameElement"], descendants: true }], ngImport: i0, template: "<div class=\"tag\" #tagElement *ngIf=\"uiComponent\" [edmSduiView]=\"uiComponent.element\">\n <span class=\"tag-name\" #tagNameElement>{{ uiComponent.element?.label ?? '' }}</span>\n</div>\n", styles: [":host{display:contents}.tag{display:inline-flex;align-items:center;gap:8px;padding:14px 16px;border:.5px solid var(--tag-explorer-aux);cursor:pointer;font-size:16px;flex-shrink:0}.tag--square{border-radius:4px}.tag--rounded{border-radius:999px}.tag--selected{border-color:var(--tag-explorer-highlight);background-color:var(--bt-tag-explorer-on);background-origin:border-box}.tag-name{font-weight:600;color:var(--font-bt-tag-explorer-on);font-size:15px;line-height:17.25px}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.UIViewDirective, selector: "[edmSduiView]", inputs: ["edmSduiView", "disableClick"] }] }); }
|
|
43
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TagComponent, deps: [{ token: 'uiComponent' }, { token: i0.Renderer2 }, { token: i1.FontSizeMappingService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
44
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: TagComponent, isStandalone: false, selector: "edm-sdui-tag", viewQueries: [{ propertyName: "tagElementRef", first: true, predicate: ["tagElement"], descendants: true }, { propertyName: "tagNameElementRef", first: true, predicate: ["tagNameElement"], descendants: true }], ngImport: i0, template: "<div class=\"tag\" #tagElement *ngIf=\"uiComponent\" [edmSduiView]=\"uiComponent.element\">\n <span class=\"tag-name\" #tagNameElement>{{ uiComponent.element?.label ?? '' }}</span>\n</div>", styles: [":host{display:contents}.tag{padding:4px 8px;display:flex;align-items:center}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.UIViewDirective, selector: "[edmSduiView]", inputs: ["edmSduiView", "disableClick"] }] }); }
|
|
189
45
|
}
|
|
190
46
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TagComponent, decorators: [{
|
|
191
47
|
type: Component,
|
|
192
|
-
args: [{ standalone: false, selector: 'edm-sdui-tag', template: "<div class=\"tag\" #tagElement *ngIf=\"uiComponent\" [edmSduiView]=\"uiComponent.element\">\n <span class=\"tag-name\" #tagNameElement>{{ uiComponent.element?.label ?? '' }}</span>\n</div
|
|
48
|
+
args: [{ standalone: false, selector: 'edm-sdui-tag', template: "<div class=\"tag\" #tagElement *ngIf=\"uiComponent\" [edmSduiView]=\"uiComponent.element\">\n <span class=\"tag-name\" #tagNameElement>{{ uiComponent.element?.label ?? '' }}</span>\n</div>", styles: [":host{display:contents}.tag{padding:4px 8px;display:flex;align-items:center}\n"] }]
|
|
193
49
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
194
50
|
type: Inject,
|
|
195
51
|
args: ['uiComponent']
|
|
196
|
-
}] }, { type: i0.Renderer2 }, { type: i1.FontSizeMappingService }
|
|
52
|
+
}] }, { type: i0.Renderer2 }, { type: i1.FontSizeMappingService }], propDecorators: { tagElementRef: [{
|
|
197
53
|
type: ViewChild,
|
|
198
54
|
args: ['tagElement']
|
|
199
55
|
}], tagNameElementRef: [{
|
|
200
56
|
type: ViewChild,
|
|
201
57
|
args: ['tagNameElement']
|
|
202
58
|
}] } });
|
|
203
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc2R1aS9zcmMvbGliL2NvbXBvbmVudHMvdWljb21wb25lbnQvdGFnL3RhZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NkdWkvc3JjL2xpYi9jb21wb25lbnRzL3VpY29tcG9uZW50L3RhZy90YWcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBcUIsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd0SCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDM0UsT0FBTyxFQUErQiwwQkFBMEIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQzNILE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQzFGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM3RSxPQUFPLEVBQWMsT0FBTyxFQUEyQixNQUFNLE1BQU0sQ0FBQzs7Ozs7O0FBUXBFLE1BQU0sT0FBTyxZQUFZO2FBSVIseUJBQW9CLEdBQUcsS0FBSyxBQUFSLENBQVM7YUFDN0IsZUFBVSxHQUFxQyxJQUFJLEFBQXpDLENBQTBDO2FBQ3BELGlCQUFZLEdBQXdCLElBQUksQUFBNUIsQ0FBNkI7YUFDekMsdUJBQWtCLEdBQUcsQ0FBQyxBQUFKLENBQUs7YUFDdkIsdUJBQWtCLEdBQXVCLElBQUksQUFBM0IsQ0FBNEI7YUFDOUMsYUFBUSxHQUFrQixJQUFJLEFBQXRCLENBQXVCO0lBRTlDLFlBQ2dD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LEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzlDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDLG1DQUFtQztRQUV2RCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDLElBQUksR0FBRyxPQUFPLEVBQUUsQ0FBQztZQUNoRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO1lBQzFELFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzFELENBQUM7YUFBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLEtBQUssR0FBRyxPQUFPLEVBQUUsQ0FBQztZQUN6RCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO1lBQzVELFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzFELENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDOytHQXRNVSxZQUFZLGtCQVliLGFBQWE7bUdBWlosWUFBWSw0UkNqQnpCLG1NQUdBOzs0RkRjYSxZQUFZO2tCQU54QixTQUFTO2lDQUdJLEtBQUssWUFDUCxjQUFjOzswQkFjckIsTUFBTTsyQkFBQyxhQUFhO3FJQVhFLGFBQWE7c0JBQXJDLFNBQVM7dUJBQUMsWUFBWTtnQkFDTSxpQkFBaUI7c0JBQTdDLFNBQVM7dUJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbmplY3QsIE9uRGVzdHJveSwgT25Jbml0LCBSZW5kZXJlcjIsIFZpZXdDaGlsZCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3VpY29tcG9zaXRpb24vbW9kZWxzL3VpY29tcG9uZW50XCI7XG5pbXBvcnQgeyBVSUVsZW1lbnQgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS91aWNvbXBvc2l0aW9uL21vZGVscy91aWVsZW1lbnRcIjtcbmltcG9ydCB7IGNvbG9yTWFwcGluZyB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3VpdGhlbWUvbWFwcGluZy9jb2xvci1tYXBwaW5nXCI7XG5pbXBvcnQgeyBnZXRUZXh0U3R5bGVNYXBwaW5nRm9udFNpemUsIHRleHRTdHlsZU1hcHBpbmdMaW5lSGVpZ2h0IH0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvdWl0aGVtZS9tYXBwaW5nL3RleHQtc3R5bGUtbWFwcGluZ1wiO1xuaW1wb3J0IHsgRm9udFNpemVNYXBwaW5nU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL2ZvbnQtc2l6ZS1tYXBwaW5nLnNlcnZpY2VcIjtcbmltcG9ydCB7IFVJU2l6ZSB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3VpdGhlbWUvZW51bXMvdWlzaXplXCI7XG5pbXBvcnQgeyBzaXplTWFwcGluZ0hlaWdodCB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3VpdGhlbWUvbWFwcGluZy9zaXplLW1hcHBpbmdcIjtcbmltcG9ydCB7IFNjcm9sbFNweVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9zY3JvbGwtc3B5LnNlcnZpY2VcIjtcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgdGFrZVVudGlsIH0gZnJvbSBcInJ4anNcIjtcblxuQENvbXBvbmVudCh7XG4gIHN0eWxlVXJsOiAnLi90YWcuY29tcG9uZW50LnNjc3MnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFnLmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogZmFsc2UsXG4gIHNlbGVjdG9yOiAnZWRtLXNkdWktdGFnJyxcbn0pXG5leHBvcnQgY2xhc3MgVGFnQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCd0YWdFbGVtZW50JykgdGFnRWxlbWVudFJlZiE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCd0YWdOYW1lRWxlbWVudCcpIHRhZ05hbWVFbGVtZW50UmVmITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHN0YXRpYyBzY3JvbGxTcHlJbml0aWFsaXplZCA9IGZhbHNlO1xuICBwcml2YXRlIHN0YXRpYyBzY3JvbGxTcHkkOiBPYnNlcnZhYmxlPHN0cmluZyB8IG51bGw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhdGljIHNjcm9sbFNweVN1YjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhdGljIHNjcm9sbFNweUluaXRUcmllcyA9IDA7XG4gIHByaXZhdGUgc3RhdGljIHNjcm9sbFNweUNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0aWMgYWN0aXZlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoJ3VpQ29tcG9uZW50JykgcHVibGljIHVpQ29tcG9uZW50OiBVSUNvbXBvbmVudCxcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBmb250U2l6ZU1hcHBpbmdTZXJ2aWNlOiBGb250U2l6ZU1hcHBpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2Nyb2xsU3B5OiBTY3JvbGxTcHlTZXJ2aWNlXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG5cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy51aUNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICB0aGlzLmFwcGx5RWxlbWVudCh0aGlzLnVpQ29tcG9uZW50LmVsZW1lbnQpO1xuICAgICAgdGhpcy5hcHBseUxhYmVsRWxlbWVudCh0aGlzLnVpQ29tcG9uZW50LmVsZW1lbnQpO1xuXG4gICAgICAvLyBNYXA6IHRhZy5hY3Rpb24ucGFyYW0gLT4gc2VjdGlvbiBkaXYgaWRcbiAgICAgIGNvbnN0IGFjdGlvblBhcmFtID0gKHRoaXMudWlDb21wb25lbnQ/LmVsZW1lbnQgYXMgYW55KT8uYWN0aW9uPy5wYXJhbTtcbiAgICAgIGlmIChhY3Rpb25QYXJhbSAhPSBudWxsICYmIHRoaXMudGFnRWxlbWVudFJlZj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLnRhZ0VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2RhdGEtdGFnJywgU3RyaW5nKGFjdGlvblBhcmFtKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tUYWdDb21wb25lbnRdIHRhZyB3aXRob3V0IGFjdGlvbi5wYXJhbScsIHRoaXMudWlDb21wb25lbnQ/LmVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWFwbGljYSBzZWxlw6fDo28gc2UgZXN0ZSB0YWcgY29ycmVzcG9uZGUgYW8gYXRpdm8gYXR1YWwuXG4gICAgICB0aGlzLnN5bmNTZWxlY3Rpb25TdGF0ZSgpO1xuXG4gICAgICAvLyBJTVBPUlRBTlQ6IFRhZ0NvbXBvbmVudCByZW5kZXJzIG9uY2UgcGVyIHRhZy5cbiAgICAgIC8vIFdlIGluaXRpYWxpemUgdGhlIHNjcm9sbCBvYnNlcnZlciBvbmx5IG9uY2UsIGJ1dCB3ZSBNVVNUIE5PVCB0aWUgaXQgdG8gdGhlIGZpcnN0IGluc3RhbmNlIGxpZmVjeWNsZSxcbiAgICAgIC8vIGJlY2F1c2UgdGhlIGZpcnN0IGluc3RhbmNlIG1heSBiZSBkZXN0cm95ZWQgKGUuZy4gcmVyZW5kZXIpIGFuZCB0aGUgc3Vic2NyaXB0aW9uIHdvdWxkIGRpZS5cbiAgICAgIHRoaXMuaW5pdFNjcm9sbFNweU9uY2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5RWxlbWVudChlbGVtZW50OiBVSUVsZW1lbnQpIHtcblxuICB9XG5cbiAgcHJpdmF0ZSBtYXJrU2VsZWN0ZWRUYWcoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHRhZ3MgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcudGFnJykpO1xuICAgIGNvbnN0IGRhdGFUYWdzID0gdGFncy5tYXAodCA9PiB0LmdldEF0dHJpYnV0ZSgnZGF0YS10YWcnKSk7XG4gICAgY29uc29sZS5sb2coJ1tUYWdDb21wb25lbnRdIG1hcmtTZWxlY3RlZFRhZycsIHsgaWQsIGRhdGFUYWdzIH0pO1xuICAgIFRhZ0NvbXBvbmVudC5hY3RpdmVJZCA9IGlkO1xuICAgIGZvciAoY29uc3QgdCBvZiB0YWdzKSB0LmNsYXNzTGlzdC5yZW1vdmUoJ3RhZy0tc2VsZWN0ZWQnKTtcblxuICAgIGNvbnN0IGFjdGl2ZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGAudGFnW2RhdGEtdGFnPVwiJHtDU1MuZXNjYXBlKGlkKX1cIl1gKTtcbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbVGFnQ29tcG9uZW50XSBhY3RpdmUgdGFnIG5vdCBmb3VuZCBmb3IgaWQnLCBpZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGFjdGl2ZS5jbGFzc0xpc3QuYWRkKCd0YWctLXNlbGVjdGVkJyk7XG4gICAgdGhpcy5lbnN1cmVUYWdWaXNpYmxlKGFjdGl2ZSk7XG4gICAgY29uc29sZS5sb2coJ1tUYWdDb21wb25lbnRdIHRhZy0tc2VsZWN0ZWQgYXBwbGllZCB0bycsIGFjdGl2ZSk7XG4gIH1cblxuICBwcml2YXRlIHN5bmNTZWxlY3Rpb25TdGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhVGFnID0gdGhpcy50YWdFbGVtZW50UmVmPy5uYXRpdmVFbGVtZW50Py5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGFnJyk7XG4gICAgaWYgKCFkYXRhVGFnKSByZXR1cm47XG4gICAgaWYgKFRhZ0NvbXBvbmVudC5hY3RpdmVJZCAmJiBUYWdDb21wb25lbnQuYWN0aXZlSWQgPT09IGRhdGFUYWcpIHtcbiAgICAgIHRoaXMudGFnRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3RhZy0tc2VsZWN0ZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50YWdFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgndGFnLS1zZWxlY3RlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlMYWJlbEVsZW1lbnQoZWxlbWVudDogVUlFbGVtZW50KSB7XG4gICAgaWYgKGVsZW1lbnQudGV4dENvbG9yKSB7XG4gICAgICBjb25zdCBjb2xvciA9IGNvbG9yTWFwcGluZ1tlbGVtZW50LnRleHRDb2xvcl07XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudGFnTmFtZUVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2NvbG9yJywgY29sb3IpO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRTdHlsZU1hcHBpbmdGb250U2l6ZSA9IHRoaXMuZm9udFNpemVNYXBwaW5nU2VydmljZS5nZXRNYXBwaW5nKCk7XG5cbiAgICBpZiAoZWxlbWVudC50ZXh0U3R5bGUpIHtcbiAgICAgIGNvbnN0IGZvbnRTaXplID0gdGV4dFN0eWxlTWFwcGluZ0ZvbnRTaXplW2VsZW1lbnQudGV4dFN0eWxlXTtcbiAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSB0ZXh0U3R5bGVNYXBwaW5nTGluZUhlaWdodFtlbGVtZW50LnRleHRTdHlsZV07XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICB0aGlzLnRhZ05hbWVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICdmb250LXNpemUnLFxuICAgICAgICBmb250U2l6ZVxuICAgICAgKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50YWdOYW1lRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnbGluZS1oZWlnaHQnLCBsaW5lSGVpZ2h0KTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudGFnRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnaGVpZ2h0Jywgc2l6ZU1hcHBpbmdIZWlnaHRbVUlTaXplLkFTU0VUXzhdKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFNjcm9sbFNweU9uY2UoKTogdm9pZCB7XG4gICAgLy8gQWxyZWFkeSBzdWJzY3JpYmVkXG4gICAgaWYgKFRhZ0NvbXBvbmVudC5zY3JvbGxTcHlTdWIpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRDb250YWluZXIgPSB0aGlzLnJlc29sdmVTY3JvbGxDb250YWluZXIoKTtcbiAgICAgIGNvbnN0IHN0YWxlID0gIVRhZ0NvbXBvbmVudC5zY3JvbGxTcHlDb250YWluZXI/LmlzQ29ubmVjdGVkIHx8IChjdXJyZW50Q29udGFpbmVyICYmIFRhZ0NvbXBvbmVudC5zY3JvbGxTcHlDb250YWluZXIgIT09IGN1cnJlbnRDb250YWluZXIpO1xuICAgICAgaWYgKCFzdGFsZSkgcmV0dXJuO1xuXG4gICAgICB0cnkge1xuICAgICAgICBUYWdDb21wb25lbnQuc2Nyb2xsU3B5U3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9IGNhdGNoIHt9XG4gICAgICBUYWdDb21wb25lbnQuc2Nyb2xsU3B5U3ViID0gbnVsbDtcbiAgICAgIFRhZ0NvbXBvbmVudC5zY3JvbGxTcHkkID0gbnVsbDtcbiAgICAgIFRhZ0NvbXBvbmVudC5zY3JvbGxTcHlDb250YWluZXIgPSBudWxsO1xuICAgICAgVGFnQ29tcG9uZW50LnNjcm9sbFNweUluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIGNvbnRhaW5lciBleGlzdHM7IFRhZ0NvbXBvbmVudCBjYW4gcmVuZGVyIGJlZm9yZSB0aGUgc2Nyb2xsIGNvbnRhaW5lciBpcyBpbiB0aGUgRE9NLlxuICAgIGNvbnN0IGNvbnRhaW5lckV4aXN0cyA9ICEhdGhpcy5yZXNvbHZlU2Nyb2xsQ29udGFpbmVyKCk7XG4gICAgaWYgKCFjb250YWluZXJFeGlzdHMpIHtcbiAgICAgIFRhZ0NvbXBvbmVudC5zY3JvbGxTcHlJbml0VHJpZXMrKztcbiAgICAgIGlmIChUYWdDb21wb25lbnQuc2Nyb2xsU3B5SW5pdFRyaWVzIDw9IDMwKSB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLmluaXRTY3JvbGxTcHlPbmNlKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbVGFnQ29tcG9uZW50XSBTY3JvbGxTcHk6IC5zY3JvbGxhYmxlLWNvbnRhaW5lciBub3QgZm91bmQgYWZ0ZXIgcmV0cmllcycpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBUYWdDb21wb25lbnQuc2Nyb2xsU3B5SW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICBjb25zdCBjdXJyZW50Q29udGFpbmVyID0gdGhpcy5yZXNvbHZlU2Nyb2xsQ29udGFpbmVyKCkhO1xuXG4gICAgICBUYWdDb21wb25lbnQuc2Nyb2xsU3B5JCA9IHRoaXMuc2Nyb2xsU3B5Lm9ic2VydmVBY3RpdmVJZCh7XG4gICAgICAgIGNvbnRhaW5lcjogY3VycmVudENvbnRhaW5lciEsXG4gICAgICAgIGFuY2hvclNlbGVjdG9yOiAnW2RhdGEtYW5jaG9yLXRhcmdldF0sIC5jb2x1bW5baWRdJyxcbiAgICAgICAgZ2V0T2Zmc2V0VG9wOiAoKSA9PiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRhZ3Mtcm93LS1jYW4tZml4JykgPyAxNDAgOiAxODApLFxuICAgICAgICByZXNvbHZlSWQ6IChhbmNob3IpID0+IHtcbiAgICAgICAgICBjb25zdCBzZWN0aW9uID0gYW5jaG9yLmNsb3Nlc3Q8SFRNTEVsZW1lbnQ+KCdbZGF0YS1hbmNob3ItdGFyZ2V0XScpO1xuICAgICAgICAgIGlmIChzZWN0aW9uPy5pZCkgcmV0dXJuIHNlY3Rpb24uaWQ7XG4gICAgICAgICAgaWYgKGFuY2hvci5pZCkgcmV0dXJuIGFuY2hvci5pZDtcbiAgICAgICAgICByZXR1cm4gYW5jaG9yLmNsb3Nlc3Q8SFRNTEVsZW1lbnQ+KCdbaWRdJyk/LmlkIHx8IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICBUYWdDb21wb25lbnQuc2Nyb2xsU3B5Q29udGFpbmVyID0gY3VycmVudENvbnRhaW5lciE7XG5cbiAgICAgIFRhZ0NvbXBvbmVudC5zY3JvbGxTcHlTdWIgPSBUYWdDb21wb25lbnQuc2Nyb2xsU3B5JC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoYWN0aXZlSWQpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW1RhZ0NvbXBvbmVudF0gU2Nyb2xsU3B5IG5leHQnLCBhY3RpdmVJZCk7XG4gICAgICAgICAgaWYgKCFhY3RpdmVJZCkgcmV0dXJuO1xuICAgICAgICAgIHRoaXMubWFya1NlbGVjdGVkVGFnKGFjdGl2ZUlkKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVGFnQ29tcG9uZW50XSBTY3JvbGxTcHkgc3Vic2NyaXB0aW9uIGVycm9yJywgZXJyKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUYWdDb21wb25lbnRdIFNjcm9sbFNweSBpbml0IGZhaWxlZCcsIGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVNjcm9sbENvbnRhaW5lcigpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IGV4cGxpY2l0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNjcm9sbGFibGUtY29udGFpbmVyJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmIChleHBsaWNpdCAmJiBleHBsaWNpdC5zY3JvbGxIZWlnaHQgPiBleHBsaWNpdC5jbGllbnRIZWlnaHQpIHtcbiAgICAgIHJldHVybiBleHBsaWNpdDtcbiAgICB9XG5cbiAgICBjb25zdCBhbmNob3JTYW1wbGUgPVxuICAgICAgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb2x1bW5baWRdJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsKSB8fFxuICAgICAgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWFuY2hvci10YXJnZXRdJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsKTtcblxuICAgIGlmIChhbmNob3JTYW1wbGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjcm9sbFNweS5nZXRTY3JvbGxQYXJlbnQoYW5jaG9yU2FtcGxlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQgYXMgSFRNTEVsZW1lbnQpIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlVGFnVmlzaWJsZSh0YWdFbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0YWdFbC5jbG9zZXN0PEhUTUxFbGVtZW50PignLnRhZ3Mtcm93Jyk7XG4gICAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgdGFnUmVjdCA9IHRhZ0VsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHBhZGRpbmcgPSAxMjsgLy8ga2VlcCBhIHNtYWxsIHNpZGUgYnJlYXRoaW5nIHJvb21cblxuICAgIGlmICh0YWdSZWN0LmxlZnQgPCBjb250YWluZXJSZWN0LmxlZnQgKyBwYWRkaW5nKSB7XG4gICAgICBjb25zdCBkZWx0YSA9IHRhZ1JlY3QubGVmdCAtIGNvbnRhaW5lclJlY3QubGVmdCAtIHBhZGRpbmc7XG4gICAgICBjb250YWluZXIuc2Nyb2xsQnkoeyBsZWZ0OiBkZWx0YSwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICAgIH0gZWxzZSBpZiAodGFnUmVjdC5yaWdodCA+IGNvbnRhaW5lclJlY3QucmlnaHQgLSBwYWRkaW5nKSB7XG4gICAgICBjb25zdCBkZWx0YSA9IHRhZ1JlY3QucmlnaHQgLSBjb250YWluZXJSZWN0LnJpZ2h0ICsgcGFkZGluZztcbiAgICAgIGNvbnRhaW5lci5zY3JvbGxCeSh7IGxlZnQ6IGRlbHRhLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidGFnXCIgI3RhZ0VsZW1lbnQgKm5nSWY9XCJ1aUNvbXBvbmVudFwiIFtlZG1TZHVpVmlld109XCJ1aUNvbXBvbmVudC5lbGVtZW50XCI+XG4gICAgPHNwYW4gY2xhc3M9XCJ0YWctbmFtZVwiICN0YWdOYW1lRWxlbWVudD57eyB1aUNvbXBvbmVudC5lbGVtZW50Py5sYWJlbCA/PyAnJyB9fTwvc3Bhbj5cbjwvZGl2PlxuIl19
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc2R1aS9zcmMvbGliL2NvbXBvbmVudHMvdWljb21wb25lbnQvdGFnL3RhZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NkdWkvc3JjL2xpYi9jb21wb25lbnRzL3VpY29tcG9uZW50L3RhZy90YWcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBVSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUMzRSxPQUFPLEVBQStCLDBCQUEwQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDM0gsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDOzs7OztBQVEvRSxNQUFNLE9BQU8sWUFBWTtJQUl2QixZQUNnQyxXQUF3QixFQUM5QyxRQUFtQixFQUNuQixzQkFBOEM7UUFGeEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDOUMsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO0lBQ3BELENBQUM7SUFFTCxRQUFRO0lBRVIsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkQsQ0FBQztJQUNILENBQUM7SUFFTyxZQUFZLENBQUMsT0FBa0I7SUFFdkMsQ0FBQztJQUVPLGlCQUFpQixDQUFDLE9BQWtCO1FBQzFDLElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUVELE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRTFFLElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sUUFBUSxHQUFHLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM3RCxNQUFNLFVBQVUsR0FBRywwQkFBMEIsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQ3BCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQ3BDLFdBQVcsRUFDWCxRQUFRLENBQ1QsQ0FBQztZQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzFGLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDeEcsQ0FBQzsrR0FoRFUsWUFBWSxrQkFLYixhQUFhO21HQUxaLFlBQVksNFJDZnpCLGlNQUVNOzs0RkRhTyxZQUFZO2tCQU54QixTQUFTO2lDQUdJLEtBQUssWUFDUCxjQUFjOzswQkFPckIsTUFBTTsyQkFBQyxhQUFhO3NHQUpFLGFBQWE7c0JBQXJDLFNBQVM7dUJBQUMsWUFBWTtnQkFDTSxpQkFBaUI7c0JBQTdDLFNBQVM7dUJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbmplY3QsIE9uSW5pdCwgUmVuZGVyZXIyLCBWaWV3Q2hpbGQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS91aWNvbXBvc2l0aW9uL21vZGVscy91aWNvbXBvbmVudFwiO1xuaW1wb3J0IHsgVUlFbGVtZW50IH0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvdWljb21wb3NpdGlvbi9tb2RlbHMvdWllbGVtZW50XCI7XG5pbXBvcnQgeyBjb2xvck1hcHBpbmcgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS91aXRoZW1lL21hcHBpbmcvY29sb3ItbWFwcGluZ1wiO1xuaW1wb3J0IHsgZ2V0VGV4dFN0eWxlTWFwcGluZ0ZvbnRTaXplLCB0ZXh0U3R5bGVNYXBwaW5nTGluZUhlaWdodCB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3VpdGhlbWUvbWFwcGluZy90ZXh0LXN0eWxlLW1hcHBpbmdcIjtcbmltcG9ydCB7IEZvbnRTaXplTWFwcGluZ1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9mb250LXNpemUtbWFwcGluZy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBVSVNpemUgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS91aXRoZW1lL2VudW1zL3Vpc2l6ZVwiO1xuaW1wb3J0IHsgc2l6ZU1hcHBpbmdIZWlnaHQgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS91aXRoZW1lL21hcHBpbmcvc2l6ZS1tYXBwaW5nXCI7XG5cbkBDb21wb25lbnQoe1xuICBzdHlsZVVybDogJy4vdGFnLmNvbXBvbmVudC5zY3NzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhZy5jb21wb25lbnQuaHRtbCcsXG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxuICBzZWxlY3RvcjogJ2VkbS1zZHVpLXRhZycsXG59KVxuZXhwb3J0IGNsYXNzIFRhZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ3RhZ0VsZW1lbnQnKSB0YWdFbGVtZW50UmVmITogRWxlbWVudFJlZjxIVE1MSW1hZ2VFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgndGFnTmFtZUVsZW1lbnQnKSB0YWdOYW1lRWxlbWVudFJlZiE6IEVsZW1lbnRSZWY8SFRNTEltYWdlRWxlbWVudD47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdCgndWlDb21wb25lbnQnKSBwdWJsaWMgdWlDb21wb25lbnQ6IFVJQ29tcG9uZW50LFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIGZvbnRTaXplTWFwcGluZ1NlcnZpY2U6IEZvbnRTaXplTWFwcGluZ1NlcnZpY2VcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnVpQ29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIHRoaXMuYXBwbHlFbGVtZW50KHRoaXMudWlDb21wb25lbnQuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudWlDb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgdGhpcy5hcHBseUxhYmVsRWxlbWVudCh0aGlzLnVpQ29tcG9uZW50LmVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlFbGVtZW50KGVsZW1lbnQ6IFVJRWxlbWVudCkge1xuXG4gIH1cblxuICBwcml2YXRlIGFwcGx5TGFiZWxFbGVtZW50KGVsZW1lbnQ6IFVJRWxlbWVudCkge1xuICAgIGlmIChlbGVtZW50LnRleHRDb2xvcikge1xuICAgICAgY29uc3QgY29sb3IgPSBjb2xvck1hcHBpbmdbZWxlbWVudC50ZXh0Q29sb3JdO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRhZ05hbWVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdjb2xvcicsIGNvbG9yKTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0U3R5bGVNYXBwaW5nRm9udFNpemUgPSB0aGlzLmZvbnRTaXplTWFwcGluZ1NlcnZpY2UuZ2V0TWFwcGluZygpO1xuXG4gICAgaWYgKGVsZW1lbnQudGV4dFN0eWxlKSB7XG4gICAgICBjb25zdCBmb250U2l6ZSA9IHRleHRTdHlsZU1hcHBpbmdGb250U2l6ZVtlbGVtZW50LnRleHRTdHlsZV07XG4gICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gdGV4dFN0eWxlTWFwcGluZ0xpbmVIZWlnaHRbZWxlbWVudC50ZXh0U3R5bGVdO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgdGhpcy50YWdOYW1lRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAnZm9udC1zaXplJyxcbiAgICAgICAgZm9udFNpemVcbiAgICAgICk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudGFnTmFtZUVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2xpbmUtaGVpZ2h0JywgbGluZUhlaWdodCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRhZ0VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2hlaWdodCcsIHNpemVNYXBwaW5nSGVpZ2h0W1VJU2l6ZS5BU1NFVF84XSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ0YWdcIiAjdGFnRWxlbWVudCAqbmdJZj1cInVpQ29tcG9uZW50XCIgW2VkbVNkdWlWaWV3XT1cInVpQ29tcG9uZW50LmVsZW1lbnRcIj5cbiAgICA8c3BhbiBjbGFzcz1cInRhZy1uYW1lXCIgI3RhZ05hbWVFbGVtZW50Pnt7IHVpQ29tcG9uZW50LmVsZW1lbnQ/LmxhYmVsID8/ICcnIH19PC9zcGFuPlxuPC9kaXY+Il19
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { Component, ElementRef, Inject, Renderer2, ViewChild } from "@angular/core";
|
|
2
|
+
import { colorMapping } from "../../../../core/uitheme/mapping/color-mapping";
|
|
3
|
+
import { textStyleMappingLineHeight } from "../../../../core/uitheme/mapping/text-style-mapping";
|
|
4
|
+
import { FontSizeMappingService } from "../../../../core/services/font-size-mapping.service";
|
|
5
|
+
import { UISize } from "../../../../core/uitheme/enums/uisize";
|
|
6
|
+
import { sizeMappingHeight } from "../../../../core/uitheme/mapping/size-mapping";
|
|
7
|
+
import { ScrollSpyService } from "../../../../core/services/scroll-spy.service";
|
|
8
|
+
import { Subject } from "rxjs";
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "../../../../core/services/font-size-mapping.service";
|
|
11
|
+
import * as i2 from "../../../../core/services/scroll-spy.service";
|
|
12
|
+
import * as i3 from "@angular/common";
|
|
13
|
+
import * as i4 from "../../../../directives/uiview.directive";
|
|
14
|
+
export class TagsRowTagComponent {
|
|
15
|
+
static { this.scrollSpyInitialized = false; }
|
|
16
|
+
static { this.scrollSpy$ = null; }
|
|
17
|
+
static { this.scrollSpySub = null; }
|
|
18
|
+
static { this.scrollSpyInitTries = 0; }
|
|
19
|
+
static { this.scrollSpyContainer = null; }
|
|
20
|
+
static { this.activeId = null; }
|
|
21
|
+
constructor(uiComponent, renderer, fontSizeMappingService, scrollSpy) {
|
|
22
|
+
this.uiComponent = uiComponent;
|
|
23
|
+
this.renderer = renderer;
|
|
24
|
+
this.fontSizeMappingService = fontSizeMappingService;
|
|
25
|
+
this.scrollSpy = scrollSpy;
|
|
26
|
+
this.destroy$ = new Subject();
|
|
27
|
+
}
|
|
28
|
+
ngOnInit() {
|
|
29
|
+
}
|
|
30
|
+
ngAfterViewInit() {
|
|
31
|
+
if (this.uiComponent.element) {
|
|
32
|
+
this.applyElement(this.uiComponent.element);
|
|
33
|
+
this.applyLabelElement(this.uiComponent.element);
|
|
34
|
+
// Map: tag.action.param -> section div id
|
|
35
|
+
const actionParam = this.uiComponent?.element?.action?.param;
|
|
36
|
+
if (actionParam != null && this.tagElementRef?.nativeElement) {
|
|
37
|
+
this.renderer.setAttribute(this.tagElementRef.nativeElement, 'data-tag', String(actionParam));
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
console.warn('[TagComponent] tag without action.param', this.uiComponent?.element);
|
|
41
|
+
}
|
|
42
|
+
// Reaplica seleção se este tag corresponde ao ativo atual.
|
|
43
|
+
this.syncSelectionState();
|
|
44
|
+
// IMPORTANT: TagsRowTagComponent renders once per tag.
|
|
45
|
+
// We initialize the scroll observer only once, but we MUST NOT tie it to the first instance lifecycle,
|
|
46
|
+
// because the first instance may be destroyed (e.g. rerender) and the subscription would die.
|
|
47
|
+
this.initScrollSpyOnce();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
applyElement(element) {
|
|
51
|
+
}
|
|
52
|
+
markSelectedTag(id) {
|
|
53
|
+
const tags = Array.from(document.querySelectorAll('.row-tag'));
|
|
54
|
+
const dataTags = tags.map(t => t.getAttribute('data-tag'));
|
|
55
|
+
console.log('[TagComponent] markSelectedTag', { id, dataTags });
|
|
56
|
+
TagsRowTagComponent.activeId = id;
|
|
57
|
+
for (const t of tags)
|
|
58
|
+
t.classList.remove('row-tag--selected');
|
|
59
|
+
const active = document.querySelector(`.row-tag[data-tag="${CSS.escape(id)}"]`);
|
|
60
|
+
if (!active) {
|
|
61
|
+
console.warn('[TagComponent] active tag not found for id', id);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
active.classList.add('row-tag--selected');
|
|
65
|
+
this.ensureTagVisible(active);
|
|
66
|
+
console.log('[TagComponent] tag--selected applied to', active);
|
|
67
|
+
}
|
|
68
|
+
syncSelectionState() {
|
|
69
|
+
const dataTag = this.tagElementRef?.nativeElement?.getAttribute('data-tag');
|
|
70
|
+
if (!dataTag)
|
|
71
|
+
return;
|
|
72
|
+
if (TagsRowTagComponent.activeId && TagsRowTagComponent.activeId === dataTag) {
|
|
73
|
+
this.tagElementRef.nativeElement.classList.add('row-tag--selected');
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
this.tagElementRef.nativeElement.classList.remove('row-tag--selected');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
applyLabelElement(element) {
|
|
80
|
+
if (element.textColor) {
|
|
81
|
+
const color = colorMapping[element.textColor];
|
|
82
|
+
this.renderer.setStyle(this.tagNameElementRef.nativeElement, 'color', color);
|
|
83
|
+
}
|
|
84
|
+
const textStyleMappingFontSize = this.fontSizeMappingService.getMapping();
|
|
85
|
+
if (element.textStyle) {
|
|
86
|
+
const fontSize = textStyleMappingFontSize[element.textStyle];
|
|
87
|
+
const lineHeight = textStyleMappingLineHeight[element.textStyle];
|
|
88
|
+
this.renderer.setStyle(this.tagNameElementRef.nativeElement, 'font-size', fontSize);
|
|
89
|
+
this.renderer.setStyle(this.tagNameElementRef.nativeElement, 'line-height', lineHeight);
|
|
90
|
+
}
|
|
91
|
+
this.renderer.setStyle(this.tagElementRef.nativeElement, 'height', sizeMappingHeight[UISize.ASSET_8]);
|
|
92
|
+
}
|
|
93
|
+
initScrollSpyOnce() {
|
|
94
|
+
// Already subscribed
|
|
95
|
+
if (TagsRowTagComponent.scrollSpySub) {
|
|
96
|
+
const currentContainer = this.resolveScrollContainer();
|
|
97
|
+
const stale = !TagsRowTagComponent.scrollSpyContainer?.isConnected || (currentContainer && TagsRowTagComponent.scrollSpyContainer !== currentContainer);
|
|
98
|
+
if (!stale)
|
|
99
|
+
return;
|
|
100
|
+
try {
|
|
101
|
+
TagsRowTagComponent.scrollSpySub.unsubscribe();
|
|
102
|
+
}
|
|
103
|
+
catch { }
|
|
104
|
+
TagsRowTagComponent.scrollSpySub = null;
|
|
105
|
+
TagsRowTagComponent.scrollSpy$ = null;
|
|
106
|
+
TagsRowTagComponent.scrollSpyContainer = null;
|
|
107
|
+
TagsRowTagComponent.scrollSpyInitialized = false;
|
|
108
|
+
}
|
|
109
|
+
// Ensure container exists; TagComponent can render before the scroll container is in the DOM.
|
|
110
|
+
const containerExists = !!this.resolveScrollContainer();
|
|
111
|
+
if (!containerExists) {
|
|
112
|
+
TagsRowTagComponent.scrollSpyInitTries++;
|
|
113
|
+
if (TagsRowTagComponent.scrollSpyInitTries <= 30) {
|
|
114
|
+
requestAnimationFrame(() => this.initScrollSpyOnce());
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
console.warn('[TagComponent] ScrollSpy: .scrollable-container not found after retries');
|
|
118
|
+
}
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
TagsRowTagComponent.scrollSpyInitialized = true;
|
|
123
|
+
const currentContainer = this.resolveScrollContainer();
|
|
124
|
+
TagsRowTagComponent.scrollSpy$ = this.scrollSpy.observeActiveId({
|
|
125
|
+
container: currentContainer,
|
|
126
|
+
anchorSelector: '[data-anchor-target], .column[id]',
|
|
127
|
+
getOffsetTop: () => (document.querySelector('.tags-row--can-fix') ? 140 : 180),
|
|
128
|
+
resolveId: (anchor) => {
|
|
129
|
+
const section = anchor.closest('[data-anchor-target]');
|
|
130
|
+
if (section?.id)
|
|
131
|
+
return section.id;
|
|
132
|
+
if (anchor.id)
|
|
133
|
+
return anchor.id;
|
|
134
|
+
return anchor.closest('[id]')?.id || null;
|
|
135
|
+
},
|
|
136
|
+
debug: false,
|
|
137
|
+
});
|
|
138
|
+
TagsRowTagComponent.scrollSpyContainer = currentContainer;
|
|
139
|
+
TagsRowTagComponent.scrollSpySub = TagsRowTagComponent.scrollSpy$.subscribe({
|
|
140
|
+
next: (activeId) => {
|
|
141
|
+
console.log('[TagComponent] ScrollSpy next', activeId);
|
|
142
|
+
if (!activeId)
|
|
143
|
+
return;
|
|
144
|
+
this.markSelectedTag(activeId);
|
|
145
|
+
},
|
|
146
|
+
error: (err) => {
|
|
147
|
+
console.error('[TagComponent] ScrollSpy subscription error', err);
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
catch (e) {
|
|
152
|
+
console.error('[TagComponent] ScrollSpy init failed', e);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
resolveScrollContainer() {
|
|
156
|
+
const explicit = document.querySelector('.scrollable-container');
|
|
157
|
+
if (explicit && explicit.scrollHeight > explicit.clientHeight) {
|
|
158
|
+
return explicit;
|
|
159
|
+
}
|
|
160
|
+
const anchorSample = document.querySelector('.column[id]') ||
|
|
161
|
+
document.querySelector('[data-anchor-target]');
|
|
162
|
+
if (anchorSample) {
|
|
163
|
+
return this.scrollSpy.getScrollParent(anchorSample);
|
|
164
|
+
}
|
|
165
|
+
return document.scrollingElement || document.documentElement;
|
|
166
|
+
}
|
|
167
|
+
ensureTagVisible(tagEl) {
|
|
168
|
+
const container = tagEl.closest('.tags-row');
|
|
169
|
+
if (!container)
|
|
170
|
+
return;
|
|
171
|
+
const containerRect = container.getBoundingClientRect();
|
|
172
|
+
const tagRect = tagEl.getBoundingClientRect();
|
|
173
|
+
const padding = 12; // keep a small side breathing room
|
|
174
|
+
if (tagRect.left < containerRect.left + padding) {
|
|
175
|
+
const delta = tagRect.left - containerRect.left - padding;
|
|
176
|
+
container.scrollBy({ left: delta, behavior: 'smooth' });
|
|
177
|
+
}
|
|
178
|
+
else if (tagRect.right > containerRect.right - padding) {
|
|
179
|
+
const delta = tagRect.right - containerRect.right + padding;
|
|
180
|
+
container.scrollBy({ left: delta, behavior: 'smooth' });
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
ngOnDestroy() {
|
|
184
|
+
this.destroy$.next();
|
|
185
|
+
this.destroy$.complete();
|
|
186
|
+
}
|
|
187
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TagsRowTagComponent, deps: [{ token: 'uiComponent' }, { token: i0.Renderer2 }, { token: i1.FontSizeMappingService }, { token: i2.ScrollSpyService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
188
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: TagsRowTagComponent, isStandalone: false, selector: "edm-sdui-tags-row-tag", viewQueries: [{ propertyName: "tagElementRef", first: true, predicate: ["tagElement"], descendants: true }, { propertyName: "tagNameElementRef", first: true, predicate: ["tagNameElement"], descendants: true }], ngImport: i0, template: "<div class=\"row-tag\" #tagElement *ngIf=\"uiComponent\" [edmSduiView]=\"uiComponent.element\">\n <span class=\"tag-name\" #tagNameElement>{{ uiComponent.element?.label ?? '' }}</span>\n</div>\n", styles: [":host{display:contents}.row-tag{display:inline-flex;align-items:center;gap:8px;padding:16px;border:.85px solid var(--tag-explorer-aux);cursor:pointer;font-size:16px;flex-shrink:0}.row-tag:hover{background-color:var(--bt-tag-explorer-on)}.row-tag--selected{border-color:var(--tag-explorer-highlight);background-color:var(--bt-tag-explorer-on);background-origin:border-box}.tag-name{font-weight:600;color:var(--font-bt-tag-explorer-on);font-size:15px;line-height:17.25px}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.UIViewDirective, selector: "[edmSduiView]", inputs: ["edmSduiView", "disableClick"] }] }); }
|
|
189
|
+
}
|
|
190
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TagsRowTagComponent, decorators: [{
|
|
191
|
+
type: Component,
|
|
192
|
+
args: [{ standalone: false, selector: 'edm-sdui-tags-row-tag', template: "<div class=\"row-tag\" #tagElement *ngIf=\"uiComponent\" [edmSduiView]=\"uiComponent.element\">\n <span class=\"tag-name\" #tagNameElement>{{ uiComponent.element?.label ?? '' }}</span>\n</div>\n", styles: [":host{display:contents}.row-tag{display:inline-flex;align-items:center;gap:8px;padding:16px;border:.85px solid var(--tag-explorer-aux);cursor:pointer;font-size:16px;flex-shrink:0}.row-tag:hover{background-color:var(--bt-tag-explorer-on)}.row-tag--selected{border-color:var(--tag-explorer-highlight);background-color:var(--bt-tag-explorer-on);background-origin:border-box}.tag-name{font-weight:600;color:var(--font-bt-tag-explorer-on);font-size:15px;line-height:17.25px}\n"] }]
|
|
193
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
194
|
+
type: Inject,
|
|
195
|
+
args: ['uiComponent']
|
|
196
|
+
}] }, { type: i0.Renderer2 }, { type: i1.FontSizeMappingService }, { type: i2.ScrollSpyService }], propDecorators: { tagElementRef: [{
|
|
197
|
+
type: ViewChild,
|
|
198
|
+
args: ['tagElement']
|
|
199
|
+
}], tagNameElementRef: [{
|
|
200
|
+
type: ViewChild,
|
|
201
|
+
args: ['tagNameElement']
|
|
202
|
+
}] } });
|
|
203
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc2R1aS9zcmMvbGliL2NvbXBvbmVudHMvdWljb21wb25lbnQvdGFncy1yb3cvdGFnL3RhZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NkdWkvc3JjL2xpYi9jb21wb25lbnRzL3VpY29tcG9uZW50L3RhZ3Mtcm93L3RhZy90YWcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBcUIsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd0SCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDOUUsT0FBTyxFQUErQiwwQkFBMEIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQzlILE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQzdGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNsRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNoRixPQUFPLEVBQWMsT0FBTyxFQUEyQixNQUFNLE1BQU0sQ0FBQzs7Ozs7O0FBUXBFLE1BQU0sT0FBTyxtQkFBbUI7YUFJZix5QkFBb0IsR0FBRyxLQUFLLEFBQVIsQ0FBUzthQUM3QixlQUFVLEdBQXFDLElBQUksQUFBekMsQ0FBMEM7YUFDcEQsaUJBQVksR0FBd0IsSUFBSSxBQUE1QixDQUE2QjthQUN6Qyx1QkFBa0IsR0FBRyxDQUFDLEFBQUosQ0FBSzthQUN2Qix1QkFBa0IsR0FBdUIsSUFBSSxBQUEzQixDQUE0QjthQUM5QyxhQUFRLEdBQWtCLElB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LGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgUmVuZGVyZXIyLCBWaWV3Q2hpbGQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vLi4vLi4vY29yZS91aWNvbXBvc2l0aW9uL21vZGVscy91aWNvbXBvbmVudFwiO1xuaW1wb3J0IHsgVUlFbGVtZW50IH0gZnJvbSBcIi4uLy4uLy4uLy4uL2NvcmUvdWljb21wb3NpdGlvbi9tb2RlbHMvdWllbGVtZW50XCI7XG5pbXBvcnQgeyBjb2xvck1hcHBpbmcgfSBmcm9tIFwiLi4vLi4vLi4vLi4vY29yZS91aXRoZW1lL21hcHBpbmcvY29sb3ItbWFwcGluZ1wiO1xuaW1wb3J0IHsgZ2V0VGV4dFN0eWxlTWFwcGluZ0ZvbnRTaXplLCB0ZXh0U3R5bGVNYXBwaW5nTGluZUhlaWdodCB9IGZyb20gXCIuLi8uLi8uLi8uLi9jb3JlL3VpdGhlbWUvbWFwcGluZy90ZXh0LXN0eWxlLW1hcHBpbmdcIjtcbmltcG9ydCB7IEZvbnRTaXplTWFwcGluZ1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9mb250LXNpemUtbWFwcGluZy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBVSVNpemUgfSBmcm9tIFwiLi4vLi4vLi4vLi4vY29yZS91aXRoZW1lL2VudW1zL3Vpc2l6ZVwiO1xuaW1wb3J0IHsgc2l6ZU1hcHBpbmdIZWlnaHQgfSBmcm9tIFwiLi4vLi4vLi4vLi4vY29yZS91aXRoZW1lL21hcHBpbmcvc2l6ZS1tYXBwaW5nXCI7XG5pbXBvcnQgeyBTY3JvbGxTcHlTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uLy4uL2NvcmUvc2VydmljZXMvc2Nyb2xsLXNweS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzXCI7XG5cbkBDb21wb25lbnQoe1xuICBzdHlsZVVybDogJy4vdGFnLmNvbXBvbmVudC5zY3NzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhZy5jb21wb25lbnQuaHRtbCcsXG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxuICBzZWxlY3RvcjogJ2VkbS1zZHVpLXRhZ3Mtcm93LXRhZycsXG59KVxuZXhwb3J0IGNsYXNzIFRhZ3NSb3dUYWdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoJ3RhZ0VsZW1lbnQnKSB0YWdFbGVtZW50UmVmITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3RhZ05hbWVFbGVtZW50JykgdGFnTmFtZUVsZW1lbnRSZWYhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgc3RhdGljIHNjcm9sbFNweUluaXRpYWxpemVkID0gZmFsc2U7XG4gIHByaXZhdGUgc3RhdGljIHNjcm9sbFNweSQ6IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0aWMgc2Nyb2xsU3B5U3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0aWMgc2Nyb2xsU3B5SW5pdFRyaWVzID0gMDtcbiAgcHJpdmF0ZSBzdGF0aWMgc2Nyb2xsU3B5Q29udGFpbmVyOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN0YXRpYyBhY3RpdmVJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdCgndWlDb21wb25lbnQnKSBwdWJsaWMgdWlDb21wb25lbnQ6IFVJQ29tcG9uZW50LFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIGZvbnRTaXplTWFwcGluZ1NlcnZpY2U6IEZvbnRTaXplTWFwcGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBzY3JvbGxTcHk6IFNjcm9sbFNweVNlcnZpY2VcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnVpQ29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIHRoaXMuYXBwbHlFbGVtZW50KHRoaXMudWlDb21wb25lbnQuZWxlbWVudCk7XG4gICAgICB0aGlzLmFwcGx5TGFiZWxFbGVtZW50KHRoaXMudWlDb21wb25lbnQuZWxlbWVudCk7XG5cbiAgICAgIC8vIE1hcDogdGFnLmFjdGlvbi5wYXJhbSAtPiBzZWN0aW9uIGRpdiBpZFxuICAgICAgY29uc3QgYWN0aW9uUGFyYW0gPSAodGhpcy51aUNvbXBvbmVudD8uZWxlbWVudCBhcyBhbnkpPy5hY3Rpb24/LnBhcmFtO1xuICAgICAgaWYgKGFjdGlvblBhcmFtICE9IG51bGwgJiYgdGhpcy50YWdFbGVtZW50UmVmPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMudGFnRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZGF0YS10YWcnLCBTdHJpbmcoYWN0aW9uUGFyYW0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW1RhZ0NvbXBvbmVudF0gdGFnIHdpdGhvdXQgYWN0aW9uLnBhcmFtJywgdGhpcy51aUNvbXBvbmVudD8uZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlYXBsaWNhIHNlbGXDp8OjbyBzZSBlc3RlIHRhZyBjb3JyZXNwb25kZSBhbyBhdGl2byBhdHVhbC5cbiAgICAgIHRoaXMuc3luY1NlbGVjdGlvblN0YXRlKCk7XG5cbiAgICAgIC8vIElNUE9SVEFOVDogVGFnc1Jvd1RhZ0NvbXBvbmVudCByZW5kZXJzIG9uY2UgcGVyIHRhZy5cbiAgICAgIC8vIFdlIGluaXRpYWxpemUgdGhlIHNjcm9sbCBvYnNlcnZlciBvbmx5IG9uY2UsIGJ1dCB3ZSBNVVNUIE5PVCB0aWUgaXQgdG8gdGhlIGZpcnN0IGluc3RhbmNlIGxpZmVjeWNsZSxcbiAgICAgIC8vIGJlY2F1c2UgdGhlIGZpcnN0IGluc3RhbmNlIG1heSBiZSBkZXN0cm95ZWQgKGUuZy4gcmVyZW5kZXIpIGFuZCB0aGUgc3Vic2NyaXB0aW9uIHdvdWxkIGRpZS5cbiAgICAgIHRoaXMuaW5pdFNjcm9sbFNweU9uY2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5RWxlbWVudChlbGVtZW50OiBVSUVsZW1lbnQpIHtcblxuICB9XG5cbiAgcHJpdmF0ZSBtYXJrU2VsZWN0ZWRUYWcoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHRhZ3MgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcucm93LXRhZycpKTtcbiAgICBjb25zdCBkYXRhVGFncyA9IHRhZ3MubWFwKHQgPT4gdC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGFnJykpO1xuICAgIGNvbnNvbGUubG9nKCdbVGFnQ29tcG9uZW50XSBtYXJrU2VsZWN0ZWRUYWcnLCB7IGlkLCBkYXRhVGFncyB9KTtcbiAgICBUYWdzUm93VGFnQ29tcG9uZW50LmFjdGl2ZUlkID0gaWQ7XG4gICAgZm9yIChjb25zdCB0IG9mIHRhZ3MpIHQuY2xhc3NMaXN0LnJlbW92ZSgncm93LXRhZy0tc2VsZWN0ZWQnKTtcbiAgICBjb25zdCBhY3RpdmUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgLnJvdy10YWdbZGF0YS10YWc9XCIke0NTUy5lc2NhcGUoaWQpfVwiXWApO1xuICAgIGlmICghYWN0aXZlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tUYWdDb21wb25lbnRdIGFjdGl2ZSB0YWcgbm90IGZvdW5kIGZvciBpZCcsIGlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYWN0aXZlLmNsYXNzTGlzdC5hZGQoJ3Jvdy10YWctLXNlbGVjdGVkJyk7XG4gICAgdGhpcy5lbnN1cmVUYWdWaXNpYmxlKGFjdGl2ZSk7XG4gICAgY29uc29sZS5sb2coJ1tUYWdDb21wb25lbnRdIHRhZy0tc2VsZWN0ZWQgYXBwbGllZCB0bycsIGFjdGl2ZSk7XG4gIH1cblxuICBwcml2YXRlIHN5bmNTZWxlY3Rpb25TdGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhVGFnID0gdGhpcy50YWdFbGVtZW50UmVmPy5uYXRpdmVFbGVtZW50Py5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGFnJyk7XG4gICAgaWYgKCFkYXRhVGFnKSByZXR1cm47XG4gICAgaWYgKFRhZ3NSb3dUYWdDb21wb25lbnQuYWN0aXZlSWQgJiYgVGFnc1Jvd1RhZ0NvbXBvbmVudC5hY3RpdmVJZCA9PT0gZGF0YVRhZykge1xuICAgICAgdGhpcy50YWdFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncm93LXRhZy0tc2VsZWN0ZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50YWdFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgncm93LXRhZy0tc2VsZWN0ZWQnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5TGFiZWxFbGVtZW50KGVsZW1lbnQ6IFVJRWxlbWVudCkge1xuICAgIGlmIChlbGVtZW50LnRleHRDb2xvcikge1xuICAgICAgY29uc3QgY29sb3IgPSBjb2xvck1hcHBpbmdbZWxlbWVudC50ZXh0Q29sb3JdO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRhZ05hbWVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdjb2xvcicsIGNvbG9yKTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0U3R5bGVNYXBwaW5nRm9udFNpemUgPSB0aGlzLmZvbnRTaXplTWFwcGluZ1NlcnZpY2UuZ2V0TWFwcGluZygpO1xuXG4gICAgaWYgKGVsZW1lbnQudGV4dFN0eWxlKSB7XG4gICAgICBjb25zdCBmb250U2l6ZSA9IHRleHRTdHlsZU1hcHBpbmdGb250U2l6ZVtlbGVtZW50LnRleHRTdHlsZV07XG4gICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gdGV4dFN0eWxlTWFwcGluZ0xpbmVIZWlnaHRbZWxlbWVudC50ZXh0U3R5bGVdO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgdGhpcy50YWdOYW1lRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAnZm9udC1zaXplJyxcbiAgICAgICAgZm9udFNpemVcbiAgICAgICk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudGFnTmFtZUVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2xpbmUtaGVpZ2h0JywgbGluZUhlaWdodCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRhZ0VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2hlaWdodCcsIHNpemVNYXBwaW5nSGVpZ2h0W1VJU2l6ZS5BU1NFVF84XSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRTY3JvbGxTcHlPbmNlKCk6IHZvaWQge1xuICAgIC8vIEFscmVhZHkgc3Vic2NyaWJlZFxuICAgIGlmIChUYWdzUm93VGFnQ29tcG9uZW50LnNjcm9sbFNweVN1Yikge1xuICAgICAgY29uc3QgY3VycmVudENvbnRhaW5lciA9IHRoaXMucmVzb2x2ZVNjcm9sbENvbnRhaW5lcigpO1xuICAgICAgY29uc3Qgc3RhbGUgPSAhVGFnc1Jvd1RhZ0NvbXBvbmVudC5zY3JvbGxTcHlDb250YWluZXI/LmlzQ29ubmVjdGVkIHx8IChjdXJyZW50Q29udGFpbmVyICYmIFRhZ3NSb3dUYWdDb21wb25lbnQuc2Nyb2xsU3B5Q29udGFpbmVyICE9PSBjdXJyZW50Q29udGFpbmVyKTtcbiAgICAgIGlmICghc3RhbGUpIHJldHVybjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgVGFnc1Jvd1RhZ0NvbXBvbmVudC5zY3JvbGxTcHlTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIH0gY2F0Y2gge31cbiAgICAgIFRhZ3NSb3dUYWdDb21wb25lbnQuc2Nyb2xsU3B5U3ViID0gbnVsbDtcbiAgICAgIFRhZ3NSb3dUYWdDb21wb25lbnQuc2Nyb2xsU3B5JCA9IG51bGw7XG4gICAgICBUYWdzUm93VGFnQ29tcG9uZW50LnNjcm9sbFNweUNvbnRhaW5lciA9IG51bGw7XG4gICAgICBUYWdzUm93VGFnQ29tcG9uZW50LnNjcm9sbFNweUluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIGNvbnRhaW5lciBleGlzdHM7IFRhZ0NvbXBvbmVudCBjYW4gcmVuZGVyIGJlZm9yZSB0aGUgc2Nyb2xsIGNvbnRhaW5lciBpcyBpbiB0aGUgRE9NLlxuICAgIGNvbnN0IGNvbnRhaW5lckV4aXN0cyA9ICEhdGhpcy5yZXNvbHZlU2Nyb2xsQ29udGFpbmVyKCk7XG4gICAgaWYgKCFjb250YWluZXJFeGlzdHMpIHtcbiAgICAgIFRhZ3NSb3dUYWdDb21wb25lbnQuc2Nyb2xsU3B5SW5pdFRyaWVzKys7XG4gICAgICBpZiAoVGFnc1Jvd1RhZ0NvbXBvbmVudC5zY3JvbGxTcHlJbml0VHJpZXMgPD0gMzApIHtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuaW5pdFNjcm9sbFNweU9uY2UoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tUYWdDb21wb25lbnRdIFNjcm9sbFNweTogLnNjcm9sbGFibGUtY29udGFpbmVyIG5vdCBmb3VuZCBhZnRlciByZXRyaWVzJyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIFRhZ3NSb3dUYWdDb21wb25lbnQuc2Nyb2xsU3B5SW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICBjb25zdCBjdXJyZW50Q29udGFpbmVyID0gdGhpcy5yZXNvbHZlU2Nyb2xsQ29udGFpbmVyKCkhO1xuXG4gICAgICBUYWdzUm93VGFnQ29tcG9uZW50LnNjcm9sbFNweSQgPSB0aGlzLnNjcm9sbFNweS5vYnNlcnZlQWN0aXZlSWQoe1xuICAgICAgICBjb250YWluZXI6IGN1cnJlbnRDb250YWluZXIhLFxuICAgICAgICBhbmNob3JTZWxlY3RvcjogJ1tkYXRhLWFuY2hvci10YXJnZXRdLCAuY29sdW1uW2lkXScsXG4gICAgICAgIGdldE9mZnNldFRvcDogKCkgPT4gKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50YWdzLXJvdy0tY2FuLWZpeCcpID8gMTQwIDogMTgwKSxcbiAgICAgICAgcmVzb2x2ZUlkOiAoYW5jaG9yKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2VjdGlvbiA9IGFuY2hvci5jbG9zZXN0PEhUTUxFbGVtZW50PignW2RhdGEtYW5jaG9yLXRhcmdldF0nKTtcbiAgICAgICAgICBpZiAoc2VjdGlvbj8uaWQpIHJldHVybiBzZWN0aW9uLmlkO1xuICAgICAgICAgIGlmIChhbmNob3IuaWQpIHJldHVybiBhbmNob3IuaWQ7XG4gICAgICAgICAgcmV0dXJuIGFuY2hvci5jbG9zZXN0PEhUTUxFbGVtZW50PignW2lkXScpPy5pZCB8fCBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgVGFnc1Jvd1RhZ0NvbXBvbmVudC5zY3JvbGxTcHlDb250YWluZXIgPSBjdXJyZW50Q29udGFpbmVyITtcblxuICAgICAgVGFnc1Jvd1RhZ0NvbXBvbmVudC5zY3JvbGxTcHlTdWIgPSBUYWdzUm93VGFnQ29tcG9uZW50LnNjcm9sbFNweSQuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGFjdGl2ZUlkKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1tUYWdDb21wb25lbnRdIFNjcm9sbFNweSBuZXh0JywgYWN0aXZlSWQpO1xuICAgICAgICAgIGlmICghYWN0aXZlSWQpIHJldHVybjtcbiAgICAgICAgICB0aGlzLm1hcmtTZWxlY3RlZFRhZyhhY3RpdmVJZCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignW1RhZ0NvbXBvbmVudF0gU2Nyb2xsU3B5IHN1YnNjcmlwdGlvbiBlcnJvcicsIGVycik7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbVGFnQ29tcG9uZW50XSBTY3JvbGxTcHkgaW5pdCBmYWlsZWQnLCBlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVTY3JvbGxDb250YWluZXIoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBjb25zdCBleHBsaWNpdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zY3JvbGxhYmxlLWNvbnRhaW5lcicpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoZXhwbGljaXQgJiYgZXhwbGljaXQuc2Nyb2xsSGVpZ2h0ID4gZXhwbGljaXQuY2xpZW50SGVpZ2h0KSB7XG4gICAgICByZXR1cm4gZXhwbGljaXQ7XG4gICAgfVxuXG4gICAgY29uc3QgYW5jaG9yU2FtcGxlID1cbiAgICAgIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29sdW1uW2lkXScpIGFzIEhUTUxFbGVtZW50IHwgbnVsbCkgfHxcbiAgICAgIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1hbmNob3ItdGFyZ2V0XScpIGFzIEhUTUxFbGVtZW50IHwgbnVsbCk7XG5cbiAgICBpZiAoYW5jaG9yU2FtcGxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY3JvbGxTcHkuZ2V0U2Nyb2xsUGFyZW50KGFuY2hvclNhbXBsZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50IGFzIEhUTUxFbGVtZW50KSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVRhZ1Zpc2libGUodGFnRWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGFnRWwuY2xvc2VzdDxIVE1MRWxlbWVudD4oJy50YWdzLXJvdycpO1xuICAgIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgICBjb25zdCBjb250YWluZXJSZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHRhZ1JlY3QgPSB0YWdFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBwYWRkaW5nID0gMTI7IC8vIGtlZXAgYSBzbWFsbCBzaWRlIGJyZWF0aGluZyByb29tXG5cbiAgICBpZiAodGFnUmVjdC5sZWZ0IDwgY29udGFpbmVyUmVjdC5sZWZ0ICsgcGFkZGluZykge1xuICAgICAgY29uc3QgZGVsdGEgPSB0YWdSZWN0LmxlZnQgLSBjb250YWluZXJSZWN0LmxlZnQgLSBwYWRkaW5nO1xuICAgICAgY29udGFpbmVyLnNjcm9sbEJ5KHsgbGVmdDogZGVsdGEsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICB9IGVsc2UgaWYgKHRhZ1JlY3QucmlnaHQgPiBjb250YWluZXJSZWN0LnJpZ2h0IC0gcGFkZGluZykge1xuICAgICAgY29uc3QgZGVsdGEgPSB0YWdSZWN0LnJpZ2h0IC0gY29udGFpbmVyUmVjdC5yaWdodCArIHBhZGRpbmc7XG4gICAgICBjb250YWluZXIuc2Nyb2xsQnkoeyBsZWZ0OiBkZWx0YSwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInJvdy10YWdcIiAjdGFnRWxlbWVudCAqbmdJZj1cInVpQ29tcG9uZW50XCIgW2VkbVNkdWlWaWV3XT1cInVpQ29tcG9uZW50LmVsZW1lbnRcIj5cbiAgICA8c3BhbiBjbGFzcz1cInRhZy1uYW1lXCIgI3RhZ05hbWVFbGVtZW50Pnt7IHVpQ29tcG9uZW50LmVsZW1lbnQ/LmxhYmVsID8/ICcnIH19PC9zcGFuPlxuPC9kaXY+XG4iXX0=
|