@firestitch/list 12.3.3 → 12.4.0

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.
Files changed (143) hide show
  1. package/app/classes/actions-controller.d.ts +20 -20
  2. package/app/classes/columns-controller.d.ts +71 -71
  3. package/app/classes/data-controller.d.ts +90 -90
  4. package/app/classes/external-params-controller.d.ts +31 -31
  5. package/app/classes/index.d.ts +2 -2
  6. package/app/classes/list-controller.d.ts +174 -168
  7. package/app/classes/pagination-controller.d.ts +189 -189
  8. package/app/classes/persistance-controller.d.ts +10 -10
  9. package/app/classes/reorder-controller.d.ts +62 -61
  10. package/app/classes/selection-controller.d.ts +141 -141
  11. package/app/classes/sorting-controller.d.ts +64 -64
  12. package/app/components/body/body.component.d.ts +32 -32
  13. package/app/components/body/row/actions/actions.component.d.ts +35 -35
  14. package/app/components/body/row/cell/cell.component.d.ts +23 -23
  15. package/app/components/body/row/inline-action/inline-action.component.d.ts +16 -16
  16. package/app/components/body/row/menu-action/menu-action.component.d.ts +12 -12
  17. package/app/components/body/row/row.component.d.ts +72 -72
  18. package/app/components/customize-cols/customize-cols.component.d.ts +17 -17
  19. package/app/components/footer/footer-row/footer-cell/footer-cell.component.d.ts +7 -7
  20. package/app/components/footer/footer-row/footer-row.component.d.ts +11 -11
  21. package/app/components/footer/footer.component.d.ts +11 -11
  22. package/app/components/head/head-cell/head-cell.component.d.ts +14 -14
  23. package/app/components/head/head.component.d.ts +43 -43
  24. package/app/components/list/list.component.d.ts +114 -113
  25. package/app/components/loader/loader.component.d.ts +14 -14
  26. package/app/components/manage-saved-filters/manage-saved-filters.component.d.ts +13 -13
  27. package/app/components/pagination/pagination.component.d.ts +14 -14
  28. package/app/components/saved-filters/saved-filters.component.d.ts +15 -15
  29. package/app/components/status/status.component.d.ts +21 -21
  30. package/app/directives/cell/cell.directive.d.ts +8 -8
  31. package/app/directives/column/column.directive.d.ts +33 -33
  32. package/app/directives/content/content.directive.d.ts +5 -5
  33. package/app/directives/content-init/content-init.directive.d.ts +9 -9
  34. package/app/directives/draggable-list/draggable-list.directive.d.ts +80 -80
  35. package/app/directives/draggable-row/draggable-row.directive.d.ts +21 -21
  36. package/app/directives/empty-state/empty-state.directive.d.ts +5 -5
  37. package/app/directives/footer/footer.directive.d.ts +8 -8
  38. package/app/directives/group-expand-trigger/group-expand-trigger.directive.d.ts +10 -10
  39. package/app/directives/group-footer/group-footer.directive.d.ts +6 -6
  40. package/app/directives/group-header/group-header.directive.d.ts +6 -6
  41. package/app/directives/header/header.directive.d.ts +8 -8
  42. package/app/enums/button-type.enum.d.ts +7 -7
  43. package/app/enums/page-change-type.enum.d.ts +4 -4
  44. package/app/enums/pagination-strategy.enum.d.ts +5 -5
  45. package/app/enums/row-type.enum.d.ts +6 -6
  46. package/app/enums/state.enum.d.ts +9 -9
  47. package/app/fs-list.module.d.ts +57 -57
  48. package/app/fs-list.providers.d.ts +3 -3
  49. package/app/interfaces/cellconfig.interface.d.ts +5 -5
  50. package/app/interfaces/column-config.interface.d.ts +2 -2
  51. package/app/interfaces/draggable-list.interface.d.ts +7 -7
  52. package/app/interfaces/external-params.interface.d.ts +13 -13
  53. package/app/interfaces/index.d.ts +3 -3
  54. package/app/interfaces/listconfig.interface.d.ts +250 -250
  55. package/app/interfaces/pagination.interface.d.ts +13 -13
  56. package/app/models/column-async-attribute.d.ts +5 -5
  57. package/app/models/column-attributes.d.ts +39 -39
  58. package/app/models/column.model.d.ts +59 -59
  59. package/app/models/row/base-row.d.ts +13 -13
  60. package/app/models/row/child-row.d.ts +12 -12
  61. package/app/models/row/group-footer-row.d.ts +10 -10
  62. package/app/models/row/group-row.d.ts +15 -15
  63. package/app/models/row/simple-row.d.ts +5 -5
  64. package/app/models/row-action.model.d.ts +31 -31
  65. package/app/models/row.d.ts +30 -30
  66. package/app/models/styleConfig.model.d.ts +31 -31
  67. package/app/services/group-expand-notifier.service.d.ts +11 -11
  68. package/bundles/firestitch-list.umd.js +6545 -6512
  69. package/bundles/firestitch-list.umd.js.map +1 -1
  70. package/esm2015/app/classes/actions-controller.js +55 -55
  71. package/esm2015/app/classes/columns-controller.js +205 -205
  72. package/esm2015/app/classes/data-controller.js +333 -333
  73. package/esm2015/app/classes/external-params-controller.js +153 -153
  74. package/esm2015/app/classes/index.js +3 -3
  75. package/esm2015/app/classes/list-controller.js +715 -700
  76. package/esm2015/app/classes/pagination-controller.js +460 -460
  77. package/esm2015/app/classes/persistance-controller.js +19 -19
  78. package/esm2015/app/classes/reorder-controller.js +173 -170
  79. package/esm2015/app/classes/selection-controller.js +445 -445
  80. package/esm2015/app/classes/sorting-controller.js +180 -180
  81. package/esm2015/app/components/body/body.component.js +76 -76
  82. package/esm2015/app/components/body/row/actions/actions.component.js +100 -100
  83. package/esm2015/app/components/body/row/cell/cell.component.js +92 -92
  84. package/esm2015/app/components/body/row/inline-action/inline-action.component.js +40 -40
  85. package/esm2015/app/components/body/row/menu-action/menu-action.component.js +31 -31
  86. package/esm2015/app/components/body/row/row.component.js +254 -254
  87. package/esm2015/app/components/customize-cols/customize-cols.component.js +72 -72
  88. package/esm2015/app/components/footer/footer-row/footer-cell/footer-cell.component.js +20 -20
  89. package/esm2015/app/components/footer/footer-row/footer-row.component.js +27 -27
  90. package/esm2015/app/components/footer/footer.component.js +26 -26
  91. package/esm2015/app/components/head/head-cell/head-cell.component.js +33 -33
  92. package/esm2015/app/components/head/head.component.js +91 -91
  93. package/esm2015/app/components/list/list.component.js +370 -364
  94. package/esm2015/app/components/loader/loader.component.js +47 -47
  95. package/esm2015/app/components/manage-saved-filters/manage-saved-filters.component.js +79 -79
  96. package/esm2015/app/components/pagination/pagination.component.js +45 -45
  97. package/esm2015/app/components/saved-filters/saved-filters.component.js +33 -33
  98. package/esm2015/app/components/status/status.component.js +74 -74
  99. package/esm2015/app/directives/cell/cell.directive.js +18 -18
  100. package/esm2015/app/directives/column/column.directive.js +111 -111
  101. package/esm2015/app/directives/content/content.directive.js +12 -12
  102. package/esm2015/app/directives/content-init/content-init.directive.js +21 -21
  103. package/esm2015/app/directives/draggable-list/draggable-list.directive.js +256 -256
  104. package/esm2015/app/directives/draggable-row/draggable-row.directive.js +73 -73
  105. package/esm2015/app/directives/empty-state/empty-state.directive.js +13 -13
  106. package/esm2015/app/directives/footer/footer.directive.js +18 -18
  107. package/esm2015/app/directives/group-expand-trigger/group-expand-trigger.directive.js +26 -26
  108. package/esm2015/app/directives/group-footer/group-footer.directive.js +13 -13
  109. package/esm2015/app/directives/group-header/group-header.directive.js +13 -13
  110. package/esm2015/app/directives/header/header.directive.js +18 -18
  111. package/esm2015/app/enums/button-type.enum.js +9 -9
  112. package/esm2015/app/enums/page-change-type.enum.js +6 -6
  113. package/esm2015/app/enums/pagination-strategy.enum.js +7 -7
  114. package/esm2015/app/enums/row-type.enum.js +7 -7
  115. package/esm2015/app/enums/state.enum.js +11 -11
  116. package/esm2015/app/fs-list.module.js +231 -231
  117. package/esm2015/app/fs-list.providers.js +4 -4
  118. package/esm2015/app/interfaces/cellconfig.interface.js +2 -2
  119. package/esm2015/app/interfaces/column-config.interface.js +1 -1
  120. package/esm2015/app/interfaces/draggable-list.interface.js +2 -2
  121. package/esm2015/app/interfaces/external-params.interface.js +2 -2
  122. package/esm2015/app/interfaces/index.js +4 -4
  123. package/esm2015/app/interfaces/listconfig.interface.js +1 -1
  124. package/esm2015/app/interfaces/pagination.interface.js +2 -2
  125. package/esm2015/app/models/column-async-attribute.js +13 -13
  126. package/esm2015/app/models/column-attributes.js +130 -130
  127. package/esm2015/app/models/column.model.js +166 -166
  128. package/esm2015/app/models/row/base-row.js +23 -23
  129. package/esm2015/app/models/row/child-row.js +28 -28
  130. package/esm2015/app/models/row/group-footer-row.js +20 -20
  131. package/esm2015/app/models/row/group-row.js +40 -40
  132. package/esm2015/app/models/row/simple-row.js +10 -10
  133. package/esm2015/app/models/row-action.model.js +108 -108
  134. package/esm2015/app/models/row.js +80 -80
  135. package/esm2015/app/models/styleConfig.model.js +75 -75
  136. package/esm2015/app/services/group-expand-notifier.service.js +26 -26
  137. package/esm2015/firestitch-list.js +4 -4
  138. package/esm2015/public_api.js +44 -44
  139. package/fesm2015/firestitch-list.js +5381 -5357
  140. package/fesm2015/firestitch-list.js.map +1 -1
  141. package/firestitch-list.d.ts +5 -5
  142. package/package.json +1 -1
  143. package/public_api.d.ts +38 -38
@@ -1,334 +1,334 @@
1
- import { BehaviorSubject, Subject } from 'rxjs';
2
- import { takeUntil } from 'rxjs/operators';
3
- import { isFunction, isObject } from 'lodash-es';
4
- import { FsListState } from '../enums/state.enum';
5
- import { RowType } from '../enums/row-type.enum';
6
- import { GroupRow } from '../models/row/group-row';
7
- import { ChildRow } from '../models/row/child-row';
8
- import { Row } from '../models/row';
9
- import { GroupFooterRow } from '../models/row/group-footer-row';
10
- export class DataController {
11
- constructor() {
12
- this._visibleRows$ = new BehaviorSubject([]);
13
- this._rowsRemoved$ = new Subject();
14
- this._remoteRowsChange$ = new Subject();
15
- this._store = new Map();
16
- this._rowsStack = [];
17
- this._initialExpand = true;
18
- this._groupEnabled = false;
19
- this._hasData = false;
20
- this._destroy$ = new Subject();
21
- }
22
- get visibleRows$() {
23
- return this._visibleRows$;
24
- }
25
- get visibleRows() {
26
- return this._visibleRows$.getValue();
27
- }
28
- get visibleRowsData() {
29
- return this.visibleRows.map((row) => row.data);
30
- }
31
- get rowsStack() {
32
- return this._rowsStack.slice();
33
- }
34
- get groupEnabled() {
35
- return this._groupEnabled;
36
- }
37
- set groupEnabled(value) {
38
- this._groupEnabled = value;
39
- }
40
- get remoteRowsChange$() {
41
- return this._remoteRowsChange$.pipe(takeUntil(this._destroy$));
42
- }
43
- get rowsRemoved$() {
44
- return this._rowsRemoved$.pipe(takeUntil(this._destroy$));
45
- }
46
- get hasData() {
47
- return this._hasData;
48
- }
49
- get operation() {
50
- return this._operation;
51
- }
52
- set visibleRows(value) {
53
- this._visibleRows$.next(value);
54
- this._hasData = this.visibleRows.length > 0;
55
- }
56
- get visibleRowsCount() {
57
- return this.visibleRows.length;
58
- }
59
- get hasGroups() {
60
- return this._compareByFn && this._groupByFn;
61
- }
62
- get reorderData() {
63
- return this._rowsStack
64
- .map((row) => row.getReorderData());
65
- }
66
- setGroupConfig(group) {
67
- var _a;
68
- if (group) {
69
- this._groupByFn = group.groupBy;
70
- this._compareByFn = group.compareBy;
71
- this._footerRowFn = group.footer || (() => false);
72
- this._initialExpand = (_a = group.initialExpand) !== null && _a !== void 0 ? _a : true;
73
- // group mode enabled by default
74
- this._groupEnabled = (group.enabled !== void 0)
75
- ? group.enabled
76
- : true;
77
- }
78
- }
79
- setAdditionalConfigs(configs) {
80
- this._infinityScrollEnabled = configs.scrollable;
81
- this._loadMoreEnabled = configs.loadMoreEnabled;
82
- }
83
- /**
84
- * Rows what was received from fetch function
85
- * @param rows
86
- */
87
- setRowsFromResponse(rows) {
88
- if (this._infinityScrollEnabled) {
89
- switch (this._operation) {
90
- case FsListState.Filter:
91
- case FsListState.Reload:
92
- case FsListState.Sort:
93
- {
94
- this._updateRowsStack(rows);
95
- }
96
- break;
97
- default: {
98
- this._extendRowsStack(rows);
99
- }
100
- }
101
- this._remoteRowsChange$.next();
102
- }
103
- else {
104
- if (this._operation === FsListState.LoadMore ||
105
- (this._operation === FsListState.PageChange && this._loadMoreEnabled)) {
106
- this._extendRowsStack(rows);
107
- }
108
- else {
109
- this._updateRowsStack(rows);
110
- }
111
- }
112
- this._operation = FsListState.Idle;
113
- this._updateVisibleRows();
114
- }
115
- /**
116
- * Set current operation for list data flow
117
- * @param value
118
- */
119
- setOperation(value) {
120
- this._operation = value;
121
- }
122
- /**
123
- * Remove rows from visible
124
- */
125
- clearRows() {
126
- this.visibleRows = [];
127
- }
128
- /**
129
- * Replace data for specified row
130
- * @param targetRow
131
- * @param trackBy
132
- */
133
- replaceData(targetRow, trackBy) {
134
- const rowIndex = this._rowsStack.findIndex((listRow) => {
135
- return trackBy(listRow.data, targetRow);
136
- });
137
- if (rowIndex > -1) {
138
- this._rowsStack[rowIndex] = new Row(targetRow, RowType.Simple, { initialExpand: this._initialExpand });
139
- this._updateVisibleRows();
140
- return true;
141
- }
142
- else {
143
- return false;
144
- }
145
- }
146
- /**
147
- * Update data for specified row
148
- * @param rows
149
- * @param trackBy
150
- */
151
- updateData(rows, trackBy) {
152
- if (Array.isArray(rows)) {
153
- let updateSuccess = false;
154
- rows.forEach((item) => {
155
- if (this.updateRow(item, trackBy)) {
156
- updateSuccess = true;
157
- }
158
- });
159
- this._updateVisibleRows();
160
- return updateSuccess;
161
- }
162
- else {
163
- const updated = this.updateRow(rows, trackBy);
164
- this._updateVisibleRows();
165
- return updated;
166
- }
167
- }
168
- /**
169
- * Remove data for specified row
170
- * @param data
171
- */
172
- removeData(data) {
173
- const removedRows = [];
174
- const defaultTrackBy = (row, target) => {
175
- return row === target;
176
- };
177
- if (Array.isArray(data)) {
178
- //
179
- data.forEach((item) => {
180
- removedRows.push(...this.removeRow(item, defaultTrackBy));
181
- });
182
- }
183
- else if (isFunction(data)) {
184
- removedRows.push(...this.removeRow(null, data));
185
- }
186
- else if (isObject(data)) {
187
- removedRows.push(...this.removeRow(data, defaultTrackBy));
188
- }
189
- if (removedRows.length > 0) {
190
- this._updateVisibleRows();
191
- this._rowsRemoved$.next(removedRows);
192
- }
193
- return !!removedRows.length;
194
- }
195
- swapRows(row1, row2) {
196
- let tmpEl;
197
- const rowsStack = this._rowsStack;
198
- const row1GlobalIndex = rowsStack.indexOf(row1);
199
- const row2GlobalIndex = rowsStack.indexOf(row2);
200
- tmpEl = rowsStack[row1GlobalIndex];
201
- rowsStack[row1GlobalIndex] = rowsStack[row2GlobalIndex];
202
- rowsStack[row2GlobalIndex] = tmpEl;
203
- this._rowsStack = [...rowsStack];
204
- }
205
- destroy() {
206
- this._destroyRowsStack();
207
- this._store.clear();
208
- this._destroy$.next();
209
- this._destroy$.complete();
210
- }
211
- toggleRowGroup(rowData) {
212
- const row = this.visibleRows.find((visibleRow) => visibleRow.data === rowData);
213
- row.toggleRowExpandStatus();
214
- this._updateVisibleRows();
215
- console.log(this._rowsStack);
216
- }
217
- _updateRowsStack(rows) {
218
- this._destroyRowsStack();
219
- if (this.groupEnabled) {
220
- this._store.clear();
221
- this._rowsStack = [...this.groupRowsBy(rows)];
222
- }
223
- else {
224
- rows = rows.map((row) => {
225
- return new Row(row, RowType.Simple, { initialExpand: this._initialExpand });
226
- });
227
- this._rowsStack = [...rows];
228
- }
229
- }
230
- _extendRowsStack(rows) {
231
- if (this.groupEnabled) {
232
- this._rowsStack = [...this.groupRowsBy(rows)];
233
- }
234
- else {
235
- rows = rows.map((row) => {
236
- return new Row(row, RowType.Simple, { initialExpand: this._initialExpand });
237
- });
238
- this._rowsStack = [...this._rowsStack, ...rows];
239
- }
240
- }
241
- _destroyRowsStack() {
242
- this._rowsStack.forEach((row) => row.destroy());
243
- }
244
- _updateVisibleRows() {
245
- this.visibleRows = this._rowsStack
246
- .filter((row) => {
247
- return (!row.isChild && !row.isFooter) || row.visible;
248
- });
249
- }
250
- updateRow(targetRow, trackBy) {
251
- if (trackBy === void 0) {
252
- trackBy = (row, target) => {
253
- return row === target;
254
- };
255
- }
256
- const targetIndex = this._rowsStack.findIndex((listRow) => trackBy(listRow.data, targetRow));
257
- if (targetIndex !== -1) {
258
- const updateTarget = this._rowsStack[targetIndex];
259
- const updatedData = Object.assign({}, updateTarget.data, targetRow);
260
- this._rowsStack[targetIndex] = new Row(updatedData, updateTarget.type, {
261
- parent: updateTarget.parent,
262
- initialExpand: updateTarget.expanded,
263
- });
264
- return true;
265
- }
266
- return false;
267
- }
268
- /**
269
- * Remove row from
270
- * @param targetRow
271
- * @param trackBy
272
- */
273
- removeRow(targetRow, trackBy) {
274
- const rows = this._rowsStack;
275
- const removedRows = [];
276
- rows.forEach((listRow, index) => {
277
- if (trackBy(listRow.data, targetRow)) {
278
- const removedRow = rows.splice(index, 1);
279
- removedRows.push(removedRow);
280
- }
281
- });
282
- return removedRows;
283
- }
284
- /**
285
- * Split existing rows by groups and store them for future use
286
- */
287
- groupRowsBy(rows) {
288
- if (!this._groupByFn || !this._compareByFn) {
289
- return rows;
290
- }
291
- let numberOfGroups = 0;
292
- const footerRows = new Map();
293
- rows.forEach((row) => {
294
- const mainGroup = this._groupByFn(row);
295
- const isFooterRow = this._footerRowFn(row);
296
- const mainGroupKey = this._compareByFn(mainGroup);
297
- if (isFooterRow) {
298
- footerRows.set(mainGroupKey, row);
299
- return;
300
- }
301
- if (!this._store.has(mainGroupKey)) {
302
- const group = new GroupRow(mainGroup, this._initialExpand);
303
- group.index = numberOfGroups;
304
- numberOfGroups++;
305
- const childRow = new ChildRow(row, group);
306
- this._store.set(mainGroupKey, group);
307
- group.children.push(childRow);
308
- }
309
- else {
310
- const group = this._store.get(mainGroupKey);
311
- const childRow = new ChildRow(row, group);
312
- group.children.push(childRow);
313
- }
314
- });
315
- for (const [key, value] of footerRows) {
316
- const group = this._store.get(key);
317
- if (group) {
318
- const footerRow = new GroupFooterRow(value, group);
319
- group.children.push(footerRow);
320
- }
321
- }
322
- return Array.from(this._store.values())
323
- .reduce((acc, item) => {
324
- if (item.isGroup) {
325
- acc.push(item, ...item.children);
326
- }
327
- else {
328
- acc.push(item);
329
- }
330
- return acc;
331
- }, []);
332
- }
333
- }
1
+ import { BehaviorSubject, Subject } from 'rxjs';
2
+ import { takeUntil } from 'rxjs/operators';
3
+ import { isFunction, isObject } from 'lodash-es';
4
+ import { FsListState } from '../enums/state.enum';
5
+ import { RowType } from '../enums/row-type.enum';
6
+ import { GroupRow } from '../models/row/group-row';
7
+ import { ChildRow } from '../models/row/child-row';
8
+ import { Row } from '../models/row';
9
+ import { GroupFooterRow } from '../models/row/group-footer-row';
10
+ export class DataController {
11
+ constructor() {
12
+ this._visibleRows$ = new BehaviorSubject([]);
13
+ this._rowsRemoved$ = new Subject();
14
+ this._remoteRowsChange$ = new Subject();
15
+ this._store = new Map();
16
+ this._rowsStack = [];
17
+ this._initialExpand = true;
18
+ this._groupEnabled = false;
19
+ this._hasData = false;
20
+ this._destroy$ = new Subject();
21
+ }
22
+ get visibleRows$() {
23
+ return this._visibleRows$;
24
+ }
25
+ get visibleRows() {
26
+ return this._visibleRows$.getValue();
27
+ }
28
+ get visibleRowsData() {
29
+ return this.visibleRows.map((row) => row.data);
30
+ }
31
+ get rowsStack() {
32
+ return this._rowsStack.slice();
33
+ }
34
+ get groupEnabled() {
35
+ return this._groupEnabled;
36
+ }
37
+ set groupEnabled(value) {
38
+ this._groupEnabled = value;
39
+ }
40
+ get remoteRowsChange$() {
41
+ return this._remoteRowsChange$.pipe(takeUntil(this._destroy$));
42
+ }
43
+ get rowsRemoved$() {
44
+ return this._rowsRemoved$.pipe(takeUntil(this._destroy$));
45
+ }
46
+ get hasData() {
47
+ return this._hasData;
48
+ }
49
+ get operation() {
50
+ return this._operation;
51
+ }
52
+ set visibleRows(value) {
53
+ this._visibleRows$.next(value);
54
+ this._hasData = this.visibleRows.length > 0;
55
+ }
56
+ get visibleRowsCount() {
57
+ return this.visibleRows.length;
58
+ }
59
+ get hasGroups() {
60
+ return this._compareByFn && this._groupByFn;
61
+ }
62
+ get reorderData() {
63
+ return this._rowsStack
64
+ .map((row) => row.getReorderData());
65
+ }
66
+ setGroupConfig(group) {
67
+ var _a;
68
+ if (group) {
69
+ this._groupByFn = group.groupBy;
70
+ this._compareByFn = group.compareBy;
71
+ this._footerRowFn = group.footer || (() => false);
72
+ this._initialExpand = (_a = group.initialExpand) !== null && _a !== void 0 ? _a : true;
73
+ // group mode enabled by default
74
+ this._groupEnabled = (group.enabled !== void 0)
75
+ ? group.enabled
76
+ : true;
77
+ }
78
+ }
79
+ setAdditionalConfigs(configs) {
80
+ this._infinityScrollEnabled = configs.scrollable;
81
+ this._loadMoreEnabled = configs.loadMoreEnabled;
82
+ }
83
+ /**
84
+ * Rows what was received from fetch function
85
+ * @param rows
86
+ */
87
+ setRowsFromResponse(rows) {
88
+ if (this._infinityScrollEnabled) {
89
+ switch (this._operation) {
90
+ case FsListState.Filter:
91
+ case FsListState.Reload:
92
+ case FsListState.Sort:
93
+ {
94
+ this._updateRowsStack(rows);
95
+ }
96
+ break;
97
+ default: {
98
+ this._extendRowsStack(rows);
99
+ }
100
+ }
101
+ this._remoteRowsChange$.next();
102
+ }
103
+ else {
104
+ if (this._operation === FsListState.LoadMore ||
105
+ (this._operation === FsListState.PageChange && this._loadMoreEnabled)) {
106
+ this._extendRowsStack(rows);
107
+ }
108
+ else {
109
+ this._updateRowsStack(rows);
110
+ }
111
+ }
112
+ this._operation = FsListState.Idle;
113
+ this._updateVisibleRows();
114
+ }
115
+ /**
116
+ * Set current operation for list data flow
117
+ * @param value
118
+ */
119
+ setOperation(value) {
120
+ this._operation = value;
121
+ }
122
+ /**
123
+ * Remove rows from visible
124
+ */
125
+ clearRows() {
126
+ this.visibleRows = [];
127
+ }
128
+ /**
129
+ * Replace data for specified row
130
+ * @param targetRow
131
+ * @param trackBy
132
+ */
133
+ replaceData(targetRow, trackBy) {
134
+ const rowIndex = this._rowsStack.findIndex((listRow) => {
135
+ return trackBy(listRow.data, targetRow);
136
+ });
137
+ if (rowIndex > -1) {
138
+ this._rowsStack[rowIndex] = new Row(targetRow, RowType.Simple, { initialExpand: this._initialExpand });
139
+ this._updateVisibleRows();
140
+ return true;
141
+ }
142
+ else {
143
+ return false;
144
+ }
145
+ }
146
+ /**
147
+ * Update data for specified row
148
+ * @param rows
149
+ * @param trackBy
150
+ */
151
+ updateData(rows, trackBy) {
152
+ if (Array.isArray(rows)) {
153
+ let updateSuccess = false;
154
+ rows.forEach((item) => {
155
+ if (this.updateRow(item, trackBy)) {
156
+ updateSuccess = true;
157
+ }
158
+ });
159
+ this._updateVisibleRows();
160
+ return updateSuccess;
161
+ }
162
+ else {
163
+ const updated = this.updateRow(rows, trackBy);
164
+ this._updateVisibleRows();
165
+ return updated;
166
+ }
167
+ }
168
+ /**
169
+ * Remove data for specified row
170
+ * @param data
171
+ */
172
+ removeData(data) {
173
+ const removedRows = [];
174
+ const defaultTrackBy = (row, target) => {
175
+ return row === target;
176
+ };
177
+ if (Array.isArray(data)) {
178
+ //
179
+ data.forEach((item) => {
180
+ removedRows.push(...this.removeRow(item, defaultTrackBy));
181
+ });
182
+ }
183
+ else if (isFunction(data)) {
184
+ removedRows.push(...this.removeRow(null, data));
185
+ }
186
+ else if (isObject(data)) {
187
+ removedRows.push(...this.removeRow(data, defaultTrackBy));
188
+ }
189
+ if (removedRows.length > 0) {
190
+ this._updateVisibleRows();
191
+ this._rowsRemoved$.next(removedRows);
192
+ }
193
+ return !!removedRows.length;
194
+ }
195
+ swapRows(row1, row2) {
196
+ let tmpEl;
197
+ const rowsStack = this._rowsStack;
198
+ const row1GlobalIndex = rowsStack.indexOf(row1);
199
+ const row2GlobalIndex = rowsStack.indexOf(row2);
200
+ tmpEl = rowsStack[row1GlobalIndex];
201
+ rowsStack[row1GlobalIndex] = rowsStack[row2GlobalIndex];
202
+ rowsStack[row2GlobalIndex] = tmpEl;
203
+ this._rowsStack = [...rowsStack];
204
+ }
205
+ destroy() {
206
+ this._destroyRowsStack();
207
+ this._store.clear();
208
+ this._destroy$.next();
209
+ this._destroy$.complete();
210
+ }
211
+ toggleRowGroup(rowData) {
212
+ const row = this.visibleRows.find((visibleRow) => visibleRow.data === rowData);
213
+ row.toggleRowExpandStatus();
214
+ this._updateVisibleRows();
215
+ console.log(this._rowsStack);
216
+ }
217
+ _updateRowsStack(rows) {
218
+ this._destroyRowsStack();
219
+ if (this.groupEnabled) {
220
+ this._store.clear();
221
+ this._rowsStack = [...this.groupRowsBy(rows)];
222
+ }
223
+ else {
224
+ rows = rows.map((row) => {
225
+ return new Row(row, RowType.Simple, { initialExpand: this._initialExpand });
226
+ });
227
+ this._rowsStack = [...rows];
228
+ }
229
+ }
230
+ _extendRowsStack(rows) {
231
+ if (this.groupEnabled) {
232
+ this._rowsStack = [...this.groupRowsBy(rows)];
233
+ }
234
+ else {
235
+ rows = rows.map((row) => {
236
+ return new Row(row, RowType.Simple, { initialExpand: this._initialExpand });
237
+ });
238
+ this._rowsStack = [...this._rowsStack, ...rows];
239
+ }
240
+ }
241
+ _destroyRowsStack() {
242
+ this._rowsStack.forEach((row) => row.destroy());
243
+ }
244
+ _updateVisibleRows() {
245
+ this.visibleRows = this._rowsStack
246
+ .filter((row) => {
247
+ return (!row.isChild && !row.isFooter) || row.visible;
248
+ });
249
+ }
250
+ updateRow(targetRow, trackBy) {
251
+ if (trackBy === void 0) {
252
+ trackBy = (row, target) => {
253
+ return row === target;
254
+ };
255
+ }
256
+ const targetIndex = this._rowsStack.findIndex((listRow) => trackBy(listRow.data, targetRow));
257
+ if (targetIndex !== -1) {
258
+ const updateTarget = this._rowsStack[targetIndex];
259
+ const updatedData = Object.assign({}, updateTarget.data, targetRow);
260
+ this._rowsStack[targetIndex] = new Row(updatedData, updateTarget.type, {
261
+ parent: updateTarget.parent,
262
+ initialExpand: updateTarget.expanded,
263
+ });
264
+ return true;
265
+ }
266
+ return false;
267
+ }
268
+ /**
269
+ * Remove row from
270
+ * @param targetRow
271
+ * @param trackBy
272
+ */
273
+ removeRow(targetRow, trackBy) {
274
+ const rows = this._rowsStack;
275
+ const removedRows = [];
276
+ rows.forEach((listRow, index) => {
277
+ if (trackBy(listRow.data, targetRow)) {
278
+ const removedRow = rows.splice(index, 1);
279
+ removedRows.push(removedRow);
280
+ }
281
+ });
282
+ return removedRows;
283
+ }
284
+ /**
285
+ * Split existing rows by groups and store them for future use
286
+ */
287
+ groupRowsBy(rows) {
288
+ if (!this._groupByFn || !this._compareByFn) {
289
+ return rows;
290
+ }
291
+ let numberOfGroups = 0;
292
+ const footerRows = new Map();
293
+ rows.forEach((row) => {
294
+ const mainGroup = this._groupByFn(row);
295
+ const isFooterRow = this._footerRowFn(row);
296
+ const mainGroupKey = this._compareByFn(mainGroup);
297
+ if (isFooterRow) {
298
+ footerRows.set(mainGroupKey, row);
299
+ return;
300
+ }
301
+ if (!this._store.has(mainGroupKey)) {
302
+ const group = new GroupRow(mainGroup, this._initialExpand);
303
+ group.index = numberOfGroups;
304
+ numberOfGroups++;
305
+ const childRow = new ChildRow(row, group);
306
+ this._store.set(mainGroupKey, group);
307
+ group.children.push(childRow);
308
+ }
309
+ else {
310
+ const group = this._store.get(mainGroupKey);
311
+ const childRow = new ChildRow(row, group);
312
+ group.children.push(childRow);
313
+ }
314
+ });
315
+ for (const [key, value] of footerRows) {
316
+ const group = this._store.get(key);
317
+ if (group) {
318
+ const footerRow = new GroupFooterRow(value, group);
319
+ group.children.push(footerRow);
320
+ }
321
+ }
322
+ return Array.from(this._store.values())
323
+ .reduce((acc, item) => {
324
+ if (item.isGroup) {
325
+ acc.push(item, ...item.children);
326
+ }
327
+ else {
328
+ acc.push(item);
329
+ }
330
+ return acc;
331
+ }, []);
332
+ }
333
+ }
334
334
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9jbGFzc2VzL2RhdGEtY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQU1qRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBR2hFLE1BQU0sT0FBTyxjQUFjO0lBdUJ6QjtRQXJCaUIsa0JBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBUSxFQUFFLENBQUMsQ0FBQztRQUMvQyxrQkFBYSxHQUFHLElBQUksT0FBTyxFQUFTLENBQUM7UUFDckMsdUJBQWtCLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUVsRCxXQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNuQixlQUFVLEdBQVUsRUFBRSxDQUFDO1FBTXZCLG1CQUFjLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBS3RCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFUixjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUVsQyxDQUFDO0lBRWhCLElBQUksWUFBWTtRQUNk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Q2xDO2lCQUFNO2dCQUNMLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDaEI7WUFFRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNYLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiwgaXNPYmplY3QgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5pbXBvcnQgeyBGc0xpc3RTdGF0ZSB9IGZyb20gJy4uL2VudW1zL3N0YXRlLmVudW0nO1xuaW1wb3J0IHsgUm93VHlwZSB9IGZyb20gJy4uL2VudW1zL3Jvdy10eXBlLmVudW0nO1xuaW1wb3J0IHtcbiAgRnNMaXN0QWJzdHJhY3RSb3csXG4gIEZzTGlzdEdyb3VwQ29uZmlnLFxuICBGc0xpc3RUcmFja0J5VGFyZ2V0Um93Rm5cbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9saXN0Y29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBHcm91cFJvdyB9IGZyb20gJy4uL21vZGVscy9yb3cvZ3JvdXAtcm93JztcbmltcG9ydCB7IENoaWxkUm93IH0gZnJvbSAnLi4vbW9kZWxzL3Jvdy9jaGlsZC1yb3cnO1xuaW1wb3J0IHsgUm93IH0gZnJvbSAnLi4vbW9kZWxzL3Jvdyc7XG5pbXBvcnQgeyBHcm91cEZvb3RlclJvdyB9IGZyb20gJy4uL21vZGVscy9yb3cvZ3JvdXAtZm9vdGVyLXJvdyc7XG5cblxuZXhwb3J0IGNsYXNzIERhdGFDb250cm9sbGVyIHtcblxuICBwcml2YXRlIHJlYWRvbmx5IF92aXNpYmxlUm93cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJvd1tdPihbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Jvd3NSZW1vdmVkJCA9IG5ldyBTdWJqZWN0PFJvd1tdPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZW1vdGVSb3dzQ2hhbmdlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBfc3RvcmUgPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX3Jvd3NTdGFjazogUm93W10gPSBbXTtcbiAgcHJpdmF0ZSBfb3BlcmF0aW9uOiBGc0xpc3RTdGF0ZTtcblxuICBwcml2YXRlIF9ncm91cEJ5Rm46IChyb3cpID0+IGFueVtdO1xuICBwcml2YXRlIF9mb290ZXJSb3dGbjogKHJvdykgPT4gYm9vbGVhbjtcbiAgcHJpdmF0ZSBfY29tcGFyZUJ5Rm46IChncm91cCkgPT4gYW55O1xuICBwcml2YXRlIF9pbml0aWFsRXhwYW5kID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfZ3JvdXBFbmFibGVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfaW5maW5pdHlTY3JvbGxFbmFibGVkOiBib29sZWFuO1xuICBwcml2YXRlIF9sb2FkTW9yZUVuYWJsZWQ6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBfaGFzRGF0YSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgZ2V0IHZpc2libGVSb3dzJCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmlzaWJsZVJvd3MkO1xuICB9XG5cbiAgZ2V0IHZpc2libGVSb3dzKCkge1xuICAgIHJldHVybiB0aGlzLl92aXNpYmxlUm93cyQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIGdldCB2aXNpYmxlUm93c0RhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZVJvd3MubWFwKChyb3cpID0+IHJvdy5kYXRhKTtcbiAgfVxuXG4gIGdldCByb3dzU3RhY2soKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvd3NTdGFjay5zbGljZSgpO1xuICB9XG5cbiAgZ2V0IGdyb3VwRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JvdXBFbmFibGVkO1xuICB9XG5cbiAgc2V0IGdyb3VwRW5hYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2dyb3VwRW5hYmxlZCA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IHJlbW90ZVJvd3NDaGFuZ2UkKCkge1xuICAgIHJldHVybiB0aGlzLl9yZW1vdGVSb3dzQ2hhbmdlJC5waXBlKFxuICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICApO1xuICB9XG5cbiAgZ2V0IHJvd3NSZW1vdmVkJCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcm93c1JlbW92ZWQkLnBpcGUoXG4gICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICk7XG4gIH1cblxuICBnZXQgaGFzRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5faGFzRGF0YTtcbiAgfVxuXG4gIGdldCBvcGVyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wZXJhdGlvbjtcbiAgfVxuXG4gIHNldCB2aXNpYmxlUm93cyh2YWx1ZTogYW55W10pIHtcbiAgICB0aGlzLl92aXNpYmxlUm93cyQubmV4dCh2YWx1ZSk7XG4gICAgdGhpcy5faGFzRGF0YSA9IHRoaXMudmlzaWJsZVJvd3MubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGdldCB2aXNpYmxlUm93c0NvdW50KCkge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVSb3dzLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBoYXNHcm91cHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbXBhcmVCeUZuICYmIHRoaXMuX2dyb3VwQnlGbjtcbiAgfVxuXG4gIGdldCByZW9yZGVyRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcm93c1N0YWNrXG4gICAgICAubWFwKChyb3cpID0+IHJvdy5nZXRSZW9yZGVyRGF0YSgpKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRHcm91cENvbmZpZyhncm91cDogRnNMaXN0R3JvdXBDb25maWcpIHtcbiAgICBpZiAoZ3JvdXApIHtcbiAgICAgIHRoaXMuX2dyb3VwQnlGbiA9IGdyb3VwLmdyb3VwQnk7XG4gICAgICB0aGlzLl9jb21wYXJlQnlGbiA9IGdyb3VwLmNvbXBhcmVCeTtcbiAgICAgIHRoaXMuX2Zvb3RlclJvd0ZuID0gZ3JvdXAuZm9vdGVyIHx8ICgoKSA9PiBmYWxzZSk7XG4gICAgICB0aGlzLl9pbml0aWFsRXhwYW5kID0gZ3JvdXAuaW5pdGlhbEV4cGFuZCA/PyB0cnVlO1xuXG4gICAgICAvLyBncm91cCBtb2RlIGVuYWJsZWQgYnkgZGVmYXVsdFxuICAgICAgdGhpcy5fZ3JvdXBFbmFibGVkID0gKGdyb3VwLmVuYWJsZWQgIT09IHZvaWQgMClcbiAgICAgICAgPyBncm91cC5lbmFibGVkXG4gICAgICAgIDogdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0QWRkaXRpb25hbENvbmZpZ3MoY29uZmlnczogeyBzY3JvbGxhYmxlOiBib29sZWFuLCBsb2FkTW9yZUVuYWJsZWQ6IGJvb2xlYW4gfSkge1xuICAgIHRoaXMuX2luZmluaXR5U2Nyb2xsRW5hYmxlZCA9IGNvbmZpZ3Muc2Nyb2xsYWJsZTtcbiAgICB0aGlzLl9sb2FkTW9yZUVuYWJsZWQgPSBjb25maWdzLmxvYWRNb3JlRW5hYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3dzIHdoYXQgd2FzIHJlY2VpdmVkIGZyb20gZmV0Y2ggZnVuY3Rpb25cbiAgICogQHBhcmFtIHJvd3NcbiAgICovXG4gIHB1YmxpYyBzZXRSb3dzRnJvbVJlc3BvbnNlKHJvd3M6IGFueVtdKSB7XG4gICAgaWYgKHRoaXMuX2luZmluaXR5U2Nyb2xsRW5hYmxlZCkge1xuICAgICAgc3dpdGNoICh0aGlzLl9vcGVyYXRpb24pIHtcbiAgICAgICAgY2FzZSBGc0xpc3RTdGF0ZS5GaWx0ZXI6XG4gICAgICAgIGNhc2UgRnNMaXN0U3RhdGUuUmVsb2FkOlxuICAgICAgICBjYXNlIEZzTGlzdFN0YXRlLlNvcnQ6IHtcbiAgICAgICAgICB0aGlzLl91cGRhdGVSb3dzU3RhY2socm93cyk7XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRoaXMuX2V4dGVuZFJvd3NTdGFjayhyb3dzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9yZW1vdGVSb3dzQ2hhbmdlJC5uZXh0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fb3BlcmF0aW9uID09PSBGc0xpc3RTdGF0ZS5Mb2FkTW9yZSB8fFxuICAgICAgICAodGhpcy5fb3BlcmF0aW9uID09PSBGc0xpc3RTdGF0ZS5QYWdlQ2hhbmdlICYmIHRoaXMuX2xvYWRNb3JlRW5hYmxlZClcbiAgICAgICkge1xuICAgICAgICB0aGlzLl9leHRlbmRSb3dzU3RhY2socm93cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl91cGRhdGVSb3dzU3RhY2socm93cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fb3BlcmF0aW9uID0gRnNMaXN0U3RhdGUuSWRsZTtcblxuICAgIHRoaXMuX3VwZGF0ZVZpc2libGVSb3dzKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGN1cnJlbnQgb3BlcmF0aW9uIGZvciBsaXN0IGRhdGEgZmxvd1xuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHB1YmxpYyBzZXRPcGVyYXRpb24odmFsdWU6IEZzTGlzdFN0YXRlKSB7XG4gICAgdGhpcy5fb3BlcmF0aW9uID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHJvd3MgZnJvbSB2aXNpYmxlXG4gICAqL1xuICBwdWJsaWMgY2xlYXJSb3dzKCkge1xuICAgIHRoaXMudmlzaWJsZVJvd3MgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIGRhdGEgZm9yIHNwZWNpZmllZCByb3dcbiAgICogQHBhcmFtIHRhcmdldFJvd1xuICAgKiBAcGFyYW0gdHJhY2tCeVxuICAgKi9cbiAgcHVibGljIHJlcGxhY2VEYXRhKFxuICAgIHRhcmdldFJvdzogRnNMaXN0QWJzdHJhY3RSb3csXG4gICAgdHJhY2tCeT86IEZzTGlzdFRyYWNrQnlUYXJnZXRSb3dGblxuICApIHtcbiAgICBjb25zdCByb3dJbmRleCA9IHRoaXMuX3Jvd3NTdGFjay5maW5kSW5kZXgoKGxpc3RSb3cpID0+IHtcbiAgICAgIHJldHVybiB0cmFja0J5KGxpc3RSb3cuZGF0YSwgdGFyZ2V0Um93KTtcbiAgICB9KTtcblxuICAgIGlmIChyb3dJbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLl9yb3dzU3RhY2tbcm93SW5kZXhdID0gbmV3IFJvdyhcbiAgICAgICAgdGFyZ2V0Um93LFxuICAgICAgICBSb3dUeXBlLlNpbXBsZSxcbiAgICAgICAgeyBpbml0aWFsRXhwYW5kOiB0aGlzLl9pbml0aWFsRXhwYW5kIH1cbiAgICAgICk7XG5cbiAgICAgIHRoaXMuX3VwZGF0ZVZpc2libGVSb3dzKCk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGRhdGEgZm9yIHNwZWNpZmllZCByb3dcbiAgICogQHBhcmFtIHJvd3NcbiAgICogQHBhcmFtIHRyYWNrQnlcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVEYXRhKFxuICAgIHJvd3M6IEZzTGlzdEFic3RyYWN0Um93IHwgRnNMaXN0QWJzdHJhY3RSb3dbXSxcbiAgICB0cmFja0J5PzogRnNMaXN0VHJhY2tCeVRhcmdldFJvd0ZuLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyb3dzKSkge1xuICAgICAgbGV0IHVwZGF0ZVN1Y2Nlc3MgPSBmYWxzZTtcblxuICAgICAgcm93cy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZVJvdyhpdGVtLCB0cmFja0J5KSkge1xuICAgICAgICAgIHVwZGF0ZVN1Y2Nlc3MgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fdXBkYXRlVmlzaWJsZVJvd3MoKTtcblxuICAgICAgcmV0dXJuIHVwZGF0ZVN1Y2Nlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWQgPSB0aGlzLnVwZGF0ZVJvdyhyb3dzLCB0cmFja0J5KTtcblxuICAgICAgdGhpcy5fdXBkYXRlVmlzaWJsZVJvd3MoKTtcblxuICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBkYXRhIGZvciBzcGVjaWZpZWQgcm93XG4gICAqIEBwYXJhbSBkYXRhXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlRGF0YShkYXRhOiBGc0xpc3RBYnN0cmFjdFJvdyB8IEZzTGlzdEFic3RyYWN0Um93W10gfCBGc0xpc3RUcmFja0J5VGFyZ2V0Um93Rm4pOiBib29sZWFuIHtcbiAgICBjb25zdCByZW1vdmVkUm93cyA9IFtdO1xuXG4gICAgY29uc3QgZGVmYXVsdFRyYWNrQnkgPSAocm93LCB0YXJnZXQpID0+IHtcbiAgICAgIHJldHVybiByb3cgPT09IHRhcmdldDtcbiAgICB9O1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIC8vXG4gICAgICBkYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgcmVtb3ZlZFJvd3MucHVzaCguLi50aGlzLnJlbW92ZVJvdyhpdGVtLCBkZWZhdWx0VHJhY2tCeSkpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKGRhdGEpKSB7XG4gICAgICByZW1vdmVkUm93cy5wdXNoKC4uLnRoaXMucmVtb3ZlUm93KG51bGwsIChkYXRhIGFzIEZzTGlzdFRyYWNrQnlUYXJnZXRSb3dGbikpKTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZW1vdmVkUm93cy5wdXNoKC4uLnRoaXMucmVtb3ZlUm93KGRhdGEsIGRlZmF1bHRUcmFja0J5KSk7XG4gICAgfVxuXG4gICAgaWYgKHJlbW92ZWRSb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVZpc2libGVSb3dzKCk7XG5cbiAgICAgIHRoaXMuX3Jvd3NSZW1vdmVkJC5uZXh0KHJlbW92ZWRSb3dzKVxuICAgIH1cblxuICAgIHJldHVybiAhIXJlbW92ZWRSb3dzLmxlbmd0aDtcbiAgfVxuXG4gIHB1YmxpYyBzd2FwUm93cyhyb3cxLCByb3cyKSB7XG4gICAgbGV0IHRtcEVsO1xuICAgIGNvbnN0IHJvd3NTdGFjayA9IHRoaXMuX3Jvd3NTdGFjaztcbiAgICBjb25zdCByb3cxR2xvYmFsSW5kZXggPSByb3dzU3RhY2suaW5kZXhPZihyb3cxKTtcbiAgICBjb25zdCByb3cyR2xvYmFsSW5kZXggPSByb3dzU3RhY2suaW5kZXhPZihyb3cyKTtcblxuICAgIHRtcEVsID0gcm93c1N0YWNrW3JvdzFHbG9iYWxJbmRleF07XG4gICAgcm93c1N0YWNrW3JvdzFHbG9iYWxJbmRleF0gPSByb3dzU3RhY2tbcm93Mkdsb2JhbEluZGV4XTtcbiAgICByb3dzU3RhY2tbcm93Mkdsb2JhbEluZGV4XSA9IHRtcEVsO1xuXG4gICAgdGhpcy5fcm93c1N0YWNrID0gWyAuLi5yb3dzU3RhY2sgXTtcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95KCkge1xuICAgIHRoaXMuX2Rlc3Ryb3lSb3dzU3RhY2soKTtcbiAgICB0aGlzLl9zdG9yZS5jbGVhcigpO1xuXG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlUm93R3JvdXAocm93RGF0YSkge1xuICAgIGNvbnN0IHJvdyA9IHRoaXMudmlzaWJsZVJvd3MuZmluZCgodmlzaWJsZVJvdykgPT4gdmlzaWJsZVJvdy5kYXRhID09PSByb3dEYXRhICk7XG4gICAgcm93LnRvZ2dsZVJvd0V4cGFuZFN0YXR1cygpO1xuXG4gICAgdGhpcy5fdXBkYXRlVmlzaWJsZVJvd3MoKTtcblxuICAgIGNvbnNvbGUubG9nKHRoaXMuX3Jvd3NTdGFjayk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVSb3dzU3RhY2socm93cykge1xuXG4gICAgdGhpcy5fZGVzdHJveVJvd3NTdGFjaygpO1xuXG4gICAgaWYgKHRoaXMuZ3JvdXBFbmFibGVkKSB7XG4gICAgICB0aGlzLl9zdG9yZS5jbGVhcigpO1xuICAgICAgdGhpcy5fcm93c1N0YWNrID0gWy4uLnRoaXMuZ3JvdXBSb3dzQnkocm93cyldO1xuICAgIH0gZWxzZSB7XG4gICAgICByb3dzID0gcm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFJvdyhcbiAgICAgICAgICByb3csXG4gICAgICAgICAgUm93VHlwZS5TaW1wbGUsXG4gICAgICAgICAgeyBpbml0aWFsRXhwYW5kOiB0aGlzLl9pbml0aWFsRXhwYW5kIH0sXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3Jvd3NTdGFjayA9IFsuLi5yb3dzXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9leHRlbmRSb3dzU3RhY2socm93cykge1xuICAgIGlmICh0aGlzLmdyb3VwRW5hYmxlZCkge1xuICAgICAgdGhpcy5fcm93c1N0YWNrID0gWy4uLnRoaXMuZ3JvdXBSb3dzQnkocm93cyldO1xuICAgIH0gZWxzZSB7XG4gICAgICByb3dzID0gcm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFJvdyhcbiAgICAgICAgICByb3csXG4gICAgICAgICAgUm93VHlwZS5TaW1wbGUsXG4gICAgICAgICAgeyBpbml0aWFsRXhwYW5kOiB0aGlzLl9pbml0aWFsRXhwYW5kIH0sXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3Jvd3NTdGFjayA9IFsuLi50aGlzLl9yb3dzU3RhY2ssIC4uLnJvd3NdO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2Rlc3Ryb3lSb3dzU3RhY2soKSB7XG4gICAgdGhpcy5fcm93c1N0YWNrLmZvckVhY2goKHJvdykgPT4gcm93LmRlc3Ryb3koKSk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVWaXNpYmxlUm93cygpIHtcbiAgICB0aGlzLnZpc2libGVSb3dzID0gdGhpcy5fcm93c1N0YWNrXG4gICAgICAuZmlsdGVyKChyb3cpID0+IHtcbiAgICAgICAgcmV0dXJuICghcm93LmlzQ2hpbGQgJiYgIXJvdy5pc0Zvb3RlcikgfHwgcm93LnZpc2libGU7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUm93KFxuICAgIHRhcmdldFJvdzogRnNMaXN0QWJzdHJhY3RSb3csXG4gICAgdHJhY2tCeT86IChsaXN0Um93OiBGc0xpc3RBYnN0cmFjdFJvdywgdGFyZ2V0Um93PzogRnNMaXN0QWJzdHJhY3RSb3cpID0+IGJvb2xlYW4pIHtcblxuICAgIGlmICh0cmFja0J5ID09PSB2b2lkIDApIHtcbiAgICAgIHRyYWNrQnkgPSAocm93LCB0YXJnZXQpID0+IHtcbiAgICAgICAgcmV0dXJuIHJvdyA9PT0gdGFyZ2V0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldEluZGV4ID0gdGhpcy5fcm93c1N0YWNrLmZpbmRJbmRleCgobGlzdFJvdykgPT4gdHJhY2tCeShsaXN0Um93LmRhdGEsIHRhcmdldFJvdykpO1xuXG4gICAgaWYgKHRhcmdldEluZGV4ICE9PSAtMSkge1xuICAgICAgY29uc3QgdXBkYXRlVGFyZ2V0ID0gdGhpcy5fcm93c1N0YWNrW3RhcmdldEluZGV4XTtcbiAgICAgIGNvbnN0IHVwZGF0ZWREYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgdXBkYXRlVGFyZ2V0LmRhdGEsIHRhcmdldFJvdyk7XG5cbiAgICAgIHRoaXMuX3Jvd3NTdGFja1t0YXJnZXRJbmRleF0gPSBuZXcgUm93KFxuICAgICAgICB1cGRhdGVkRGF0YSxcbiAgICAgICAgdXBkYXRlVGFyZ2V0LnR5cGUsXG4gICAgICAgIHtcbiAgICAgICAgICBwYXJlbnQ6IHVwZGF0ZVRhcmdldC5wYXJlbnQsXG4gICAgICAgICAgaW5pdGlhbEV4cGFuZDogdXBkYXRlVGFyZ2V0LmV4cGFuZGVkLFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHJvdyBmcm9tXG4gICAqIEBwYXJhbSB0YXJnZXRSb3dcbiAgICogQHBhcmFtIHRyYWNrQnlcbiAgICovXG4gIHByaXZhdGUgcmVtb3ZlUm93KFxuICAgIHRhcmdldFJvdzogRnNMaXN0QWJzdHJhY3RSb3cgfCBudWxsLFxuICAgIHRyYWNrQnk/OiBGc0xpc3RUcmFja0J5VGFyZ2V0Um93Rm5cbiAgKSB7XG5cbiAgICBjb25zdCByb3dzID0gdGhpcy5fcm93c1N0YWNrO1xuICAgIGNvbnN0IHJlbW92ZWRSb3dzID0gW107XG5cbiAgICByb3dzLmZvckVhY2goKGxpc3RSb3csIGluZGV4KSA9PiB7XG4gICAgICBpZiAodHJhY2tCeShsaXN0Um93LmRhdGEsIHRhcmdldFJvdykpIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZFJvdyA9IHJvd3Muc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICByZW1vdmVkUm93cy5wdXNoKHJlbW92ZWRSb3cpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlbW92ZWRSb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0IGV4aXN0aW5nIHJvd3MgYnkgZ3JvdXBzIGFuZCBzdG9yZSB0aGVtIGZvciBmdXR1cmUgdXNlXG4gICAqL1xuICBwcml2YXRlIGdyb3VwUm93c0J5KHJvd3MpIHtcbiAgICBpZiAoIXRoaXMuX2dyb3VwQnlGbiB8fCAhdGhpcy5fY29tcGFyZUJ5Rm4pIHsgcmV0dXJuIHJvd3MgfVxuXG4gICAgbGV0IG51bWJlck9mR3JvdXBzID0gMDtcbiAgICBjb25zdCBmb290ZXJSb3dzID0gbmV3IE1hcCgpO1xuXG4gICAgcm93cy5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgIGNvbnN0IG1haW5Hcm91cCA9IHRoaXMuX2dyb3VwQnlGbihyb3cpO1xuICAgICAgY29uc3QgaXNGb290ZXJSb3cgPSB0aGlzLl9mb290ZXJSb3dGbihyb3cpXG4gICAgICBjb25zdCBtYWluR3JvdXBLZXkgPSB0aGlzLl9jb21wYXJlQnlGbihtYWluR3JvdXApO1xuXG4gICAgICBpZiAoaXNGb290ZXJSb3cpIHtcbiAgICAgICAgZm9vdGVyUm93cy5zZXQobWFpbkdyb3VwS2V5LCByb3cpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLl9zdG9yZS5oYXMobWFpbkdyb3VwS2V5KSkge1xuICAgICAgICBjb25zdCBncm91cCA9IG5ldyBHcm91cFJvdyhcbiAgICAgICAgICBtYWluR3JvdXAsXG4gICAgICAgICAgdGhpcy5faW5pdGlhbEV4cGFuZCxcbiAgICAgICAgKTtcblxuICAgICAgICBncm91cC5pbmRleCA9IG51bWJlck9mR3JvdXBzO1xuICAgICAgICBudW1iZXJPZkdyb3VwcysrO1xuXG4gICAgICAgIGNvbnN0IGNoaWxkUm93ID0gbmV3IENoaWxkUm93KHJvdywgZ3JvdXApO1xuXG4gICAgICAgIHRoaXMuX3N0b3JlLnNldChtYWluR3JvdXBLZXksIGdyb3VwKTtcbiAgICAgICAgZ3JvdXAuY2hpbGRyZW4ucHVzaChjaGlsZFJvdyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuX3N0b3JlLmdldChtYWluR3JvdXBLZXkpO1xuICAgICAgICBjb25zdCBjaGlsZFJvdyA9IG5ldyBDaGlsZFJvdyhyb3csIGdyb3VwKTtcblxuICAgICAgICBncm91cC5jaGlsZHJlbi5wdXNoKGNoaWxkUm93KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGZvb3RlclJvd3MpIHtcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fc3RvcmUuZ2V0KGtleSkgYXMgR3JvdXBSb3c7XG5cbiAgICAgIGlmIChncm91cCkge1xuICAgICAgICBjb25zdCBmb290ZXJSb3cgPSBuZXcgR3JvdXBGb290ZXJSb3codmFsdWUsIGdyb3VwKTtcbiAgICAgICAgZ3JvdXAuY2hpbGRyZW4ucHVzaChmb290ZXJSb3cpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX3N0b3JlLnZhbHVlcygpKVxuICAgICAgLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmlzR3JvdXApIHtcbiAgICAgICAgICBhY2MucHVzaChpdGVtLCAuLi5pdGVtLmNoaWxkcmVuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhY2MucHVzaChpdGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBbXSk7XG4gIH1cbn1cbiJdfQ==