@skyux/list-builder-view-grids 5.7.2 → 6.0.0-beta.2
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/documentation.json +2 -2
- package/esm2020/index.mjs +21 -0
- package/esm2020/lib/modules/column-selector/column-selector-context.mjs +9 -0
- package/esm2020/lib/modules/column-selector/column-selector-modal.component.mjs +38 -0
- package/esm2020/lib/modules/column-selector/column-selector-modal.module.mjs +40 -0
- package/esm2020/lib/modules/list-column-selector-action/list-column-selector-action.component.mjs +133 -0
- package/esm2020/lib/modules/list-column-selector-action/list-column-selector-action.module.mjs +47 -0
- package/esm2020/lib/modules/list-column-selector-action/list-column-selector-button.component.mjs +13 -0
- package/esm2020/lib/modules/list-view-grid/list-view-grid.component.mjs +460 -0
- package/esm2020/lib/modules/list-view-grid/list-view-grid.module.mjs +42 -0
- package/esm2020/lib/modules/list-view-grid/state/columns/columns.orchestrator.mjs +22 -0
- package/esm2020/lib/modules/list-view-grid/state/columns/load.action.mjs +10 -0
- package/esm2020/lib/modules/list-view-grid/state/displayed-columns/displayed-columns.orchestrator.mjs +22 -0
- package/esm2020/lib/modules/list-view-grid/state/displayed-columns/load.action.mjs +10 -0
- package/esm2020/lib/modules/list-view-grid/state/grid-state-action.type.mjs +2 -0
- package/esm2020/lib/modules/list-view-grid/state/grid-state.model.mjs +11 -0
- package/esm2020/lib/modules/list-view-grid/state/grid-state.rxstate.mjs +19 -0
- package/esm2020/lib/modules/list-view-grid/state/grid-state.state-node.mjs +27 -0
- package/esm2020/lib/modules/list-view-grid/types/list-view-grid-message-type.mjs +15 -0
- package/esm2020/lib/modules/list-view-grid/types/list-view-grid-message.mjs +2 -0
- package/esm2020/lib/modules/list-view-grid/types/list-view-grid-row-delete-cancel-args.mjs +2 -0
- package/esm2020/lib/modules/list-view-grid/types/list-view-grid-row-delete-confirm-args.mjs +2 -0
- package/esm2020/lib/modules/shared/sky-list-builder-view-grids-resources.module.mjs +56 -0
- package/esm2020/skyux-list-builder-view-grids.mjs +5 -0
- package/esm2020/testing/list-view-grid-fixture-cell.mjs +2 -0
- package/esm2020/testing/list-view-grid-fixture-header.mjs +2 -0
- package/esm2020/testing/list-view-grid-fixture-row.mjs +2 -0
- package/esm2020/testing/list-view-grid-fixture.mjs +66 -0
- package/esm2020/testing/public-api.mjs +5 -0
- package/esm2020/testing/skyux-list-builder-view-grids-testing.mjs +5 -0
- package/fesm2015/{skyux-list-builder-view-grids-testing.js → skyux-list-builder-view-grids-testing.mjs} +1 -1
- package/fesm2015/skyux-list-builder-view-grids-testing.mjs.map +1 -0
- package/fesm2015/skyux-list-builder-view-grids.mjs +905 -0
- package/fesm2015/skyux-list-builder-view-grids.mjs.map +1 -0
- package/{esm2015/testing/list-view-grid-fixture.js → fesm2020/skyux-list-builder-view-grids-testing.mjs} +9 -2
- package/fesm2020/skyux-list-builder-view-grids-testing.mjs.map +1 -0
- package/{fesm2015/skyux-list-builder-view-grids.js → fesm2020/skyux-list-builder-view-grids.mjs} +40 -57
- package/fesm2020/skyux-list-builder-view-grids.mjs.map +1 -0
- package/package.json +42 -18
- package/testing/package.json +5 -5
- package/bundles/skyux-list-builder-view-grids-testing.umd.js +0 -81
- package/bundles/skyux-list-builder-view-grids.umd.js +0 -1359
- package/esm2015/index.js +0 -21
- package/esm2015/index.js.map +0 -1
- package/esm2015/lib/modules/column-selector/column-selector-context.js +0 -9
- package/esm2015/lib/modules/column-selector/column-selector-context.js.map +0 -1
- package/esm2015/lib/modules/column-selector/column-selector-modal.component.js +0 -41
- package/esm2015/lib/modules/column-selector/column-selector-modal.component.js.map +0 -1
- package/esm2015/lib/modules/column-selector/column-selector-modal.module.js +0 -41
- package/esm2015/lib/modules/column-selector/column-selector-modal.module.js.map +0 -1
- package/esm2015/lib/modules/list-column-selector-action/list-column-selector-action.component.js +0 -136
- package/esm2015/lib/modules/list-column-selector-action/list-column-selector-action.component.js.map +0 -1
- package/esm2015/lib/modules/list-column-selector-action/list-column-selector-action.module.js +0 -47
- package/esm2015/lib/modules/list-column-selector-action/list-column-selector-action.module.js.map +0 -1
- package/esm2015/lib/modules/list-column-selector-action/list-column-selector-button.component.js +0 -17
- package/esm2015/lib/modules/list-column-selector-action/list-column-selector-button.component.js.map +0 -1
- package/esm2015/lib/modules/list-view-grid/list-view-grid.component.js +0 -466
- package/esm2015/lib/modules/list-view-grid/list-view-grid.component.js.map +0 -1
- package/esm2015/lib/modules/list-view-grid/list-view-grid.module.js +0 -42
- package/esm2015/lib/modules/list-view-grid/list-view-grid.module.js.map +0 -1
- package/esm2015/lib/modules/list-view-grid/state/columns/columns.orchestrator.js +0 -22
- package/esm2015/lib/modules/list-view-grid/state/columns/columns.orchestrator.js.map +0 -1
- package/esm2015/lib/modules/list-view-grid/state/columns/load.action.js +0 -10
- package/esm2015/lib/modules/list-view-grid/state/columns/load.action.js.map +0 -1
- package/esm2015/lib/modules/list-view-grid/state/displayed-columns/displayed-columns.orchestrator.js +0 -22
- package/esm2015/lib/modules/list-view-grid/state/displayed-columns/displayed-columns.orchestrator.js.map +0 -1
- package/esm2015/lib/modules/list-view-grid/state/displayed-columns/load.action.js +0 -10
- package/esm2015/lib/modules/list-view-grid/state/displayed-columns/load.action.js.map +0 -1
- package/esm2015/lib/modules/list-view-grid/state/grid-state-action.type.js +0 -2
- package/esm2015/lib/modules/list-view-grid/state/grid-state-action.type.js.map +0 -1
- package/esm2015/lib/modules/list-view-grid/state/grid-state.model.js +0 -11
- package/esm2015/lib/modules/list-view-grid/state/grid-state.model.js.map +0 -1
- package/esm2015/lib/modules/list-view-grid/state/grid-state.rxstate.js +0 -19
- package/esm2015/lib/modules/list-view-grid/state/grid-state.rxstate.js.map +0 -1
- package/esm2015/lib/modules/list-view-grid/state/grid-state.state-node.js +0 -27
- package/esm2015/lib/modules/list-view-grid/state/grid-state.state-node.js.map +0 -1
- package/esm2015/lib/modules/list-view-grid/types/list-view-grid-message-type.js +0 -15
- package/esm2015/lib/modules/list-view-grid/types/list-view-grid-message-type.js.map +0 -1
- package/esm2015/lib/modules/list-view-grid/types/list-view-grid-message.js +0 -2
- package/esm2015/lib/modules/list-view-grid/types/list-view-grid-message.js.map +0 -1
- package/esm2015/lib/modules/list-view-grid/types/list-view-grid-row-delete-cancel-args.js +0 -2
- package/esm2015/lib/modules/list-view-grid/types/list-view-grid-row-delete-cancel-args.js.map +0 -1
- package/esm2015/lib/modules/list-view-grid/types/list-view-grid-row-delete-confirm-args.js +0 -2
- package/esm2015/lib/modules/list-view-grid/types/list-view-grid-row-delete-confirm-args.js.map +0 -1
- package/esm2015/lib/modules/shared/sky-list-builder-view-grids-resources.module.js +0 -56
- package/esm2015/lib/modules/shared/sky-list-builder-view-grids-resources.module.js.map +0 -1
- package/esm2015/skyux-list-builder-view-grids.js +0 -5
- package/esm2015/skyux-list-builder-view-grids.js.map +0 -1
- package/esm2015/testing/list-view-grid-fixture-cell.js +0 -2
- package/esm2015/testing/list-view-grid-fixture-cell.js.map +0 -1
- package/esm2015/testing/list-view-grid-fixture-header.js +0 -2
- package/esm2015/testing/list-view-grid-fixture-header.js.map +0 -1
- package/esm2015/testing/list-view-grid-fixture-row.js +0 -2
- package/esm2015/testing/list-view-grid-fixture-row.js.map +0 -1
- package/esm2015/testing/list-view-grid-fixture.js.map +0 -1
- package/esm2015/testing/public-api.js +0 -5
- package/esm2015/testing/public-api.js.map +0 -1
- package/esm2015/testing/skyux-list-builder-view-grids-testing.js +0 -5
- package/esm2015/testing/skyux-list-builder-view-grids-testing.js.map +0 -1
- package/fesm2015/skyux-list-builder-view-grids-testing.js.map +0 -1
- package/fesm2015/skyux-list-builder-view-grids.js.map +0 -1
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Input, Output, QueryList, ViewChild, forwardRef, } from '@angular/core';
|
|
2
|
+
import { SkyGridColumnComponent, SkyGridColumnModel, SkyGridComponent, SkyGridMessageType, SkyGridSelectedRowsSource, } from '@skyux/grids';
|
|
3
|
+
import { ListSearchModel, ListState, ListStateDispatcher, ListViewComponent, } from '@skyux/list-builder';
|
|
4
|
+
import { getValue } from '@skyux/list-builder-common';
|
|
5
|
+
import { getData, isObservable, } from '@skyux/list-builder-common';
|
|
6
|
+
import { Subject, of as observableOf } from 'rxjs';
|
|
7
|
+
import { distinctUntilChanged, map as observableMap, scan, take, takeUntil, } from 'rxjs/operators';
|
|
8
|
+
import { ListViewGridColumnsLoadAction } from './state/columns/load.action';
|
|
9
|
+
import { ListViewDisplayedGridColumnsLoadAction } from './state/displayed-columns/load.action';
|
|
10
|
+
import { GridStateModel } from './state/grid-state.model';
|
|
11
|
+
import { GridStateDispatcher } from './state/grid-state.rxstate';
|
|
12
|
+
import { GridState } from './state/grid-state.state-node';
|
|
13
|
+
import { SkyListViewGridMessageType } from './types/list-view-grid-message-type';
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
import * as i1 from "@skyux/list-builder";
|
|
16
|
+
import * as i2 from "./state/grid-state.state-node";
|
|
17
|
+
import * as i3 from "./state/grid-state.rxstate";
|
|
18
|
+
import * as i4 from "@skyux/grids";
|
|
19
|
+
import * as i5 from "@skyux/indicators";
|
|
20
|
+
import * as i6 from "@angular/common";
|
|
21
|
+
/**
|
|
22
|
+
* Displays a grid for a
|
|
23
|
+
* [SKY UX-themed list of data](https://developer.blackbaud.com/skyux/components/list/overview)
|
|
24
|
+
* using the [grid component](https://developer.blackbaud.com/skyux/components/grid).
|
|
25
|
+
* You must install `SkyListModule` as a dependency.
|
|
26
|
+
*/
|
|
27
|
+
export class SkyListViewGridComponent extends ListViewComponent {
|
|
28
|
+
constructor(state, dispatcher, gridState, gridDispatcher) {
|
|
29
|
+
super(state, 'Grid View');
|
|
30
|
+
this.dispatcher = dispatcher;
|
|
31
|
+
this.gridState = gridState;
|
|
32
|
+
this.gridDispatcher = gridDispatcher;
|
|
33
|
+
/**
|
|
34
|
+
* Specifies how the grid fits to its parent. `"width"` fits the grid to the parent's full
|
|
35
|
+
* width, and `"scroll"` allows the grid to exceed the parent's width. If the grid does not have
|
|
36
|
+
* enough columns to fill the parent's width, it always stretches to the parent's full width.
|
|
37
|
+
* @default "width"
|
|
38
|
+
*/
|
|
39
|
+
this.fit = 'width';
|
|
40
|
+
/**
|
|
41
|
+
* Indicates whether to highlight search text within the grid.
|
|
42
|
+
* @default true
|
|
43
|
+
*/
|
|
44
|
+
this.highlightSearchText = true;
|
|
45
|
+
/**
|
|
46
|
+
* Indicates whether to enable the multiselect feature to display a column of checkboxes
|
|
47
|
+
* on the left side of the grid. Multiselect also displays an action bar with buttons to
|
|
48
|
+
* select and clear all checkboxes. Multiselect defaults to the `id` property on the list's
|
|
49
|
+
* `data` object.
|
|
50
|
+
* @default false
|
|
51
|
+
*/
|
|
52
|
+
this.enableMultiselect = false;
|
|
53
|
+
/**
|
|
54
|
+
* Fires when users cancel the deletion of a row.
|
|
55
|
+
*/
|
|
56
|
+
this.rowDeleteCancel = new EventEmitter();
|
|
57
|
+
/**
|
|
58
|
+
* Fires when users confirm the deletion of a row.
|
|
59
|
+
*/
|
|
60
|
+
this.rowDeleteConfirm = new EventEmitter();
|
|
61
|
+
/**
|
|
62
|
+
* Fires when columns change. This includes changes to the displayed columns and changes
|
|
63
|
+
* to the order of columns. The event emits an array of IDs for the displayed columns that
|
|
64
|
+
* reflects the column order.
|
|
65
|
+
*/
|
|
66
|
+
this.selectedColumnIdsChange = new EventEmitter();
|
|
67
|
+
/**
|
|
68
|
+
* Message stream for communicating with the internal grid instance
|
|
69
|
+
* @interal
|
|
70
|
+
*/
|
|
71
|
+
this.gridMessageStream = new Subject();
|
|
72
|
+
this.multiselectSelectedIds = [];
|
|
73
|
+
this.ngUnsubscribe = new Subject();
|
|
74
|
+
this._messageStream = new Subject();
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Specifies the name of the view.
|
|
78
|
+
* @required
|
|
79
|
+
*/
|
|
80
|
+
set name(value) {
|
|
81
|
+
this.viewName = value;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Provides an observable to send commands to the grid.
|
|
85
|
+
* The commands should respect the `SkyListViewGridMessage` type.
|
|
86
|
+
*/
|
|
87
|
+
set messageStream(stream) {
|
|
88
|
+
/* istanbul ignore else */
|
|
89
|
+
if (this._messageStream) {
|
|
90
|
+
this._messageStream.unsubscribe();
|
|
91
|
+
}
|
|
92
|
+
this._messageStream = stream;
|
|
93
|
+
this.initInlineDeleteMessages();
|
|
94
|
+
}
|
|
95
|
+
get messageStream() {
|
|
96
|
+
return this._messageStream;
|
|
97
|
+
}
|
|
98
|
+
get gridHeight() {
|
|
99
|
+
/* istanbul ignore next */
|
|
100
|
+
return typeof this.height === 'number'
|
|
101
|
+
? observableOf(this.height)
|
|
102
|
+
: this.height;
|
|
103
|
+
}
|
|
104
|
+
get gridWidth() {
|
|
105
|
+
/* istanbul ignore next */
|
|
106
|
+
return typeof this.width === 'number'
|
|
107
|
+
? observableOf(this.width)
|
|
108
|
+
: this.width;
|
|
109
|
+
}
|
|
110
|
+
ngAfterContentInit() {
|
|
111
|
+
// Watch for selection changes and update multiselectSelectedIds for local comparison.
|
|
112
|
+
this.state
|
|
113
|
+
.pipe(observableMap((s) => s.selected.item), takeUntil(this.ngUnsubscribe), distinctUntilChanged(this.selectedMapEqual))
|
|
114
|
+
.subscribe((items) => {
|
|
115
|
+
const selectedIds = [];
|
|
116
|
+
items.selectedIdMap.forEach((isSelected, id) => {
|
|
117
|
+
if (items.selectedIdMap.get(id) === true) {
|
|
118
|
+
selectedIds.push(id);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
this.multiselectSelectedIds = selectedIds;
|
|
122
|
+
});
|
|
123
|
+
/* istanbul ignore next */
|
|
124
|
+
if (this.columnComponents.length === 0) {
|
|
125
|
+
throw new Error('Grid view requires at least one sky-grid-column to render.');
|
|
126
|
+
}
|
|
127
|
+
const columnModels = this.columnComponents.map((columnComponent) => {
|
|
128
|
+
return new SkyGridColumnModel(columnComponent.template, columnComponent);
|
|
129
|
+
});
|
|
130
|
+
if (this.width && !isObservable(this.width)) {
|
|
131
|
+
this.width = observableOf(this.width);
|
|
132
|
+
}
|
|
133
|
+
if (this.height && !isObservable(this.height)) {
|
|
134
|
+
this.height = observableOf(this.height);
|
|
135
|
+
}
|
|
136
|
+
// Setup Observables for template
|
|
137
|
+
this.columns = this.gridState.pipe(observableMap((s) => s.columns.items), distinctUntilChanged(this.arraysEqual), takeUntil(this.ngUnsubscribe));
|
|
138
|
+
this.selectedColumnIds = this.getSelectedIds();
|
|
139
|
+
this.items = this.getGridItems();
|
|
140
|
+
this.loading = this.state.pipe(observableMap((s) => {
|
|
141
|
+
return s.items.loading;
|
|
142
|
+
}), distinctUntilChanged(), takeUntil(this.ngUnsubscribe));
|
|
143
|
+
this.sortField = this.state.pipe(observableMap((s) => {
|
|
144
|
+
/* istanbul ignore else */
|
|
145
|
+
/* sanity check */
|
|
146
|
+
if (s.sort && s.sort.fieldSelectors) {
|
|
147
|
+
return s.sort.fieldSelectors[0];
|
|
148
|
+
}
|
|
149
|
+
/* istanbul ignore next */
|
|
150
|
+
/* sanity check */
|
|
151
|
+
return undefined;
|
|
152
|
+
}), distinctUntilChanged(), takeUntil(this.ngUnsubscribe));
|
|
153
|
+
this.gridState
|
|
154
|
+
.pipe(observableMap((s) => s.columns.items), takeUntil(this.ngUnsubscribe), distinctUntilChanged(this.arraysEqual))
|
|
155
|
+
.subscribe((columns) => {
|
|
156
|
+
/* istanbul ignore else */
|
|
157
|
+
if (this.hiddenColumns) {
|
|
158
|
+
getValue(this.hiddenColumns, (hiddenColumns) => {
|
|
159
|
+
this.gridDispatcher.next(new ListViewDisplayedGridColumnsLoadAction(columns.filter((x) => {
|
|
160
|
+
/* istanbul ignore next */
|
|
161
|
+
/* sanity check */
|
|
162
|
+
const id = x.id || x.field;
|
|
163
|
+
return hiddenColumns.indexOf(id) === -1;
|
|
164
|
+
}), true));
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
else if (this.displayedColumns) {
|
|
168
|
+
/* istanbul ignore next */
|
|
169
|
+
getValue(this.displayedColumns, (displayedColumns) => {
|
|
170
|
+
this.gridDispatcher.next(new ListViewDisplayedGridColumnsLoadAction(columns.filter((x) => displayedColumns.indexOf(x.id || x.field) !== -1), true));
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
this.gridDispatcher.next(new ListViewDisplayedGridColumnsLoadAction(columns.filter((x) => !x.hidden), true));
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
this.currentSearchText = this.state.pipe(observableMap((s) => s.search.searchText), distinctUntilChanged(), takeUntil(this.ngUnsubscribe));
|
|
178
|
+
this.gridDispatcher.next(new ListViewGridColumnsLoadAction(columnModels, true));
|
|
179
|
+
this.handleColumnChange();
|
|
180
|
+
if (this.enableMultiselect) {
|
|
181
|
+
this.dispatcher.toolbarShowMultiselectToolbar(true);
|
|
182
|
+
}
|
|
183
|
+
this.initInlineDeleteMessages();
|
|
184
|
+
}
|
|
185
|
+
ngOnDestroy() {
|
|
186
|
+
this.ngUnsubscribe.next();
|
|
187
|
+
this.ngUnsubscribe.complete();
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* If user makes selection, tell list-builder to update the list state.
|
|
191
|
+
* This logic should only run on user interaction - NOT programmatic updates.
|
|
192
|
+
*/
|
|
193
|
+
onMultiselectSelectionChange(event) {
|
|
194
|
+
if (event.source === SkyGridSelectedRowsSource.CheckboxChange ||
|
|
195
|
+
event.source === SkyGridSelectedRowsSource.RowClick) {
|
|
196
|
+
this.state
|
|
197
|
+
.pipe(observableMap((s) => s.items.items), take(1))
|
|
198
|
+
.subscribe((items) => {
|
|
199
|
+
const newItemIds = this.arrayIntersection(items.map((i) => i.id), this.multiselectSelectedIds);
|
|
200
|
+
const newIds = items.filter((i) => i.isSelected).map((i) => i.id);
|
|
201
|
+
// Check for deselected ids & send message to dispatcher.
|
|
202
|
+
const deselectedIds = this.arrayDiff(newItemIds, newIds);
|
|
203
|
+
if (deselectedIds.length > 0) {
|
|
204
|
+
this.dispatcher.setSelected(deselectedIds, false);
|
|
205
|
+
}
|
|
206
|
+
// Check for selected ids & send message to dispatcher.
|
|
207
|
+
const selectedIds = this.arrayDiff(newIds, newItemIds);
|
|
208
|
+
if (selectedIds.length > 0) {
|
|
209
|
+
this.dispatcher.setSelected(selectedIds, true);
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
columnIdsChanged(selectedColumnIds) {
|
|
215
|
+
this.selectedColumnIds.pipe(take(1)).subscribe((currentIds) => {
|
|
216
|
+
if (!this.arraysEqual(selectedColumnIds, currentIds)) {
|
|
217
|
+
this.gridState
|
|
218
|
+
.pipe(observableMap((s) => s.columns.items), take(1))
|
|
219
|
+
.subscribe((columns) => {
|
|
220
|
+
const displayedColumns = selectedColumnIds.map((columnId) => columns.filter((c) => c.id === columnId)[0]);
|
|
221
|
+
this.gridDispatcher.next(new ListViewDisplayedGridColumnsLoadAction(displayedColumns, true));
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
cancelRowDelete(args) {
|
|
227
|
+
this.rowDeleteCancel.emit(args);
|
|
228
|
+
}
|
|
229
|
+
confirmRowDelete(args) {
|
|
230
|
+
this.rowDeleteConfirm.emit(args);
|
|
231
|
+
}
|
|
232
|
+
sortFieldChanged(sortField) {
|
|
233
|
+
this.dispatcher.sortSetFieldSelectors([sortField]);
|
|
234
|
+
}
|
|
235
|
+
onViewActive() {
|
|
236
|
+
/*
|
|
237
|
+
Ran into problem where state updates were consumed out of order. For example, on search text
|
|
238
|
+
update, the searchText update was consumed after the resulting list item update. Scanning the
|
|
239
|
+
previous value of items lastUpdate ensures that we only receive the latest items.
|
|
240
|
+
*/
|
|
241
|
+
this.gridState
|
|
242
|
+
.pipe(takeUntil(this.ngUnsubscribe), scan((previousValue, newValue) => {
|
|
243
|
+
if (previousValue.displayedColumns.lastUpdate >
|
|
244
|
+
newValue.displayedColumns.lastUpdate) {
|
|
245
|
+
return previousValue;
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
return newValue;
|
|
249
|
+
}
|
|
250
|
+
}), observableMap((s) => s.displayedColumns.items), distinctUntilChanged(this.arraysEqual))
|
|
251
|
+
.subscribe((displayedColumns) => {
|
|
252
|
+
const setFunctions = this.searchFunction !== undefined
|
|
253
|
+
? [this.searchFunction]
|
|
254
|
+
: displayedColumns
|
|
255
|
+
.map((column) => (data, searchText) => column.searchFunction(getData(data, column.field), searchText))
|
|
256
|
+
.filter((c) => c !== undefined);
|
|
257
|
+
this.state.pipe(take(1)).subscribe((s) => {
|
|
258
|
+
this.dispatcher.searchSetOptions(new ListSearchModel({
|
|
259
|
+
searchText: s.search.searchText,
|
|
260
|
+
functions: setFunctions,
|
|
261
|
+
fieldSelectors: displayedColumns.map((d) => d.field),
|
|
262
|
+
}));
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
initInlineDeleteMessages() {
|
|
267
|
+
/* istanbul ignore next */
|
|
268
|
+
if (this.messageStream) {
|
|
269
|
+
this.messageStream.subscribe((message) => {
|
|
270
|
+
if (message.type === SkyListViewGridMessageType.AbortDeleteRow) {
|
|
271
|
+
this.gridMessageStream.next({
|
|
272
|
+
type: SkyGridMessageType.AbortDeleteRow,
|
|
273
|
+
data: {
|
|
274
|
+
abortDeleteRow: message.data.abortDeleteRow,
|
|
275
|
+
},
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
else if (message.type === SkyListViewGridMessageType.PromptDeleteRow) {
|
|
279
|
+
this.gridMessageStream.next({
|
|
280
|
+
type: SkyGridMessageType.PromptDeleteRow,
|
|
281
|
+
data: {
|
|
282
|
+
promptDeleteRow: message.data.promptDeleteRow,
|
|
283
|
+
},
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
handleColumnChange() {
|
|
290
|
+
// watch for changes in column components
|
|
291
|
+
this.columnComponents.changes
|
|
292
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
293
|
+
.subscribe((columnComponents) => {
|
|
294
|
+
const columnModels = this.columnComponents.map((column) => {
|
|
295
|
+
return new SkyGridColumnModel(column.template, column);
|
|
296
|
+
});
|
|
297
|
+
this.gridDispatcher.next(new ListViewGridColumnsLoadAction(columnModels, true));
|
|
298
|
+
});
|
|
299
|
+
// Watch for column heading changes:
|
|
300
|
+
this.columnComponents.forEach((comp) => {
|
|
301
|
+
comp.headingModelChanges
|
|
302
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
303
|
+
.subscribe((change) => {
|
|
304
|
+
this.gridComponent.updateColumnHeading(change);
|
|
305
|
+
});
|
|
306
|
+
comp.descriptionModelChanges
|
|
307
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
308
|
+
.subscribe((change) => {
|
|
309
|
+
this.gridComponent.updateColumnDescription(change);
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
getGridItems() {
|
|
314
|
+
/*
|
|
315
|
+
Same problem as above. We should move from having a state object observable with a bunch of
|
|
316
|
+
static properties to a static state object with observable properties that you can subscribe
|
|
317
|
+
to.
|
|
318
|
+
*/
|
|
319
|
+
return this.state.pipe(observableMap((s) => {
|
|
320
|
+
return s.items;
|
|
321
|
+
}), scan((previousValue, newValue) => {
|
|
322
|
+
if (previousValue.lastUpdate > newValue.lastUpdate) {
|
|
323
|
+
return previousValue;
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
return newValue;
|
|
327
|
+
}
|
|
328
|
+
}), observableMap((result) => {
|
|
329
|
+
return result.items;
|
|
330
|
+
}), distinctUntilChanged());
|
|
331
|
+
}
|
|
332
|
+
getSelectedIds() {
|
|
333
|
+
/*
|
|
334
|
+
Same problem as above. We should move from having a state object observable with a bunch of
|
|
335
|
+
static properties to a static state object with observable properties that you can subscribe
|
|
336
|
+
to.
|
|
337
|
+
*/
|
|
338
|
+
return this.gridState.pipe(observableMap((s) => s.displayedColumns), scan((previousValue, newValue) => {
|
|
339
|
+
if (previousValue.lastUpdate > newValue.lastUpdate) {
|
|
340
|
+
return previousValue;
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
return newValue;
|
|
344
|
+
}
|
|
345
|
+
}), observableMap((result) => {
|
|
346
|
+
/* istanbul ignore next */
|
|
347
|
+
/* sanity check */
|
|
348
|
+
return result.items.map((column) => {
|
|
349
|
+
return column.id || column.field;
|
|
350
|
+
});
|
|
351
|
+
}), distinctUntilChanged((previousValue, newValue) => {
|
|
352
|
+
return this.haveColumnIdsChanged(previousValue, newValue);
|
|
353
|
+
}));
|
|
354
|
+
}
|
|
355
|
+
haveColumnIdsChanged(previousValue, newValue) {
|
|
356
|
+
if (previousValue.length !== newValue.length) {
|
|
357
|
+
this.selectedColumnIdsChange.emit(newValue);
|
|
358
|
+
return false;
|
|
359
|
+
}
|
|
360
|
+
for (let i = 0; i < previousValue.length; i++) {
|
|
361
|
+
/* istanbul ignore if */
|
|
362
|
+
if (previousValue[i] !== newValue[i]) {
|
|
363
|
+
this.selectedColumnIdsChange.emit(newValue);
|
|
364
|
+
return false;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
return true;
|
|
368
|
+
}
|
|
369
|
+
selectedMapEqual(prev, next) {
|
|
370
|
+
if (prev.selectedIdMap.size !== next.selectedIdMap.size) {
|
|
371
|
+
return false;
|
|
372
|
+
}
|
|
373
|
+
const keys = [];
|
|
374
|
+
next.selectedIdMap.forEach((value, key) => {
|
|
375
|
+
keys.push(key);
|
|
376
|
+
});
|
|
377
|
+
for (let i = 0; i < keys.length; i++) {
|
|
378
|
+
const key = keys[i];
|
|
379
|
+
const value = next.selectedIdMap.get(key);
|
|
380
|
+
if (value !== prev.selectedIdMap.get(key)) {
|
|
381
|
+
return false;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
return true;
|
|
385
|
+
}
|
|
386
|
+
arrayDiff(arrA, arrB) {
|
|
387
|
+
return arrA.filter((i) => arrB.indexOf(i) < 0);
|
|
388
|
+
}
|
|
389
|
+
arrayIntersection(arrA, arrB) {
|
|
390
|
+
return arrA.filter((value) => -1 !== arrB.indexOf(value));
|
|
391
|
+
}
|
|
392
|
+
arraysEqual(arrayA, arrayB) {
|
|
393
|
+
return (arrayA.length === arrayB.length &&
|
|
394
|
+
arrayA.every((value, index) => value === arrayB[index]));
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
SkyListViewGridComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyListViewGridComponent, deps: [{ token: i1.ListState }, { token: i1.ListStateDispatcher }, { token: i2.GridState }, { token: i3.GridStateDispatcher }], target: i0.ɵɵFactoryTarget.Component });
|
|
398
|
+
SkyListViewGridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: SkyListViewGridComponent, selector: "sky-list-view-grid", inputs: { name: "name", displayedColumns: "displayedColumns", hiddenColumns: "hiddenColumns", fit: "fit", width: "width", height: "height", highlightSearchText: "highlightSearchText", messageStream: "messageStream", rowHighlightedId: "rowHighlightedId", enableMultiselect: "enableMultiselect", settingsKey: "settingsKey", searchFunction: ["search", "searchFunction"] }, outputs: { rowDeleteCancel: "rowDeleteCancel", rowDeleteConfirm: "rowDeleteConfirm", selectedColumnIdsChange: "selectedColumnIdsChange" }, providers: [
|
|
399
|
+
/* tslint:disable */
|
|
400
|
+
{
|
|
401
|
+
provide: ListViewComponent,
|
|
402
|
+
useExisting: forwardRef(() => SkyListViewGridComponent),
|
|
403
|
+
},
|
|
404
|
+
/* tslint:enable */
|
|
405
|
+
GridState,
|
|
406
|
+
GridStateDispatcher,
|
|
407
|
+
GridStateModel,
|
|
408
|
+
], queries: [{ propertyName: "columnComponents", predicate: SkyGridColumnComponent }], viewQueries: [{ propertyName: "gridComponent", first: true, predicate: SkyGridComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div *ngIf=\"active | async\">\n <sky-grid\n [columns]=\"columns | async\"\n [data]=\"items | async\"\n [enableMultiselect]=\"enableMultiselect\"\n [fit]=\"fit\"\n [height]=\"gridHeight | async\"\n [highlightText]=\"\n highlightSearchText ? (currentSearchText | async) : undefined\n \"\n [rowHighlightedId]=\"rowHighlightedId\"\n [messageStream]=\"gridMessageStream\"\n [selectedColumnIds]=\"selectedColumnIds | async\"\n [selectedRowIds]=\"multiselectSelectedIds\"\n [settingsKey]=\"settingsKey\"\n [sortField]=\"sortField | async\"\n [width]=\"gridWidth | async\"\n (multiselectSelectionChange)=\"onMultiselectSelectionChange($event)\"\n (rowDeleteCancel)=\"cancelRowDelete($event)\"\n (rowDeleteConfirm)=\"confirmRowDelete($event)\"\n (selectedColumnIdsChange)=\"columnIdsChanged($event)\"\n (sortFieldChange)=\"sortFieldChanged($event)\"\n #skyGrid\n >\n </sky-grid>\n <sky-wait [isWaiting]=\"loading | async\"> </sky-wait>\n</div>\n", styles: [":host ::ng-deep .sky-grid-heading{border-top:0!important}\n"], components: [{ type: i4.SkyGridComponent, selector: "sky-grid", inputs: ["columns", "data", "enableMultiselect", "fit", "hasToolbar", "height", "highlightText", "messageStream", "multiselectRowId", "rowHighlightedId", "selectedColumnIds", "selectedRowIds", "settingsKey", "sortField", "width"], outputs: ["columnWidthChange", "multiselectSelectionChange", "rowDeleteCancel", "rowDeleteConfirm", "selectedColumnIdsChange", "sortFieldChange"] }, { type: i5.λ14, selector: "sky-wait", inputs: ["ariaLabel", "isWaiting", "isFullPage", "isNonBlocking"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "async": i6.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
409
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyListViewGridComponent, decorators: [{
|
|
410
|
+
type: Component,
|
|
411
|
+
args: [{ selector: 'sky-list-view-grid', providers: [
|
|
412
|
+
/* tslint:disable */
|
|
413
|
+
{
|
|
414
|
+
provide: ListViewComponent,
|
|
415
|
+
useExisting: forwardRef(() => SkyListViewGridComponent),
|
|
416
|
+
},
|
|
417
|
+
/* tslint:enable */
|
|
418
|
+
GridState,
|
|
419
|
+
GridStateDispatcher,
|
|
420
|
+
GridStateModel,
|
|
421
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"active | async\">\n <sky-grid\n [columns]=\"columns | async\"\n [data]=\"items | async\"\n [enableMultiselect]=\"enableMultiselect\"\n [fit]=\"fit\"\n [height]=\"gridHeight | async\"\n [highlightText]=\"\n highlightSearchText ? (currentSearchText | async) : undefined\n \"\n [rowHighlightedId]=\"rowHighlightedId\"\n [messageStream]=\"gridMessageStream\"\n [selectedColumnIds]=\"selectedColumnIds | async\"\n [selectedRowIds]=\"multiselectSelectedIds\"\n [settingsKey]=\"settingsKey\"\n [sortField]=\"sortField | async\"\n [width]=\"gridWidth | async\"\n (multiselectSelectionChange)=\"onMultiselectSelectionChange($event)\"\n (rowDeleteCancel)=\"cancelRowDelete($event)\"\n (rowDeleteConfirm)=\"confirmRowDelete($event)\"\n (selectedColumnIdsChange)=\"columnIdsChanged($event)\"\n (sortFieldChange)=\"sortFieldChanged($event)\"\n #skyGrid\n >\n </sky-grid>\n <sky-wait [isWaiting]=\"loading | async\"> </sky-wait>\n</div>\n", styles: [":host ::ng-deep .sky-grid-heading{border-top:0!important}\n"] }]
|
|
422
|
+
}], ctorParameters: function () { return [{ type: i1.ListState }, { type: i1.ListStateDispatcher }, { type: i2.GridState }, { type: i3.GridStateDispatcher }]; }, propDecorators: { name: [{
|
|
423
|
+
type: Input
|
|
424
|
+
}], displayedColumns: [{
|
|
425
|
+
type: Input
|
|
426
|
+
}], hiddenColumns: [{
|
|
427
|
+
type: Input
|
|
428
|
+
}], fit: [{
|
|
429
|
+
type: Input
|
|
430
|
+
}], width: [{
|
|
431
|
+
type: Input
|
|
432
|
+
}], height: [{
|
|
433
|
+
type: Input
|
|
434
|
+
}], highlightSearchText: [{
|
|
435
|
+
type: Input
|
|
436
|
+
}], messageStream: [{
|
|
437
|
+
type: Input
|
|
438
|
+
}], rowHighlightedId: [{
|
|
439
|
+
type: Input
|
|
440
|
+
}], enableMultiselect: [{
|
|
441
|
+
type: Input
|
|
442
|
+
}], settingsKey: [{
|
|
443
|
+
type: Input
|
|
444
|
+
}], rowDeleteCancel: [{
|
|
445
|
+
type: Output
|
|
446
|
+
}], rowDeleteConfirm: [{
|
|
447
|
+
type: Output
|
|
448
|
+
}], selectedColumnIdsChange: [{
|
|
449
|
+
type: Output
|
|
450
|
+
}], gridComponent: [{
|
|
451
|
+
type: ViewChild,
|
|
452
|
+
args: [SkyGridComponent]
|
|
453
|
+
}], searchFunction: [{
|
|
454
|
+
type: Input,
|
|
455
|
+
args: ['search']
|
|
456
|
+
}], columnComponents: [{
|
|
457
|
+
type: ContentChildren,
|
|
458
|
+
args: [SkyGridColumnComponent]
|
|
459
|
+
}] } });
|
|
460
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC12aWV3LWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2xpc3QtYnVpbGRlci12aWV3LWdyaWRzL3NyYy9saWIvbW9kdWxlcy9saXN0LXZpZXctZ3JpZC9saXN0LXZpZXctZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvbGlzdC1idWlsZGVyLXZpZXctZ3JpZHMvc3JjL2xpYi9tb2R1bGVzL2xpc3Qtdmlldy1ncmlkL2xpc3Qtdmlldy1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULGVBQWUsRUFDZixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUNULFVBQVUsR0FDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsc0JBQXNCLEVBR3RCLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFFaEIsa0JBQWtCLEVBRWxCLHlCQUF5QixHQUMxQixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQ0wsZUFBZSxFQUVmLFNBQVMsRUFDVCxtQkFBbUIsRUFDbkIsaUJBQWlCLEdBQ2xCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFhLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2pFLE9BQU8sRUFHTCxPQUFPLEVBQ1AsWUFBWSxHQUNiLE1BQU0sNEJBQTRCLENBQUM7QUFFcEMsT0FBTyxFQUFjLE9BQU8sRUFBRSxFQUFFLElBQUksWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9ELE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsR0FBRyxJQUFJLGFBQWEsRUFDcEIsSUFBSSxFQUNKLElBQUksRUFDSixTQUFTLEdBQ1YsTUFBTSxnQkFBZ0Is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R0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUM7U0FDeEQ7UUFDRCxtQkFBbUI7UUFDbkIsU0FBUztRQUNULG1CQUFtQjtRQUNuQixjQUFjO0tBQ2YsMkRBMEtnQixzQkFBc0IsNEVBOUM1QixnQkFBZ0IsdUVDMU03QixnL0JBMkJBOzJGRHNEYSx3QkFBd0I7a0JBakJwQyxTQUFTOytCQUNFLG9CQUFvQixhQUduQjt3QkFDVCxvQkFBb0I7d0JBQ3BCOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHlCQUF5QixDQUFDO3lCQUN4RDt3QkFDRCxtQkFBbUI7d0JBQ25CLFNBQVM7d0JBQ1QsbUJBQW1CO3dCQUNuQixjQUFjO3FCQUNmLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNOzRMQVdwQyxJQUFJO3NCQURkLEtBQUs7Z0JBU0MsZ0JBQWdCO3NCQUR0QixLQUFLO2dCQU9DLGFBQWE7c0JBRG5CLEtBQUs7Z0JBVUMsR0FBRztzQkFEVCxLQUFLO2dCQU9DLEtBQUs7c0JBRFgsS0FBSztnQkFPQyxNQUFNO3NCQURaLEtBQUs7Z0JBUUMsbUJBQW1CO3NCQUR6QixLQUFLO2dCQVFLLGFBQWE7c0JBRHZCLEtBQUs7Z0JBdUJDLGdCQUFnQjtzQkFEdEIsS0FBSztnQkFXQyxpQkFBaUI7c0JBRHZCLEtBQUs7Z0JBVUMsV0FBVztzQkFEakIsS0FBSztnQkFPQyxlQUFlO3NCQURyQixNQUFNO2dCQU9BLGdCQUFnQjtzQkFEdEIsTUFBTTtnQkFTQSx1QkFBdUI7c0JBRDdCLE1BQU07Z0JBSUEsYUFBYTtzQkFEbkIsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBNENwQixjQUFjO3NCQURwQixLQUFLO3VCQUFDLFFBQVE7Z0JBSVAsZ0JBQWdCO3NCQUR2QixlQUFlO3VCQUFDLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkLFxuICBmb3J3YXJkUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIFNreUdyaWRDb2x1bW5Db21wb25lbnQsXG4gIFNreUdyaWRDb2x1bW5EZXNjcmlwdGlvbk1vZGVsQ2hhbmdlLFxuICBTa3lHcmlkQ29sdW1uSGVhZGluZ01vZGVsQ2hhbmdlLFxuICBTa3lHcmlkQ29sdW1uTW9kZWwsXG4gIFNreUdyaWRDb21wb25lbnQsXG4gIFNreUdyaWRNZXNzYWdlLFxuICBTa3lHcmlkTWVzc2FnZVR5cGUsXG4gIFNreUdyaWRTZWxlY3RlZFJvd3NNb2RlbENoYW5nZSxcbiAgU2t5R3JpZFNlbGVjdGVkUm93c1NvdXJjZSxcbn0gZnJvbSAnQHNreXV4L2dyaWRzJztcbmltcG9ydCB7XG4gIExpc3RTZWFyY2hNb2RlbCxcbiAgTGlzdFNlbGVjdGVkTW9kZWwsXG4gIExpc3RTdGF0ZSxcbiAgTGlzdFN0YXRlRGlzcGF0Y2hlcixcbiAgTGlzdFZpZXdDb21wb25lbnQsXG59IGZyb20gJ0Bza3l1eC9saXN0LWJ1aWxkZXInO1xuaW1wb3J0IHsgQXN5bmNMaXN0LCBnZXRWYWx1ZSB9IGZyb20gJ0Bza3l1eC9saXN0LWJ1aWxkZXItY29tbW9uJztcbmltcG9ydCB7XG4gIExpc3RJdGVtTW9kZWwsXG4gIExpc3RTb3J0RmllbGRTZWxlY3Rvck1vZGVsLFxuICBnZXREYXRhLFxuICBpc09ic2VydmFibGUsXG59IGZyb20gJ0Bza3l1eC9saXN0LWJ1aWxkZXItY29tbW9uJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgb2YgYXMgb2JzZXJ2YWJsZU9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgbWFwIGFzIG9ic2VydmFibGVNYXAsXG4gIHNjYW4sXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBMaXN0Vmlld0dyaWRDb2x1bW5zTG9hZEFjdGlvbiB9IGZyb20gJy4vc3RhdGUvY29sdW1ucy9sb2FkLmFjdGlvbic7XG5pbXBvcnQgeyBMaXN0Vmlld0Rpc3BsYXllZEdyaWRDb2x1bW5zTG9hZEFjdGlvbiB9IGZyb20gJy4vc3RhdGUvZGlzcGxheWVkLWNvbHVtbnMvbG9hZC5hY3Rpb24nO1xuaW1wb3J0IHsgR3JpZFN0YXRlTW9kZWwgfSBmcm9tICcuL3N0YXRlL2dyaWQtc3RhdGUubW9kZWwnO1xuaW1wb3J0IHsgR3JpZFN0YXRlRGlzcGF0Y2hlciB9IGZyb20gJy4vc3RhdGUvZ3JpZC1zdGF0ZS5yeHN0YXRlJztcbmltcG9ydCB7IEdyaWRTdGF0ZSB9IGZyb20gJy4vc3RhdGUvZ3JpZC1zdGF0ZS5zdGF0ZS1ub2RlJztcbmltcG9ydCB7IFNreUxpc3RWaWV3R3JpZE1lc3NhZ2UgfSBmcm9tICcuL3R5cGVzL2xpc3Qtdmlldy1ncmlkLW1lc3NhZ2UnO1xuaW1wb3J0IHsgU2t5TGlzdFZpZXdHcmlkTWVzc2FnZVR5cGUgfSBmcm9tICcuL3R5cGVzL2xpc3Qtdmlldy1ncmlkLW1lc3NhZ2UtdHlwZSc7XG5pbXBvcnQgeyBTa3lMaXN0Vmlld0dyaWRSb3dEZWxldGVDYW5jZWxBcmdzIH0gZnJvbSAnLi90eXBlcy9saXN0LXZpZXctZ3JpZC1yb3ctZGVsZXRlLWNhbmNlbC1hcmdzJztcbmltcG9ydCB7IFNreUxpc3RWaWV3R3JpZFJvd0RlbGV0ZUNvbmZpcm1BcmdzIH0gZnJvbSAnLi90eXBlcy9saXN0LXZpZXctZ3JpZC1yb3ctZGVsZXRlLWNvbmZpcm0tYXJncyc7XG5cbi8qKlxuICogRGlzcGxheXMgYSBncmlkIGZvciBhXG4gKiBbU0tZIFVYLXRoZW1lZCBsaXN0IG9mIGRhdGFdKGh0dHBzOi8vZGV2ZWxvcGVyLmJsYWNrYmF1ZC5jb20vc2t5dXgvY29tcG9uZW50cy9saXN0L292ZXJ2aWV3KVxuICogdXNpbmcgdGhlIFtncmlkIGNvbXBvbmVudF0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9jb21wb25lbnRzL2dyaWQpLlxuICogWW91IG11c3QgaW5zdGFsbCBgU2t5TGlzdE1vZHVsZWAgYXMgYSBkZXBlbmRlbmN5LlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdza3ktbGlzdC12aWV3LWdyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vbGlzdC12aWV3LWdyaWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9saXN0LXZpZXctZ3JpZC5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICAvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IExpc3RWaWV3Q29tcG9uZW50LFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2t5TGlzdFZpZXdHcmlkQ29tcG9uZW50KSxcbiAgICB9LFxuICAgIC8qIHRzbGludDplbmFibGUgKi9cbiAgICBHcmlkU3RhdGUsXG4gICAgR3JpZFN0YXRlRGlzcGF0Y2hlcixcbiAgICBHcmlkU3RhdGVNb2RlbCxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNreUxpc3RWaWV3R3JpZENvbXBvbmVudFxuICBleHRlbmRzIExpc3RWaWV3Q29tcG9uZW50XG4gIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95XG57XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHZpZXcuXG4gICAqIEByZXF1aXJlZFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBuYW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnZpZXdOYW1lID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBjb2x1bW5zIHRvIGRpc3BsYXkgYnkgZGVmYXVsdCBiYXNlZCBvbiB0aGUgSUQgb3IgZmllbGQgb2YgdGhlIGl0ZW0uXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZGlzcGxheWVkQ29sdW1uczogQXJyYXk8c3RyaW5nPiB8IE9ic2VydmFibGU8QXJyYXk8c3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgY29sdW1ucyB0byBoaWRlIGJ5IGRlZmF1bHQgYmFzZWQgb24gdGhlIElEIG9yIGZpZWxkIG9mIHRoZSBpdGVtLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGhpZGRlbkNvbHVtbnM6IEFycmF5PHN0cmluZz4gfCBPYnNlcnZhYmxlPEFycmF5PHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgaG93IHRoZSBncmlkIGZpdHMgdG8gaXRzIHBhcmVudC4gYFwid2lkdGhcImAgZml0cyB0aGUgZ3JpZCB0byB0aGUgcGFyZW50J3MgZnVsbFxuICAgKiB3aWR0aCwgYW5kIGBcInNjcm9sbFwiYCBhbGxvd3MgdGhlIGdyaWQgdG8gZXhjZWVkIHRoZSBwYXJlbnQncyB3aWR0aC4gSWYgdGhlIGdyaWQgZG9lcyBub3QgaGF2ZVxuICAgKiBlbm91Z2ggY29sdW1ucyB0byBmaWxsIHRoZSBwYXJlbnQncyB3aWR0aCwgaXQgYWx3YXlzIHN0cmV0Y2hlcyB0byB0aGUgcGFyZW50J3MgZnVsbCB3aWR0aC5cbiAgICogQGRlZmF1bHQgXCJ3aWR0aFwiXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZml0ID0gJ3dpZHRoJztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUgZ3JpZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB3aWR0aDogbnVtYmVyIHwgT2JzZXJ2YWJsZTxudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGhlaWdodCBvZiB0aGUgZ3JpZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBoZWlnaHQ6IG51bWJlciB8IE9ic2VydmFibGU8bnVtYmVyPjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gaGlnaGxpZ2h0IHNlYXJjaCB0ZXh0IHdpdGhpbiB0aGUgZ3JpZC5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGhpZ2hsaWdodFNlYXJjaFRleHQgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhbiBvYnNlcnZhYmxlIHRvIHNlbmQgY29tbWFuZHMgdG8gdGhlIGdyaWQuXG4gICAqIFRoZSBjb21tYW5kcyBzaG91bGQgcmVzcGVjdCB0aGUgYFNreUxpc3RWaWV3R3JpZE1lc3NhZ2VgIHR5cGUuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IG1lc3NhZ2VTdHJlYW0oc3RyZWFtOiBTdWJqZWN0PFNreUxpc3RWaWV3R3JpZE1lc3NhZ2U+KSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5fbWVzc2FnZVN0cmVhbSkge1xuICAgICAgdGhpcy5fbWVzc2FnZVN0cmVhbS51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIHRoaXMuX21lc3NhZ2VTdHJlYW0gPSBzdHJlYW07XG5cbiAgICB0aGlzLmluaXRJbmxpbmVEZWxldGVNZXNzYWdlcygpO1xuICB9XG5cbiAgcHVibGljIGdldCBtZXNzYWdlU3RyZWFtKCk6IFN1YmplY3Q8U2t5TGlzdFZpZXdHcmlkTWVzc2FnZT4ge1xuICAgIHJldHVybiB0aGlzLl9tZXNzYWdlU3RyZWFtO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgSUQgb2YgdGhlIHJvdyB0byBoaWdobGlnaHQuIFRoZSBJRCBtYXRjaGVzIHRoZSBgaWRgIHByb3BlcnR5IG9mXG4gICAqIHRoZSBgZGF0YWAgb2JqZWN0LiBUeXBpY2FsbHksIHRoaXMgcHJvcGVydHkgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZVxuICAgKiBbZmx5b3V0IGNvbXBvbmVudF0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9jb21wb25lbnRzL2ZseW91dCkgdG9cbiAgICogaW5kaWNhdGUgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3cuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgcm93SGlnaGxpZ2h0ZWRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byBlbmFibGUgdGhlIG11bHRpc2VsZWN0IGZlYXR1cmUgdG8gZGlzcGxheSBhIGNvbHVtbiBvZiBjaGVja2JveGVzXG4gICAqIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGdyaWQuIE11bHRpc2VsZWN0IGFsc28gZGlzcGxheXMgYW4gYWN0aW9uIGJhciB3aXRoIGJ1dHRvbnMgdG9cbiAgICogc2VsZWN0IGFuZCBjbGVhciBhbGwgY2hlY2tib3hlcy4gTXVsdGlzZWxlY3QgZGVmYXVsdHMgdG8gdGhlIGBpZGAgcHJvcGVydHkgb24gdGhlIGxpc3Qnc1xuICAgKiBgZGF0YWAgb2JqZWN0LlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGVuYWJsZU11bHRpc2VsZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIHVuaXF1ZSBrZXkgZm9yIHRoZSBVSSBDb25maWcgU2VydmljZSB0byByZXRyaWV2ZSBzdG9yZWQgc2V0dGluZ3MgZnJvbVxuICAgKiBhIGRhdGFiYXNlLiBUaGUgc2VydmljZSBzYXZlcyBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB1c2VycyBhbmQgcmV0dXJucyBgc2VsZWN0ZWRDb2x1bW5JZHNgXG4gICAqIGZvciB0aGUgY29sdW1ucyB0byBkaXNwbGF5IGFuZCB0aGUgcHJlZmVycmVkIGNvbHVtbiBvcmRlci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGVcbiAgICogW3N0aWNreSBzZXR0aW5ncyBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2xlYXJuL2dldC1zdGFydGVkL2FkdmFuY2VkL3N0aWNreS1zZXR0aW5ncykuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0dGluZ3NLZXk6IHN0cmluZztcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB1c2VycyBjYW5jZWwgdGhlIGRlbGV0aW9uIG9mIGEgcm93LlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByb3dEZWxldGVDYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPFNreUxpc3RWaWV3R3JpZFJvd0RlbGV0ZUNhbmNlbEFyZ3M+KCk7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdXNlcnMgY29uZmlybSB0aGUgZGVsZXRpb24gb2YgYSByb3cuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIHJvd0RlbGV0ZUNvbmZpcm0gPSBuZXcgRXZlbnRFbWl0dGVyPFNreUxpc3RWaWV3R3JpZFJvd0RlbGV0ZUNvbmZpcm1BcmdzPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIGNvbHVtbnMgY2hhbmdlLiBUaGlzIGluY2x1ZGVzIGNoYW5nZXMgdG8gdGhlIGRpc3BsYXllZCBjb2x1bW5zIGFuZCBjaGFuZ2VzXG4gICAqIHRvIHRoZSBvcmRlciBvZiBjb2x1bW5zLiBUaGUgZXZlbnQgZW1pdHMgYW4gYXJyYXkgb2YgSURzIGZvciB0aGUgZGlzcGxheWVkIGNvbHVtbnMgdGhhdFxuICAgKiByZWZsZWN0cyB0aGUgY29sdW1uIG9yZGVyLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzZWxlY3RlZENvbHVtbklkc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8QXJyYXk8c3RyaW5nPj4oKTtcblxuICBAVmlld0NoaWxkKFNreUdyaWRDb21wb25lbnQpXG4gIHB1YmxpYyBncmlkQ29tcG9uZW50OiBTa3lHcmlkQ29tcG9uZW50O1xuXG4gIHB1YmxpYyBnZXQgZ3JpZEhlaWdodCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLmhlaWdodCA9PT0gJ251bWJlcidcbiAgICAgID8gb2JzZXJ2YWJsZU9mKHRoaXMuaGVpZ2h0KVxuICAgICAgOiB0aGlzLmhlaWdodDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZ3JpZFdpZHRoKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gdHlwZW9mIHRoaXMud2lkdGggPT09ICdudW1iZXInXG4gICAgICA/IG9ic2VydmFibGVPZih0aGlzLndpZHRoKVxuICAgICAgOiB0aGlzLndpZHRoO1xuICB9XG5cbiAgcHVibGljIGNvbHVtbnM6IE9ic2VydmFibGU8QXJyYXk8U2t5R3JpZENvbHVtbk1vZGVsPj47XG5cbiAgcHVibGljIHNlbGVjdGVkQ29sdW1uSWRzOiBPYnNlcnZhYmxlPEFycmF5PHN0cmluZz4+O1xuXG4gIHB1YmxpYyBpdGVtczogT2JzZXJ2YWJsZTxMaXN0SXRlbU1vZGVsW10+O1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIHN0cmVhbSBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBpbnRlcm5hbCBncmlkIGluc3RhbmNlXG4gICAqIEBpbnRlcmFsXG4gICAqL1xuICBwdWJsaWMgZ3JpZE1lc3NhZ2VTdHJlYW0gPSBuZXcgU3ViamVjdDxTa3lHcmlkTWVzc2FnZT4oKTtcblxuICBwdWJsaWMgbG9hZGluZzogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICBwdWJsaWMgc29ydEZpZWxkOiBPYnNlcnZhYmxlPExpc3RTb3J0RmllbGRTZWxlY3Rvck1vZGVsPjtcblxuICBwdWJsaWMgY3VycmVudFNlYXJjaFRleHQ6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICBwdWJsaWMgbXVsdGlzZWxlY3RTZWxlY3RlZElkczogc3RyaW5nW10gPSBbXTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGEgc2VhcmNoIGZ1bmN0aW9uIHRvIGFwcGx5IG9uIHRoZSB2aWV3IGRhdGEuXG4gICAqIEBwYXJhbSBkYXRhIFNwZWNpZmllcyB0aGUgZGF0YSB0byBzZWFyY2guXG4gICAqIEBwYXJhbSBzZWFyY2hUZXh0IFNwZWNpZmllcyBhIHRleHQgc3RyaW5nIHRvIHNlYXJjaCBmb3IuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWlucHV0LXJlbmFtZVxuICBASW5wdXQoJ3NlYXJjaCcpXG4gIHB1YmxpYyBzZWFyY2hGdW5jdGlvbjogKGRhdGE6IGFueSwgc2VhcmNoVGV4dDogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oU2t5R3JpZENvbHVtbkNvbXBvbmVudClcbiAgcHJpdmF0ZSBjb2x1bW5Db21wb25lbnRzOiBRdWVyeUxpc3Q8U2t5R3JpZENvbHVtbkNvbXBvbmVudD47XG5cbiAgcHJpdmF0ZSBuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3QoKTtcblxuICBwcml2YXRlIF9tZXNzYWdlU3RyZWFtID0gbmV3IFN1YmplY3Q8U2t5TGlzdFZpZXdHcmlkTWVzc2FnZT4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzdGF0ZTogTGlzdFN0YXRlLFxuICAgIHByaXZhdGUgZGlzcGF0Y2hlcjogTGlzdFN0YXRlRGlzcGF0Y2hlcixcbiAgICBwdWJsaWMgZ3JpZFN0YXRlOiBHcmlkU3RhdGUsXG4gICAgcHVibGljIGdyaWREaXNwYXRjaGVyOiBHcmlkU3RhdGVEaXNwYXRjaGVyXG4gICkge1xuICAgIHN1cGVyKHN0YXRlLCAnR3JpZCBWaWV3Jyk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIC8vIFdhdGNoIGZvciBzZWxlY3Rpb24gY2hhbmdlcyBhbmQgdXBkYXRlIG11bHRpc2VsZWN0U2VsZWN0ZWRJZHMgZm9yIGxvY2FsIGNvbXBhcmlzb24uXG4gICAgdGhpcy5zdGF0ZVxuICAgICAgLnBpcGUoXG4gICAgICAgIG9ic2VydmFibGVNYXAoKHMpID0+IHMuc2VsZWN0ZWQuaXRlbSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCh0aGlzLnNlbGVjdGVkTWFwRXF1YWwpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChpdGVtczogTGlzdFNlbGVjdGVkTW9kZWwpID0+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJZHM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgaXRlbXMuc2VsZWN0ZWRJZE1hcC5mb3JFYWNoKChpc1NlbGVjdGVkLCBpZCkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtcy5zZWxlY3RlZElkTWFwLmdldChpZCkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkSWRzLnB1c2goaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5tdWx0aXNlbGVjdFNlbGVjdGVkSWRzID0gc2VsZWN0ZWRJZHM7XG4gICAgICB9KTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHRoaXMuY29sdW1uQ29tcG9uZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0dyaWQgdmlldyByZXF1aXJlcyBhdCBsZWFzdCBvbmUgc2t5LWdyaWQtY29sdW1uIHRvIHJlbmRlci4nXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbHVtbk1vZGVscyA9IHRoaXMuY29sdW1uQ29tcG9uZW50cy5tYXAoKGNvbHVtbkNvbXBvbmVudCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBTa3lHcmlkQ29sdW1uTW9kZWwoY29sdW1uQ29tcG9uZW50LnRlbXBsYXRlLCBjb2x1bW5Db21wb25lbnQpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMud2lkdGggJiYgIWlzT2JzZXJ2YWJsZSh0aGlzLndpZHRoKSkge1xuICAgICAgdGhpcy53aWR0aCA9IG9ic2VydmFibGVPZih0aGlzLndpZHRoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oZWlnaHQgJiYgIWlzT2JzZXJ2YWJsZSh0aGlzLmhlaWdodCkpIHtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gb2JzZXJ2YWJsZU9mKHRoaXMuaGVpZ2h0KTtcbiAgICB9XG5cbiAgICAvLyBTZXR1cCBPYnNlcnZhYmxlcyBmb3IgdGVtcGxhdGVcbiAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmdyaWRTdGF0ZS5waXBlKFxuICAgICAgb2JzZXJ2YWJsZU1hcCgocykgPT4gcy5jb2x1bW5zLml0ZW1zKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKHRoaXMuYXJyYXlzRXF1YWwpLFxuICAgICAgdGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSlcbiAgICApO1xuXG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbklkcyA9IHRoaXMuZ2V0U2VsZWN0ZWRJZHMoKTtcblxuICAgIHRoaXMuaXRlbXMgPSB0aGlzLmdldEdyaWRJdGVtcygpO1xuXG4gICAgdGhpcy5sb2FkaW5nID0gdGhpcy5zdGF0ZS5waXBlKFxuICAgICAgb2JzZXJ2YWJsZU1hcCgocykgPT4ge1xuICAgICAgICByZXR1cm4gcy5pdGVtcy5sb2FkaW5nO1xuICAgICAgfSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgdGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSlcbiAgICApO1xuXG4gICAgdGhpcy5zb3J0RmllbGQgPSB0aGlzLnN0YXRlLnBpcGUoXG4gICAgICBvYnNlcnZhYmxlTWFwKChzKSA9PiB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIC8qIHNhbml0eSBjaGVjayAqL1xuICAgICAgICBpZiAocy5zb3J0ICYmIHMuc29ydC5maWVsZFNlbGVjdG9ycykge1xuICAgICAgICAgIHJldHVybiBzLnNvcnQuZmllbGRTZWxlY3RvcnNbMF07XG4gICAgICAgIH1cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgLyogc2FuaXR5IGNoZWNrICovXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9KSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICB0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKVxuICAgICk7XG5cbiAgICB0aGlzLmdyaWRTdGF0ZVxuICAgICAgLnBpcGUoXG4gICAgICAgIG9ic2VydmFibGVNYXAoKHMpID0+IHMuY29sdW1ucy5pdGVtcyksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCh0aGlzLmFycmF5c0VxdWFsKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoY29sdW1ucykgPT4ge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAodGhpcy5oaWRkZW5Db2x1bW5zKSB7XG4gICAgICAgICAgZ2V0VmFsdWUodGhpcy5oaWRkZW5Db2x1bW5zLCAoaGlkZGVuQ29sdW1uczogc3RyaW5nW10pID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZERpc3BhdGNoZXIubmV4dChcbiAgICAgICAgICAgICAgbmV3IExpc3RWaWV3RGlzcGxheWVkR3JpZENvbHVtbnNMb2FkQWN0aW9uKFxuICAgICAgICAgICAgICAgIGNvbHVtbnMuZmlsdGVyKCh4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgICAgICAgLyogc2FuaXR5IGNoZWNrICovXG4gICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHguaWQgfHwgeC5maWVsZDtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBoaWRkZW5Db2x1bW5zLmluZGV4T2YoaWQpID09PSAtMTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kaXNwbGF5ZWRDb2x1bW5zKSB7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICBnZXRWYWx1ZSh0aGlzLmRpc3BsYXllZENvbHVtbnMsIChkaXNwbGF5ZWRDb2x1bW5zOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ncmlkRGlzcGF0Y2hlci5uZXh0KFxuICAgICAgICAgICAgICBuZXcgTGlzdFZpZXdEaXNwbGF5ZWRHcmlkQ29sdW1uc0xvYWRBY3Rpb24oXG4gICAgICAgICAgICAgICAgY29sdW1ucy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAoeCkgPT4gZGlzcGxheWVkQ29sdW1ucy5pbmRleE9mKHguaWQgfHwgeC5maWVsZCkgIT09IC0xXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5ncmlkRGlzcGF0Y2hlci5uZXh0KFxuICAgICAgICAgICAgbmV3IExpc3RWaWV3RGlzcGxheWVkR3JpZENvbHVtbnNMb2FkQWN0aW9uKFxuICAgICAgICAgICAgICBjb2x1bW5zLmZpbHRlcigoeCkgPT4gIXguaGlkZGVuKSxcbiAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgdGhpcy5jdXJyZW50U2VhcmNoVGV4dCA9IHRoaXMuc3RhdGUucGlwZShcbiAgICAgIG9ic2VydmFibGVNYXAoKHMpID0+IHMuc2VhcmNoLnNlYXJjaFRleHQpLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpXG4gICAgKTtcblxuICAgIHRoaXMuZ3JpZERpc3BhdGNoZXIubmV4dChcbiAgICAgIG5ldyBMaXN0Vmlld0dyaWRDb2x1bW5zTG9hZEFjdGlvbihjb2x1bW5Nb2RlbHMsIHRydWUpXG4gICAgKTtcblxuICAgIHRoaXMuaGFuZGxlQ29sdW1uQ2hhbmdlKCk7XG5cbiAgICBpZiAodGhpcy5lbmFibGVNdWx0aXNlbGVjdCkge1xuICAgICAgdGhpcy5kaXNwYXRjaGVyLnRvb2xiYXJTaG93TXVsdGlzZWxlY3RUb29sYmFyKHRydWUpO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdElubGluZURlbGV0ZU1lc3NhZ2VzKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB1c2VyIG1ha2VzIHNlbGVjdGlvbiwgdGVsbCBsaXN0LWJ1aWxkZXIgdG8gdXBkYXRlIHRoZSBsaXN0IHN0YXRlLlxuICAgKiBUaGlzIGxvZ2ljIHNob3VsZCBvbmx5IHJ1biBvbiB1c2VyIGludGVyYWN0aW9uIC0gTk9UIHByb2dyYW1tYXRpYyB1cGRhdGVzLlxuICAgKi9cbiAgcHVibGljIG9uTXVsdGlzZWxlY3RTZWxlY3Rpb25DaGFuZ2UoXG4gICAgZXZlbnQ6IFNreUdyaWRTZWxlY3RlZFJvd3NNb2RlbENoYW5nZVxuICApOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICBldmVudC5zb3VyY2UgPT09IFNreUdyaWRTZWxlY3RlZFJvd3NTb3VyY2UuQ2hlY2tib3hDaGFuZ2UgfHxcbiAgICAgIGV2ZW50LnNvdXJjZSA9PT0gU2t5R3JpZFNlbGVjdGVkUm93c1NvdXJjZS5Sb3dDbGlja1xuICAgICkge1xuICAgICAgdGhpcy5zdGF0ZVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBvYnNlcnZhYmxlTWFwKChzKSA9PiBzLml0ZW1zLml0ZW1zKSxcbiAgICAgICAgICB0YWtlKDEpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoaXRlbXM6IExpc3RJdGVtTW9kZWxbXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5ld0l0ZW1JZHMgPSB0aGlzLmFycmF5SW50ZXJzZWN0aW9uKFxuICAgICAgICAgICAgaXRlbXMubWFwKChpKSA9PiBpLmlkKSxcbiAgICAgICAgICAgIHRoaXMubXVsdGlzZWxlY3RTZWxlY3RlZElkc1xuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgbmV3SWRzID0gaXRlbXMuZmlsdGVyKChpKSA9PiBpLmlzU2VsZWN0ZWQpLm1hcCgoaSkgPT4gaS5pZCk7XG5cbiAgICAgICAgICAvLyBDaGVjayBmb3IgZGVzZWxlY3RlZCBpZHMgJiBzZW5kIG1lc3NhZ2UgdG8gZGlzcGF0Y2hlci5cbiAgICAgICAgICBjb25zdCBkZXNlbGVjdGVkSWRzID0gdGhpcy5hcnJheURpZmYobmV3SXRlbUlkcywgbmV3SWRzKTtcbiAgICAgICAgICBpZiAoZGVzZWxlY3RlZElkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuc2V0U2VsZWN0ZWQoZGVzZWxlY3RlZElkcywgZmFsc2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGZvciBzZWxlY3RlZCBpZHMgJiBzZW5kIG1lc3NhZ2UgdG8gZGlzcGF0Y2hlci5cbiAgICAgICAgICBjb25zdCBzZWxlY3RlZElkcyA9IHRoaXMuYXJyYXlEaWZmKG5ld0lkcywgbmV3SXRlbUlkcyk7XG4gICAgICAgICAgaWYgKHNlbGVjdGVkSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlci5zZXRTZWxlY3RlZChzZWxlY3RlZElkcywgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY29sdW1uSWRzQ2hhbmdlZChzZWxlY3RlZENvbHVtbklkczogQXJyYXk8c3RyaW5nPikge1xuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHMucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKGN1cnJlbnRJZHMpID0+IHtcbiAgICAgIGlmICghdGhpcy5hcnJheXNFcXVhbChzZWxlY3RlZENvbHVtbklkcywgY3VycmVudElkcykpIHtcbiAgICAgICAgdGhpcy5ncmlkU3RhdGVcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIG9ic2VydmFibGVNYXAoKHMpID0+IHMuY29sdW1ucy5pdGVtcyksXG4gICAgICAgICAgICB0YWtlKDEpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKGNvbHVtbnMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRpc3BsYXllZENvbHVtbnMgPSBzZWxlY3RlZENvbHVtbklkcy5tYXAoXG4gICAgICAgICAgICAgIChjb2x1bW5JZCkgPT4gY29sdW1ucy5maWx0ZXIoKGMpID0+IGMuaWQgPT09IGNvbHVtbklkKVswXVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZERpc3BhdGNoZXIubmV4dChcbiAgICAgICAgICAgICAgbmV3IExpc3RWaWV3RGlzcGxheWVkR3JpZENvbHVtbnNMb2FkQWN0aW9uKGRpc3BsYXllZENvbHVtbnMsIHRydWUpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNhbmNlbFJvd0RlbGV0ZShhcmdzOiBTa3lMaXN0Vmlld0dyaWRSb3dEZWxldGVDYW5jZWxBcmdzKTogdm9pZCB7XG4gICAgdGhpcy5yb3dEZWxldGVDYW5jZWwuZW1pdChhcmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBjb25maXJtUm93RGVsZXRlKGFyZ3M6IFNreUxpc3RWaWV3R3JpZFJvd0RlbGV0ZUNvbmZpcm1BcmdzKTogdm9pZCB7XG4gICAgdGhpcy5yb3dEZWxldGVDb25maXJtLmVtaXQoYXJncyk7XG4gIH1cblxuICBwdWJsaWMgc29ydEZpZWxkQ2hhbmdlZChzb3J0RmllbGQ6IExpc3RTb3J0RmllbGRTZWxlY3Rvck1vZGVsKSB7XG4gICAgdGhpcy5kaXNwYXRjaGVyLnNvcnRTZXRGaWVsZFNlbGVjdG9ycyhbc29ydEZpZWxkXSk7XG4gIH1cblxuICBwdWJsaWMgb25WaWV3QWN0aXZlKCkge1xuICAgIC8qXG4gICAgICBSYW4gaW50byBwcm9ibGVtIHdoZXJlIHN0YXRlIHVwZGF0ZXMgd2VyZSBjb25zdW1lZCBvdXQgb2Ygb3JkZXIuIEZvciBleGFtcGxlLCBvbiBzZWFyY2ggdGV4dFxuICAgICAgdXBkYXRlLCB0aGUgc2VhcmNoVGV4dCB1cGRhdGUgd2FzIGNvbnN1bWVkIGFmdGVyIHRoZSByZXN1bHRpbmcgbGlzdCBpdGVtIHVwZGF0ZS4gU2Nhbm5pbmcgdGhlXG4gICAgICBwcmV2aW91cyB2YWx1ZSBvZiBpdGVtcyBsYXN0VXBkYXRlIGVuc3VyZXMgdGhhdCB3ZSBvbmx5IHJlY2VpdmUgdGhlIGxhdGVzdCBpdGVtcy5cbiAgICAqL1xuICAgIHRoaXMuZ3JpZFN0YXRlXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksXG4gICAgICAgIHNjYW4oKHByZXZpb3VzVmFsdWU6IEdyaWRTdGF0ZU1vZGVsLCBuZXdWYWx1ZTogR3JpZFN0YXRlTW9kZWwpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBwcmV2aW91c1ZhbHVlLmRpc3BsYXllZENvbHVtbnMubGFzdFVwZGF0ZSA+XG4gICAgICAgICAgICBuZXdWYWx1ZS5kaXNwbGF5ZWRDb2x1bW5zLmxhc3RVcGRhdGVcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1ZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3VmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgb2JzZXJ2YWJsZU1hcCgocykgPT4gcy5kaXNwbGF5ZWRDb2x1bW5zLml0ZW1zKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQodGhpcy5hcnJheXNFcXVhbClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGRpc3BsYXllZENvbHVtbnMpID0+IHtcbiAgICAgICAgY29uc3Qgc2V0RnVuY3Rpb25zID1cbiAgICAgICAgICB0aGlzLnNlYXJjaEZ1bmN0aW9uICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gW3RoaXMuc2VhcmNoRnVuY3Rpb25dXG4gICAgICAgICAgICA6IGRpc3BsYXllZENvbHVtbnNcbiAgICAgICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgICAgKGNvbHVtbikgPT4gKGRhdGE6IGFueSwgc2VhcmNoVGV4dDogc3RyaW5nKSA9PlxuICAgICAgICAgICAgICAgICAgICBjb2x1bW4uc2VhcmNoRnVuY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgZ2V0RGF0YShkYXRhLCBjb2x1bW4uZmllbGQpLFxuICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFRleHRcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChjKSA9PiBjICE9PSB1bmRlZmluZWQpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKHMpID0+IHtcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuc2VhcmNoU2V0T3B0aW9ucyhcbiAgICAgICAgICAgIG5ldyBMaXN0U2VhcmNoTW9kZWwoe1xuICAgICAgICAgICAgICBzZWFyY2hUZXh0OiBzLnNlYXJjaC5zZWFyY2hUZXh0LFxuICAgICAgICAgICAgICBmdW5jdGlvbnM6IHNldEZ1bmN0aW9ucyxcbiAgICAgICAgICAgICAgZmllbGRTZWxlY3RvcnM6IGRpc3BsYXllZENvbHVtbnMubWFwKChkKSA9PiBkLmZpZWxkKSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdElubGluZURlbGV0ZU1lc3NhZ2VzKCk6IHZvaWQge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHRoaXMubWVzc2FnZVN0cmVhbSkge1xuICAgICAgdGhpcy5tZXNzYWdlU3RyZWFtLnN1YnNjcmliZSgobWVzc2FnZTogU2t5TGlzdFZpZXdHcmlkTWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlID09PSBTa3lMaXN0Vmlld0dyaWRNZXNzYWdlVHlwZS5BYm9ydERlbGV0ZVJvdykge1xuICAgICAgICAgIHRoaXMuZ3JpZE1lc3NhZ2VTdHJlYW0ubmV4dCh7XG4gICAgICAgICAgICB0eXBlOiBTa3lHcmlkTWVzc2FnZVR5cGUuQWJvcnREZWxldGVSb3csXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgIGFib3J0RGVsZXRlUm93OiBtZXNzYWdlLmRhdGEuYWJvcnREZWxldGVSb3csXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIG1lc3NhZ2UudHlwZSA9PT0gU2t5TGlzdFZpZXdHcmlkTWVzc2FnZVR5cGUuUHJvbXB0RGVsZXRlUm93XG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuZ3JpZE1lc3NhZ2VTdHJlYW0ubmV4dCh7XG4gICAgICAgICAgICB0eXBlOiBTa3lHcmlkTWVzc2FnZVR5cGUuUHJvbXB0RGVsZXRlUm93LFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICBwcm9tcHREZWxldGVSb3c6IG1lc3NhZ2UuZGF0YS5wcm9tcHREZWxldGVSb3csXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNvbHVtbkNoYW5nZSgpIHtcbiAgICAvLyB3YXRjaCBmb3IgY2hhbmdlcyBpbiBjb2x1bW4gY29tcG9uZW50c1xuICAgIHRoaXMuY29sdW1uQ29tcG9uZW50cy5jaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKGNvbHVtbkNvbXBvbmVudHMpID0+IHtcbiAgICAgICAgY29uc3QgY29sdW1uTW9kZWxzID0gdGhpcy5jb2x1bW5Db21wb25lbnRzLm1hcCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBTa3lHcmlkQ29sdW1uTW9kZWwoY29sdW1uLnRlbXBsYXRlLCBjb2x1bW4pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ncmlkRGlzcGF0Y2hlci5uZXh0KFxuICAgICAgICAgIG5ldyBMaXN0Vmlld0dyaWRDb2x1bW5zTG9hZEFjdGlvbihjb2x1bW5Nb2RlbHMsIHRydWUpXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgIC8vIFdhdGNoIGZvciBjb2x1bW4gaGVhZGluZyBjaGFuZ2VzOlxuICAgIHRoaXMuY29sdW1uQ29tcG9uZW50cy5mb3JFYWNoKChjb21wKSA9PiB7XG4gICAgICBjb21wLmhlYWRpbmdNb2RlbENoYW5nZXNcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKGNoYW5nZTogU2t5R3JpZENvbHVtbkhlYWRpbmdNb2RlbENoYW5nZSkgPT4ge1xuICAgICAgICAgIHRoaXMuZ3JpZENvbXBvbmVudC51cGRhdGVDb2x1bW5IZWFkaW5nKGNoYW5nZSk7XG4gICAgICAgIH0pO1xuICAgICAgY29tcC5kZXNjcmlwdGlvbk1vZGVsQ2hhbmdlc1xuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgLnN1YnNjcmliZSgoY2hhbmdlOiBTa3lHcmlkQ29sdW1uRGVzY3JpcHRpb25Nb2RlbENoYW5nZSkgPT4ge1xuICAgICAgICAgIHRoaXMuZ3JpZENvbXBvbmVudC51cGRhdGVDb2x1bW5EZXNjcmlwdGlvbihjaGFuZ2UpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0R3JpZEl0ZW1zKCk6IE9ic2VydmFibGU8QXJyYXk8TGlzdEl0ZW1Nb2RlbD4+IHtcbiAgICAvKlxuICAgICAgU2FtZSBwcm9ibGVtIGFzIGFib3ZlLiBXZSBzaG91bGQgbW92ZSBmcm9tIGhhdmluZyBhIHN0YXRlIG9iamVjdCBvYnNlcnZhYmxlIHdpdGggYSBidW5jaCBvZlxuICAgICAgc3RhdGljIHByb3BlcnRpZXMgdG8gYSBzdGF0aWMgc3RhdGUgb2JqZWN0IHdpdGggb2JzZXJ2YWJsZSBwcm9wZXJ0aWVzIHRoYXQgeW91IGNhbiBzdWJzY3JpYmVcbiAgICAgIHRvLlxuICAgICovXG4gICAgcmV0dXJuIHRoaXMuc3RhdGUucGlwZShcbiAgICAgIG9ic2VydmFibGVNYXAoKHMpID0+IHtcbiAgICAgICAgcmV0dXJuIHMuaXRlbXM7XG4gICAgICB9KSxcbiAgICAgIHNjYW4oXG4gICAgICAgIChcbiAgICAgICAgICBwcmV2aW91c1ZhbHVlOiBBc3luY0xpc3Q8TGlzdEl0ZW1Nb2RlbD4sXG4gICAgICAgICAgbmV3VmFsdWU6IEFzeW5jTGlzdDxMaXN0SXRlbU1vZGVsPlxuICAgICAgICApID0+IHtcbiAgICAgICAgICBpZiAocHJldmlvdXNWYWx1ZS5sYXN0VXBkYXRlID4gbmV3VmFsdWUubGFzdFVwZGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzVmFsdWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICksXG4gICAgICBvYnNlcnZhYmxlTWFwKChyZXN1bHQ6IEFzeW5jTGlzdDxMaXN0SXRlbU1vZGVsPikgPT4ge1xuICAgICAgICByZXR1cm4gcmVzdWx0Lml0ZW1zO1xuICAgICAgfSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWRJZHMoKTogT2JzZXJ2YWJsZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgLypcbiAgICAgIFNhbWUgcHJvYmxlbSBhcyBhYm92ZS4gV2Ugc2hvdWxkIG1vdmUgZnJvbSBoYXZpbmcgYSBzdGF0ZSBvYmplY3Qgb2JzZXJ2YWJsZSB3aXRoIGEgYnVuY2ggb2ZcbiAgICAgIHN0YXRpYyBwcm9wZXJ0aWVzIHRvIGEgc3RhdGljIHN0YXRlIG9iamVjdCB3aXRoIG9ic2VydmFibGUgcHJvcGVydGllcyB0aGF0IHlvdSBjYW4gc3Vic2NyaWJlXG4gICAgICB0by5cbiAgICAqL1xuICAgIHJldHVybiB0aGlzLmdyaWRTdGF0ZS5waXBlKFxuICAgICAgb2JzZXJ2YWJsZU1hcCgocykgPT4gcy5kaXNwbGF5ZWRDb2x1bW5zKSxcbiAgICAgIHNjYW4oXG4gICAgICAgIChcbiAgICAgICAgICBwcmV2aW91c1ZhbHVlOiBBc3luY0xpc3Q8U2t5R3JpZENvbHVtbk1vZGVsPixcbiAgICAgICAgICBuZXdWYWx1ZTogQXN5bmNMaXN0PFNreUdyaWRDb2x1bW5Nb2RlbD5cbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgaWYgKHByZXZpb3VzVmFsdWUubGFzdFVwZGF0ZSA+IG5ld1ZhbHVlLmxhc3RVcGRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1ZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3VmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApLFxuICAgICAgb2JzZXJ2YWJsZU1hcCgocmVzdWx0OiBBc3luY0xpc3Q8U2t5R3JpZENvbHVtbk1vZGVsPikgPT4ge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAvKiBzYW5pdHkgY2hlY2sgKi9cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5pdGVtcy5tYXAoKGNvbHVtbjogU2t5R3JpZENvbHVtbk1vZGVsKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNvbHVtbi5pZCB8fCBjb2x1bW4uZmllbGQ7XG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocHJldmlvdXNWYWx1ZTogc3RyaW5nW10sIG5ld1ZhbHVlOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXZlQ29sdW1uSWRzQ2hhbmdlZChwcmV2aW91c1ZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhdmVDb2x1bW5JZHNDaGFuZ2VkKHByZXZpb3VzVmFsdWU6IHN0cmluZ1tdLCBuZXdWYWx1ZTogc3RyaW5nW10pIHtcbiAgICBpZiAocHJldmlvdXNWYWx1ZS5sZW5ndGggIT09IG5ld1ZhbHVlLmxlbmd0aCkge1xuICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbklkc0NoYW5nZS5lbWl0KG5ld1ZhbHVlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZpb3VzVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHByZXZpb3VzVmFsdWVbaV0gIT09IG5ld1ZhbHVlW2ldKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHNDaGFuZ2UuZW1pdChuZXdWYWx1ZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdGVkTWFwRXF1YWwoXG4gICAgcHJldjogTGlzdFNlbGVjdGVkTW9kZWwsXG4gICAgbmV4dDogTGlzdFNlbGVjdGVkTW9kZWxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKHByZXYuc2VsZWN0ZWRJZE1hcC5zaXplICE9PSBuZXh0LnNlbGVjdGVkSWRNYXAuc2l6ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgbmV4dC5zZWxlY3RlZElkTWFwLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH0pO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBjb25zdCB2YWx1ZSA9IG5leHQuc2VsZWN0ZWRJZE1hcC5nZXQoa2V5KTtcbiAgICAgIGlmICh2YWx1ZSAhPT0gcHJldi5zZWxlY3RlZElkTWFwLmdldChrZXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXJyYXlEaWZmKGFyckE6IEFycmF5PGFueT4sIGFyckI6IEFycmF5PGFueT4pOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gYXJyQS5maWx0ZXIoKGkpID0+IGFyckIuaW5kZXhPZihpKSA8IDApO1xuICB9XG5cbiAgcHJpdmF0ZSBhcnJheUludGVyc2VjdGlvbihhcnJBOiBBcnJheTxhbnk+LCBhcnJCOiBBcnJheTxhbnk+KTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIGFyckEuZmlsdGVyKCh2YWx1ZSkgPT4gLTEgIT09IGFyckIuaW5kZXhPZih2YWx1ZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcnJheXNFcXVhbChhcnJheUE6IGFueVtdLCBhcnJheUI6IGFueVtdKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGFycmF5QS5sZW5ndGggPT09IGFycmF5Qi5sZW5ndGggJiZcbiAgICAgIGFycmF5QS5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSA9PT0gYXJyYXlCW2luZGV4XSlcbiAgICApO1xuICB9XG59XG4iLCI8ZGl2ICpuZ0lmPVwiYWN0aXZlIHwgYXN5bmNcIj5cbiAgPHNreS1ncmlkXG4gICAgW2NvbHVtbnNdPVwiY29sdW1ucyB8IGFzeW5jXCJcbiAgICBbZGF0YV09XCJpdGVtcyB8IGFzeW5jXCJcbiAgICBbZW5hYmxlTXVsdGlzZWxlY3RdPVwiZW5hYmxlTXVsdGlzZWxlY3RcIlxuICAgIFtmaXRdPVwiZml0XCJcbiAgICBbaGVpZ2h0XT1cImdyaWRIZWlnaHQgfCBhc3luY1wiXG4gICAgW2hpZ2hsaWdodFRleHRdPVwiXG4gICAgICBoaWdobGlnaHRTZWFyY2hUZXh0ID8gKGN1cnJlbnRTZWFyY2hUZXh0IHwgYXN5bmMpIDogdW5kZWZpbmVkXG4gICAgXCJcbiAgICBbcm93SGlnaGxpZ2h0ZWRJZF09XCJyb3dIaWdobGlnaHRlZElkXCJcbiAgICBbbWVzc2FnZVN0cmVhbV09XCJncmlkTWVzc2FnZVN0cmVhbVwiXG4gICAgW3NlbGVjdGVkQ29sdW1uSWRzXT1cInNlbGVjdGVkQ29sdW1uSWRzIHwgYXN5bmNcIlxuICAgIFtzZWxlY3RlZFJvd0lkc109XCJtdWx0aXNlbGVjdFNlbGVjdGVkSWRzXCJcbiAgICBbc2V0dGluZ3NLZXldPVwic2V0dGluZ3NLZXlcIlxuICAgIFtzb3J0RmllbGRdPVwic29ydEZpZWxkIHwgYXN5bmNcIlxuICAgIFt3aWR0aF09XCJncmlkV2lkdGggfCBhc3luY1wiXG4gICAgKG11bHRpc2VsZWN0U2VsZWN0aW9uQ2hhbmdlKT1cIm9uTXVsdGlzZWxlY3RTZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgKHJvd0RlbGV0ZUNhbmNlbCk9XCJjYW5jZWxSb3dEZWxldGUoJGV2ZW50KVwiXG4gICAgKHJvd0RlbGV0ZUNvbmZpcm0pPVwiY29uZmlybVJvd0RlbGV0ZSgkZXZlbnQpXCJcbiAgICAoc2VsZWN0ZWRDb2x1bW5JZHNDaGFuZ2UpPVwiY29sdW1uSWRzQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAoc29ydEZpZWxkQ2hhbmdlKT1cInNvcnRGaWVsZENoYW5nZWQoJGV2ZW50KVwiXG4gICAgI3NreUdyaWRcbiAgPlxuICA8L3NreS1ncmlkPlxuICA8c2t5LXdhaXQgW2lzV2FpdGluZ109XCJsb2FkaW5nIHwgYXN5bmNcIj4gPC9za3ktd2FpdD5cbjwvZGl2PlxuIl19
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { NgModule } from '@angular/core';
|
|
3
|
+
import { SkyGridModule } from '@skyux/grids';
|
|
4
|
+
import { SkyWaitModule } from '@skyux/indicators';
|
|
5
|
+
import { SkyListColumnSelectorActionModule } from '../list-column-selector-action/list-column-selector-action.module';
|
|
6
|
+
import { SkyListBuilderViewGridsResourcesModule } from '../shared/sky-list-builder-view-grids-resources.module';
|
|
7
|
+
import { SkyListViewGridComponent } from './list-view-grid.component';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
export class SkyListViewGridModule {
|
|
10
|
+
}
|
|
11
|
+
SkyListViewGridModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyListViewGridModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
12
|
+
SkyListViewGridModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyListViewGridModule, declarations: [SkyListViewGridComponent], imports: [CommonModule,
|
|
13
|
+
SkyWaitModule,
|
|
14
|
+
SkyGridModule,
|
|
15
|
+
SkyListBuilderViewGridsResourcesModule], exports: [SkyListViewGridComponent,
|
|
16
|
+
SkyListColumnSelectorActionModule,
|
|
17
|
+
SkyGridModule] });
|
|
18
|
+
SkyListViewGridModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyListViewGridModule, imports: [[
|
|
19
|
+
CommonModule,
|
|
20
|
+
SkyWaitModule,
|
|
21
|
+
SkyGridModule,
|
|
22
|
+
SkyListBuilderViewGridsResourcesModule,
|
|
23
|
+
], SkyListColumnSelectorActionModule,
|
|
24
|
+
SkyGridModule] });
|
|
25
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyListViewGridModule, decorators: [{
|
|
26
|
+
type: NgModule,
|
|
27
|
+
args: [{
|
|
28
|
+
declarations: [SkyListViewGridComponent],
|
|
29
|
+
imports: [
|
|
30
|
+
CommonModule,
|
|
31
|
+
SkyWaitModule,
|
|
32
|
+
SkyGridModule,
|
|
33
|
+
SkyListBuilderViewGridsResourcesModule,
|
|
34
|
+
],
|
|
35
|
+
exports: [
|
|
36
|
+
SkyListViewGridComponent,
|
|
37
|
+
SkyListColumnSelectorActionModule,
|
|
38
|
+
SkyGridModule,
|
|
39
|
+
],
|
|
40
|
+
}]
|
|
41
|
+
}] });
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC12aWV3LWdyaWQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2xpc3QtYnVpbGRlci12aWV3LWdyaWRzL3NyYy9saWIvbW9kdWxlcy9saXN0LXZpZXctZ3JpZC9saXN0LXZpZXctZ3JpZC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbEQsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sbUVBQW1FLENBQUM7QUFDdEgsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFFaEgsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBZ0J0RSxNQUFNLE9BQU8scUJBQXFCOztrSEFBckIscUJBQXFCO21IQUFyQixxQkFBcUIsaUJBYmpCLHdCQUF3QixhQUVyQyxZQUFZO1FBQ1osYUFBYTtRQUNiLGFBQWE7UUFDYixzQ0FBc0MsYUFHdEMsd0JBQXdCO1FBQ3hCLGlDQUFpQztRQUNqQyxhQUFhO21IQUdKLHFCQUFxQixZQVp2QjtZQUNQLFlBQVk7WUFDWixhQUFhO1lBQ2IsYUFBYTtZQUNiLHNDQUFzQztTQUN2QyxFQUdDLGlDQUFpQztRQUNqQyxhQUFhOzJGQUdKLHFCQUFxQjtrQkFkakMsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQztvQkFDeEMsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osYUFBYTt3QkFDYixhQUFhO3dCQUNiLHNDQUFzQztxQkFDdkM7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLHdCQUF3Qjt3QkFDeEIsaUNBQWlDO3dCQUNqQyxhQUFhO3FCQUNkO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTa3lHcmlkTW9kdWxlIH0gZnJvbSAnQHNreXV4L2dyaWRzJztcbmltcG9ydCB7IFNreVdhaXRNb2R1bGUgfSBmcm9tICdAc2t5dXgvaW5kaWNhdG9ycyc7XG5cbmltcG9ydCB7IFNreUxpc3RDb2x1bW5TZWxlY3RvckFjdGlvbk1vZHVsZSB9IGZyb20gJy4uL2xpc3QtY29sdW1uLXNlbGVjdG9yLWFjdGlvbi9saXN0LWNvbHVtbi1zZWxlY3Rvci1hY3Rpb24ubW9kdWxlJztcbmltcG9ydCB7IFNreUxpc3RCdWlsZGVyVmlld0dyaWRzUmVzb3VyY2VzTW9kdWxlIH0gZnJvbSAnLi4vc2hhcmVkL3NreS1saXN0LWJ1aWxkZXItdmlldy1ncmlkcy1yZXNvdXJjZXMubW9kdWxlJztcblxuaW1wb3J0IHsgU2t5TGlzdFZpZXdHcmlkQ29tcG9uZW50IH0gZnJvbSAnLi9saXN0LXZpZXctZ3JpZC5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtTa3lMaXN0Vmlld0dyaWRDb21wb25lbnRdLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFNreVdhaXRNb2R1bGUsXG4gICAgU2t5R3JpZE1vZHVsZSxcbiAgICBTa3lMaXN0QnVpbGRlclZpZXdHcmlkc1Jlc291cmNlc01vZHVsZSxcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIFNreUxpc3RWaWV3R3JpZENvbXBvbmVudCxcbiAgICBTa3lMaXN0Q29sdW1uU2VsZWN0b3JBY3Rpb25Nb2R1bGUsXG4gICAgU2t5R3JpZE1vZHVsZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU2t5TGlzdFZpZXdHcmlkTW9kdWxlIHt9XG4iXX0=
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { SkyGridColumnModel } from '@skyux/grids';
|
|
2
|
+
import { AsyncList } from '@skyux/list-builder-common';
|
|
3
|
+
import { GridStateOrchestrator } from '../grid-state.rxstate';
|
|
4
|
+
import { ListViewGridColumnsLoadAction } from './load.action';
|
|
5
|
+
/**
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
export class ListViewGridColumnsOrchestrator extends GridStateOrchestrator {
|
|
9
|
+
/* istanbul ignore next */
|
|
10
|
+
constructor() {
|
|
11
|
+
super();
|
|
12
|
+
this.register(ListViewGridColumnsLoadAction, this.load);
|
|
13
|
+
}
|
|
14
|
+
load(state, action) {
|
|
15
|
+
const newColumns = action.columns.map((g) => new SkyGridColumnModel(g.template, g));
|
|
16
|
+
if (action.refresh) {
|
|
17
|
+
return new AsyncList([...newColumns], new Date());
|
|
18
|
+
}
|
|
19
|
+
return new AsyncList([...state.items, ...newColumns], new Date());
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1ucy5vcmNoZXN0cmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvbGlzdC1idWlsZGVyLXZpZXctZ3JpZHMvc3JjL2xpYi9tb2R1bGVzL2xpc3Qtdmlldy1ncmlkL3N0YXRlL2NvbHVtbnMvY29sdW1ucy5vcmNoZXN0cmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV2RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUU5RCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFOUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sK0JBQWdDLFNBQVEscUJBRXBEO0lBQ0MsMEJBQTBCO0lBQzFCO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUFFUixJQUFJLENBQUMsUUFBUSxDQUFDLDZCQUE2QixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRU8sSUFBSSxDQUNWLEtBQW9DLEVBQ3BDLE1BQXFDO1FBRXJDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUNuQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUM3QyxDQUFDO1FBRUYsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ2xCLE9BQU8sSUFBSSxTQUFTLENBQXFCLENBQUMsR0FBRyxVQUFVLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7U0FDdkU7UUFFRCxPQUFPLElBQUksU0FBUyxDQUNsQixDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxHQUFHLFVBQVUsQ0FBQyxFQUMvQixJQUFJLElBQUksRUFBRSxDQUNYLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTa3lHcmlkQ29sdW1uTW9kZWwgfSBmcm9tICdAc2t5dXgvZ3JpZHMnO1xuaW1wb3J0IHsgQXN5bmNMaXN0IH0gZnJvbSAnQHNreXV4L2xpc3QtYnVpbGRlci1jb21tb24nO1xuXG5pbXBvcnQgeyBHcmlkU3RhdGVPcmNoZXN0cmF0b3IgfSBmcm9tICcuLi9ncmlkLXN0YXRlLnJ4c3RhdGUnO1xuXG5pbXBvcnQgeyBMaXN0Vmlld0dyaWRDb2x1bW5zTG9hZEFjdGlvbiB9IGZyb20gJy4vbG9hZC5hY3Rpb24nO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgTGlzdFZpZXdHcmlkQ29sdW1uc09yY2hlc3RyYXRvciBleHRlbmRzIEdyaWRTdGF0ZU9yY2hlc3RyYXRvcjxcbiAgQXN5bmNMaXN0PFNreUdyaWRDb2x1bW5Nb2RlbD5cbj4ge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5yZWdpc3RlcihMaXN0Vmlld0dyaWRDb2x1bW5zTG9hZEFjdGlvbiwgdGhpcy5sb2FkKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZChcbiAgICBzdGF0ZTogQXN5bmNMaXN0PFNreUdyaWRDb2x1bW5Nb2RlbD4sXG4gICAgYWN0aW9uOiBMaXN0Vmlld0dyaWRDb2x1bW5zTG9hZEFjdGlvblxuICApOiBBc3luY0xpc3Q8U2t5R3JpZENvbHVtbk1vZGVsPiB7XG4gICAgY29uc3QgbmV3Q29sdW1ucyA9IGFjdGlvbi5jb2x1bW5zLm1hcChcbiAgICAgIChnKSA9PiBuZXcgU2t5R3JpZENvbHVtbk1vZGVsKGcudGVtcGxhdGUsIGcpXG4gICAgKTtcblxuICAgIGlmIChhY3Rpb24ucmVmcmVzaCkge1xuICAgICAgcmV0dXJuIG5ldyBBc3luY0xpc3Q8U2t5R3JpZENvbHVtbk1vZGVsPihbLi4ubmV3Q29sdW1uc10sIG5ldyBEYXRlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQXN5bmNMaXN0PFNreUdyaWRDb2x1bW5Nb2RlbD4oXG4gICAgICBbLi4uc3RhdGUuaXRlbXMsIC4uLm5ld0NvbHVtbnNdLFxuICAgICAgbmV3IERhdGUoKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|