ngx-edu-sharing-ui 10.0.20 → 10.0.22
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/assets/scss/material-theme.scss +3 -3
- package/assets/scss/mixins.scss +1 -1
- package/assets/scss/variables-root.scss +2 -0
- package/assets/scss/variables-scss.scss +3 -4
- package/assets/scss/variables.scss +1 -1
- package/fesm2022/ngx-edu-sharing-ui.mjs +376 -319
- package/fesm2022/ngx-edu-sharing-ui.mjs.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/list-items/list-widget.d.ts +1 -1
- package/lib/mds-viewer/mds-editor-instance-service.abstract.d.ts +14 -0
- package/lib/mds-viewer/widget/mds-widget.component.d.ts +6 -4
- package/package.json +8 -9
- package/esm2022/lib/actionbar/actionbar.component.mjs +0 -206
- package/esm2022/lib/common/edu-sharing-ui-common.module.mjs +0 -170
- package/esm2022/lib/directives/border-box-observer.directive.mjs +0 -71
- package/esm2022/lib/directives/check-text-overflow.directive.mjs +0 -71
- package/esm2022/lib/directives/drag-nodes/drag-nodes.mjs +0 -14
- package/esm2022/lib/directives/drag-nodes/nodes-drag-source.directive.mjs +0 -79
- package/esm2022/lib/directives/drag-nodes/nodes-drag.directive.mjs +0 -49
- package/esm2022/lib/directives/drag-nodes/nodes-drop-target.directive.mjs +0 -105
- package/esm2022/lib/directives/focus-state.directive.mjs +0 -44
- package/esm2022/lib/directives/icon.directive.mjs +0 -184
- package/esm2022/lib/directives/infinite-scroll.directive.mjs +0 -85
- package/esm2022/lib/dropdown/dropdown.component.mjs +0 -83
- package/esm2022/lib/edu-sharing-ui-configuration.mjs +0 -48
- package/esm2022/lib/edu-sharing-ui.module.mjs +0 -82
- package/esm2022/lib/index.mjs +0 -96
- package/esm2022/lib/list-items/available-widgets.mjs +0 -27
- package/esm2022/lib/list-items/format-duration.pipe.mjs +0 -20
- package/esm2022/lib/list-items/list-base/list-base.component.mjs +0 -46
- package/esm2022/lib/list-items/list-collection-info/list-collection-info.component.mjs +0 -29
- package/esm2022/lib/list-items/list-counts/list-counts.component.mjs +0 -56
- package/esm2022/lib/list-items/list-items.module.mjs +0 -50
- package/esm2022/lib/list-items/list-node-license/list-node-license.component.mjs +0 -41
- package/esm2022/lib/list-items/list-node-replication-source/list-node-replication-source.component.mjs +0 -47
- package/esm2022/lib/list-items/list-node-workflow/list-node-workflow.component.mjs +0 -24
- package/esm2022/lib/list-items/list-text/list-text.component.mjs +0 -106
- package/esm2022/lib/list-items/list-widget.mjs +0 -49
- package/esm2022/lib/list-items/node-row/node-row.component.mjs +0 -24
- package/esm2022/lib/list-items/node-source.pipe.mjs +0 -49
- package/esm2022/lib/mds/mds-helper.service.mjs +0 -167
- package/esm2022/lib/mds/mds.module.mjs +0 -16
- package/esm2022/lib/mds-viewer/mds-viewer.component.mjs +0 -170
- package/esm2022/lib/mds-viewer/mds-viewer.service.mjs +0 -18
- package/esm2022/lib/mds-viewer/replace-element-with-div.mjs +0 -47
- package/esm2022/lib/mds-viewer/view-instance.service.mjs +0 -27
- package/esm2022/lib/mds-viewer/widget/mds-widget.component.mjs +0 -379
- package/esm2022/lib/node-entries/combined-data-source.mjs +0 -41
- package/esm2022/lib/node-entries/custom-templates-data-source.mjs +0 -7
- package/esm2022/lib/node-entries/drag-preview/drag-preview.component.mjs +0 -21
- package/esm2022/lib/node-entries/entries-model.mjs +0 -24
- package/esm2022/lib/node-entries/items-cap.mjs +0 -47
- package/esm2022/lib/node-entries/list-item-label.pipe.mjs +0 -37
- package/esm2022/lib/node-entries/node-cache.mjs +0 -73
- package/esm2022/lib/node-entries/node-data-source-remote.mjs +0 -4
- package/esm2022/lib/node-entries/node-data-source.mjs +0 -117
- package/esm2022/lib/node-entries/node-entries-card/node-entries-card.component.mjs +0 -117
- package/esm2022/lib/node-entries/node-entries-card-grid/node-entries-card-grid.component.mjs +0 -329
- package/esm2022/lib/node-entries/node-entries-card-small/node-entries-card-small.component.mjs +0 -44
- package/esm2022/lib/node-entries/node-entries-global-options/node-entries-global-options.component.mjs +0 -27
- package/esm2022/lib/node-entries/node-entries-global.service.mjs +0 -71
- package/esm2022/lib/node-entries/node-entries-table/column-chooser/column-chooser.component.mjs +0 -42
- package/esm2022/lib/node-entries/node-entries-table/node-entries-table.component.mjs +0 -294
- package/esm2022/lib/node-entries/node-entries-templates.service.mjs +0 -11
- package/esm2022/lib/node-entries/node-entries-wrapper.component.mjs +0 -369
- package/esm2022/lib/node-entries/node-entries.component.mjs +0 -132
- package/esm2022/lib/node-entries/node-entries.module.mjs +0 -161
- package/esm2022/lib/node-entries/node-rating/node-rating.component.mjs +0 -125
- package/esm2022/lib/node-entries/node-stats-badges/node-stats-badges.component.mjs +0 -48
- package/esm2022/lib/node-entries/node-type-badge/node-type-badge.component.mjs +0 -36
- package/esm2022/lib/node-entries/option-button/option-button.component.mjs +0 -75
- package/esm2022/lib/node-entries/preview-image/preview-image.component.mjs +0 -53
- package/esm2022/lib/node-entries/sort-select-panel/sort-select-panel.component.mjs +0 -41
- package/esm2022/lib/node-url/node-url.component.mjs +0 -132
- package/esm2022/lib/pipes/file-size.pipe.mjs +0 -32
- package/esm2022/lib/pipes/format-date.pipe.mjs +0 -38
- package/esm2022/lib/pipes/mds-duration.pipe.mjs +0 -25
- package/esm2022/lib/pipes/node-icon.pipe.mjs +0 -18
- package/esm2022/lib/pipes/node-image-size.pipe.mjs +0 -24
- package/esm2022/lib/pipes/node-image.pipe.mjs +0 -55
- package/esm2022/lib/pipes/node-license.pipe.mjs +0 -24
- package/esm2022/lib/pipes/node-person-name.pipe.mjs +0 -50
- package/esm2022/lib/pipes/node-title.pipe.mjs +0 -35
- package/esm2022/lib/pipes/option-tooltip.pipe.mjs +0 -33
- package/esm2022/lib/pipes/property-slug.pipe.mjs +0 -16
- package/esm2022/lib/pipes/replace-chars.pipe.mjs +0 -29
- package/esm2022/lib/pipes/vcard-name.pipe.mjs +0 -25
- package/esm2022/lib/services/abstract/app.service.mjs +0 -3
- package/esm2022/lib/services/abstract/keyboard-shortcuts.service.mjs +0 -10
- package/esm2022/lib/services/abstract/options-helper.service.mjs +0 -3
- package/esm2022/lib/services/abstract/toast.service.mjs +0 -3
- package/esm2022/lib/services/accessibility.service.mjs +0 -73
- package/esm2022/lib/services/app-container.service.mjs +0 -69
- package/esm2022/lib/services/local-events.service.mjs +0 -43
- package/esm2022/lib/services/node-entries.service.mjs +0 -201
- package/esm2022/lib/services/node-helper.service.mjs +0 -330
- package/esm2022/lib/services/nodes-drag-drop.service.mjs +0 -155
- package/esm2022/lib/services/options-helper-data.service.mjs +0 -142
- package/esm2022/lib/services/render-helper.service.mjs +0 -114
- package/esm2022/lib/services/repo-url.service.mjs +0 -50
- package/esm2022/lib/services/search-helper.service.mjs +0 -52
- package/esm2022/lib/services/temporary-storage.service.mjs +0 -48
- package/esm2022/lib/services/ui.service.mjs +0 -327
- package/esm2022/lib/sort-dropdown/sort-dropdown.component.mjs +0 -50
- package/esm2022/lib/spinner/spinner.component.mjs +0 -19
- package/esm2022/lib/spinner-small/spinner-small.component.mjs +0 -18
- package/esm2022/lib/translations/fallback-translation-handler.mjs +0 -6
- package/esm2022/lib/translations/translation-loader.mjs +0 -219
- package/esm2022/lib/translations/translation-source.mjs +0 -11
- package/esm2022/lib/translations/translations.module.mjs +0 -82
- package/esm2022/lib/translations/translations.service.mjs +0 -238
- package/esm2022/lib/types/accessibillity.mjs +0 -19
- package/esm2022/lib/types/api-models.mjs +0 -2
- package/esm2022/lib/types/drag-drop.mjs +0 -2
- package/esm2022/lib/types/injection-tokens.mjs +0 -31
- package/esm2022/lib/types/keyboard-shortcuts.mjs +0 -11
- package/esm2022/lib/types/list-item.mjs +0 -41
- package/esm2022/lib/types/option-item.mjs +0 -192
- package/esm2022/lib/types/workflow.mjs +0 -25
- package/esm2022/lib/util/DateHelper.mjs +0 -200
- package/esm2022/lib/util/VCard.mjs +0 -278
- package/esm2022/lib/util/color-helper.mjs +0 -124
- package/esm2022/lib/util/duration-helper.mjs +0 -102
- package/esm2022/lib/util/functions.mjs +0 -13
- package/esm2022/lib/util/helper.mjs +0 -64
- package/esm2022/lib/util/isNumeric.mjs +0 -11
- package/esm2022/lib/util/rest-helper.mjs +0 -42
- package/esm2022/lib/util/ui-animation.mjs +0 -146
- package/esm2022/lib/util/ui-constants.mjs +0 -21
- package/esm2022/ngx-edu-sharing-ui.mjs +0 -5
- package/esm2022/public-api.mjs +0 -2
|
@@ -1,379 +0,0 @@
|
|
|
1
|
-
import { DatePipe } from '@angular/common';
|
|
2
|
-
import { ChangeDetectionStrategy, Component, computed, Input, signal, ViewChild, } from '@angular/core';
|
|
3
|
-
import { MatRipple } from '@angular/material/core';
|
|
4
|
-
import { filter, first, map } from 'rxjs/operators';
|
|
5
|
-
import { RestConstants } from 'ngx-edu-sharing-api';
|
|
6
|
-
import { UIConstants } from '../../util/ui-constants';
|
|
7
|
-
import { DateHelper } from '../../util/DateHelper';
|
|
8
|
-
import { RestHelper } from '../../util/rest-helper';
|
|
9
|
-
import { FormatSizePipe } from '../../pipes/file-size.pipe';
|
|
10
|
-
import { BehaviorSubject, of } from 'rxjs';
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
import * as i1 from "@ngx-translate/core";
|
|
13
|
-
import * as i2 from "../../services/ui.service";
|
|
14
|
-
import * as i3 from "../view-instance.service";
|
|
15
|
-
import * as i4 from "../mds-viewer.service";
|
|
16
|
-
import * as i5 from "../../services/node-helper.service";
|
|
17
|
-
import * as i6 from "@angular/common";
|
|
18
|
-
import * as i7 from "@angular/material/core";
|
|
19
|
-
import * as i8 from "@angular/router";
|
|
20
|
-
import * as i9 from "../../directives/icon.directive";
|
|
21
|
-
import * as i10 from "../../pipes/mds-duration.pipe";
|
|
22
|
-
import * as i11 from "../../pipes/vcard-name.pipe";
|
|
23
|
-
export var MdsType;
|
|
24
|
-
(function (MdsType) {
|
|
25
|
-
MdsType["Io"] = "io";
|
|
26
|
-
MdsType["IoBulk"] = "io_bulk";
|
|
27
|
-
MdsType["Map"] = "map";
|
|
28
|
-
MdsType["MapRef"] = "map_ref";
|
|
29
|
-
MdsType["IoChildObject"] = "io_childobject";
|
|
30
|
-
MdsType["Collection"] = "collection";
|
|
31
|
-
MdsType["ToolDefinition"] = "tool_definition";
|
|
32
|
-
MdsType["ToolInstance"] = "tool_instance";
|
|
33
|
-
MdsType["SavedSearch"] = "saved_search";
|
|
34
|
-
})(MdsType || (MdsType = {}));
|
|
35
|
-
export var MdsWidgetType;
|
|
36
|
-
(function (MdsWidgetType) {
|
|
37
|
-
MdsWidgetType["Text"] = "text";
|
|
38
|
-
MdsWidgetType["Number"] = "number";
|
|
39
|
-
MdsWidgetType["Email"] = "email";
|
|
40
|
-
MdsWidgetType["Date"] = "date";
|
|
41
|
-
MdsWidgetType["Month"] = "month";
|
|
42
|
-
MdsWidgetType["Color"] = "color";
|
|
43
|
-
MdsWidgetType["Textarea"] = "textarea";
|
|
44
|
-
MdsWidgetType["TinyMCE"] = "tinyMCE";
|
|
45
|
-
MdsWidgetType["VCard"] = "vcard";
|
|
46
|
-
MdsWidgetType["Checkbox"] = "checkbox";
|
|
47
|
-
MdsWidgetType["RadioHorizontal"] = "radioHorizontal";
|
|
48
|
-
MdsWidgetType["RadioVertical"] = "radioVertical";
|
|
49
|
-
MdsWidgetType["CheckboxHorizontal"] = "checkboxHorizontal";
|
|
50
|
-
MdsWidgetType["CheckboxVertical"] = "checkboxVertical";
|
|
51
|
-
MdsWidgetType["MultiValueBadges"] = "multivalueBadges";
|
|
52
|
-
MdsWidgetType["MultiValueFixedBadges"] = "multivalueFixedBadges";
|
|
53
|
-
MdsWidgetType["MultiValueSuggestBadges"] = "multivalueSuggestBadges";
|
|
54
|
-
MdsWidgetType["MultiValueAuthorityBadges"] = "multivalueAuthorityBadges";
|
|
55
|
-
MdsWidgetType["Singleoption"] = "singleoption";
|
|
56
|
-
MdsWidgetType["Slider"] = "slider";
|
|
57
|
-
MdsWidgetType["Range"] = "range";
|
|
58
|
-
MdsWidgetType["Duration"] = "duration";
|
|
59
|
-
MdsWidgetType["SingleValueTree"] = "singlevalueTree";
|
|
60
|
-
MdsWidgetType["SingleValueSuggestBadges"] = "singlevalueSuggestBadges";
|
|
61
|
-
MdsWidgetType["MultiValueTree"] = "multivalueTree";
|
|
62
|
-
MdsWidgetType["DefaultValue"] = "defaultvalue";
|
|
63
|
-
MdsWidgetType["FacetList"] = "facetList";
|
|
64
|
-
})(MdsWidgetType || (MdsWidgetType = {}));
|
|
65
|
-
export var ValueType;
|
|
66
|
-
(function (ValueType) {
|
|
67
|
-
ValueType[ValueType["String"] = 0] = "String";
|
|
68
|
-
ValueType[ValueType["MultiValue"] = 1] = "MultiValue";
|
|
69
|
-
ValueType[ValueType["Range"] = 2] = "Range";
|
|
70
|
-
})(ValueType || (ValueType = {}));
|
|
71
|
-
export class MdsWidgetComponent {
|
|
72
|
-
static { this.inlineEditing = [
|
|
73
|
-
MdsWidgetType.Text,
|
|
74
|
-
MdsWidgetType.Number,
|
|
75
|
-
MdsWidgetType.Date,
|
|
76
|
-
MdsWidgetType.Email,
|
|
77
|
-
MdsWidgetType.Textarea,
|
|
78
|
-
MdsWidgetType.Singleoption,
|
|
79
|
-
MdsWidgetType.SingleValueTree,
|
|
80
|
-
MdsWidgetType.SingleValueSuggestBadges,
|
|
81
|
-
MdsWidgetType.MultiValueBadges,
|
|
82
|
-
MdsWidgetType.MultiValueFixedBadges,
|
|
83
|
-
MdsWidgetType.MultiValueSuggestBadges,
|
|
84
|
-
MdsWidgetType.MultiValueTree,
|
|
85
|
-
]; }
|
|
86
|
-
get headingLevel() {
|
|
87
|
-
return this.viewInstance.headingLevel;
|
|
88
|
-
}
|
|
89
|
-
constructor(
|
|
90
|
-
// public mdsEditorInstance: MdsEditorInstanceService,
|
|
91
|
-
translate, ui, viewInstance, mdsViewerService, nodeHelper) {
|
|
92
|
-
this.translate = translate;
|
|
93
|
-
this.ui = ui;
|
|
94
|
-
this.viewInstance = viewInstance;
|
|
95
|
-
this.mdsViewerService = mdsViewerService;
|
|
96
|
-
this.nodeHelper = nodeHelper;
|
|
97
|
-
this.ROUTER_PREFIX = UIConstants.ROUTER_PREFIX;
|
|
98
|
-
this.valueType = ValueType.String;
|
|
99
|
-
this.showCaption = true;
|
|
100
|
-
/**
|
|
101
|
-
* allow inline editing
|
|
102
|
-
*/
|
|
103
|
-
this.inlineEditing = 'auto';
|
|
104
|
-
this.basicType = signal(null);
|
|
105
|
-
this.isEmpty = computed(() => {
|
|
106
|
-
if (this.basicType() === 'license') {
|
|
107
|
-
return false;
|
|
108
|
-
}
|
|
109
|
-
return this.value()?.every((v) => !v) || this.value()?.length === 0 || !this.value();
|
|
110
|
-
});
|
|
111
|
-
this.license$ = new BehaviorSubject(null);
|
|
112
|
-
this.value = signal(undefined);
|
|
113
|
-
this.temporaryValue = undefined;
|
|
114
|
-
// super(toast, null, translate);
|
|
115
|
-
}
|
|
116
|
-
async ngOnChanges(changes) {
|
|
117
|
-
this.value.set(await this.getNodeValue());
|
|
118
|
-
}
|
|
119
|
-
async ngOnInit() {
|
|
120
|
-
this.value.set(await this.getNodeValue());
|
|
121
|
-
this.widget
|
|
122
|
-
.getInitialDisplayValues()
|
|
123
|
-
.pipe(filter((v) => !!v))
|
|
124
|
-
.subscribe(async (value) => {
|
|
125
|
-
this.value.set(value.values.map((v) => v.displayString));
|
|
126
|
-
});
|
|
127
|
-
this.basicType.set(this.getBasicType());
|
|
128
|
-
this.rawValue = await this.getRawValue().toPromise();
|
|
129
|
-
}
|
|
130
|
-
getDefinition() {
|
|
131
|
-
return this.widget?.definition || this.definition;
|
|
132
|
-
}
|
|
133
|
-
getBasicType() {
|
|
134
|
-
switch (this.getDefinition().id) {
|
|
135
|
-
case 'license':
|
|
136
|
-
return 'license';
|
|
137
|
-
}
|
|
138
|
-
switch (this.getDefinition().type) {
|
|
139
|
-
case 'text':
|
|
140
|
-
case 'email':
|
|
141
|
-
case 'month':
|
|
142
|
-
case 'color':
|
|
143
|
-
case 'textarea':
|
|
144
|
-
case 'singleoption':
|
|
145
|
-
return 'text';
|
|
146
|
-
case 'number':
|
|
147
|
-
return 'number';
|
|
148
|
-
case 'date':
|
|
149
|
-
return 'date';
|
|
150
|
-
case 'vcard':
|
|
151
|
-
return 'vcard';
|
|
152
|
-
case 'multivalueFixedBadges':
|
|
153
|
-
case 'multivalueSuggestBadges':
|
|
154
|
-
case 'singlevalueSuggestBadges':
|
|
155
|
-
case 'multivalueBadges':
|
|
156
|
-
case 'singlevalueTree':
|
|
157
|
-
case 'multivalueTree':
|
|
158
|
-
return this.viewInstance.treeDisplay === 'flat' ? 'array' : 'tree';
|
|
159
|
-
case 'slider':
|
|
160
|
-
return 'slider';
|
|
161
|
-
case 'duration':
|
|
162
|
-
return 'duration';
|
|
163
|
-
case 'range':
|
|
164
|
-
return 'range';
|
|
165
|
-
}
|
|
166
|
-
return 'unknown';
|
|
167
|
-
}
|
|
168
|
-
supportsInlineEditing() {
|
|
169
|
-
return MdsWidgetComponent.inlineEditing.includes(this.widget?.definition.type);
|
|
170
|
-
}
|
|
171
|
-
getNodeValues() {
|
|
172
|
-
if (this.mdsEditorInstance) {
|
|
173
|
-
return (this.mdsEditorInstance.values$.value ||
|
|
174
|
-
this.mdsEditorInstance.nodes$.value.map((n) => n.properties));
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
return this.mdsViewerService.values$.value;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
async getNodeValue() {
|
|
181
|
-
if (this.temporaryValue !== undefined) {
|
|
182
|
-
return this.getValue(this.temporaryValue);
|
|
183
|
-
}
|
|
184
|
-
const id = this.getDefinition().id;
|
|
185
|
-
const values = this.getNodeValues();
|
|
186
|
-
if (this.getBasicType() === 'license') {
|
|
187
|
-
this.license$.next({
|
|
188
|
-
icon: await this.nodeHelper.getLicenseIcon({
|
|
189
|
-
properties: this.getNodeValues(),
|
|
190
|
-
}),
|
|
191
|
-
name: this.nodeHelper.getLicenseName({ properties: this.getNodeValues() }),
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
if (this.getDefinition().type === 'range') {
|
|
195
|
-
if (values) {
|
|
196
|
-
return [values[id + '_from']?.[0], values[id + '_to']?.[0]];
|
|
197
|
-
}
|
|
198
|
-
return null;
|
|
199
|
-
}
|
|
200
|
-
else if (values?.[id]) {
|
|
201
|
-
// support on the fly changes+updates of the values
|
|
202
|
-
return this.getValue(values[id]);
|
|
203
|
-
}
|
|
204
|
-
else if ((await this.widget.getInitalValuesAsync())?.jointValues) {
|
|
205
|
-
return (await this.widget.getInitalValuesAsync()).jointValues;
|
|
206
|
-
}
|
|
207
|
-
else {
|
|
208
|
-
return null;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
getValue(data) {
|
|
212
|
-
let value = data;
|
|
213
|
-
if (!value || value.every((v) => !v)) {
|
|
214
|
-
return null;
|
|
215
|
-
}
|
|
216
|
-
if (this.getDefinition().values) {
|
|
217
|
-
const mapping = this.widget.definition.values
|
|
218
|
-
.filter((v) => data.filter((d) => d === v.id).length > 0)
|
|
219
|
-
.map((v) => v.caption);
|
|
220
|
-
if (mapping) {
|
|
221
|
-
return mapping;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
return data;
|
|
225
|
-
}
|
|
226
|
-
click() {
|
|
227
|
-
if (this.getDefinition().link === '_BLANK') {
|
|
228
|
-
window.open(this.formatText()[0]);
|
|
229
|
-
}
|
|
230
|
-
else if (this.getDefinition().link === '_SELF') {
|
|
231
|
-
window.location.href = this.formatText()[0];
|
|
232
|
-
}
|
|
233
|
-
else {
|
|
234
|
-
console.warn('Unsupported link type ' + this.getDefinition().link);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
formatDate() {
|
|
238
|
-
return this.value().map((v) => {
|
|
239
|
-
if (this.getDefinition().format) {
|
|
240
|
-
try {
|
|
241
|
-
return new DatePipe('en').transform(v, this.getDefinition().format);
|
|
242
|
-
}
|
|
243
|
-
catch (e) {
|
|
244
|
-
console.warn('Could not format date', e, this.getDefinition());
|
|
245
|
-
return DateHelper.formatDate(this.translate, v, {
|
|
246
|
-
showAlwaysTime: true,
|
|
247
|
-
});
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
else {
|
|
251
|
-
return DateHelper.formatDate(this.translate, v, {
|
|
252
|
-
showAlwaysTime: true,
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
formatNumber() {
|
|
258
|
-
return this.value().map((v) => {
|
|
259
|
-
if (this.widget.definition.format === 'bytes') {
|
|
260
|
-
return new FormatSizePipe(this.translate).transform(v);
|
|
261
|
-
}
|
|
262
|
-
return v;
|
|
263
|
-
});
|
|
264
|
-
}
|
|
265
|
-
formatText() {
|
|
266
|
-
return this.value().map((v) => {
|
|
267
|
-
if (this.widget.definition.format) {
|
|
268
|
-
return this.widget.definition.format.replace('${value}', v);
|
|
269
|
-
}
|
|
270
|
-
return v;
|
|
271
|
-
});
|
|
272
|
-
}
|
|
273
|
-
// instance: MdsEditorWidgetBase
|
|
274
|
-
async finishEdit(instance, store = false) {
|
|
275
|
-
if (store) {
|
|
276
|
-
await this.mdsEditorInstance.saveWidgetValue(instance.widget);
|
|
277
|
-
}
|
|
278
|
-
this.temporaryValue = instance.widget.getValue();
|
|
279
|
-
this.value.set(await this.getNodeValue());
|
|
280
|
-
this.editWrapper.nativeElement.children[0].innerHTML = null;
|
|
281
|
-
await this.mdsEditorInstance.fetchDisplayValues(this.widget);
|
|
282
|
-
}
|
|
283
|
-
isEditable() {
|
|
284
|
-
if (!this.mdsEditorInstance) {
|
|
285
|
-
return false;
|
|
286
|
-
}
|
|
287
|
-
if (this.inlineEditing === 'always') {
|
|
288
|
-
return this.supportsInlineEditing();
|
|
289
|
-
}
|
|
290
|
-
const nodes = this.mdsEditorInstance.nodes$.value;
|
|
291
|
-
return (this.mdsEditorInstance.editorMode === 'inline' &&
|
|
292
|
-
this.widget.definition.interactionType === 'Input' &&
|
|
293
|
-
nodes?.length === 1 &&
|
|
294
|
-
RestHelper.hasAccessPermission(nodes[0], RestConstants.ACCESS_WRITE) &&
|
|
295
|
-
this.supportsInlineEditing());
|
|
296
|
-
}
|
|
297
|
-
async focus() {
|
|
298
|
-
// this.matRipple.launch({});
|
|
299
|
-
await this.ui.scrollSmoothElementToChild(this.editWrapper.nativeElement);
|
|
300
|
-
this.matRipple.launch({});
|
|
301
|
-
//const result = await this.view.injectEditField(this, this.editWrapper.nativeElement.children[0]);
|
|
302
|
-
//await this.ui.scrollSmoothElementToChild(result.htmlElement);
|
|
303
|
-
}
|
|
304
|
-
/**
|
|
305
|
-
* return the path for a given value in a tree
|
|
306
|
-
*/
|
|
307
|
-
getPath(v) {
|
|
308
|
-
if (!this.getDefinition().values) {
|
|
309
|
-
return [
|
|
310
|
-
{
|
|
311
|
-
id: v,
|
|
312
|
-
caption: v,
|
|
313
|
-
},
|
|
314
|
-
];
|
|
315
|
-
}
|
|
316
|
-
const path = [];
|
|
317
|
-
let pointer = v;
|
|
318
|
-
for (let i = 0; i < 100; i++) {
|
|
319
|
-
const mapped = this.getDefinition().values.find((w) => w.id === pointer);
|
|
320
|
-
if (mapped) {
|
|
321
|
-
path.push(mapped);
|
|
322
|
-
pointer = mapped.parent;
|
|
323
|
-
}
|
|
324
|
-
else {
|
|
325
|
-
break;
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
return path.reverse();
|
|
329
|
-
}
|
|
330
|
-
/**
|
|
331
|
-
* fetch the raw node value
|
|
332
|
-
* Note: Will not work in a bulk state!
|
|
333
|
-
*/
|
|
334
|
-
getRawValue() {
|
|
335
|
-
return (this.mdsEditorInstance?.nodes$.pipe(first(), map((v) => v?.[0]?.properties[this.widget.definition.id]?.map((id) => {
|
|
336
|
-
return {
|
|
337
|
-
id,
|
|
338
|
-
path: this.getPath(id),
|
|
339
|
-
};
|
|
340
|
-
}))) || of(null));
|
|
341
|
-
}
|
|
342
|
-
getSearchParams(key) {
|
|
343
|
-
const params = {};
|
|
344
|
-
const mds = {};
|
|
345
|
-
mds[this.widget.definition.id] = [key.id];
|
|
346
|
-
params.mds = this.mdsEditorInstance.mdsId;
|
|
347
|
-
params.sidenav = true;
|
|
348
|
-
params.repo = this.mdsEditorInstance.nodes$.value?.[0].ref.repo;
|
|
349
|
-
params.filters = JSON.stringify(mds);
|
|
350
|
-
return params;
|
|
351
|
-
}
|
|
352
|
-
startEdit(event) {
|
|
353
|
-
event.stopPropagation();
|
|
354
|
-
void this.view.injectEditField(this, this.editWrapper.nativeElement.children[0]);
|
|
355
|
-
}
|
|
356
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: MdsWidgetComponent, deps: [{ token: i1.TranslateService }, { token: i2.UIService }, { token: i3.ViewInstanceService }, { token: i4.MdsViewerService }, { token: i5.NodeHelperService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
357
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: MdsWidgetComponent, selector: "es-mds-widget", inputs: { widget: "widget", showCaption: "showCaption", inlineEditing: "inlineEditing", definition: "definition", view: "view" }, viewQueries: [{ propertyName: "editWrapper", first: true, predicate: ["editWrapper"], descendants: true }, { propertyName: "matRipple", first: true, predicate: MatRipple, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<es-mds-editor-widget-container\n *ngIf=\"!editWrapper.innerText.trim()\"\n [injectedView]=\"this\"\n [widget]=\"widget\"\n [label]=\"false\"\n [wrapInFormField]=\"false\"\n [wrapInGroup]=\"false\"\n [valueType]=\"valueType\"\n matRipple\n [matRippleDisabled]=\"true\"\n>\n <div class=\"edit-wrapper\">\n <div\n *ngIf=\"!isEmpty() || !widget.definition.hideIfEmpty || isEditable()\"\n class=\"widget-wrapper\"\n >\n <div\n class=\"widget-label\"\n [attr.role]=\"headingLevel ? 'heading' : null\"\n [attr.aria-level]=\"headingLevel\"\n *ngIf=\"widget.definition.caption && showCaption\"\n >\n {{ widget.definition.caption\n }}<span *ngIf=\"!headingLevel\" class=\"cdk-visually-hidden\">: </span>\n </div>\n <div\n class=\"value-wrapper\"\n [class.value-wrapper-edit]=\"isEditable()\"\n (click)=\"isEditable() ? startEdit($event) : null\"\n >\n <div *ngIf=\"isEmpty()\" class=\"widget-data widget-no-data widget-type-{{ basicType() }}\">\n -\n </div>\n <div\n *ngIf=\"!isEmpty()\"\n class=\"widget-data widget-type-{{ basicType() }} {{\n widget.definition.link ? 'widget-link' : ''\n }}\"\n (click)=\"click()\"\n >\n <div *ngIf=\"basicType() === 'text'\">{{ formatText() }}</div>\n <div *ngIf=\"basicType() === 'number'\">{{ formatNumber() }}</div>\n <div *ngIf=\"basicType() === 'date'\">{{ formatDate() }}</div>\n <div *ngIf=\"basicType() === 'license' && (license$ | async) as license\">\n <img alt=\"\" [src]=\"license.icon\" /> {{ license.name }}\n </div>\n <div *ngIf=\"basicType() === 'array'\">\n <div class=\"array-entry\" *ngFor=\"let v of value()\">{{ v }}</div>\n </div>\n <div *ngIf=\"basicType() === 'tree'\">\n <div class=\"tree-entry\" *ngFor=\"let v of rawValue\">\n <ng-container *ngTemplateOutlet=\"treeEntry; context: { path: v.path }\"></ng-container>\n </div>\n </div>\n <div *ngIf=\"basicType() === 'vcard'\">\n <div class=\"array-entry\" *ngFor=\"let v of value()\">{{ v | vcardName }}</div>\n </div>\n <div *ngIf=\"basicType() === 'slider'\">\n <span class=\"slider-value\">{{ value }}</span\n ><span> / </span><span class=\"slider-max\">{{ widget.definition.max }}</span>\n </div>\n <div *ngIf=\"basicType() === 'duration'\">\n <span class=\"duration-value\">{{ value()[0] | appMdsDuration }}</span>\n </div>\n <div *ngIf=\"basicType() === 'range'\">\n <span class=\"slider-value\">{{ value()[0] }}</span\n >-<span class=\"slider-value\">{{ value()[1] }}</span>\n </div>\n <div *ngIf=\"basicType() === 'unknown'\">\n The widget type {{ widget.definition.type }} is currently not supported via angular\n rendering\n </div>\n </div>\n </div>\n </div>\n <!--<button mat-icon-button\n *ngIf=\"mdsEditorInstance.editorMode === 'inline' && widget.definition.interactionType === 'Input'\"\n (click)=\"view.injectEditField(this, edit)\"\n class=\"btn-edit\">\n <i esIcon=\"edit\"></i>\n </button>-->\n </div>\n</es-mds-editor-widget-container>\n<div class=\"edit-wrapper\">\n <div #editWrapper><div #edit></div></div>\n <!--<button *ngIf=\"!!editWrapper.innerText.trim()\" mat-icon-button><i esIcon=\"save\"></i></button>-->\n</div>\n<ng-template #treeEntry let-path=\"path\">\n <ng-container *ngFor=\"let t of path; let first = first\">\n <ng-container *ngIf=\"!first\">\n <span class=\"cdk-visually-hidden\">{{ 'SUB_CATEGORY_ARIA' | translate }}</span>\n <i esIcon=\"keyboard_arrow_right\" [aria]=\"false\"></i>\n </ng-container>\n <a\n [routerLink]=\"'/' + ROUTER_PREFIX + 'search'\"\n [queryParams]=\"getSearchParams(t)\"\n *ngIf=\"widget.definition.isSearchable\"\n >{{ t.caption }}</a\n >\n <span *ngIf=\"!widget.definition.isSearchable\">{{ t.caption }}</span>\n </ng-container>\n</ng-template>\n", styles: [".widget-label{font-size:90%;opacity:.8}.edit-wrapper{display:flex;align-items:center;transition:var(--transitionNormal) all}.edit-wrapper>div:first-child{flex-grow:1}.edit-wrapper>button{margin-left:10px}.edit-wrapper .widget-wrapper{padding:2px 5px}.edit-wrapper .value-wrapper-edit:hover{outline:1px solid #ccc;cursor:text}.widget-data{padding:4px 0 10px;word-break:break-word}.widget-data.widget-type-slider{opacity:.8}.widget-data.widget-type-slider .slider-value{opacity:.9;font-weight:700}.widget-data.widget-type-array .array-entry,.widget-data.widget-type-vcard .array-entry{display:inline}.widget-data.widget-type-array .array-entry:not(:last-child):after,.widget-data.widget-type-vcard .array-entry:not(:last-child):after{content:\", \";padding-right:.3em;display:inline;align-items:flex-end}.widget-data.widget-type-tree>div{display:flex;flex-wrap:wrap;gap:10px}.widget-data.widget-type-tree .tree-entry{display:inline-block;border-radius:5px;padding:5px 10px;background-color:#f9f9f9}.widget-data.widget-type-tree .tree-entry>a{color:var(--palette-primary-800);text-decoration:none}.widget-data.widget-type-tree .tree-entry>*{vertical-align:middle}.widget-data.widget-type-tree .tree-entry>i{font-size:18px}.widget-data.widget-link{text-decoration:underline;cursor:pointer}.widget-type-text>div{white-space:pre-line}:host ::ng-deep .edit-wrapper .widget-container mat-form-field{margin-top:.5em}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i7.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "directive", type: i8.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i9.IconDirective, selector: "i[esIcon], i.material-icons", inputs: ["altText", "aria", "esIcon"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: i10.MdsDurationPipe, name: "appMdsDuration" }, { kind: "pipe", type: i11.VCardNamePipe, name: "vcardName" }], changeDetection: i0.ChangeDetectionStrategy.Default }); }
|
|
358
|
-
}
|
|
359
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: MdsWidgetComponent, decorators: [{
|
|
360
|
-
type: Component,
|
|
361
|
-
args: [{ selector: 'es-mds-widget', changeDetection: ChangeDetectionStrategy.Default, template: "<es-mds-editor-widget-container\n *ngIf=\"!editWrapper.innerText.trim()\"\n [injectedView]=\"this\"\n [widget]=\"widget\"\n [label]=\"false\"\n [wrapInFormField]=\"false\"\n [wrapInGroup]=\"false\"\n [valueType]=\"valueType\"\n matRipple\n [matRippleDisabled]=\"true\"\n>\n <div class=\"edit-wrapper\">\n <div\n *ngIf=\"!isEmpty() || !widget.definition.hideIfEmpty || isEditable()\"\n class=\"widget-wrapper\"\n >\n <div\n class=\"widget-label\"\n [attr.role]=\"headingLevel ? 'heading' : null\"\n [attr.aria-level]=\"headingLevel\"\n *ngIf=\"widget.definition.caption && showCaption\"\n >\n {{ widget.definition.caption\n }}<span *ngIf=\"!headingLevel\" class=\"cdk-visually-hidden\">: </span>\n </div>\n <div\n class=\"value-wrapper\"\n [class.value-wrapper-edit]=\"isEditable()\"\n (click)=\"isEditable() ? startEdit($event) : null\"\n >\n <div *ngIf=\"isEmpty()\" class=\"widget-data widget-no-data widget-type-{{ basicType() }}\">\n -\n </div>\n <div\n *ngIf=\"!isEmpty()\"\n class=\"widget-data widget-type-{{ basicType() }} {{\n widget.definition.link ? 'widget-link' : ''\n }}\"\n (click)=\"click()\"\n >\n <div *ngIf=\"basicType() === 'text'\">{{ formatText() }}</div>\n <div *ngIf=\"basicType() === 'number'\">{{ formatNumber() }}</div>\n <div *ngIf=\"basicType() === 'date'\">{{ formatDate() }}</div>\n <div *ngIf=\"basicType() === 'license' && (license$ | async) as license\">\n <img alt=\"\" [src]=\"license.icon\" /> {{ license.name }}\n </div>\n <div *ngIf=\"basicType() === 'array'\">\n <div class=\"array-entry\" *ngFor=\"let v of value()\">{{ v }}</div>\n </div>\n <div *ngIf=\"basicType() === 'tree'\">\n <div class=\"tree-entry\" *ngFor=\"let v of rawValue\">\n <ng-container *ngTemplateOutlet=\"treeEntry; context: { path: v.path }\"></ng-container>\n </div>\n </div>\n <div *ngIf=\"basicType() === 'vcard'\">\n <div class=\"array-entry\" *ngFor=\"let v of value()\">{{ v | vcardName }}</div>\n </div>\n <div *ngIf=\"basicType() === 'slider'\">\n <span class=\"slider-value\">{{ value }}</span\n ><span> / </span><span class=\"slider-max\">{{ widget.definition.max }}</span>\n </div>\n <div *ngIf=\"basicType() === 'duration'\">\n <span class=\"duration-value\">{{ value()[0] | appMdsDuration }}</span>\n </div>\n <div *ngIf=\"basicType() === 'range'\">\n <span class=\"slider-value\">{{ value()[0] }}</span\n >-<span class=\"slider-value\">{{ value()[1] }}</span>\n </div>\n <div *ngIf=\"basicType() === 'unknown'\">\n The widget type {{ widget.definition.type }} is currently not supported via angular\n rendering\n </div>\n </div>\n </div>\n </div>\n <!--<button mat-icon-button\n *ngIf=\"mdsEditorInstance.editorMode === 'inline' && widget.definition.interactionType === 'Input'\"\n (click)=\"view.injectEditField(this, edit)\"\n class=\"btn-edit\">\n <i esIcon=\"edit\"></i>\n </button>-->\n </div>\n</es-mds-editor-widget-container>\n<div class=\"edit-wrapper\">\n <div #editWrapper><div #edit></div></div>\n <!--<button *ngIf=\"!!editWrapper.innerText.trim()\" mat-icon-button><i esIcon=\"save\"></i></button>-->\n</div>\n<ng-template #treeEntry let-path=\"path\">\n <ng-container *ngFor=\"let t of path; let first = first\">\n <ng-container *ngIf=\"!first\">\n <span class=\"cdk-visually-hidden\">{{ 'SUB_CATEGORY_ARIA' | translate }}</span>\n <i esIcon=\"keyboard_arrow_right\" [aria]=\"false\"></i>\n </ng-container>\n <a\n [routerLink]=\"'/' + ROUTER_PREFIX + 'search'\"\n [queryParams]=\"getSearchParams(t)\"\n *ngIf=\"widget.definition.isSearchable\"\n >{{ t.caption }}</a\n >\n <span *ngIf=\"!widget.definition.isSearchable\">{{ t.caption }}</span>\n </ng-container>\n</ng-template>\n", styles: [".widget-label{font-size:90%;opacity:.8}.edit-wrapper{display:flex;align-items:center;transition:var(--transitionNormal) all}.edit-wrapper>div:first-child{flex-grow:1}.edit-wrapper>button{margin-left:10px}.edit-wrapper .widget-wrapper{padding:2px 5px}.edit-wrapper .value-wrapper-edit:hover{outline:1px solid #ccc;cursor:text}.widget-data{padding:4px 0 10px;word-break:break-word}.widget-data.widget-type-slider{opacity:.8}.widget-data.widget-type-slider .slider-value{opacity:.9;font-weight:700}.widget-data.widget-type-array .array-entry,.widget-data.widget-type-vcard .array-entry{display:inline}.widget-data.widget-type-array .array-entry:not(:last-child):after,.widget-data.widget-type-vcard .array-entry:not(:last-child):after{content:\", \";padding-right:.3em;display:inline;align-items:flex-end}.widget-data.widget-type-tree>div{display:flex;flex-wrap:wrap;gap:10px}.widget-data.widget-type-tree .tree-entry{display:inline-block;border-radius:5px;padding:5px 10px;background-color:#f9f9f9}.widget-data.widget-type-tree .tree-entry>a{color:var(--palette-primary-800);text-decoration:none}.widget-data.widget-type-tree .tree-entry>*{vertical-align:middle}.widget-data.widget-type-tree .tree-entry>i{font-size:18px}.widget-data.widget-link{text-decoration:underline;cursor:pointer}.widget-type-text>div{white-space:pre-line}:host ::ng-deep .edit-wrapper .widget-container mat-form-field{margin-top:.5em}\n"] }]
|
|
362
|
-
}], ctorParameters: () => [{ type: i1.TranslateService }, { type: i2.UIService }, { type: i3.ViewInstanceService }, { type: i4.MdsViewerService }, { type: i5.NodeHelperService }], propDecorators: { widget: [{
|
|
363
|
-
type: Input
|
|
364
|
-
}], showCaption: [{
|
|
365
|
-
type: Input
|
|
366
|
-
}], inlineEditing: [{
|
|
367
|
-
type: Input
|
|
368
|
-
}], definition: [{
|
|
369
|
-
type: Input
|
|
370
|
-
}], view: [{
|
|
371
|
-
type: Input
|
|
372
|
-
}], editWrapper: [{
|
|
373
|
-
type: ViewChild,
|
|
374
|
-
args: ['editWrapper']
|
|
375
|
-
}], matRipple: [{
|
|
376
|
-
type: ViewChild,
|
|
377
|
-
args: [MatRipple]
|
|
378
|
-
}] } });
|
|
379
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWRzLXdpZGdldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lZHUtc2hhcmluZy11aS9zcmMvbGliL21kcy12aWV3ZXIvd2lkZ2V0L21kcy13aWRnZXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWR1LXNoYXJpbmctdWkvc3JjL2xpYi9tZHMtdmlld2VyL3dpZGdldC9tZHMtd2lkZ2V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBRVIsS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBNkIsYUFBYSxFQUFjLE1BQU0scUJBQXFCLENBQUM7QUFDM0YsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUduRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7O0FBSzNDLE1BQU0sQ0FBTixJQUFZLE9BVVg7QUFWRCxXQUFZLE9BQU87SUFDZixvQkFBUyxDQUFBO0lBQ1QsNkJBQWtCLENBQUE7SUFDbEIsc0JBQVcsQ0FBQTtJ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QUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQWlCO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRixDQUFDOytHQWxVUSxrQkFBa0I7bUdBQWxCLGtCQUFrQiwrVEErQmhCLFNBQVMscUVDcEl4QixvcElBc0dBOzs0RkREYSxrQkFBa0I7a0JBUDlCLFNBQVM7K0JBQ0ksZUFBZSxtQkFHUix1QkFBdUIsQ0FBQyxPQUFPOzhNQXVCdkMsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBSUcsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFb0IsV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhO2dCQUNGLFNBQVM7c0JBQTlCLFNBQVM7dUJBQUMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIGNvbXB1dGVkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uSW5pdCxcbiAgICBzaWduYWwsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgTWF0UmlwcGxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBmaWx0ZXIsIGZpcnN0LCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBNZHNWYWx1ZSwgTWRzV2lkZ2V0LCBOb2RlLCBSZXN0Q29uc3RhbnRzLCBTdWdnZXN0aW9uIH0gZnJvbSAnbmd4LWVkdS1zaGFyaW5nLWFwaSc7XG5pbXBvcnQgeyBVSUNvbnN0YW50cyB9IGZyb20gJy4uLy4uL3V0aWwvdWktY29uc3RhbnRzJztcbmltcG9ydCB7IERhdGVIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsL0RhdGVIZWxwZXInO1xuaW1wb3J0IHsgVUlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdWkuc2VydmljZSc7XG5pbXBvcnQgeyBWaWV3SW5zdGFuY2VTZXJ2aWNlIH0gZnJvbSAnLi4vdmlldy1pbnN0YW5jZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlc3RIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsL3Jlc3QtaGVscGVyJztcbmltcG9ydCB7IEZvcm1hdFNpemVQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvZmlsZS1zaXplLnBpcGUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTWRzVmlld2VyU2VydmljZSB9IGZyb20gJy4uL21kcy12aWV3ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBWYWx1ZXMgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zZWFyY2gtaGVscGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm9kZUhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub2RlLWhlbHBlci5zZXJ2aWNlJztcblxuZXhwb3J0IGVudW0gTWRzVHlwZSB7XG4gICAgSW8gPSAnaW8nLFxuICAgIElvQnVsayA9ICdpb19idWxrJyxcbiAgICBNYXAgPSAnbWFwJyxcbiAgICBNYXBSZWYgPSAnbWFwX3JlZicsXG4gICAgSW9DaGlsZE9iamVjdCA9ICdpb19jaGlsZG9iamVjdCcsXG4gICAgQ29sbGVjdGlvbiA9ICdjb2xsZWN0aW9uJyxcbiAgICBUb29sRGVmaW5pdGlvbiA9ICd0b29sX2RlZmluaXRpb24nLFxuICAgIFRvb2xJbnN0YW5jZSA9ICd0b29sX2luc3RhbmNlJyxcbiAgICBTYXZlZFNlYXJjaCA9ICdzYXZlZF9zZWFyY2gnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1kc1ZhbHVlTGlzdCB7XG4gICAgdmFsdWVzOiBTdWdnZXN0aW9uW107XG59XG5leHBvcnQgaW50ZXJmYWNlIE1kc1ZpZXdlcldpZGdldCB7XG4gICAgZGVmaW5pdGlvbjogTWRzV2lkZ2V0O1xuICAgIGdldEluaXRhbFZhbHVlc0FzeW5jKCk6IFByb21pc2U8SW5pdGlhbFZhbHVlcz47XG4gICAgZ2V0SW5pdGlhbERpc3BsYXlWYWx1ZXMoKTogQmVoYXZpb3JTdWJqZWN0PE1kc1ZhbHVlTGlzdD47XG59XG5leHBvcnQgZW51bSBNZHNXaWRnZXRUeXBlIHtcbiAgICBUZXh0ID0gJ3RleHQnLFxuICAgIE51bWJlciA9ICdudW1iZXInLFxuICAgIEVtYWlsID0gJ2VtYWlsJyxcbiAgICBEYXRlID0gJ2RhdGUnLFxuICAgIE1vbnRoID0gJ21vbnRoJyxcbiAgICBDb2xvciA9ICdjb2xvcicsXG4gICAgVGV4dGFyZWEgPSAndGV4dGFyZWEnLFxuICAgIFRpbnlNQ0UgPSAndGlueU1DRScsXG4gICAgVkNhcmQgPSAndmNhcmQnLFxuICAgIENoZWNrYm94ID0gJ2NoZWNrYm94JyxcbiAgICBSYWRpb0hvcml6b250YWwgPSAncmFkaW9Ib3Jpem9udGFsJyxcbiAgICBSYWRpb1ZlcnRpY2FsID0gJ3JhZGlvVmVydGljYWwnLFxuICAgIENoZWNrYm94SG9yaXpvbnRhbCA9ICdjaGVja2JveEhvcml6b250YWwnLFxuICAgIENoZWNrYm94VmVydGljYWwgPSAnY2hlY2tib3hWZXJ0aWNhbCcsXG4gICAgTXVsdGlWYWx1ZUJhZGdlcyA9ICdtdWx0aXZhbHVlQmFkZ2VzJyxcbiAgICBNdWx0aVZhbHVlRml4ZWRCYWRnZXMgPSAnbXVsdGl2YWx1ZUZpeGVkQmFkZ2VzJyxcbiAgICBNdWx0aVZhbHVlU3VnZ2VzdEJhZGdlcyA9ICdtdWx0aXZhbHVlU3VnZ2VzdEJhZGdlcycsXG4gICAgTXVsdGlWYWx1ZUF1dGhvcml0eUJhZGdlcyA9ICdtdWx0aXZhbHVlQXV0aG9yaXR5QmFkZ2VzJyxcbiAgICBTaW5nbGVvcHRpb24gPSAnc2luZ2xlb3B0aW9uJyxcbiAgICBTbGlkZXIgPSAnc2xpZGVyJyxcbiAgICBSYW5nZSA9ICdyYW5nZScsXG4gICAgRHVyYXRpb24gPSAnZHVyYXRpb24nLFxuICAgIFNpbmdsZVZhbHVlVHJlZSA9ICdzaW5nbGV2YWx1ZVRyZWUnLFxuICAgIFNpbmdsZVZhbHVlU3VnZ2VzdEJhZGdlcyA9ICdzaW5nbGV2YWx1ZVN1Z2dlc3RCYWRnZXMnLFxuICAgIE11bHRpVmFsdWVUcmVlID0gJ211bHRpdmFsdWVUcmVlJyxcbiAgICBEZWZhdWx0VmFsdWUgPSAnZGVmYXVsdHZhbHVlJyxcbiAgICBGYWNldExpc3QgPSAnZmFjZXRMaXN0Jyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbml0aWFsVmFsdWVzIHtcbiAgICAvKiogVmFsdWVzIHRoYXQgYXJlIGluaXRpYWxseSBwcmVzZW50IGluIGFsbCBub2Rlcy4gKi9cbiAgICByZWFkb25seSBqb2ludFZhbHVlczogc3RyaW5nW107XG4gICAgLyoqXG4gICAgICogVmFsdWVzIHRoYXQgYXJlIGluaXRpYWxseSBwcmVzZW50IGluIHNvbWUgYnV0IG5vdCBhbGwgbm9kZXMuXG4gICAgICpcbiAgICAgKiBDYW4gYmUgbnVsbCBidXQgd2lsbCBuZXZlciBiZSBzZXQgdG8gYW4gZW1wdHkgYXJyYXkuXG4gICAgICovXG4gICAgcmVhZG9ubHkgaW5kaXZpZHVhbFZhbHVlcz86IHN0cmluZ1tdO1xufVxuZXhwb3J0IGVudW0gVmFsdWVUeXBlIHtcbiAgICBTdHJpbmcsXG4gICAgTXVsdGlWYWx1ZSxcbiAgICBSYW5nZSxcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdlcy1tZHMtd2lkZ2V0JyxcbiAgICB0ZW1wbGF0ZVVybDogJ21kcy13aWRnZXQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWydtZHMtd2lkZ2V0LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0LFxuICAgIC8vIHJlcXVpcmVkIGZvciBleHRlcm5hbCBlZGl0b3IgaW5qZWN0aW9uXG59KVxuZXhwb3J0IGNsYXNzIE1kc1dpZGdldENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgICByZWFkb25seSBST1VURVJfUFJFRklYID0gVUlDb25zdGFudHMuUk9VVEVSX1BSRUZJWDtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBpbmxpbmVFZGl0aW5nOiBNZHNXaWRnZXRUeXBlW10gPSBbXG4gICAgICAgIE1kc1dpZGdldFR5cGUuVGV4dCxcbiAgICAgICAgTWRzV2lkZ2V0VHlwZS5OdW1iZXIsXG4gICAgICAgIE1kc1dpZGdldFR5cGUuRGF0ZSxcbiAgICAgICAgTWRzV2lkZ2V0VHlwZS5FbWFpbCxcbiAgICAgICAgTWRzV2lkZ2V0VHlwZS5UZXh0YXJlYSxcbiAgICAgICAgTWRzV2lkZ2V0VHlwZS5TaW5nbGVvcHRpb24sXG4gICAgICAgIE1kc1dpZGdldFR5cGUuU2luZ2xlVmFsdWVUcmVlLFxuICAgICAgICBNZHNXaWRnZXRUeXBlLlNpbmdsZVZhbHVlU3VnZ2VzdEJhZGdlcyxcbiAgICAgICAgTWRzV2lkZ2V0VHlwZS5NdWx0aVZhbHVlQmFkZ2VzLFxuICAgICAgICBNZHNXaWRnZXRUeXBlLk11bHRpVmFsdWVGaXhlZEJhZGdlcyxcbiAgICAgICAgTWRzV2lkZ2V0VHlwZS5NdWx0aVZhbHVlU3VnZ2VzdEJhZGdlcyxcbiAgICAgICAgTWRzV2lkZ2V0VHlwZS5NdWx0aVZhbHVlVHJlZSxcbiAgICBdO1xuXG4gICAgcmVhZG9ubHkgdmFsdWVUeXBlID0gVmFsdWVUeXBlLlN0cmluZztcblxuICAgIC8vIHVzZSBhbnkgaW5zdGVhZCBvZiBgV2lkZ2V0YCBjYXVzZSBvZiBleHRlcm5hbCB0eXBlXG4gICAgQElucHV0KCkgd2lkZ2V0OiBNZHNWaWV3ZXJXaWRnZXQ7XG4gICAgQElucHV0KCkgc2hvd0NhcHRpb24gPSB0cnVlO1xuICAgIC8qKlxuICAgICAqIGFsbG93IGlubGluZSBlZGl0aW5nXG4gICAgICovXG4gICAgQElucHV0KCkgaW5saW5lRWRpdGluZzogJ2F1dG8nIHwgJ2Fsd2F5cycgPSAnYXV0byc7XG4gICAgQElucHV0KCkgZGVmaW5pdGlvbjogTWRzV2lkZ2V0O1xuICAgIC8vIHVzZSBhbnkgaW5zdGVhZCBvZiBNZHNFZGl0b3JWaWV3Q29tcG9uZW50IGNhdXNlIG9mIGV4dGVybmFsIHR5cGVcbiAgICBASW5wdXQoKSB2aWV3OiBhbnk7XG5cbiAgICBAVmlld0NoaWxkKCdlZGl0V3JhcHBlcicpIGVkaXRXcmFwcGVyOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoTWF0UmlwcGxlKSBtYXRSaXBwbGU6IE1hdFJpcHBsZTtcbiAgICBiYXNpY1R5cGUgPSBzaWduYWw8c3RyaW5nPihudWxsKTtcbiAgICByYXdWYWx1ZTogeyBwYXRoOiBNZHNWYWx1ZVtdOyBpZDogc3RyaW5nIH1bXTtcblxuICAgIGlzRW1wdHkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmJhc2ljVHlwZSgpID09PSAnbGljZW5zZScpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSgpPy5ldmVyeSgodikgPT4gIXYpIHx8IHRoaXMudmFsdWUoKT8ubGVuZ3RoID09PSAwIHx8ICF0aGlzLnZhbHVlKCk7XG4gICAgfSk7XG4gICAgcHJpdmF0ZSBtZHNFZGl0b3JJbnN0YW5jZTogYW55O1xuICAgIGxpY2Vuc2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IG5hbWU6IHN0cmluZzsgaWNvbjogc3RyaW5nIH0+KG51bGwpO1xuXG4gICAgZ2V0IGhlYWRpbmdMZXZlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0luc3RhbmNlLmhlYWRpbmdMZXZlbDtcbiAgICB9XG5cbiAgICB2YWx1ZSA9IHNpZ25hbDxzdHJpbmdbXT4odW5kZWZpbmVkKTtcbiAgICBwcml2YXRlIHRlbXBvcmFyeVZhbHVlOiBzdHJpbmdbXSA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICAvLyBwdWJsaWMgbWRzRWRpdG9ySW5zdGFuY2U6IE1kc0VkaXRvckluc3RhbmNlU2VydmljZSxcbiAgICAgICAgcHVibGljIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB1aTogVUlTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHZpZXdJbnN0YW5jZTogVmlld0luc3RhbmNlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBtZHNWaWV3ZXJTZXJ2aWNlOiBNZHNWaWV3ZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIG5vZGVIZWxwZXI6IE5vZGVIZWxwZXJTZXJ2aWNlLFxuICAgICkge1xuICAgICAgICAvLyBzdXBlcih0b2FzdCwgbnVsbCwgdHJhbnNsYXRlKTtcbiAgICB9XG5cbiAgICBhc3luYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIHRoaXMudmFsdWUuc2V0KGF3YWl0IHRoaXMuZ2V0Tm9kZVZhbHVlKCkpO1xuICAgIH1cblxuICAgIGFzeW5jIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnZhbHVlLnNldChhd2FpdCB0aGlzLmdldE5vZGVWYWx1ZSgpKTtcbiAgICAgICAgdGhpcy53aWRnZXRcbiAgICAgICAgICAgIC5nZXRJbml0aWFsRGlzcGxheVZhbHVlcygpXG4gICAgICAgICAgICAucGlwZShmaWx0ZXIoKHY6IE1kc1ZhbHVlTGlzdCkgPT4gISF2KSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKHZhbHVlOiBNZHNWYWx1ZUxpc3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlLnNldCh2YWx1ZS52YWx1ZXMubWFwKCh2KSA9PiB2LmRpc3BsYXlTdHJpbmcpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLmJhc2ljVHlwZS5zZXQodGhpcy5nZXRCYXNpY1R5cGUoKSk7XG4gICAgICAgIHRoaXMucmF3VmFsdWUgPSBhd2FpdCB0aGlzLmdldFJhd1ZhbHVlKCkudG9Qcm9taXNlKCk7XG4gICAgfVxuXG4gICAgZ2V0RGVmaW5pdGlvbigpOiBNZHNXaWRnZXQge1xuICAgICAgICByZXR1cm4gdGhpcy53aWRnZXQ/LmRlZmluaXRpb24gfHwgdGhpcy5kZWZpbml0aW9uO1xuICAgIH1cblxuICAgIGdldEJhc2ljVHlwZSgpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmdldERlZmluaXRpb24oKS5pZCkge1xuICAgICAgICAgICAgY2FzZSAnbGljZW5zZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdsaWNlbnNlJztcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHRoaXMuZ2V0RGVmaW5pdGlvbigpLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3RleHQnOlxuICAgICAgICAgICAgY2FzZSAnZW1haWwnOlxuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgY2FzZSAnY29sb3InOlxuICAgICAgICAgICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgICAgICAgY2FzZSAnc2luZ2xlb3B0aW9uJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RleHQnO1xuICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ251bWJlcic7XG4gICAgICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RhdGUnO1xuICAgICAgICAgICAgY2FzZSAndmNhcmQnOlxuICAgICAgICAgICAgICAgIHJldHVybiAndmNhcmQnO1xuICAgICAgICAgICAgY2FzZSAnbXVsdGl2YWx1ZUZpeGVkQmFkZ2VzJzpcbiAgICAgICAgICAgIGNhc2UgJ211bHRpdmFsdWVTdWdnZXN0QmFkZ2VzJzpcbiAgICAgICAgICAgIGNhc2UgJ3NpbmdsZXZhbHVlU3VnZ2VzdEJhZGdlcyc6XG4gICAgICAgICAgICBjYXNlICdtdWx0aXZhbHVlQmFkZ2VzJzpcbiAgICAgICAgICAgIGNhc2UgJ3NpbmdsZXZhbHVlVHJlZSc6XG4gICAgICAgICAgICBjYXNlICdtdWx0aXZhbHVlVHJlZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlld0luc3RhbmNlLnRyZWVEaXNwbGF5ID09PSAnZmxhdCcgPyAnYXJyYXknIDogJ3RyZWUnO1xuICAgICAgICAgICAgY2FzZSAnc2xpZGVyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3NsaWRlcic7XG4gICAgICAgICAgICBjYXNlICdkdXJhdGlvbic6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkdXJhdGlvbic7XG4gICAgICAgICAgICBjYXNlICdyYW5nZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdyYW5nZSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICd1bmtub3duJztcbiAgICB9XG5cbiAgICBzdXBwb3J0c0lubGluZUVkaXRpbmcoKSB7XG4gICAgICAgIHJldHVybiBNZHNXaWRnZXRDb21wb25lbnQuaW5saW5lRWRpdGluZy5pbmNsdWRlcyhcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0Py5kZWZpbml0aW9uLnR5cGUgYXMgTWRzV2lkZ2V0VHlwZSxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXROb2RlVmFsdWVzKCkge1xuICAgICAgICBpZiAodGhpcy5tZHNFZGl0b3JJbnN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAodGhpcy5tZHNFZGl0b3JJbnN0YW5jZS52YWx1ZXMkLnZhbHVlIGFzIFZhbHVlcykgfHxcbiAgICAgICAgICAgICAgICB0aGlzLm1kc0VkaXRvckluc3RhbmNlLm5vZGVzJC52YWx1ZS5tYXAoKG46IE5vZGUpID0+IG4ucHJvcGVydGllcylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tZHNWaWV3ZXJTZXJ2aWNlLnZhbHVlcyQudmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZXROb2RlVmFsdWUoKSB7XG4gICAgICAgIGlmICh0aGlzLnRlbXBvcmFyeVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlKHRoaXMudGVtcG9yYXJ5VmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5nZXREZWZpbml0aW9uKCkuaWQ7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0Tm9kZVZhbHVlcygpO1xuICAgICAgICBpZiAodGhpcy5nZXRCYXNpY1R5cGUoKSA9PT0gJ2xpY2Vuc2UnKSB7XG4gICAgICAgICAgICB0aGlzLmxpY2Vuc2UkLm5leHQoe1xuICAgICAgICAgICAgICAgIGljb246IGF3YWl0IHRoaXMubm9kZUhlbHBlci5nZXRMaWNlbnNlSWNvbih7XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHRoaXMuZ2V0Tm9kZVZhbHVlcygpLFxuICAgICAgICAgICAgICAgIH0gYXMgTm9kZSksXG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5ub2RlSGVscGVyLmdldExpY2Vuc2VOYW1lKHsgcHJvcGVydGllczogdGhpcy5nZXROb2RlVmFsdWVzKCkgfSBhcyBOb2RlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmdldERlZmluaXRpb24oKS50eXBlID09PSAncmFuZ2UnKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFt2YWx1ZXNbaWQgKyAnX2Zyb20nXT8uWzBdLCB2YWx1ZXNbaWQgKyAnX3RvJ10/LlswXV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZXM/LltpZF0pIHtcbiAgICAgICAgICAgIC8vIHN1cHBvcnQgb24gdGhlIGZseSBjaGFuZ2VzK3VwZGF0ZXMgb2YgdGhlIHZhbHVlc1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUodmFsdWVzW2lkXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoKGF3YWl0IHRoaXMud2lkZ2V0LmdldEluaXRhbFZhbHVlc0FzeW5jKCkpPy5qb2ludFZhbHVlcykge1xuICAgICAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLndpZGdldC5nZXRJbml0YWxWYWx1ZXNBc3luYygpKS5qb2ludFZhbHVlcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0VmFsdWUoZGF0YTogc3RyaW5nW10pIHtcbiAgICAgICAgbGV0IHZhbHVlID0gZGF0YTtcbiAgICAgICAgaWYgKCF2YWx1ZSB8fCB2YWx1ZS5ldmVyeSgodikgPT4gIXYpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmdldERlZmluaXRpb24oKS52YWx1ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hcHBpbmcgPSB0aGlzLndpZGdldC5kZWZpbml0aW9uLnZhbHVlc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHY6IGFueSkgPT4gZGF0YS5maWx0ZXIoKGQpID0+IGQgPT09IHYuaWQpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgLm1hcCgodjogYW55KSA9PiB2LmNhcHRpb24pO1xuICAgICAgICAgICAgaWYgKG1hcHBpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFwcGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGNsaWNrKCkge1xuICAgICAgICBpZiAodGhpcy5nZXREZWZpbml0aW9uKCkubGluayA9PT0gJ19CTEFOSycpIHtcbiAgICAgICAgICAgIHdpbmRvdy5vcGVuKHRoaXMuZm9ybWF0VGV4dCgpWzBdKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdldERlZmluaXRpb24oKS5saW5rID09PSAnX1NFTEYnKSB7XG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHRoaXMuZm9ybWF0VGV4dCgpWzBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdVbnN1cHBvcnRlZCBsaW5rIHR5cGUgJyArIHRoaXMuZ2V0RGVmaW5pdGlvbigpLmxpbmspO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9ybWF0RGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUoKS5tYXAoKHYpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmdldERlZmluaXRpb24oKS5mb3JtYXQpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGVQaXBlKCdlbicpLnRyYW5zZm9ybSh2LCB0aGlzLmdldERlZmluaXRpb24oKS5mb3JtYXQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZm9ybWF0IGRhdGUnLCBlLCB0aGlzLmdldERlZmluaXRpb24oKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBEYXRlSGVscGVyLmZvcm1hdERhdGUodGhpcy50cmFuc2xhdGUsIHYsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBbHdheXNUaW1lOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBEYXRlSGVscGVyLmZvcm1hdERhdGUodGhpcy50cmFuc2xhdGUsIHYsIHtcbiAgICAgICAgICAgICAgICAgICAgc2hvd0Fsd2F5c1RpbWU6IHRydWUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvcm1hdE51bWJlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUoKS5tYXAoKHYpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLndpZGdldC5kZWZpbml0aW9uLmZvcm1hdCA9PT0gJ2J5dGVzJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRm9ybWF0U2l6ZVBpcGUodGhpcy50cmFuc2xhdGUpLnRyYW5zZm9ybSh2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3JtYXRUZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSgpLm1hcCgodikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMud2lkZ2V0LmRlZmluaXRpb24uZm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0LmRlZmluaXRpb24uZm9ybWF0LnJlcGxhY2UoJyR7dmFsdWV9Jywgdik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGluc3RhbmNlOiBNZHNFZGl0b3JXaWRnZXRCYXNlXG4gICAgYXN5bmMgZmluaXNoRWRpdChpbnN0YW5jZTogYW55LCBzdG9yZSA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChzdG9yZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5tZHNFZGl0b3JJbnN0YW5jZS5zYXZlV2lkZ2V0VmFsdWUoaW5zdGFuY2Uud2lkZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRlbXBvcmFyeVZhbHVlID0gaW5zdGFuY2Uud2lkZ2V0LmdldFZhbHVlKCk7XG4gICAgICAgIHRoaXMudmFsdWUuc2V0KGF3YWl0IHRoaXMuZ2V0Tm9kZVZhbHVlKCkpO1xuICAgICAgICB0aGlzLmVkaXRXcmFwcGVyLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW5bMF0uaW5uZXJIVE1MID0gbnVsbDtcbiAgICAgICAgYXdhaXQgdGhpcy5tZHNFZGl0b3JJbnN0YW5jZS5mZXRjaERpc3BsYXlWYWx1ZXModGhpcy53aWRnZXQpO1xuICAgIH1cblxuICAgIGlzRWRpdGFibGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5tZHNFZGl0b3JJbnN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlubGluZUVkaXRpbmcgPT09ICdhbHdheXMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdXBwb3J0c0lubGluZUVkaXRpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBub2RlcyA9IHRoaXMubWRzRWRpdG9ySW5zdGFuY2Uubm9kZXMkLnZhbHVlO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5tZHNFZGl0b3JJbnN0YW5jZS5lZGl0b3JNb2RlID09PSAnaW5saW5lJyAmJlxuICAgICAgICAgICAgdGhpcy53aWRnZXQuZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUgPT09ICdJbnB1dCcgJiZcbiAgICAgICAgICAgIG5vZGVzPy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgIFJlc3RIZWxwZXIuaGFzQWNjZXNzUGVybWlzc2lvbihub2Rlc1swXSwgUmVzdENvbnN0YW50cy5BQ0NFU1NfV1JJVEUpICYmXG4gICAgICAgICAgICB0aGlzLnN1cHBvcnRzSW5saW5lRWRpdGluZygpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgYXN5bmMgZm9jdXMoKSB7XG4gICAgICAgIC8vIHRoaXMubWF0UmlwcGxlLmxhdW5jaCh7fSk7XG4gICAgICAgIGF3YWl0IHRoaXMudWkuc2Nyb2xsU21vb3RoRWxlbWVudFRvQ2hpbGQodGhpcy5lZGl0V3JhcHBlci5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5tYXRSaXBwbGUubGF1bmNoKHt9KTtcbiAgICAgICAgLy9jb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnZpZXcuaW5qZWN0RWRpdEZpZWxkKHRoaXMsIHRoaXMuZWRpdFdyYXBwZXIubmF0aXZlRWxlbWVudC5jaGlsZHJlblswXSk7XG4gICAgICAgIC8vYXdhaXQgdGhpcy51aS5zY3JvbGxTbW9vdGhFbGVtZW50VG9DaGlsZChyZXN1bHQuaHRtbEVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgcGF0aCBmb3IgYSBnaXZlbiB2YWx1ZSBpbiBhIHRyZWVcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFBhdGgodjogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy5nZXREZWZpbml0aW9uKCkudmFsdWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHYsXG4gICAgICAgICAgICAgICAgICAgIGNhcHRpb246IHYsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGF0aDogTWRzVmFsdWVbXSA9IFtdO1xuICAgICAgICBsZXQgcG9pbnRlcjogc3RyaW5nID0gdjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDA7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbWFwcGVkID0gdGhpcy5nZXREZWZpbml0aW9uKCkudmFsdWVzLmZpbmQoKHcpID0+IHcuaWQgPT09IHBvaW50ZXIpO1xuICAgICAgICAgICAgaWYgKG1hcHBlZCkge1xuICAgICAgICAgICAgICAgIHBhdGgucHVzaChtYXBwZWQpO1xuICAgICAgICAgICAgICAgIHBvaW50ZXIgPSBtYXBwZWQucGFyZW50O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aC5yZXZlcnNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZmV0Y2ggdGhlIHJhdyBub2RlIHZhbHVlXG4gICAgICogTm90ZTogV2lsbCBub3Qgd29yayBpbiBhIGJ1bGsgc3RhdGUhXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRSYXdWYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMubWRzRWRpdG9ySW5zdGFuY2U/Lm5vZGVzJC5waXBlKFxuICAgICAgICAgICAgICAgIGZpcnN0KCksXG4gICAgICAgICAgICAgICAgbWFwKCh2OiBOb2RlW10pID0+XG4gICAgICAgICAgICAgICAgICAgICh2Py5bMF0/LnByb3BlcnRpZXNbdGhpcy53aWRnZXQuZGVmaW5pdGlvbi5pZF0gYXMgc3RyaW5nW10pPy5tYXAoKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IHRoaXMuZ2V0UGF0aChpZCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKSB8fCBvZihudWxsKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldFNlYXJjaFBhcmFtcyhrZXk6IE1kc1ZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHBhcmFtczogYW55ID0ge307XG4gICAgICAgIGNvbnN0IG1kczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XG4gICAgICAgIG1kc1t0aGlzLndpZGdldC5kZWZpbml0aW9uLmlkXSA9IFtrZXkuaWRdO1xuICAgICAgICBwYXJhbXMubWRzID0gdGhpcy5tZHNFZGl0b3JJbnN0YW5jZS5tZHNJZDtcbiAgICAgICAgcGFyYW1zLnNpZGVuYXYgPSB0cnVlO1xuICAgICAgICBwYXJhbXMucmVwbyA9IHRoaXMubWRzRWRpdG9ySW5zdGFuY2Uubm9kZXMkLnZhbHVlPy5bMF0ucmVmLnJlcG87XG4gICAgICAgIHBhcmFtcy5maWx0ZXJzID0gSlNPTi5zdHJpbmdpZnkobWRzKTtcbiAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9XG5cbiAgICBzdGFydEVkaXQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHZvaWQgdGhpcy52aWV3LmluamVjdEVkaXRGaWVsZCh0aGlzLCB0aGlzLmVkaXRXcmFwcGVyLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW5bMF0pO1xuICAgIH1cbn1cbiIsIjxlcy1tZHMtZWRpdG9yLXdpZGdldC1jb250YWluZXJcbiAgKm5nSWY9XCIhZWRpdFdyYXBwZXIuaW5uZXJUZXh0LnRyaW0oKVwiXG4gIFtpbmplY3RlZFZpZXddPVwidGhpc1wiXG4gIFt3aWRnZXRdPVwid2lkZ2V0XCJcbiAgW2xhYmVsXT1cImZhbHNlXCJcbiAgW3dyYXBJbkZvcm1GaWVsZF09XCJmYWxzZVwiXG4gIFt3cmFwSW5Hcm91cF09XCJmYWxzZVwiXG4gIFt2YWx1ZVR5cGVdPVwidmFsdWVUeXBlXCJcbiAgbWF0UmlwcGxlXG4gIFttYXRSaXBwbGVEaXNhYmxlZF09XCJ0cnVlXCJcbj5cbiAgPGRpdiBjbGFzcz1cImVkaXQtd3JhcHBlclwiPlxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwiIWlzRW1wdHkoKSB8fCAhd2lkZ2V0LmRlZmluaXRpb24uaGlkZUlmRW1wdHkgfHwgaXNFZGl0YWJsZSgpXCJcbiAgICAgIGNsYXNzPVwid2lkZ2V0LXdyYXBwZXJcIlxuICAgID5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXQtbGFiZWxcIlxuICAgICAgICBbYXR0ci5yb2xlXT1cImhlYWRpbmdMZXZlbCA/ICdoZWFkaW5nJyA6IG51bGxcIlxuICAgICAgICBbYXR0ci5hcmlhLWxldmVsXT1cImhlYWRpbmdMZXZlbFwiXG4gICAgICAgICpuZ0lmPVwid2lkZ2V0LmRlZmluaXRpb24uY2FwdGlvbiAmJiBzaG93Q2FwdGlvblwiXG4gICAgICA+XG4gICAgICAgIHt7IHdpZGdldC5kZWZpbml0aW9uLmNhcHRpb25cbiAgICAgICAgfX08c3BhbiAqbmdJZj1cIiFoZWFkaW5nTGV2ZWxcIiBjbGFzcz1cImNkay12aXN1YWxseS1oaWRkZW5cIj46IDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cInZhbHVlLXdyYXBwZXJcIlxuICAgICAgICBbY2xhc3MudmFsdWUtd3JhcHBlci1lZGl0XT1cImlzRWRpdGFibGUoKVwiXG4gICAgICAgIChjbGljayk9XCJpc0VkaXRhYmxlKCkgPyBzdGFydEVkaXQoJGV2ZW50KSA6IG51bGxcIlxuICAgICAgPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNFbXB0eSgpXCIgY2xhc3M9XCJ3aWRnZXQtZGF0YSB3aWRnZXQtbm8tZGF0YSB3aWRnZXQtdHlwZS17eyBiYXNpY1R5cGUoKSB9fVwiPlxuICAgICAgICAgIC1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cIiFpc0VtcHR5KClcIlxuICAgICAgICAgIGNsYXNzPVwid2lkZ2V0LWRhdGEgd2lkZ2V0LXR5cGUte3sgYmFzaWNUeXBlKCkgfX0ge3tcbiAgICAgICAgICAgIHdpZGdldC5kZWZpbml0aW9uLmxpbmsgPyAnd2lkZ2V0LWxpbmsnIDogJydcbiAgICAgICAgICB9fVwiXG4gICAgICAgICAgKGNsaWNrKT1cImNsaWNrKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImJhc2ljVHlwZSgpID09PSAndGV4dCdcIj57eyBmb3JtYXRUZXh0KCkgfX08L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYmFzaWNUeXBlKCkgPT09ICdudW1iZXInXCI+e3sgZm9ybWF0TnVtYmVyKCkgfX08L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYmFzaWNUeXBlKCkgPT09ICdkYXRlJ1wiPnt7IGZvcm1hdERhdGUoKSB9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJiYXNpY1R5cGUoKSA9PT0gJ2xpY2Vuc2UnICYmIChsaWNlbnNlJCB8IGFzeW5jKSBhcyBsaWNlbnNlXCI+XG4gICAgICAgICAgICA8aW1nIGFsdD1cIlwiIFtzcmNdPVwibGljZW5zZS5pY29uXCIgLz4ge3sgbGljZW5zZS5uYW1lIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImJhc2ljVHlwZSgpID09PSAnYXJyYXknXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyYXktZW50cnlcIiAqbmdGb3I9XCJsZXQgdiBvZiB2YWx1ZSgpXCI+e3sgdiB9fTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJiYXNpY1R5cGUoKSA9PT0gJ3RyZWUnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJlZS1lbnRyeVwiICpuZ0Zvcj1cImxldCB2IG9mIHJhd1ZhbHVlXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0cmVlRW50cnk7IGNvbnRleHQ6IHsgcGF0aDogdi5wYXRoIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJiYXNpY1R5cGUoKSA9PT0gJ3ZjYXJkJ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycmF5LWVudHJ5XCIgKm5nRm9yPVwibGV0IHYgb2YgdmFsdWUoKVwiPnt7IHYgfCB2Y2FyZE5hbWUgfX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYmFzaWNUeXBlKCkgPT09ICdzbGlkZXInXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNsaWRlci12YWx1ZVwiPnt7IHZhbHVlIH19PC9zcGFuXG4gICAgICAgICAgICA+PHNwYW4+IC8gPC9zcGFuPjxzcGFuIGNsYXNzPVwic2xpZGVyLW1heFwiPnt7IHdpZGdldC5kZWZpbml0aW9uLm1heCB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYmFzaWNUeXBlKCkgPT09ICdkdXJhdGlvbidcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHVyYXRpb24tdmFsdWVcIj57eyB2YWx1ZSgpWzBdIHwgYXBwTWRzRHVyYXRpb24gfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImJhc2ljVHlwZSgpID09PSAncmFuZ2UnXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNsaWRlci12YWx1ZVwiPnt7IHZhbHVlKClbMF0gfX08L3NwYW5cbiAgICAgICAgICAgID4tPHNwYW4gY2xhc3M9XCJzbGlkZXItdmFsdWVcIj57eyB2YWx1ZSgpWzFdIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJiYXNpY1R5cGUoKSA9PT0gJ3Vua25vd24nXCI+XG4gICAgICAgICAgICBUaGUgd2lkZ2V0IHR5cGUge3sgd2lkZ2V0LmRlZmluaXRpb24udHlwZSB9fSBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCB2aWEgYW5ndWxhclxuICAgICAgICAgICAgcmVuZGVyaW5nXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLTxidXR0b24gbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cIm1kc0VkaXRvckluc3RhbmNlLmVkaXRvck1vZGUgPT09ICdpbmxpbmUnICYmIHdpZGdldC5kZWZpbml0aW9uLmludGVyYWN0aW9uVHlwZSA9PT0gJ0lucHV0J1wiXG4gICAgICAgICAgICAoY2xpY2spPVwidmlldy5pbmplY3RFZGl0RmllbGQodGhpcywgZWRpdClcIlxuICAgICAgICAgICAgY2xhc3M9XCJidG4tZWRpdFwiPlxuICAgICAgPGkgZXNJY29uPVwiZWRpdFwiPjwvaT5cbiAgICA8L2J1dHRvbj4tLT5cbiAgPC9kaXY+XG48L2VzLW1kcy1lZGl0b3Itd2lkZ2V0LWNvbnRhaW5lcj5cbjxkaXYgY2xhc3M9XCJlZGl0LXdyYXBwZXJcIj5cbiAgPGRpdiAjZWRpdFdyYXBwZXI+PGRpdiAjZWRpdD48L2Rpdj48L2Rpdj5cbiAgPCEtLTxidXR0b24gKm5nSWY9XCIhIWVkaXRXcmFwcGVyLmlubmVyVGV4dC50cmltKClcIiBtYXQtaWNvbi1idXR0b24+PGkgZXNJY29uPVwic2F2ZVwiPjwvaT48L2J1dHRvbj4tLT5cbjwvZGl2PlxuPG5nLXRlbXBsYXRlICN0cmVlRW50cnkgbGV0LXBhdGg9XCJwYXRoXCI+XG4gIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHQgb2YgcGF0aDsgbGV0IGZpcnN0ID0gZmlyc3RcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZpcnN0XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNkay12aXN1YWxseS1oaWRkZW5cIj57eyAnU1VCX0NBVEVHT1JZX0FSSUEnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgPGkgZXNJY29uPVwia2V5Ym9hcmRfYXJyb3dfcmlnaHRcIiBbYXJpYV09XCJmYWxzZVwiPjwvaT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8YVxuICAgICAgW3JvdXRlckxpbmtdPVwiJy8nICsgUk9VVEVSX1BSRUZJWCArICdzZWFyY2gnXCJcbiAgICAgIFtxdWVyeVBhcmFtc109XCJnZXRTZWFyY2hQYXJhbXModClcIlxuICAgICAgKm5nSWY9XCJ3aWRnZXQuZGVmaW5pdGlvbi5pc1NlYXJjaGFibGVcIlxuICAgICAgPnt7IHQuY2FwdGlvbiB9fTwvYVxuICAgID5cbiAgICA8c3BhbiAqbmdJZj1cIiF3aWRnZXQuZGVmaW5pdGlvbi5pc1NlYXJjaGFibGVcIj57eyB0LmNhcHRpb24gfX08L3NwYW4+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { of } from 'rxjs';
|
|
2
|
-
import { NodeDataSource } from './node-data-source';
|
|
3
|
-
/**
|
|
4
|
-
* data source which joins multiple underlying data sources
|
|
5
|
-
* used for the "all" search
|
|
6
|
-
*/
|
|
7
|
-
export class CombinedDataSource extends NodeDataSource {
|
|
8
|
-
constructor(dataSources) {
|
|
9
|
-
super();
|
|
10
|
-
this.dataSources = dataSources;
|
|
11
|
-
}
|
|
12
|
-
connect() {
|
|
13
|
-
// @TODO: Using a forkJoin and real connect would be better
|
|
14
|
-
return of(this.getData());
|
|
15
|
-
/*
|
|
16
|
-
return forkJoin(this.dataSources.map(ds => ds.connect())).pipe(
|
|
17
|
-
switchMap(d => d)
|
|
18
|
-
) as Observable<T[]>;
|
|
19
|
-
*/
|
|
20
|
-
}
|
|
21
|
-
disconnect() { }
|
|
22
|
-
hasMore() {
|
|
23
|
-
return this.dataSources.filter((ds) => ds.hasMore()).length > 0;
|
|
24
|
-
}
|
|
25
|
-
getData() {
|
|
26
|
-
return [].concat.apply([], this.dataSources.map((ds) => ds.getData()));
|
|
27
|
-
}
|
|
28
|
-
isEmpty() {
|
|
29
|
-
return this.getData()?.length === 0;
|
|
30
|
-
}
|
|
31
|
-
getTotal() {
|
|
32
|
-
return this.dataSources.map((ds) => ds.getTotal()).reduce((a, b) => a + b);
|
|
33
|
-
}
|
|
34
|
-
isFullyLoaded() {
|
|
35
|
-
return this.getTotal() <= this.getData()?.length;
|
|
36
|
-
}
|
|
37
|
-
getDatasource(position) {
|
|
38
|
-
return this.dataSources[position];
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYmluZWQtZGF0YS1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lZHUtc2hhcmluZy11aS9zcmMvbGliL25vZGUtZW50cmllcy9jb21iaW5lZC1kYXRhLXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUdwRDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sa0JBQXNELFNBQVEsY0FBaUI7SUFDeEYsWUFBb0IsV0FBZ0M7UUFDaEQsS0FBSyxFQUFFLENBQUM7UUFEUSxnQkFBVyxHQUFYLFdBQVcsQ0FBcUI7SUFFcEQsQ0FBQztJQUVELE9BQU87UUFDSCwyREFBMkQ7UUFDM0QsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDMUI7Ozs7V0FJRztJQUNQLENBQUM7SUFFRCxVQUFVLEtBQUksQ0FBQztJQUNmLE9BQU87UUFDSCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxPQUFPO1FBQ0gsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDbEIsRUFBRSxFQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FDN0MsQ0FBQztJQUNOLENBQUM7SUFFRCxPQUFPO1FBQ0gsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsUUFBUTtRQUNKLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsYUFBYTtRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLENBQUM7SUFDckQsQ0FBQztJQUVELGFBQWEsQ0FBQyxRQUFnQjtRQUMxQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE5vZGVEYXRhU291cmNlIH0gZnJvbSAnLi9ub2RlLWRhdGEtc291cmNlJztcbmltcG9ydCB7IE5vZGUsIEdlbmVyaWNBdXRob3JpdHkgfSBmcm9tICduZ3gtZWR1LXNoYXJpbmctYXBpJztcblxuLyoqXG4gKiBkYXRhIHNvdXJjZSB3aGljaCBqb2lucyBtdWx0aXBsZSB1bmRlcmx5aW5nIGRhdGEgc291cmNlc1xuICogdXNlZCBmb3IgdGhlIFwiYWxsXCIgc2VhcmNoXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21iaW5lZERhdGFTb3VyY2U8VCBleHRlbmRzIE5vZGUgfCBHZW5lcmljQXV0aG9yaXR5PiBleHRlbmRzIE5vZGVEYXRhU291cmNlPFQ+IHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGFTb3VyY2VzOiBOb2RlRGF0YVNvdXJjZTxUPltdKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgY29ubmVjdCgpOiBPYnNlcnZhYmxlPFRbXT4ge1xuICAgICAgICAvLyBAVE9ETzogVXNpbmcgYSBmb3JrSm9pbiBhbmQgcmVhbCBjb25uZWN0IHdvdWxkIGJlIGJldHRlclxuICAgICAgICByZXR1cm4gb2YodGhpcy5nZXREYXRhKCkpO1xuICAgICAgICAvKlxuICAgICAgICByZXR1cm4gZm9ya0pvaW4odGhpcy5kYXRhU291cmNlcy5tYXAoZHMgPT4gZHMuY29ubmVjdCgpKSkucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcChkID0+IGQpXG4gICAgICAgICkgYXMgT2JzZXJ2YWJsZTxUW10+O1xuICAgICAgICAgKi9cbiAgICB9XG5cbiAgICBkaXNjb25uZWN0KCkge31cbiAgICBoYXNNb3JlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlcy5maWx0ZXIoKGRzKSA9PiBkcy5oYXNNb3JlKCkpLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgZ2V0RGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIFtdLmNvbmNhdC5hcHBseShcbiAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlcy5tYXAoKGRzKSA9PiBkcy5nZXREYXRhKCkpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldERhdGEoKT8ubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIGdldFRvdGFsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlcy5tYXAoKGRzKSA9PiBkcy5nZXRUb3RhbCgpKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiKTtcbiAgICB9XG5cbiAgICBpc0Z1bGx5TG9hZGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUb3RhbCgpIDw9IHRoaXMuZ2V0RGF0YSgpPy5sZW5ndGg7XG4gICAgfVxuXG4gICAgZ2V0RGF0YXNvdXJjZShwb3NpdGlvbjogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2VzW3Bvc2l0aW9uXTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { NodeDataSource } from './node-data-source';
|
|
2
|
-
/**
|
|
3
|
-
* this is a special data source to provide custom card layouts into the node-entries components
|
|
4
|
-
*/
|
|
5
|
-
export class CustomTemplatesDataSource extends NodeDataSource {
|
|
6
|
-
}
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXRlbXBsYXRlcy1kYXRhLXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VkdS1zaGFyaW5nLXVpL3NyYy9saWIvbm9kZS1lbnRyaWVzL2N1c3RvbS10ZW1wbGF0ZXMtZGF0YS1zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXBEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHlCQUEwQixTQUFRLGNBQW1CO0NBQUciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOb2RlRGF0YVNvdXJjZSB9IGZyb20gJy4vbm9kZS1kYXRhLXNvdXJjZSc7XG5cbi8qKlxuICogdGhpcyBpcyBhIHNwZWNpYWwgZGF0YSBzb3VyY2UgdG8gcHJvdmlkZSBjdXN0b20gY2FyZCBsYXlvdXRzIGludG8gdGhlIG5vZGUtZW50cmllcyBjb21wb25lbnRzXG4gKi9cbmV4cG9ydCBjbGFzcyBDdXN0b21UZW1wbGF0ZXNEYXRhU291cmNlIGV4dGVuZHMgTm9kZURhdGFTb3VyY2U8YW55PiB7fVxuIl19
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { Component, Input } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
import * as i1 from "@angular/common";
|
|
4
|
-
import * as i2 from "../../list-items/list-text/list-text.component";
|
|
5
|
-
import * as i3 from "@angular/material/badge";
|
|
6
|
-
import * as i4 from "../../pipes/node-icon.pipe";
|
|
7
|
-
export class DragPreviewComponent {
|
|
8
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: DragPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
9
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: DragPreviewComponent, selector: "es-drag-preview", inputs: { node: "node", selected: "selected", item: "item" }, ngImport: i0, template: "<div class=\"drag-preview\" [matBadge]=\"selected.length > 1 ? selected.length : null\">\n <div class=\"drag-preview-icon\">\n <img *ngIf=\"node.iconURL\" [src]=\"node | esNodeIcon | async\" />\n </div>\n <es-list-text class=\"drag-preview-text\" [node]=\"node\" [item]=\"item\"></es-list-text>\n</div>\n", styles: [".drag-preview{display:flex;align-items:center;gap:16px;height:48px;padding:0 12px;background-color:var(--palette-primary-50)}.drag-preview-icon{width:30px;height:30px;padding:3px;margin:1px 0;background-color:#fff;border-radius:50%;display:flex;justify-content:center;align-items:center;box-shadow:0 0 3px #0000004d}.drag-preview-icon>img{width:18px;height:auto}.drag-preview-text{max-width:300px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.ListTextComponent, selector: "es-list-text" }, { kind: "directive", type: i3.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.NodeIconPipe, name: "esNodeIcon" }] }); }
|
|
10
|
-
}
|
|
11
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: DragPreviewComponent, decorators: [{
|
|
12
|
-
type: Component,
|
|
13
|
-
args: [{ selector: 'es-drag-preview', template: "<div class=\"drag-preview\" [matBadge]=\"selected.length > 1 ? selected.length : null\">\n <div class=\"drag-preview-icon\">\n <img *ngIf=\"node.iconURL\" [src]=\"node | esNodeIcon | async\" />\n </div>\n <es-list-text class=\"drag-preview-text\" [node]=\"node\" [item]=\"item\"></es-list-text>\n</div>\n", styles: [".drag-preview{display:flex;align-items:center;gap:16px;height:48px;padding:0 12px;background-color:var(--palette-primary-50)}.drag-preview-icon{width:30px;height:30px;padding:3px;margin:1px 0;background-color:#fff;border-radius:50%;display:flex;justify-content:center;align-items:center;box-shadow:0 0 3px #0000004d}.drag-preview-icon>img{width:18px;height:auto}.drag-preview-text{max-width:300px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"] }]
|
|
14
|
-
}], propDecorators: { node: [{
|
|
15
|
-
type: Input
|
|
16
|
-
}], selected: [{
|
|
17
|
-
type: Input
|
|
18
|
-
}], item: [{
|
|
19
|
-
type: Input
|
|
20
|
-
}] } });
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1wcmV2aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VkdS1zaGFyaW5nLXVpL3NyYy9saWIvbm9kZS1lbnRyaWVzL2RyYWctcHJldmlldy9kcmFnLXByZXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWR1LXNoYXJpbmctdWkvc3JjL2xpYi9ub2RlLWVudHJpZXMvZHJhZy1wcmV2aWV3L2RyYWctcHJldmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBVWpELE1BQU0sT0FBTyxvQkFBb0I7K0dBQXBCLG9CQUFvQjttR0FBcEIsb0JBQW9CLHFIQ1ZqQyx3VEFNQTs7NEZESWEsb0JBQW9CO2tCQUxoQyxTQUFTOytCQUNJLGlCQUFpQjs4QkFLbEIsSUFBSTtzQkFBWixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlzdEl0ZW0gfSBmcm9tICcuLi8uLi90eXBlcy9saXN0LWl0ZW0nO1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gJ25neC1lZHUtc2hhcmluZy1hcGknO1xuaW1wb3J0IHsgTm9kZUVudHJpZXNEYXRhVHlwZSB9IGZyb20gJy4uL2VudHJpZXMtbW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2VzLWRyYWctcHJldmlldycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RyYWctcHJldmlldy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZHJhZy1wcmV2aWV3LmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIERyYWdQcmV2aWV3Q29tcG9uZW50PFQgZXh0ZW5kcyBOb2RlRW50cmllc0RhdGFUeXBlPiB7XG4gICAgQElucHV0KCkgbm9kZTogTm9kZTtcbiAgICBASW5wdXQoKSBzZWxlY3RlZDogVFtdO1xuICAgIEBJbnB1dCgpIGl0ZW06IExpc3RJdGVtO1xufVxuIiwiPGRpdiBjbGFzcz1cImRyYWctcHJldmlld1wiIFttYXRCYWRnZV09XCJzZWxlY3RlZC5sZW5ndGggPiAxID8gc2VsZWN0ZWQubGVuZ3RoIDogbnVsbFwiPlxuICA8ZGl2IGNsYXNzPVwiZHJhZy1wcmV2aWV3LWljb25cIj5cbiAgICA8aW1nICpuZ0lmPVwibm9kZS5pY29uVVJMXCIgW3NyY109XCJub2RlIHwgZXNOb2RlSWNvbiB8IGFzeW5jXCIgLz5cbiAgPC9kaXY+XG4gIDxlcy1saXN0LXRleHQgY2xhc3M9XCJkcmFnLXByZXZpZXctdGV4dFwiIFtub2RlXT1cIm5vZGVcIiBbaXRlbV09XCJpdGVtXCI+PC9lcy1saXN0LXRleHQ+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
export var NodeEntriesDisplayType;
|
|
2
|
-
(function (NodeEntriesDisplayType) {
|
|
3
|
-
NodeEntriesDisplayType[NodeEntriesDisplayType["Table"] = 0] = "Table";
|
|
4
|
-
NodeEntriesDisplayType[NodeEntriesDisplayType["Grid"] = 1] = "Grid";
|
|
5
|
-
NodeEntriesDisplayType[NodeEntriesDisplayType["SmallGrid"] = 2] = "SmallGrid";
|
|
6
|
-
})(NodeEntriesDisplayType || (NodeEntriesDisplayType = {}));
|
|
7
|
-
export var InteractionType;
|
|
8
|
-
(function (InteractionType) {
|
|
9
|
-
// create router link
|
|
10
|
-
InteractionType[InteractionType["DefaultActionLink"] = 0] = "DefaultActionLink";
|
|
11
|
-
// emit an event
|
|
12
|
-
InteractionType[InteractionType["Emitter"] = 1] = "Emitter";
|
|
13
|
-
InteractionType[InteractionType["None"] = 2] = "None";
|
|
14
|
-
})(InteractionType || (InteractionType = {}));
|
|
15
|
-
export var ClickSource;
|
|
16
|
-
(function (ClickSource) {
|
|
17
|
-
ClickSource[ClickSource["Preview"] = 0] = "Preview";
|
|
18
|
-
ClickSource[ClickSource["Icon"] = 1] = "Icon";
|
|
19
|
-
ClickSource[ClickSource["Metadata"] = 2] = "Metadata";
|
|
20
|
-
ClickSource[ClickSource["Comments"] = 3] = "Comments";
|
|
21
|
-
ClickSource[ClickSource["Overlay"] = 4] = "Overlay";
|
|
22
|
-
ClickSource[ClickSource["Dropdown"] = 5] = "Dropdown";
|
|
23
|
-
})(ClickSource || (ClickSource = {}));
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50cmllcy1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VkdS1zaGFyaW5nLXVpL3NyYy9saWIvbm9kZS1lbnRyaWVzL2VudHJpZXMtbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBb0JBLE1BQU0sQ0FBTixJQUFZLHNCQUlYO0FBSkQsV0FBWSxzQkFBc0I7SUFDOUIscUVBQUssQ0FBQTtJQUNMLG1FQUFJLENBQUE7SUFDSiw2RUFBUyxDQUFBO0FBQ2IsQ0FBQyxFQUpXLHNCQUFzQixLQUF0QixzQkFBc0IsUUFJakM7QUFFRCxNQUFNLENBQU4sSUFBWSxlQU1YO0FBTkQsV0FBWSxlQUFlO0lBQ3ZCLHFCQUFxQjtJQUNyQiwrRUFBaUIsQ0FBQTtJQUNqQixnQkFBZ0I7SUFDaEIsMkRBQU8sQ0FBQTtJQUNQLHFEQUFJLENBQUE7QUFDUixDQUFDLEVBTlcsZUFBZSxLQUFmLGVBQWUsUUFNMUI7QUE2QkQsTUFBTSxDQUFOLElBQVksV0FPWDtBQVBELFdBQVksV0FBVztJQUNuQixtREFBTyxDQUFBO0lBQ1AsNkNBQUksQ0FBQTtJQUNKLHFEQUFRLENBQUE7SUFDUixxREFBUSxDQUFBO0lBQ1IsbURBQU8sQ0FBQTtJQUNQLHFEQUFRLENBQUE7QUFDWixDQUFDLEVBUFcsV0FBVyxLQUFYLFdBQVcsUUFPdEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTb3J0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5cbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IEN1c3RvbU9wdGlvbnMsIE9wdGlvbkl0ZW0sIFRhcmdldCB9IGZyb20gJy4uL3R5cGVzL29wdGlvbi1pdGVtJztcbmltcG9ydCB7IExpc3RJdGVtLCBMaXN0SXRlbVNvcnQgfSBmcm9tICcuLi90eXBlcy9saXN0LWl0ZW0nO1xuaW1wb3J0IHsgQ2FuRHJvcCwgRHJhZ0RhdGEsIERyb3BBY3Rpb24gfSBmcm9tICcuLi90eXBlcy9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgTm9kZSwgR2VuZXJpY0F1dGhvcml0eSB9IGZyb20gJ25neC1lZHUtc2hhcmluZy1hcGknO1xuaW1wb3J0IHsgQWN0aW9uYmFyQ29tcG9uZW50IH0gZnJvbSAnLi4vYWN0aW9uYmFyL2FjdGlvbmJhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgdHlwZSBOb2RlUm9vdCA9XG4gICAgfCAnTVlfRklMRVMnXG4gICAgfCAnQ09MTEVDVElPTl9IT01FJ1xuICAgIHwgJ1NIQVJFRF9GSUxFUydcbiAgICB8ICdNWV9TSEFSRURfRklMRVMnXG4gICAgfCAnVE9fTUVfU0hBUkVEX0ZJTEVTJ1xuICAgIHwgJ1dPUktGTE9XX1JFQ0VJVkUnXG4gICAgfCAnUkVDWUNMRSdcbiAgICB8ICdBTExfRklMRVMnO1xuXG5leHBvcnQgZW51bSBOb2RlRW50cmllc0Rpc3BsYXlUeXBlIHtcbiAgICBUYWJsZSxcbiAgICBHcmlkLFxuICAgIFNtYWxsR3JpZCxcbn1cblxuZXhwb3J0IGVudW0gSW50ZXJhY3Rpb25UeXBlIHtcbiAgICAvLyBjcmVhdGUgcm91dGVyIGxpbmtcbiAgICBEZWZhdWx0QWN0aW9uTGluayxcbiAgICAvLyBlbWl0IGFuIGV2ZW50XG4gICAgRW1pdHRlcixcbiAgICBOb25lLFxufVxuXG5leHBvcnQgdHlwZSBMaXN0T3B0aW9ucyA9IHsgW2tleSBpbiBUYXJnZXRdPzogT3B0aW9uSXRlbVtdIH07XG5leHBvcnQgdHlwZSBMaXN0T3B0aW9uc0NvbmZpZyA9IHtcbiAgICBhY3Rpb25iYXI/OiBBY3Rpb25iYXJDb21wb25lbnQ7XG4gICAgcGFyZW50PzogTm9kZTtcbiAgICBjdXN0b21PcHRpb25zPzogQ3VzdG9tT3B0aW9ucztcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdFNvcnRDb25maWcgZXh0ZW5kcyBTb3J0IHtcbiAgICBjb2x1bW5zOiBMaXN0SXRlbVNvcnRbXTtcbiAgICBhbGxvd2VkPzogYm9vbGVhbjtcbiAgICBjdXN0b21Tb3J0aW5nSW5Qcm9ncmVzcz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIERyb3BUYXJnZXQgPSBOb2RlIHwgTm9kZVJvb3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJvcFNvdXJjZTxUIGV4dGVuZHMgTm9kZUVudHJpZXNEYXRhVHlwZT4ge1xuICAgIGVsZW1lbnQ6IFRbXTtcbiAgICAvLyBzb3VyY2VMaXN0OiBMaXN0RXZlbnRJbnRlcmZhY2U8VD47XG4gICAgbW9kZTogRHJvcEFjdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaXN0RHJhZ0dyb3BDb25maWc8VCBleHRlbmRzIE5vZGVFbnRyaWVzRGF0YVR5cGU+IHtcbiAgICBkcmFnQWxsb3dlZDogYm9vbGVhbjtcbiAgICBkcm9wQWxsb3dlZD86IChkcmFnRGF0YTogRHJhZ0RhdGE8VD4pID0+IENhbkRyb3A7XG4gICAgZHJvcHBlZD86ICh0YXJnZXQ6IE5vZGUsIHNvdXJjZTogRHJvcFNvdXJjZTxOb2RlRW50cmllc0RhdGFUeXBlPikgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGVudW0gQ2xpY2tTb3VyY2Uge1xuICAgIFByZXZpZXcsXG4gICAgSWNvbixcbiAgICBNZXRhZGF0YSxcbiAgICBDb21tZW50cyxcbiAgICBPdmVybGF5LFxuICAgIERyb3Bkb3duLCAvLyBrZWVwOiB1c2VkIGluIGV4dGVuc2lvbnNcbn1cblxuZXhwb3J0IHR5cGUgTm9kZUNsaWNrRXZlbnQ8VCBleHRlbmRzIE5vZGVFbnRyaWVzRGF0YVR5cGU+ID0ge1xuICAgIGVsZW1lbnQ6IFQ7XG4gICAgc291cmNlOiBDbGlja1NvdXJjZTtcbiAgICBhdHRyaWJ1dGU/OiBMaXN0SXRlbTsgLy8gb25seSB3aGVuIHNvdXJjZSA9PT0gTWV0YWRhdGFcbn07XG5leHBvcnQgdHlwZSBGZXRjaEV2ZW50ID0ge1xuICAgIG9mZnNldDogbnVtYmVyO1xuICAgIGFtb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBpcyBhIHJlc2V0IG9mIHRoZSBjdXJyZW50IGRhdGEgcmVxdWlyZWQ/XG4gICAgICogdGhpcyBzaG91bGQgYmUgdHJ1ZSBpZiB0aGlzIHdhcyBhIHBhZ2luYXRpb24gcmVxdWVzdFxuICAgICAqL1xuICAgIHJlc2V0PzogYm9vbGVhbjtcbn07XG5leHBvcnQgdHlwZSBOb2RlRW50cmllc0RhdGFUeXBlID0gTm9kZSB8IEdlbmVyaWNBdXRob3JpdHk7XG5leHBvcnQgdHlwZSBHcmlkTGF5b3V0ID0gJ2dyaWQnIHwgJ3Njcm9sbCc7XG5leHBvcnQgdHlwZSBHcmlkQ29uZmlnID0ge1xuICAgIC8qKlxuICAgICAqIG1heCBhbW91bnQgb2Ygcm93cyB0aGF0IHNob3VsZCBiZSB2aXNpYmxlLCB1bnNldCBmb3Igbm8gbGltaXRcbiAgICAgKi9cbiAgICBtYXhSb3dzPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIGxheW91dCwgZGVmYXVsdHMgdG8gJ2dyaWQnXG4gICAgICogJ3Njcm9sbCcgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIG1heFJvd3MgaXMgbm90IHNldFxuICAgICAqL1xuICAgIGxheW91dD86IEdyaWRMYXlvdXQ7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RFdmVudEludGVyZmFjZTxUIGV4dGVuZHMgTm9kZUVudHJpZXNEYXRhVHlwZT4ge1xuICAgIHVwZGF0ZU5vZGVzKG5vZGVzOiB2b2lkIHwgVFtdKTogdm9pZDtcblxuICAgIG9uRGlzcGxheVR5cGVDaGFuZ2UoKTogT2JzZXJ2YWJsZTxOb2RlRW50cmllc0Rpc3BsYXlUeXBlPjtcblxuICAgIGdldERpc3BsYXlUeXBlKCk6IE5vZGVFbnRyaWVzRGlzcGxheVR5cGU7XG5cbiAgICBzZXREaXNwbGF5VHlwZShkaXNwbGF5VHlwZTogTm9kZUVudHJpZXNEaXNwbGF5VHlwZSk6IHZvaWQ7XG5cbiAgICBzaG93UmVvcmRlckNvbHVtbnNEaWFsb2coKTogdm9pZDtcblxuICAgIGFkZFZpcnR1YWxOb2Rlcyh2aXJ0dWFsOiBUW10pOiB2b2lkO1xuXG4gICAgc2V0T3B0aW9ucyhvcHRpb25zOiBMaXN0T3B0aW9ucyk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBhY3RpdmF0ZSBvcHRpb24gKGRyb3Bkb3duKSBnZW5lcmF0aW9uXG4gICAgICovXG4gICAgaW5pdE9wdGlvbnNHZW5lcmF0b3IoY29uZmlnOiBMaXN0T3B0aW9uc0NvbmZpZyk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG4gICAgc2VsZWN0QWxsKCk6IHZvaWQ7XG5cbiAgICBnZXRTZWxlY3Rpb24oKTogU2VsZWN0aW9uTW9kZWw8VD47XG5cbiAgICAvKipcbiAgICAgKiB0cmlnZ2VyZWQgd2hlbiBub2Rlcy9vYmplY3RzIGFyZSBkZWxldGVkIGFuZCBzaG91bGQgbm90IGJlIHNob3duIGluIHRoZSBsaXN0IGFueW1vcmVcbiAgICAgKi9cbiAgICBkZWxldGVOb2RlcyhvYmplY3RzOiBUW10pOiB2b2lkO1xufVxuIl19
|