@datagrok-libraries/utils 1.17.2 → 1.17.3
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/computation-view.css +7 -0
- package/css/shared-components.css +4 -0
- package/package.json +1 -1
- package/src/function-view.d.ts +0 -21
- package/src/function-view.d.ts.map +1 -1
- package/src/function-view.js +30 -324
- package/src/history-utils.d.ts +8 -1
- package/src/history-utils.d.ts.map +1 -1
- package/src/history-utils.js +4 -3
- package/src/shared-components/history-input.d.ts.map +1 -1
- package/src/shared-components/history-input.js +23 -4
- package/src/shared-components/history-panel.d.ts +41 -0
- package/src/shared-components/history-panel.d.ts.map +1 -0
- package/src/shared-components/history-panel.js +402 -0
- package/src/shared-components/ui-utils.d.ts +2 -0
- package/src/shared-components/ui-utils.d.ts.map +1 -1
- package/src/shared-components/ui-utils.js +6 -1
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
/* eslint-disable max-len */
|
|
11
|
+
import * as grok from 'datagrok-api/grok';
|
|
12
|
+
import * as ui from 'datagrok-api/ui';
|
|
13
|
+
import * as DG from 'datagrok-api/dg';
|
|
14
|
+
import dayjs from 'dayjs';
|
|
15
|
+
import { BehaviorSubject, Subject } from 'rxjs';
|
|
16
|
+
import { defaultUsersIds } from '../function-view';
|
|
17
|
+
import { historyUtils } from '../history-utils';
|
|
18
|
+
export class HistoryPanel {
|
|
19
|
+
constructor(func) {
|
|
20
|
+
this.func = func;
|
|
21
|
+
// Emitted when FuncCall should is chosen. Contains FuncCall ID
|
|
22
|
+
this.onRunChosen = new Subject();
|
|
23
|
+
// Emitted when FuncCall is added to favorites
|
|
24
|
+
this.onRunAddToFavorites = new Subject();
|
|
25
|
+
// Emitted when FuncCall is added to shared
|
|
26
|
+
this.onRunAddToShared = new Subject();
|
|
27
|
+
// Emitted when FuncCall is removed from favorites
|
|
28
|
+
this.onRunRemoveFromFavorites = new Subject();
|
|
29
|
+
// Emitted when FuncCall is removed from shared
|
|
30
|
+
this.onRunRemoveFromShared = new Subject();
|
|
31
|
+
// Emitted when FuncCall is deleted
|
|
32
|
+
this.onRunDeleted = new Subject();
|
|
33
|
+
this.store = {
|
|
34
|
+
filteringOptions: { text: '' },
|
|
35
|
+
allRuns: new Subject,
|
|
36
|
+
myRuns: new BehaviorSubject([]),
|
|
37
|
+
favoriteRuns: new BehaviorSubject([]),
|
|
38
|
+
sharedRuns: new BehaviorSubject([]),
|
|
39
|
+
filteredMyRuns: new BehaviorSubject([]),
|
|
40
|
+
filteredFavoriteRuns: new BehaviorSubject([]),
|
|
41
|
+
filteredSharedRuns: new BehaviorSubject([]),
|
|
42
|
+
};
|
|
43
|
+
this.myRunsFilter = new Subject();
|
|
44
|
+
this.favRunsFilter = new Subject();
|
|
45
|
+
this.sharedRunsFilter = new Subject();
|
|
46
|
+
this.allRunsFetch = new Subject();
|
|
47
|
+
this.myRunsFetch = new Subject();
|
|
48
|
+
this.favRunsFetch = new Subject();
|
|
49
|
+
this.sharedRunsFetch = new Subject();
|
|
50
|
+
this.historyTab = ui.div();
|
|
51
|
+
this.favTab = ui.div();
|
|
52
|
+
this.sharedTab = ui.div();
|
|
53
|
+
this.tabs = ui.tabControl({
|
|
54
|
+
'HISTORY': ui.box(this.historyTab),
|
|
55
|
+
'FAVORITES': ui.box(this.favTab),
|
|
56
|
+
'SHARED': ui.box(this.sharedTab),
|
|
57
|
+
});
|
|
58
|
+
this.filterPane = ui.div();
|
|
59
|
+
this._root = ui.divV([
|
|
60
|
+
ui.panel([
|
|
61
|
+
ui.h2('History'),
|
|
62
|
+
this.filterPane,
|
|
63
|
+
]),
|
|
64
|
+
ui.element('div', 'splitbar-horizontal'),
|
|
65
|
+
this.tabs.root,
|
|
66
|
+
], { style: { width: '100%' } });
|
|
67
|
+
this.myCards = [];
|
|
68
|
+
this.favoriteCards = [];
|
|
69
|
+
this.sharedCards = [];
|
|
70
|
+
this.tabs.root.style.width = '100%';
|
|
71
|
+
this.tabs.header.style.justifyContent = 'space-between';
|
|
72
|
+
this.store.myRuns.subscribe((myRuns) => this.store.filteredMyRuns.next(myRuns));
|
|
73
|
+
this.store.favoriteRuns.subscribe((favoriteRuns) => this.store.filteredFavoriteRuns.next(favoriteRuns));
|
|
74
|
+
this.store.sharedRuns.subscribe((sharedRuns) => this.store.filteredSharedRuns.next(sharedRuns));
|
|
75
|
+
this.store.filteredMyRuns.subscribe((myRuns) => this.updateMyPane(myRuns));
|
|
76
|
+
this.store.filteredFavoriteRuns.subscribe((newFavoriteRuns) => this.updateFavoritesPane(newFavoriteRuns));
|
|
77
|
+
this.store.filteredSharedRuns.subscribe((sharedRuns) => this.updateSharedPane(sharedRuns));
|
|
78
|
+
this.myRunsFilter.subscribe(() => {
|
|
79
|
+
const filteredMyRuns = this.store.myRuns.value.filter((val) => {
|
|
80
|
+
const startedAfter = (this.store.filteringOptions.startedAfter ? val.started > this.store.filteringOptions.startedAfter : true);
|
|
81
|
+
const titleContainsText = !!val.options['title'] && val.options['title'].includes(this.store.filteringOptions.text);
|
|
82
|
+
const descContainsText = !!val.options['description'] && val.options['description'].includes(this.store.filteringOptions.text);
|
|
83
|
+
return (titleContainsText || descContainsText) && startedAfter;
|
|
84
|
+
});
|
|
85
|
+
this.store.filteredMyRuns.next(filteredMyRuns);
|
|
86
|
+
});
|
|
87
|
+
this.favRunsFilter.subscribe(() => {
|
|
88
|
+
const filteredFavRuns = this.store.favoriteRuns.value.filter((val) => {
|
|
89
|
+
const startedAfter = (this.store.filteringOptions.startedAfter ? val.started > this.store.filteringOptions.startedAfter : true);
|
|
90
|
+
const titleContainsText = !!val.options['title'] && val.options['title'].includes(this.store.filteringOptions.text);
|
|
91
|
+
const descContainsText = !!val.options['description'] && val.options['description'].includes(this.store.filteringOptions.text);
|
|
92
|
+
return (titleContainsText || descContainsText) && startedAfter;
|
|
93
|
+
});
|
|
94
|
+
this.store.filteredFavoriteRuns.next(filteredFavRuns);
|
|
95
|
+
});
|
|
96
|
+
this.sharedRunsFilter.subscribe(() => {
|
|
97
|
+
const filteredSharedRuns = this.store.sharedRuns.value.filter((val) => {
|
|
98
|
+
const startedAfter = (this.store.filteringOptions.startedAfter ? val.started > this.store.filteringOptions.startedAfter : true);
|
|
99
|
+
const isAuthored = this.store.filteringOptions.author ? val.author.id === this.store.filteringOptions.author.id : true;
|
|
100
|
+
const titleContainsText = !!val.options['title'] && val.options['title'].includes(this.store.filteringOptions.text);
|
|
101
|
+
const descContainsText = !!val.options['description'] && val.options['description'].includes(this.store.filteringOptions.text);
|
|
102
|
+
return (titleContainsText || descContainsText) && startedAfter && isAuthored;
|
|
103
|
+
});
|
|
104
|
+
this.store.filteredSharedRuns.next(filteredSharedRuns);
|
|
105
|
+
});
|
|
106
|
+
this.store.allRuns.subscribe((allRuns) => {
|
|
107
|
+
this.store.myRuns.next(allRuns.filter((run) => run.author.id === grok.shell.user.id));
|
|
108
|
+
this.store.favoriteRuns.next(allRuns.filter((run) => run.options['isFavorite'] && !run.options['isImported']));
|
|
109
|
+
this.store.sharedRuns.next(allRuns.filter((run) => run.options['isShared']));
|
|
110
|
+
});
|
|
111
|
+
this.allRunsFetch.subscribe(() => __awaiter(this, void 0, void 0, function* () {
|
|
112
|
+
const allRuns = (yield historyUtils.pullRunsByName(this.func.name, [], { order: 'started' }, ['session.user', 'options'])).reverse();
|
|
113
|
+
this.store.allRuns.next(allRuns);
|
|
114
|
+
}));
|
|
115
|
+
this.myRunsFetch.subscribe(() => __awaiter(this, void 0, void 0, function* () {
|
|
116
|
+
const myRuns = (yield historyUtils.pullRunsByName(this.func.name, [{ author: grok.shell.user }], { order: 'started' }, ['session.user', 'options'])).reverse();
|
|
117
|
+
this.store.filteredMyRuns.next(myRuns);
|
|
118
|
+
}));
|
|
119
|
+
this.favRunsFetch.subscribe(() => __awaiter(this, void 0, void 0, function* () {
|
|
120
|
+
const myRuns = (yield historyUtils.pullRunsByName(this.func.name, [{ author: grok.shell.user }], { order: 'started' }, ['session.user', 'options'])).reverse();
|
|
121
|
+
this.store.filteredFavoriteRuns.next(myRuns.filter((run) => run.options['isFavorite'] && !run.options['isImported']));
|
|
122
|
+
}));
|
|
123
|
+
this.sharedRunsFetch.subscribe(() => __awaiter(this, void 0, void 0, function* () {
|
|
124
|
+
const sharedRuns = (yield historyUtils.pullRunsByName(this.func.name, [], { order: 'started' }, ['session.user', 'options'])).reverse();
|
|
125
|
+
this.store.filteredSharedRuns.next(sharedRuns.filter((run) => run.options['isShared']));
|
|
126
|
+
}));
|
|
127
|
+
this.allRunsFetch.next();
|
|
128
|
+
this.updateFilterPane();
|
|
129
|
+
}
|
|
130
|
+
updateFilterPane() {
|
|
131
|
+
const buildFilterPane = () => {
|
|
132
|
+
return ui.wait(() => __awaiter(this, void 0, void 0, function* () {
|
|
133
|
+
const filteringText = new Subject();
|
|
134
|
+
const textInput = ui.stringInput('Search', '', (v) => filteringText.next(v));
|
|
135
|
+
DG.debounce(filteringText.asObservable(), 600).subscribe(() => {
|
|
136
|
+
this.store.filteringOptions.text = textInput.stringValue;
|
|
137
|
+
this.favRunsFilter.next();
|
|
138
|
+
this.sharedRunsFilter.next();
|
|
139
|
+
});
|
|
140
|
+
const dateInput = ui.dateInput('Started after', dayjs().subtract(1, 'week'), (v) => {
|
|
141
|
+
this.store.filteringOptions.startedAfter = v;
|
|
142
|
+
this.myRunsFilter.next();
|
|
143
|
+
this.favRunsFilter.next();
|
|
144
|
+
this.sharedRunsFilter.next();
|
|
145
|
+
});
|
|
146
|
+
const defaultUsers = Object.values(defaultUsersIds);
|
|
147
|
+
const allUsers = yield grok.dapi.users.list();
|
|
148
|
+
const filteredUsers = allUsers.filter((user) => !defaultUsers.includes(user.id));
|
|
149
|
+
const authorInput = ui.choiceInput('Author', 'Anyone', ['Anyone', ...filteredUsers], (v) => {
|
|
150
|
+
this.store.filteringOptions.author = (v === 'Anyone') ? undefined : v;
|
|
151
|
+
this.sharedRunsFilter.next();
|
|
152
|
+
});
|
|
153
|
+
dateInput.addPatternMenu('datetime');
|
|
154
|
+
const form = ui.divV([
|
|
155
|
+
textInput,
|
|
156
|
+
dateInput,
|
|
157
|
+
authorInput,
|
|
158
|
+
], 'ui-form-condensed ui-form');
|
|
159
|
+
form.style.padding = '0px';
|
|
160
|
+
return form;
|
|
161
|
+
}));
|
|
162
|
+
};
|
|
163
|
+
const newFilterPane = buildFilterPane();
|
|
164
|
+
this.filterPane.replaceWith(newFilterPane);
|
|
165
|
+
this.filterPane = newFilterPane;
|
|
166
|
+
}
|
|
167
|
+
;
|
|
168
|
+
showAddToFavoritesDialog(funcCall) {
|
|
169
|
+
var _a, _b;
|
|
170
|
+
let title = (_a = funcCall.options['title']) !== null && _a !== void 0 ? _a : '';
|
|
171
|
+
let annotation = (_b = funcCall.options['annotation']) !== null && _b !== void 0 ? _b : '';
|
|
172
|
+
const titleInput = ui.stringInput('Title', title, (s) => {
|
|
173
|
+
title = s;
|
|
174
|
+
if (s.length === 0) {
|
|
175
|
+
titleInput.setTooltip('Title cannot be empty');
|
|
176
|
+
setTimeout(() => titleInput.input.classList.add('d4-invalid'), 100);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
titleInput.setTooltip('');
|
|
180
|
+
setTimeout(() => titleInput.input.classList.remove('d4-invalid'), 100);
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
ui.dialog({ title: 'Add to favorites' })
|
|
184
|
+
.add(ui.form([
|
|
185
|
+
titleInput,
|
|
186
|
+
ui.stringInput('Annotation', annotation, (s) => { annotation = s; }),
|
|
187
|
+
]))
|
|
188
|
+
.onOK(() => __awaiter(this, void 0, void 0, function* () {
|
|
189
|
+
if (title.length > 0) {
|
|
190
|
+
funcCall = yield historyUtils.loadRun(funcCall.id);
|
|
191
|
+
funcCall.options['title'] = title;
|
|
192
|
+
funcCall.options['annotation'] = annotation;
|
|
193
|
+
this.onRunAddToFavorites.next(funcCall);
|
|
194
|
+
this.myRunsFetch.next();
|
|
195
|
+
this.favRunsFetch.next();
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
grok.shell.warning('Title cannot be empty');
|
|
199
|
+
}
|
|
200
|
+
}))
|
|
201
|
+
.show({ center: true });
|
|
202
|
+
}
|
|
203
|
+
;
|
|
204
|
+
showDeleteRunDialog(funcCall) {
|
|
205
|
+
ui.dialog({ title: 'Delete run' })
|
|
206
|
+
.add(ui.divText('The deleted run is impossible to restore. Are you sure?'))
|
|
207
|
+
.onOK(() => __awaiter(this, void 0, void 0, function* () {
|
|
208
|
+
this.onRunDeleted.next(funcCall.id);
|
|
209
|
+
this.myRunsFetch.next();
|
|
210
|
+
}))
|
|
211
|
+
.show({ center: true });
|
|
212
|
+
}
|
|
213
|
+
;
|
|
214
|
+
showAddToSharedDialog(funcCall) {
|
|
215
|
+
var _a, _b;
|
|
216
|
+
let title = (_a = funcCall.options['title']) !== null && _a !== void 0 ? _a : '';
|
|
217
|
+
let annotation = (_b = funcCall.options['annotation']) !== null && _b !== void 0 ? _b : '';
|
|
218
|
+
const titleInput = ui.stringInput('Title', title, (s) => {
|
|
219
|
+
title = s;
|
|
220
|
+
if (s.length === 0) {
|
|
221
|
+
titleInput.setTooltip('Title cannot be empty');
|
|
222
|
+
setTimeout(() => titleInput.input.classList.add('d4-invalid'), 100);
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
titleInput.setTooltip('');
|
|
226
|
+
setTimeout(() => titleInput.input.classList.remove('d4-invalid'), 100);
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
ui.dialog({ title: 'Add to shared' })
|
|
230
|
+
.add(ui.form([
|
|
231
|
+
titleInput,
|
|
232
|
+
ui.stringInput('Annotation', annotation, (s) => { annotation = s; }),
|
|
233
|
+
]))
|
|
234
|
+
.onOK(() => __awaiter(this, void 0, void 0, function* () {
|
|
235
|
+
if (title.length > 0) {
|
|
236
|
+
funcCall = yield historyUtils.loadRun(funcCall.id);
|
|
237
|
+
funcCall.options['title'] = title;
|
|
238
|
+
funcCall.options['annotation'] = annotation;
|
|
239
|
+
this.onRunAddToShared.next(funcCall);
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
grok.shell.warning('Title cannot be empty');
|
|
243
|
+
}
|
|
244
|
+
}))
|
|
245
|
+
.show({ center: true });
|
|
246
|
+
}
|
|
247
|
+
;
|
|
248
|
+
updateSharedPane(sharedRuns) {
|
|
249
|
+
const newTab = (sharedRuns.length > 0) ? this.renderSharedCards(sharedRuns) : ui.divText('No runs are marked as shared', 'no-elements-label');
|
|
250
|
+
this.sharedTab.replaceWith(newTab);
|
|
251
|
+
this.sharedTab = newTab;
|
|
252
|
+
}
|
|
253
|
+
;
|
|
254
|
+
updateFavoritesPane(favoriteRuns) {
|
|
255
|
+
const newTab = (favoriteRuns.length > 0) ? this.renderFavoriteCards(favoriteRuns) : ui.divText('No runs are marked as favorites', 'no-elements-label');
|
|
256
|
+
this.favTab.replaceWith(newTab);
|
|
257
|
+
this.favTab = newTab;
|
|
258
|
+
}
|
|
259
|
+
;
|
|
260
|
+
updateMyPane(myRuns) {
|
|
261
|
+
const newTab = (myRuns.length > 0) ? this.renderHistoryCards(myRuns) : ui.divText('No runs are found in history', 'no-elements-label');
|
|
262
|
+
this.historyTab.replaceWith(newTab);
|
|
263
|
+
this.historyTab = newTab;
|
|
264
|
+
}
|
|
265
|
+
;
|
|
266
|
+
renderFavoriteCards(funcCalls) {
|
|
267
|
+
this.favoriteCards = funcCalls.map((funcCall) => {
|
|
268
|
+
var _a;
|
|
269
|
+
const unstarIcon = ui.iconFA('star', (ev) => __awaiter(this, void 0, void 0, function* () {
|
|
270
|
+
ev.stopPropagation();
|
|
271
|
+
this.onRunRemoveFromFavorites.next(funcCall.id);
|
|
272
|
+
}), 'Unfavorite the run');
|
|
273
|
+
unstarIcon.classList.add('fas');
|
|
274
|
+
const shareIcon = ui.iconFA('eye', (ev) => __awaiter(this, void 0, void 0, function* () {
|
|
275
|
+
ev.stopPropagation();
|
|
276
|
+
this.showAddToSharedDialog(funcCall);
|
|
277
|
+
}), 'Add to shared');
|
|
278
|
+
shareIcon.classList.add('fal');
|
|
279
|
+
const card = ui.divH([
|
|
280
|
+
ui.divV([
|
|
281
|
+
ui.divText((_a = funcCall.options['title']) !== null && _a !== void 0 ? _a : 'Default title', 'title'),
|
|
282
|
+
...(funcCall.options['annotation']) ? [ui.divText(funcCall.options['annotation'], 'description')] : [],
|
|
283
|
+
ui.divH([ui.render(funcCall.author), ui.span([new Date(funcCall.started.toString()).toLocaleString('en-us', { month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric' })], 'date')]),
|
|
284
|
+
], 'cv-card-content'),
|
|
285
|
+
ui.divH([
|
|
286
|
+
shareIcon,
|
|
287
|
+
ui.iconFA('pen', (ev) => __awaiter(this, void 0, void 0, function* () {
|
|
288
|
+
ev.stopPropagation();
|
|
289
|
+
this.showAddToFavoritesDialog(funcCall);
|
|
290
|
+
}), 'Edit run metadata'),
|
|
291
|
+
unstarIcon
|
|
292
|
+
], 'cv-funccall-card-icons')
|
|
293
|
+
], 'cv-funccall-card');
|
|
294
|
+
card.addEventListener('click', () => __awaiter(this, void 0, void 0, function* () {
|
|
295
|
+
this.onRunChosen.next(funcCall.id);
|
|
296
|
+
card.classList.add('clicked');
|
|
297
|
+
}));
|
|
298
|
+
return card;
|
|
299
|
+
});
|
|
300
|
+
const allCards = [...this.myCards, ...this.favoriteCards, ...this.sharedCards];
|
|
301
|
+
allCards.forEach((card) => card.addEventListener('click', () => allCards.forEach((c) => c.classList.remove('clicked'))));
|
|
302
|
+
return ui.divV(this.favoriteCards);
|
|
303
|
+
}
|
|
304
|
+
;
|
|
305
|
+
renderSharedCards(funcCalls) {
|
|
306
|
+
this.sharedCards = funcCalls.map((funcCall) => {
|
|
307
|
+
var _a;
|
|
308
|
+
const unshareIcon = ui.iconFA('eye-slash', (ev) => __awaiter(this, void 0, void 0, function* () {
|
|
309
|
+
ev.stopPropagation();
|
|
310
|
+
this.onRunRemoveFromShared.next(funcCall.id);
|
|
311
|
+
}), 'Hide from shared');
|
|
312
|
+
const card = ui.divH([
|
|
313
|
+
ui.divV([
|
|
314
|
+
ui.divText((_a = funcCall.options['title']) !== null && _a !== void 0 ? _a : 'Default title', 'title'),
|
|
315
|
+
...(funcCall.options['annotation']) ? [ui.divText(funcCall.options['annotation'], 'description')] : [],
|
|
316
|
+
ui.divH([ui.render(funcCall.author), ui.span([new Date(funcCall.started.toString()).toLocaleString('en-us', { month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric' })], 'date')]),
|
|
317
|
+
], 'cv-card-content'),
|
|
318
|
+
ui.divH([
|
|
319
|
+
ui.iconFA('link', (ev) => __awaiter(this, void 0, void 0, function* () {
|
|
320
|
+
ev.stopPropagation();
|
|
321
|
+
yield navigator.clipboard.writeText(`${window.location.origin}${window.location.pathname}?id=${funcCall.id}`);
|
|
322
|
+
}), 'Copy link to the run'),
|
|
323
|
+
...(funcCall.author.id === grok.shell.user.id) ? [
|
|
324
|
+
ui.iconFA('pen', (ev) => __awaiter(this, void 0, void 0, function* () {
|
|
325
|
+
ev.stopPropagation();
|
|
326
|
+
this.showAddToSharedDialog(funcCall);
|
|
327
|
+
}), 'Edit run metadata'),
|
|
328
|
+
unshareIcon
|
|
329
|
+
] : [],
|
|
330
|
+
], 'cv-funccall-card-icons')
|
|
331
|
+
], 'cv-funccall-card');
|
|
332
|
+
card.addEventListener('click', () => __awaiter(this, void 0, void 0, function* () {
|
|
333
|
+
this.onRunChosen.next(funcCall.id);
|
|
334
|
+
card.classList.add('clicked');
|
|
335
|
+
}));
|
|
336
|
+
return card;
|
|
337
|
+
});
|
|
338
|
+
const allCards = [...this.myCards, ...this.favoriteCards, ...this.sharedCards];
|
|
339
|
+
allCards.forEach((card) => card.addEventListener('click', () => allCards.forEach((c) => c.classList.remove('clicked'))));
|
|
340
|
+
return ui.divV(this.sharedCards);
|
|
341
|
+
}
|
|
342
|
+
;
|
|
343
|
+
renderHistoryCards(funcCalls) {
|
|
344
|
+
this.myCards = funcCalls.map((funcCall) => {
|
|
345
|
+
const icon = funcCall.author.picture;
|
|
346
|
+
icon.style.width = '25px';
|
|
347
|
+
icon.style.height = '25px';
|
|
348
|
+
icon.style.fontSize = '20px';
|
|
349
|
+
icon.style.marginRight = '3px';
|
|
350
|
+
icon.style.alignSelf = 'center';
|
|
351
|
+
const userLabel = ui.label(funcCall.author.friendlyName, 'd4-link-label');
|
|
352
|
+
ui.bind(funcCall.author, icon);
|
|
353
|
+
const shareIcon = ui.iconFA('eye', (ev) => __awaiter(this, void 0, void 0, function* () {
|
|
354
|
+
ev.stopPropagation();
|
|
355
|
+
this.showAddToSharedDialog(funcCall);
|
|
356
|
+
}), 'Add to shared');
|
|
357
|
+
shareIcon.classList.add('fal');
|
|
358
|
+
const unshareIcon = ui.iconFA('eye-slash', (ev) => __awaiter(this, void 0, void 0, function* () {
|
|
359
|
+
ev.stopPropagation();
|
|
360
|
+
this.onRunRemoveFromShared.next(funcCall.id);
|
|
361
|
+
}), 'Hide from shared');
|
|
362
|
+
const unstar = ui.iconFA('star', (ev) => __awaiter(this, void 0, void 0, function* () {
|
|
363
|
+
ev.stopPropagation();
|
|
364
|
+
this.onRunRemoveFromFavorites.next(funcCall.id);
|
|
365
|
+
}), 'Unfavorite the run');
|
|
366
|
+
unstar.classList.add('fas');
|
|
367
|
+
const card = ui.divH([
|
|
368
|
+
ui.divH([
|
|
369
|
+
icon,
|
|
370
|
+
ui.divV([
|
|
371
|
+
userLabel,
|
|
372
|
+
ui.span([new Date(funcCall.started.toString()).toLocaleString('en-us', { month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric' })])
|
|
373
|
+
], 'cv-card-content'),
|
|
374
|
+
]),
|
|
375
|
+
ui.divH([
|
|
376
|
+
...(funcCall.options['isShared']) ? [unshareIcon] : [shareIcon],
|
|
377
|
+
...(funcCall.options['isFavorite']) ? [unstar] : [ui.iconFA('star', (ev) => __awaiter(this, void 0, void 0, function* () {
|
|
378
|
+
ev.stopPropagation();
|
|
379
|
+
this.showAddToFavoritesDialog(funcCall);
|
|
380
|
+
}), 'Add to favorites')],
|
|
381
|
+
ui.iconFA('trash-alt', (ev) => __awaiter(this, void 0, void 0, function* () {
|
|
382
|
+
ev.stopPropagation();
|
|
383
|
+
this.showDeleteRunDialog(funcCall);
|
|
384
|
+
}), 'Delete the run'),
|
|
385
|
+
], 'cv-funccall-card-icons')
|
|
386
|
+
], 'cv-funccall-card');
|
|
387
|
+
card.addEventListener('click', () => __awaiter(this, void 0, void 0, function* () {
|
|
388
|
+
this.onRunChosen.next(funcCall.id);
|
|
389
|
+
card.classList.add('clicked');
|
|
390
|
+
}));
|
|
391
|
+
return card;
|
|
392
|
+
});
|
|
393
|
+
const allCards = [...this.myCards, ...this.favoriteCards, ...this.sharedCards];
|
|
394
|
+
allCards.forEach((card) => card.addEventListener('click', () => allCards.forEach((c) => c.classList.remove('clicked'))));
|
|
395
|
+
return ui.divV(this.myCards);
|
|
396
|
+
}
|
|
397
|
+
;
|
|
398
|
+
get root() {
|
|
399
|
+
return this._root;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeS1wYW5lbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhpc3RvcnktcGFuZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsNEJBQTRCO0FBQzVCLE9BQU8sS0FBSyxJQUFJLE1BQU0sbUJBQW1CLENBQUM7QUFDMUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsZUFBZSxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBRTlDLE1BQU0sT0FBTyxZQUFZO0lBa1d2QixZQUNVLElBQWE7UUFBYixTQUFJLEdBQUosSUFBSSxDQUFTO1FBbFd2QiwrREFBK0Q7UUFDeEQsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBRTNDLDhDQUE4QztRQUN2Qyx3QkFBbUIsR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFDO1FBRXhELDJDQUEyQztRQUNwQyxxQkFBZ0IsR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFDO1FBRXJELGtEQUFrRDtRQUMzQyw2QkFBd0IsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBRXhELCtDQUErQztRQUN4QywwQkFBcUIsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBRXJELG1DQUFtQztRQUM1QixpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7UUFFcEMsVUFBSyxHQUFHO1lBQ2QsZ0JBQWdCLEVBQUUsRUFBQyxJQUFJLEVBQUUsRUFBRSxFQUkxQjtZQUNELE9BQU8sRUFBRSxJQUFJLE9BQXNCO1lBRW5DLE1BQU0sRUFBRSxJQUFJLGVBQWUsQ0FBZ0IsRUFB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cyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZGVmYXVsdFVzZXJzSWRzfSBmcm9tICcuLi9mdW5jdGlvbi12aWV3JztcbmltcG9ydCB7aGlzdG9yeVV0aWxzfSBmcm9tICcuLi9oaXN0b3J5LXV0aWxzJztcblxuZXhwb3J0IGNsYXNzIEhpc3RvcnlQYW5lbCB7XG4gIC8vIEVtaXR0ZWQgd2hlbiBGdW5jQ2FsbCBzaG91bGQgaXMgY2hvc2VuLiBDb250YWlucyBGdW5jQ2FsbCBJRFxuICBwdWJsaWMgb25SdW5DaG9zZW4gPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG5cbiAgLy8gRW1pdHRlZCB3aGVuIEZ1bmNDYWxsIGlzIGFkZGVkIHRvIGZhdm9yaXRlc1xuICBwdWJsaWMgb25SdW5BZGRUb0Zhdm9yaXRlcyA9IG5ldyBTdWJqZWN0PERHLkZ1bmNDYWxsPigpO1xuXG4gIC8vIEVtaXR0ZWQgd2hlbiBGdW5jQ2FsbCBpcyBhZGRlZCB0byBzaGFyZWRcbiAgcHVibGljIG9uUnVuQWRkVG9TaGFyZWQgPSBuZXcgU3ViamVjdDxERy5GdW5jQ2FsbD4oKTtcblxuICAvLyBFbWl0dGVkIHdoZW4gRnVuY0NhbGwgaXMgcmVtb3ZlZCBmcm9tIGZhdm9yaXRlc1xuICBwdWJsaWMgb25SdW5SZW1vdmVGcm9tRmF2b3JpdGVzID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIC8vIEVtaXR0ZWQgd2hlbiBGdW5jQ2FsbCBpcyByZW1vdmVkIGZyb20gc2hhcmVkXG4gIHB1YmxpYyBvblJ1blJlbW92ZUZyb21TaGFyZWQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG5cbiAgLy8gRW1pdHRlZCB3aGVuIEZ1bmNDYWxsIGlzIGRlbGV0ZWRcbiAgcHVibGljIG9uUnVuRGVsZXRlZCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICBwcml2YXRlIHN0b3JlID0ge1xuICAgIGZpbHRlcmluZ09wdGlvbnM6IHt0ZXh0OiAnJ30gYXMge1xuICAgICAgdGV4dDogc3RyaW5nLFxuICAgICAgYXV0aG9yPzogREcuVXNlcixcbiAgICAgIHN0YXJ0ZWRBZnRlcj86IGRheWpzLkRheWpzLFxuICAgIH0sXG4gICAgYWxsUnVuczogbmV3IFN1YmplY3Q8REcuRnVuY0NhbGxbXT4sXG5cbiAgICBteVJ1bnM6IG5ldyBCZWhhdmlvclN1YmplY3Q8REcuRnVuY0NhbGxbXT4oW10pLFxuICAgIGZhdm9yaXRlUnVuczogbmV3IEJlaGF2aW9yU3ViamVjdDxERy5GdW5jQ2FsbFtdPihbXSksXG4gICAgc2hhcmVkUnVuczogbmV3IEJlaGF2aW9yU3ViamVjdDxERy5GdW5jQ2FsbFtdPihbXSksXG5cbiAgICBmaWx0ZXJlZE15UnVuczogbmV3IEJlaGF2aW9yU3ViamVjdDxERy5GdW5jQ2FsbFtdPihbXSksXG4gICAgZmlsdGVyZWRGYXZvcml0ZVJ1bnM6IG5ldyBCZWhhdmlvclN1YmplY3Q8REcuRnVuY0NhbGxbXT4oW10pLFxuICAgIGZpbHRlcmVkU2hhcmVkUnVuczogbmV3IEJlaGF2aW9yU3ViamVjdDxERy5GdW5jQ2FsbFtdPihbXSksXG4gIH07XG5cbiAgcHJpdmF0ZSBteVJ1bnNGaWx0ZXIgPSBuZXcgU3ViamVjdDx0cnVlPigpO1xuICBwcml2YXRlIGZhdlJ1bnNGaWx0ZXIgPSBuZXcgU3ViamVjdDx0cnVlPigpO1xuICBwcml2YXRlIHNoYXJlZFJ1bnNGaWx0ZXIgPSBuZXcgU3ViamVjdDx0cnVlPigpO1xuXG4gIHB1YmxpYyBhbGxSdW5zRmV0Y2ggPSBuZXcgU3ViamVjdDx0cnVlPigpO1xuICBwdWJsaWMgbXlSdW5zRmV0Y2ggPSBuZXcgU3ViamVjdDx0cnVlPigpO1xuICBwdWJsaWMgZmF2UnVuc0ZldGNoID0gbmV3IFN1YmplY3Q8dHJ1ZT4oKTtcbiAgcHVibGljIHNoYXJlZFJ1bnNGZXRjaCA9IG5ldyBTdWJqZWN0PHRydWU+KCk7XG5cbiAgaGlzdG9yeVRhYiA9IHVpLmRpdigpO1xuICBmYXZUYWIgPSB1aS5kaXYoKTtcbiAgc2hhcmVkVGFiID0gdWkuZGl2KCk7XG4gIHRhYnMgPSB1aS50YWJDb250cm9sKHtcbiAgICAnSElTVE9SWSc6IHVpLmJveCh0aGlzLmhpc3RvcnlUYWIpLFxuICAgICdGQVZPUklURVMnOiB1aS5ib3godGhpcy5mYXZUYWIpLFxuICAgICdTSEFSRUQnOiB1aS5ib3godGhpcy5zaGFyZWRUYWIpLFxuICB9KTtcbiAgZmlsdGVyUGFuZSA9IHVpLmRpdigpO1xuXG4gIHByaXZhdGUgX3Jvb3QgPSB1aS5kaXZWKFtcbiAgICB1aS5wYW5lbChbXG4gICAgICB1aS5oMignSGlzdG9yeScpLFxuICAgICAgdGhpcy5maWx0ZXJQYW5lLFxuICAgIF0pLFxuICAgIHVpLmVsZW1lbnQoJ2RpdicsICdzcGxpdGJhci1ob3Jpem9udGFsJyksXG4gICAgdGhpcy50YWJzLnJvb3QsXG4gIF0sIHtzdHlsZToge3dpZHRoOiAnMTAwJSd9fSk7XG5cbiAgbXlDYXJkcyA9IFtdIGFzIEhUTUxFbGVtZW50W107XG4gIGZhdm9yaXRlQ2FyZHMgPSBbXSBhcyBIVE1MRWxlbWVudFtdO1xuICBzaGFyZWRDYXJkcyA9IFtdIGFzIEhUTUxFbGVtZW50W107XG5cbiAgdXBkYXRlRmlsdGVyUGFuZSgpIHtcbiAgICBjb25zdCBidWlsZEZpbHRlclBhbmUgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gdWkud2FpdChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmluZ1RleHQgPSBuZXcgU3ViamVjdCgpO1xuXG4gICAgICAgIGNvbnN0IHRleHRJbnB1dCA9IHVpLnN0cmluZ0lucHV0KCdTZWFyY2gnLCAnJywgKHY6IHN0cmluZykgPT4gZmlsdGVyaW5nVGV4dC5uZXh0KHYpKTtcbiAgICAgICAgREcuZGVib3VuY2UoZmlsdGVyaW5nVGV4dC5hc09ic2VydmFibGUoKSwgNjAwKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc3RvcmUuZmlsdGVyaW5nT3B0aW9ucy50ZXh0ID0gdGV4dElucHV0LnN0cmluZ1ZhbHVlO1xuICAgICAgICAgIHRoaXMuZmF2UnVuc0ZpbHRlci5uZXh0KCk7XG4gICAgICAgICAgdGhpcy5zaGFyZWRSdW5zRmlsdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZGF0ZUlucHV0ID0gdWkuZGF0ZUlucHV0KCdTdGFydGVkIGFmdGVyJywgZGF5anMoKS5zdWJ0cmFjdCgxLCAnd2VlaycpLCAodjogZGF5anMuRGF5anMpID0+IHtcbiAgICAgICAgICB0aGlzLnN0b3JlLmZpbHRlcmluZ09wdGlvbnMuc3RhcnRlZEFmdGVyID0gdjtcbiAgICAgICAgICB0aGlzLm15UnVuc0ZpbHRlci5uZXh0KCk7XG4gICAgICAgICAgdGhpcy5mYXZSdW5zRmlsdGVyLm5leHQoKTtcbiAgICAgICAgICB0aGlzLnNoYXJlZFJ1bnNGaWx0ZXIubmV4dCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBkZWZhdWx0VXNlcnMgPSBPYmplY3QudmFsdWVzKGRlZmF1bHRVc2Vyc0lkcyk7XG4gICAgICAgIGNvbnN0IGFsbFVzZXJzID0gYXdhaXQgZ3Jvay5kYXBpLnVzZXJzLmxpc3QoKSBhcyBERy5Vc2VyW107XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkVXNlcnMgPSBhbGxVc2Vycy5maWx0ZXIoKHVzZXIpID0+ICFkZWZhdWx0VXNlcnMuaW5jbHVkZXModXNlci5pZCkpO1xuXG4gICAgICAgIGNvbnN0IGF1dGhvcklucHV0ID0gdWkuY2hvaWNlSW5wdXQ8REcuVXNlciB8IHN0cmluZz4oJ0F1dGhvcicsICdBbnlvbmUnLCBbJ0FueW9uZScsIC4uLmZpbHRlcmVkVXNlcnNdLCAodjogREcuVXNlciB8IHN0cmluZykgPT4ge1xuICAgICAgICAgIHRoaXMuc3RvcmUuZmlsdGVyaW5nT3B0aW9ucy5hdXRob3IgPSAodiA9PT0gJ0FueW9uZScpID8gdW5kZWZpbmVkIDogdiBhcyBERy5Vc2VyO1xuICAgICAgICAgIHRoaXMuc2hhcmVkUnVuc0ZpbHRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICBkYXRlSW5wdXQuYWRkUGF0dGVybk1lbnUoJ2RhdGV0aW1lJyk7XG4gICAgICAgIGNvbnN0IGZvcm0gPSB1aS5kaXZWKFtcbiAgICAgICAgICB0ZXh0SW5wdXQsXG4gICAgICAgICAgZGF0ZUlucHV0LFxuICAgICAgICAgIGF1dGhvcklucHV0LFxuICAgICAgICBdLCAndWktZm9ybS1jb25kZW5zZWQgdWktZm9ybScpO1xuICAgICAgICBmb3JtLnN0eWxlLnBhZGRpbmcgPSAnMHB4JztcblxuICAgICAgICByZXR1cm4gZm9ybTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBuZXdGaWx0ZXJQYW5lID0gYnVpbGRGaWx0ZXJQYW5lKCk7XG4gICAgdGhpcy5maWx0ZXJQYW5lLnJlcGxhY2VXaXRoKG5ld0ZpbHRlclBhbmUpO1xuICAgIHRoaXMuZmlsdGVyUGFuZSA9IG5ld0ZpbHRlclBhbmU7XG4gIH07XG5cbiAgc2hvd0FkZFRvRmF2b3JpdGVzRGlhbG9nKGZ1bmNDYWxsOiBERy5GdW5jQ2FsbCkge1xuICAgIGxldCB0aXRsZSA9IGZ1bmNDYWxsLm9wdGlvbnNbJ3RpdGxlJ10gPz8gJyc7XG4gICAgbGV0IGFubm90YXRpb24gPSBmdW5jQ2FsbC5vcHRpb25zWydhbm5vdGF0aW9uJ10gPz8gJyc7XG4gICAgY29uc3QgdGl0bGVJbnB1dCA9IHVpLnN0cmluZ0lucHV0KCdUaXRsZScsIHRpdGxlLCAoczogc3RyaW5nKSA9PiB7XG4gICAgICB0aXRsZSA9IHM7XG4gICAgICBpZiAocy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGl0bGVJbnB1dC5zZXRUb29sdGlwKCdUaXRsZSBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aXRsZUlucHV0LmlucHV0LmNsYXNzTGlzdC5hZGQoJ2Q0LWludmFsaWQnKSwgMTAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRpdGxlSW5wdXQuc2V0VG9vbHRpcCgnJyk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGl0bGVJbnB1dC5pbnB1dC5jbGFzc0xpc3QucmVtb3ZlKCdkNC1pbnZhbGlkJyksIDEwMCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB1aS5kaWFsb2coe3RpdGxlOiAnQWRkIHRvIGZhdm9yaXRlcyd9KVxuICAgICAgLmFkZCh1aS5mb3JtKFtcbiAgICAgICAgdGl0bGVJbnB1dCxcbiAgICAgICAgdWkuc3RyaW5nSW5wdXQoJ0Fubm90YXRpb24nLCBhbm5vdGF0aW9uLCAoczogc3RyaW5nKSA9PiB7IGFubm90YXRpb24gPSBzOyB9KSxcbiAgICAgIF0pKVxuICAgICAgLm9uT0soYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAodGl0bGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZ1bmNDYWxsID0gYXdhaXQgaGlzdG9yeVV0aWxzLmxvYWRSdW4oZnVuY0NhbGwuaWQpO1xuICAgICAgICAgIGZ1bmNDYWxsLm9wdGlvbnNbJ3RpdGxlJ10gPSB0aXRsZTtcbiAgICAgICAgICBmdW5jQ2FsbC5vcHRpb25zWydhbm5vdGF0aW9uJ10gPSBhbm5vdGF0aW9uO1xuXG4gICAgICAgICAgdGhpcy5vblJ1bkFkZFRvRmF2b3JpdGVzLm5leHQoZnVuY0NhbGwpO1xuICAgICAgICAgIHRoaXMubXlSdW5zRmV0Y2gubmV4dCgpO1xuICAgICAgICAgIHRoaXMuZmF2UnVuc0ZldGNoLm5leHQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBncm9rLnNoZWxsLndhcm5pbmcoJ1RpdGxlIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLnNob3coe2NlbnRlcjogdHJ1ZX0pO1xuICB9O1xuXG4gIHNob3dEZWxldGVSdW5EaWFsb2coZnVuY0NhbGw6IERHLkZ1bmNDYWxsKSB7XG4gICAgdWkuZGlhbG9nKHt0aXRsZTogJ0RlbGV0ZSBydW4nfSlcbiAgICAgIC5hZGQodWkuZGl2VGV4dCgnVGhlIGRlbGV0ZWQgcnVuIGlzIGltcG9zc2libGUgdG8gcmVzdG9yZS4gQXJlIHlvdSBzdXJlPycpKVxuICAgICAgLm9uT0soYXN5bmMgKCkgPT4ge1xuICAgICAgICB0aGlzLm9uUnVuRGVsZXRlZC5uZXh0KGZ1bmNDYWxsLmlkKTtcbiAgICAgICAgdGhpcy5teVJ1bnNGZXRjaC5uZXh0KCk7XG4gICAgICB9KVxuICAgICAgLnNob3coe2NlbnRlcjogdHJ1ZX0pO1xuICB9O1xuXG4gIHNob3dBZGRUb1NoYXJlZERpYWxvZyhmdW5jQ2FsbDogREcuRnVuY0NhbGwpIHtcbiAgICBsZXQgdGl0bGUgPSBmdW5jQ2FsbC5vcHRpb25zWyd0aXRsZSddID8/ICcnO1xuICAgIGxldCBhbm5vdGF0aW9uID0gZnVuY0NhbGwub3B0aW9uc1snYW5ub3RhdGlvbiddID8/ICcnO1xuICAgIGNvbnN0IHRpdGxlSW5wdXQgPSB1aS5zdHJpbmdJbnB1dCgnVGl0bGUnLCB0aXRsZSwgKHM6IHN0cmluZykgPT4ge1xuICAgICAgdGl0bGUgPSBzO1xuICAgICAgaWYgKHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRpdGxlSW5wdXQuc2V0VG9vbHRpcCgnVGl0bGUgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGl0bGVJbnB1dC5pbnB1dC5jbGFzc0xpc3QuYWRkKCdkNC1pbnZhbGlkJyksIDEwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aXRsZUlucHV0LnNldFRvb2x0aXAoJycpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRpdGxlSW5wdXQuaW5wdXQuY2xhc3NMaXN0LnJlbW92ZSgnZDQtaW52YWxpZCcpLCAxMDApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdWkuZGlhbG9nKHt0aXRsZTogJ0FkZCB0byBzaGFyZWQnfSlcbiAgICAgIC5hZGQodWkuZm9ybShbXG4gICAgICAgIHRpdGxlSW5wdXQsXG4gICAgICAgIHVpLnN0cmluZ0lucHV0KCdBbm5vdGF0aW9uJywgYW5ub3RhdGlvbiwgKHM6IHN0cmluZykgPT4geyBhbm5vdGF0aW9uID0gczsgfSksXG4gICAgICBdKSlcbiAgICAgIC5vbk9LKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRpdGxlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmdW5jQ2FsbCA9IGF3YWl0IGhpc3RvcnlVdGlscy5sb2FkUnVuKGZ1bmNDYWxsLmlkKTtcbiAgICAgICAgICBmdW5jQ2FsbC5vcHRpb25zWyd0aXRsZSddID0gdGl0bGU7XG4gICAgICAgICAgZnVuY0NhbGwub3B0aW9uc1snYW5ub3RhdGlvbiddID0gYW5ub3RhdGlvbjtcbiAgICAgICAgICB0aGlzLm9uUnVuQWRkVG9TaGFyZWQubmV4dChmdW5jQ2FsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3Jvay5zaGVsbC53YXJuaW5nKCdUaXRsZSBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5zaG93KHtjZW50ZXI6IHRydWV9KTtcbiAgfTtcblxuICB1cGRhdGVTaGFyZWRQYW5lKHNoYXJlZFJ1bnM6IERHLkZ1bmNDYWxsW10pIHtcbiAgICBjb25zdCBuZXdUYWIgPSAoc2hhcmVkUnVucy5sZW5ndGggPiAwKSA/IHRoaXMucmVuZGVyU2hhcmVkQ2FyZHMoc2hhcmVkUnVucykgOiB1aS5kaXZUZXh0KCdObyBydW5zIGFyZSBtYXJrZWQgYXMgc2hhcmVkJywgJ25vLWVsZW1lbnRzLWxhYmVsJyk7XG4gICAgdGhpcy5zaGFyZWRUYWIucmVwbGFjZVdpdGgobmV3VGFiKTtcbiAgICB0aGlzLnNoYXJlZFRhYiA9IG5ld1RhYjtcbiAgfTtcblxuICB1cGRhdGVGYXZvcml0ZXNQYW5lKGZhdm9yaXRlUnVuczogREcuRnVuY0NhbGxbXSkge1xuICAgIGNvbnN0IG5ld1RhYiA9IChmYXZvcml0ZVJ1bnMubGVuZ3RoID4gMCkgPyB0aGlzLnJlbmRlckZhdm9yaXRlQ2FyZHMoZmF2b3JpdGVSdW5zKSA6IHVpLmRpdlRleHQoJ05vIHJ1bnMgYXJlIG1hcmtlZCBhcyBmYXZvcml0ZXMnLCAnbm8tZWxlbWVudHMtbGFiZWwnKTtcbiAgICB0aGlzLmZhdlRhYi5yZXBsYWNlV2l0aChuZXdUYWIpO1xuICAgIHRoaXMuZmF2VGFiID0gbmV3VGFiO1xuICB9O1xuXG4gIHVwZGF0ZU15UGFuZShteVJ1bnM6IERHLkZ1bmNDYWxsW10pIHtcbiAgICBjb25zdCBuZXdUYWIgPSAobXlSdW5zLmxlbmd0aCA+IDApID8gdGhpcy5yZW5kZXJIaXN0b3J5Q2FyZHMobXlSdW5zKSA6IHVpLmRpdlRleHQoJ05vIHJ1bnMgYXJlIGZvdW5kIGluIGhpc3RvcnknLCAnbm8tZWxlbWVudHMtbGFiZWwnKTtcbiAgICB0aGlzLmhpc3RvcnlUYWIucmVwbGFjZVdpdGgobmV3VGFiKTtcbiAgICB0aGlzLmhpc3RvcnlUYWIgPSBuZXdUYWI7XG4gIH07XG5cbiAgcmVuZGVyRmF2b3JpdGVDYXJkcyhmdW5jQ2FsbHM6IERHLkZ1bmNDYWxsW10pIHtcbiAgICB0aGlzLmZhdm9yaXRlQ2FyZHMgPSBmdW5jQ2FsbHMubWFwKChmdW5jQ2FsbCkgPT4ge1xuICAgICAgY29uc3QgdW5zdGFySWNvbiA9IHVpLmljb25GQSgnc3RhcicsIGFzeW5jIChldikgPT4ge1xuICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5vblJ1blJlbW92ZUZyb21GYXZvcml0ZXMubmV4dChmdW5jQ2FsbC5pZCk7XG4gICAgICB9LCAnVW5mYXZvcml0ZSB0aGUgcnVuJyk7XG4gICAgICB1bnN0YXJJY29uLmNsYXNzTGlzdC5hZGQoJ2ZhcycpO1xuXG4gICAgICBjb25zdCBzaGFyZUljb24gPSB1aS5pY29uRkEoJ2V5ZScsIGFzeW5jIChldikgPT4ge1xuICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5zaG93QWRkVG9TaGFyZWREaWFsb2coZnVuY0NhbGwpO1xuICAgICAgfSwgJ0FkZCB0byBzaGFyZWQnKTtcbiAgICAgIHNoYXJlSWNvbi5jbGFzc0xpc3QuYWRkKCdmYWwnKTtcblxuICAgICAgY29uc3QgY2FyZCA9IHVpLmRpdkgoW1xuICAgICAgICB1aS5kaXZWKFtcbiAgICAgICAgICB1aS5kaXZUZXh0KGZ1bmNDYWxsLm9wdGlvbnNbJ3RpdGxlJ10gPz8gJ0RlZmF1bHQgdGl0bGUnLCAndGl0bGUnKSxcbiAgICAgICAgICAuLi4oZnVuY0NhbGwub3B0aW9uc1snYW5ub3RhdGlvbiddKSA/IFt1aS5kaXZUZXh0KGZ1bmNDYWxsLm9wdGlvbnNbJ2Fubm90YXRpb24nXSwgJ2Rlc2NyaXB0aW9uJyldOiBbXSxcbiAgICAgICAgICB1aS5kaXZIKFt1aS5yZW5kZXIoZnVuY0NhbGwuYXV0aG9yKSwgdWkuc3BhbihbbmV3IERhdGUoZnVuY0NhbGwuc3RhcnRlZC50b1N0cmluZygpKS50b0xvY2FsZVN0cmluZygnZW4tdXMnLCB7bW9udGg6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnLCBob3VyOiAnbnVtZXJpYycsIG1pbnV0ZTogJ251bWVyaWMnfSldLCAnZGF0ZScpXSksXG4gICAgICAgIF0sICdjdi1jYXJkLWNvbnRlbnQnKSxcbiAgICAgICAgdWkuZGl2SChbXG4gICAgICAgICAgc2hhcmVJY29uLFxuICAgICAgICAgIHVpLmljb25GQSgncGVuJywgYXN5bmMgKGV2KSA9PiB7XG4gICAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMuc2hvd0FkZFRvRmF2b3JpdGVzRGlhbG9nKGZ1bmNDYWxsKTtcbiAgICAgICAgICB9LCAnRWRpdCBydW4gbWV0YWRhdGEnKSxcbiAgICAgICAgICB1bnN0YXJJY29uXG4gICAgICAgIF0sICdjdi1mdW5jY2FsbC1jYXJkLWljb25zJylcbiAgICAgIF0sICdjdi1mdW5jY2FsbC1jYXJkJyk7XG5cbiAgICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMub25SdW5DaG9zZW4ubmV4dChmdW5jQ2FsbC5pZCk7XG4gICAgICAgIGNhcmQuY2xhc3NMaXN0LmFkZCgnY2xpY2tlZCcpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY2FyZDtcbiAgICB9KTtcblxuICAgIGNvbnN0IGFsbENhcmRzID0gWy4uLnRoaXMubXlDYXJkcywgLi4udGhpcy5mYXZvcml0ZUNhcmRzLCAuLi50aGlzLnNoYXJlZENhcmRzXTtcbiAgICBhbGxDYXJkcy5mb3JFYWNoKChjYXJkKSA9PiBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gYWxsQ2FyZHMuZm9yRWFjaCgoYykgPT4gYy5jbGFzc0xpc3QucmVtb3ZlKCdjbGlja2VkJykpKSk7XG5cbiAgICByZXR1cm4gdWkuZGl2Vih0aGlzLmZhdm9yaXRlQ2FyZHMpO1xuICB9O1xuXG4gIHJlbmRlclNoYXJlZENhcmRzKGZ1bmNDYWxsczogREcuRnVuY0NhbGxbXSkge1xuICAgIHRoaXMuc2hhcmVkQ2FyZHMgPSBmdW5jQ2FsbHMubWFwKChmdW5jQ2FsbCkgPT4ge1xuICAgICAgY29uc3QgdW5zaGFyZUljb24gPSB1aS5pY29uRkEoJ2V5ZS1zbGFzaCcsIGFzeW5jIChldikgPT4ge1xuICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5vblJ1blJlbW92ZUZyb21TaGFyZWQubmV4dChmdW5jQ2FsbC5pZCk7XG4gICAgICB9LCAnSGlkZSBmcm9tIHNoYXJlZCcpO1xuXG4gICAgICBjb25zdCBjYXJkID0gdWkuZGl2SChbXG4gICAgICAgIHVpLmRpdlYoW1xuICAgICAgICAgIHVpLmRpdlRleHQoZnVuY0NhbGwub3B0aW9uc1sndGl0bGUnXSA/PyAnRGVmYXVsdCB0aXRsZScsICd0aXRsZScpLFxuICAgICAgICAgIC4uLihmdW5jQ2FsbC5vcHRpb25zWydhbm5vdGF0aW9uJ10pID8gW3VpLmRpdlRleHQoZnVuY0NhbGwub3B0aW9uc1snYW5ub3RhdGlvbiddLCAnZGVzY3JpcHRpb24nKV06IFtdLFxuICAgICAgICAgIHVpLmRpdkgoW3VpLnJlbmRlcihmdW5jQ2FsbC5hdXRob3IpLCB1aS5zcGFuKFtuZXcgRGF0ZShmdW5jQ2FsbC5zdGFydGVkLnRvU3RyaW5nKCkpLnRvTG9jYWxlU3RyaW5nKCdlbi11cycsIHttb250aDogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycsIGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnbnVtZXJpYyd9KV0sICdkYXRlJyldKSxcbiAgICAgICAgXSwgJ2N2LWNhcmQtY29udGVudCcpLFxuICAgICAgICB1aS5kaXZIKFtcbiAgICAgICAgICB1aS5pY29uRkEoJ2xpbmsnLCBhc3luYyAoZXYpID0+IHtcbiAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0ke3dpbmRvdy5sb2NhdGlvbi5wYXRobmFtZX0/aWQ9JHtmdW5jQ2FsbC5pZH1gKTtcbiAgICAgICAgICB9LCAnQ29weSBsaW5rIHRvIHRoZSBydW4nKSxcbiAgICAgICAgICAuLi4oZnVuY0NhbGwuYXV0aG9yLmlkID09PSBncm9rLnNoZWxsLnVzZXIuaWQpID8gW1xuICAgICAgICAgICAgdWkuaWNvbkZBKCdwZW4nLCBhc3luYyAoZXYpID0+IHtcbiAgICAgICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgIHRoaXMuc2hvd0FkZFRvU2hhcmVkRGlhbG9nKGZ1bmNDYWxsKTtcbiAgICAgICAgICAgIH0sICdFZGl0IHJ1biBtZXRhZGF0YScpLFxuICAgICAgICAgICAgdW5zaGFyZUljb25dOiBbXSxcbiAgICAgICAgXSwgJ2N2LWZ1bmNjYWxsLWNhcmQtaWNvbnMnKVxuICAgICAgXSwgJ2N2LWZ1bmNjYWxsLWNhcmQnKTtcblxuICAgICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy5vblJ1bkNob3Nlbi5uZXh0KGZ1bmNDYWxsLmlkKTtcbiAgICAgICAgY2FyZC5jbGFzc0xpc3QuYWRkKCdjbGlja2VkJyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjYXJkO1xuICAgIH0pO1xuXG5cbiAgICBjb25zdCBhbGxDYXJkcyA9IFsuLi50aGlzLm15Q2FyZHMsIC4uLnRoaXMuZmF2b3JpdGVDYXJkcywgLi4udGhpcy5zaGFyZWRDYXJkc107XG4gICAgYWxsQ2FyZHMuZm9yRWFjaCgoY2FyZCkgPT4gY2FyZC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGFsbENhcmRzLmZvckVhY2goKGMpID0+IGMuY2xhc3NMaXN0LnJlbW92ZSgnY2xpY2tlZCcpKSkpO1xuXG4gICAgcmV0dXJuIHVpLmRpdlYodGhpcy5zaGFyZWRDYXJkcyk7XG4gIH07XG5cbiAgcmVuZGVySGlzdG9yeUNhcmRzKGZ1bmNDYWxsczogREcuRnVuY0NhbGxbXSkge1xuICAgIHRoaXMubXlDYXJkcyA9IGZ1bmNDYWxscy5tYXAoKGZ1bmNDYWxsKSA9PiB7XG4gICAgICBjb25zdCBpY29uID0gZnVuY0NhbGwuYXV0aG9yLnBpY3R1cmUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpY29uLnN0eWxlLndpZHRoID0gJzI1cHgnO1xuICAgICAgaWNvbi5zdHlsZS5oZWlnaHQgPSAnMjVweCc7XG4gICAgICBpY29uLnN0eWxlLmZvbnRTaXplID0gJzIwcHgnO1xuICAgICAgaWNvbi5zdHlsZS5tYXJnaW5SaWdodCA9ICczcHgnO1xuICAgICAgaWNvbi5zdHlsZS5hbGlnblNlbGYgPSAnY2VudGVyJztcbiAgICAgIGNvbnN0IHVzZXJMYWJlbCA9IHVpLmxhYmVsKGZ1bmNDYWxsLmF1dGhvci5mcmllbmRseU5hbWUsICdkNC1saW5rLWxhYmVsJyk7XG4gICAgICB1aS5iaW5kKGZ1bmNDYWxsLmF1dGhvciwgaWNvbik7XG5cbiAgICAgIGNvbnN0IHNoYXJlSWNvbiA9IHVpLmljb25GQSgnZXllJywgYXN5bmMgKGV2KSA9PiB7XG4gICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLnNob3dBZGRUb1NoYXJlZERpYWxvZyhmdW5jQ2FsbCk7XG4gICAgICB9LCAnQWRkIHRvIHNoYXJlZCcpO1xuICAgICAgc2hhcmVJY29uLmNsYXNzTGlzdC5hZGQoJ2ZhbCcpO1xuXG4gICAgICBjb25zdCB1bnNoYXJlSWNvbiA9IHVpLmljb25GQSgnZXllLXNsYXNoJywgYXN5bmMgKGV2KSA9PiB7XG4gICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLm9uUnVuUmVtb3ZlRnJvbVNoYXJlZC5uZXh0KGZ1bmNDYWxsLmlkKTtcbiAgICAgIH0sICdIaWRlIGZyb20gc2hhcmVkJyk7XG5cbiAgICAgIGNvbnN0IHVuc3RhciA9IHVpLmljb25GQSgnc3RhcicsIGFzeW5jIChldikgPT4ge1xuICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5vblJ1blJlbW92ZUZyb21GYXZvcml0ZXMubmV4dChmdW5jQ2FsbC5pZCk7XG4gICAgICB9LCAnVW5mYXZvcml0ZSB0aGUgcnVuJyk7XG4gICAgICB1bnN0YXIuY2xhc3NMaXN0LmFkZCgnZmFzJyk7XG5cbiAgICAgIGNvbnN0IGNhcmQgPSB1aS5kaXZIKFtcbiAgICAgICAgdWkuZGl2SChbXG4gICAgICAgICAgaWNvbixcbiAgICAgICAgICB1aS5kaXZWKFtcbiAgICAgICAgICAgIHVzZXJMYWJlbCxcbiAgICAgICAgICAgIHVpLnNwYW4oW25ldyBEYXRlKGZ1bmNDYWxsLnN0YXJ0ZWQudG9TdHJpbmcoKSkudG9Mb2NhbGVTdHJpbmcoJ2VuLXVzJywge21vbnRoOiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJywgaG91cjogJ251bWVyaWMnLCBtaW51dGU6ICdudW1lcmljJ30pXSlcbiAgICAgICAgICBdLCAnY3YtY2FyZC1jb250ZW50JyksXG4gICAgICAgIF0pLFxuICAgICAgICB1aS5kaXZIKFtcbiAgICAgICAgICAuLi4oZnVuY0NhbGwub3B0aW9uc1snaXNTaGFyZWQnXSkgPyBbdW5zaGFyZUljb25dOiBbc2hhcmVJY29uXSxcbiAgICAgICAgICAuLi4oZnVuY0NhbGwub3B0aW9uc1snaXNGYXZvcml0ZSddKSA/IFt1bnN0YXJdIDogW3VpLmljb25GQSgnc3RhcicsIGFzeW5jIChldikgPT4ge1xuICAgICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLnNob3dBZGRUb0Zhdm9yaXRlc0RpYWxvZyhmdW5jQ2FsbCk7XG4gICAgICAgICAgfSwgJ0FkZCB0byBmYXZvcml0ZXMnKV0sXG4gICAgICAgICAgdWkuaWNvbkZBKCd0cmFzaC1hbHQnLCBhc3luYyAoZXYpID0+IHtcbiAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5zaG93RGVsZXRlUnVuRGlhbG9nKGZ1bmNDYWxsKTtcbiAgICAgICAgICB9LCAnRGVsZXRlIHRoZSBydW4nKSxcbiAgICAgICAgXSwgJ2N2LWZ1bmNjYWxsLWNhcmQtaWNvbnMnKVxuICAgICAgXSwgJ2N2LWZ1bmNjYWxsLWNhcmQnKTtcblxuICAgICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy5vblJ1bkNob3Nlbi5uZXh0KGZ1bmNDYWxsLmlkKTtcbiAgICAgICAgY2FyZC5jbGFzc0xpc3QuYWRkKCdjbGlja2VkJyk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGNhcmQ7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhbGxDYXJkcyA9IFsuLi50aGlzLm15Q2FyZHMsIC4uLnRoaXMuZmF2b3JpdGVDYXJkcywgLi4udGhpcy5zaGFyZWRDYXJkc107XG4gICAgYWxsQ2FyZHMuZm9yRWFjaCgoY2FyZCkgPT4gY2FyZC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGFsbENhcmRzLmZvckVhY2goKGMpID0+IGMuY2xhc3NMaXN0LnJlbW92ZSgnY2xpY2tlZCcpKSkpO1xuXG4gICAgcmV0dXJuIHVpLmRpdlYodGhpcy5teUNhcmRzKTtcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZ1bmM6IERHLkZ1bmNcbiAgKSB7XG4gICAgdGhpcy50YWJzLnJvb3Quc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgdGhpcy50YWJzLmhlYWRlci5zdHlsZS5qdXN0aWZ5Q29udGVudCA9ICdzcGFjZS1iZXR3ZWVuJztcblxuICAgIHRoaXMuc3RvcmUubXlSdW5zLnN1YnNjcmliZSgobXlSdW5zKSA9PiB0aGlzLnN0b3JlLmZpbHRlcmVkTXlSdW5zLm5leHQobXlSdW5zKSk7XG4gICAgdGhpcy5zdG9yZS5mYXZvcml0ZVJ1bnMuc3Vic2NyaWJlKChmYXZvcml0ZVJ1bnMpID0+IHRoaXMuc3RvcmUuZmlsdGVyZWRGYXZvcml0ZVJ1bnMubmV4dChmYXZvcml0ZVJ1bnMpKTtcbiAgICB0aGlzLnN0b3JlLnNoYXJlZFJ1bnMuc3Vic2NyaWJlKChzaGFyZWRSdW5zKSA9PiB0aGlzLnN0b3JlLmZpbHRlcmVkU2hhcmVkUnVucy5uZXh0KHNoYXJlZFJ1bnMpKTtcblxuICAgIHRoaXMuc3RvcmUuZmlsdGVyZWRNeVJ1bnMuc3Vic2NyaWJlKChteVJ1bnMpID0+IHRoaXMudXBkYXRlTXlQYW5lKG15UnVucykpO1xuICAgIHRoaXMuc3RvcmUuZmlsdGVyZWRGYXZvcml0ZVJ1bnMuc3Vic2NyaWJlKChuZXdGYXZvcml0ZVJ1bnMpID0+IHRoaXMudXBkYXRlRmF2b3JpdGVzUGFuZShuZXdGYXZvcml0ZVJ1bnMpKTtcbiAgICB0aGlzLnN0b3JlLmZpbHRlcmVkU2hhcmVkUnVucy5zdWJzY3JpYmUoKHNoYXJlZFJ1bnMpID0+IHRoaXMudXBkYXRlU2hhcmVkUGFuZShzaGFyZWRSdW5zKSk7XG5cbiAgICB0aGlzLm15UnVuc0ZpbHRlci5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgY29uc3QgZmlsdGVyZWRNeVJ1bnMgPSB0aGlzLnN0b3JlLm15UnVucy52YWx1ZS5maWx0ZXIoKHZhbCkgPT4ge1xuICAgICAgICBjb25zdCBzdGFydGVkQWZ0ZXIgPSAodGhpcy5zdG9yZS5maWx0ZXJpbmdPcHRpb25zLnN0YXJ0ZWRBZnRlciA/IHZhbC5zdGFydGVkID4gdGhpcy5zdG9yZS5maWx0ZXJpbmdPcHRpb25zLnN0YXJ0ZWRBZnRlciA6IHRydWUpO1xuICAgICAgICBjb25zdCB0aXRsZUNvbnRhaW5zVGV4dCA9ICEhdmFsLm9wdGlvbnNbJ3RpdGxlJ10gJiYgdmFsLm9wdGlvbnNbJ3RpdGxlJ10uaW5jbHVkZXModGhpcy5zdG9yZS5maWx0ZXJpbmdPcHRpb25zLnRleHQpO1xuICAgICAgICBjb25zdCBkZXNjQ29udGFpbnNUZXh0ID0gISF2YWwub3B0aW9uc1snZGVzY3JpcHRpb24nXSAmJiB2YWwub3B0aW9uc1snZGVzY3JpcHRpb24nXS5pbmNsdWRlcyh0aGlzLnN0b3JlLmZpbHRlcmluZ09wdGlvbnMudGV4dCk7XG5cbiAgICAgICAgcmV0dXJuICh0aXRsZUNvbnRhaW5zVGV4dCB8fCBkZXNjQ29udGFpbnNUZXh0KSAmJiBzdGFydGVkQWZ0ZXI7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuc3RvcmUuZmlsdGVyZWRNeVJ1bnMubmV4dChmaWx0ZXJlZE15UnVucyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmZhdlJ1bnNGaWx0ZXIuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkRmF2UnVucyA9IHRoaXMuc3RvcmUuZmF2b3JpdGVSdW5zLnZhbHVlLmZpbHRlcigodmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ZWRBZnRlciA9ICh0aGlzLnN0b3JlLmZpbHRlcmluZ09wdGlvbnMuc3RhcnRlZEFmdGVyID8gdmFsLnN0YXJ0ZWQgPiB0aGlzLnN0b3JlLmZpbHRlcmluZ09wdGlvbnMuc3RhcnRlZEFmdGVyIDogdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHRpdGxlQ29udGFpbnNUZXh0ID0gISF2YWwub3B0aW9uc1sndGl0bGUnXSAmJiB2YWwub3B0aW9uc1sndGl0bGUnXS5pbmNsdWRlcyh0aGlzLnN0b3JlLmZpbHRlcmluZ09wdGlvbnMudGV4dCk7XG4gICAgICAgIGNvbnN0IGRlc2NDb250YWluc1RleHQgPSAhIXZhbC5vcHRpb25zWydkZXNjcmlwdGlvbiddICYmIHZhbC5vcHRpb25zWydkZXNjcmlwdGlvbiddLmluY2x1ZGVzKHRoaXMuc3RvcmUuZmlsdGVyaW5nT3B0aW9ucy50ZXh0KTtcblxuICAgICAgICByZXR1cm4gKHRpdGxlQ29udGFpbnNUZXh0IHx8IGRlc2NDb250YWluc1RleHQpICYmIHN0YXJ0ZWRBZnRlcjtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zdG9yZS5maWx0ZXJlZEZhdm9yaXRlUnVucy5uZXh0KGZpbHRlcmVkRmF2UnVucyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNoYXJlZFJ1bnNGaWx0ZXIuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkU2hhcmVkUnVucyA9IHRoaXMuc3RvcmUuc2hhcmVkUnVucy52YWx1ZS5maWx0ZXIoKHZhbCkgPT4ge1xuICAgICAgICBjb25zdCBzdGFydGVkQWZ0ZXIgPSAodGhpcy5zdG9yZS5maWx0ZXJpbmdPcHRpb25zLnN0YXJ0ZWRBZnRlciA/IHZhbC5zdGFydGVkID4gdGhpcy5zdG9yZS5maWx0ZXJpbmdPcHRpb25zLnN0YXJ0ZWRBZnRlciA6IHRydWUpO1xuICAgICAgICBjb25zdCBpc0F1dGhvcmVkID0gdGhpcy5zdG9yZS5maWx0ZXJpbmdPcHRpb25zLmF1dGhvciA/IHZhbC5hdXRob3IuaWQgPT09IHRoaXMuc3RvcmUuZmlsdGVyaW5nT3B0aW9ucy5hdXRob3IuaWQ6IHRydWU7XG4gICAgICAgIGNvbnN0IHRpdGxlQ29udGFpbnNUZXh0ID0gISF2YWwub3B0aW9uc1sndGl0bGUnXSAmJiB2YWwub3B0aW9uc1sndGl0bGUnXS5pbmNsdWRlcyh0aGlzLnN0b3JlLmZpbHRlcmluZ09wdGlvbnMudGV4dCk7XG4gICAgICAgIGNvbnN0IGRlc2NDb250YWluc1RleHQgPSAhIXZhbC5vcHRpb25zWydkZXNjcmlwdGlvbiddICYmIHZhbC5vcHRpb25zWydkZXNjcmlwdGlvbiddLmluY2x1ZGVzKHRoaXMuc3RvcmUuZmlsdGVyaW5nT3B0aW9ucy50ZXh0KTtcblxuICAgICAgICByZXR1cm4gKHRpdGxlQ29udGFpbnNUZXh0IHx8IGRlc2NDb250YWluc1RleHQpICYmIHN0YXJ0ZWRBZnRlciAmJiBpc0F1dGhvcmVkO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnN0b3JlLmZpbHRlcmVkU2hhcmVkUnVucy5uZXh0KGZpbHRlcmVkU2hhcmVkUnVucyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnN0b3JlLmFsbFJ1bnMuc3Vic2NyaWJlKChhbGxSdW5zKSA9PiB7XG4gICAgICB0aGlzLnN0b3JlLm15UnVucy5uZXh0KGFsbFJ1bnMuZmlsdGVyKChydW4pID0+IHJ1bi5hdXRob3IuaWQgPT09IGdyb2suc2hlbGwudXNlci5pZCkpO1xuICAgICAgdGhpcy5zdG9yZS5mYXZvcml0ZVJ1bnMubmV4dChhbGxSdW5zLmZpbHRlcigocnVuKSA9PiBydW4ub3B0aW9uc1snaXNGYXZvcml0ZSddICYmICFydW4ub3B0aW9uc1snaXNJbXBvcnRlZCddKSk7XG4gICAgICB0aGlzLnN0b3JlLnNoYXJlZFJ1bnMubmV4dChhbGxSdW5zLmZpbHRlcigocnVuKSA9PiBydW4ub3B0aW9uc1snaXNTaGFyZWQnXSkpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5hbGxSdW5zRmV0Y2guc3Vic2NyaWJlKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGFsbFJ1bnMgPSAoYXdhaXQgaGlzdG9yeVV0aWxzLnB1bGxSdW5zQnlOYW1lKHRoaXMuZnVuYy5uYW1lLCBbXSwge29yZGVyOiAnc3RhcnRlZCd9LCBbJ3Nlc3Npb24udXNlcicsICdvcHRpb25zJ10pKS5yZXZlcnNlKCk7XG4gICAgICB0aGlzLnN0b3JlLmFsbFJ1bnMubmV4dChhbGxSdW5zKTtcbiAgICB9KTtcblxuICAgIHRoaXMubXlSdW5zRmV0Y2guc3Vic2NyaWJlKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG15UnVucyA9IChhd2FpdCBoaXN0b3J5VXRpbHMucHVsbFJ1bnNCeU5hbWUodGhpcy5mdW5jLm5hbWUsIFt7YXV0aG9yOiBncm9rLnNoZWxsLnVzZXJ9XSwge29yZGVyOiAnc3RhcnRlZCd9LCBbJ3Nlc3Npb24udXNlcicsICdvcHRpb25zJ10pKS5yZXZlcnNlKCk7XG4gICAgICB0aGlzLnN0b3JlLmZpbHRlcmVkTXlSdW5zLm5leHQobXlSdW5zKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZmF2UnVuc0ZldGNoLnN1YnNjcmliZShhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBteVJ1bnMgPSAoYXdhaXQgaGlzdG9yeVV0aWxzLnB1bGxSdW5zQnlOYW1lKHRoaXMuZnVuYy5uYW1lLCBbe2F1dGhvcjogZ3Jvay5zaGVsbC51c2VyfV0sIHtvcmRlcjogJ3N0YXJ0ZWQnfSwgWydzZXNzaW9uLnVzZXInLCAnb3B0aW9ucyddKSkucmV2ZXJzZSgpO1xuICAgICAgdGhpcy5zdG9yZS5maWx0ZXJlZEZhdm9yaXRlUnVucy5uZXh0KG15UnVucy5maWx0ZXIoKHJ1bikgPT4gcnVuLm9wdGlvbnNbJ2lzRmF2b3JpdGUnXSAmJiAhcnVuLm9wdGlvbnNbJ2lzSW1wb3J0ZWQnXSkpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5zaGFyZWRSdW5zRmV0Y2guc3Vic2NyaWJlKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNoYXJlZFJ1bnMgPSAoYXdhaXQgaGlzdG9yeVV0aWxzLnB1bGxSdW5zQnlOYW1lKHRoaXMuZnVuYy5uYW1lLCBbXSwge29yZGVyOiAnc3RhcnRlZCd9LCBbJ3Nlc3Npb24udXNlcicsICdvcHRpb25zJ10pKS5yZXZlcnNlKCk7XG4gICAgICB0aGlzLnN0b3JlLmZpbHRlcmVkU2hhcmVkUnVucy5uZXh0KHNoYXJlZFJ1bnMuZmlsdGVyKChydW4pID0+IHJ1bi5vcHRpb25zWydpc1NoYXJlZCddKSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFsbFJ1bnNGZXRjaC5uZXh0KCk7XG4gICAgdGhpcy51cGRhdGVGaWx0ZXJQYW5lKCk7XG4gIH1cblxuICBnZXQgcm9vdCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcm9vdDtcbiAgfVxufVxuIl19
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import * as DG from 'datagrok-api/dg';
|
|
2
2
|
import { FileInput } from './file-input';
|
|
3
3
|
import { HistoryInput } from './history-input';
|
|
4
|
+
import { HistoryPanel } from './history-panel';
|
|
4
5
|
export declare namespace UiUtils {
|
|
5
6
|
function fileInput(initialText?: string, initialValue?: File | null, onValueChanged?: Function | null, fileType?: string): FileInput;
|
|
6
7
|
function historyInput(label: string, _funcName: string, _stringValueFunc: (currentRun: DG.FuncCall) => string, _visibleColumnsForGrid: Record<string, (currentRun: DG.FuncCall) => string>, _visibleColumnsForFilter?: string[]): HistoryInput;
|
|
8
|
+
function historyPanel(objFunc: DG.Func): HistoryPanel;
|
|
7
9
|
}
|
|
8
10
|
//# sourceMappingURL=ui-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-utils.d.ts","sourceRoot":"","sources":["ui-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAkB,SAAS,EAAC,MAAM,cAAc,CAAC;AACxD,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAE7C,yBAAiB,OAAO,CAAC;IACvB,SAAgB,SAAS,CACvB,WAAW,SAAqB,EAChC,YAAY,GAAE,IAAI,GAAG,IAAW,EAChC,cAAc,GAAE,QAAQ,GAAG,IAAW,EACtC,QAAQ,SAAkB,aAG3B;IAED,SAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,KAAK,MAAM,EACrD,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,KAAK,MAAM,CAAC,EAC3E,wBAAwB,GAAE,MAAM,EAAO,gBAGxC;CACF"}
|
|
1
|
+
{"version":3,"file":"ui-utils.d.ts","sourceRoot":"","sources":["ui-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAkB,SAAS,EAAC,MAAM,cAAc,CAAC;AACxD,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAE7C,yBAAiB,OAAO,CAAC;IACvB,SAAgB,SAAS,CACvB,WAAW,SAAqB,EAChC,YAAY,GAAE,IAAI,GAAG,IAAW,EAChC,cAAc,GAAE,QAAQ,GAAG,IAAW,EACtC,QAAQ,SAAkB,aAG3B;IAED,SAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,KAAK,MAAM,EACrD,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,KAAK,MAAM,CAAC,EAC3E,wBAAwB,GAAE,MAAM,EAAO,gBAGxC;IAED,SAAgB,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,gBAE5C;CACF"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { EXCEL_BLOB_TYPE, FileInput } from './file-input';
|
|
2
2
|
import { HistoryInput } from './history-input';
|
|
3
|
+
import { HistoryPanel } from './history-panel';
|
|
3
4
|
export var UiUtils;
|
|
4
5
|
(function (UiUtils) {
|
|
5
6
|
function fileInput(initialText = 'Drag-n-drop here', initialValue = null, onValueChanged = null, fileType = EXCEL_BLOB_TYPE) {
|
|
@@ -10,5 +11,9 @@ export var UiUtils;
|
|
|
10
11
|
return new HistoryInput(label, _funcName, _stringValueFunc, _visibleColumnsForGrid, _visibleColumnsForFilter);
|
|
11
12
|
}
|
|
12
13
|
UiUtils.historyInput = historyInput;
|
|
14
|
+
function historyPanel(objFunc) {
|
|
15
|
+
return new HistoryPanel(objFunc);
|
|
16
|
+
}
|
|
17
|
+
UiUtils.historyPanel = historyPanel;
|
|
13
18
|
})(UiUtils || (UiUtils = {}));
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1aS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsZUFBZSxFQUFFLFNBQVMsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUN4RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRTdDLE1BQU0sS0FBVyxPQUFPLENBdUJ2QjtBQXZCRCxXQUFpQixPQUFPO0lBQ3RCLFNBQWdCLFNBQVMsQ0FDdkIsV0FBVyxHQUFHLGtCQUFrQixFQUNoQyxlQUE0QixJQUFJLEVBQ2hDLGlCQUFrQyxJQUFJLEVBQ3RDLFFBQVEsR0FBRyxlQUFlO1FBRTFCLE9BQU8sSUFBSSxTQUFTLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQVBlLGlCQUFTLFlBT3hCLENBQUE7SUFFRCxTQUFnQixZQUFZLENBQzFCLEtBQWEsRUFDYixTQUFpQixFQUNqQixnQkFBcUQsRUFDckQsc0JBQTJFLEVBQzNFLDJCQUFxQyxFQUFFO1FBRXZDLE9BQU8sSUFBSSxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO0lBQ2hILENBQUM7SUFSZSxvQkFBWSxlQVEzQixDQUFBO0lBRUQsU0FBZ0IsWUFBWSxDQUFDLE9BQWdCO1FBQzNDLE9BQU8sSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUZlLG9CQUFZLGVBRTNCLENBQUE7QUFDSCxDQUFDLEVBdkJnQixPQUFPLEtBQVAsT0FBTyxRQXVCdkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0IHtFWENFTF9CTE9CX1RZUEUsIEZpbGVJbnB1dH0gZnJvbSAnLi9maWxlLWlucHV0JztcbmltcG9ydCB7SGlzdG9yeUlucHV0fSBmcm9tICcuL2hpc3RvcnktaW5wdXQnO1xuaW1wb3J0IHtIaXN0b3J5UGFuZWx9IGZyb20gJy4vaGlzdG9yeS1wYW5lbCc7XG5cbmV4cG9ydCBuYW1lc3BhY2UgVWlVdGlscyB7XG4gIGV4cG9ydCBmdW5jdGlvbiBmaWxlSW5wdXQoXG4gICAgaW5pdGlhbFRleHQgPSAnRHJhZy1uLWRyb3AgaGVyZScsXG4gICAgaW5pdGlhbFZhbHVlOiBGaWxlIHwgbnVsbCA9IG51bGwsXG4gICAgb25WYWx1ZUNoYW5nZWQ6IEZ1bmN0aW9uIHwgbnVsbCA9IG51bGwsXG4gICAgZmlsZVR5cGUgPSBFWENFTF9CTE9CX1RZUEVcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBGaWxlSW5wdXQoaW5pdGlhbFRleHQsIGluaXRpYWxWYWx1ZSwgb25WYWx1ZUNoYW5nZWQsIGZpbGVUeXBlKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBoaXN0b3J5SW5wdXQoXG4gICAgbGFiZWw6IHN0cmluZyxcbiAgICBfZnVuY05hbWU6IHN0cmluZyxcbiAgICBfc3RyaW5nVmFsdWVGdW5jOiAoY3VycmVudFJ1bjogREcuRnVuY0NhbGwpID0+IHN0cmluZyxcbiAgICBfdmlzaWJsZUNvbHVtbnNGb3JHcmlkOiBSZWNvcmQ8c3RyaW5nLCAoY3VycmVudFJ1bjogREcuRnVuY0NhbGwpID0+IHN0cmluZz4sXG4gICAgX3Zpc2libGVDb2x1bW5zRm9yRmlsdGVyOiBzdHJpbmdbXSA9IFtdXG4gICkge1xuICAgIHJldHVybiBuZXcgSGlzdG9yeUlucHV0KGxhYmVsLCBfZnVuY05hbWUsIF9zdHJpbmdWYWx1ZUZ1bmMsIF92aXNpYmxlQ29sdW1uc0ZvckdyaWQsIF92aXNpYmxlQ29sdW1uc0ZvckZpbHRlcik7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gaGlzdG9yeVBhbmVsKG9iakZ1bmM6IERHLkZ1bmMpIHtcbiAgICByZXR1cm4gbmV3IEhpc3RvcnlQYW5lbChvYmpGdW5jKTtcbiAgfVxufVxuIl19
|