@mediusinc/mng-commons 0.0.1-rc.4 → 0.2.4

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 (453) hide show
  1. package/README.md +95 -0
  2. package/assets/i18n/en.json +54 -3
  3. package/assets/i18n/sl.json +54 -8
  4. package/assets/images/effect-ondark.png +0 -0
  5. package/assets/images/effect-ondark.svg +38 -0
  6. package/assets/images/effect-ondark@2x.png +0 -0
  7. package/assets/images/effect-onlight.png +0 -0
  8. package/assets/images/effect-onlight.svg +38 -0
  9. package/assets/images/effect-onlight@2x.png +0 -0
  10. package/assets/images/pages/exception-ondark.png +0 -0
  11. package/assets/images/pages/exception-onlight.png +0 -0
  12. package/assets/images/pages/login-ondark.png +0 -0
  13. package/assets/images/pages/login-onlight.png +0 -0
  14. package/esm2020/lib/api/models/builders/query-param.builder.mjs +48 -48
  15. package/esm2020/lib/api/models/filter-match-type.model.mjs +26 -24
  16. package/esm2020/lib/api/models/filter-param.model.mjs +46 -46
  17. package/esm2020/lib/api/models/index.mjs +9 -9
  18. package/esm2020/lib/api/models/mappers.mjs +17 -17
  19. package/esm2020/lib/api/models/query-mode.model.mjs +19 -19
  20. package/esm2020/lib/api/models/query-param.model.mjs +69 -69
  21. package/esm2020/lib/api/models/query-result.model.mjs +45 -45
  22. package/esm2020/lib/api/models/serialization.model.mjs +2 -2
  23. package/esm2020/lib/api/services/crud-api.abstract.service.mjs +72 -0
  24. package/esm2020/lib/api/services/index.mjs +2 -2
  25. package/esm2020/lib/api/utils/index.mjs +3 -3
  26. package/esm2020/lib/api/utils/medius-rest.util.mjs +122 -70
  27. package/esm2020/lib/api/utils/object-serializer.util.mjs +226 -226
  28. package/esm2020/lib/components/action/action.component.mjs +65 -63
  29. package/esm2020/lib/components/action/dialog/action-dialog.component.mjs +148 -157
  30. package/esm2020/lib/components/action/index.mjs +4 -4
  31. package/esm2020/lib/components/action/models/action-confirmation-service.model.mjs +2 -0
  32. package/esm2020/lib/components/action/models/action-execution.model.mjs +58 -0
  33. package/esm2020/lib/components/action/models/index.mjs +3 -0
  34. package/esm2020/lib/components/action/route/action-route.component.mjs +144 -144
  35. package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +114 -0
  36. package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +113 -0
  37. package/esm2020/lib/components/form/editor/form-editor.component.mjs +141 -142
  38. package/esm2020/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +19 -58
  39. package/esm2020/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +19 -51
  40. package/esm2020/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +16 -16
  41. package/esm2020/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +26 -26
  42. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +109 -109
  43. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +122 -122
  44. package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +17 -17
  45. package/esm2020/lib/components/form/formly/fields/index.mjs +8 -8
  46. package/esm2020/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +17 -17
  47. package/esm2020/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.mjs +16 -16
  48. package/esm2020/lib/components/form/formly/wrappers/index.mjs +3 -3
  49. package/esm2020/lib/components/form/index.mjs +4 -2
  50. package/esm2020/lib/components/form/models/form-editor.event.mjs +7 -0
  51. package/esm2020/lib/components/form/models/index.mjs +2 -0
  52. package/esm2020/lib/components/layout/breadcrumb.component.mjs +17 -0
  53. package/esm2020/lib/components/layout/footer.component.mjs +17 -0
  54. package/esm2020/lib/components/layout/index.mjs +7 -7
  55. package/esm2020/lib/components/layout/main-layout.component.mjs +54 -0
  56. package/esm2020/lib/components/layout/menu-item.component.mjs +173 -0
  57. package/esm2020/lib/components/layout/menu.component.mjs +20 -0
  58. package/esm2020/lib/components/layout/services/index.mjs +2 -0
  59. package/esm2020/lib/components/layout/services/main-layout.component.service.mjs +190 -0
  60. package/esm2020/lib/components/layout/topbar.component.mjs +59 -0
  61. package/esm2020/lib/components/tableview/index.mjs +6 -4
  62. package/esm2020/lib/components/tableview/models/index.mjs +2 -0
  63. package/esm2020/lib/components/tableview/models/table.event.mjs +16 -0
  64. package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +24 -24
  65. package/esm2020/lib/components/tableview/services/index.mjs +2 -0
  66. package/esm2020/lib/components/tableview/services/tableview.component.service.mjs +17 -0
  67. package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +74 -0
  68. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +25 -0
  69. package/esm2020/lib/components/tableview/table/table.component.mjs +307 -173
  70. package/esm2020/lib/components/tableview/tableview.component.mjs +82 -83
  71. package/esm2020/lib/config/formly.config.mjs +136 -136
  72. package/esm2020/lib/config/index.mjs +2 -2
  73. package/esm2020/lib/config/models/index.mjs +2 -0
  74. package/esm2020/lib/config/models/mng-config.model.mjs +2 -0
  75. package/esm2020/lib/data-providers/base.data-provider.mjs +24 -0
  76. package/esm2020/lib/data-providers/editor.data-provider.mjs +37 -0
  77. package/esm2020/lib/data-providers/index.mjs +6 -0
  78. package/esm2020/lib/data-providers/lookup.data-provider.mjs +16 -0
  79. package/esm2020/lib/data-providers/table.data-provider.mjs +2 -0
  80. package/esm2020/lib/data-providers/tableview.data-provider.mjs +17 -0
  81. package/esm2020/lib/descriptors/action.descriptor.mjs +332 -0
  82. package/esm2020/lib/descriptors/editor.descriptor.mjs +670 -0
  83. package/esm2020/lib/descriptors/field.validator.mjs +21 -0
  84. package/esm2020/lib/descriptors/index.mjs +8 -0
  85. package/esm2020/lib/descriptors/lookup.descriptor.mjs +2 -0
  86. package/esm2020/lib/descriptors/model.descriptor.mjs +34 -0
  87. package/esm2020/lib/descriptors/table.descriptor.mjs +401 -0
  88. package/esm2020/lib/descriptors/tableview.descriptor.mjs +131 -0
  89. package/esm2020/lib/directives/component.directive.mjs +23 -0
  90. package/esm2020/lib/directives/index.mjs +3 -2
  91. package/esm2020/lib/directives/template.directive.mjs +29 -25
  92. package/esm2020/lib/mng-commons.module.mjs +410 -313
  93. package/esm2020/lib/models/index.mjs +3 -0
  94. package/esm2020/lib/models/router.model.mjs +2 -0
  95. package/esm2020/lib/models/user.model.mjs +2 -0
  96. package/esm2020/lib/pipes/boolean.pipe.mjs +22 -0
  97. package/esm2020/lib/pipes/index.mjs +3 -2
  98. package/esm2020/lib/pipes/property-path.pipe.mjs +36 -36
  99. package/esm2020/lib/services/action.service.mjs +269 -269
  100. package/esm2020/lib/services/commons.service.mjs +354 -0
  101. package/esm2020/lib/services/configuration.service.mjs +78 -77
  102. package/esm2020/lib/services/index.mjs +5 -7
  103. package/esm2020/lib/services/navigation.service.mjs +48 -49
  104. package/esm2020/lib/services/providers/commons-init.provider.mjs +4 -0
  105. package/esm2020/lib/services/providers/config-service.provider.mjs +20 -12
  106. package/esm2020/lib/services/providers/formly-config.provider.mjs +31 -31
  107. package/esm2020/lib/services/providers/index.mjs +4 -3
  108. package/esm2020/lib/services/tokens/browser-storage.token.mjs +6 -0
  109. package/esm2020/lib/services/tokens/index.mjs +3 -0
  110. package/esm2020/lib/services/tokens/module-config.token.mjs +3 -0
  111. package/esm2020/lib/types/index.mjs +3 -0
  112. package/esm2020/lib/types/type.decorator.mjs +7 -0
  113. package/esm2020/lib/types/type.model.mjs +2 -0
  114. package/esm2020/lib/utils/editor-formly.util.mjs +176 -176
  115. package/esm2020/lib/utils/i18n.util.mjs +125 -91
  116. package/esm2020/lib/utils/index.mjs +6 -5
  117. package/esm2020/lib/utils/model.util.mjs +57 -38
  118. package/esm2020/lib/utils/toast.util.mjs +39 -26
  119. package/esm2020/lib/utils/type.util.mjs +39 -39
  120. package/esm2020/mediusinc-mng-commons.mjs +5 -5
  121. package/esm2020/public-api.mjs +36 -33
  122. package/fesm2015/mediusinc-mng-commons.mjs +6093 -5081
  123. package/fesm2015/mediusinc-mng-commons.mjs.map +1 -1
  124. package/fesm2020/mediusinc-mng-commons.mjs +6018 -5030
  125. package/fesm2020/mediusinc-mng-commons.mjs.map +1 -1
  126. package/lib/api/models/builders/query-param.builder.d.ts +11 -11
  127. package/lib/api/models/filter-match-type.model.d.ts +23 -21
  128. package/lib/api/models/filter-param.model.d.ts +23 -23
  129. package/lib/api/models/index.d.ts +8 -8
  130. package/lib/api/models/mappers.d.ts +6 -6
  131. package/lib/api/models/query-mode.model.d.ts +16 -16
  132. package/lib/api/models/query-param.model.d.ts +31 -31
  133. package/lib/api/models/query-result.model.d.ts +36 -36
  134. package/lib/api/models/serialization.model.d.ts +8 -8
  135. package/lib/api/services/{abstract-crud-api.service.d.ts → crud-api.abstract.service.d.ts} +23 -23
  136. package/lib/api/services/index.d.ts +1 -1
  137. package/lib/api/utils/index.d.ts +2 -2
  138. package/lib/api/utils/medius-rest.util.d.ts +12 -6
  139. package/lib/api/utils/object-serializer.util.d.ts +30 -30
  140. package/lib/components/action/action.component.d.ts +36 -36
  141. package/lib/components/action/dialog/action-dialog.component.d.ts +46 -48
  142. package/lib/components/action/index.d.ts +3 -3
  143. package/lib/{models/interfaces/confirmation-service.model.d.ts → components/action/models/action-confirmation-service.model.d.ts} +6 -6
  144. package/lib/{models/action/action.model.d.ts → components/action/models/action-execution.model.d.ts} +53 -53
  145. package/lib/components/action/models/index.d.ts +2 -0
  146. package/lib/components/action/route/action-route.component.d.ts +32 -32
  147. package/lib/components/form/autocomplete/autocomplete.component.d.ts +36 -0
  148. package/lib/components/form/dropdown/dropdown.component.d.ts +34 -0
  149. package/lib/components/form/editor/form-editor.component.d.ts +39 -39
  150. package/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.d.ts +11 -21
  151. package/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.d.ts +11 -19
  152. package/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +6 -6
  153. package/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.d.ts +12 -12
  154. package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +17 -17
  155. package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +36 -36
  156. package/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +6 -6
  157. package/lib/components/form/formly/fields/index.d.ts +7 -7
  158. package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +8 -8
  159. package/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.d.ts +8 -8
  160. package/lib/components/form/formly/wrappers/index.d.ts +2 -2
  161. package/lib/components/form/index.d.ts +3 -1
  162. package/lib/components/form/models/form-editor.event.d.ts +5 -0
  163. package/lib/components/form/models/index.d.ts +1 -0
  164. package/lib/components/layout/breadcrumb.component.d.ts +8 -0
  165. package/lib/components/layout/footer.component.d.ts +9 -0
  166. package/lib/components/layout/index.d.ts +6 -6
  167. package/lib/components/layout/main-layout.component.d.ts +21 -0
  168. package/lib/components/layout/menu-item.component.d.ts +29 -0
  169. package/lib/components/layout/menu.component.d.ts +10 -0
  170. package/lib/components/layout/services/index.d.ts +1 -0
  171. package/lib/components/layout/services/main-layout.component.service.d.ts +65 -0
  172. package/lib/components/layout/topbar.component.d.ts +25 -0
  173. package/lib/components/tableview/index.d.ts +5 -3
  174. package/lib/components/tableview/models/index.d.ts +1 -0
  175. package/lib/{models/events/table-event.model.d.ts → components/tableview/models/table.event.d.ts} +17 -17
  176. package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +14 -14
  177. package/lib/components/tableview/services/index.d.ts +1 -0
  178. package/lib/components/tableview/{tableview.component.service.d.ts → services/tableview.component.service.d.ts} +13 -13
  179. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +22 -0
  180. package/lib/components/tableview/table/column-value/column-value.component.d.ts +12 -0
  181. package/lib/components/tableview/table/table.component.d.ts +79 -47
  182. package/lib/components/tableview/tableview.component.d.ts +35 -36
  183. package/lib/config/formly.config.d.ts +14 -14
  184. package/lib/config/index.d.ts +1 -1
  185. package/lib/{models/config → config/models}/index.d.ts +1 -1
  186. package/lib/config/models/mng-config.model.d.ts +34 -0
  187. package/lib/data-providers/base.data-provider.d.ts +17 -0
  188. package/lib/data-providers/editor.data-provider.d.ts +25 -0
  189. package/lib/data-providers/index.d.ts +5 -0
  190. package/lib/data-providers/lookup.data-provider.d.ts +14 -0
  191. package/lib/data-providers/table.data-provider.d.ts +6 -0
  192. package/lib/data-providers/tableview.data-provider.d.ts +15 -0
  193. package/lib/{models/descriptors/action-descriptor.model.d.ts → descriptors/action.descriptor.d.ts} +148 -145
  194. package/lib/{models/descriptors/editor-descriptor.model.d.ts → descriptors/editor.descriptor.d.ts} +255 -255
  195. package/lib/{models/validators → descriptors}/field.validator.d.ts +18 -18
  196. package/lib/descriptors/index.d.ts +7 -0
  197. package/lib/descriptors/lookup.descriptor.d.ts +17 -0
  198. package/lib/{models/descriptors/model-descriptor.model.d.ts → descriptors/model.descriptor.d.ts} +15 -15
  199. package/lib/descriptors/table.descriptor.d.ts +164 -0
  200. package/lib/{models/descriptors/tableview-descriptor.model.d.ts → descriptors/tableview.descriptor.d.ts} +39 -38
  201. package/lib/directives/component.directive.d.ts +11 -0
  202. package/lib/directives/index.d.ts +2 -1
  203. package/lib/directives/template.directive.d.ts +13 -11
  204. package/lib/mng-commons.module.d.ts +79 -71
  205. package/lib/models/index.d.ts +2 -0
  206. package/lib/models/router.model.d.ts +14 -0
  207. package/lib/models/user.model.d.ts +8 -0
  208. package/lib/pipes/boolean.pipe.d.ts +7 -0
  209. package/lib/pipes/index.d.ts +2 -1
  210. package/lib/pipes/property-path.pipe.d.ts +7 -7
  211. package/lib/services/action.service.d.ts +92 -92
  212. package/lib/services/commons.service.d.ts +72 -0
  213. package/lib/services/configuration.service.d.ts +35 -35
  214. package/lib/services/index.d.ts +4 -6
  215. package/lib/services/navigation.service.d.ts +14 -14
  216. package/lib/services/providers/commons-init.provider.d.ts +2 -0
  217. package/lib/services/providers/config-service.provider.d.ts +5 -5
  218. package/lib/services/providers/formly-config.provider.d.ts +4 -4
  219. package/lib/services/providers/index.d.ts +3 -2
  220. package/lib/services/tokens/browser-storage.token.d.ts +2 -0
  221. package/lib/services/tokens/index.d.ts +2 -0
  222. package/lib/services/tokens/module-config.token.d.ts +3 -0
  223. package/lib/{models/types → types}/index.d.ts +2 -2
  224. package/lib/{models/types → types}/type.decorator.d.ts +2 -2
  225. package/lib/{models/types → types}/type.model.d.ts +10 -10
  226. package/lib/utils/editor-formly.util.d.ts +9 -9
  227. package/lib/utils/i18n.util.d.ts +18 -15
  228. package/lib/utils/index.d.ts +5 -4
  229. package/lib/utils/model.util.d.ts +7 -5
  230. package/lib/utils/toast.util.d.ts +13 -12
  231. package/lib/utils/type.util.d.ts +15 -15
  232. package/mediusinc-mng-commons.d.ts +5 -5
  233. package/package.json +37 -36
  234. package/public-api.d.ts +25 -22
  235. package/scss/common/layout/_breadcrumb.scss +96 -0
  236. package/scss/common/layout/_config.scss +101 -0
  237. package/scss/common/layout/_dashboard.scss +16 -0
  238. package/scss/common/layout/_exception.scss +131 -0
  239. package/scss/common/layout/_footer.scss +29 -0
  240. package/scss/common/layout/_help.scss +157 -0
  241. package/scss/common/layout/_inlinemenu.scss +55 -0
  242. package/scss/common/layout/_invoice.scss +176 -0
  243. package/scss/common/layout/_landing.scss +639 -0
  244. package/scss/common/layout/_layout_dark.scss +23 -0
  245. package/scss/common/layout/_layout_light.scss +23 -0
  246. package/scss/common/layout/_loader.scss +18 -0
  247. package/scss/common/layout/_login.scss +106 -0
  248. package/scss/common/layout/_main.scss +45 -0
  249. package/scss/common/layout/_mixins.scss +214 -0
  250. package/scss/common/layout/_rightmenu.scss +125 -0
  251. package/scss/common/layout/_topbar.scss +189 -0
  252. package/scss/common/layout/_typography.scss +63 -0
  253. package/scss/common/layout/_utils.scss +96 -0
  254. package/scss/common/layout/_widgets.scss +391 -0
  255. package/scss/common/layout/menu/_menu.scss +7 -0
  256. package/scss/common/layout/menu/_menu_common.scss +183 -0
  257. package/scss/common/layout/menu/_menu_overlay.scss +52 -0
  258. package/scss/common/layout/menu/_menu_sidebar.scss +232 -0
  259. package/scss/common/layout/menu/_menu_slim.scss +138 -0
  260. package/scss/common/layout/menu/_menu_static.scss +70 -0
  261. package/scss/common/layout/menu/_menu_theme.scss +365 -0
  262. package/scss/common/theme/_theme_dark.scss +5 -0
  263. package/scss/common/theme/_theme_light.scss +5 -0
  264. package/scss/common/theme/designer/_colors.scss +18 -0
  265. package/scss/common/theme/designer/_common.scss +40 -0
  266. package/scss/common/theme/designer/_components.scss +101 -0
  267. package/scss/common/theme/designer/_mixins.scss +174 -0
  268. package/scss/common/theme/designer/components/button/_button.scss +560 -0
  269. package/scss/common/theme/designer/components/button/_speeddial.scss +79 -0
  270. package/scss/common/theme/designer/components/button/_splitbutton.scss +1 -0
  271. package/scss/common/theme/designer/components/data/_carousel.scss +37 -0
  272. package/scss/common/theme/designer/components/data/_datatable.scss +266 -0
  273. package/scss/common/theme/designer/components/data/_dataview.scss +55 -0
  274. package/scss/common/theme/designer/components/data/_filter.scss +138 -0
  275. package/scss/common/theme/designer/components/data/_fullcalendar.scss +324 -0
  276. package/scss/common/theme/designer/components/data/_orderlist.scss +91 -0
  277. package/scss/common/theme/designer/components/data/_organizationchart.scss +50 -0
  278. package/scss/common/theme/designer/components/data/_paginator.scss +83 -0
  279. package/scss/common/theme/designer/components/data/_picklist.scss +91 -0
  280. package/scss/common/theme/designer/components/data/_timeline.scss +38 -0
  281. package/scss/common/theme/designer/components/data/_tree.scss +144 -0
  282. package/scss/common/theme/designer/components/data/_treetable.scss +242 -0
  283. package/scss/common/theme/designer/components/data/_virtualscroller.scss +28 -0
  284. package/scss/common/theme/designer/components/file/_fileupload.scss +58 -0
  285. package/scss/common/theme/designer/components/input/_autocomplete.scss +103 -0
  286. package/scss/common/theme/designer/components/input/_calendar.scss +212 -0
  287. package/scss/common/theme/designer/components/input/_cascadeselect.scss +98 -0
  288. package/scss/common/theme/designer/components/input/_checkbox.scss +85 -0
  289. package/scss/common/theme/designer/components/input/_chips.scss +41 -0
  290. package/scss/common/theme/designer/components/input/_colorpicker.scss +19 -0
  291. package/scss/common/theme/designer/components/input/_dropdown.scss +136 -0
  292. package/scss/common/theme/designer/components/input/_editor.scss +122 -0
  293. package/scss/common/theme/designer/components/input/_inputgroup.scss +69 -0
  294. package/scss/common/theme/designer/components/input/_inputmask.scss +3 -0
  295. package/scss/common/theme/designer/components/input/_inputnumber.scss +3 -0
  296. package/scss/common/theme/designer/components/input/_inputswitch.scss +58 -0
  297. package/scss/common/theme/designer/components/input/_inputtext.scss +97 -0
  298. package/scss/common/theme/designer/components/input/_listbox.scss +82 -0
  299. package/scss/common/theme/designer/components/input/_multiselect.scss +164 -0
  300. package/scss/common/theme/designer/components/input/_password.scss +33 -0
  301. package/scss/common/theme/designer/components/input/_radiobutton.scss +78 -0
  302. package/scss/common/theme/designer/components/input/_rating.scss +48 -0
  303. package/scss/common/theme/designer/components/input/_selectbutton.scss +50 -0
  304. package/scss/common/theme/designer/components/input/_slider.scss +69 -0
  305. package/scss/common/theme/designer/components/input/_togglebutton.scss +48 -0
  306. package/scss/common/theme/designer/components/input/_treeselect.scss +89 -0
  307. package/scss/common/theme/designer/components/menu/_breadcrumb.scss +42 -0
  308. package/scss/common/theme/designer/components/menu/_contextmenu.scss +50 -0
  309. package/scss/common/theme/designer/components/menu/_dock.scss +51 -0
  310. package/scss/common/theme/designer/components/menu/_megamenu.scss +102 -0
  311. package/scss/common/theme/designer/components/menu/_menu.scss +41 -0
  312. package/scss/common/theme/designer/components/menu/_menubar.scss +179 -0
  313. package/scss/common/theme/designer/components/menu/_panelmenu.scss +137 -0
  314. package/scss/common/theme/designer/components/menu/_slidemenu.scss +55 -0
  315. package/scss/common/theme/designer/components/menu/_steps.scss +55 -0
  316. package/scss/common/theme/designer/components/menu/_tabmenu.scss +49 -0
  317. package/scss/common/theme/designer/components/menu/_tieredmenu.scss +56 -0
  318. package/scss/common/theme/designer/components/messages/_inlinemessage.scss +64 -0
  319. package/scss/common/theme/designer/components/messages/_message.scss +102 -0
  320. package/scss/common/theme/designer/components/messages/_toast.scss +95 -0
  321. package/scss/common/theme/designer/components/misc/_avatar.scss +30 -0
  322. package/scss/common/theme/designer/components/misc/_badge.scss +48 -0
  323. package/scss/common/theme/designer/components/misc/_blockui.scss +3 -0
  324. package/scss/common/theme/designer/components/misc/_chip.scss +36 -0
  325. package/scss/common/theme/designer/components/misc/_inplace.scss +17 -0
  326. package/scss/common/theme/designer/components/misc/_progressbar.scss +17 -0
  327. package/scss/common/theme/designer/components/misc/_scrolltop.scss +20 -0
  328. package/scss/common/theme/designer/components/misc/_skeleton.scss +8 -0
  329. package/scss/common/theme/designer/components/misc/_tag.scss +33 -0
  330. package/scss/common/theme/designer/components/misc/_terminal.scss +11 -0
  331. package/scss/common/theme/designer/components/multimedia/_galleria.scss +141 -0
  332. package/scss/common/theme/designer/components/overlay/_confirmpopup.scss +67 -0
  333. package/scss/common/theme/designer/components/overlay/_dialog.scss +63 -0
  334. package/scss/common/theme/designer/components/overlay/_overlaypanel.scss +62 -0
  335. package/scss/common/theme/designer/components/overlay/_sidebar.scss +27 -0
  336. package/scss/common/theme/designer/components/overlay/_tooltip.scss +33 -0
  337. package/scss/common/theme/designer/components/panel/_accordion.scss +119 -0
  338. package/scss/common/theme/designer/components/panel/_card.scss +30 -0
  339. package/scss/common/theme/designer/components/panel/_divider.scss +31 -0
  340. package/scss/common/theme/designer/components/panel/_fieldset.scss +47 -0
  341. package/scss/common/theme/designer/components/panel/_panel.scss +42 -0
  342. package/scss/common/theme/designer/components/panel/_scrollpanel.scss +6 -0
  343. package/scss/common/theme/designer/components/panel/_splitter.scss +19 -0
  344. package/scss/common/theme/designer/components/panel/_tabview.scss +66 -0
  345. package/scss/common/theme/designer/components/panel/_toolbar.scss +10 -0
  346. package/scss/common/theme/extensions/_button.scss +99 -0
  347. package/scss/common/theme/extensions/_calendar.scss +18 -0
  348. package/scss/common/theme/extensions/_card.scss +6 -0
  349. package/scss/common/theme/extensions/_carousel.scss +13 -0
  350. package/scss/common/theme/extensions/_checkbox.scss +10 -0
  351. package/scss/common/theme/extensions/_contextmenu.scss +16 -0
  352. package/scss/common/theme/extensions/_datatable.scss +83 -0
  353. package/scss/common/theme/extensions/_dialog.scss +14 -0
  354. package/scss/common/theme/extensions/_fieldset.scss +6 -0
  355. package/scss/common/theme/extensions/_galleria.scss +25 -0
  356. package/scss/common/theme/extensions/_megamenu.scss +18 -0
  357. package/scss/common/theme/extensions/_menu.scss +14 -0
  358. package/scss/common/theme/extensions/_menubar.scss +14 -0
  359. package/scss/common/theme/extensions/_orderlist.scss +38 -0
  360. package/scss/common/theme/extensions/_paginator.scss +19 -0
  361. package/scss/common/theme/extensions/_panelmenu.scss +20 -0
  362. package/scss/common/theme/extensions/_password.scss +5 -0
  363. package/scss/common/theme/extensions/_picklist.scss +38 -0
  364. package/scss/common/theme/extensions/_radiobutton.scss +8 -0
  365. package/scss/common/theme/extensions/_sidebar.scss +19 -0
  366. package/scss/common/theme/extensions/_slidemenu.scss +10 -0
  367. package/scss/common/theme/extensions/_slider.scss +6 -0
  368. package/scss/common/theme/extensions/_steps.scss +50 -0
  369. package/scss/common/theme/extensions/_tieredmenu.scss +14 -0
  370. package/scss/common/theme/extensions/_toast.scss +6 -0
  371. package/scss/common/theme/extensions/_tree.scss +36 -0
  372. package/scss/common/theme/extensions/_treetable.scss +35 -0
  373. package/scss/common/theme/extensions/_vendor_extensions.scss +27 -0
  374. package/scss/common/variables/layout/_common.scss +12 -0
  375. package/scss/common/variables/layout/_layout_dark.scss +71 -0
  376. package/scss/common/variables/layout/_layout_light.scss +71 -0
  377. package/scss/common/variables/theme/_theme_dark.scss +897 -0
  378. package/scss/common/variables/theme/_theme_light.scss +885 -0
  379. package/scss/layout/default/_mng-variables-layout-dark.scss +2 -0
  380. package/scss/layout/default/_mng-variables-layout-light.scss +2 -0
  381. package/scss/layout/default/layout-dark.scss +2 -0
  382. package/scss/layout/default/layout-light.scss +2 -0
  383. package/scss/mng-commons-dark.scss +5 -0
  384. package/scss/mng-commons-light.scss +5 -0
  385. package/scss/mng-overrides/_layout_action.scss +3 -0
  386. package/scss/mng-overrides/_layout_dialog.scss +34 -0
  387. package/scss/mng-overrides/_layout_forms.scss +31 -0
  388. package/scss/mng-overrides/_layout_radio.scss +3 -0
  389. package/scss/mng-overrides/_layout_styles.scss +4 -0
  390. package/scss/mng-overrides/_theme_datatable.scss +9 -0
  391. package/scss/mng-overrides/_theme_dialog.scss +9 -0
  392. package/scss/mng-overrides/_theme_dropdown.scss +6 -0
  393. package/scss/mng-overrides/_theme_styles.scss +9 -0
  394. package/scss/mng-overrides/_theme_tableview.scss +94 -0
  395. package/scss/theme/default/_mng-variables-theme-dark.scss +8 -0
  396. package/scss/theme/default/_mng-variables-theme-light.scss +8 -0
  397. package/scss/theme/default/theme-dark.scss +2 -0
  398. package/scss/theme/default/theme-light.scss +2 -0
  399. package/esm2020/lib/api/services/abstract-crud-api.service.mjs +0 -72
  400. package/esm2020/lib/components/layout/app.breadcrumb.component.mjs +0 -26
  401. package/esm2020/lib/components/layout/app.footer.component.mjs +0 -35
  402. package/esm2020/lib/components/layout/app.main.component.mjs +0 -25
  403. package/esm2020/lib/components/layout/app.main.component.service.mjs +0 -133
  404. package/esm2020/lib/components/layout/app.menu.component.mjs +0 -24
  405. package/esm2020/lib/components/layout/app.menuitem.component.mjs +0 -241
  406. package/esm2020/lib/components/layout/app.topbar.component.mjs +0 -135
  407. package/esm2020/lib/components/tableview/tableview.component.service.mjs +0 -18
  408. package/esm2020/lib/models/action/action.model.mjs +0 -58
  409. package/esm2020/lib/models/action/index.mjs +0 -2
  410. package/esm2020/lib/models/config/index.mjs +0 -2
  411. package/esm2020/lib/models/config/mng-config.model.mjs +0 -3
  412. package/esm2020/lib/models/descriptors/action-descriptor.model.mjs +0 -325
  413. package/esm2020/lib/models/descriptors/editor-descriptor.model.mjs +0 -666
  414. package/esm2020/lib/models/descriptors/index.mjs +0 -6
  415. package/esm2020/lib/models/descriptors/model-descriptor.model.mjs +0 -34
  416. package/esm2020/lib/models/descriptors/table-descriptor.model.mjs +0 -123
  417. package/esm2020/lib/models/descriptors/tableview-descriptor.model.mjs +0 -124
  418. package/esm2020/lib/models/events/editor-event.model.mjs +0 -14
  419. package/esm2020/lib/models/events/index.mjs +0 -3
  420. package/esm2020/lib/models/events/table-event.model.mjs +0 -16
  421. package/esm2020/lib/models/interfaces/confirmation-service.model.mjs +0 -2
  422. package/esm2020/lib/models/interfaces/index.mjs +0 -2
  423. package/esm2020/lib/models/providers/data-provider.model.mjs +0 -86
  424. package/esm2020/lib/models/providers/index.mjs +0 -2
  425. package/esm2020/lib/models/types/index.mjs +0 -3
  426. package/esm2020/lib/models/types/type.decorator.mjs +0 -7
  427. package/esm2020/lib/models/types/type.model.mjs +0 -2
  428. package/esm2020/lib/models/validators/field.validator.mjs +0 -21
  429. package/esm2020/lib/models/validators/index.mjs +0 -2
  430. package/esm2020/lib/services/breadcrumb.service.mjs +0 -74
  431. package/esm2020/lib/services/menu.service.mjs +0 -37
  432. package/esm2020/lib/services/settings.service.mjs +0 -81
  433. package/lib/components/layout/app.breadcrumb.component.d.ts +0 -14
  434. package/lib/components/layout/app.footer.component.d.ts +0 -8
  435. package/lib/components/layout/app.main.component.d.ts +0 -12
  436. package/lib/components/layout/app.main.component.service.d.ts +0 -40
  437. package/lib/components/layout/app.menu.component.d.ts +0 -15
  438. package/lib/components/layout/app.menuitem.component.d.ts +0 -31
  439. package/lib/components/layout/app.topbar.component.d.ts +0 -15
  440. package/lib/models/action/index.d.ts +0 -1
  441. package/lib/models/config/mng-config.model.d.ts +0 -20
  442. package/lib/models/descriptors/index.d.ts +0 -5
  443. package/lib/models/descriptors/table-descriptor.model.d.ts +0 -45
  444. package/lib/models/events/editor-event.model.d.ts +0 -11
  445. package/lib/models/events/index.d.ts +0 -2
  446. package/lib/models/interfaces/index.d.ts +0 -1
  447. package/lib/models/providers/data-provider.model.d.ts +0 -62
  448. package/lib/models/providers/index.d.ts +0 -1
  449. package/lib/models/validators/index.d.ts +0 -1
  450. package/lib/services/breadcrumb.service.d.ts +0 -15
  451. package/lib/services/menu.service.d.ts +0 -16
  452. package/lib/services/settings.service.d.ts +0 -30
  453. package/mediusinc-mng-commons-0.0.1-rc.4.tgz +0 -0
@@ -1,173 +1,307 @@
1
- import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Input, 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 { QueryParam, QueryResult } from '../../../api/models';
6
- import { MediusRestUtil } from '../../../api/utils';
7
- import { MngTableCellClickEvent, MngTableLoadEvent } from '../../../models/events';
8
- import { TemplateDirective } from '../../../directives';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "primeng/table";
11
- import * as i2 from "@angular/common";
12
- import * as i3 from "primeng/api";
13
- import * as i4 from "@ngx-translate/core";
14
- import * as i5 from "../../../pipes/property-path.pipe";
15
- export class TableComponent {
16
- constructor(injector) {
17
- this.injector = injector;
18
- // extra features input
19
- this.selectionEnabled = false;
20
- // event outputs
21
- this.loadEventEmitter = new EventEmitter();
22
- this.cellClickEventEmitter = new EventEmitter();
23
- this.selectionChangeEventEmitter = new EventEmitter();
24
- this.useDataProvider = false;
25
- this.dataProviderService = null;
26
- this.dataProviderQueryResultSubject = new ReplaySubject(1);
27
- this.dataProviderLoadingSubject = new ReplaySubject(1);
28
- this.rowsPerPageOptions = [10, 25, 50];
29
- this.selection = [];
30
- this.subscriptions = [];
31
- }
32
- ngOnInit() {
33
- // initalize if default sort is set
34
- if (this.descriptor.hasDefaultSort) {
35
- this.multiSortMeta = this.descriptor.defaultSortProperty.map((p, idx) => ({
36
- field: p,
37
- order: this.descriptor.defaultSortAsc[idx] ? 1 : -1
38
- }));
39
- }
40
- // check if data provider is supplied, if is, use it primarily
41
- if (this.dataProvider) {
42
- // map subjects to observables and initiate data
43
- this.useDataProvider = true;
44
- this.queryResult$ = this.dataProviderQueryResultSubject.asObservable();
45
- this.loading$ = this.dataProviderLoadingSubject.asObservable();
46
- const emptyQueryResult = new QueryResult();
47
- emptyQueryResult.pageData = [];
48
- emptyQueryResult.allDataCount = 0;
49
- this.dataProviderLoadingSubject.next(false);
50
- this.dataProviderQueryResultSubject.next(emptyQueryResult);
51
- // inject service
52
- if (this.dataProvider.serviceType) {
53
- this.dataProviderService = this.injector.get(this.dataProvider.serviceType);
54
- }
55
- }
56
- else {
57
- // if query result is provided, use it as secondary source or else try to use items
58
- if (this.queryResult) {
59
- this.queryResult$ = this.queryResult instanceof Observable ? this.queryResult : of(this.queryResult);
60
- }
61
- else if (!this.queryResult && this.items) {
62
- this.queryResult$ = (this.items instanceof Observable ? this.items : of(this.items)).pipe(
63
- // distinctUntilChanged((v1, v2) => v1.length === v2.length &&
64
- // v1.every((v1i, idx) => v1i[this.descriptor.dataKeyProperty] === v2[idx][this.descriptor.dataKeyProperty])),
65
- map(items => {
66
- const queryResult = new QueryResult();
67
- queryResult.pageData = items;
68
- queryResult.allDataCount = items.length;
69
- return queryResult;
70
- }));
71
- }
72
- if (typeof this.loading !== 'undefined') {
73
- this.loading$ = this.loading instanceof Observable ? this.loading : of(this.loading);
74
- }
75
- }
76
- }
77
- ngAfterContentInit() {
78
- this.templates.forEach(template => {
79
- switch (template.getType()) {
80
- case 'caption':
81
- this.captionTemplate = template.template;
82
- break;
83
- case 'columnAction':
84
- this.columnActionTemplate = template.template;
85
- break;
86
- }
87
- });
88
- }
89
- ngOnDestroy() {
90
- this.subscriptions.forEach(s => s.unsubscribe());
91
- }
92
- reload(emitEvent = false, resetParams = false) {
93
- this.loadTableWithDataProvider(resetParams ? null : (this.dataProviderLatestLazyLoadEvent ?? null), emitEvent);
94
- }
95
- onTableLazyLoad(event) {
96
- if (this.useDataProvider) {
97
- this.loadTableWithDataProvider(event);
98
- }
99
- }
100
- onCellClick(col, item, idx) {
101
- const mngEvent = new MngTableCellClickEvent(col, item, idx);
102
- this.cellClickEventEmitter.next(mngEvent);
103
- }
104
- onSelectionChange(event) {
105
- this.selectionChangeEventEmitter.emit(event);
106
- }
107
- loadTableWithDataProvider(lazyLoadEvent, emitEvent = true) {
108
- if (!this.useDataProvider) {
109
- return;
110
- }
111
- if (this.dataProviderSubscription) {
112
- this.dataProviderSubscription.unsubscribe();
113
- }
114
- this.dataProviderLoadingSubject.next(true);
115
- this.multiSortMeta = lazyLoadEvent?.multiSortMeta;
116
- const queryParams = lazyLoadEvent
117
- ? MediusRestUtil.fromLazyLoadEventToQueryParams(lazyLoadEvent)
118
- : new QueryParam();
119
- if (!queryParams.sortProperty && this.descriptor.hasDefaultSort) {
120
- queryParams.sortProperty = [...this.descriptor.defaultSortProperty];
121
- queryParams.sortAsc = [...this.descriptor.defaultSortAsc];
122
- }
123
- this.dataProviderSubscription = this.dataProvider?.getAll(queryParams, this.dataProviderService)
124
- .pipe(first(), finalize(() => this.dataProviderLoadingSubject.next(false)))
125
- .subscribe(res => {
126
- this.dataProviderLatestLazyLoadEvent = lazyLoadEvent ?? undefined;
127
- this.dataProviderQueryResultSubject.next(res);
128
- }, err => {
129
- // this.messageService.add({severity: 'error', summary: 'Error', detail: 'Failed to fetch table items', life: 3000});
130
- console.error(err);
131
- });
132
- if (emitEvent) {
133
- const mngEvent = new MngTableLoadEvent();
134
- mngEvent.originalEvent = lazyLoadEvent ?? undefined;
135
- mngEvent.queryParam = queryParams;
136
- this.loadEventEmitter.next(mngEvent);
137
- }
138
- }
139
- }
140
- TableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: TableComponent, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
141
- 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", 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: "<p-table [value]=\"(queryResult$ | async)?.pageData ?? []\"\n [dataKey]=\"$any(descriptor.dataKeyProperty)\"\n [lazy]=\"useDataProvider\"\n (onLazyLoad)=\"onTableLazyLoad($event)\"\n [loading]=\"(loading$ | async) ?? false\"\n [paginator]=\"useDataProvider\"\n [rows]=\"rowsPerPageOptions[0]\"\n [totalRecords]=\"(queryResult$ | async)?.allDataCount ?? 0\"\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\n [showCurrentPageReport]=\"true\"\n [currentPageReportTemplate]=\"'mngTable.paginationMsg' | translate\"\n [multiSortMeta]=\"$any(multiSortMeta)\"\n sortMode=\"multiple\"\n [(selection)]=\"selection\"\n (selectionChange)=\"onSelectionChange($event)\"\n responsiveLayout=\"scroll\">\n {{ descriptor.hasDefaultSort}}\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 <p-columnFilter *ngIf=\"col.isFilterEnabled\" class=\"ml-auto\" type=\"text\" display=\"menu\" matchMode=\"equals\"\n [field]=\"col.property\"\n [showOperator]=\"false\" [showAddButton]=\"false\" [hideOnClear]=\"true\">\n </p-columnFilter>\n </div>\n </th>\n <th *ngIf=\"!col.isSortEnabled\">\n <div class=\"flex justify-content-between align-items-center\">\n {{ descriptor.model.typeName + \".properties.\" + col.property | translate }}\n <p-columnFilter *ngIf=\"col.isFilterEnabled\" class=\"ml-auto\" type=\"text\" display=\"menu\" matchMode=\"equals\"\n [field]=\"col.property\"\n [showOperator]=\"false\" [showAddButton]=\"false\" [hideOnClear]=\"true\">\n </p-columnFilter>\n </div>\n </th>\n </ng-container>\n <th *ngIf=\"columnActionTemplate\"></th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-item let-idx=\"rowIndex\">\n <tr>\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 {{ col.displayPropertyPath ? (item | propertyPath: col.displayPropertyPath) : item[col.property] }}\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=\"emptymessage\">\n <tr>\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", components: [{ type: i1.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: i1.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { type: i1.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { type: i1.ColumnFilter, selector: "p-columnFilter", inputs: ["field", "type", "display", "showMenu", "matchMode", "operator", "showOperator", "showClearButton", "showApplyButton", "showMatchModes", "showAddButton", "hideOnClear", "placeholder", "matchModeOptions", "maxConstraints", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "locale", "localeMatcher", "currency", "currencyDisplay", "useGrouping"] }, { type: i1.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }], pipes: { "async": i2.AsyncPipe, "translate": i4.TranslatePipe, "propertyPath": i5.PropertyPathPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
142
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: TableComponent, decorators: [{
143
- type: Component,
144
- args: [{ selector: 'mng-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<p-table [value]=\"(queryResult$ | async)?.pageData ?? []\"\n [dataKey]=\"$any(descriptor.dataKeyProperty)\"\n [lazy]=\"useDataProvider\"\n (onLazyLoad)=\"onTableLazyLoad($event)\"\n [loading]=\"(loading$ | async) ?? false\"\n [paginator]=\"useDataProvider\"\n [rows]=\"rowsPerPageOptions[0]\"\n [totalRecords]=\"(queryResult$ | async)?.allDataCount ?? 0\"\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\n [showCurrentPageReport]=\"true\"\n [currentPageReportTemplate]=\"'mngTable.paginationMsg' | translate\"\n [multiSortMeta]=\"$any(multiSortMeta)\"\n sortMode=\"multiple\"\n [(selection)]=\"selection\"\n (selectionChange)=\"onSelectionChange($event)\"\n responsiveLayout=\"scroll\">\n {{ descriptor.hasDefaultSort}}\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 <p-columnFilter *ngIf=\"col.isFilterEnabled\" class=\"ml-auto\" type=\"text\" display=\"menu\" matchMode=\"equals\"\n [field]=\"col.property\"\n [showOperator]=\"false\" [showAddButton]=\"false\" [hideOnClear]=\"true\">\n </p-columnFilter>\n </div>\n </th>\n <th *ngIf=\"!col.isSortEnabled\">\n <div class=\"flex justify-content-between align-items-center\">\n {{ descriptor.model.typeName + \".properties.\" + col.property | translate }}\n <p-columnFilter *ngIf=\"col.isFilterEnabled\" class=\"ml-auto\" type=\"text\" display=\"menu\" matchMode=\"equals\"\n [field]=\"col.property\"\n [showOperator]=\"false\" [showAddButton]=\"false\" [hideOnClear]=\"true\">\n </p-columnFilter>\n </div>\n </th>\n </ng-container>\n <th *ngIf=\"columnActionTemplate\"></th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-item let-idx=\"rowIndex\">\n <tr>\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 {{ col.displayPropertyPath ? (item | propertyPath: col.displayPropertyPath) : item[col.property] }}\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=\"emptymessage\">\n <tr>\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" }]
145
- }], ctorParameters: function () { return [{ type: i0.Injector }]; }, propDecorators: { descriptor: [{
146
- type: Input
147
- }], items: [{
148
- type: Input
149
- }], queryResult: [{
150
- type: Input
151
- }], loading: [{
152
- type: Input
153
- }], dataProvider: [{
154
- type: Input
155
- }], selectionEnabled: [{
156
- type: Input
157
- }], loadEventEmitter: [{
158
- type: Output,
159
- args: ['onLoad']
160
- }], cellClickEventEmitter: [{
161
- type: Output,
162
- args: ['onCellClick']
163
- }], selectionChangeEventEmitter: [{
164
- type: Output,
165
- args: ['onSelectionChange']
166
- }], templates: [{
167
- type: ContentChildren,
168
- args: [TemplateDirective]
169
- }], primeTable: [{
170
- type: ViewChild,
171
- args: [Table]
172
- }] } });
173
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW5nLWNvbW1vbnMvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxldmlldy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbmctY29tbW9ucy9zcmMvbGliL2NvbXBvbmVudHMvdGFibGV2aWV3L3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBbUIsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQVksS0FBSyxFQUFxQixNQUFNLEVBQTBCLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUVqTSxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXBDLE9BQU8sRUFBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBZSxNQUFNLE1BQU0sQ0FBQztBQUNqRSxPQUFPLEVBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRCxPQUFPLEVBQUMsVUFBVSxFQUFFLFdBQVcsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzVELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUlsRCxPQUFPLEVBQUMsc0JBQXNCLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7OztBQU90RCxNQUFNLE9BQU8sY0FBYztJQTBDdkIsWUFBb0IsUUFBa0I7UUFBbEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQS9CdEMsdUJBQXVCO1FBQ1AscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBRWxELGdCQUFnQjtRQUNVLHFCQUFnQixHQUFH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QUFLO2dCQUNVLE9BQU87c0JBQXRCLEtBQUs7Z0JBQ1UsWUFBWTtzQkFBM0IsS0FBSztnQkFHVSxnQkFBZ0I7c0JBQS9CLEtBQUs7Z0JBR29CLGdCQUFnQjtzQkFBekMsTUFBTTt1QkFBQyxRQUFRO2dCQUNlLHFCQUFxQjtzQkFBbkQsTUFBTTt1QkFBQyxhQUFhO2dCQUNnQiwyQkFBMkI7c0JBQS9ELE1BQU07dUJBQUMsbUJBQW1CO2dCQUdTLFNBQVM7c0JBQTVDLGVBQWU7dUJBQUMsaUJBQWlCO2dCQUNSLFVBQVU7c0JBQW5DLFNBQVM7dUJBQUMsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWZ0ZXJDb250ZW50SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBFdmVudEVtaXR0ZXIsIEluamVjdG9yLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgUXVlcnlMaXN0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtUYWJsZX0gZnJvbSAncHJpbWVuZy90YWJsZSc7XG5pbXBvcnQge0xhenlMb2FkRXZlbnQsIFNvcnRNZXRhfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQge09ic2VydmFibGUsIG9mLCBSZXBsYXlTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtmaW5hbGl6ZSwgZmlyc3QsIG1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1F1ZXJ5UGFyYW0sIFF1ZXJ5UmVzdWx0fSBmcm9tICcuLi8uLi8uLi9hcGkvbW9kZWxzJztcbmltcG9ydCB7TWVkaXVzUmVzdFV0aWx9IGZyb20gJy4uLy4uLy4uL2FwaS91dGlscyc7XG5cbmltcG9ydCB7VGFibGVEZXNjcmlwdG9yLCBDb2x1bW5EZXNjcmlwdG9yfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZGVzY3JpcHRvcnMnO1xuaW1wb3J0IHtJVGFibGVEYXRhUHJvdmlkZXJ9IGZyb20gJy4uLy4uLy4uL21vZGVscy9wcm92aWRlcnMnO1xuaW1wb3J0IHtNbmdUYWJsZUNlbGxDbGlja0V2ZW50LCBNbmdUYWJsZUxvYWRFdmVudH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2V2ZW50cyc7XG5pbXBvcnQge1RlbXBsYXRlRGlyZWN0aXZlfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmVzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdtbmctdGFibGUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG5cbiAgICAvLyBtZXRhZGF0YSBpbnB1dFxuICAgIEBJbnB1dCgpIHB1YmxpYyBkZXNjcmlwdG9yITogVGFibGVEZXNjcmlwdG9yPFQ+O1xuICAgIFxuICAgIC8vIGRhdGEgc291cmNlIGlucHV0c1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpdGVtcz86IE9ic2VydmFibGU8QXJyYXk8VD4+fEFycmF5PFQ+O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBxdWVyeVJlc3VsdD86IE9ic2VydmFibGU8UXVlcnlSZXN1bHQ8VD4+fFF1ZXJ5UmVzdWx0PFQ+O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBsb2FkaW5nPzogT2JzZXJ2YWJsZTxib29sZWFuPnxib29sZWFuO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkYXRhUHJvdmlkZXI/OiBJVGFibGVEYXRhUHJvdmlkZXI8VCwgYW55PjtcbiAgICBcbiAgICAvLyBleHRyYSBmZWF0dXJlcyBpbnB1dFxuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3Rpb25FbmFibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvLyBldmVudCBvdXRwdXRzXG4gICAgQE91dHB1dCgnb25Mb2FkJykgcHJpdmF0ZSBsb2FkRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxNbmdUYWJsZUxvYWRFdmVudD4oKTtcbiAgICBAT3V0cHV0KCdvbkNlbGxDbGljaycpIHByaXZhdGUgY2VsbENsaWNrRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxNbmdUYWJsZUNlbGxDbGlja0V2ZW50PFQ+PigpO1xuICAgIEBPdXRwdXQoJ29uU2VsZWN0aW9uQ2hhbmdlJykgcHJpdmF0ZSBzZWxlY3Rpb25DaGFuZ2VFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PFQ+PigpO1xuXG4gICAgLy8gY29udGVudCBhbmQgdmlldyBxdWVyaWVzXG4gICAgQENvbnRlbnRDaGlsZHJlbihUZW1wbGF0ZURpcmVjdGl2ZSkgdGVtcGxhdGVzITogUXVlcnlMaXN0PFRlbXBsYXRlRGlyZWN0aXZlPjtcbiAgICBAVmlld0NoaWxkKFRhYmxlKSBwcml2YXRlIHByaW1lVGFibGUhOiBUYWJsZTtcblxuICAgIHB1YmxpYyBjYXB0aW9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIHB1YmxpYyBjb2x1bW5BY3Rpb25UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBwdWJsaWMgdXNlRGF0YVByb3ZpZGVyOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIHF1ZXJ5UmVzdWx0JD86IE9ic2VydmFibGU8UXVlcnlSZXN1bHQ8VD4+O1xuICAgIHB1YmxpYyBsb2FkaW5nJD86IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJTZXJ2aWNlOiBhbnkgPSBudWxsO1xuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyUXVlcnlSZXN1bHRTdWJqZWN0ID0gbmV3IFJlcGxheVN1YmplY3Q8UXVlcnlSZXN1bHQ8VD4+KDEpO1xuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyTG9hZGluZ1N1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxib29sZWFuPigxKTtcbiAgICBwcml2YXRlIGRhdGFQcm92aWRlckxhdGVzdExhenlMb2FkRXZlbnQ/OiBMYXp5TG9hZEV2ZW50O1xuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IHJvd3NQZXJQYWdlT3B0aW9ucyA9IFsxMCwgMjUsIDUwXTtcbiAgICBwdWJsaWMgbXVsdGlTb3J0TWV0YT86IFNvcnRNZXRhW107XG5cbiAgICBwdWJsaWMgc2VsZWN0aW9uOiBBcnJheTxUPiA9IFtdO1xuXG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XG5cbiAgICAgICAgLy8gaW5pdGFsaXplIGlmIGRlZmF1bHQgc29ydCBpcyBzZXRcbiAgICAgICAgaWYgKHRoaXMuZGVzY3JpcHRvci5oYXNEZWZhdWx0U29ydCkge1xuICAgICAgICAgICAgdGhpcy5tdWx0aVNvcnRNZXRhID0gdGhpcy5kZXNjcmlwdG9yLmRlZmF1bHRTb3J0UHJvcGVydHkubWFwKChwLCBpZHgpID0+IDxTb3J0TWV0YT57XG4gICAgICAgICAgICAgICAgZmllbGQ6IHAsXG4gICAgICAgICAgICAgICAgb3JkZXI6IHRoaXMuZGVzY3JpcHRvci5kZWZhdWx0U29ydEFzY1tpZHhdID8gMSA6IC0xXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayBpZiBkYXRhIHByb3ZpZGVyIGlzIHN1cHBsaWVkLCBpZiBpcywgdXNlIGl0IHByaW1hcmlseVxuICAgICAgICBpZiAodGhpcy5kYXRhUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIC8vIG1hcCBzdWJqZWN0cyB0byBvYnNlcnZhYmxlcyBhbmQgaW5pdGlhdGUgZGF0YVxuICAgICAgICAgICAgdGhpcy51c2VEYXRhUHJvdmlkZXIgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5xdWVyeVJlc3VsdCQgPSB0aGlzLmRhdGFQcm92aWRlclF1ZXJ5UmVzdWx0U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyQgPSB0aGlzLmRhdGFQcm92aWRlckxvYWRpbmdTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICAgICAgY29uc3QgZW1wdHlRdWVyeVJlc3VsdCA9IG5ldyBRdWVyeVJlc3VsdDxUPigpO1xuICAgICAgICAgICAgZW1wdHlRdWVyeVJlc3VsdC5wYWdlRGF0YSA9IFtdO1xuICAgICAgICAgICAgZW1wdHlRdWVyeVJlc3VsdC5hbGxEYXRhQ291bnQgPSAwO1xuICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJMb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyUXVlcnlSZXN1bHRTdWJqZWN0Lm5leHQoZW1wdHlRdWVyeVJlc3VsdClcblxuICAgICAgICAgICAgLy8gaW5qZWN0IHNlcnZpY2VcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFQcm92aWRlci5zZXJ2aWNlVHlwZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0PGFueT4odGhpcy5kYXRhUHJvdmlkZXIuc2VydmljZVR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgcXVlcnkgcmVzdWx0IGlzIHByb3ZpZGVkLCB1c2UgaXQgYXMgc2Vjb25kYXJ5IHNvdXJjZSBvciBlbHNlIHRyeSB0byB1c2UgaXRlbXNcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXJ5UmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWVyeVJlc3VsdCQgPSB0aGlzLnF1ZXJ5UmVzdWx0IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSA/IHRoaXMucXVlcnlSZXN1bHQgOiBvZih0aGlzLnF1ZXJ5UmVzdWx0KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMucXVlcnlSZXN1bHQgJiYgdGhpcy5pdGVtcykge1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnlSZXN1bHQkID0gKHRoaXMuaXRlbXMgaW5zdGFuY2VvZiBPYnNlcnZhYmxlID8gdGhpcy5pdGVtcyA6IG9mKHRoaXMuaXRlbXMpKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAvLyBkaXN0aW5jdFVudGlsQ2hhbmdlZCgodjEsIHYyKSA9PiB2MS5sZW5ndGggPT09IHYyLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdjEuZXZlcnkoKHYxaSwgaWR4KSA9PiB2MWlbdGhpcy5kZXNjcmlwdG9yLmRhdGFLZXlQcm9wZXJ0eV0gPT09IHYyW2lkeF1bdGhpcy5kZXNjcmlwdG9yLmRhdGFLZXlQcm9wZXJ0eV0pKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwKGl0ZW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5UmVzdWx0ID0gbmV3IFF1ZXJ5UmVzdWx0PFQ+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJlc3VsdC5wYWdlRGF0YSA9IGl0ZW1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSZXN1bHQuYWxsRGF0YUNvdW50ID0gaXRlbXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5UmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMubG9hZGluZyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmckID0gdGhpcy5sb2FkaW5nIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSA/IHRoaXMubG9hZGluZyA6IG9mKHRoaXMubG9hZGluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgICB0aGlzLnRlbXBsYXRlcy5mb3JFYWNoKHRlbXBsYXRlID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCh0ZW1wbGF0ZS5nZXRUeXBlKCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjYXB0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXB0aW9uVGVtcGxhdGUgPSB0ZW1wbGF0ZS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29sdW1uQWN0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5BY3Rpb25UZW1wbGF0ZSA9IHRlbXBsYXRlLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbG9hZChlbWl0RXZlbnQ6IGJvb2xlYW4gPSBmYWxzZSwgcmVzZXRQYXJhbXM6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICB0aGlzLmxvYWRUYWJsZVdpdGhEYXRhUHJvdmlkZXIocmVzZXRQYXJhbXMgPyBudWxsIDogKHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudCA/PyBudWxsKSwgZW1pdEV2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25UYWJsZUxhenlMb2FkKGV2ZW50OiBMYXp5TG9hZEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLnVzZURhdGFQcm92aWRlcikge1xuICAgICAgICAgICAgdGhpcy5sb2FkVGFibGVXaXRoRGF0YVByb3ZpZGVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbkNlbGxDbGljayhjb2w6IENvbHVtbkRlc2NyaXB0b3I8YW55PiwgaXRlbTogVCwgaWR4OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbW5nRXZlbnQgPSBuZXcgTW5nVGFibGVDZWxsQ2xpY2tFdmVudDxUPihjb2wsIGl0ZW0sIGlkeCk7XG4gICAgICAgIHRoaXMuY2VsbENsaWNrRXZlbnRFbWl0dGVyLm5leHQobW5nRXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblNlbGVjdGlvbkNoYW5nZShldmVudDogQXJyYXk8VD4pIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VFdmVudEVtaXR0ZXIuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2FkVGFibGVXaXRoRGF0YVByb3ZpZGVyKGxhenlMb2FkRXZlbnQ6IExhenlMb2FkRXZlbnR8bnVsbCwgZW1pdEV2ZW50OiBib29sZWFuID0gdHJ1ZSkge1xuICAgICAgICBpZiAoIXRoaXMudXNlRGF0YVByb3ZpZGVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGF0YVByb3ZpZGVyU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcblxuICAgICAgICB0aGlzLm11bHRpU29ydE1ldGEgPSBsYXp5TG9hZEV2ZW50Py5tdWx0aVNvcnRNZXRhO1xuICAgICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IGxhenlMb2FkRXZlbnRcbiAgICAgICAgICAgID8gTWVkaXVzUmVzdFV0aWwuZnJvbUxhenlMb2FkRXZlbnRUb1F1ZXJ5UGFyYW1zKGxhenlMb2FkRXZlbnQpXG4gICAgICAgICAgICA6IG5ldyBRdWVyeVBhcmFtKCk7XG4gICAgICAgIGlmICghcXVlcnlQYXJhbXMuc29ydFByb3BlcnR5ICYmIHRoaXMuZGVzY3JpcHRvci5oYXNEZWZhdWx0U29ydCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbXMuc29ydFByb3BlcnR5ID0gWy4uLnRoaXMuZGVzY3JpcHRvci5kZWZhdWx0U29ydFByb3BlcnR5XTtcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLnNvcnRBc2MgPSBbLi4udGhpcy5kZXNjcmlwdG9yLmRlZmF1bHRTb3J0QXNjXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyU3Vic2NyaXB0aW9uID0gdGhpcy5kYXRhUHJvdmlkZXI/LmdldEFsbChxdWVyeVBhcmFtcywgdGhpcy5kYXRhUHJvdmlkZXJTZXJ2aWNlKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlyc3QoKSxcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLmRhdGFQcm92aWRlckxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudCA9IGxhenlMb2FkRXZlbnQgPz8gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyUXVlcnlSZXN1bHRTdWJqZWN0Lm5leHQocmVzKTtcbiAgICAgICAgICAgIH0sIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe3NldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnRXJyb3InLCBkZXRhaWw6ICdGYWlsZWQgdG8gZmV0Y2ggdGFibGUgaXRlbXMnLCBsaWZlOiAzMDAwfSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGVtaXRFdmVudCkge1xuICAgICAgICAgICAgY29uc3QgbW5nRXZlbnQgPSBuZXcgTW5nVGFibGVMb2FkRXZlbnQoKTtcbiAgICAgICAgICAgIG1uZ0V2ZW50Lm9yaWdpbmFsRXZlbnQgPSBsYXp5TG9hZEV2ZW50ID8/IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIG1uZ0V2ZW50LnF1ZXJ5UGFyYW0gPSBxdWVyeVBhcmFtcztcbiAgICAgICAgICAgIHRoaXMubG9hZEV2ZW50RW1pdHRlci5uZXh0KG1uZ0V2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxwLXRhYmxlIFt2YWx1ZV09XCIocXVlcnlSZXN1bHQkIHwgYXN5bmMpPy5wYWdlRGF0YSA/PyBbXVwiXG4gICAgICAgICBbZGF0YUtleV09XCIkYW55KGRlc2NyaXB0b3IuZGF0YUtleVByb3BlcnR5KVwiXG4gICAgICAgICBbbGF6eV09XCJ1c2VEYXRhUHJvdmlkZXJcIlxuICAgICAgICAgKG9uTGF6eUxvYWQpPVwib25UYWJsZUxhenlMb2FkKCRldmVudClcIlxuICAgICAgICAgW2xvYWRpbmddPVwiKGxvYWRpbmckIHwgYXN5bmMpID8/IGZhbHNlXCJcbiAgICAgICAgIFtwYWdpbmF0b3JdPVwidXNlRGF0YVByb3ZpZGVyXCJcbiAgICAgICAgIFtyb3dzXT1cInJvd3NQZXJQYWdlT3B0aW9uc1swXVwiXG4gICAgICAgICBbdG90YWxSZWNvcmRzXT1cIihxdWVyeVJlc3VsdCQgfCBhc3luYyk/LmFsbERhdGFDb3VudCA/PyAwXCJcbiAgICAgICAgIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwicm93c1BlclBhZ2VPcHRpb25zXCJcbiAgICAgICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiXG4gICAgICAgICBbY3VycmVudFBhZ2VSZXBvcnRUZW1wbGF0ZV09XCInbW5nVGFibGUucGFnaW5hdGlvbk1zZycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgW211bHRpU29ydE1ldGFdPVwiJGFueShtdWx0aVNvcnRNZXRhKVwiXG4gICAgICAgICBzb3J0TW9kZT1cIm11bHRpcGxlXCJcbiAgICAgICAgIFsoc2VsZWN0aW9uKV09XCJzZWxlY3Rpb25cIlxuICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIj5cbiAgICB7eyBkZXNjcmlwdG9yLmhhc0RlZmF1bHRTb3J0fX1cblxuICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImNhcHRpb25UZW1wbGF0ZSB8fCBkZXNjcmlwdG9yLnRpdGxlXCIgcFRlbXBsYXRlPVwiY2FwdGlvblwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FwdGlvblRlbXBsYXRlOyBlbHNlIGRlZmF1bHRDYXB0aW9uXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2FwdGlvblRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRDYXB0aW9uPlxuICAgICAgICAgICAgPGg1IGNsYXNzPVwicC1tLTBcIj57eyBkZXNjcmlwdG9yLnRpdGxlIH19PC9oNT5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGggKm5nSWY9XCJzZWxlY3Rpb25FbmFibGVkXCI+XG4gICAgICAgICAgICAgICAgPHAtdGFibGVIZWFkZXJDaGVja2JveD48L3AtdGFibGVIZWFkZXJDaGVja2JveD5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgZGVzY3JpcHRvci5jb2x1bW5zXCI+XG4gICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiY29sLmlzU29ydEVuYWJsZWRcIiBbcFNvcnRhYmxlQ29sdW1uXT1cImNvbC5wcm9wZXJ0eVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRlc2NyaXB0b3IubW9kZWwudHlwZU5hbWUgKyBcIi5wcm9wZXJ0aWVzLlwiICsgY29sLnByb3BlcnR5IHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1zb3J0SWNvbiBbZmllbGRdPVwiY29sLnByb3BlcnR5XCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtY29sdW1uRmlsdGVyICpuZ0lmPVwiY29sLmlzRmlsdGVyRW5hYmxlZFwiIGNsYXNzPVwibWwtYXV0b1wiIHR5cGU9XCJ0ZXh0XCIgZGlzcGxheT1cIm1lbnVcIiBtYXRjaE1vZGU9XCJlcXVhbHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjb2wucHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93T3BlcmF0b3JdPVwiZmFsc2VcIiBbc2hvd0FkZEJ1dHRvbl09XCJmYWxzZVwiIFtoaWRlT25DbGVhcl09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtY29sdW1uRmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cIiFjb2wuaXNTb3J0RW5hYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRlc2NyaXB0b3IubW9kZWwudHlwZU5hbWUgKyBcIi5wcm9wZXJ0aWVzLlwiICsgY29sLnByb3BlcnR5IHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1jb2x1bW5GaWx0ZXIgKm5nSWY9XCJjb2wuaXNGaWx0ZXJFbmFibGVkXCIgY2xhc3M9XCJtbC1hdXRvXCIgdHlwZT1cInRleHRcIiBkaXNwbGF5PVwibWVudVwiIG1hdGNoTW9kZT1cImVxdWFsc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImNvbC5wcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dPcGVyYXRvcl09XCJmYWxzZVwiIFtzaG93QWRkQnV0dG9uXT1cImZhbHNlXCIgW2hpZGVPbkNsZWFyXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jb2x1bW5GaWx0ZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDx0aCAqbmdJZj1cImNvbHVtbkFjdGlvblRlbXBsYXRlXCI+PC90aD5cbiAgICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtaXRlbSBsZXQtaWR4PVwicm93SW5kZXhcIj5cbiAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwic2VsZWN0aW9uRW5hYmxlZFwiPlxuICAgICAgICAgICAgICAgIDxwLXRhYmxlQ2hlY2tib3ggW3ZhbHVlXT1cIml0ZW1cIj48L3AtdGFibGVDaGVja2JveD5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IGNvbCBvZiBkZXNjcmlwdG9yLmNvbHVtbnNcIiAoY2xpY2spPVwib25DZWxsQ2xpY2soY29sLCBpdGVtLCBpZHgpXCIgIGNsYXNzPVwiY2xpY2thYmxlXCI+XG4gICAgICAgICAgICAgICAge3sgY29sLmRpc3BsYXlQcm9wZXJ0eVBhdGggPyAoaXRlbSB8IHByb3BlcnR5UGF0aDogY29sLmRpc3BsYXlQcm9wZXJ0eVBhdGgpIDogaXRlbVtjb2wucHJvcGVydHldIH19XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwiY29sdW1uQWN0aW9uVGVtcGxhdGVcIiBjbGFzcz1cInRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29sdW1uQWN0aW9uVGVtcGxhdGU7IGNvbnRleHQ6IHsgcm93SXRlbTogaXRlbSwgcm93SW5kZXg6IGlkeCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cImRlc2NyaXB0b3IuY29sdW1ucy5sZW5ndGggKyAoY29sdW1uQWN0aW9uVGVtcGxhdGUgPyAxIDogMCkgKyAoc2VsZWN0aW9uRW5hYmxlZCA/IDEgOiAwKVwiPlxuICAgICAgICAgICAgICAgIHt7ICdtbmdUYWJsZS5ub0l0ZW1zJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9wLXRhYmxlPlxuIl19
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==