@mediusinc/mng-commons 0.1.0 → 0.2.5

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 (274) hide show
  1. package/esm2020/lib/api/models/builders/query-param.builder.mjs +48 -48
  2. package/esm2020/lib/api/models/filter-match-type.model.mjs +26 -26
  3. package/esm2020/lib/api/models/filter-param.model.mjs +46 -46
  4. package/esm2020/lib/api/models/index.mjs +9 -9
  5. package/esm2020/lib/api/models/mappers.mjs +17 -17
  6. package/esm2020/lib/api/models/query-mode.model.mjs +19 -19
  7. package/esm2020/lib/api/models/query-param.model.mjs +69 -69
  8. package/esm2020/lib/api/models/query-result.model.mjs +45 -45
  9. package/esm2020/lib/api/models/serialization.model.mjs +2 -2
  10. package/esm2020/lib/api/services/crud-api.abstract.service.mjs +72 -0
  11. package/esm2020/lib/api/services/index.mjs +2 -2
  12. package/esm2020/lib/api/utils/index.mjs +3 -3
  13. package/esm2020/lib/api/utils/medius-rest.util.mjs +122 -122
  14. package/esm2020/lib/api/utils/object-serializer.util.mjs +226 -226
  15. package/esm2020/lib/components/action/action.component.mjs +65 -63
  16. package/esm2020/lib/components/action/dialog/action-dialog.component.mjs +148 -159
  17. package/esm2020/lib/components/action/index.mjs +4 -4
  18. package/esm2020/lib/components/action/models/action-confirmation-service.model.mjs +2 -0
  19. package/esm2020/lib/components/action/models/action-execution.model.mjs +58 -0
  20. package/esm2020/lib/components/action/models/index.mjs +3 -0
  21. package/esm2020/lib/components/action/route/action-route.component.mjs +144 -144
  22. package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +114 -0
  23. package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +113 -0
  24. package/esm2020/lib/components/form/editor/form-editor.component.mjs +141 -142
  25. package/esm2020/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +19 -19
  26. package/esm2020/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +19 -19
  27. package/esm2020/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +16 -16
  28. package/esm2020/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +26 -26
  29. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +109 -109
  30. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +122 -122
  31. package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +17 -17
  32. package/esm2020/lib/components/form/formly/fields/index.mjs +8 -8
  33. package/esm2020/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +17 -17
  34. package/esm2020/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.mjs +16 -16
  35. package/esm2020/lib/components/form/formly/wrappers/index.mjs +3 -3
  36. package/esm2020/lib/components/form/index.mjs +4 -4
  37. package/esm2020/lib/components/form/models/form-editor.event.mjs +7 -0
  38. package/esm2020/lib/components/form/models/index.mjs +2 -0
  39. package/esm2020/lib/components/layout/breadcrumb.component.mjs +17 -17
  40. package/esm2020/lib/components/layout/footer.component.mjs +17 -17
  41. package/esm2020/lib/components/layout/index.mjs +7 -7
  42. package/esm2020/lib/components/layout/main-layout.component.mjs +54 -33
  43. package/esm2020/lib/components/layout/menu-item.component.mjs +173 -173
  44. package/esm2020/lib/components/layout/menu.component.mjs +20 -20
  45. package/esm2020/lib/components/layout/services/index.mjs +2 -0
  46. package/esm2020/lib/components/layout/services/main-layout.component.service.mjs +190 -190
  47. package/esm2020/lib/components/layout/topbar.component.mjs +59 -40
  48. package/esm2020/lib/components/tableview/index.mjs +6 -6
  49. package/esm2020/lib/components/tableview/models/index.mjs +2 -0
  50. package/esm2020/lib/components/tableview/models/table.event.mjs +16 -0
  51. package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +24 -24
  52. package/esm2020/lib/components/tableview/services/index.mjs +2 -0
  53. package/esm2020/lib/components/tableview/services/tableview.component.service.mjs +17 -0
  54. package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +85 -74
  55. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +25 -25
  56. package/esm2020/lib/components/tableview/table/table.component.mjs +307 -307
  57. package/esm2020/lib/components/tableview/tableview.component.mjs +82 -83
  58. package/esm2020/lib/config/formly.config.mjs +136 -136
  59. package/esm2020/lib/config/index.mjs +2 -2
  60. package/esm2020/lib/config/models/index.mjs +2 -0
  61. package/esm2020/lib/config/models/mng-config.model.mjs +2 -0
  62. package/esm2020/lib/data-providers/base.data-provider.mjs +24 -0
  63. package/esm2020/lib/data-providers/editor.data-provider.mjs +37 -0
  64. package/esm2020/lib/data-providers/index.mjs +6 -0
  65. package/esm2020/lib/data-providers/lookup.data-provider.mjs +16 -0
  66. package/esm2020/lib/data-providers/table.data-provider.mjs +2 -0
  67. package/esm2020/lib/data-providers/tableview.data-provider.mjs +17 -0
  68. package/esm2020/lib/descriptors/action.descriptor.mjs +332 -0
  69. package/esm2020/lib/descriptors/editor.descriptor.mjs +670 -0
  70. package/esm2020/lib/descriptors/field.validator.mjs +21 -0
  71. package/esm2020/lib/descriptors/index.mjs +8 -0
  72. package/esm2020/lib/descriptors/lookup.descriptor.mjs +2 -0
  73. package/esm2020/lib/descriptors/model.descriptor.mjs +34 -0
  74. package/esm2020/lib/descriptors/table.descriptor.mjs +427 -0
  75. package/esm2020/lib/descriptors/tableview.descriptor.mjs +131 -0
  76. package/esm2020/lib/directives/component.directive.mjs +23 -0
  77. package/esm2020/lib/directives/index.mjs +3 -2
  78. package/esm2020/lib/directives/template.directive.mjs +29 -25
  79. package/esm2020/lib/mng-commons.module.mjs +410 -343
  80. package/esm2020/lib/models/index.mjs +3 -0
  81. package/esm2020/lib/models/router.model.mjs +2 -0
  82. package/esm2020/lib/models/user.model.mjs +2 -0
  83. package/esm2020/lib/pipes/boolean.pipe.mjs +22 -22
  84. package/esm2020/lib/pipes/index.mjs +3 -3
  85. package/esm2020/lib/pipes/property-path.pipe.mjs +36 -36
  86. package/esm2020/lib/services/action.service.mjs +269 -270
  87. package/esm2020/lib/services/commons.service.mjs +354 -357
  88. package/esm2020/lib/services/configuration.service.mjs +78 -77
  89. package/esm2020/lib/services/index.mjs +5 -5
  90. package/esm2020/lib/services/navigation.service.mjs +48 -48
  91. package/esm2020/lib/services/providers/commons-init.provider.mjs +4 -4
  92. package/esm2020/lib/services/providers/config-service.provider.mjs +20 -12
  93. package/esm2020/lib/services/providers/formly-config.provider.mjs +31 -31
  94. package/esm2020/lib/services/providers/index.mjs +4 -3
  95. package/esm2020/lib/services/tokens/browser-storage.token.mjs +6 -0
  96. package/esm2020/lib/services/tokens/index.mjs +3 -0
  97. package/esm2020/lib/services/tokens/module-config.token.mjs +3 -0
  98. package/esm2020/lib/types/index.mjs +3 -0
  99. package/esm2020/lib/types/type.decorator.mjs +7 -0
  100. package/esm2020/lib/types/type.model.mjs +2 -0
  101. package/esm2020/lib/utils/editor-formly.util.mjs +176 -176
  102. package/esm2020/lib/utils/i18n.util.mjs +125 -125
  103. package/esm2020/lib/utils/index.mjs +6 -5
  104. package/esm2020/lib/utils/model.util.mjs +57 -57
  105. package/esm2020/lib/utils/toast.util.mjs +39 -39
  106. package/esm2020/lib/utils/type.util.mjs +39 -39
  107. package/esm2020/mediusinc-mng-commons.mjs +5 -5
  108. package/esm2020/public-api.mjs +36 -35
  109. package/fesm2015/mediusinc-mng-commons.mjs +6086 -5914
  110. package/fesm2015/mediusinc-mng-commons.mjs.map +1 -1
  111. package/fesm2020/mediusinc-mng-commons.mjs +6010 -5841
  112. package/fesm2020/mediusinc-mng-commons.mjs.map +1 -1
  113. package/lib/api/models/builders/query-param.builder.d.ts +11 -11
  114. package/lib/api/models/filter-match-type.model.d.ts +23 -23
  115. package/lib/api/models/filter-param.model.d.ts +23 -23
  116. package/lib/api/models/index.d.ts +8 -8
  117. package/lib/api/models/mappers.d.ts +6 -6
  118. package/lib/api/models/query-mode.model.d.ts +16 -16
  119. package/lib/api/models/query-param.model.d.ts +31 -31
  120. package/lib/api/models/query-result.model.d.ts +36 -36
  121. package/lib/api/models/serialization.model.d.ts +8 -8
  122. package/lib/api/services/{abstract-crud-api.service.d.ts → crud-api.abstract.service.d.ts} +23 -23
  123. package/lib/api/services/index.d.ts +1 -1
  124. package/lib/api/utils/index.d.ts +2 -2
  125. package/lib/api/utils/medius-rest.util.d.ts +12 -12
  126. package/lib/api/utils/object-serializer.util.d.ts +30 -30
  127. package/lib/components/action/action.component.d.ts +36 -36
  128. package/lib/components/action/dialog/action-dialog.component.d.ts +46 -49
  129. package/lib/components/action/index.d.ts +3 -3
  130. package/lib/{models/interfaces/confirmation-service.model.d.ts → components/action/models/action-confirmation-service.model.d.ts} +6 -6
  131. package/lib/{models/action/action.model.d.ts → components/action/models/action-execution.model.d.ts} +53 -53
  132. package/lib/components/action/models/index.d.ts +2 -0
  133. package/lib/components/action/route/action-route.component.d.ts +32 -32
  134. package/lib/components/form/autocomplete/{mng-autocomplete.component.d.ts → autocomplete.component.d.ts} +36 -36
  135. package/lib/components/form/dropdown/{mng-dropdown.component.d.ts → dropdown.component.d.ts} +34 -34
  136. package/lib/components/form/editor/form-editor.component.d.ts +39 -39
  137. package/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.d.ts +11 -11
  138. package/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.d.ts +11 -11
  139. package/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +6 -6
  140. package/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.d.ts +12 -12
  141. package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +17 -17
  142. package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +36 -36
  143. package/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +6 -6
  144. package/lib/components/form/formly/fields/index.d.ts +7 -7
  145. package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +8 -8
  146. package/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.d.ts +8 -8
  147. package/lib/components/form/formly/wrappers/index.d.ts +2 -2
  148. package/lib/components/form/index.d.ts +3 -3
  149. package/lib/components/form/models/form-editor.event.d.ts +5 -0
  150. package/lib/components/form/models/index.d.ts +1 -0
  151. package/lib/components/layout/breadcrumb.component.d.ts +8 -8
  152. package/lib/components/layout/footer.component.d.ts +9 -9
  153. package/lib/components/layout/index.d.ts +6 -6
  154. package/lib/components/layout/main-layout.component.d.ts +21 -13
  155. package/lib/components/layout/menu-item.component.d.ts +29 -29
  156. package/lib/components/layout/menu.component.d.ts +10 -10
  157. package/lib/components/layout/services/index.d.ts +1 -0
  158. package/lib/components/layout/services/main-layout.component.service.d.ts +65 -65
  159. package/lib/components/layout/topbar.component.d.ts +25 -18
  160. package/lib/components/tableview/index.d.ts +5 -5
  161. package/lib/components/tableview/models/index.d.ts +1 -0
  162. package/lib/{models/events/table-event.model.d.ts → components/tableview/models/table.event.d.ts} +17 -17
  163. package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +14 -14
  164. package/lib/components/tableview/services/index.d.ts +1 -0
  165. package/lib/components/tableview/{tableview.component.service.d.ts → services/tableview.component.service.d.ts} +13 -13
  166. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +27 -22
  167. package/lib/components/tableview/table/column-value/column-value.component.d.ts +12 -12
  168. package/lib/components/tableview/table/table.component.d.ts +79 -79
  169. package/lib/components/tableview/tableview.component.d.ts +35 -36
  170. package/lib/config/formly.config.d.ts +14 -14
  171. package/lib/config/index.d.ts +1 -1
  172. package/lib/{models/config → config/models}/index.d.ts +1 -1
  173. package/lib/{models/config → config/models}/mng-config.model.d.ts +34 -37
  174. package/lib/data-providers/base.data-provider.d.ts +17 -0
  175. package/lib/data-providers/editor.data-provider.d.ts +25 -0
  176. package/lib/data-providers/index.d.ts +5 -0
  177. package/lib/data-providers/lookup.data-provider.d.ts +14 -0
  178. package/lib/data-providers/table.data-provider.d.ts +6 -0
  179. package/lib/data-providers/tableview.data-provider.d.ts +15 -0
  180. package/lib/{models/descriptors/action-descriptor.model.d.ts → descriptors/action.descriptor.d.ts} +148 -145
  181. package/lib/{models/descriptors/editor-descriptor.model.d.ts → descriptors/editor.descriptor.d.ts} +255 -257
  182. package/lib/{models/validators → descriptors}/field.validator.d.ts +18 -18
  183. package/lib/descriptors/index.d.ts +7 -0
  184. package/lib/{models/interfaces/lookup.model.d.ts → descriptors/lookup.descriptor.d.ts} +17 -17
  185. package/lib/{models/descriptors/model-descriptor.model.d.ts → descriptors/model.descriptor.d.ts} +15 -15
  186. package/lib/{models/descriptors/table-descriptor.model.d.ts → descriptors/table.descriptor.d.ts} +184 -164
  187. package/lib/{models/descriptors/tableview-descriptor.model.d.ts → descriptors/tableview.descriptor.d.ts} +39 -41
  188. package/lib/directives/component.directive.d.ts +11 -0
  189. package/lib/directives/index.d.ts +2 -1
  190. package/lib/directives/template.directive.d.ts +13 -11
  191. package/lib/mng-commons.module.d.ts +79 -78
  192. package/lib/models/{router/index.d.ts → index.d.ts} +2 -1
  193. package/lib/models/router.model.d.ts +14 -0
  194. package/lib/models/{user/user.model.d.ts → user.model.d.ts} +8 -8
  195. package/lib/pipes/boolean.pipe.d.ts +7 -7
  196. package/lib/pipes/index.d.ts +2 -2
  197. package/lib/pipes/property-path.pipe.d.ts +7 -7
  198. package/lib/services/action.service.d.ts +92 -92
  199. package/lib/services/commons.service.d.ts +72 -74
  200. package/lib/services/configuration.service.d.ts +35 -35
  201. package/lib/services/index.d.ts +4 -4
  202. package/lib/services/navigation.service.d.ts +14 -14
  203. package/lib/services/providers/commons-init.provider.d.ts +2 -2
  204. package/lib/services/providers/config-service.provider.d.ts +5 -5
  205. package/lib/services/providers/formly-config.provider.d.ts +4 -4
  206. package/lib/services/providers/index.d.ts +3 -2
  207. package/lib/services/tokens/browser-storage.token.d.ts +2 -0
  208. package/lib/services/tokens/index.d.ts +2 -0
  209. package/lib/services/tokens/module-config.token.d.ts +3 -0
  210. package/lib/{models/types → types}/index.d.ts +2 -2
  211. package/lib/{models/types → types}/type.decorator.d.ts +2 -2
  212. package/lib/{models/types → types}/type.model.d.ts +10 -10
  213. package/lib/utils/editor-formly.util.d.ts +9 -9
  214. package/lib/utils/i18n.util.d.ts +18 -18
  215. package/lib/utils/index.d.ts +5 -4
  216. package/lib/utils/model.util.d.ts +7 -7
  217. package/lib/utils/toast.util.d.ts +13 -13
  218. package/lib/utils/type.util.d.ts +15 -15
  219. package/mediusinc-mng-commons.d.ts +5 -5
  220. package/package.json +4 -4
  221. package/public-api.d.ts +25 -24
  222. package/scss/common/layout/_exception.scss +1 -1
  223. package/scss/common/layout/_help.scss +3 -3
  224. package/scss/common/layout/_landing.scss +1 -1
  225. package/scss/common/variables/layout/_common.scss +2 -0
  226. package/scss/common/variables/layout/_layout_dark.scss +4 -3
  227. package/scss/common/variables/layout/_layout_light.scss +4 -3
  228. package/scss/layout/default/_mng-variables-layout-light.scss +2 -2
  229. package/scss/mng-commons-dark.scss +0 -5
  230. package/scss/mng-commons-light.scss +0 -8
  231. package/scss/theme/default/_mng-variables-theme-light.scss +4 -4
  232. package/.pnpm-debug.log +0 -15
  233. package/esm2020/lib/api/services/abstract-crud-api.service.mjs +0 -72
  234. package/esm2020/lib/components/form/autocomplete/mng-autocomplete.component.mjs +0 -114
  235. package/esm2020/lib/components/form/dropdown/mng-dropdown.component.mjs +0 -113
  236. package/esm2020/lib/components/tableview/tableview.component.service.mjs +0 -18
  237. package/esm2020/lib/models/action/action.model.mjs +0 -58
  238. package/esm2020/lib/models/action/index.mjs +0 -2
  239. package/esm2020/lib/models/config/index.mjs +0 -2
  240. package/esm2020/lib/models/config/mng-config.model.mjs +0 -3
  241. package/esm2020/lib/models/descriptors/action-descriptor.model.mjs +0 -325
  242. package/esm2020/lib/models/descriptors/editor-descriptor.model.mjs +0 -671
  243. package/esm2020/lib/models/descriptors/index.mjs +0 -6
  244. package/esm2020/lib/models/descriptors/model-descriptor.model.mjs +0 -34
  245. package/esm2020/lib/models/descriptors/table-descriptor.model.mjs +0 -401
  246. package/esm2020/lib/models/descriptors/tableview-descriptor.model.mjs +0 -133
  247. package/esm2020/lib/models/events/editor-event.model.mjs +0 -14
  248. package/esm2020/lib/models/events/index.mjs +0 -3
  249. package/esm2020/lib/models/events/table-event.model.mjs +0 -16
  250. package/esm2020/lib/models/interfaces/confirmation-service.model.mjs +0 -2
  251. package/esm2020/lib/models/interfaces/index.mjs +0 -3
  252. package/esm2020/lib/models/interfaces/lookup.model.mjs +0 -2
  253. package/esm2020/lib/models/providers/data-provider.model.mjs +0 -86
  254. package/esm2020/lib/models/providers/index.mjs +0 -2
  255. package/esm2020/lib/models/router/index.mjs +0 -2
  256. package/esm2020/lib/models/router/router.model.mjs +0 -2
  257. package/esm2020/lib/models/types/index.mjs +0 -3
  258. package/esm2020/lib/models/types/type.decorator.mjs +0 -7
  259. package/esm2020/lib/models/types/type.model.mjs +0 -2
  260. package/esm2020/lib/models/user/index.mjs +0 -2
  261. package/esm2020/lib/models/user/user.model.mjs +0 -2
  262. package/esm2020/lib/models/validators/field.validator.mjs +0 -21
  263. package/esm2020/lib/models/validators/index.mjs +0 -2
  264. package/lib/models/action/index.d.ts +0 -1
  265. package/lib/models/descriptors/index.d.ts +0 -5
  266. package/lib/models/events/editor-event.model.d.ts +0 -11
  267. package/lib/models/events/index.d.ts +0 -2
  268. package/lib/models/interfaces/index.d.ts +0 -2
  269. package/lib/models/providers/data-provider.model.d.ts +0 -62
  270. package/lib/models/providers/index.d.ts +0 -1
  271. package/lib/models/router/router.model.d.ts +0 -9
  272. package/lib/models/user/index.d.ts +0 -1
  273. package/lib/models/validators/index.d.ts +0 -1
  274. package/mediusinc-mng-commons-0.1.0.tgz +0 -0
@@ -1,307 +1,307 @@
1
- import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Input, Optional, Output, ViewChild } from '@angular/core';
2
- import { Table } from 'primeng/table';
3
- import { Observable, of, ReplaySubject } from 'rxjs';
4
- import { finalize, first, map } from 'rxjs/operators';
5
- import { MediusQueryParam, MediusQueryParamBuilder, MediusQueryResult } from '../../../api/models';
6
- import { MediusRestUtil } from '../../../api/utils';
7
- import { FilterDescriptor, TableDescriptor } from '../../../models/descriptors';
8
- import { MngTableCellClickEvent, MngTableLoadEvent } from '../../../models/events';
9
- import { TemplateDirective } from '../../../directives';
10
- import { ToastUtil } from '../../../utils/toast.util';
11
- var TypeEnum = FilterDescriptor.TypeEnum;
12
- var PaginationModeEnum = TableDescriptor.PaginationModeEnum;
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "@angular/router";
15
- import * as i2 from "@ngx-translate/core";
16
- import * as i3 from "../tableview.component.service";
17
- import * as i4 from "primeng/table";
18
- import * as i5 from "./column-filter/column-filter.component";
19
- import * as i6 from "./column-value/column-value.component";
20
- import * as i7 from "primeng/skeleton";
21
- import * as i8 from "@angular/common";
22
- import * as i9 from "primeng/api";
23
- export class TableComponent {
24
- constructor(injector, router, activatedRoute, translate, tableviewService) {
25
- this.injector = injector;
26
- this.router = router;
27
- this.activatedRoute = activatedRoute;
28
- this.translate = translate;
29
- this.tableviewService = tableviewService;
30
- this.filterDisplayRow = TableDescriptor.FilterDisplayEnum.Row;
31
- this.filterDisplayMenu = TableDescriptor.FilterDisplayEnum.Menu;
32
- this.useQueryParams = false;
33
- // extra features input
34
- this.selectionEnabled = false;
35
- // event outputs
36
- this.loadEventEmitter = new EventEmitter();
37
- this.cellClickEventEmitter = new EventEmitter();
38
- this.selectionChangeEventEmitter = new EventEmitter();
39
- // data provider and items
40
- this.useDataProvider = false;
41
- this.useQueryParamsInitialized = false;
42
- this.dataProviderInfiniteScrollItems = [];
43
- this.dataProviderService = null;
44
- this.dataProviderQueryResultSubject = new ReplaySubject(1);
45
- this.dataProviderLoadingSubject = new ReplaySubject(1);
46
- this.dataProviderLatestLazyLoadEventVersion = 0;
47
- this.dataProviderLatestQueryParamVersion = 0;
48
- // pagination, sort and filters
49
- this.rowsPerPageOptions = [25, 50, 100];
50
- this.rows = this.rowsPerPageOptions[0];
51
- this.offset = 0;
52
- this.multiSortMeta = null;
53
- this.filterMetadata = {};
54
- this.isFilterChanged = false;
55
- this.isSortChanged = false;
56
- // infinite scroll
57
- this.infiniteScroll = false;
58
- this.scrollHeight = null;
59
- this.rowHeight = null;
60
- this.selection = [];
61
- this.subscriptions = [];
62
- this.filterDescriptors = [];
63
- }
64
- ngOnInit() {
65
- // @ts-ignore
66
- this.filterDescriptors = this.descriptor.columns.filter(c => typeof c.filterDescriptor !== 'undefined').map(c => c.filterDescriptor);
67
- if (this.descriptor.paginationMode === PaginationModeEnum.InfiniteScroll) {
68
- this.infiniteScroll = true;
69
- this.scrollHeight = 'flex';
70
- this.rowHeight = this.descriptor.rowHeight;
71
- this.useQueryParams = false;
72
- }
73
- // check if data provider is supplied, if is, use it primarily
74
- if (this.dataProvider) {
75
- // map subjects to observables and initiate data
76
- this.useDataProvider = true;
77
- this.queryResult$ = this.dataProviderQueryResultSubject.asObservable();
78
- this.loading$ = this.dataProviderLoadingSubject.asObservable();
79
- const emptyQueryResult = new MediusQueryResult();
80
- emptyQueryResult.pageData = [];
81
- emptyQueryResult.allDataCount = 0;
82
- this.dataProviderLoadingSubject.next(false);
83
- this.dataProviderQueryResultSubject.next(emptyQueryResult);
84
- // inject service
85
- if (this.dataProvider.serviceType) {
86
- this.dataProviderService = this.injector.get(this.dataProvider.serviceType);
87
- }
88
- }
89
- else {
90
- // if query result is provided, use it as secondary source or else try to use items
91
- if (this.queryResult) {
92
- this.queryResult$ = this.queryResult instanceof Observable ? this.queryResult : of(this.queryResult);
93
- }
94
- else if (!this.queryResult && this.items) {
95
- this.queryResult$ = (this.items instanceof Observable ? this.items : of(this.items)).pipe(
96
- // distinctUntilChanged((v1, v2) => v1.length === v2.length &&
97
- // v1.every((v1i, idx) => v1i[this.descriptor.dataKeyProperty] === v2[idx][this.descriptor.dataKeyProperty])),
98
- map(items => {
99
- const queryResult = new MediusQueryResult();
100
- queryResult.pageData = items;
101
- queryResult.allDataCount = items.length;
102
- return queryResult;
103
- }));
104
- }
105
- if (typeof this.loading !== 'undefined') {
106
- this.loading$ = this.loading instanceof Observable ? this.loading : of(this.loading);
107
- }
108
- }
109
- if (this.useQueryParams) {
110
- const subscription = this.activatedRoute.queryParams.subscribe(qp => {
111
- this.loadTableFromRouteUpdate(qp);
112
- });
113
- this.subscriptions.push(subscription);
114
- }
115
- else {
116
- // initialize default sort if present
117
- const defaultSort = this.getDefaultSortMeta();
118
- if (defaultSort.length > 0) {
119
- this.multiSortMeta = defaultSort;
120
- }
121
- }
122
- }
123
- ngAfterContentInit() {
124
- this.templates.forEach(template => {
125
- switch (template.getType()) {
126
- case 'caption':
127
- this.captionTemplate = template.template;
128
- break;
129
- case 'columnAction':
130
- this.columnActionTemplate = template.template;
131
- break;
132
- }
133
- });
134
- }
135
- ngOnDestroy() {
136
- this.subscriptions.forEach(s => s.unsubscribe());
137
- }
138
- reload(emitEvent = false, resetParams = false) {
139
- this.loadTableWithDataProvider(resetParams
140
- ? MediusQueryParamBuilder.create(this.rowsPerPageOptions[0], 0).build()
141
- : (this.dataProviderLatestQueryParam ?? new MediusQueryParam()), emitEvent);
142
- }
143
- onTableLazyLoad(event) {
144
- this.dataProviderLatestLazyLoadEvent = event;
145
- this.dataProviderLatestLazyLoadEventVersion++;
146
- if (this.useQueryParams) {
147
- if (!event.multiSortMeta || event.multiSortMeta.length === 0) {
148
- // add default sort meta to event if not multisort meta is present
149
- event.multiSortMeta = this.getDefaultSortMeta();
150
- }
151
- this.router.navigate([], {
152
- relativeTo: this.activatedRoute,
153
- replaceUrl: true,
154
- queryParams: MediusRestUtil.fromPrimeLazyLoadEventToAngularQueryParams(event, this.rowsPerPageOptions[0])
155
- });
156
- }
157
- else {
158
- const mediusQueryParams = event ? MediusRestUtil.fromPrimeLazyLoadEventToMediusQueryParams(event) : new MediusQueryParam();
159
- this.loadTableWithDataProvider(mediusQueryParams);
160
- }
161
- }
162
- onTableSort(event) {
163
- this.isSortChanged = true;
164
- }
165
- onTableFilter(event) {
166
- this.isFilterChanged = true;
167
- }
168
- onCellClick(col, item, idx) {
169
- const mngEvent = new MngTableCellClickEvent(col, item, idx);
170
- this.cellClickEventEmitter.next(mngEvent);
171
- }
172
- onSelectionChange(event) {
173
- this.selectionChangeEventEmitter.emit(event);
174
- }
175
- loadTableWithDataProvider(queryParam = null, emitEvent = true) {
176
- if (!this.useDataProvider) {
177
- return;
178
- }
179
- if (this.dataProviderSubscription) {
180
- this.dataProviderSubscription.unsubscribe();
181
- }
182
- this.dataProviderLoadingSubject.next(true);
183
- if (!queryParam) {
184
- queryParam = MediusQueryParamBuilder.create(this.rowsPerPageOptions[0]).build();
185
- }
186
- this.dataProviderLatestQueryParam = queryParam;
187
- this.dataProviderLatestQueryParamVersion++;
188
- this.dataProviderSubscription = this.dataProvider?.getAll(queryParam, this.dataProviderService)
189
- .pipe(first(), finalize(() => this.dataProviderLoadingSubject.next(false)))
190
- .subscribe((res) => {
191
- if (this.infiniteScroll) {
192
- if (this.isFilterChanged || this.isSortChanged) {
193
- this.dataProviderInfiniteScrollItems = [];
194
- }
195
- // @ts-ignore
196
- this.dataProviderInfiniteScrollItems.splice(queryParam.itemsOffset ?? 0, queryParam.itemsPerPage ?? this.rows, ...res.pageData);
197
- this.dataProviderInfiniteScrollItems = [...this.dataProviderInfiniteScrollItems];
198
- }
199
- else {
200
- this.dataProviderQueryResultSubject.next(res);
201
- }
202
- this.isFilterChanged = false;
203
- this.isSortChanged = false;
204
- }, err => {
205
- ToastUtil.tableNotificationError(this.translate, this.descriptor, err, this.tableviewService);
206
- const emptyQueryResult = new MediusQueryResult();
207
- emptyQueryResult.pageData = [];
208
- emptyQueryResult.allDataCount = 0;
209
- this.dataProviderQueryResultSubject.next(emptyQueryResult);
210
- });
211
- if (emitEvent) {
212
- const mngEvent = new MngTableLoadEvent();
213
- mngEvent.originalEvent = this.dataProviderLatestLazyLoadEvent ?? undefined;
214
- mngEvent.queryParam = queryParam;
215
- this.loadEventEmitter.next(mngEvent);
216
- }
217
- }
218
- loadTableFromRouteUpdate(params) {
219
- const mediusQueryParam = MediusRestUtil.fromAngularQueryParamsToMediusQueryParams(params, this.filterDescriptors, this.rowsPerPageOptions[0]);
220
- if (this.dataProviderLatestLazyLoadEventVersion < this.dataProviderLatestQueryParamVersion + 1) {
221
- // update only if new version from query params will be higher
222
- this.updatePrimeSortAndFilter(mediusQueryParam);
223
- }
224
- this.useQueryParamsInitialized = true;
225
- this.loadTableWithDataProvider(mediusQueryParam);
226
- }
227
- updatePrimeSortAndFilter(mediusQueryParam) {
228
- const primeSortMeta = [];
229
- const primeFilterMeta = {};
230
- this.filterDescriptors.forEach(f => {
231
- // @ts-ignore
232
- primeFilterMeta[f.property] = {
233
- value: null,
234
- matchMode: f.filterType === TypeEnum.String ? 'contains' : 'equals'
235
- };
236
- });
237
- mediusQueryParam?.sortProperty?.forEach((s, idx) => {
238
- primeSortMeta.push({
239
- field: s,
240
- order: (mediusQueryParam?.sortAsc?.[idx] ?? true) ? 1 : -1
241
- });
242
- });
243
- mediusQueryParam?.filterParams?.forEach((f, idx) => {
244
- const descriptor = this.filterDescriptors.find(fd => fd.filterProperty === f.property || fd.property === f.property);
245
- const operator = MediusRestUtil.matchModeMapping.find(mapping => mapping[2] === f.filterMatchType);
246
- if (descriptor && operator) {
247
- primeFilterMeta[descriptor.property] = {
248
- value: f.filterValue,
249
- matchMode: operator[0]
250
- };
251
- }
252
- });
253
- this.multiSortMeta = primeSortMeta;
254
- this.filterMetadata = primeFilterMeta;
255
- this.rows = mediusQueryParam?.itemsPerPage ?? this.rowsPerPageOptions[0];
256
- this.offset = mediusQueryParam?.itemsOffset ?? 0;
257
- }
258
- getDefaultSortMeta() {
259
- if (this.descriptor.hasDefaultSort) {
260
- return this.descriptor.defaultSortProperty.map((p, idx) => ({
261
- field: p,
262
- order: this.descriptor.defaultSortAsc[idx] ? 1 : -1
263
- }));
264
- }
265
- else {
266
- return [];
267
- }
268
- }
269
- }
270
- TableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: TableComponent, deps: [{ token: i0.Injector }, { token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.TranslateService }, { token: i3.TableviewComponentService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
271
- TableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: TableComponent, selector: "mng-table", inputs: { descriptor: "descriptor", items: "items", queryResult: "queryResult", loading: "loading", dataProvider: "dataProvider", useQueryParams: "useQueryParams", selectionEnabled: "selectionEnabled" }, outputs: { loadEventEmitter: "onLoad", cellClickEventEmitter: "onCellClick", selectionChangeEventEmitter: "onSelectionChange" }, queries: [{ propertyName: "templates", predicate: TemplateDirective }], viewQueries: [{ propertyName: "primeTable", first: true, predicate: Table, descendants: true }], ngImport: i0, template: "<div [style.height]=\"scrollHeight === 'flex' ? 'calc(100vh - ' + descriptor.tableFullHeightOffset + 'px)' : null\">\n <!-- MUST NOT use observable for value when using virtual scroll - does not work for some reason -->\n <p-table *ngIf=\"!useQueryParams || useQueryParamsInitialized\"\n [value]=\"infiniteScroll ? dataProviderInfiniteScrollItems : ((queryResult$ | async)?.pageData ?? [])\"\n [dataKey]=\"$any(descriptor.dataKeyProperty)\"\n [lazy]=\"useDataProvider\"\n [loading]=\"(loading$ | async) ?? false\"\n [paginator]=\"useDataProvider && !infiniteScroll\"\n [rows]=\"$any(infiniteScroll ? 20 : rows)\"\n [first]=\"$any(infiniteScroll ? 0 : offset)\"\n [totalRecords]=\"$any(infiniteScroll ? null : (queryResult$ | async)?.allDataCount ?? 0)\"\n [rowsPerPageOptions]=\"$any(infiniteScroll ? null : rowsPerPageOptions)\"\n [showCurrentPageReport]=\"!infiniteScroll\"\n [currentPageReportTemplate]=\"'mngTable.paginationMsg' | translate\"\n [multiSortMeta]=\"$any(multiSortMeta)\"\n [filters]=\"filterMetadata\"\n [(selection)]=\"selection\"\n (selectionChange)=\"onSelectionChange($event)\"\n [scrollable]=\"infiniteScroll\"\n [virtualScroll]=\"infiniteScroll\"\n [virtualRowHeight]=\"$any(rowHeight)\"\n [scrollHeight]=\"$any(scrollHeight)\"\n [rowHover]=\"true\"\n (onLazyLoad)=\"onTableLazyLoad($event)\"\n (onSort)=\"onTableSort($event)\"\n (onFilter)=\"onTableFilter($event)\"\n sortMode=\"multiple\"\n responsiveLayout=\"scroll\">\n\n <ng-template *ngIf=\"captionTemplate || descriptor.title\" pTemplate=\"caption\">\n <ng-container *ngIf=\"captionTemplate; else defaultCaption\">\n <ng-container *ngTemplateOutlet=\"captionTemplate\"></ng-container>\n </ng-container>\n <ng-template #defaultCaption>\n <h5 class=\"p-m-0\">{{ descriptor.title }}</h5>\n </ng-template>\n </ng-template>\n\n <ng-template pTemplate=\"header\">\n <tr>\n <th *ngIf=\"selectionEnabled\">\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n <ng-container *ngFor=\"let col of descriptor.columns\">\n <th *ngIf=\"col.isSortEnabled\" [pSortableColumn]=\"col.property\">\n <div class=\"flex justify-content-between align-items-center\">\n {{ descriptor.model.typeName + \".properties.\" + col.property | translate }}\n <p-sortIcon [field]=\"col.property\"></p-sortIcon>\n <mng-table-column-filter *ngIf=\"col.filterDescriptor && descriptor.filterDisplay === filterDisplayMenu\"\n class=\"ml-auto\"\n [display]=\"descriptor.filterDisplay\"\n [descriptor]=\"col.filterDescriptor\">\n </mng-table-column-filter>\n </div>\n </th>\n <th *ngIf=\"!col.isSortEnabled\">\n {{ descriptor.model.typeName + \".properties.\" + col.property | translate }}\n <ng-container>\n <mng-table-column-filter *ngIf=\"col.filterDescriptor && descriptor.filterDisplay === filterDisplayMenu\"\n class=\"ml-auto\"\n [display]=\"descriptor.filterDisplay\"\n [descriptor]=\"col.filterDescriptor\">\n </mng-table-column-filter>\n </ng-container>\n </th>\n </ng-container>\n <th *ngIf=\"columnActionTemplate\"></th>\n </tr>\n <tr *ngIf=\"descriptor.filterDisplay === filterDisplayRow\">\n <th *ngFor=\"let col of descriptor.columns\">\n <div class=\"flex\" *ngIf=\"col.filterDescriptor\">\n <mng-table-column-filter [display]=\"descriptor.filterDisplay\" [descriptor]=\"col.filterDescriptor\"></mng-table-column-filter>\n </div>\n </th>\n <th *ngIf=\"columnActionTemplate\"></th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-item let-idx=\"rowIndex\">\n <tr [style.height.px]=\"descriptor.rowHeight\">\n <td *ngIf=\"selectionEnabled\">\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\n </td>\n <td *ngFor=\"let col of descriptor.columns\" (click)=\"onCellClick(col, item, idx)\" class=\"clickable\">\n <mng-table-column-value [descriptor]=\"col\" [item]=\"item\"></mng-table-column-value>\n </td>\n <td *ngIf=\"columnActionTemplate\" class=\"text-right\">\n <ng-container *ngTemplateOutlet=\"columnActionTemplate; context: { rowItem: item, rowIndex: idx }\"></ng-container>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"loadingbody\">\n <tr [style.height.px]=\"descriptor.rowHeight\">\n <td [attr.colspan]=\"descriptor.columns.length + (columnActionTemplate ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n <div class=\"loading-text\"></div>\n <p-skeleton [ngStyle]=\"{'width': '100%'}\"></p-skeleton>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"emptymessage\">\n <tr [style.height.px]=\"rowHeight\">\n <td [attr.colspan]=\"descriptor.columns.length + (columnActionTemplate ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n {{ 'mngTable.noItems' | translate }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n</div>\n", components: [{ type: i4.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollDelay", "virtualRowHeight", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "minBufferPx", "maxBufferPx", "responsiveLayout", "breakpoint", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["selectAllChange", "selectionChange", "contextMenuSelectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { type: i4.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { type: i4.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { type: i5.MngTableColumnFilterComponent, selector: "mng-table-column-filter", inputs: ["descriptor", "display"] }, { type: i4.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { type: i6.MngTableColumnValueComponent, selector: "mng-table-column-value", inputs: ["descriptor", "item"] }, { type: i7.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], pipes: { "async": i8.AsyncPipe, "translate": i2.TranslatePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
272
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: TableComponent, decorators: [{
273
- type: Component,
274
- args: [{ selector: 'mng-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [style.height]=\"scrollHeight === 'flex' ? 'calc(100vh - ' + descriptor.tableFullHeightOffset + 'px)' : null\">\n <!-- MUST NOT use observable for value when using virtual scroll - does not work for some reason -->\n <p-table *ngIf=\"!useQueryParams || useQueryParamsInitialized\"\n [value]=\"infiniteScroll ? dataProviderInfiniteScrollItems : ((queryResult$ | async)?.pageData ?? [])\"\n [dataKey]=\"$any(descriptor.dataKeyProperty)\"\n [lazy]=\"useDataProvider\"\n [loading]=\"(loading$ | async) ?? false\"\n [paginator]=\"useDataProvider && !infiniteScroll\"\n [rows]=\"$any(infiniteScroll ? 20 : rows)\"\n [first]=\"$any(infiniteScroll ? 0 : offset)\"\n [totalRecords]=\"$any(infiniteScroll ? null : (queryResult$ | async)?.allDataCount ?? 0)\"\n [rowsPerPageOptions]=\"$any(infiniteScroll ? null : rowsPerPageOptions)\"\n [showCurrentPageReport]=\"!infiniteScroll\"\n [currentPageReportTemplate]=\"'mngTable.paginationMsg' | translate\"\n [multiSortMeta]=\"$any(multiSortMeta)\"\n [filters]=\"filterMetadata\"\n [(selection)]=\"selection\"\n (selectionChange)=\"onSelectionChange($event)\"\n [scrollable]=\"infiniteScroll\"\n [virtualScroll]=\"infiniteScroll\"\n [virtualRowHeight]=\"$any(rowHeight)\"\n [scrollHeight]=\"$any(scrollHeight)\"\n [rowHover]=\"true\"\n (onLazyLoad)=\"onTableLazyLoad($event)\"\n (onSort)=\"onTableSort($event)\"\n (onFilter)=\"onTableFilter($event)\"\n sortMode=\"multiple\"\n responsiveLayout=\"scroll\">\n\n <ng-template *ngIf=\"captionTemplate || descriptor.title\" pTemplate=\"caption\">\n <ng-container *ngIf=\"captionTemplate; else defaultCaption\">\n <ng-container *ngTemplateOutlet=\"captionTemplate\"></ng-container>\n </ng-container>\n <ng-template #defaultCaption>\n <h5 class=\"p-m-0\">{{ descriptor.title }}</h5>\n </ng-template>\n </ng-template>\n\n <ng-template pTemplate=\"header\">\n <tr>\n <th *ngIf=\"selectionEnabled\">\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n <ng-container *ngFor=\"let col of descriptor.columns\">\n <th *ngIf=\"col.isSortEnabled\" [pSortableColumn]=\"col.property\">\n <div class=\"flex justify-content-between align-items-center\">\n {{ descriptor.model.typeName + \".properties.\" + col.property | translate }}\n <p-sortIcon [field]=\"col.property\"></p-sortIcon>\n <mng-table-column-filter *ngIf=\"col.filterDescriptor && descriptor.filterDisplay === filterDisplayMenu\"\n class=\"ml-auto\"\n [display]=\"descriptor.filterDisplay\"\n [descriptor]=\"col.filterDescriptor\">\n </mng-table-column-filter>\n </div>\n </th>\n <th *ngIf=\"!col.isSortEnabled\">\n {{ descriptor.model.typeName + \".properties.\" + col.property | translate }}\n <ng-container>\n <mng-table-column-filter *ngIf=\"col.filterDescriptor && descriptor.filterDisplay === filterDisplayMenu\"\n class=\"ml-auto\"\n [display]=\"descriptor.filterDisplay\"\n [descriptor]=\"col.filterDescriptor\">\n </mng-table-column-filter>\n </ng-container>\n </th>\n </ng-container>\n <th *ngIf=\"columnActionTemplate\"></th>\n </tr>\n <tr *ngIf=\"descriptor.filterDisplay === filterDisplayRow\">\n <th *ngFor=\"let col of descriptor.columns\">\n <div class=\"flex\" *ngIf=\"col.filterDescriptor\">\n <mng-table-column-filter [display]=\"descriptor.filterDisplay\" [descriptor]=\"col.filterDescriptor\"></mng-table-column-filter>\n </div>\n </th>\n <th *ngIf=\"columnActionTemplate\"></th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-item let-idx=\"rowIndex\">\n <tr [style.height.px]=\"descriptor.rowHeight\">\n <td *ngIf=\"selectionEnabled\">\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\n </td>\n <td *ngFor=\"let col of descriptor.columns\" (click)=\"onCellClick(col, item, idx)\" class=\"clickable\">\n <mng-table-column-value [descriptor]=\"col\" [item]=\"item\"></mng-table-column-value>\n </td>\n <td *ngIf=\"columnActionTemplate\" class=\"text-right\">\n <ng-container *ngTemplateOutlet=\"columnActionTemplate; context: { rowItem: item, rowIndex: idx }\"></ng-container>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"loadingbody\">\n <tr [style.height.px]=\"descriptor.rowHeight\">\n <td [attr.colspan]=\"descriptor.columns.length + (columnActionTemplate ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n <div class=\"loading-text\"></div>\n <p-skeleton [ngStyle]=\"{'width': '100%'}\"></p-skeleton>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"emptymessage\">\n <tr [style.height.px]=\"rowHeight\">\n <td [attr.colspan]=\"descriptor.columns.length + (columnActionTemplate ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n {{ 'mngTable.noItems' | translate }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n</div>\n" }]
275
- }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.TranslateService }, { type: i3.TableviewComponentService, decorators: [{
276
- type: Optional
277
- }] }]; }, propDecorators: { descriptor: [{
278
- type: Input
279
- }], items: [{
280
- type: Input
281
- }], queryResult: [{
282
- type: Input
283
- }], loading: [{
284
- type: Input
285
- }], dataProvider: [{
286
- type: Input
287
- }], useQueryParams: [{
288
- type: Input
289
- }], selectionEnabled: [{
290
- type: Input
291
- }], loadEventEmitter: [{
292
- type: Output,
293
- args: ['onLoad']
294
- }], cellClickEventEmitter: [{
295
- type: Output,
296
- args: ['onCellClick']
297
- }], selectionChangeEventEmitter: [{
298
- type: Output,
299
- args: ['onSelectionChange']
300
- }], templates: [{
301
- type: ContentChildren,
302
- args: [TemplateDirective]
303
- }], primeTable: [{
304
- type: ViewChild,
305
- args: [Table]
306
- }] } });
307
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW5nLWNvbW1vbnMvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxldmlldy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbmctY29tbW9ucy9zcmMvbGliL2NvbXBvbmVudHMvdGFibGV2aWV3L3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBbUIsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQVksS0FBSyxFQUFxQixRQUFRLEVBQUUsTUFBTSxFQUEwQixTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFHM00sT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUdwQyxPQUFPLEVBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFDakUsT0FBTyxFQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHcEQsT0FBTyxFQUFDLGdCQUFnQixFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDakcsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRWxELE9BQU8sRUFBbUIsZ0JBQWdCLEVBQUUsZUFBZSxFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFFaEcsT0FBTyxFQUFDLHNCQUFzQixFQUFFLGlCQUFpQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDakYsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBRXBELElBQU8sUUFBUSxH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QUFDO1NBQ047YUFBTTtZQUNILE9BQU8sRUFBRSxDQUFDO1NBQ2I7SUFDTCxDQUFDOzsyR0ExU1EsY0FBYzsrRkFBZCxjQUFjLHdaQXdCTixpQkFBaUIseUVBQ3ZCLEtBQUssZ0RDcERwQixrck1BOEdBOzJGRG5GYSxjQUFjO2tCQUwxQixTQUFTOytCQUNJLFdBQVcsbUJBRUosdUJBQXVCLENBQUMsTUFBTTs7MEJBc0VsQyxRQUFROzRDQTlETCxVQUFVO3NCQUF6QixLQUFLO2dCQUdVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBQ1UsV0FBVztzQkFBMUIsS0FBSztnQkFDVSxPQUFPO3NCQUF0QixLQUFLO2dCQUNVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBQ1UsY0FBYztzQkFBN0IsS0FBSztnQkFHVSxnQkFBZ0I7c0JBQS9CLEtBQUs7Z0JBR29CLGdCQUFnQjtzQkFBekMsTUFBTTt1QkFBQyxRQUFRO2dCQUNlLHFCQUFxQjtzQkFBbkQsTUFBTTt1QkFBQyxhQUFhO2dCQUNnQiwyQkFBMkI7c0JBQS9ELE1BQU07dUJBQUMsbUJBQW1CO2dCQUdTLFNBQVM7c0JBQTVDLGVBQWU7dUJBQUMsaUJBQWlCO2dCQUNSLFVBQVU7c0JBQW5DLFNBQVM7dUJBQUMsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWZ0ZXJDb250ZW50SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBFdmVudEVtaXR0ZXIsIEluamVjdG9yLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsLCBPdXRwdXQsIFF1ZXJ5TGlzdCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlLCBQYXJhbXMsIFJvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHtUYWJsZX0gZnJvbSAncHJpbWVuZy90YWJsZSc7XG5pbXBvcnQge0xhenlMb2FkRXZlbnQsIFNvcnRNZXRhfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQge0ZpbHRlck1ldGFkYXRhfSBmcm9tICdwcmltZW5nL2FwaS9maWx0ZXJtZXRhZGF0YSc7XG5pbXBvcnQge09ic2VydmFibGUsIG9mLCBSZXBsYXlTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtmaW5hbGl6ZSwgZmlyc3QsIG1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuaW1wb3J0IHtNZWRpdXNRdWVyeVBhcmFtLCBNZWRpdXNRdWVyeVBhcmFtQnVpbGRlciwgTWVkaXVzUXVlcnlSZXN1bHR9IGZyb20gJy4uLy4uLy4uL2FwaS9tb2RlbHMnO1xuaW1wb3J0IHtNZWRpdXNSZXN0VXRpbH0gZnJvbSAnLi4vLi4vLi4vYXBpL3V0aWxzJztcblxuaW1wb3J0IHtDb2x1bW5EZXNjcmlwdG9yLCBGaWx0ZXJEZXNjcmlwdG9yLCBUYWJsZURlc2NyaXB0b3J9IGZyb20gJy4uLy4uLy4uL21vZGVscy9kZXNjcmlwdG9ycyc7XG5pbXBvcnQge0lUYWJsZURhdGFQcm92aWRlcn0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3Byb3ZpZGVycyc7XG5pbXBvcnQge01uZ1RhYmxlQ2VsbENsaWNrRXZlbnQsIE1uZ1RhYmxlTG9hZEV2ZW50fSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZXZlbnRzJztcbmltcG9ydCB7VGVtcGxhdGVEaXJlY3RpdmV9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZXMnO1xuaW1wb3J0IHtUb2FzdFV0aWx9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3RvYXN0LnV0aWwnO1xuaW1wb3J0IHtUYWJsZXZpZXdDb21wb25lbnRTZXJ2aWNlfSBmcm9tICcuLi90YWJsZXZpZXcuY29tcG9uZW50LnNlcnZpY2UnO1xuaW1wb3J0IFR5cGVFbnVtID0gRmlsdGVyRGVzY3JpcHRvci5UeXBlRW51bTtcbmltcG9ydCBQYWdpbmF0aW9uTW9kZUVudW0gPSBUYWJsZURlc2NyaXB0b3IuUGFnaW5hdGlvbk1vZGVFbnVtO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ21uZy10YWJsZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbXBvbmVudDxULCBTPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcblxuICAgIHB1YmxpYyByZWFkb25seSBmaWx0ZXJEaXNwbGF5Um93OiBUYWJsZURlc2NyaXB0b3IuRmlsdGVyRGlzcGxheUVudW0gPSBUYWJsZURlc2NyaXB0b3IuRmlsdGVyRGlzcGxheUVudW0uUm93O1xuICAgIHB1YmxpYyByZWFkb25seSBmaWx0ZXJEaXNwbGF5TWVudTogVGFibGVEZXNjcmlwdG9yLkZpbHRlckRpc3BsYXlFbnVtID0gVGFibGVEZXNjcmlwdG9yLkZpbHRlckRpc3BsYXlFbnVtLk1lbnU7XG5cbiAgICAvLyBtZXRhZGF0YSBpbnB1dFxuICAgIEBJbnB1dCgpIHB1YmxpYyBkZXNjcmlwdG9yITogVGFibGVEZXNjcmlwdG9yPFQ+O1xuXG4gICAgLy8gZGF0YSBzb3VyY2UgaW5wdXRzXG4gICAgQElucHV0KCkgcHVibGljIGl0ZW1zPzogT2JzZXJ2YWJsZTxBcnJheTxUPj58QXJyYXk8VD47XG4gICAgQElucHV0KCkgcHVibGljIHF1ZXJ5UmVzdWx0PzogT2JzZXJ2YWJsZTxNZWRpdXNRdWVyeVJlc3VsdDxUPj58TWVkaXVzUXVlcnlSZXN1bHQ8VD47XG4gICAgQElucHV0KCkgcHVibGljIGxvYWRpbmc/OiBPYnNlcnZhYmxlPGJvb2xlYW4+fGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIGRhdGFQcm92aWRlcj86IElUYWJsZURhdGFQcm92aWRlcjxULCBhbnk+O1xuICAgIEBJbnB1dCgpIHB1YmxpYyB1c2VRdWVyeVBhcmFtcyA9IGZhbHNlO1xuXG4gICAgLy8gZXh0cmEgZmVhdHVyZXMgaW5wdXRcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0aW9uRW5hYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLy8gZXZlbnQgb3V0cHV0c1xuICAgIEBPdXRwdXQoJ29uTG9hZCcpIHByaXZhdGUgbG9hZEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8TW5nVGFibGVMb2FkRXZlbnQ+KCk7XG4gICAgQE91dHB1dCgnb25DZWxsQ2xpY2snKSBwcml2YXRlIGNlbGxDbGlja0V2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8TW5nVGFibGVDZWxsQ2xpY2tFdmVudDxUPj4oKTtcbiAgICBAT3V0cHV0KCdvblNlbGVjdGlvbkNoYW5nZScpIHByaXZhdGUgc2VsZWN0aW9uQ2hhbmdlRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxUPj4oKTtcblxuICAgIC8vIGNvbnRlbnQgYW5kIHZpZXcgcXVlcmllc1xuICAgIEBDb250ZW50Q2hpbGRyZW4oVGVtcGxhdGVEaXJlY3RpdmUpIHRlbXBsYXRlcyE6IFF1ZXJ5TGlzdDxUZW1wbGF0ZURpcmVjdGl2ZT47XG4gICAgQFZpZXdDaGlsZChUYWJsZSkgcHJpdmF0ZSBwcmltZVRhYmxlITogVGFibGU7XG5cbiAgICAvLyB0ZW1wbGF0ZXNcbiAgICBwdWJsaWMgY2FwdGlvblRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBwdWJsaWMgY29sdW1uQWN0aW9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLy8gZGF0YSBwcm92aWRlciBhbmQgaXRlbXNcbiAgICBwdWJsaWMgdXNlRGF0YVByb3ZpZGVyOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIHVzZVF1ZXJ5UGFyYW1zSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgcXVlcnlSZXN1bHQkPzogT2JzZXJ2YWJsZTxNZWRpdXNRdWVyeVJlc3VsdDxUPj47XG4gICAgcHVibGljIGxvYWRpbmckPzogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgICBwdWJsaWMgZGF0YVByb3ZpZGVySW5maW5pdGVTY3JvbGxJdGVtczogQXJyYXk8VD4gPSBbXTtcbiAgICBwcml2YXRlIGRhdGFQcm92aWRlclNlcnZpY2U6IGFueSA9IG51bGw7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJRdWVyeVJlc3VsdFN1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxNZWRpdXNRdWVyeVJlc3VsdDxUPj4oMSk7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJMb2FkaW5nU3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudD86IExhenlMb2FkRXZlbnQ7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJMYXRlc3RMYXp5TG9hZEV2ZW50VmVyc2lvbjogbnVtYmVyID0gMDtcbiAgICBwcml2YXRlIGRhdGFQcm92aWRlckxhdGVzdFF1ZXJ5UGFyYW0/OiBNZWRpdXNRdWVyeVBhcmFtO1xuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyTGF0ZXN0UXVlcnlQYXJhbVZlcnNpb246IG51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgICAvLyBwYWdpbmF0aW9uLCBzb3J0IGFuZCBmaWx0ZXJzXG4gICAgcHVibGljIHJlYWRvbmx5IHJvd3NQZXJQYWdlT3B0aW9ucyA9IFsyNSwgNTAsIDEwMF07XG4gICAgcHVibGljIHJvd3MgPSB0aGlzLnJvd3NQZXJQYWdlT3B0aW9uc1swXTtcbiAgICBwdWJsaWMgb2Zmc2V0ID0gMDtcbiAgICBwdWJsaWMgbXVsdGlTb3J0TWV0YTogU29ydE1ldGFbXXxudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgZmlsdGVyTWV0YWRhdGE6IHsgW3M6IHN0cmluZ106IEZpbHRlck1ldGFkYXRhIHwgRmlsdGVyTWV0YWRhdGFbXSB9ID0ge307XG4gICAgcHJpdmF0ZSBpc0ZpbHRlckNoYW5nZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGlzU29ydENoYW5nZWQgPSBmYWxzZTtcblxuICAgIC8vIGluZmluaXRlIHNjcm9sbFxuICAgIHB1YmxpYyBpbmZpbml0ZVNjcm9sbCA9IGZhbHNlO1xuICAgIHB1YmxpYyBzY3JvbGxIZWlnaHQ6ICdmbGV4J3xudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgcm93SGVpZ2h0OiBudW1iZXJ8bnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgc2VsZWN0aW9uOiBBcnJheTxUPiA9IFtdO1xuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgICBwcml2YXRlIGZpbHRlckRlc2NyaXB0b3JzOiBBcnJheTxGaWx0ZXJEZXNjcmlwdG9yPGFueT4+ID0gW107XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgdGFibGV2aWV3U2VydmljZTogVGFibGV2aWV3Q29tcG9uZW50U2VydmljZTxULCBTPlxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLmZpbHRlckRlc2NyaXB0b3JzID0gdGhpcy5kZXNjcmlwdG9yLmNvbHVtbnMuZmlsdGVyKGMgPT4gdHlwZW9mIGMuZmlsdGVyRGVzY3JpcHRvciAhPT0gJ3VuZGVmaW5lZCcpLm1hcChjID0+IGMuZmlsdGVyRGVzY3JpcHRvcik7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVzY3JpcHRvci5wYWdpbmF0aW9uTW9kZSA9PT0gUGFnaW5hdGlvbk1vZGVFbnVtLkluZmluaXRlU2Nyb2xsKSB7XG4gICAgICAgICAgICB0aGlzLmluZmluaXRlU2Nyb2xsID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsSGVpZ2h0ID0gJ2ZsZXgnO1xuICAgICAgICAgICAgdGhpcy5yb3dIZWlnaHQgPSB0aGlzLmRlc2NyaXB0b3Iucm93SGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy51c2VRdWVyeVBhcmFtcyA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgZGF0YSBwcm92aWRlciBpcyBzdXBwbGllZCwgaWYgaXMsIHVzZSBpdCBwcmltYXJpbHlcbiAgICAgICAgaWYgKHRoaXMuZGF0YVByb3ZpZGVyKSB7XG4gICAgICAgICAgICAvLyBtYXAgc3ViamVjdHMgdG8gb2JzZXJ2YWJsZXMgYW5kIGluaXRpYXRlIGRhdGFcbiAgICAgICAgICAgIHRoaXMudXNlRGF0YVByb3ZpZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucXVlcnlSZXN1bHQkID0gdGhpcy5kYXRhUHJvdmlkZXJRdWVyeVJlc3VsdFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmckID0gdGhpcy5kYXRhUHJvdmlkZXJMb2FkaW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICAgICAgICAgIGNvbnN0IGVtcHR5UXVlcnlSZXN1bHQgPSBuZXcgTWVkaXVzUXVlcnlSZXN1bHQ8VD4oKTtcbiAgICAgICAgICAgIGVtcHR5UXVlcnlSZXN1bHQucGFnZURhdGEgPSBbXTtcbiAgICAgICAgICAgIGVtcHR5UXVlcnlSZXN1bHQuYWxsRGF0YUNvdW50ID0gMDtcbiAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlclF1ZXJ5UmVzdWx0U3ViamVjdC5uZXh0KGVtcHR5UXVlcnlSZXN1bHQpXG5cbiAgICAgICAgICAgIC8vIGluamVjdCBzZXJ2aWNlXG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhUHJvdmlkZXIuc2VydmljZVR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlclNlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldDxhbnk+KHRoaXMuZGF0YVByb3ZpZGVyLnNlcnZpY2VUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGlmIHF1ZXJ5IHJlc3VsdCBpcyBwcm92aWRlZCwgdXNlIGl0IGFzIHNlY29uZGFyeSBzb3VyY2Ugb3IgZWxzZSB0cnkgdG8gdXNlIGl0ZW1zXG4gICAgICAgICAgICBpZiAodGhpcy5xdWVyeVJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnlSZXN1bHQkID0gdGhpcy5xdWVyeVJlc3VsdCBpbnN0YW5jZW9mIE9ic2VydmFibGUgPyB0aGlzLnF1ZXJ5UmVzdWx0IDogb2YodGhpcy5xdWVyeVJlc3VsdCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLnF1ZXJ5UmVzdWx0ICYmIHRoaXMuaXRlbXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5UmVzdWx0JCA9ICh0aGlzLml0ZW1zIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSA/IHRoaXMuaXRlbXMgOiBvZih0aGlzLml0ZW1zKSkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgLy8gZGlzdGluY3RVbnRpbENoYW5nZWQoKHYxLCB2MikgPT4gdjEubGVuZ3RoID09PSB2Mi5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHYxLmV2ZXJ5KCh2MWksIGlkeCkgPT4gdjFpW3RoaXMuZGVzY3JpcHRvci5kYXRhS2V5UHJvcGVydHldID09PSB2MltpZHhdW3RoaXMuZGVzY3JpcHRvci5kYXRhS2V5UHJvcGVydHldKSksXG4gICAgICAgICAgICAgICAgICAgIG1hcChpdGVtcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWVyeVJlc3VsdCA9IG5ldyBNZWRpdXNRdWVyeVJlc3VsdDxUPigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSZXN1bHQucGFnZURhdGEgPSBpdGVtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UmVzdWx0LmFsbERhdGFDb3VudCA9IGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBxdWVyeVJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmxvYWRpbmcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nJCA9IHRoaXMubG9hZGluZyBpbnN0YW5jZW9mIE9ic2VydmFibGUgPyB0aGlzLmxvYWRpbmcgOiBvZih0aGlzLmxvYWRpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudXNlUXVlcnlQYXJhbXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuYWN0aXZhdGVkUm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKHFwID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRUYWJsZUZyb21Sb3V0ZVVwZGF0ZShxcCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpbml0aWFsaXplIGRlZmF1bHQgc29ydCBpZiBwcmVzZW50XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0U29ydCA9IHRoaXMuZ2V0RGVmYXVsdFNvcnRNZXRhKCk7XG4gICAgICAgICAgICBpZiAoZGVmYXVsdFNvcnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMubXVsdGlTb3J0TWV0YSA9IGRlZmF1bHRTb3J0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZXMuZm9yRWFjaCh0ZW1wbGF0ZSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2godGVtcGxhdGUuZ2V0VHlwZSgpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY2FwdGlvbic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FwdGlvblRlbXBsYXRlID0gdGVtcGxhdGUudGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbHVtbkFjdGlvbic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uQWN0aW9uVGVtcGxhdGUgPSB0ZW1wbGF0ZS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWxvYWQoZW1pdEV2ZW50OiBib29sZWFuID0gZmFsc2UsIHJlc2V0UGFyYW1zOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5sb2FkVGFibGVXaXRoRGF0YVByb3ZpZGVyKHJlc2V0UGFyYW1zXG4gICAgICAgICAgICA/IE1lZGl1c1F1ZXJ5UGFyYW1CdWlsZGVyLmNyZWF0ZSh0aGlzLnJvd3NQZXJQYWdlT3B0aW9uc1swXSwgMCkuYnVpbGQoKVxuICAgICAgICAgICAgOiAodGhpcy5kYXRhUHJvdmlkZXJMYXRlc3RRdWVyeVBhcmFtID8/IG5ldyBNZWRpdXNRdWVyeVBhcmFtKCkpLCBlbWl0RXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblRhYmxlTGF6eUxvYWQoZXZlbnQ6IExhenlMb2FkRXZlbnQpIHtcbiAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJMYXRlc3RMYXp5TG9hZEV2ZW50ID0gZXZlbnQ7XG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudFZlcnNpb24rKztcblxuICAgICAgICBpZiAodGhpcy51c2VRdWVyeVBhcmFtcykge1xuICAgICAgICAgICAgaWYgKCFldmVudC5tdWx0aVNvcnRNZXRhIHx8IGV2ZW50Lm11bHRpU29ydE1ldGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gYWRkIGRlZmF1bHQgc29ydCBtZXRhIHRvIGV2ZW50IGlmIG5vdCBtdWx0aXNvcnQgbWV0YSBpcyBwcmVzZW50XG4gICAgICAgICAgICAgICAgZXZlbnQubXVsdGlTb3J0TWV0YSA9IHRoaXMuZ2V0RGVmYXVsdFNvcnRNZXRhKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwge1xuICAgICAgICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMuYWN0aXZhdGVkUm91dGUsXG4gICAgICAgICAgICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBxdWVyeVBhcmFtczogTWVkaXVzUmVzdFV0aWwuZnJvbVByaW1lTGF6eUxvYWRFdmVudFRvQW5ndWxhclF1ZXJ5UGFyYW1zKGV2ZW50LCB0aGlzLnJvd3NQZXJQYWdlT3B0aW9uc1swXSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbWVkaXVzUXVlcnlQYXJhbXMgPSBldmVudCA/IE1lZGl1c1Jlc3RVdGlsLmZyb21QcmltZUxhenlMb2FkRXZlbnRUb01lZGl1c1F1ZXJ5UGFyYW1zKGV2ZW50KSA6IG5ldyBNZWRpdXNRdWVyeVBhcmFtKCk7XG4gICAgICAgICAgICB0aGlzLmxvYWRUYWJsZVdpdGhEYXRhUHJvdmlkZXIobWVkaXVzUXVlcnlQYXJhbXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uVGFibGVTb3J0KGV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5pc1NvcnRDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25UYWJsZUZpbHRlcihldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMuaXNGaWx0ZXJDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25DZWxsQ2xpY2soY29sOiBDb2x1bW5EZXNjcmlwdG9yPGFueSwgVD4sIGl0ZW06IFQsIGlkeDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG1uZ0V2ZW50ID0gbmV3IE1uZ1RhYmxlQ2VsbENsaWNrRXZlbnQ8VD4oY29sLCBpdGVtLCBpZHgpO1xuICAgICAgICB0aGlzLmNlbGxDbGlja0V2ZW50RW1pdHRlci5uZXh0KG1uZ0V2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25TZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IEFycmF5PFQ+KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlRXZlbnRFbWl0dGVyLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9hZFRhYmxlV2l0aERhdGFQcm92aWRlcihxdWVyeVBhcmFtOiBNZWRpdXNRdWVyeVBhcmFtfG51bGwgPSBudWxsLCBlbWl0RXZlbnQ6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgICAgIGlmICghdGhpcy51c2VEYXRhUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhUHJvdmlkZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRhdGFQcm92aWRlckxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG5cbiAgICAgICAgaWYgKCFxdWVyeVBhcmFtKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtID0gTWVkaXVzUXVlcnlQYXJhbUJ1aWxkZXIuY3JlYXRlKHRoaXMucm93c1BlclBhZ2VPcHRpb25zWzBdKS5idWlsZCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0UXVlcnlQYXJhbSA9IHF1ZXJ5UGFyYW07XG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0UXVlcnlQYXJhbVZlcnNpb24rKztcblxuICAgICAgICB0aGlzLmRhdGFQcm92aWRlclN1YnNjcmlwdGlvbiA9IHRoaXMuZGF0YVByb3ZpZGVyPy5nZXRBbGwocXVlcnlQYXJhbSwgdGhpcy5kYXRhUHJvdmlkZXJTZXJ2aWNlKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlyc3QoKSxcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLmRhdGFQcm92aWRlckxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5maW5pdGVTY3JvbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNGaWx0ZXJDaGFuZ2VkIHx8IHRoaXMuaXNTb3J0Q2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJJbmZpbml0ZVNjcm9sbEl0ZW1zID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlckluZmluaXRlU2Nyb2xsSXRlbXMuc3BsaWNlKHF1ZXJ5UGFyYW0uaXRlbXNPZmZzZXQgPz8gMCwgcXVlcnlQYXJhbS5pdGVtc1BlclBhZ2UgPz8gdGhpcy5yb3dzLCAuLi5yZXMucGFnZURhdGEpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVySW5maW5pdGVTY3JvbGxJdGVtcyA9IFsuLi50aGlzLmRhdGFQcm92aWRlckluZmluaXRlU2Nyb2xsSXRlbXNdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyUXVlcnlSZXN1bHRTdWJqZWN0Lm5leHQocmVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pc0ZpbHRlckNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzU29ydENoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0sIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgVG9hc3RVdGlsLnRhYmxlTm90aWZpY2F0aW9uRXJyb3IodGhpcy50cmFuc2xhdGUsIHRoaXMuZGVzY3JpcHRvciwgZXJyLCB0aGlzLnRhYmxldmlld1NlcnZpY2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVtcHR5UXVlcnlSZXN1bHQgPSBuZXcgTWVkaXVzUXVlcnlSZXN1bHQ8VD4oKTtcbiAgICAgICAgICAgICAgICBlbXB0eVF1ZXJ5UmVzdWx0LnBhZ2VEYXRhID0gW107XG4gICAgICAgICAgICAgICAgZW1wdHlRdWVyeVJlc3VsdC5hbGxEYXRhQ291bnQgPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyUXVlcnlSZXN1bHRTdWJqZWN0Lm5leHQoZW1wdHlRdWVyeVJlc3VsdCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBpZiAoZW1pdEV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBtbmdFdmVudCA9IG5ldyBNbmdUYWJsZUxvYWRFdmVudCgpO1xuICAgICAgICAgICAgbW5nRXZlbnQub3JpZ2luYWxFdmVudCA9IHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudCA/PyB1bmRlZmluZWQ7XG4gICAgICAgICAgICBtbmdFdmVudC5xdWVyeVBhcmFtID0gcXVlcnlQYXJhbTtcbiAgICAgICAgICAgIHRoaXMubG9hZEV2ZW50RW1pdHRlci5uZXh0KG1uZ0V2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbG9hZFRhYmxlRnJvbVJvdXRlVXBkYXRlKHBhcmFtczogUGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IG1lZGl1c1F1ZXJ5UGFyYW0gPSBNZWRpdXNSZXN0VXRpbC5mcm9tQW5ndWxhclF1ZXJ5UGFyYW1zVG9NZWRpdXNRdWVyeVBhcmFtcyhwYXJhbXMsIHRoaXMuZmlsdGVyRGVzY3JpcHRvcnMsIHRoaXMucm93c1BlclBhZ2VPcHRpb25zWzBdKTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudFZlcnNpb24gPCB0aGlzLmRhdGFQcm92aWRlckxhdGVzdFF1ZXJ5UGFyYW1WZXJzaW9uICsgMSkge1xuICAgICAgICAgICAgLy8gdXBkYXRlIG9ubHkgaWYgbmV3IHZlcnNpb24gZnJvbSBxdWVyeSBwYXJhbXMgd2lsbCBiZSBoaWdoZXJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUHJpbWVTb3J0QW5kRmlsdGVyKG1lZGl1c1F1ZXJ5UGFyYW0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlUXVlcnlQYXJhbXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIHRoaXMubG9hZFRhYmxlV2l0aERhdGFQcm92aWRlcihtZWRpdXNRdWVyeVBhcmFtKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVByaW1lU29ydEFuZEZpbHRlcihtZWRpdXNRdWVyeVBhcmFtOiBNZWRpdXNRdWVyeVBhcmFtKSB7XG4gICAgICAgIGNvbnN0IHByaW1lU29ydE1ldGE6IFNvcnRNZXRhW10gPSBbXTtcbiAgICAgICAgY29uc3QgcHJpbWVGaWx0ZXJNZXRhOiB7IFtzOiBzdHJpbmddOiBGaWx0ZXJNZXRhZGF0YSB8IEZpbHRlck1ldGFkYXRhW10gfSA9IHt9O1xuXG4gICAgICAgIHRoaXMuZmlsdGVyRGVzY3JpcHRvcnMuZm9yRWFjaChmID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHByaW1lRmlsdGVyTWV0YVtmLnByb3BlcnR5XSA9IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICBtYXRjaE1vZGU6IGYuZmlsdGVyVHlwZSA9PT0gVHlwZUVudW0uU3RyaW5nID8gJ2NvbnRhaW5zJyA6ICdlcXVhbHMnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICBtZWRpdXNRdWVyeVBhcmFtPy5zb3J0UHJvcGVydHk/LmZvckVhY2goKHMsIGlkeCkgPT4ge1xuICAgICAgICAgICAgcHJpbWVTb3J0TWV0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICBmaWVsZDogcyxcbiAgICAgICAgICAgICAgICBvcmRlcjogKG1lZGl1c1F1ZXJ5UGFyYW0/LnNvcnRBc2M/LltpZHhdID8/IHRydWUpID8gMSA6IC0xXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbWVkaXVzUXVlcnlQYXJhbT8uZmlsdGVyUGFyYW1zPy5mb3JFYWNoKChmLCBpZHgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB0aGlzLmZpbHRlckRlc2NyaXB0b3JzLmZpbmQoZmQgPT4gZmQuZmlsdGVyUHJvcGVydHkgPT09IGYucHJvcGVydHkgfHwgZmQucHJvcGVydHkgPT09IGYucHJvcGVydHkpO1xuICAgICAgICAgICAgY29uc3Qgb3BlcmF0b3IgPSBNZWRpdXNSZXN0VXRpbC5tYXRjaE1vZGVNYXBwaW5nLmZpbmQobWFwcGluZyA9PiBtYXBwaW5nWzJdID09PSBmLmZpbHRlck1hdGNoVHlwZSk7XG4gICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAmJiBvcGVyYXRvcikge1xuICAgICAgICAgICAgICAgIHByaW1lRmlsdGVyTWV0YVtkZXNjcmlwdG9yLnByb3BlcnR5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGYuZmlsdGVyVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoTW9kZTogb3BlcmF0b3JbMF1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm11bHRpU29ydE1ldGEgPSBwcmltZVNvcnRNZXRhO1xuICAgICAgICB0aGlzLmZpbHRlck1ldGFkYXRhID0gcHJpbWVGaWx0ZXJNZXRhO1xuICAgICAgICB0aGlzLnJvd3MgPSBtZWRpdXNRdWVyeVBhcmFtPy5pdGVtc1BlclBhZ2UgPz8gdGhpcy5yb3dzUGVyUGFnZU9wdGlvbnNbMF07XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gbWVkaXVzUXVlcnlQYXJhbT8uaXRlbXNPZmZzZXQgPz8gMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERlZmF1bHRTb3J0TWV0YSgpOiBTb3J0TWV0YVtdIHtcbiAgICAgICAgaWYgKHRoaXMuZGVzY3JpcHRvci5oYXNEZWZhdWx0U29ydCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRvci5kZWZhdWx0U29ydFByb3BlcnR5Lm1hcCgocCwgaWR4KSA9PiA8U29ydE1ldGE+e1xuICAgICAgICAgICAgICAgIGZpZWxkOiBwLFxuICAgICAgICAgICAgICAgIG9yZGVyOiB0aGlzLmRlc2NyaXB0b3IuZGVmYXVsdFNvcnRBc2NbaWR4XSA/IDEgOiAtMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2IFtzdHlsZS5oZWlnaHRdPVwic2Nyb2xsSGVpZ2h0ID09PSAnZmxleCcgPyAnY2FsYygxMDB2aCAtICcgKyBkZXNjcmlwdG9yLnRhYmxlRnVsbEhlaWdodE9mZnNldCArICdweCknIDogbnVsbFwiPlxuICAgIDwhLS0gTVVTVCBOT1QgdXNlIG9ic2VydmFibGUgZm9yIHZhbHVlIHdoZW4gdXNpbmcgdmlydHVhbCBzY3JvbGwgLSBkb2VzIG5vdCB3b3JrIGZvciBzb21lIHJlYXNvbiAtLT5cbiAgICA8cC10YWJsZSAqbmdJZj1cIiF1c2VRdWVyeVBhcmFtcyB8fCB1c2VRdWVyeVBhcmFtc0luaXRpYWxpemVkXCJcbiAgICAgICAgICAgICBbdmFsdWVdPVwiaW5maW5pdGVTY3JvbGwgPyBkYXRhUHJvdmlkZXJJbmZpbml0ZVNjcm9sbEl0ZW1zIDogKChxdWVyeVJlc3VsdCQgfCBhc3luYyk/LnBhZ2VEYXRhID8/IFtdKVwiXG4gICAgICAgICAgICAgW2RhdGFLZXldPVwiJGFueShkZXNjcmlwdG9yLmRhdGFLZXlQcm9wZXJ0eSlcIlxuICAgICAgICAgICAgIFtsYXp5XT1cInVzZURhdGFQcm92aWRlclwiXG4gICAgICAgICAgICAgW2xvYWRpbmddPVwiKGxvYWRpbmckIHwgYXN5bmMpID8/IGZhbHNlXCJcbiAgICAgICAgICAgICBbcGFnaW5hdG9yXT1cInVzZURhdGFQcm92aWRlciAmJiAhaW5maW5pdGVTY3JvbGxcIlxuICAgICAgICAgICAgIFtyb3dzXT1cIiRhbnkoaW5maW5pdGVTY3JvbGwgPyAyMCA6IHJvd3MpXCJcbiAgICAgICAgICAgICBbZmlyc3RdPVwiJGFueShpbmZpbml0ZVNjcm9sbCA/IDAgOiBvZmZzZXQpXCJcbiAgICAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cIiRhbnkoaW5maW5pdGVTY3JvbGwgPyBudWxsIDogKHF1ZXJ5UmVzdWx0JCB8IGFzeW5jKT8uYWxsRGF0YUNvdW50ID8/IDApXCJcbiAgICAgICAgICAgICBbcm93c1BlclBhZ2VPcHRpb25zXT1cIiRhbnkoaW5maW5pdGVTY3JvbGwgPyBudWxsIDogcm93c1BlclBhZ2VPcHRpb25zKVwiXG4gICAgICAgICAgICAgW3Nob3dDdXJyZW50UGFnZVJlcG9ydF09XCIhaW5maW5pdGVTY3JvbGxcIlxuICAgICAgICAgICAgIFtjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlXT1cIidtbmdUYWJsZS5wYWdpbmF0aW9uTXNnJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgW211bHRpU29ydE1ldGFdPVwiJGFueShtdWx0aVNvcnRNZXRhKVwiXG4gICAgICAgICAgICAgW2ZpbHRlcnNdPVwiZmlsdGVyTWV0YWRhdGFcIlxuICAgICAgICAgICAgIFsoc2VsZWN0aW9uKV09XCJzZWxlY3Rpb25cIlxuICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgW3Njcm9sbGFibGVdPVwiaW5maW5pdGVTY3JvbGxcIlxuICAgICAgICAgICAgIFt2aXJ0dWFsU2Nyb2xsXT1cImluZmluaXRlU2Nyb2xsXCJcbiAgICAgICAgICAgICBbdmlydHVhbFJvd0hlaWdodF09XCIkYW55KHJvd0hlaWdodClcIlxuICAgICAgICAgICAgIFtzY3JvbGxIZWlnaHRdPVwiJGFueShzY3JvbGxIZWlnaHQpXCJcbiAgICAgICAgICAgICBbcm93SG92ZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgKG9uTGF6eUxvYWQpPVwib25UYWJsZUxhenlMb2FkKCRldmVudClcIlxuICAgICAgICAgICAgIChvblNvcnQpPVwib25UYWJsZVNvcnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgKG9uRmlsdGVyKT1cIm9uVGFibGVGaWx0ZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgc29ydE1vZGU9XCJtdWx0aXBsZVwiXG4gICAgICAgICAgICAgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImNhcHRpb25UZW1wbGF0ZSB8fCBkZXNjcmlwdG9yLnRpdGxlXCIgcFRlbXBsYXRlPVwiY2FwdGlvblwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhcHRpb25UZW1wbGF0ZTsgZWxzZSBkZWZhdWx0Q2FwdGlvblwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjYXB0aW9uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Q2FwdGlvbj5cbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJwLW0tMFwiPnt7IGRlc2NyaXB0b3IudGl0bGUgfX08L2g1PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwic2VsZWN0aW9uRW5hYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8cC10YWJsZUhlYWRlckNoZWNrYm94PjwvcC10YWJsZUhlYWRlckNoZWNrYm94PlxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGRlc2NyaXB0b3IuY29sdW1uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJjb2wuaXNTb3J0RW5hYmxlZFwiIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLnByb3BlcnR5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBkZXNjcmlwdG9yLm1vZGVsLnR5cGVOYW1lICsgXCIucHJvcGVydGllcy5cIiArIGNvbC5wcm9wZXJ0eSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLXNvcnRJY29uIFtmaWVsZF09XCJjb2wucHJvcGVydHlcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1uZy10YWJsZS1jb2x1bW4tZmlsdGVyICpuZ0lmPVwiY29sLmZpbHRlckRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci5maWx0ZXJEaXNwbGF5ID09PSBmaWx0ZXJEaXNwbGF5TWVudVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWwtYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5XT1cImRlc2NyaXB0b3IuZmlsdGVyRGlzcGxheVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZXNjcmlwdG9yXT1cImNvbC5maWx0ZXJEZXNjcmlwdG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tbmctdGFibGUtY29sdW1uLWZpbHRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCIhY29sLmlzU29ydEVuYWJsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRlc2NyaXB0b3IubW9kZWwudHlwZU5hbWUgKyBcIi5wcm9wZXJ0aWVzLlwiICsgY29sLnByb3BlcnR5IHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtbmctdGFibGUtY29sdW1uLWZpbHRlciAqbmdJZj1cImNvbC5maWx0ZXJEZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZmlsdGVyRGlzcGxheSA9PT0gZmlsdGVyRGlzcGxheU1lbnVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1sLWF1dG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheV09XCJkZXNjcmlwdG9yLmZpbHRlckRpc3BsYXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVzY3JpcHRvcl09XCJjb2wuZmlsdGVyRGVzY3JpcHRvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbW5nLXRhYmxlLWNvbHVtbi1maWx0ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJjb2x1bW5BY3Rpb25UZW1wbGF0ZVwiPjwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPHRyICpuZ0lmPVwiZGVzY3JpcHRvci5maWx0ZXJEaXNwbGF5ID09PSBmaWx0ZXJEaXNwbGF5Um93XCI+XG4gICAgICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBjb2wgb2YgZGVzY3JpcHRvci5jb2x1bW5zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCIgKm5nSWY9XCJjb2wuZmlsdGVyRGVzY3JpcHRvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1uZy10YWJsZS1jb2x1bW4tZmlsdGVyIFtkaXNwbGF5XT1cImRlc2NyaXB0b3IuZmlsdGVyRGlzcGxheVwiIFtkZXNjcmlwdG9yXT1cImNvbC5maWx0ZXJEZXNjcmlwdG9yXCI+PC9tbmctdGFibGUtY29sdW1uLWZpbHRlcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJjb2x1bW5BY3Rpb25UZW1wbGF0ZVwiPjwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWl0ZW0gbGV0LWlkeD1cInJvd0luZGV4XCI+XG4gICAgICAgICAgICA8dHIgW3N0eWxlLmhlaWdodC5weF09XCJkZXNjcmlwdG9yLnJvd0hlaWdodFwiPlxuICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInNlbGVjdGlvbkVuYWJsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAtdGFibGVDaGVja2JveCBbdmFsdWVdPVwiaXRlbVwiPjwvcC10YWJsZUNoZWNrYm94PlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBjb2wgb2YgZGVzY3JpcHRvci5jb2x1bW5zXCIgKGNsaWNrKT1cIm9uQ2VsbENsaWNrKGNvbCwgaXRlbSwgaWR4KVwiIGNsYXNzPVwiY2xpY2thYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtbmctdGFibGUtY29sdW1uLXZhbHVlIFtkZXNjcmlwdG9yXT1cImNvbFwiIFtpdGVtXT1cIml0ZW1cIj48L21uZy10YWJsZS1jb2x1bW4tdmFsdWU+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJjb2x1bW5BY3Rpb25UZW1wbGF0ZVwiIGNsYXNzPVwidGV4dC1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29sdW1uQWN0aW9uVGVtcGxhdGU7IGNvbnRleHQ6IHsgcm93SXRlbTogaXRlbSwgcm93SW5kZXg6IGlkeCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImxvYWRpbmdib2R5XCI+XG4gICAgICAgICAgICA8dHIgW3N0eWxlLmhlaWdodC5weF09XCJkZXNjcmlwdG9yLnJvd0hlaWdodFwiPlxuICAgICAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cImRlc2NyaXB0b3IuY29sdW1ucy5sZW5ndGggKyAoY29sdW1uQWN0aW9uVGVtcGxhdGUgPyAxIDogMCkgKyAoc2VsZWN0aW9uRW5hYmxlZCA/IDEgOiAwKVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy10ZXh0XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxwLXNrZWxldG9uIFtuZ1N0eWxlXT1cInsnd2lkdGgnOiAnMTAwJSd9XCI+PC9wLXNrZWxldG9uPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cbiAgICAgICAgICAgIDx0ciBbc3R5bGUuaGVpZ2h0LnB4XT1cInJvd0hlaWdodFwiPlxuICAgICAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cImRlc2NyaXB0b3IuY29sdW1ucy5sZW5ndGggKyAoY29sdW1uQWN0aW9uVGVtcGxhdGUgPyAxIDogMCkgKyAoc2VsZWN0aW9uRW5hYmxlZCA/IDEgOiAwKVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAnbW5nVGFibGUubm9JdGVtcycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L3AtdGFibGU+XG48L2Rpdj5cbiJdfQ==
1
+ import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Input, Optional, Output, ViewChild } from '@angular/core';
2
+ import { Table } from 'primeng/table';
3
+ import { Observable, of, ReplaySubject } from 'rxjs';
4
+ import { finalize, first, map } from 'rxjs/operators';
5
+ import { MediusQueryParam, MediusQueryParamBuilder, MediusQueryResult } from '../../../api/models';
6
+ import { MediusRestUtil } from '../../../api/utils';
7
+ import { FilterDescriptor, TableDescriptor } from '../../../descriptors';
8
+ import { MngTableCellClickEvent, MngTableLoadEvent } from '../models';
9
+ import { MngTemplateDirective } from '../../../directives';
10
+ import { ToastUtil } from '../../../utils';
11
+ var TypeEnum = FilterDescriptor.TypeEnum;
12
+ var PaginationModeEnum = TableDescriptor.PaginationModeEnum;
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "@angular/router";
15
+ import * as i2 from "@ngx-translate/core";
16
+ import * as i3 from "../services";
17
+ import * as i4 from "primeng/table";
18
+ import * as i5 from "./column-filter/column-filter.component";
19
+ import * as i6 from "./column-value/column-value.component";
20
+ import * as i7 from "primeng/skeleton";
21
+ import * as i8 from "@angular/common";
22
+ import * as i9 from "primeng/api";
23
+ export class MngTableComponent {
24
+ constructor(injector, router, activatedRoute, translate, tableviewService) {
25
+ this.injector = injector;
26
+ this.router = router;
27
+ this.activatedRoute = activatedRoute;
28
+ this.translate = translate;
29
+ this.tableviewService = tableviewService;
30
+ this.filterDisplayRow = TableDescriptor.FilterDisplayEnum.Row;
31
+ this.filterDisplayMenu = TableDescriptor.FilterDisplayEnum.Menu;
32
+ this.useQueryParams = false;
33
+ // extra features input
34
+ this.selectionEnabled = false;
35
+ // event outputs
36
+ this.loadEventEmitter = new EventEmitter();
37
+ this.cellClickEventEmitter = new EventEmitter();
38
+ this.selectionChangeEventEmitter = new EventEmitter();
39
+ // data provider and items
40
+ this.useDataProvider = false;
41
+ this.useQueryParamsInitialized = false;
42
+ this.dataProviderInfiniteScrollItems = [];
43
+ this.dataProviderService = null;
44
+ this.dataProviderQueryResultSubject = new ReplaySubject(1);
45
+ this.dataProviderLoadingSubject = new ReplaySubject(1);
46
+ this.dataProviderLatestLazyLoadEventVersion = 0;
47
+ this.dataProviderLatestQueryParamVersion = 0;
48
+ // pagination, sort and filters
49
+ this.rowsPerPageOptions = [25, 50, 100];
50
+ this.rows = this.rowsPerPageOptions[0];
51
+ this.offset = 0;
52
+ this.multiSortMeta = null;
53
+ this.filterMetadata = {};
54
+ this.isFilterChanged = false;
55
+ this.isSortChanged = false;
56
+ // infinite scroll
57
+ this.infiniteScroll = false;
58
+ this.scrollHeight = null;
59
+ this.rowHeight = null;
60
+ this.selection = [];
61
+ this.subscriptions = [];
62
+ this.filterDescriptors = [];
63
+ }
64
+ ngOnInit() {
65
+ // @ts-ignore
66
+ this.filterDescriptors = this.descriptor.columns.filter(c => typeof c.filterDescriptor !== 'undefined').map(c => c.filterDescriptor);
67
+ if (this.descriptor.paginationMode === PaginationModeEnum.InfiniteScroll) {
68
+ this.infiniteScroll = true;
69
+ this.scrollHeight = 'flex';
70
+ this.rowHeight = this.descriptor.rowHeight;
71
+ this.useQueryParams = false;
72
+ }
73
+ // check if data provider is supplied, if is, use it primarily
74
+ if (this.dataProvider) {
75
+ // map subjects to observables and initiate data
76
+ this.useDataProvider = true;
77
+ this.queryResult$ = this.dataProviderQueryResultSubject.asObservable();
78
+ this.loading$ = this.dataProviderLoadingSubject.asObservable();
79
+ const emptyQueryResult = new MediusQueryResult();
80
+ emptyQueryResult.pageData = [];
81
+ emptyQueryResult.allDataCount = 0;
82
+ this.dataProviderLoadingSubject.next(false);
83
+ this.dataProviderQueryResultSubject.next(emptyQueryResult);
84
+ // inject service
85
+ if (this.dataProvider.serviceType) {
86
+ this.dataProviderService = this.injector.get(this.dataProvider.serviceType);
87
+ }
88
+ }
89
+ else {
90
+ // if query result is provided, use it as secondary source or else try to use items
91
+ if (this.queryResult) {
92
+ this.queryResult$ = this.queryResult instanceof Observable ? this.queryResult : of(this.queryResult);
93
+ }
94
+ else if (!this.queryResult && this.items) {
95
+ this.queryResult$ = (this.items instanceof Observable ? this.items : of(this.items)).pipe(
96
+ // distinctUntilChanged((v1, v2) => v1.length === v2.length &&
97
+ // v1.every((v1i, idx) => v1i[this.descriptor.dataKeyProperty] === v2[idx][this.descriptor.dataKeyProperty])),
98
+ map(items => {
99
+ const queryResult = new MediusQueryResult();
100
+ queryResult.pageData = items;
101
+ queryResult.allDataCount = items.length;
102
+ return queryResult;
103
+ }));
104
+ }
105
+ if (typeof this.loading !== 'undefined') {
106
+ this.loading$ = this.loading instanceof Observable ? this.loading : of(this.loading);
107
+ }
108
+ }
109
+ if (this.useQueryParams) {
110
+ const subscription = this.activatedRoute.queryParams.subscribe(qp => {
111
+ this.loadTableFromRouteUpdate(qp);
112
+ });
113
+ this.subscriptions.push(subscription);
114
+ }
115
+ else {
116
+ // initialize default sort if present
117
+ const defaultSort = this.getDefaultSortMeta();
118
+ if (defaultSort.length > 0) {
119
+ this.multiSortMeta = defaultSort;
120
+ }
121
+ }
122
+ }
123
+ ngAfterContentInit() {
124
+ this.templates.forEach(template => {
125
+ switch (template.getType()) {
126
+ case 'caption':
127
+ this.captionTemplate = template.template;
128
+ break;
129
+ case 'columnAction':
130
+ this.columnActionTemplate = template.template;
131
+ break;
132
+ }
133
+ });
134
+ }
135
+ ngOnDestroy() {
136
+ this.subscriptions.forEach(s => s.unsubscribe());
137
+ }
138
+ reload(emitEvent = false, resetParams = false) {
139
+ this.loadTableWithDataProvider(resetParams
140
+ ? MediusQueryParamBuilder.create(this.rowsPerPageOptions[0], 0).build()
141
+ : (this.dataProviderLatestQueryParam ?? new MediusQueryParam()), emitEvent);
142
+ }
143
+ onTableLazyLoad(event) {
144
+ this.dataProviderLatestLazyLoadEvent = event;
145
+ this.dataProviderLatestLazyLoadEventVersion++;
146
+ if (this.useQueryParams) {
147
+ if (!event.multiSortMeta || event.multiSortMeta.length === 0) {
148
+ // add default sort meta to event if not multisort meta is present
149
+ event.multiSortMeta = this.getDefaultSortMeta();
150
+ }
151
+ this.router.navigate([], {
152
+ relativeTo: this.activatedRoute,
153
+ replaceUrl: true,
154
+ queryParams: MediusRestUtil.fromPrimeLazyLoadEventToAngularQueryParams(event, this.rowsPerPageOptions[0])
155
+ });
156
+ }
157
+ else {
158
+ const mediusQueryParams = event ? MediusRestUtil.fromPrimeLazyLoadEventToMediusQueryParams(event) : new MediusQueryParam();
159
+ this.loadTableWithDataProvider(mediusQueryParams);
160
+ }
161
+ }
162
+ onTableSort(event) {
163
+ this.isSortChanged = true;
164
+ }
165
+ onTableFilter(event) {
166
+ this.isFilterChanged = true;
167
+ }
168
+ onCellClick(col, item, idx) {
169
+ const mngEvent = new MngTableCellClickEvent(col, item, idx);
170
+ this.cellClickEventEmitter.next(mngEvent);
171
+ }
172
+ onSelectionChange(event) {
173
+ this.selectionChangeEventEmitter.emit(event);
174
+ }
175
+ loadTableWithDataProvider(queryParam = null, emitEvent = true) {
176
+ if (!this.useDataProvider) {
177
+ return;
178
+ }
179
+ if (this.dataProviderSubscription) {
180
+ this.dataProviderSubscription.unsubscribe();
181
+ }
182
+ this.dataProviderLoadingSubject.next(true);
183
+ if (!queryParam) {
184
+ queryParam = MediusQueryParamBuilder.create(this.rowsPerPageOptions[0]).build();
185
+ }
186
+ this.dataProviderLatestQueryParam = queryParam;
187
+ this.dataProviderLatestQueryParamVersion++;
188
+ this.dataProviderSubscription = this.dataProvider?.getAll(queryParam, this.dataProviderService)
189
+ .pipe(first(), finalize(() => this.dataProviderLoadingSubject.next(false)))
190
+ .subscribe((res) => {
191
+ if (this.infiniteScroll) {
192
+ if (this.isFilterChanged || this.isSortChanged) {
193
+ this.dataProviderInfiniteScrollItems = [];
194
+ }
195
+ // @ts-ignore
196
+ this.dataProviderInfiniteScrollItems.splice(queryParam.itemsOffset ?? 0, queryParam.itemsPerPage ?? this.rows, ...res.pageData);
197
+ this.dataProviderInfiniteScrollItems = [...this.dataProviderInfiniteScrollItems];
198
+ }
199
+ else {
200
+ this.dataProviderQueryResultSubject.next(res);
201
+ }
202
+ this.isFilterChanged = false;
203
+ this.isSortChanged = false;
204
+ }, err => {
205
+ ToastUtil.tableNotificationError(this.translate, this.descriptor, err, this.tableviewService);
206
+ const emptyQueryResult = new MediusQueryResult();
207
+ emptyQueryResult.pageData = [];
208
+ emptyQueryResult.allDataCount = 0;
209
+ this.dataProviderQueryResultSubject.next(emptyQueryResult);
210
+ });
211
+ if (emitEvent) {
212
+ const mngEvent = new MngTableLoadEvent();
213
+ mngEvent.originalEvent = this.dataProviderLatestLazyLoadEvent ?? undefined;
214
+ mngEvent.queryParam = queryParam;
215
+ this.loadEventEmitter.next(mngEvent);
216
+ }
217
+ }
218
+ loadTableFromRouteUpdate(params) {
219
+ const mediusQueryParam = MediusRestUtil.fromAngularQueryParamsToMediusQueryParams(params, this.filterDescriptors, this.rowsPerPageOptions[0]);
220
+ if (this.dataProviderLatestLazyLoadEventVersion < this.dataProviderLatestQueryParamVersion + 1) {
221
+ // update only if new version from query params will be higher
222
+ this.updatePrimeSortAndFilter(mediusQueryParam);
223
+ }
224
+ this.useQueryParamsInitialized = true;
225
+ this.loadTableWithDataProvider(mediusQueryParam);
226
+ }
227
+ updatePrimeSortAndFilter(mediusQueryParam) {
228
+ const primeSortMeta = [];
229
+ const primeFilterMeta = {};
230
+ this.filterDescriptors.forEach(f => {
231
+ // @ts-ignore
232
+ primeFilterMeta[f.property] = {
233
+ value: null,
234
+ matchMode: f.filterType === TypeEnum.String ? 'contains' : 'equals'
235
+ };
236
+ });
237
+ mediusQueryParam?.sortProperty?.forEach((s, idx) => {
238
+ primeSortMeta.push({
239
+ field: s,
240
+ order: (mediusQueryParam?.sortAsc?.[idx] ?? true) ? 1 : -1
241
+ });
242
+ });
243
+ mediusQueryParam?.filterParams?.forEach((f, idx) => {
244
+ const descriptor = this.filterDescriptors.find(fd => fd.filterProperty === f.property || fd.property === f.property);
245
+ const operator = MediusRestUtil.matchModeMapping.find(mapping => mapping[2] === f.filterMatchType);
246
+ if (descriptor && operator) {
247
+ primeFilterMeta[descriptor.property] = {
248
+ value: f.filterValue,
249
+ matchMode: operator[0]
250
+ };
251
+ }
252
+ });
253
+ this.multiSortMeta = primeSortMeta;
254
+ this.filterMetadata = primeFilterMeta;
255
+ this.rows = mediusQueryParam?.itemsPerPage ?? this.rowsPerPageOptions[0];
256
+ this.offset = mediusQueryParam?.itemsOffset ?? 0;
257
+ }
258
+ getDefaultSortMeta() {
259
+ if (this.descriptor.hasDefaultSort) {
260
+ return this.descriptor.defaultSortProperty.map((p, idx) => ({
261
+ field: p,
262
+ order: this.descriptor.defaultSortAsc[idx] ? 1 : -1
263
+ }));
264
+ }
265
+ else {
266
+ return [];
267
+ }
268
+ }
269
+ }
270
+ MngTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: MngTableComponent, deps: [{ token: i0.Injector }, { token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.TranslateService }, { token: i3.TableviewComponentService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
271
+ MngTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.3", type: MngTableComponent, selector: "mng-table", inputs: { descriptor: "descriptor", items: "items", queryResult: "queryResult", loading: "loading", dataProvider: "dataProvider", useQueryParams: "useQueryParams", selectionEnabled: "selectionEnabled" }, outputs: { loadEventEmitter: "onLoad", cellClickEventEmitter: "onCellClick", selectionChangeEventEmitter: "onSelectionChange" }, queries: [{ propertyName: "templates", predicate: MngTemplateDirective }], viewQueries: [{ propertyName: "primeTable", first: true, predicate: Table, descendants: true }], ngImport: i0, template: "<div [style.height]=\"scrollHeight === 'flex' ? 'calc(100vh - ' + descriptor.tableFullHeightOffset + 'px)' : null\">\n <!-- MUST NOT use observable for value when using virtual scroll - does not work for some reason -->\n <p-table *ngIf=\"!useQueryParams || useQueryParamsInitialized\"\n [value]=\"infiniteScroll ? dataProviderInfiniteScrollItems : ((queryResult$ | async)?.pageData ?? [])\"\n [dataKey]=\"$any(descriptor.dataKeyProperty)\"\n [lazy]=\"useDataProvider\"\n [loading]=\"(loading$ | async) ?? false\"\n [paginator]=\"useDataProvider && !infiniteScroll\"\n [rows]=\"$any(infiniteScroll ? 20 : rows)\"\n [first]=\"$any(infiniteScroll ? 0 : offset)\"\n [totalRecords]=\"$any(infiniteScroll ? null : (queryResult$ | async)?.allDataCount ?? 0)\"\n [rowsPerPageOptions]=\"$any(infiniteScroll ? null : rowsPerPageOptions)\"\n [showCurrentPageReport]=\"!infiniteScroll\"\n [currentPageReportTemplate]=\"'mngTable.paginationMsg' | translate\"\n [multiSortMeta]=\"$any(multiSortMeta)\"\n [filters]=\"filterMetadata\"\n [(selection)]=\"selection\"\n (selectionChange)=\"onSelectionChange($event)\"\n [scrollable]=\"infiniteScroll\"\n [virtualScroll]=\"infiniteScroll\"\n [virtualRowHeight]=\"$any(rowHeight)\"\n [scrollHeight]=\"$any(scrollHeight)\"\n [rowHover]=\"true\"\n (onLazyLoad)=\"onTableLazyLoad($event)\"\n (onSort)=\"onTableSort($event)\"\n (onFilter)=\"onTableFilter($event)\"\n sortMode=\"multiple\"\n responsiveLayout=\"scroll\">\n\n <ng-template *ngIf=\"captionTemplate || descriptor.title\" pTemplate=\"caption\">\n <ng-container *ngIf=\"captionTemplate; else defaultCaption\">\n <ng-container *ngTemplateOutlet=\"captionTemplate\"></ng-container>\n </ng-container>\n <ng-template #defaultCaption>\n <h5 class=\"p-m-0\">{{ descriptor.title }}</h5>\n </ng-template>\n </ng-template>\n\n <ng-template pTemplate=\"header\">\n <tr>\n <th *ngIf=\"selectionEnabled\">\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n <ng-container *ngFor=\"let col of descriptor.columns\">\n <th *ngIf=\"col.isSortEnabled\" [pSortableColumn]=\"col.property\">\n <div class=\"flex justify-content-between align-items-center\">\n {{ descriptor.model.typeName + \".properties.\" + col.property | translate }}\n <p-sortIcon [field]=\"col.property\"></p-sortIcon>\n <mng-table-column-filter *ngIf=\"col.filterDescriptor && descriptor.filterDisplay === filterDisplayMenu\"\n class=\"ml-auto\"\n [display]=\"descriptor.filterDisplay\"\n [descriptor]=\"col.filterDescriptor\">\n </mng-table-column-filter>\n </div>\n </th>\n <th *ngIf=\"!col.isSortEnabled\">\n {{ descriptor.model.typeName + \".properties.\" + col.property | translate }}\n <ng-container>\n <mng-table-column-filter *ngIf=\"col.filterDescriptor && descriptor.filterDisplay === filterDisplayMenu\"\n class=\"ml-auto\"\n [display]=\"descriptor.filterDisplay\"\n [descriptor]=\"col.filterDescriptor\">\n </mng-table-column-filter>\n </ng-container>\n </th>\n </ng-container>\n <th *ngIf=\"columnActionTemplate\"></th>\n </tr>\n <tr *ngIf=\"descriptor.filterDisplay === filterDisplayRow\">\n <th *ngFor=\"let col of descriptor.columns\">\n <div class=\"flex\" *ngIf=\"col.filterDescriptor\">\n <mng-table-column-filter [display]=\"descriptor.filterDisplay\" [descriptor]=\"col.filterDescriptor\"></mng-table-column-filter>\n </div>\n </th>\n <th *ngIf=\"columnActionTemplate\"></th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-item let-idx=\"rowIndex\">\n <tr [style.height.px]=\"descriptor.rowHeight\">\n <td *ngIf=\"selectionEnabled\">\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\n </td>\n <td *ngFor=\"let col of descriptor.columns\" (click)=\"onCellClick(col, item, idx)\" class=\"clickable\">\n <mng-table-column-value [descriptor]=\"col\" [item]=\"item\"></mng-table-column-value>\n </td>\n <td *ngIf=\"columnActionTemplate\" class=\"text-right\">\n <ng-container *ngTemplateOutlet=\"columnActionTemplate; context: { rowItem: item, rowIndex: idx }\"></ng-container>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"loadingbody\">\n <tr [style.height.px]=\"descriptor.rowHeight\">\n <td [attr.colspan]=\"descriptor.columns.length + (columnActionTemplate ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n <div class=\"loading-text\"></div>\n <p-skeleton [ngStyle]=\"{'width': '100%'}\"></p-skeleton>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"emptymessage\">\n <tr [style.height.px]=\"rowHeight\">\n <td [attr.colspan]=\"descriptor.columns.length + (columnActionTemplate ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n {{ 'mngTable.noItems' | translate }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n</div>\n", components: [{ type: i4.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollDelay", "virtualRowHeight", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "minBufferPx", "maxBufferPx", "responsiveLayout", "breakpoint", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["selectAllChange", "selectionChange", "contextMenuSelectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { type: i4.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { type: i4.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { type: i5.MngTableColumnFilterComponent, selector: "mng-table-column-filter", inputs: ["descriptor", "display"] }, { type: i4.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { type: i6.MngTableColumnValueComponent, selector: "mng-table-column-value", inputs: ["descriptor", "item"] }, { type: i7.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], pipes: { "async": i8.AsyncPipe, "translate": i2.TranslatePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
272
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: MngTableComponent, decorators: [{
273
+ type: Component,
274
+ args: [{ selector: 'mng-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [style.height]=\"scrollHeight === 'flex' ? 'calc(100vh - ' + descriptor.tableFullHeightOffset + 'px)' : null\">\n <!-- MUST NOT use observable for value when using virtual scroll - does not work for some reason -->\n <p-table *ngIf=\"!useQueryParams || useQueryParamsInitialized\"\n [value]=\"infiniteScroll ? dataProviderInfiniteScrollItems : ((queryResult$ | async)?.pageData ?? [])\"\n [dataKey]=\"$any(descriptor.dataKeyProperty)\"\n [lazy]=\"useDataProvider\"\n [loading]=\"(loading$ | async) ?? false\"\n [paginator]=\"useDataProvider && !infiniteScroll\"\n [rows]=\"$any(infiniteScroll ? 20 : rows)\"\n [first]=\"$any(infiniteScroll ? 0 : offset)\"\n [totalRecords]=\"$any(infiniteScroll ? null : (queryResult$ | async)?.allDataCount ?? 0)\"\n [rowsPerPageOptions]=\"$any(infiniteScroll ? null : rowsPerPageOptions)\"\n [showCurrentPageReport]=\"!infiniteScroll\"\n [currentPageReportTemplate]=\"'mngTable.paginationMsg' | translate\"\n [multiSortMeta]=\"$any(multiSortMeta)\"\n [filters]=\"filterMetadata\"\n [(selection)]=\"selection\"\n (selectionChange)=\"onSelectionChange($event)\"\n [scrollable]=\"infiniteScroll\"\n [virtualScroll]=\"infiniteScroll\"\n [virtualRowHeight]=\"$any(rowHeight)\"\n [scrollHeight]=\"$any(scrollHeight)\"\n [rowHover]=\"true\"\n (onLazyLoad)=\"onTableLazyLoad($event)\"\n (onSort)=\"onTableSort($event)\"\n (onFilter)=\"onTableFilter($event)\"\n sortMode=\"multiple\"\n responsiveLayout=\"scroll\">\n\n <ng-template *ngIf=\"captionTemplate || descriptor.title\" pTemplate=\"caption\">\n <ng-container *ngIf=\"captionTemplate; else defaultCaption\">\n <ng-container *ngTemplateOutlet=\"captionTemplate\"></ng-container>\n </ng-container>\n <ng-template #defaultCaption>\n <h5 class=\"p-m-0\">{{ descriptor.title }}</h5>\n </ng-template>\n </ng-template>\n\n <ng-template pTemplate=\"header\">\n <tr>\n <th *ngIf=\"selectionEnabled\">\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n <ng-container *ngFor=\"let col of descriptor.columns\">\n <th *ngIf=\"col.isSortEnabled\" [pSortableColumn]=\"col.property\">\n <div class=\"flex justify-content-between align-items-center\">\n {{ descriptor.model.typeName + \".properties.\" + col.property | translate }}\n <p-sortIcon [field]=\"col.property\"></p-sortIcon>\n <mng-table-column-filter *ngIf=\"col.filterDescriptor && descriptor.filterDisplay === filterDisplayMenu\"\n class=\"ml-auto\"\n [display]=\"descriptor.filterDisplay\"\n [descriptor]=\"col.filterDescriptor\">\n </mng-table-column-filter>\n </div>\n </th>\n <th *ngIf=\"!col.isSortEnabled\">\n {{ descriptor.model.typeName + \".properties.\" + col.property | translate }}\n <ng-container>\n <mng-table-column-filter *ngIf=\"col.filterDescriptor && descriptor.filterDisplay === filterDisplayMenu\"\n class=\"ml-auto\"\n [display]=\"descriptor.filterDisplay\"\n [descriptor]=\"col.filterDescriptor\">\n </mng-table-column-filter>\n </ng-container>\n </th>\n </ng-container>\n <th *ngIf=\"columnActionTemplate\"></th>\n </tr>\n <tr *ngIf=\"descriptor.filterDisplay === filterDisplayRow\">\n <th *ngFor=\"let col of descriptor.columns\">\n <div class=\"flex\" *ngIf=\"col.filterDescriptor\">\n <mng-table-column-filter [display]=\"descriptor.filterDisplay\" [descriptor]=\"col.filterDescriptor\"></mng-table-column-filter>\n </div>\n </th>\n <th *ngIf=\"columnActionTemplate\"></th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-item let-idx=\"rowIndex\">\n <tr [style.height.px]=\"descriptor.rowHeight\">\n <td *ngIf=\"selectionEnabled\">\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\n </td>\n <td *ngFor=\"let col of descriptor.columns\" (click)=\"onCellClick(col, item, idx)\" class=\"clickable\">\n <mng-table-column-value [descriptor]=\"col\" [item]=\"item\"></mng-table-column-value>\n </td>\n <td *ngIf=\"columnActionTemplate\" class=\"text-right\">\n <ng-container *ngTemplateOutlet=\"columnActionTemplate; context: { rowItem: item, rowIndex: idx }\"></ng-container>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"loadingbody\">\n <tr [style.height.px]=\"descriptor.rowHeight\">\n <td [attr.colspan]=\"descriptor.columns.length + (columnActionTemplate ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n <div class=\"loading-text\"></div>\n <p-skeleton [ngStyle]=\"{'width': '100%'}\"></p-skeleton>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"emptymessage\">\n <tr [style.height.px]=\"rowHeight\">\n <td [attr.colspan]=\"descriptor.columns.length + (columnActionTemplate ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n {{ 'mngTable.noItems' | translate }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n</div>\n" }]
275
+ }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.TranslateService }, { type: i3.TableviewComponentService, decorators: [{
276
+ type: Optional
277
+ }] }]; }, propDecorators: { descriptor: [{
278
+ type: Input
279
+ }], items: [{
280
+ type: Input
281
+ }], queryResult: [{
282
+ type: Input
283
+ }], loading: [{
284
+ type: Input
285
+ }], dataProvider: [{
286
+ type: Input
287
+ }], useQueryParams: [{
288
+ type: Input
289
+ }], selectionEnabled: [{
290
+ type: Input
291
+ }], loadEventEmitter: [{
292
+ type: Output,
293
+ args: ['onLoad']
294
+ }], cellClickEventEmitter: [{
295
+ type: Output,
296
+ args: ['onCellClick']
297
+ }], selectionChangeEventEmitter: [{
298
+ type: Output,
299
+ args: ['onSelectionChange']
300
+ }], templates: [{
301
+ type: ContentChildren,
302
+ args: [MngTemplateDirective]
303
+ }], primeTable: [{
304
+ type: ViewChild,
305
+ args: [Table]
306
+ }] } });
307
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3RhYmxldmlldy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvdGFibGV2aWV3L3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBbUIsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQVksS0FBSyxFQUFxQixRQUFRLEVBQUUsTUFBTSxFQUEwQixTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFHM00sT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUdwQyxPQUFPLEVBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFDakUsT0FBTyxFQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHcEQsT0FBTyxFQUFDLGdCQUFnQixFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDakcsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBbUIsZ0JBQWdCLEVBQUUsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFekYsT0FBTyxFQUFDLHNCQUFzQixFQUFFLGlCQUFpQixFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ3BFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3pELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUd6QyxJQUFPLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7QUFDNUMsSUFBTyxrQkFBa0IsR0FBRyxl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Ozs4R0ExU1EsaUJBQWlCO2tHQUFqQixpQkFBaUIsd1pBd0JULG9CQUFvQix5RUFDMUIsS0FBSyxnRENwRHBCLGtyTUE4R0E7MkZEbkZhLGlCQUFpQjtrQkFMN0IsU0FBUzsrQkFDSSxXQUFXLG1CQUVKLHVCQUF1QixDQUFDLE1BQU07OzBCQXNFbEMsUUFBUTs0Q0E5REwsVUFBVTtzQkFBekIsS0FBSztnQkFHVSxLQUFLO3NCQUFwQixLQUFLO2dCQUNVLFdBQVc7c0JBQTFCLEtBQUs7Z0JBQ1UsT0FBTztzQkFBdEIsS0FBSztnQkFDVSxZQUFZO3NCQUEzQixLQUFLO2dCQUNVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBR1UsZ0JBQWdCO3NCQUEvQixLQUFLO2dCQUdvQixnQkFBZ0I7c0JBQXpDLE1BQU07dUJBQUMsUUFBUTtnQkFDZSxxQkFBcUI7c0JBQW5ELE1BQU07dUJBQUMsYUFBYTtnQkFDZ0IsMkJBQTJCO3NCQUEvRCxNQUFNO3VCQUFDLG1CQUFtQjtnQkFHWSxTQUFTO3NCQUEvQyxlQUFlO3VCQUFDLG9CQUFvQjtnQkFDWCxVQUFVO3NCQUFuQyxTQUFTO3VCQUFDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FmdGVyQ29udGVudEluaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIENvbnRlbnRDaGlsZHJlbiwgRXZlbnRFbWl0dGVyLCBJbmplY3RvciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCwgT3V0cHV0LCBRdWVyeUxpc3QsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1zLCBSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7VGFibGV9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xuaW1wb3J0IHtMYXp5TG9hZEV2ZW50LCBTb3J0TWV0YX0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHtGaWx0ZXJNZXRhZGF0YX0gZnJvbSAncHJpbWVuZy9hcGkvZmlsdGVybWV0YWRhdGEnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBvZiwgUmVwbGF5U3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZmluYWxpemUsIGZpcnN0LCBtYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5cbmltcG9ydCB7TWVkaXVzUXVlcnlQYXJhbSwgTWVkaXVzUXVlcnlQYXJhbUJ1aWxkZXIsIE1lZGl1c1F1ZXJ5UmVzdWx0fSBmcm9tICcuLi8uLi8uLi9hcGkvbW9kZWxzJztcbmltcG9ydCB7TWVkaXVzUmVzdFV0aWx9IGZyb20gJy4uLy4uLy4uL2FwaS91dGlscyc7XG5pbXBvcnQge0NvbHVtbkRlc2NyaXB0b3IsIEZpbHRlckRlc2NyaXB0b3IsIFRhYmxlRGVzY3JpcHRvcn0gZnJvbSAnLi4vLi4vLi4vZGVzY3JpcHRvcnMnO1xuaW1wb3J0IHtJVGFibGVEYXRhUHJvdmlkZXJ9IGZyb20gJy4uLy4uLy4uL2RhdGEtcHJvdmlkZXJzJztcbmltcG9ydCB7TW5nVGFibGVDZWxsQ2xpY2tFdmVudCwgTW5nVGFibGVMb2FkRXZlbnR9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge01uZ1RlbXBsYXRlRGlyZWN0aXZlfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmVzJztcbmltcG9ydCB7VG9hc3RVdGlsfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5pbXBvcnQge1RhYmxldmlld0NvbXBvbmVudFNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcblxuaW1wb3J0IFR5cGVFbnVtID0gRmlsdGVyRGVzY3JpcHRvci5UeXBlRW51bTtcbmltcG9ydCBQYWdpbmF0aW9uTW9kZUVudW0gPSBUYWJsZURlc2NyaXB0b3IuUGFnaW5hdGlvbk1vZGVFbnVtO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ21uZy10YWJsZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBNbmdUYWJsZUNvbXBvbmVudDxULCBTPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcblxuICAgIHB1YmxpYyByZWFkb25seSBmaWx0ZXJEaXNwbGF5Um93OiBUYWJsZURlc2NyaXB0b3IuRmlsdGVyRGlzcGxheUVudW0gPSBUYWJsZURlc2NyaXB0b3IuRmlsdGVyRGlzcGxheUVudW0uUm93O1xuICAgIHB1YmxpYyByZWFkb25seSBmaWx0ZXJEaXNwbGF5TWVudTogVGFibGVEZXNjcmlwdG9yLkZpbHRlckRpc3BsYXlFbnVtID0gVGFibGVEZXNjcmlwdG9yLkZpbHRlckRpc3BsYXlFbnVtLk1lbnU7XG5cbiAgICAvLyBtZXRhZGF0YSBpbnB1dFxuICAgIEBJbnB1dCgpIHB1YmxpYyBkZXNjcmlwdG9yITogVGFibGVEZXNjcmlwdG9yPFQ+O1xuXG4gICAgLy8gZGF0YSBzb3VyY2UgaW5wdXRzXG4gICAgQElucHV0KCkgcHVibGljIGl0ZW1zPzogT2JzZXJ2YWJsZTxBcnJheTxUPj58QXJyYXk8VD47XG4gICAgQElucHV0KCkgcHVibGljIHF1ZXJ5UmVzdWx0PzogT2JzZXJ2YWJsZTxNZWRpdXNRdWVyeVJlc3VsdDxUPj58TWVkaXVzUXVlcnlSZXN1bHQ8VD47XG4gICAgQElucHV0KCkgcHVibGljIGxvYWRpbmc/OiBPYnNlcnZhYmxlPGJvb2xlYW4+fGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIGRhdGFQcm92aWRlcj86IElUYWJsZURhdGFQcm92aWRlcjxULCBhbnk+O1xuICAgIEBJbnB1dCgpIHB1YmxpYyB1c2VRdWVyeVBhcmFtcyA9IGZhbHNlO1xuXG4gICAgLy8gZXh0cmEgZmVhdHVyZXMgaW5wdXRcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0aW9uRW5hYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLy8gZXZlbnQgb3V0cHV0c1xuICAgIEBPdXRwdXQoJ29uTG9hZCcpIHByaXZhdGUgbG9hZEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8TW5nVGFibGVMb2FkRXZlbnQ+KCk7XG4gICAgQE91dHB1dCgnb25DZWxsQ2xpY2snKSBwcml2YXRlIGNlbGxDbGlja0V2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8TW5nVGFibGVDZWxsQ2xpY2tFdmVudDxUPj4oKTtcbiAgICBAT3V0cHV0KCdvblNlbGVjdGlvbkNoYW5nZScpIHByaXZhdGUgc2VsZWN0aW9uQ2hhbmdlRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxUPj4oKTtcblxuICAgIC8vIGNvbnRlbnQgYW5kIHZpZXcgcXVlcmllc1xuICAgIEBDb250ZW50Q2hpbGRyZW4oTW5nVGVtcGxhdGVEaXJlY3RpdmUpIHRlbXBsYXRlcyE6IFF1ZXJ5TGlzdDxNbmdUZW1wbGF0ZURpcmVjdGl2ZT47XG4gICAgQFZpZXdDaGlsZChUYWJsZSkgcHJpdmF0ZSBwcmltZVRhYmxlITogVGFibGU7XG5cbiAgICAvLyB0ZW1wbGF0ZXNcbiAgICBwdWJsaWMgY2FwdGlvblRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBwdWJsaWMgY29sdW1uQWN0aW9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLy8gZGF0YSBwcm92aWRlciBhbmQgaXRlbXNcbiAgICBwdWJsaWMgdXNlRGF0YVByb3ZpZGVyOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIHVzZVF1ZXJ5UGFyYW1zSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgcXVlcnlSZXN1bHQkPzogT2JzZXJ2YWJsZTxNZWRpdXNRdWVyeVJlc3VsdDxUPj47XG4gICAgcHVibGljIGxvYWRpbmckPzogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgICBwdWJsaWMgZGF0YVByb3ZpZGVySW5maW5pdGVTY3JvbGxJdGVtczogQXJyYXk8VD4gPSBbXTtcbiAgICBwcml2YXRlIGRhdGFQcm92aWRlclNlcnZpY2U6IGFueSA9IG51bGw7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJRdWVyeVJlc3VsdFN1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxNZWRpdXNRdWVyeVJlc3VsdDxUPj4oMSk7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJMb2FkaW5nU3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudD86IExhenlMb2FkRXZlbnQ7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJMYXRlc3RMYXp5TG9hZEV2ZW50VmVyc2lvbjogbnVtYmVyID0gMDtcbiAgICBwcml2YXRlIGRhdGFQcm92aWRlckxhdGVzdFF1ZXJ5UGFyYW0/OiBNZWRpdXNRdWVyeVBhcmFtO1xuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyTGF0ZXN0UXVlcnlQYXJhbVZlcnNpb246IG51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgICAvLyBwYWdpbmF0aW9uLCBzb3J0IGFuZCBmaWx0ZXJzXG4gICAgcHVibGljIHJlYWRvbmx5IHJvd3NQZXJQYWdlT3B0aW9ucyA9IFsyNSwgNTAsIDEwMF07XG4gICAgcHVibGljIHJvd3MgPSB0aGlzLnJvd3NQZXJQYWdlT3B0aW9uc1swXTtcbiAgICBwdWJsaWMgb2Zmc2V0ID0gMDtcbiAgICBwdWJsaWMgbXVsdGlTb3J0TWV0YTogU29ydE1ldGFbXXxudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgZmlsdGVyTWV0YWRhdGE6IHsgW3M6IHN0cmluZ106IEZpbHRlck1ldGFkYXRhIHwgRmlsdGVyTWV0YWRhdGFbXSB9ID0ge307XG4gICAgcHJpdmF0ZSBpc0ZpbHRlckNoYW5nZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGlzU29ydENoYW5nZWQgPSBmYWxzZTtcblxuICAgIC8vIGluZmluaXRlIHNjcm9sbFxuICAgIHB1YmxpYyBpbmZpbml0ZVNjcm9sbCA9IGZhbHNlO1xuICAgIHB1YmxpYyBzY3JvbGxIZWlnaHQ6ICdmbGV4J3xudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgcm93SGVpZ2h0OiBudW1iZXJ8bnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgc2VsZWN0aW9uOiBBcnJheTxUPiA9IFtdO1xuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgICBwcml2YXRlIGZpbHRlckRlc2NyaXB0b3JzOiBBcnJheTxGaWx0ZXJEZXNjcmlwdG9yPGFueT4+ID0gW107XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgdGFibGV2aWV3U2VydmljZTogVGFibGV2aWV3Q29tcG9uZW50U2VydmljZTxULCBTPlxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLmZpbHRlckRlc2NyaXB0b3JzID0gdGhpcy5kZXNjcmlwdG9yLmNvbHVtbnMuZmlsdGVyKGMgPT4gdHlwZW9mIGMuZmlsdGVyRGVzY3JpcHRvciAhPT0gJ3VuZGVmaW5lZCcpLm1hcChjID0+IGMuZmlsdGVyRGVzY3JpcHRvcik7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVzY3JpcHRvci5wYWdpbmF0aW9uTW9kZSA9PT0gUGFnaW5hdGlvbk1vZGVFbnVtLkluZmluaXRlU2Nyb2xsKSB7XG4gICAgICAgICAgICB0aGlzLmluZmluaXRlU2Nyb2xsID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsSGVpZ2h0ID0gJ2ZsZXgnO1xuICAgICAgICAgICAgdGhpcy5yb3dIZWlnaHQgPSB0aGlzLmRlc2NyaXB0b3Iucm93SGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy51c2VRdWVyeVBhcmFtcyA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgZGF0YSBwcm92aWRlciBpcyBzdXBwbGllZCwgaWYgaXMsIHVzZSBpdCBwcmltYXJpbHlcbiAgICAgICAgaWYgKHRoaXMuZGF0YVByb3ZpZGVyKSB7XG4gICAgICAgICAgICAvLyBtYXAgc3ViamVjdHMgdG8gb2JzZXJ2YWJsZXMgYW5kIGluaXRpYXRlIGRhdGFcbiAgICAgICAgICAgIHRoaXMudXNlRGF0YVByb3ZpZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucXVlcnlSZXN1bHQkID0gdGhpcy5kYXRhUHJvdmlkZXJRdWVyeVJlc3VsdFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmckID0gdGhpcy5kYXRhUHJvdmlkZXJMb2FkaW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICAgICAgICAgIGNvbnN0IGVtcHR5UXVlcnlSZXN1bHQgPSBuZXcgTWVkaXVzUXVlcnlSZXN1bHQ8VD4oKTtcbiAgICAgICAgICAgIGVtcHR5UXVlcnlSZXN1bHQucGFnZURhdGEgPSBbXTtcbiAgICAgICAgICAgIGVtcHR5UXVlcnlSZXN1bHQuYWxsRGF0YUNvdW50ID0gMDtcbiAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlclF1ZXJ5UmVzdWx0U3ViamVjdC5uZXh0KGVtcHR5UXVlcnlSZXN1bHQpXG5cbiAgICAgICAgICAgIC8vIGluamVjdCBzZXJ2aWNlXG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhUHJvdmlkZXIuc2VydmljZVR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlclNlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldDxhbnk+KHRoaXMuZGF0YVByb3ZpZGVyLnNlcnZpY2VUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGlmIHF1ZXJ5IHJlc3VsdCBpcyBwcm92aWRlZCwgdXNlIGl0IGFzIHNlY29uZGFyeSBzb3VyY2Ugb3IgZWxzZSB0cnkgdG8gdXNlIGl0ZW1zXG4gICAgICAgICAgICBpZiAodGhpcy5xdWVyeVJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnlSZXN1bHQkID0gdGhpcy5xdWVyeVJlc3VsdCBpbnN0YW5jZW9mIE9ic2VydmFibGUgPyB0aGlzLnF1ZXJ5UmVzdWx0IDogb2YodGhpcy5xdWVyeVJlc3VsdCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLnF1ZXJ5UmVzdWx0ICYmIHRoaXMuaXRlbXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5UmVzdWx0JCA9ICh0aGlzLml0ZW1zIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSA/IHRoaXMuaXRlbXMgOiBvZih0aGlzLml0ZW1zKSkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgLy8gZGlzdGluY3RVbnRpbENoYW5nZWQoKHYxLCB2MikgPT4gdjEubGVuZ3RoID09PSB2Mi5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHYxLmV2ZXJ5KCh2MWksIGlkeCkgPT4gdjFpW3RoaXMuZGVzY3JpcHRvci5kYXRhS2V5UHJvcGVydHldID09PSB2MltpZHhdW3RoaXMuZGVzY3JpcHRvci5kYXRhS2V5UHJvcGVydHldKSksXG4gICAgICAgICAgICAgICAgICAgIG1hcChpdGVtcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWVyeVJlc3VsdCA9IG5ldyBNZWRpdXNRdWVyeVJlc3VsdDxUPigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSZXN1bHQucGFnZURhdGEgPSBpdGVtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UmVzdWx0LmFsbERhdGFDb3VudCA9IGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBxdWVyeVJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmxvYWRpbmcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nJCA9IHRoaXMubG9hZGluZyBpbnN0YW5jZW9mIE9ic2VydmFibGUgPyB0aGlzLmxvYWRpbmcgOiBvZih0aGlzLmxvYWRpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudXNlUXVlcnlQYXJhbXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuYWN0aXZhdGVkUm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKHFwID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRUYWJsZUZyb21Sb3V0ZVVwZGF0ZShxcCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpbml0aWFsaXplIGRlZmF1bHQgc29ydCBpZiBwcmVzZW50XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0U29ydCA9IHRoaXMuZ2V0RGVmYXVsdFNvcnRNZXRhKCk7XG4gICAgICAgICAgICBpZiAoZGVmYXVsdFNvcnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMubXVsdGlTb3J0TWV0YSA9IGRlZmF1bHRTb3J0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZXMuZm9yRWFjaCh0ZW1wbGF0ZSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2godGVtcGxhdGUuZ2V0VHlwZSgpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY2FwdGlvbic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FwdGlvblRlbXBsYXRlID0gdGVtcGxhdGUudGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbHVtbkFjdGlvbic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uQWN0aW9uVGVtcGxhdGUgPSB0ZW1wbGF0ZS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWxvYWQoZW1pdEV2ZW50OiBib29sZWFuID0gZmFsc2UsIHJlc2V0UGFyYW1zOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5sb2FkVGFibGVXaXRoRGF0YVByb3ZpZGVyKHJlc2V0UGFyYW1zXG4gICAgICAgICAgICA/IE1lZGl1c1F1ZXJ5UGFyYW1CdWlsZGVyLmNyZWF0ZSh0aGlzLnJvd3NQZXJQYWdlT3B0aW9uc1swXSwgMCkuYnVpbGQoKVxuICAgICAgICAgICAgOiAodGhpcy5kYXRhUHJvdmlkZXJMYXRlc3RRdWVyeVBhcmFtID8/IG5ldyBNZWRpdXNRdWVyeVBhcmFtKCkpLCBlbWl0RXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblRhYmxlTGF6eUxvYWQoZXZlbnQ6IExhenlMb2FkRXZlbnQpIHtcbiAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJMYXRlc3RMYXp5TG9hZEV2ZW50ID0gZXZlbnQ7XG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudFZlcnNpb24rKztcblxuICAgICAgICBpZiAodGhpcy51c2VRdWVyeVBhcmFtcykge1xuICAgICAgICAgICAgaWYgKCFldmVudC5tdWx0aVNvcnRNZXRhIHx8IGV2ZW50Lm11bHRpU29ydE1ldGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gYWRkIGRlZmF1bHQgc29ydCBtZXRhIHRvIGV2ZW50IGlmIG5vdCBtdWx0aXNvcnQgbWV0YSBpcyBwcmVzZW50XG4gICAgICAgICAgICAgICAgZXZlbnQubXVsdGlTb3J0TWV0YSA9IHRoaXMuZ2V0RGVmYXVsdFNvcnRNZXRhKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwge1xuICAgICAgICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMuYWN0aXZhdGVkUm91dGUsXG4gICAgICAgICAgICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBxdWVyeVBhcmFtczogTWVkaXVzUmVzdFV0aWwuZnJvbVByaW1lTGF6eUxvYWRFdmVudFRvQW5ndWxhclF1ZXJ5UGFyYW1zKGV2ZW50LCB0aGlzLnJvd3NQZXJQYWdlT3B0aW9uc1swXSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbWVkaXVzUXVlcnlQYXJhbXMgPSBldmVudCA/IE1lZGl1c1Jlc3RVdGlsLmZyb21QcmltZUxhenlMb2FkRXZlbnRUb01lZGl1c1F1ZXJ5UGFyYW1zKGV2ZW50KSA6IG5ldyBNZWRpdXNRdWVyeVBhcmFtKCk7XG4gICAgICAgICAgICB0aGlzLmxvYWRUYWJsZVdpdGhEYXRhUHJvdmlkZXIobWVkaXVzUXVlcnlQYXJhbXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uVGFibGVTb3J0KGV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5pc1NvcnRDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25UYWJsZUZpbHRlcihldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMuaXNGaWx0ZXJDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25DZWxsQ2xpY2soY29sOiBDb2x1bW5EZXNjcmlwdG9yPGFueSwgVD4sIGl0ZW06IFQsIGlkeDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG1uZ0V2ZW50ID0gbmV3IE1uZ1RhYmxlQ2VsbENsaWNrRXZlbnQ8VD4oY29sLCBpdGVtLCBpZHgpO1xuICAgICAgICB0aGlzLmNlbGxDbGlja0V2ZW50RW1pdHRlci5uZXh0KG1uZ0V2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25TZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IEFycmF5PFQ+KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlRXZlbnRFbWl0dGVyLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9hZFRhYmxlV2l0aERhdGFQcm92aWRlcihxdWVyeVBhcmFtOiBNZWRpdXNRdWVyeVBhcmFtfG51bGwgPSBudWxsLCBlbWl0RXZlbnQ6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgICAgIGlmICghdGhpcy51c2VEYXRhUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhUHJvdmlkZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRhdGFQcm92aWRlckxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG5cbiAgICAgICAgaWYgKCFxdWVyeVBhcmFtKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtID0gTWVkaXVzUXVlcnlQYXJhbUJ1aWxkZXIuY3JlYXRlKHRoaXMucm93c1BlclBhZ2VPcHRpb25zWzBdKS5idWlsZCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0UXVlcnlQYXJhbSA9IHF1ZXJ5UGFyYW07XG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0UXVlcnlQYXJhbVZlcnNpb24rKztcblxuICAgICAgICB0aGlzLmRhdGFQcm92aWRlclN1YnNjcmlwdGlvbiA9IHRoaXMuZGF0YVByb3ZpZGVyPy5nZXRBbGwocXVlcnlQYXJhbSwgdGhpcy5kYXRhUHJvdmlkZXJTZXJ2aWNlKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlyc3QoKSxcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLmRhdGFQcm92aWRlckxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5maW5pdGVTY3JvbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNGaWx0ZXJDaGFuZ2VkIHx8IHRoaXMuaXNTb3J0Q2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJJbmZpbml0ZVNjcm9sbEl0ZW1zID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlckluZmluaXRlU2Nyb2xsSXRlbXMuc3BsaWNlKHF1ZXJ5UGFyYW0uaXRlbXNPZmZzZXQgPz8gMCwgcXVlcnlQYXJhbS5pdGVtc1BlclBhZ2UgPz8gdGhpcy5yb3dzLCAuLi5yZXMucGFnZURhdGEpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVySW5maW5pdGVTY3JvbGxJdGVtcyA9IFsuLi50aGlzLmRhdGFQcm92aWRlckluZmluaXRlU2Nyb2xsSXRlbXNdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyUXVlcnlSZXN1bHRTdWJqZWN0Lm5leHQocmVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pc0ZpbHRlckNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzU29ydENoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0sIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgVG9hc3RVdGlsLnRhYmxlTm90aWZpY2F0aW9uRXJyb3IodGhpcy50cmFuc2xhdGUsIHRoaXMuZGVzY3JpcHRvciwgZXJyLCB0aGlzLnRhYmxldmlld1NlcnZpY2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVtcHR5UXVlcnlSZXN1bHQgPSBuZXcgTWVkaXVzUXVlcnlSZXN1bHQ8VD4oKTtcbiAgICAgICAgICAgICAgICBlbXB0eVF1ZXJ5UmVzdWx0LnBhZ2VEYXRhID0gW107XG4gICAgICAgICAgICAgICAgZW1wdHlRdWVyeVJlc3VsdC5hbGxEYXRhQ291bnQgPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyUXVlcnlSZXN1bHRTdWJqZWN0Lm5leHQoZW1wdHlRdWVyeVJlc3VsdCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBpZiAoZW1pdEV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBtbmdFdmVudCA9IG5ldyBNbmdUYWJsZUxvYWRFdmVudCgpO1xuICAgICAgICAgICAgbW5nRXZlbnQub3JpZ2luYWxFdmVudCA9IHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudCA/PyB1bmRlZmluZWQ7XG4gICAgICAgICAgICBtbmdFdmVudC5xdWVyeVBhcmFtID0gcXVlcnlQYXJhbTtcbiAgICAgICAgICAgIHRoaXMubG9hZEV2ZW50RW1pdHRlci5uZXh0KG1uZ0V2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbG9hZFRhYmxlRnJvbVJvdXRlVXBkYXRlKHBhcmFtczogUGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IG1lZGl1c1F1ZXJ5UGFyYW0gPSBNZWRpdXNSZXN0VXRpbC5mcm9tQW5ndWxhclF1ZXJ5UGFyYW1zVG9NZWRpdXNRdWVyeVBhcmFtcyhwYXJhbXMsIHRoaXMuZmlsdGVyRGVzY3JpcHRvcnMsIHRoaXMucm93c1BlclBhZ2VPcHRpb25zWzBdKTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudFZlcnNpb24gPCB0aGlzLmRhdGFQcm92aWRlckxhdGVzdFF1ZXJ5UGFyYW1WZXJzaW9uICsgMSkge1xuICAgICAgICAgICAgLy8gdXBkYXRlIG9ubHkgaWYgbmV3IHZlcnNpb24gZnJvbSBxdWVyeSBwYXJhbXMgd2lsbCBiZSBoaWdoZXJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUHJpbWVTb3J0QW5kRmlsdGVyKG1lZGl1c1F1ZXJ5UGFyYW0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlUXVlcnlQYXJhbXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIHRoaXMubG9hZFRhYmxlV2l0aERhdGFQcm92aWRlcihtZWRpdXNRdWVyeVBhcmFtKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVByaW1lU29ydEFuZEZpbHRlcihtZWRpdXNRdWVyeVBhcmFtOiBNZWRpdXNRdWVyeVBhcmFtKSB7XG4gICAgICAgIGNvbnN0IHByaW1lU29ydE1ldGE6IFNvcnRNZXRhW10gPSBbXTtcbiAgICAgICAgY29uc3QgcHJpbWVGaWx0ZXJNZXRhOiB7IFtzOiBzdHJpbmddOiBGaWx0ZXJNZXRhZGF0YSB8IEZpbHRlck1ldGFkYXRhW10gfSA9IHt9O1xuXG4gICAgICAgIHRoaXMuZmlsdGVyRGVzY3JpcHRvcnMuZm9yRWFjaChmID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHByaW1lRmlsdGVyTWV0YVtmLnByb3BlcnR5XSA9IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICBtYXRjaE1vZGU6IGYuZmlsdGVyVHlwZSA9PT0gVHlwZUVudW0uU3RyaW5nID8gJ2NvbnRhaW5zJyA6ICdlcXVhbHMnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICBtZWRpdXNRdWVyeVBhcmFtPy5zb3J0UHJvcGVydHk/LmZvckVhY2goKHMsIGlkeCkgPT4ge1xuICAgICAgICAgICAgcHJpbWVTb3J0TWV0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICBmaWVsZDogcyxcbiAgICAgICAgICAgICAgICBvcmRlcjogKG1lZGl1c1F1ZXJ5UGFyYW0/LnNvcnRBc2M/LltpZHhdID8/IHRydWUpID8gMSA6IC0xXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbWVkaXVzUXVlcnlQYXJhbT8uZmlsdGVyUGFyYW1zPy5mb3JFYWNoKChmLCBpZHgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB0aGlzLmZpbHRlckRlc2NyaXB0b3JzLmZpbmQoZmQgPT4gZmQuZmlsdGVyUHJvcGVydHkgPT09IGYucHJvcGVydHkgfHwgZmQucHJvcGVydHkgPT09IGYucHJvcGVydHkpO1xuICAgICAgICAgICAgY29uc3Qgb3BlcmF0b3IgPSBNZWRpdXNSZXN0VXRpbC5tYXRjaE1vZGVNYXBwaW5nLmZpbmQobWFwcGluZyA9PiBtYXBwaW5nWzJdID09PSBmLmZpbHRlck1hdGNoVHlwZSk7XG4gICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAmJiBvcGVyYXRvcikge1xuICAgICAgICAgICAgICAgIHByaW1lRmlsdGVyTWV0YVtkZXNjcmlwdG9yLnByb3BlcnR5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGYuZmlsdGVyVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoTW9kZTogb3BlcmF0b3JbMF1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm11bHRpU29ydE1ldGEgPSBwcmltZVNvcnRNZXRhO1xuICAgICAgICB0aGlzLmZpbHRlck1ldGFkYXRhID0gcHJpbWVGaWx0ZXJNZXRhO1xuICAgICAgICB0aGlzLnJvd3MgPSBtZWRpdXNRdWVyeVBhcmFtPy5pdGVtc1BlclBhZ2UgPz8gdGhpcy5yb3dzUGVyUGFnZU9wdGlvbnNbMF07XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gbWVkaXVzUXVlcnlQYXJhbT8uaXRlbXNPZmZzZXQgPz8gMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERlZmF1bHRTb3J0TWV0YSgpOiBTb3J0TWV0YVtdIHtcbiAgICAgICAgaWYgKHRoaXMuZGVzY3JpcHRvci5oYXNEZWZhdWx0U29ydCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRvci5kZWZhdWx0U29ydFByb3BlcnR5Lm1hcCgocCwgaWR4KSA9PiA8U29ydE1ldGE+e1xuICAgICAgICAgICAgICAgIGZpZWxkOiBwLFxuICAgICAgICAgICAgICAgIG9yZGVyOiB0aGlzLmRlc2NyaXB0b3IuZGVmYXVsdFNvcnRBc2NbaWR4XSA/IDEgOiAtMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2IFtzdHlsZS5oZWlnaHRdPVwic2Nyb2xsSGVpZ2h0ID09PSAnZmxleCcgPyAnY2FsYygxMDB2aCAtICcgKyBkZXNjcmlwdG9yLnRhYmxlRnVsbEhlaWdodE9mZnNldCArICdweCknIDogbnVsbFwiPlxuICAgIDwhLS0gTVVTVCBOT1QgdXNlIG9ic2VydmFibGUgZm9yIHZhbHVlIHdoZW4gdXNpbmcgdmlydHVhbCBzY3JvbGwgLSBkb2VzIG5vdCB3b3JrIGZvciBzb21lIHJlYXNvbiAtLT5cbiAgICA8cC10YWJsZSAqbmdJZj1cIiF1c2VRdWVyeVBhcmFtcyB8fCB1c2VRdWVyeVBhcmFtc0luaXRpYWxpemVkXCJcbiAgICAgICAgICAgICBbdmFsdWVdPVwiaW5maW5pdGVTY3JvbGwgPyBkYXRhUHJvdmlkZXJJbmZpbml0ZVNjcm9sbEl0ZW1zIDogKChxdWVyeVJlc3VsdCQgfCBhc3luYyk/LnBhZ2VEYXRhID8/IFtdKVwiXG4gICAgICAgICAgICAgW2RhdGFLZXldPVwiJGFueShkZXNjcmlwdG9yLmRhdGFLZXlQcm9wZXJ0eSlcIlxuICAgICAgICAgICAgIFtsYXp5XT1cInVzZURhdGFQcm92aWRlclwiXG4gICAgICAgICAgICAgW2xvYWRpbmddPVwiKGxvYWRpbmckIHwgYXN5bmMpID8/IGZhbHNlXCJcbiAgICAgICAgICAgICBbcGFnaW5hdG9yXT1cInVzZURhdGFQcm92aWRlciAmJiAhaW5maW5pdGVTY3JvbGxcIlxuICAgICAgICAgICAgIFtyb3dzXT1cIiRhbnkoaW5maW5pdGVTY3JvbGwgPyAyMCA6IHJvd3MpXCJcbiAgICAgICAgICAgICBbZmlyc3RdPVwiJGFueShpbmZpbml0ZVNjcm9sbCA/IDAgOiBvZmZzZXQpXCJcbiAgICAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cIiRhbnkoaW5maW5pdGVTY3JvbGwgPyBudWxsIDogKHF1ZXJ5UmVzdWx0JCB8IGFzeW5jKT8uYWxsRGF0YUNvdW50ID8/IDApXCJcbiAgICAgICAgICAgICBbcm93c1BlclBhZ2VPcHRpb25zXT1cIiRhbnkoaW5maW5pdGVTY3JvbGwgPyBudWxsIDogcm93c1BlclBhZ2VPcHRpb25zKVwiXG4gICAgICAgICAgICAgW3Nob3dDdXJyZW50UGFnZVJlcG9ydF09XCIhaW5maW5pdGVTY3JvbGxcIlxuICAgICAgICAgICAgIFtjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlXT1cIidtbmdUYWJsZS5wYWdpbmF0aW9uTXNnJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgW211bHRpU29ydE1ldGFdPVwiJGFueShtdWx0aVNvcnRNZXRhKVwiXG4gICAgICAgICAgICAgW2ZpbHRlcnNdPVwiZmlsdGVyTWV0YWRhdGFcIlxuICAgICAgICAgICAgIFsoc2VsZWN0aW9uKV09XCJzZWxlY3Rpb25cIlxuICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgW3Njcm9sbGFibGVdPVwiaW5maW5pdGVTY3JvbGxcIlxuICAgICAgICAgICAgIFt2aXJ0dWFsU2Nyb2xsXT1cImluZmluaXRlU2Nyb2xsXCJcbiAgICAgICAgICAgICBbdmlydHVhbFJvd0hlaWdodF09XCIkYW55KHJvd0hlaWdodClcIlxuICAgICAgICAgICAgIFtzY3JvbGxIZWlnaHRdPVwiJGFueShzY3JvbGxIZWlnaHQpXCJcbiAgICAgICAgICAgICBbcm93SG92ZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgKG9uTGF6eUxvYWQpPVwib25UYWJsZUxhenlMb2FkKCRldmVudClcIlxuICAgICAgICAgICAgIChvblNvcnQpPVwib25UYWJsZVNvcnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgKG9uRmlsdGVyKT1cIm9uVGFibGVGaWx0ZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgc29ydE1vZGU9XCJtdWx0aXBsZVwiXG4gICAgICAgICAgICAgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImNhcHRpb25UZW1wbGF0ZSB8fCBkZXNjcmlwdG9yLnRpdGxlXCIgcFRlbXBsYXRlPVwiY2FwdGlvblwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhcHRpb25UZW1wbGF0ZTsgZWxzZSBkZWZhdWx0Q2FwdGlvblwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjYXB0aW9uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Q2FwdGlvbj5cbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJwLW0tMFwiPnt7IGRlc2NyaXB0b3IudGl0bGUgfX08L2g1PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwic2VsZWN0aW9uRW5hYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8cC10YWJsZUhlYWRlckNoZWNrYm94PjwvcC10YWJsZUhlYWRlckNoZWNrYm94PlxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGRlc2NyaXB0b3IuY29sdW1uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJjb2wuaXNTb3J0RW5hYmxlZFwiIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLnByb3BlcnR5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBkZXNjcmlwdG9yLm1vZGVsLnR5cGVOYW1lICsgXCIucHJvcGVydGllcy5cIiArIGNvbC5wcm9wZXJ0eSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLXNvcnRJY29uIFtmaWVsZF09XCJjb2wucHJvcGVydHlcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1uZy10YWJsZS1jb2x1bW4tZmlsdGVyICpuZ0lmPVwiY29sLmZpbHRlckRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci5maWx0ZXJEaXNwbGF5ID09PSBmaWx0ZXJEaXNwbGF5TWVudVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWwtYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5XT1cImRlc2NyaXB0b3IuZmlsdGVyRGlzcGxheVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZXNjcmlwdG9yXT1cImNvbC5maWx0ZXJEZXNjcmlwdG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tbmctdGFibGUtY29sdW1uLWZpbHRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCIhY29sLmlzU29ydEVuYWJsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRlc2NyaXB0b3IubW9kZWwudHlwZU5hbWUgKyBcIi5wcm9wZXJ0aWVzLlwiICsgY29sLnByb3BlcnR5IHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtbmctdGFibGUtY29sdW1uLWZpbHRlciAqbmdJZj1cImNvbC5maWx0ZXJEZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZmlsdGVyRGlzcGxheSA9PT0gZmlsdGVyRGlzcGxheU1lbnVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1sLWF1dG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheV09XCJkZXNjcmlwdG9yLmZpbHRlckRpc3BsYXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVzY3JpcHRvcl09XCJjb2wuZmlsdGVyRGVzY3JpcHRvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbW5nLXRhYmxlLWNvbHVtbi1maWx0ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJjb2x1bW5BY3Rpb25UZW1wbGF0ZVwiPjwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPHRyICpuZ0lmPVwiZGVzY3JpcHRvci5maWx0ZXJEaXNwbGF5ID09PSBmaWx0ZXJEaXNwbGF5Um93XCI+XG4gICAgICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBjb2wgb2YgZGVzY3JpcHRvci5jb2x1bW5zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCIgKm5nSWY9XCJjb2wuZmlsdGVyRGVzY3JpcHRvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1uZy10YWJsZS1jb2x1bW4tZmlsdGVyIFtkaXNwbGF5XT1cImRlc2NyaXB0b3IuZmlsdGVyRGlzcGxheVwiIFtkZXNjcmlwdG9yXT1cImNvbC5maWx0ZXJEZXNjcmlwdG9yXCI+PC9tbmctdGFibGUtY29sdW1uLWZpbHRlcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJjb2x1bW5BY3Rpb25UZW1wbGF0ZVwiPjwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWl0ZW0gbGV0LWlkeD1cInJvd0luZGV4XCI+XG4gICAgICAgICAgICA8dHIgW3N0eWxlLmhlaWdodC5weF09XCJkZXNjcmlwdG9yLnJvd0hlaWdodFwiPlxuICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInNlbGVjdGlvbkVuYWJsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAtdGFibGVDaGVja2JveCBbdmFsdWVdPVwiaXRlbVwiPjwvcC10YWJsZUNoZWNrYm94PlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBjb2wgb2YgZGVzY3JpcHRvci5jb2x1bW5zXCIgKGNsaWNrKT1cIm9uQ2VsbENsaWNrKGNvbCwgaXRlbSwgaWR4KVwiIGNsYXNzPVwiY2xpY2thYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtbmctdGFibGUtY29sdW1uLXZhbHVlIFtkZXNjcmlwdG9yXT1cImNvbFwiIFtpdGVtXT1cIml0ZW1cIj48L21uZy10YWJsZS1jb2x1bW4tdmFsdWU+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJjb2x1bW5BY3Rpb25UZW1wbGF0ZVwiIGNsYXNzPVwidGV4dC1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29sdW1uQWN0aW9uVGVtcGxhdGU7IGNvbnRleHQ6IHsgcm93SXRlbTogaXRlbSwgcm93SW5kZXg6IGlkeCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImxvYWRpbmdib2R5XCI+XG4gICAgICAgICAgICA8dHIgW3N0eWxlLmhlaWdodC5weF09XCJkZXNjcmlwdG9yLnJvd0hlaWdodFwiPlxuICAgICAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cImRlc2NyaXB0b3IuY29sdW1ucy5sZW5ndGggKyAoY29sdW1uQWN0aW9uVGVtcGxhdGUgPyAxIDogMCkgKyAoc2VsZWN0aW9uRW5hYmxlZCA/IDEgOiAwKVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy10ZXh0XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxwLXNrZWxldG9uIFtuZ1N0eWxlXT1cInsnd2lkdGgnOiAnMTAwJSd9XCI+PC9wLXNrZWxldG9uPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cbiAgICAgICAgICAgIDx0ciBbc3R5bGUuaGVpZ2h0LnB4XT1cInJvd0hlaWdodFwiPlxuICAgICAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cImRlc2NyaXB0b3IuY29sdW1ucy5sZW5ndGggKyAoY29sdW1uQWN0aW9uVGVtcGxhdGUgPyAxIDogMCkgKyAoc2VsZWN0aW9uRW5hYmxlZCA/IDEgOiAwKVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAnbW5nVGFibGUubm9JdGVtcycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L3AtdGFibGU+XG48L2Rpdj5cbiJdfQ==