@datagrok-libraries/utils 4.1.27 → 4.1.28
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/css/forms.css
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
.d4-multi-form {
|
|
2
|
+
overflow: scroll!important;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
.d4-multi-form-header {
|
|
6
|
+
width: 100px;
|
|
7
|
+
margin-right: 10px;
|
|
8
|
+
padding-top: 10px;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.d4-multi-form-column-name {
|
|
12
|
+
font-weight: bold;
|
|
13
|
+
position: absolute;
|
|
14
|
+
left: 10px;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.d4-multi-form-form {
|
|
18
|
+
min-width: 170px;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.d4-multi-form-form.temp {
|
|
22
|
+
position: absolute;
|
|
23
|
+
visibility: hidden;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.d4-multi-form-value {
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.d4-multi-form #vlist {
|
|
30
|
+
height: initial;
|
|
31
|
+
overflow-x: visible!important;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.d4-multi-form .ui-input-editor {
|
|
35
|
+
padding: initial;
|
|
36
|
+
}
|
package/package.json
CHANGED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as DG from 'datagrok-api/dg';
|
|
2
|
+
import '../../css/forms.css';
|
|
3
|
+
export declare class FormsViewer extends DG.JsViewer {
|
|
4
|
+
get type(): string;
|
|
5
|
+
fieldsColumnNames: string[];
|
|
6
|
+
colorCode: boolean;
|
|
7
|
+
showCurrentRow: boolean;
|
|
8
|
+
showMouseOverRow: boolean;
|
|
9
|
+
showSelectedRows: boolean;
|
|
10
|
+
showFixedRows: boolean;
|
|
11
|
+
indexes: number[];
|
|
12
|
+
columnHeadersDiv: HTMLDivElement;
|
|
13
|
+
virtualView: DG.VirtualView;
|
|
14
|
+
set dataframe(df: DG.DataFrame);
|
|
15
|
+
set fixedRowNumbers(idxs: number[]);
|
|
16
|
+
set columns(colNames: string[]);
|
|
17
|
+
constructor();
|
|
18
|
+
onTableAttached(): void;
|
|
19
|
+
onPropertyChanged(property: DG.Property): void;
|
|
20
|
+
renderHeader(): void;
|
|
21
|
+
get currentRowPos(): 0 | null;
|
|
22
|
+
get mouseOverPos(): 0 | 1 | null;
|
|
23
|
+
renderForm(row: number): HTMLDivElement;
|
|
24
|
+
render(): void;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=forms-viewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forms-viewer.d.ts","sourceRoot":"","sources":["forms-viewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAQtC,OAAO,qBAAqB,CAAC;AAG7B,qBAAa,WAAY,SAAQ,EAAE,CAAC,QAAQ;IAE1C,IAAI,IAAI,IAAI,MAAM,CAA0B;IAE5C,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,UAAS;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,EAAE,cAAc,CAAC;IACjC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC;IAG5B,IAAI,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,EAG7B;IAED,IAAI,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAOjC;IAED,IAAI,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,EAG7B;;IAwBD,eAAe;IAoBf,iBAAiB,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,GAAG,IAAI;IAO9C,YAAY;IAkBZ,IAAI,aAAa,aAA6C;IAC9D,IAAI,YAAY,iBAA2E;IAE3F,UAAU,CAAC,GAAG,EAAE,MAAM;IAqCtB,MAAM;CAcP"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import * as DG from 'datagrok-api/dg';
|
|
2
|
+
import * as ui from 'datagrok-api/ui';
|
|
3
|
+
import * as grok from 'datagrok-api/grok';
|
|
4
|
+
import { filter } from 'rxjs/operators';
|
|
5
|
+
import '../../css/forms.css';
|
|
6
|
+
export class FormsViewer extends DG.JsViewer {
|
|
7
|
+
get type() { return 'FormsViewer'; }
|
|
8
|
+
set dataframe(df) {
|
|
9
|
+
this.dataFrame = df;
|
|
10
|
+
this.onTableAttached();
|
|
11
|
+
}
|
|
12
|
+
set fixedRowNumbers(idxs) {
|
|
13
|
+
this.indexes = idxs;
|
|
14
|
+
this.showCurrentRow = false;
|
|
15
|
+
this.showMouseOverRow = false;
|
|
16
|
+
this.showSelectedRows = false;
|
|
17
|
+
this.showFixedRows = true;
|
|
18
|
+
this.render();
|
|
19
|
+
}
|
|
20
|
+
set columns(colNames) {
|
|
21
|
+
this.fieldsColumnNames = colNames;
|
|
22
|
+
this.render();
|
|
23
|
+
}
|
|
24
|
+
constructor() {
|
|
25
|
+
super();
|
|
26
|
+
this.showFixedRows = false;
|
|
27
|
+
// properties
|
|
28
|
+
this.fieldsColumnNames = this.addProperty('fieldsColumnNames', DG.TYPE.COLUMN_LIST);
|
|
29
|
+
this.colorCode = this.bool('colorCode', true);
|
|
30
|
+
this.showCurrentRow = this.bool('showCurrentRow', true);
|
|
31
|
+
this.showMouseOverRow = this.bool('showMouseOverRow', true);
|
|
32
|
+
this.showSelectedRows = this.bool('showSelectedRows', true);
|
|
33
|
+
//fields
|
|
34
|
+
this.indexes = [];
|
|
35
|
+
// init
|
|
36
|
+
this.root.classList.add('d4-multi-form');
|
|
37
|
+
this.columnHeadersDiv = ui.div([], 'd4-multi-form-header');
|
|
38
|
+
this.virtualView = ui.virtualView(0, (i) => this.renderForm(i), false, 1);
|
|
39
|
+
const formWithHeaderDiv = ui.divH([this.columnHeadersDiv, this.virtualView.root]);
|
|
40
|
+
formWithHeaderDiv.setAttribute('style', 'overflow:visible!important');
|
|
41
|
+
this.root.appendChild(formWithHeaderDiv);
|
|
42
|
+
}
|
|
43
|
+
onTableAttached() {
|
|
44
|
+
if (this.fieldsColumnNames === null)
|
|
45
|
+
this.fieldsColumnNames = this.dataFrame.columns.names();
|
|
46
|
+
const sub = (stream, action) => {
|
|
47
|
+
this.subs.push(DG.debounce(stream, 50).subscribe((_) => action()));
|
|
48
|
+
};
|
|
49
|
+
sub(this.dataFrame.selection.onChanged, () => this.render());
|
|
50
|
+
sub(this.dataFrame.filter.onChanged, () => this.render());
|
|
51
|
+
sub(this.dataFrame.onCurrentRowChanged.pipe(filter((_) => this.showCurrentRow)), () => this.virtualView.refreshItem(this.currentRowPos));
|
|
52
|
+
sub(this.dataFrame.onMouseOverRowChanged.pipe(filter((_) => this.showMouseOverRow)), () => this.virtualView.refreshItem(this.mouseOverPos));
|
|
53
|
+
this.render();
|
|
54
|
+
}
|
|
55
|
+
onPropertyChanged(property) {
|
|
56
|
+
if (property.name === 'showCurrentRow' || property.name === 'showMouseOverRow' || property.name === 'showSelectedRows' &&
|
|
57
|
+
property.get(this) === true && this.showFixedRows)
|
|
58
|
+
grok.shell.warning(`Cannot set ${property.name} to true since fixed rows are set`);
|
|
59
|
+
this.render();
|
|
60
|
+
}
|
|
61
|
+
renderHeader() {
|
|
62
|
+
ui.empty(this.columnHeadersDiv);
|
|
63
|
+
const form = this.renderForm(0);
|
|
64
|
+
form.classList.add('temp');
|
|
65
|
+
document.body.appendChild(form);
|
|
66
|
+
for (const name of this.fieldsColumnNames) {
|
|
67
|
+
const formField = form.querySelector('[column="' + name + '"]');
|
|
68
|
+
if (formField) {
|
|
69
|
+
const columnLabel = ui.bind(this.dataFrame.col(name), ui.divText(name, 'd4-multi-form-column-name'));
|
|
70
|
+
columnLabel.style.top = `${formField.offsetTop + 10}px`;
|
|
71
|
+
this.columnHeadersDiv.appendChild(columnLabel);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
form.remove();
|
|
75
|
+
}
|
|
76
|
+
get currentRowPos() { return this.showCurrentRow ? 0 : null; }
|
|
77
|
+
get mouseOverPos() { return this.showMouseOverRow ? (this.showCurrentRow ? 1 : 0) : null; }
|
|
78
|
+
renderForm(row) {
|
|
79
|
+
if (this.showCurrentRow && row === this.currentRowPos)
|
|
80
|
+
row = this.dataFrame.currentRowIdx;
|
|
81
|
+
else if (this.showMouseOverRow && row === this.mouseOverPos)
|
|
82
|
+
row = this.dataFrame.mouseOverRowIdx;
|
|
83
|
+
else
|
|
84
|
+
row = this.indexes[row - (this.showCurrentRow ? 1 : 0) - (this.showMouseOverRow ? 1 : 0)];
|
|
85
|
+
const form = ui.divV(this.fieldsColumnNames.map((name) => {
|
|
86
|
+
var _a;
|
|
87
|
+
if (row === -1)
|
|
88
|
+
return ui.div();
|
|
89
|
+
const input = DG.InputBase.forColumn(this.dataFrame.col(name));
|
|
90
|
+
if (input) {
|
|
91
|
+
input.input.setAttribute('column', name);
|
|
92
|
+
input.value = this.dataFrame.get(name, row);
|
|
93
|
+
if (this.colorCode) {
|
|
94
|
+
const grid = ((_a = this.view) !== null && _a !== void 0 ? _a : grok.shell.tv).grid;
|
|
95
|
+
const color = grid.cell(name, row).color;
|
|
96
|
+
input.input.style.color = DG.Color.toHtml(DG.Color.getContrastColor(color));
|
|
97
|
+
input.input.style.backgroundColor = DG.Color.toHtml(color);
|
|
98
|
+
}
|
|
99
|
+
return input.input;
|
|
100
|
+
}
|
|
101
|
+
return ui.div();
|
|
102
|
+
}), 'd4-multi-form-form');
|
|
103
|
+
form.onclick = () => this.dataFrame.currentRowIdx = row;
|
|
104
|
+
form.onmouseenter = () => this.dataFrame.mouseOverRowIdx = row;
|
|
105
|
+
form.onmouseleave = () => this.dataFrame.mouseOverRowIdx = -1;
|
|
106
|
+
return form;
|
|
107
|
+
}
|
|
108
|
+
render() {
|
|
109
|
+
if (!this.showFixedRows) {
|
|
110
|
+
if (this.showSelectedRows)
|
|
111
|
+
this.indexes = this.dataFrame.selection.trueCount > 0 ? Array.from(this.dataFrame.selection.getSelectedIndexes()) : [];
|
|
112
|
+
}
|
|
113
|
+
ui.empty(this.columnHeadersDiv);
|
|
114
|
+
this.renderHeader();
|
|
115
|
+
this.virtualView.setData(this.indexes.length + (this.showCurrentRow ? 1 : 0) + (this.showMouseOverRow ? 1 : 0), (i) => this.renderForm(i));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybXMtdmlld2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZm9ybXMtdmlld2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEtBQUssSUFBSSxNQUFNLG1CQUFtQixDQUFDO0FBRzFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUd4QyxPQUFPLHFCQUFxQixDQUFDO0FBRzdCLE1BQU0sT0FBTyxXQUFZLFNBQVEsRUFBRSxDQUFDLFFBQVE7SUFFMUMsSUFBSSxJQUFJLEtBQWEsT0FBTyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBYTVDLElBQUksU0FBUyxDQUFDLEVBQWdCO1FBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBSSxlQUFlLENBQUMsSUFBYztRQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQzlCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxRQUFrQjtRQUM1QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsUUFBUSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRUQ7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQTFCVixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQTRCcEIsYUFBYTtR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UyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5cbmltcG9ydCAnLi4vLi4vY3NzL2Zvcm1zLmNzcyc7XG5cblxuZXhwb3J0IGNsYXNzIEZvcm1zVmlld2VyIGV4dGVuZHMgREcuSnNWaWV3ZXIge1xuXG4gIGdldCB0eXBlKCk6IHN0cmluZyB7IHJldHVybiAnRm9ybXNWaWV3ZXInOyB9XG5cbiAgZmllbGRzQ29sdW1uTmFtZXM6IHN0cmluZ1tdO1xuICBjb2xvckNvZGU6IGJvb2xlYW47XG4gIHNob3dDdXJyZW50Um93OiBib29sZWFuO1xuICBzaG93TW91c2VPdmVyUm93OiBib29sZWFuO1xuICBzaG93U2VsZWN0ZWRSb3dzOiBib29sZWFuO1xuICBzaG93Rml4ZWRSb3dzID0gZmFsc2U7XG4gIGluZGV4ZXM6IG51bWJlcltdO1xuICBjb2x1bW5IZWFkZXJzRGl2OiBIVE1MRGl2RWxlbWVudDtcbiAgdmlydHVhbFZpZXc6IERHLlZpcnR1YWxWaWV3O1xuXG5cbiAgc2V0IGRhdGFmcmFtZShkZjogREcuRGF0YUZyYW1lKSB7XG4gICAgdGhpcy5kYXRhRnJhbWUgPSBkZjtcbiAgICB0aGlzLm9uVGFibGVBdHRhY2hlZCgpO1xuICB9XG5cbiAgc2V0IGZpeGVkUm93TnVtYmVycyhpZHhzOiBudW1iZXJbXSkge1xuICAgIHRoaXMuaW5kZXhlcyA9IGlkeHM7XG4gICAgdGhpcy5zaG93Q3VycmVudFJvdyA9IGZhbHNlO1xuICAgIHRoaXMuc2hvd01vdXNlT3ZlclJvdyA9IGZhbHNlO1xuICAgIHRoaXMuc2hvd1NlbGVjdGVkUm93cyA9IGZhbHNlO1xuICAgIHRoaXMuc2hvd0ZpeGVkUm93cyA9IHRydWU7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIHNldCBjb2x1bW5zKGNvbE5hbWVzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZmllbGRzQ29sdW1uTmFtZXMgPSBjb2xOYW1lcztcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIHByb3BlcnRpZXNcbiAgICB0aGlzLmZpZWxkc0NvbHVtbk5hbWVzID0gdGhpcy5hZGRQcm9wZXJ0eSgnZmllbGRzQ29sdW1uTmFtZXMnLCBERy5UWVBFLkNPTFVNTl9MSVNUKTtcbiAgICB0aGlzLmNvbG9yQ29kZSA9IHRoaXMuYm9vbCgnY29sb3JDb2RlJywgdHJ1ZSk7XG4gICAgdGhpcy5zaG93Q3VycmVudFJvdyA9IHRoaXMuYm9vbCgnc2hvd0N1cnJlbnRSb3cnLCB0cnVlKTtcbiAgICB0aGlzLnNob3dNb3VzZU92ZXJSb3cgPSB0aGlzLmJvb2woJ3Nob3dNb3VzZU92ZXJSb3cnLCB0cnVlKTtcbiAgICB0aGlzLnNob3dTZWxlY3RlZFJvd3MgPSB0aGlzLmJvb2woJ3Nob3dTZWxlY3RlZFJvd3MnLCB0cnVlKTtcblxuICAgIC8vZmllbGRzXG4gICAgdGhpcy5pbmRleGVzID0gW107XG5cbiAgICAvLyBpbml0XG4gICAgdGhpcy5yb290LmNsYXNzTGlzdC5hZGQoJ2Q0LW11bHRpLWZvcm0nKTtcbiAgICB0aGlzLmNvbHVtbkhlYWRlcnNEaXYgPSB1aS5kaXYoW10sICdkNC1tdWx0aS1mb3JtLWhlYWRlcicpO1xuICAgIHRoaXMudmlydHVhbFZpZXcgPSB1aS52aXJ0dWFsVmlldygwLCAoaTogbnVtYmVyKSA9PiB0aGlzLnJlbmRlckZvcm0oaSksIGZhbHNlLCAxKTtcbiAgICBjb25zdCBmb3JtV2l0aEhlYWRlckRpdiA9IHVpLmRpdkgoW3RoaXMuY29sdW1uSGVhZGVyc0RpdiwgdGhpcy52aXJ0dWFsVmlldy5yb290XSk7XG4gICAgZm9ybVdpdGhIZWFkZXJEaXYuc2V0QXR0cmlidXRlKCdzdHlsZScsICdvdmVyZmxvdzp2aXNpYmxlIWltcG9ydGFudCcpO1xuICAgIHRoaXMucm9vdC5hcHBlbmRDaGlsZChmb3JtV2l0aEhlYWRlckRpdik7XG4gIH1cblxuICBvblRhYmxlQXR0YWNoZWQoKSB7XG4gICAgaWYgKHRoaXMuZmllbGRzQ29sdW1uTmFtZXMgPT09IG51bGwpXG4gICAgICB0aGlzLmZpZWxkc0NvbHVtbk5hbWVzID0gdGhpcy5kYXRhRnJhbWUuY29sdW1ucy5uYW1lcygpO1xuXG4gICAgY29uc3Qgc3ViID0gKHN0cmVhbTogT2JzZXJ2YWJsZTx1bmtub3duPiwgYWN0aW9uOiBGdW5jdGlvbikgPT4ge1xuICAgICAgdGhpcy5zdWJzLnB1c2goREcuZGVib3VuY2Uoc3RyZWFtLCA1MCkuc3Vic2NyaWJlKChfKSA9PiBhY3Rpb24oKSkpO1xuICAgIH07XG5cbiAgICBzdWIodGhpcy5kYXRhRnJhbWUuc2VsZWN0aW9uLm9uQ2hhbmdlZCwgKCkgPT4gdGhpcy5yZW5kZXIoKSk7XG4gICAgc3ViKHRoaXMuZGF0YUZyYW1lLmZpbHRlci5vbkNoYW5nZWQsICgpID0+IHRoaXMucmVuZGVyKCkpO1xuXG4gICAgc3ViKHRoaXMuZGF0YUZyYW1lLm9uQ3VycmVudFJvd0NoYW5nZWQucGlwZShmaWx0ZXIoKF8pID0+IHRoaXMuc2hvd0N1cnJlbnRSb3cpKSxcbiAgICAgICgpID0+IHRoaXMudmlydHVhbFZpZXcucmVmcmVzaEl0ZW0odGhpcy5jdXJyZW50Um93UG9zISkpO1xuXG4gICAgc3ViKHRoaXMuZGF0YUZyYW1lLm9uTW91c2VPdmVyUm93Q2hhbmdlZC5waXBlKGZpbHRlcigoXykgPT4gdGhpcy5zaG93TW91c2VPdmVyUm93KSksXG4gICAgICAoKSA9PiB0aGlzLnZpcnR1YWxWaWV3LnJlZnJlc2hJdGVtKHRoaXMubW91c2VPdmVyUG9zISkpO1xuXG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIG9uUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5OiBERy5Qcm9wZXJ0eSk6IHZvaWQge1xuICAgIGlmIChwcm9wZXJ0eS5uYW1lID09PSAnc2hvd0N1cnJlbnRSb3cnIHx8IHByb3BlcnR5Lm5hbWUgPT09ICdzaG93TW91c2VPdmVyUm93JyB8fCBwcm9wZXJ0eS5uYW1lID09PSAnc2hvd1NlbGVjdGVkUm93cycgJiZcbiAgICAgIHByb3BlcnR5LmdldCh0aGlzKSA9PT0gdHJ1ZSAmJiB0aGlzLnNob3dGaXhlZFJvd3MpXG4gICAgICBncm9rLnNoZWxsLndhcm5pbmcoYENhbm5vdCBzZXQgJHtwcm9wZXJ0eS5uYW1lfSB0byB0cnVlIHNpbmNlIGZpeGVkIHJvd3MgYXJlIHNldGApO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICByZW5kZXJIZWFkZXIoKSB7XG4gICAgdWkuZW1wdHkodGhpcy5jb2x1bW5IZWFkZXJzRGl2KTtcbiAgICBjb25zdCBmb3JtID0gdGhpcy5yZW5kZXJGb3JtKDApO1xuICAgIGZvcm0uY2xhc3NMaXN0LmFkZCgndGVtcCcpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZm9ybSk7XG5cbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdGhpcy5maWVsZHNDb2x1bW5OYW1lcykge1xuICAgICAgY29uc3QgZm9ybUZpZWxkID0gZm9ybS5xdWVyeVNlbGVjdG9yKCdbY29sdW1uPVwiJyArIG5hbWUgKyAnXCJdJyk7XG4gICAgICBpZiAoZm9ybUZpZWxkKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbkxhYmVsID0gdWkuYmluZCh0aGlzLmRhdGFGcmFtZS5jb2wobmFtZSksIHVpLmRpdlRleHQobmFtZSwgJ2Q0LW11bHRpLWZvcm0tY29sdW1uLW5hbWUnKSk7XG4gICAgICAgIGNvbHVtbkxhYmVsLnN0eWxlLnRvcCA9IGAkeyhmb3JtRmllbGQgYXMgSFRNTEVsZW1lbnQpLm9mZnNldFRvcCArIDEwfXB4YDtcbiAgICAgICAgdGhpcy5jb2x1bW5IZWFkZXJzRGl2LmFwcGVuZENoaWxkKGNvbHVtbkxhYmVsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3JtLnJlbW92ZSgpO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRSb3dQb3MoKSB7IHJldHVybiB0aGlzLnNob3dDdXJyZW50Um93ID8gMCA6IG51bGw7IH1cbiAgZ2V0IG1vdXNlT3ZlclBvcygpIHsgcmV0dXJuIHRoaXMuc2hvd01vdXNlT3ZlclJvdyA/ICh0aGlzLnNob3dDdXJyZW50Um93ID8gMSA6IDApIDogbnVsbDsgfVxuXG4gIHJlbmRlckZvcm0ocm93OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5zaG93Q3VycmVudFJvdyAmJiByb3cgPT09IHRoaXMuY3VycmVudFJvd1BvcylcbiAgICAgIHJvdyA9IHRoaXMuZGF0YUZyYW1lLmN1cnJlbnRSb3dJZHg7XG4gICAgZWxzZSBpZiAodGhpcy5zaG93TW91c2VPdmVyUm93ICYmIHJvdyA9PT0gdGhpcy5tb3VzZU92ZXJQb3MpXG4gICAgICByb3cgPSB0aGlzLmRhdGFGcmFtZS5tb3VzZU92ZXJSb3dJZHg7XG4gICAgZWxzZVxuICAgICAgcm93ID0gdGhpcy5pbmRleGVzW3JvdyAtICh0aGlzLnNob3dDdXJyZW50Um93ID8gMSA6IDApIC0gKHRoaXMuc2hvd01vdXNlT3ZlclJvdyA/IDEgOiAwKV07XG5cbiAgICBjb25zdCBmb3JtID0gdWkuZGl2VihcbiAgICAgIHRoaXMuZmllbGRzQ29sdW1uTmFtZXMubWFwKChuYW1lKSA9PiB7XG4gICAgICAgIGlmIChyb3cgPT09IC0xKVxuICAgICAgICAgIHJldHVybiB1aS5kaXYoKTtcblxuICAgICAgICBjb25zdCBpbnB1dCA9IERHLklucHV0QmFzZS5mb3JDb2x1bW4odGhpcy5kYXRhRnJhbWUuY29sKG5hbWUpISk7XG4gICAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAgIGlucHV0LmlucHV0LnNldEF0dHJpYnV0ZSgnY29sdW1uJywgbmFtZSk7XG4gICAgICAgICAgaW5wdXQudmFsdWUgPSB0aGlzLmRhdGFGcmFtZS5nZXQobmFtZSwgcm93KTtcblxuICAgICAgICAgIGlmICh0aGlzLmNvbG9yQ29kZSkge1xuICAgICAgICAgICAgY29uc3QgZ3JpZCA9ICgodGhpcy52aWV3ID8/IGdyb2suc2hlbGwudHYpIGFzIERHLlRhYmxlVmlldykuZ3JpZDtcbiAgICAgICAgICAgIGNvbnN0IGNvbG9yID0gZ3JpZC5jZWxsKG5hbWUsIHJvdykuY29sb3I7XG4gICAgICAgICAgICBpbnB1dC5pbnB1dC5zdHlsZS5jb2xvciA9IERHLkNvbG9yLnRvSHRtbChERy5Db2xvci5nZXRDb250cmFzdENvbG9yKGNvbG9yKSk7XG4gICAgICAgICAgICBpbnB1dC5pbnB1dC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBERy5Db2xvci50b0h0bWwoY29sb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBpbnB1dC5pbnB1dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdWkuZGl2KCk7XG4gICAgICB9LFxuICAgICAgKSwgJ2Q0LW11bHRpLWZvcm0tZm9ybScpO1xuXG4gICAgZm9ybS5vbmNsaWNrID0gKCkgPT4gdGhpcy5kYXRhRnJhbWUuY3VycmVudFJvd0lkeCA9IHJvdztcbiAgICBmb3JtLm9ubW91c2VlbnRlciA9ICgpID0+IHRoaXMuZGF0YUZyYW1lLm1vdXNlT3ZlclJvd0lkeCA9IHJvdztcbiAgICBmb3JtLm9ubW91c2VsZWF2ZSA9ICgpID0+IHRoaXMuZGF0YUZyYW1lLm1vdXNlT3ZlclJvd0lkeCA9IC0xO1xuICAgIHJldHVybiBmb3JtO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGlmICghdGhpcy5zaG93Rml4ZWRSb3dzKSB7XG4gICAgICBpZiAodGhpcy5zaG93U2VsZWN0ZWRSb3dzKVxuICAgICAgICB0aGlzLmluZGV4ZXMgPSB0aGlzLmRhdGFGcmFtZS5zZWxlY3Rpb24udHJ1ZUNvdW50ID4gMCA/IEFycmF5LmZyb20odGhpcy5kYXRhRnJhbWUuc2VsZWN0aW9uLmdldFNlbGVjdGVkSW5kZXhlcygpKSA6IFtdO1xuICAgIH1cblxuICAgIHVpLmVtcHR5KHRoaXMuY29sdW1uSGVhZGVyc0Rpdik7XG5cbiAgICB0aGlzLnJlbmRlckhlYWRlcigpO1xuXG4gICAgdGhpcy52aXJ0dWFsVmlldy5zZXREYXRhKFxuICAgICAgdGhpcy5pbmRleGVzLmxlbmd0aCArICh0aGlzLnNob3dDdXJyZW50Um93ID8gMSA6IDApICsgKHRoaXMuc2hvd01vdXNlT3ZlclJvdyA/IDEgOiAwKSxcbiAgICAgIChpOiBudW1iZXIpID0+IHRoaXMucmVuZGVyRm9ybShpKSk7XG4gIH1cbn1cbiJdfQ==
|