@firestitch/list 9.9.9 → 9.10.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 (193) hide show
  1. package/app/classes/actions-controller.d.ts +20 -20
  2. package/app/classes/columns-controller.d.ts +65 -65
  3. package/app/classes/data-controller.d.ts +89 -89
  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 +166 -166
  7. package/app/classes/pagination-controller.d.ts +185 -185
  8. package/app/classes/persistance-controller.d.ts +7 -7
  9. package/app/classes/reorder-controller.d.ts +56 -56
  10. package/app/classes/selection-controller.d.ts +141 -141
  11. package/app/classes/sorting-controller.d.ts +64 -63
  12. package/app/components/body/body.component.d.ts +29 -29
  13. package/app/components/body/row/actions/actions.component.d.ts +32 -32
  14. package/app/components/body/row/cell/cell.component.d.ts +20 -20
  15. package/app/components/body/row/inline-action/inline-action.component.d.ts +10 -10
  16. package/app/components/body/row/row.component.d.ts +66 -66
  17. package/app/components/customize-cols/customize-cols.component.d.ts +14 -14
  18. package/app/components/footer/footer-row/footer-cell/footer-cell.component.d.ts +7 -4
  19. package/app/components/footer/footer-row/footer-row.component.d.ts +10 -8
  20. package/app/components/footer/footer.component.d.ts +10 -8
  21. package/app/components/head/head-cell/head-cell.component.d.ts +11 -11
  22. package/app/components/head/head.component.d.ts +40 -40
  23. package/app/components/list/list.component.d.ts +108 -108
  24. package/app/components/loader/loader.component.d.ts +11 -11
  25. package/app/components/manage-saved-filters/manage-saved-filters.component.d.ts +10 -10
  26. package/app/components/pagination/pagination.component.d.ts +11 -11
  27. package/app/components/saved-filters/saved-filters.component.d.ts +12 -12
  28. package/app/components/status/status.component.d.ts +18 -18
  29. package/app/directives/cell/cell.directive.d.ts +5 -5
  30. package/app/directives/column/column.directive.d.ts +24 -23
  31. package/app/directives/draggable-list/draggable-list.directive.d.ts +77 -77
  32. package/app/directives/draggable-row/draggable-row.directive.d.ts +18 -18
  33. package/app/directives/empty-state/empty-state.directive.d.ts +2 -2
  34. package/app/directives/footer/footer.directive.d.ts +5 -5
  35. package/app/directives/group-cell/group-cell.directive.d.ts +3 -3
  36. package/app/directives/group-expand-trigger/group-expand-trigger.directive.d.ts +7 -7
  37. package/app/directives/header/header.directive.d.ts +5 -5
  38. package/app/enums/button-type.enum.d.ts +7 -7
  39. package/app/enums/page-change-type.enum.d.ts +4 -4
  40. package/app/enums/pagination-strategy.enum.d.ts +5 -5
  41. package/app/enums/row-type.enum.d.ts +5 -5
  42. package/app/enums/state.enum.d.ts +9 -9
  43. package/app/fs-list.module.d.ts +6 -6
  44. package/app/fs-list.providers.d.ts +3 -3
  45. package/app/interfaces/cellconfig.interface.d.ts +5 -5
  46. package/app/interfaces/draggable-list.interface.d.ts +7 -7
  47. package/app/interfaces/external-params.interface.d.ts +13 -13
  48. package/app/interfaces/index.d.ts +3 -3
  49. package/app/interfaces/listconfig.interface.d.ts +220 -220
  50. package/app/interfaces/pagination.interface.d.ts +13 -13
  51. package/app/models/column.model.d.ts +48 -46
  52. package/app/models/row/base-row.d.ts +13 -13
  53. package/app/models/row/child-row.d.ts +12 -12
  54. package/app/models/row/group-row.d.ts +14 -14
  55. package/app/models/row/simple-row.d.ts +5 -5
  56. package/app/models/row-action.model.d.ts +29 -29
  57. package/app/models/row.d.ts +28 -28
  58. package/app/models/styleConfig.model.d.ts +31 -31
  59. package/app/services/group-expand-notifier.service.d.ts +8 -8
  60. package/bundles/firestitch-list.umd.js +5832 -5783
  61. package/bundles/firestitch-list.umd.js.map +1 -1
  62. package/bundles/firestitch-list.umd.min.js +1 -1
  63. package/bundles/firestitch-list.umd.min.js.map +1 -1
  64. package/esm2015/app/classes/actions-controller.js +55 -55
  65. package/esm2015/app/classes/columns-controller.js +185 -185
  66. package/esm2015/app/classes/data-controller.js +318 -311
  67. package/esm2015/app/classes/external-params-controller.js +155 -155
  68. package/esm2015/app/classes/index.js +3 -3
  69. package/esm2015/app/classes/list-controller.js +730 -730
  70. package/esm2015/app/classes/pagination-controller.js +461 -461
  71. package/esm2015/app/classes/persistance-controller.js +22 -22
  72. package/esm2015/app/classes/reorder-controller.js +161 -161
  73. package/esm2015/app/classes/selection-controller.js +444 -444
  74. package/esm2015/app/classes/sorting-controller.js +177 -167
  75. package/esm2015/app/components/body/body.component.js +103 -103
  76. package/esm2015/app/components/body/row/actions/actions.component.js +110 -110
  77. package/esm2015/app/components/body/row/cell/cell.component.js +93 -93
  78. package/esm2015/app/components/body/row/inline-action/inline-action.component.js +34 -34
  79. package/esm2015/app/components/body/row/row.component.js +267 -267
  80. package/esm2015/app/components/customize-cols/customize-cols.component.js +67 -67
  81. package/esm2015/app/components/footer/footer-row/footer-cell/footer-cell.component.js +27 -18
  82. package/esm2015/app/components/footer/footer-row/footer-row.component.js +39 -35
  83. package/esm2015/app/components/footer/footer.component.js +34 -30
  84. package/esm2015/app/components/head/head-cell/head-cell.component.js +35 -35
  85. package/esm2015/app/components/head/head.component.js +99 -99
  86. package/esm2015/app/components/list/list.component.js +357 -357
  87. package/esm2015/app/components/loader/loader.component.js +46 -46
  88. package/esm2015/app/components/manage-saved-filters/manage-saved-filters.component.js +75 -75
  89. package/esm2015/app/components/pagination/pagination.component.js +44 -44
  90. package/esm2015/app/components/saved-filters/saved-filters.component.js +36 -36
  91. package/esm2015/app/components/status/status.component.js +77 -77
  92. package/esm2015/app/directives/cell/cell.directive.js +21 -21
  93. package/esm2015/app/directives/column/column.directive.js +97 -93
  94. package/esm2015/app/directives/draggable-list/draggable-list.directive.js +264 -264
  95. package/esm2015/app/directives/draggable-row/draggable-row.directive.js +81 -81
  96. package/esm2015/app/directives/empty-state/empty-state.directive.js +11 -11
  97. package/esm2015/app/directives/footer/footer.directive.js +21 -21
  98. package/esm2015/app/directives/group-cell/group-cell.directive.js +12 -12
  99. package/esm2015/app/directives/group-expand-trigger/group-expand-trigger.directive.js +32 -32
  100. package/esm2015/app/directives/header/header.directive.js +21 -21
  101. package/esm2015/app/enums/button-type.enum.js +9 -9
  102. package/esm2015/app/enums/page-change-type.enum.js +6 -6
  103. package/esm2015/app/enums/pagination-strategy.enum.js +7 -7
  104. package/esm2015/app/enums/row-type.enum.js +7 -7
  105. package/esm2015/app/enums/state.enum.js +11 -11
  106. package/esm2015/app/fs-list.module.js +140 -140
  107. package/esm2015/app/fs-list.providers.js +4 -4
  108. package/esm2015/app/interfaces/cellconfig.interface.js +1 -1
  109. package/esm2015/app/interfaces/draggable-list.interface.js +1 -1
  110. package/esm2015/app/interfaces/external-params.interface.js +1 -1
  111. package/esm2015/app/interfaces/index.js +1 -1
  112. package/esm2015/app/interfaces/listconfig.interface.js +1 -1
  113. package/esm2015/app/interfaces/pagination.interface.js +1 -1
  114. package/esm2015/app/models/column.model.js +185 -175
  115. package/esm2015/app/models/row/base-row.js +23 -23
  116. package/esm2015/app/models/row/child-row.js +28 -28
  117. package/esm2015/app/models/row/group-row.js +41 -41
  118. package/esm2015/app/models/row/simple-row.js +10 -10
  119. package/esm2015/app/models/row-action.model.js +115 -115
  120. package/esm2015/app/models/row.js +77 -77
  121. package/esm2015/app/models/styleConfig.model.js +86 -86
  122. package/esm2015/app/services/group-expand-notifier.service.js +25 -25
  123. package/esm2015/firestitch-list.js +17 -17
  124. package/esm2015/public_api.js +40 -40
  125. package/esm5/app/classes/actions-controller.js +71 -71
  126. package/esm5/app/classes/columns-controller.js +236 -236
  127. package/esm5/app/classes/data-controller.js +374 -365
  128. package/esm5/app/classes/external-params-controller.js +185 -185
  129. package/esm5/app/classes/index.js +3 -3
  130. package/esm5/app/classes/list-controller.js +749 -749
  131. package/esm5/app/classes/pagination-controller.js +568 -568
  132. package/esm5/app/classes/persistance-controller.js +25 -25
  133. package/esm5/app/classes/reorder-controller.js +195 -195
  134. package/esm5/app/classes/selection-controller.js +465 -465
  135. package/esm5/app/classes/sorting-controller.js +204 -194
  136. package/esm5/app/components/body/body.component.js +104 -104
  137. package/esm5/app/components/body/row/actions/actions.component.js +113 -113
  138. package/esm5/app/components/body/row/cell/cell.component.js +95 -95
  139. package/esm5/app/components/body/row/inline-action/inline-action.component.js +35 -35
  140. package/esm5/app/components/body/row/row.component.js +295 -295
  141. package/esm5/app/components/customize-cols/customize-cols.component.js +69 -69
  142. package/esm5/app/components/footer/footer-row/footer-cell/footer-cell.component.js +29 -20
  143. package/esm5/app/components/footer/footer-row/footer-row.component.js +42 -38
  144. package/esm5/app/components/footer/footer.component.js +35 -31
  145. package/esm5/app/components/head/head-cell/head-cell.component.js +38 -38
  146. package/esm5/app/components/head/head.component.js +106 -106
  147. package/esm5/app/components/list/list.component.js +391 -391
  148. package/esm5/app/components/loader/loader.component.js +47 -47
  149. package/esm5/app/components/manage-saved-filters/manage-saved-filters.component.js +81 -81
  150. package/esm5/app/components/pagination/pagination.component.js +46 -46
  151. package/esm5/app/components/saved-filters/saved-filters.component.js +41 -41
  152. package/esm5/app/components/status/status.component.js +79 -79
  153. package/esm5/app/directives/cell/cell.directive.js +24 -24
  154. package/esm5/app/directives/column/column.directive.js +98 -94
  155. package/esm5/app/directives/draggable-list/draggable-list.directive.js +281 -281
  156. package/esm5/app/directives/draggable-row/draggable-row.directive.js +83 -83
  157. package/esm5/app/directives/empty-state/empty-state.directive.js +14 -14
  158. package/esm5/app/directives/footer/footer.directive.js +24 -24
  159. package/esm5/app/directives/group-cell/group-cell.directive.js +17 -17
  160. package/esm5/app/directives/group-expand-trigger/group-expand-trigger.directive.js +33 -33
  161. package/esm5/app/directives/header/header.directive.js +24 -24
  162. package/esm5/app/enums/button-type.enum.js +9 -9
  163. package/esm5/app/enums/page-change-type.enum.js +6 -6
  164. package/esm5/app/enums/pagination-strategy.enum.js +7 -7
  165. package/esm5/app/enums/row-type.enum.js +7 -7
  166. package/esm5/app/enums/state.enum.js +11 -11
  167. package/esm5/app/fs-list.module.js +145 -145
  168. package/esm5/app/fs-list.providers.js +4 -4
  169. package/esm5/app/interfaces/cellconfig.interface.js +1 -1
  170. package/esm5/app/interfaces/draggable-list.interface.js +1 -1
  171. package/esm5/app/interfaces/external-params.interface.js +1 -1
  172. package/esm5/app/interfaces/index.js +1 -1
  173. package/esm5/app/interfaces/listconfig.interface.js +1 -1
  174. package/esm5/app/interfaces/pagination.interface.js +1 -1
  175. package/esm5/app/models/column.model.js +204 -194
  176. package/esm5/app/models/row/base-row.js +35 -35
  177. package/esm5/app/models/row/child-row.js +43 -43
  178. package/esm5/app/models/row/group-row.js +61 -61
  179. package/esm5/app/models/row/simple-row.js +15 -15
  180. package/esm5/app/models/row-action.model.js +126 -126
  181. package/esm5/app/models/row.js +126 -126
  182. package/esm5/app/models/styleConfig.model.js +91 -91
  183. package/esm5/app/services/group-expand-notifier.service.js +30 -30
  184. package/esm5/firestitch-list.js +17 -17
  185. package/esm5/public_api.js +40 -40
  186. package/fesm2015/firestitch-list.js +5188 -5141
  187. package/fesm2015/firestitch-list.js.map +1 -1
  188. package/fesm5/firestitch-list.js +5817 -5768
  189. package/fesm5/firestitch-list.js.map +1 -1
  190. package/firestitch-list.d.ts +18 -18
  191. package/firestitch-list.metadata.json +1 -1
  192. package/package.json +1 -1
  193. package/public_api.d.ts +33 -33
@@ -1,236 +1,236 @@
1
- import { isNumber } from 'lodash-es';
2
- import { Subject } from 'rxjs';
3
- import { takeUntil, tap } from 'rxjs/operators';
4
- import { Column } from '../models/column.model';
5
- var ColumnsController = /** @class */ (function () {
6
- function ColumnsController() {
7
- this.visibleColumns = [];
8
- this._theadClass = '';
9
- this._isConfigured = false;
10
- this._loadFnConfigured = false;
11
- this._changeFnConfigured = false;
12
- this._columnsFetched = false;
13
- this._hasHeader = false;
14
- this._hasFooter = false;
15
- this._columns = [];
16
- this._destroy$ = new Subject();
17
- }
18
- Object.defineProperty(ColumnsController.prototype, "columns", {
19
- get: function () {
20
- return this._columns.slice();
21
- },
22
- enumerable: true,
23
- configurable: true
24
- });
25
- Object.defineProperty(ColumnsController.prototype, "columnsForDialog", {
26
- get: function () {
27
- var _this = this;
28
- var hasCustomTitle = !!this._customizeFieldTitleFn;
29
- var hasCustomDisabledStatus = !!this._customizeFieldDisabledFn;
30
- var hasCustomTooltip = !!this._columnTooltipFn;
31
- return this._columns
32
- .filter(function (column) { return column.customize && !!column.name; })
33
- .map(function (column) {
34
- var title = hasCustomTitle
35
- ? _this._customizeFieldTitleFn(column.name, column.title)
36
- : column.name;
37
- var disabled = hasCustomDisabledStatus
38
- ? _this._customizeFieldDisabledFn(column.name)
39
- : false;
40
- var tooltip = hasCustomTooltip
41
- ? _this._columnTooltipFn(column.name, column.show, disabled)
42
- : void 0;
43
- return {
44
- template: column.headerTemplate,
45
- name: column.name,
46
- show: column.show,
47
- title: title,
48
- disabled: disabled,
49
- tooltip: tooltip,
50
- };
51
- });
52
- },
53
- enumerable: true,
54
- configurable: true
55
- });
56
- Object.defineProperty(ColumnsController.prototype, "columnsFetched", {
57
- get: function () {
58
- return this._columnsFetched;
59
- },
60
- enumerable: true,
61
- configurable: true
62
- });
63
- Object.defineProperty(ColumnsController.prototype, "hasHeader", {
64
- get: function () {
65
- return this._hasHeader;
66
- },
67
- enumerable: true,
68
- configurable: true
69
- });
70
- Object.defineProperty(ColumnsController.prototype, "hasFooter", {
71
- get: function () {
72
- return this._hasFooter;
73
- },
74
- enumerable: true,
75
- configurable: true
76
- });
77
- Object.defineProperty(ColumnsController.prototype, "theadClass", {
78
- get: function () {
79
- return this._theadClass;
80
- },
81
- enumerable: true,
82
- configurable: true
83
- });
84
- Object.defineProperty(ColumnsController.prototype, "configured", {
85
- get: function () {
86
- return this._isConfigured;
87
- },
88
- enumerable: true,
89
- configurable: true
90
- });
91
- Object.defineProperty(ColumnsController.prototype, "loadFnConfigured", {
92
- get: function () {
93
- return this._loadFnConfigured;
94
- },
95
- enumerable: true,
96
- configurable: true
97
- });
98
- Object.defineProperty(ColumnsController.prototype, "changeFnConfigured", {
99
- get: function () {
100
- return this._changeFnConfigured;
101
- },
102
- enumerable: true,
103
- configurable: true
104
- });
105
- Object.defineProperty(ColumnsController.prototype, "changeFn", {
106
- get: function () {
107
- return this._changeFn;
108
- },
109
- enumerable: true,
110
- configurable: true
111
- });
112
- Object.defineProperty(ColumnsController.prototype, "visibleColumnsNames", {
113
- get: function () {
114
- return this.visibleColumns
115
- .map(function (column) { return column.name; })
116
- .filter(function (name) { return !!name; });
117
- },
118
- enumerable: true,
119
- configurable: true
120
- });
121
- ColumnsController.prototype.setDefaults = function (defaults) {
122
- this._defaultConfigs = defaults;
123
- };
124
- /**
125
- * Set data from list config
126
- * @param config
127
- */
128
- ColumnsController.prototype.initConfig = function (config) {
129
- if (config) {
130
- if (config.load) {
131
- this._loadFn = config.load;
132
- this._loadFnConfigured = true;
133
- }
134
- if (config.change) {
135
- this._changeFn = config.change;
136
- this._changeFnConfigured = true;
137
- }
138
- if (config.title) {
139
- this._customizeFieldTitleFn = config.title;
140
- }
141
- if (config.disabled) {
142
- this._customizeFieldDisabledFn = config.disabled;
143
- }
144
- if (config.tooltip) {
145
- this._columnTooltipFn = config.tooltip;
146
- }
147
- this._isConfigured = true;
148
- }
149
- };
150
- /**
151
- * Base initialization for columns
152
- * @param templates
153
- */
154
- ColumnsController.prototype.initializeColumns = function (templates) {
155
- var _this = this;
156
- this._columns = [];
157
- templates.forEach(function (column) {
158
- var col = new Column(column, _this._defaultConfigs);
159
- if (col.headerTemplate || col.title) {
160
- _this._hasHeader = true;
161
- }
162
- if (col.footerTemplate) {
163
- _this._hasFooter = true;
164
- }
165
- _this._columns.push(col);
166
- });
167
- this._theadClass = this.hasHeader ? 'has-header' : '';
168
- this._updateColspans('headerConfigs', 'headerColspanned');
169
- this._updateColspans('groupCellConfigs', 'groupCellColspanned');
170
- this._updateColspans('cellConfigs', 'cellColspanned');
171
- this._updateColspans('footerConfigs', 'footerColspanned');
172
- this.updateVisibleColumns();
173
- };
174
- /**
175
- * Load visiblity config for columns from remote
176
- */
177
- ColumnsController.prototype.loadRemoteColumnConfigs = function () {
178
- var _this = this;
179
- return this._loadFn()
180
- .pipe(takeUntil(this._destroy$), tap(function (columnConfigs) {
181
- _this._columnsFetched = true;
182
- _this.updateVisibilityForCols(columnConfigs);
183
- }));
184
- };
185
- /**
186
- * Set visible columns based on current columns show status
187
- */
188
- ColumnsController.prototype.updateVisibleColumns = function () {
189
- this.visibleColumns =
190
- this._columns.filter(function (column) { return column.show; }) || [];
191
- };
192
- /**
193
- * Update visibility based on passed config
194
- * @param columnsConfig
195
- */
196
- ColumnsController.prototype.updateVisibilityForCols = function (columnsConfig) {
197
- var _this = this;
198
- columnsConfig.forEach(function (columnConfig) {
199
- var col = _this._columns
200
- .find(function (column) { return column.name === columnConfig.name; });
201
- if (col) {
202
- col.show = columnConfig.show;
203
- }
204
- });
205
- this.updateVisibleColumns();
206
- };
207
- ColumnsController.prototype.destroy = function () {
208
- this._destroy$.next();
209
- this._destroy$.complete();
210
- this._columns = void 0;
211
- this.visibleColumns = void 0;
212
- this._defaultConfigs = void 0;
213
- this._loadFn = void 0;
214
- this._changeFn = void 0;
215
- };
216
- ColumnsController.prototype._updateColspans = function (config, updateFlag) {
217
- var _this = this;
218
- this._columns.forEach(function (col, index) {
219
- if (col[config].colspan !== void 0) {
220
- var spanTo = index + +col[config].colspan;
221
- if (!isNumber(spanTo)) {
222
- return;
223
- }
224
- _this._columns[index][updateFlag] = false;
225
- for (var i = index + 1; i < spanTo; i++) {
226
- if (_this._columns[i]) {
227
- _this._columns[i][updateFlag] = true;
228
- }
229
- }
230
- }
231
- });
232
- };
233
- return ColumnsController;
234
- }());
235
- export { ColumnsController };
236
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1ucy1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGZpcmVzdGl0Y2gvbGlzdC8iLCJzb3VyY2VzIjpbImFwcC9jbGFzc2VzL2NvbHVtbnMtY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFXaEQ7SUFzQkU7UUFwQk8sbUJBQWMsR0FBYSxFQUFFLENBQUM7UUFFN0IsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFPakIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFDdEIsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQzFCLHdCQUFtQixHQUFHLEtBQUssQ0FBQztRQUM1QixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsYUFBUSxHQUFhLEVBQUUsQ0FBQztRQUd4QixjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUV6QixDQUFDO0lBRWhCLHNCQUFXLHNDQUFPO2FBQWxCO1lBQ0UsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQy9CLENBQUM7OztPQUFBO0lBRUQsc0JBQVcsK0NBQWdCO2FBQTNCO1lBQUEsaUJBNkJDO1lBNUJDLElBQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUM7WUFDckQsSUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDO1lBQ2pFLElBQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLElBQUks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SyxJQUFJLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ3ZDLElBQUksS0FBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRTt3QkFDcEIsS0FBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUM7cUJBQ3JDO2lCQUNGO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFSCx3QkFBQztBQUFELENBQUMsQUEzT0QsSUEyT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc051bWJlciB9IGZyb20gJ2xvZGFzaC1lcyc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBDb2x1bW4gfSBmcm9tICcuLi9tb2RlbHMvY29sdW1uLm1vZGVsJztcclxuaW1wb3J0IHtcclxuICBGc0xpc3RDb2x1bW5DaGFuZ2VGbixcclxuICBGc0xpc3RDb2x1bW5Db25maWcsXHJcbiAgRnNMaXN0Q29sdW1uRGlzYWJsZWRGbixcclxuICBGc0xpc3RDb2x1bW5Mb2FkRm4sXHJcbiAgRnNMaXN0Q29sdW1uVGl0bGVGbixcclxuICBGc0xpc3RDb2x1bW5Ub29sdGlwRm4sXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9saXN0Y29uZmlnLmludGVyZmFjZSc7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIENvbHVtbnNDb250cm9sbGVyIHtcclxuXHJcbiAgcHVibGljIHZpc2libGVDb2x1bW5zOiBDb2x1bW5bXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIF90aGVhZENsYXNzID0gJyc7XHJcbiAgcHJpdmF0ZSBfbG9hZEZuOiBGc0xpc3RDb2x1bW5Mb2FkRm47XHJcbiAgcHJpdmF0ZSBfY2hhbmdlRm46IEZzTGlzdENvbHVtbkNoYW5nZUZuO1xyXG4gIHByaXZhdGUgX2N1c3RvbWl6ZUZpZWxkVGl0bGVGbjogRnNMaXN0Q29sdW1uVGl0bGVGbjtcclxuICBwcml2YXRlIF9jdXN0b21pemVGaWVsZERpc2FibGVkRm46IEZzTGlzdENvbHVtbkRpc2FibGVkRm47XHJcbiAgcHJpdmF0ZSBfY29sdW1uVG9vbHRpcEZuOiBGc0xpc3RDb2x1bW5Ub29sdGlwRm47XHJcblxyXG4gIHByaXZhdGUgX2lzQ29uZmlndXJlZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2xvYWRGbkNvbmZpZ3VyZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIF9jaGFuZ2VGbkNvbmZpZ3VyZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIF9jb2x1bW5zRmV0Y2hlZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2hhc0hlYWRlciA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2hhc0Zvb3RlciA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2NvbHVtbnM6IENvbHVtbltdID0gW107XHJcbiAgcHJpdmF0ZSBfZGVmYXVsdENvbmZpZ3M7XHJcblxyXG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7fVxyXG5cclxuICBwdWJsaWMgZ2V0IGNvbHVtbnMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucy5zbGljZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjb2x1bW5zRm9yRGlhbG9nKCkge1xyXG4gICAgY29uc3QgaGFzQ3VzdG9tVGl0bGUgPSAhIXRoaXMuX2N1c3RvbWl6ZUZpZWxkVGl0bGVGbjtcclxuICAgIGNvbnN0IGhhc0N1c3RvbURpc2FibGVkU3RhdHVzID0gISF0aGlzLl9jdXN0b21pemVGaWVsZERpc2FibGVkRm47XHJcbiAgICBjb25zdCBoYXNDdXN0b21Ub29sdGlwID0gISF0aGlzLl9jb2x1bW5Ub29sdGlwRm47XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnNcclxuICAgICAgLmZpbHRlcigoY29sdW1uKSA9PiBjb2x1bW4uY3VzdG9taXplICYmICEhY29sdW1uLm5hbWUpXHJcbiAgICAgIC5tYXAoKGNvbHVtbikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHRpdGxlID0gaGFzQ3VzdG9tVGl0bGVcclxuICAgICAgICAgID8gdGhpcy5fY3VzdG9taXplRmllbGRUaXRsZUZuKGNvbHVtbi5uYW1lLCBjb2x1bW4udGl0bGUpXHJcbiAgICAgICAgICA6IGNvbHVtbi5uYW1lO1xyXG5cclxuICAgICAgICBjb25zdCBkaXNhYmxlZCA9IGhhc0N1c3RvbURpc2FibGVkU3RhdHVzXHJcbiAgICAgICAgICA/IHRoaXMuX2N1c3RvbWl6ZUZpZWxkRGlzYWJsZWRGbihjb2x1bW4ubmFtZSlcclxuICAgICAgICAgIDogZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHRvb2x0aXAgPSBoYXNDdXN0b21Ub29sdGlwXHJcbiAgICAgICAgICA/IHRoaXMuX2NvbHVtblRvb2x0aXBGbihjb2x1bW4ubmFtZSwgY29sdW1uLnNob3csIGRpc2FibGVkKVxyXG4gICAgICAgICAgOiB2b2lkIDA7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICB0ZW1wbGF0ZTogY29sdW1uLmhlYWRlclRlbXBsYXRlLFxyXG4gICAgICAgICAgbmFtZTogY29sdW1uLm5hbWUsXHJcbiAgICAgICAgICBzaG93OiBjb2x1bW4uc2hvdyxcclxuICAgICAgICAgIHRpdGxlOiB0aXRsZSxcclxuICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcclxuICAgICAgICAgIHRvb2x0aXA6IHRvb2x0aXAsXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY29sdW1uc0ZldGNoZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29sdW1uc0ZldGNoZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGhhc0hlYWRlcigpIHtcclxuICAgIHJldHVybiB0aGlzLl9oYXNIZWFkZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGhhc0Zvb3RlcigpIHtcclxuICAgIHJldHVybiB0aGlzLl9oYXNGb290ZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHRoZWFkQ2xhc3MoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGhlYWRDbGFzcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY29uZmlndXJlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9pc0NvbmZpZ3VyZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGxvYWRGbkNvbmZpZ3VyZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fbG9hZEZuQ29uZmlndXJlZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY2hhbmdlRm5Db25maWd1cmVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZUZuQ29uZmlndXJlZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY2hhbmdlRm4oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2hhbmdlRm47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHZpc2libGVDb2x1bW5zTmFtZXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlQ29sdW1uc1xyXG4gICAgICAubWFwKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lKVxyXG4gICAgICAuZmlsdGVyKChuYW1lKSA9PiAhIW5hbWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldERlZmF1bHRzKGRlZmF1bHRzKSB7XHJcbiAgICB0aGlzLl9kZWZhdWx0Q29uZmlncyA9IGRlZmF1bHRzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IGRhdGEgZnJvbSBsaXN0IGNvbmZpZ1xyXG4gICAqIEBwYXJhbSBjb25maWdcclxuICAgKi9cclxuICBwdWJsaWMgaW5pdENvbmZpZyhjb25maWc6IEZzTGlzdENvbHVtbkNvbmZpZykge1xyXG4gICAgaWYgKGNvbmZpZykge1xyXG4gICAgICBpZiAoY29uZmlnLmxvYWQpIHtcclxuICAgICAgICB0aGlzLl9sb2FkRm4gPSBjb25maWcubG9hZDtcclxuICAgICAgICB0aGlzLl9sb2FkRm5Db25maWd1cmVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNvbmZpZy5jaGFuZ2UpIHtcclxuICAgICAgICB0aGlzLl9jaGFuZ2VGbiA9IGNvbmZpZy5jaGFuZ2U7XHJcbiAgICAgICAgdGhpcy5fY2hhbmdlRm5Db25maWd1cmVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNvbmZpZy50aXRsZSkge1xyXG4gICAgICAgIHRoaXMuX2N1c3RvbWl6ZUZpZWxkVGl0bGVGbiA9IGNvbmZpZy50aXRsZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNvbmZpZy5kaXNhYmxlZCkge1xyXG4gICAgICAgIHRoaXMuX2N1c3RvbWl6ZUZpZWxkRGlzYWJsZWRGbiA9IGNvbmZpZy5kaXNhYmxlZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNvbmZpZy50b29sdGlwKSB7XHJcbiAgICAgICAgdGhpcy5fY29sdW1uVG9vbHRpcEZuID0gY29uZmlnLnRvb2x0aXA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX2lzQ29uZmlndXJlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCYXNlIGluaXRpYWxpemF0aW9uIGZvciBjb2x1bW5zXHJcbiAgICogQHBhcmFtIHRlbXBsYXRlc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBpbml0aWFsaXplQ29sdW1ucyh0ZW1wbGF0ZXMpIHtcclxuICAgIHRoaXMuX2NvbHVtbnMgPSBbXTtcclxuXHJcbiAgICB0ZW1wbGF0ZXMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbCA9IG5ldyBDb2x1bW4oY29sdW1uLCB0aGlzLl9kZWZhdWx0Q29uZmlncyk7XHJcblxyXG5cclxuICAgICAgaWYgKGNvbC5oZWFkZXJUZW1wbGF0ZSB8fCBjb2wudGl0bGUpIHtcclxuICAgICAgICB0aGlzLl9oYXNIZWFkZXIgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb2wuZm9vdGVyVGVtcGxhdGUpIHtcclxuICAgICAgICB0aGlzLl9oYXNGb290ZXIgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9jb2x1bW5zLnB1c2goY29sKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuX3RoZWFkQ2xhc3MgPSB0aGlzLmhhc0hlYWRlciA/ICdoYXMtaGVhZGVyJyA6ICcnO1xyXG5cclxuICAgIHRoaXMuX3VwZGF0ZUNvbHNwYW5zKCdoZWFkZXJDb25maWdzJywgJ2hlYWRlckNvbHNwYW5uZWQnKTtcclxuICAgIHRoaXMuX3VwZGF0ZUNvbHNwYW5zKCdncm91cENlbGxDb25maWdzJywgJ2dyb3VwQ2VsbENvbHNwYW5uZWQnKTtcclxuICAgIHRoaXMuX3VwZGF0ZUNvbHNwYW5zKCdjZWxsQ29uZmlncycsICdjZWxsQ29sc3Bhbm5lZCcpO1xyXG4gICAgdGhpcy5fdXBkYXRlQ29sc3BhbnMoJ2Zvb3RlckNvbmZpZ3MnLCAnZm9vdGVyQ29sc3Bhbm5lZCcpO1xyXG5cclxuICAgIHRoaXMudXBkYXRlVmlzaWJsZUNvbHVtbnMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWQgdmlzaWJsaXR5IGNvbmZpZyBmb3IgY29sdW1ucyBmcm9tIHJlbW90ZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBsb2FkUmVtb3RlQ29sdW1uQ29uZmlncygpIHtcclxuICAgIHJldHVybiB0aGlzLl9sb2FkRm4oKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxyXG4gICAgICAgIHRhcCgoY29sdW1uQ29uZmlncykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fY29sdW1uc0ZldGNoZWQgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5Rm9yQ29scyhjb2x1bW5Db25maWdzKTtcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdmlzaWJsZSBjb2x1bW5zIGJhc2VkIG9uIGN1cnJlbnQgY29sdW1ucyBzaG93IHN0YXR1c1xyXG4gICAqL1xyXG4gIHB1YmxpYyB1cGRhdGVWaXNpYmxlQ29sdW1ucygpIHtcclxuICAgIHRoaXMudmlzaWJsZUNvbHVtbnMgPVxyXG4gICAgICB0aGlzLl9jb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiBjb2x1bW4uc2hvdykgfHwgW107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgdmlzaWJpbGl0eSBiYXNlZCBvbiBwYXNzZWQgY29uZmlnXHJcbiAgICogQHBhcmFtIGNvbHVtbnNDb25maWdcclxuICAgKi9cclxuICBwdWJsaWMgdXBkYXRlVmlzaWJpbGl0eUZvckNvbHMoY29sdW1uc0NvbmZpZykge1xyXG4gICAgY29sdW1uc0NvbmZpZy5mb3JFYWNoKChjb2x1bW5Db25maWcpID0+IHtcclxuICAgICAgY29uc3QgY29sID0gdGhpcy5fY29sdW1uc1xyXG4gICAgICAgIC5maW5kKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lID09PSBjb2x1bW5Db25maWcubmFtZSk7XHJcblxyXG4gICAgICBpZiAoY29sKSB7XHJcbiAgICAgICAgY29sLnNob3cgPSBjb2x1bW5Db25maWcuc2hvdztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVWaXNpYmxlQ29sdW1ucygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG5cclxuICAgIHRoaXMuX2NvbHVtbnMgPSB2b2lkIDA7XHJcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gdm9pZCAwO1xyXG4gICAgdGhpcy5fZGVmYXVsdENvbmZpZ3MgPSB2b2lkIDA7XHJcblxyXG4gICAgdGhpcy5fbG9hZEZuID0gdm9pZCAwO1xyXG4gICAgdGhpcy5fY2hhbmdlRm4gPSB2b2lkIDA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF91cGRhdGVDb2xzcGFucyhjb25maWcsIHVwZGF0ZUZsYWcpIHtcclxuICAgIHRoaXMuX2NvbHVtbnMuZm9yRWFjaCgoY29sLCBpbmRleCkgPT4ge1xyXG5cclxuICAgICAgaWYgKGNvbFtjb25maWddLmNvbHNwYW4gIT09IHZvaWQgMCkge1xyXG4gICAgICAgIGNvbnN0IHNwYW5UbyA9IGluZGV4ICsgK2NvbFtjb25maWddLmNvbHNwYW47XHJcblxyXG4gICAgICAgIGlmICghaXNOdW1iZXIoc3BhblRvKSkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jb2x1bW5zW2luZGV4XVt1cGRhdGVGbGFnXSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gaW5kZXggKyAxOyBpIDwgc3BhblRvOyBpKyspIHtcclxuICAgICAgICAgIGlmICh0aGlzLl9jb2x1bW5zW2ldKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbHVtbnNbaV1bdXBkYXRlRmxhZ10gPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG59XHJcbiJdfQ==
1
+ import { isNumber } from 'lodash-es';
2
+ import { Subject } from 'rxjs';
3
+ import { takeUntil, tap } from 'rxjs/operators';
4
+ import { Column } from '../models/column.model';
5
+ var ColumnsController = /** @class */ (function () {
6
+ function ColumnsController() {
7
+ this.visibleColumns = [];
8
+ this._theadClass = '';
9
+ this._isConfigured = false;
10
+ this._loadFnConfigured = false;
11
+ this._changeFnConfigured = false;
12
+ this._columnsFetched = false;
13
+ this._hasHeader = false;
14
+ this._hasFooter = false;
15
+ this._columns = [];
16
+ this._destroy$ = new Subject();
17
+ }
18
+ Object.defineProperty(ColumnsController.prototype, "columns", {
19
+ get: function () {
20
+ return this._columns.slice();
21
+ },
22
+ enumerable: true,
23
+ configurable: true
24
+ });
25
+ Object.defineProperty(ColumnsController.prototype, "columnsForDialog", {
26
+ get: function () {
27
+ var _this = this;
28
+ var hasCustomTitle = !!this._customizeFieldTitleFn;
29
+ var hasCustomDisabledStatus = !!this._customizeFieldDisabledFn;
30
+ var hasCustomTooltip = !!this._columnTooltipFn;
31
+ return this._columns
32
+ .filter(function (column) { return column.customize && !!column.name; })
33
+ .map(function (column) {
34
+ var title = hasCustomTitle
35
+ ? _this._customizeFieldTitleFn(column.name, column.title)
36
+ : column.name;
37
+ var disabled = hasCustomDisabledStatus
38
+ ? _this._customizeFieldDisabledFn(column.name)
39
+ : false;
40
+ var tooltip = hasCustomTooltip
41
+ ? _this._columnTooltipFn(column.name, column.show, disabled)
42
+ : void 0;
43
+ return {
44
+ template: column.headerTemplate,
45
+ name: column.name,
46
+ show: column.show,
47
+ title: title,
48
+ disabled: disabled,
49
+ tooltip: tooltip,
50
+ };
51
+ });
52
+ },
53
+ enumerable: true,
54
+ configurable: true
55
+ });
56
+ Object.defineProperty(ColumnsController.prototype, "columnsFetched", {
57
+ get: function () {
58
+ return this._columnsFetched;
59
+ },
60
+ enumerable: true,
61
+ configurable: true
62
+ });
63
+ Object.defineProperty(ColumnsController.prototype, "hasHeader", {
64
+ get: function () {
65
+ return this._hasHeader;
66
+ },
67
+ enumerable: true,
68
+ configurable: true
69
+ });
70
+ Object.defineProperty(ColumnsController.prototype, "hasFooter", {
71
+ get: function () {
72
+ return this._hasFooter;
73
+ },
74
+ enumerable: true,
75
+ configurable: true
76
+ });
77
+ Object.defineProperty(ColumnsController.prototype, "theadClass", {
78
+ get: function () {
79
+ return this._theadClass;
80
+ },
81
+ enumerable: true,
82
+ configurable: true
83
+ });
84
+ Object.defineProperty(ColumnsController.prototype, "configured", {
85
+ get: function () {
86
+ return this._isConfigured;
87
+ },
88
+ enumerable: true,
89
+ configurable: true
90
+ });
91
+ Object.defineProperty(ColumnsController.prototype, "loadFnConfigured", {
92
+ get: function () {
93
+ return this._loadFnConfigured;
94
+ },
95
+ enumerable: true,
96
+ configurable: true
97
+ });
98
+ Object.defineProperty(ColumnsController.prototype, "changeFnConfigured", {
99
+ get: function () {
100
+ return this._changeFnConfigured;
101
+ },
102
+ enumerable: true,
103
+ configurable: true
104
+ });
105
+ Object.defineProperty(ColumnsController.prototype, "changeFn", {
106
+ get: function () {
107
+ return this._changeFn;
108
+ },
109
+ enumerable: true,
110
+ configurable: true
111
+ });
112
+ Object.defineProperty(ColumnsController.prototype, "visibleColumnsNames", {
113
+ get: function () {
114
+ return this.visibleColumns
115
+ .map(function (column) { return column.name; })
116
+ .filter(function (name) { return !!name; });
117
+ },
118
+ enumerable: true,
119
+ configurable: true
120
+ });
121
+ ColumnsController.prototype.setDefaults = function (defaults) {
122
+ this._defaultConfigs = defaults;
123
+ };
124
+ /**
125
+ * Set data from list config
126
+ * @param config
127
+ */
128
+ ColumnsController.prototype.initConfig = function (config) {
129
+ if (config) {
130
+ if (config.load) {
131
+ this._loadFn = config.load;
132
+ this._loadFnConfigured = true;
133
+ }
134
+ if (config.change) {
135
+ this._changeFn = config.change;
136
+ this._changeFnConfigured = true;
137
+ }
138
+ if (config.title) {
139
+ this._customizeFieldTitleFn = config.title;
140
+ }
141
+ if (config.disabled) {
142
+ this._customizeFieldDisabledFn = config.disabled;
143
+ }
144
+ if (config.tooltip) {
145
+ this._columnTooltipFn = config.tooltip;
146
+ }
147
+ this._isConfigured = true;
148
+ }
149
+ };
150
+ /**
151
+ * Base initialization for columns
152
+ * @param templates
153
+ */
154
+ ColumnsController.prototype.initializeColumns = function (templates) {
155
+ var _this = this;
156
+ this._columns = [];
157
+ templates.forEach(function (column) {
158
+ var col = new Column(column, _this._defaultConfigs);
159
+ if (col.headerTemplate || col.title) {
160
+ _this._hasHeader = true;
161
+ }
162
+ if (col.footerTemplate) {
163
+ _this._hasFooter = true;
164
+ }
165
+ _this._columns.push(col);
166
+ });
167
+ this._theadClass = this.hasHeader ? 'has-header' : '';
168
+ this._updateColspans('headerConfigs', 'headerColspanned');
169
+ this._updateColspans('groupCellConfigs', 'groupCellColspanned');
170
+ this._updateColspans('cellConfigs', 'cellColspanned');
171
+ this._updateColspans('footerConfigs', 'footerColspanned');
172
+ this.updateVisibleColumns();
173
+ };
174
+ /**
175
+ * Load visiblity config for columns from remote
176
+ */
177
+ ColumnsController.prototype.loadRemoteColumnConfigs = function () {
178
+ var _this = this;
179
+ return this._loadFn()
180
+ .pipe(takeUntil(this._destroy$), tap(function (columnConfigs) {
181
+ _this._columnsFetched = true;
182
+ _this.updateVisibilityForCols(columnConfigs);
183
+ }));
184
+ };
185
+ /**
186
+ * Set visible columns based on current columns show status
187
+ */
188
+ ColumnsController.prototype.updateVisibleColumns = function () {
189
+ this.visibleColumns =
190
+ this._columns.filter(function (column) { return column.show; }) || [];
191
+ };
192
+ /**
193
+ * Update visibility based on passed config
194
+ * @param columnsConfig
195
+ */
196
+ ColumnsController.prototype.updateVisibilityForCols = function (columnsConfig) {
197
+ var _this = this;
198
+ columnsConfig.forEach(function (columnConfig) {
199
+ var col = _this._columns
200
+ .find(function (column) { return column.name === columnConfig.name; });
201
+ if (col) {
202
+ col.show = columnConfig.show;
203
+ }
204
+ });
205
+ this.updateVisibleColumns();
206
+ };
207
+ ColumnsController.prototype.destroy = function () {
208
+ this._destroy$.next();
209
+ this._destroy$.complete();
210
+ this._columns = void 0;
211
+ this.visibleColumns = void 0;
212
+ this._defaultConfigs = void 0;
213
+ this._loadFn = void 0;
214
+ this._changeFn = void 0;
215
+ };
216
+ ColumnsController.prototype._updateColspans = function (config, updateFlag) {
217
+ var _this = this;
218
+ this._columns.forEach(function (col, index) {
219
+ if (col[config].colspan !== void 0) {
220
+ var spanTo = index + +col[config].colspan;
221
+ if (!isNumber(spanTo)) {
222
+ return;
223
+ }
224
+ _this._columns[index][updateFlag] = false;
225
+ for (var i = index + 1; i < spanTo; i++) {
226
+ if (_this._columns[i]) {
227
+ _this._columns[i][updateFlag] = true;
228
+ }
229
+ }
230
+ }
231
+ });
232
+ };
233
+ return ColumnsController;
234
+ }());
235
+ export { ColumnsController };
236
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1ucy1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGZpcmVzdGl0Y2gvbGlzdC8iLCJzb3VyY2VzIjpbImFwcC9jbGFzc2VzL2NvbHVtbnMtY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFXaEQ7SUFzQkU7UUFwQk8sbUJBQWMsR0FBYSxFQUFFLENBQUM7UUFFN0IsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFPakIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFDdEIsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQzFCLHdCQUFtQixHQUFHLEtBQUssQ0FBQztRQUM1QixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsYUFBUSxHQUFhLEVBQUUsQ0FBQztRQUd4QixjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUV6QixDQUFDO0lBRWhCLHNCQUFXLHNDQUFPO2FBQWxCO1lBQ0UsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQy9CLENBQUM7OztPQUFBO0lBRUQsc0JBQVcsK0NBQWdCO2FBQTNCO1lBQUEsaUJBNkJDO1lBNUJDLElBQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUM7WUFDckQsSUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDO1lBQ2pFLElBQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLElBQUks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SyxJQUFJLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ3ZDLElBQUksS0FBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRTt3QkFDcEIsS0FBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUM7cUJBQ3JDO2lCQUNGO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFSCx3QkFBQztBQUFELENBQUMsQUEzT0QsSUEyT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc051bWJlciB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSAnLi4vbW9kZWxzL2NvbHVtbi5tb2RlbCc7XG5pbXBvcnQge1xuICBGc0xpc3RDb2x1bW5DaGFuZ2VGbixcbiAgRnNMaXN0Q29sdW1uQ29uZmlnLFxuICBGc0xpc3RDb2x1bW5EaXNhYmxlZEZuLFxuICBGc0xpc3RDb2x1bW5Mb2FkRm4sXG4gIEZzTGlzdENvbHVtblRpdGxlRm4sXG4gIEZzTGlzdENvbHVtblRvb2x0aXBGbixcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9saXN0Y29uZmlnLmludGVyZmFjZSc7XG5cblxuZXhwb3J0IGNsYXNzIENvbHVtbnNDb250cm9sbGVyIHtcblxuICBwdWJsaWMgdmlzaWJsZUNvbHVtbnM6IENvbHVtbltdID0gW107XG5cbiAgcHJpdmF0ZSBfdGhlYWRDbGFzcyA9ICcnO1xuICBwcml2YXRlIF9sb2FkRm46IEZzTGlzdENvbHVtbkxvYWRGbjtcbiAgcHJpdmF0ZSBfY2hhbmdlRm46IEZzTGlzdENvbHVtbkNoYW5nZUZuO1xuICBwcml2YXRlIF9jdXN0b21pemVGaWVsZFRpdGxlRm46IEZzTGlzdENvbHVtblRpdGxlRm47XG4gIHByaXZhdGUgX2N1c3RvbWl6ZUZpZWxkRGlzYWJsZWRGbjogRnNMaXN0Q29sdW1uRGlzYWJsZWRGbjtcbiAgcHJpdmF0ZSBfY29sdW1uVG9vbHRpcEZuOiBGc0xpc3RDb2x1bW5Ub29sdGlwRm47XG5cbiAgcHJpdmF0ZSBfaXNDb25maWd1cmVkID0gZmFsc2U7XG4gIHByaXZhdGUgX2xvYWRGbkNvbmZpZ3VyZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfY2hhbmdlRm5Db25maWd1cmVkID0gZmFsc2U7XG4gIHByaXZhdGUgX2NvbHVtbnNGZXRjaGVkID0gZmFsc2U7XG4gIHByaXZhdGUgX2hhc0hlYWRlciA9IGZhbHNlO1xuICBwcml2YXRlIF9oYXNGb290ZXIgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfY29sdW1uczogQ29sdW1uW10gPSBbXTtcbiAgcHJpdmF0ZSBfZGVmYXVsdENvbmZpZ3M7XG5cbiAgcHJpdmF0ZSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBwdWJsaWMgZ2V0IGNvbHVtbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMuc2xpY2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29sdW1uc0ZvckRpYWxvZygpIHtcbiAgICBjb25zdCBoYXNDdXN0b21UaXRsZSA9ICEhdGhpcy5fY3VzdG9taXplRmllbGRUaXRsZUZuO1xuICAgIGNvbnN0IGhhc0N1c3RvbURpc2FibGVkU3RhdHVzID0gISF0aGlzLl9jdXN0b21pemVGaWVsZERpc2FibGVkRm47XG4gICAgY29uc3QgaGFzQ3VzdG9tVG9vbHRpcCA9ICEhdGhpcy5fY29sdW1uVG9vbHRpcEZuO1xuXG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnNcbiAgICAgIC5maWx0ZXIoKGNvbHVtbikgPT4gY29sdW1uLmN1c3RvbWl6ZSAmJiAhIWNvbHVtbi5uYW1lKVxuICAgICAgLm1hcCgoY29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IHRpdGxlID0gaGFzQ3VzdG9tVGl0bGVcbiAgICAgICAgICA/IHRoaXMuX2N1c3RvbWl6ZUZpZWxkVGl0bGVGbihjb2x1bW4ubmFtZSwgY29sdW1uLnRpdGxlKVxuICAgICAgICAgIDogY29sdW1uLm5hbWU7XG5cbiAgICAgICAgY29uc3QgZGlzYWJsZWQgPSBoYXNDdXN0b21EaXNhYmxlZFN0YXR1c1xuICAgICAgICAgID8gdGhpcy5fY3VzdG9taXplRmllbGREaXNhYmxlZEZuKGNvbHVtbi5uYW1lKVxuICAgICAgICAgIDogZmFsc2U7XG5cbiAgICAgICAgY29uc3QgdG9vbHRpcCA9IGhhc0N1c3RvbVRvb2x0aXBcbiAgICAgICAgICA/IHRoaXMuX2NvbHVtblRvb2x0aXBGbihjb2x1bW4ubmFtZSwgY29sdW1uLnNob3csIGRpc2FibGVkKVxuICAgICAgICAgIDogdm9pZCAwO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdGVtcGxhdGU6IGNvbHVtbi5oZWFkZXJUZW1wbGF0ZSxcbiAgICAgICAgICBuYW1lOiBjb2x1bW4ubmFtZSxcbiAgICAgICAgICBzaG93OiBjb2x1bW4uc2hvdyxcbiAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgICAgIHRvb2x0aXA6IHRvb2x0aXAsXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCBjb2x1bW5zRmV0Y2hlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1uc0ZldGNoZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0hlYWRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5faGFzSGVhZGVyO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNGb290ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hhc0Zvb3RlcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdGhlYWRDbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5fdGhlYWRDbGFzcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29uZmlndXJlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNDb25maWd1cmVkO1xuICB9XG5cbiAgcHVibGljIGdldCBsb2FkRm5Db25maWd1cmVkKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2FkRm5Db25maWd1cmVkO1xuICB9XG5cbiAgcHVibGljIGdldCBjaGFuZ2VGbkNvbmZpZ3VyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZUZuQ29uZmlndXJlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY2hhbmdlRm4oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZUZuO1xuICB9XG5cbiAgcHVibGljIGdldCB2aXNpYmxlQ29sdW1uc05hbWVzKCkge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVDb2x1bW5zXG4gICAgICAubWFwKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lKVxuICAgICAgLmZpbHRlcigobmFtZSkgPT4gISFuYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXREZWZhdWx0cyhkZWZhdWx0cykge1xuICAgIHRoaXMuX2RlZmF1bHRDb25maWdzID0gZGVmYXVsdHM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGRhdGEgZnJvbSBsaXN0IGNvbmZpZ1xuICAgKiBAcGFyYW0gY29uZmlnXG4gICAqL1xuICBwdWJsaWMgaW5pdENvbmZpZyhjb25maWc6IEZzTGlzdENvbHVtbkNvbmZpZykge1xuICAgIGlmIChjb25maWcpIHtcbiAgICAgIGlmIChjb25maWcubG9hZCkge1xuICAgICAgICB0aGlzLl9sb2FkRm4gPSBjb25maWcubG9hZDtcbiAgICAgICAgdGhpcy5fbG9hZEZuQ29uZmlndXJlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcuY2hhbmdlKSB7XG4gICAgICAgIHRoaXMuX2NoYW5nZUZuID0gY29uZmlnLmNoYW5nZTtcbiAgICAgICAgdGhpcy5fY2hhbmdlRm5Db25maWd1cmVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy50aXRsZSkge1xuICAgICAgICB0aGlzLl9jdXN0b21pemVGaWVsZFRpdGxlRm4gPSBjb25maWcudGl0bGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcuZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5fY3VzdG9taXplRmllbGREaXNhYmxlZEZuID0gY29uZmlnLmRpc2FibGVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLnRvb2x0aXApIHtcbiAgICAgICAgdGhpcy5fY29sdW1uVG9vbHRpcEZuID0gY29uZmlnLnRvb2x0aXA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lzQ29uZmlndXJlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJhc2UgaW5pdGlhbGl6YXRpb24gZm9yIGNvbHVtbnNcbiAgICogQHBhcmFtIHRlbXBsYXRlc1xuICAgKi9cbiAgcHVibGljIGluaXRpYWxpemVDb2x1bW5zKHRlbXBsYXRlcykge1xuICAgIHRoaXMuX2NvbHVtbnMgPSBbXTtcblxuICAgIHRlbXBsYXRlcy5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgIGNvbnN0IGNvbCA9IG5ldyBDb2x1bW4oY29sdW1uLCB0aGlzLl9kZWZhdWx0Q29uZmlncyk7XG5cblxuICAgICAgaWYgKGNvbC5oZWFkZXJUZW1wbGF0ZSB8fCBjb2wudGl0bGUpIHtcbiAgICAgICAgdGhpcy5faGFzSGVhZGVyID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjb2wuZm9vdGVyVGVtcGxhdGUpIHtcbiAgICAgICAgdGhpcy5faGFzRm9vdGVyID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY29sdW1ucy5wdXNoKGNvbCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl90aGVhZENsYXNzID0gdGhpcy5oYXNIZWFkZXIgPyAnaGFzLWhlYWRlcicgOiAnJztcblxuICAgIHRoaXMuX3VwZGF0ZUNvbHNwYW5zKCdoZWFkZXJDb25maWdzJywgJ2hlYWRlckNvbHNwYW5uZWQnKTtcbiAgICB0aGlzLl91cGRhdGVDb2xzcGFucygnZ3JvdXBDZWxsQ29uZmlncycsICdncm91cENlbGxDb2xzcGFubmVkJyk7XG4gICAgdGhpcy5fdXBkYXRlQ29sc3BhbnMoJ2NlbGxDb25maWdzJywgJ2NlbGxDb2xzcGFubmVkJyk7XG4gICAgdGhpcy5fdXBkYXRlQ29sc3BhbnMoJ2Zvb3RlckNvbmZpZ3MnLCAnZm9vdGVyQ29sc3Bhbm5lZCcpO1xuXG4gICAgdGhpcy51cGRhdGVWaXNpYmxlQ29sdW1ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgdmlzaWJsaXR5IGNvbmZpZyBmb3IgY29sdW1ucyBmcm9tIHJlbW90ZVxuICAgKi9cbiAgcHVibGljIGxvYWRSZW1vdGVDb2x1bW5Db25maWdzKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2FkRm4oKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIHRhcCgoY29sdW1uQ29uZmlncykgPT4ge1xuICAgICAgICAgIHRoaXMuX2NvbHVtbnNGZXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVZpc2liaWxpdHlGb3JDb2xzKGNvbHVtbkNvbmZpZ3MpO1xuICAgICAgICB9KVxuICAgICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB2aXNpYmxlIGNvbHVtbnMgYmFzZWQgb24gY3VycmVudCBjb2x1bW5zIHNob3cgc3RhdHVzXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlVmlzaWJsZUNvbHVtbnMoKSB7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1ucyA9XG4gICAgICB0aGlzLl9jb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiBjb2x1bW4uc2hvdykgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHZpc2liaWxpdHkgYmFzZWQgb24gcGFzc2VkIGNvbmZpZ1xuICAgKiBAcGFyYW0gY29sdW1uc0NvbmZpZ1xuICAgKi9cbiAgcHVibGljIHVwZGF0ZVZpc2liaWxpdHlGb3JDb2xzKGNvbHVtbnNDb25maWcpIHtcbiAgICBjb2x1bW5zQ29uZmlnLmZvckVhY2goKGNvbHVtbkNvbmZpZykgPT4ge1xuICAgICAgY29uc3QgY29sID0gdGhpcy5fY29sdW1uc1xuICAgICAgICAuZmluZCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gY29sdW1uQ29uZmlnLm5hbWUpO1xuXG4gICAgICBpZiAoY29sKSB7XG4gICAgICAgIGNvbC5zaG93ID0gY29sdW1uQ29uZmlnLnNob3c7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZVZpc2libGVDb2x1bW5zKCk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcblxuICAgIHRoaXMuX2NvbHVtbnMgPSB2b2lkIDA7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1ucyA9IHZvaWQgMDtcbiAgICB0aGlzLl9kZWZhdWx0Q29uZmlncyA9IHZvaWQgMDtcblxuICAgIHRoaXMuX2xvYWRGbiA9IHZvaWQgMDtcbiAgICB0aGlzLl9jaGFuZ2VGbiA9IHZvaWQgMDtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZUNvbHNwYW5zKGNvbmZpZywgdXBkYXRlRmxhZykge1xuICAgIHRoaXMuX2NvbHVtbnMuZm9yRWFjaCgoY29sLCBpbmRleCkgPT4ge1xuXG4gICAgICBpZiAoY29sW2NvbmZpZ10uY29sc3BhbiAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGNvbnN0IHNwYW5UbyA9IGluZGV4ICsgK2NvbFtjb25maWddLmNvbHNwYW47XG5cbiAgICAgICAgaWYgKCFpc051bWJlcihzcGFuVG8pKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NvbHVtbnNbaW5kZXhdW3VwZGF0ZUZsYWddID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IGluZGV4ICsgMTsgaSA8IHNwYW5UbzsgaSsrKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2NvbHVtbnNbaV0pIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbHVtbnNbaV1bdXBkYXRlRmxhZ10gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxufVxuIl19