@inobeta/ui 18.0.1-build.1722007687

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 (369) hide show
  1. package/README.md +1 -0
  2. package/_index.scss +1 -0
  3. package/esm2022/inobeta-ui.mjs +5 -0
  4. package/esm2022/public_api.mjs +17 -0
  5. package/esm2022/src/app/inobeta-ui/core/filter.pipe.mjs +23 -0
  6. package/esm2022/src/app/inobeta-ui/core/index.mjs +2 -0
  7. package/esm2022/src/app/inobeta-ui/http/auth/guard.service.mjs +157 -0
  8. package/esm2022/src/app/inobeta-ui/http/auth/login.service.mjs +137 -0
  9. package/esm2022/src/app/inobeta-ui/http/auth/login.service.stub.spec.mjs +20 -0
  10. package/esm2022/src/app/inobeta-ui/http/auth/session.model.mjs +16 -0
  11. package/esm2022/src/app/inobeta-ui/http/http/auth.interceptor.mjs +79 -0
  12. package/esm2022/src/app/inobeta-ui/http/http/error.interceptor.mjs +76 -0
  13. package/esm2022/src/app/inobeta-ui/http/http/loader.interceptor.mjs +45 -0
  14. package/esm2022/src/app/inobeta-ui/http/http/loading-skeleton-container.component.mjs +36 -0
  15. package/esm2022/src/app/inobeta-ui/http/http/loading-skeleton.component.mjs +34 -0
  16. package/esm2022/src/app/inobeta-ui/http/http/loading-skeleton.directive.mjs +66 -0
  17. package/esm2022/src/app/inobeta-ui/http/http/loading-skeleton.directive.stub.spec.mjs +22 -0
  18. package/esm2022/src/app/inobeta-ui/http/http/messages.decorator.mjs +42 -0
  19. package/esm2022/src/app/inobeta-ui/http/http/role-check.directive.mjs +45 -0
  20. package/esm2022/src/app/inobeta-ui/http/http/spinner-loading.component.mjs +28 -0
  21. package/esm2022/src/app/inobeta-ui/http/http/spinner-loading.stub.spec.mjs +15 -0
  22. package/esm2022/src/app/inobeta-ui/http/http-test.module.mjs +35 -0
  23. package/esm2022/src/app/inobeta-ui/http/http.module.mjs +178 -0
  24. package/esm2022/src/app/inobeta-ui/http/index.mjs +26 -0
  25. package/esm2022/src/app/inobeta-ui/http/store/index.mjs +11 -0
  26. package/esm2022/src/app/inobeta-ui/http/store/loader/actions.mjs +7 -0
  27. package/esm2022/src/app/inobeta-ui/http/store/loader/interfaces.mjs +2 -0
  28. package/esm2022/src/app/inobeta-ui/http/store/loader/reducers.mjs +35 -0
  29. package/esm2022/src/app/inobeta-ui/http/store/loader/selectors.mjs +9 -0
  30. package/esm2022/src/app/inobeta-ui/http/store/session/actions.mjs +17 -0
  31. package/esm2022/src/app/inobeta-ui/http/store/session/effects.mjs +50 -0
  32. package/esm2022/src/app/inobeta-ui/http/store/session/interfaces.mjs +2 -0
  33. package/esm2022/src/app/inobeta-ui/http/store/session/reducers.mjs +12 -0
  34. package/esm2022/src/app/inobeta-ui/http/store/session/selectors.mjs +22 -0
  35. package/esm2022/src/app/inobeta-ui/http/translations.mjs +13 -0
  36. package/esm2022/src/app/inobeta-ui/hydration/actions.mjs +3 -0
  37. package/esm2022/src/app/inobeta-ui/hydration/effects.mjs +45 -0
  38. package/esm2022/src/app/inobeta-ui/hydration/index.mjs +21 -0
  39. package/esm2022/src/app/inobeta-ui/hydration/reducer.mjs +36 -0
  40. package/esm2022/src/app/inobeta-ui/storage/index.mjs +4 -0
  41. package/esm2022/src/app/inobeta-ui/storage/storage-test.module.mjs +23 -0
  42. package/esm2022/src/app/inobeta-ui/storage/storage.module.mjs +22 -0
  43. package/esm2022/src/app/inobeta-ui/storage/storage.service.mjs +105 -0
  44. package/esm2022/src/app/inobeta-ui/storage/storage.stub.spec.mjs +8 -0
  45. package/esm2022/src/app/inobeta-ui/translate/index.mjs +2 -0
  46. package/esm2022/src/app/inobeta-ui/translate/translate-loader.service.mjs +37 -0
  47. package/esm2022/src/app/inobeta-ui/ui/breadcrumb/breadcrumb.component.mjs +63 -0
  48. package/esm2022/src/app/inobeta-ui/ui/breadcrumb/breadcrumb.module.mjs +44 -0
  49. package/esm2022/src/app/inobeta-ui/ui/breadcrumb/index.mjs +4 -0
  50. package/esm2022/src/app/inobeta-ui/ui/breadcrumb/material-breadcrumb/material-breadcrumb.component.mjs +16 -0
  51. package/esm2022/src/app/inobeta-ui/ui/data-export/data-export.module.mjs +92 -0
  52. package/esm2022/src/app/inobeta-ui/ui/data-export/data-export.service.mjs +83 -0
  53. package/esm2022/src/app/inobeta-ui/ui/data-export/formats/csv-export.service.mjs +42 -0
  54. package/esm2022/src/app/inobeta-ui/ui/data-export/formats/pdf-export.service.mjs +66 -0
  55. package/esm2022/src/app/inobeta-ui/ui/data-export/formats/xlsx-export.service.mjs +26 -0
  56. package/esm2022/src/app/inobeta-ui/ui/data-export/index.mjs +10 -0
  57. package/esm2022/src/app/inobeta-ui/ui/data-export/provider.mjs +3 -0
  58. package/esm2022/src/app/inobeta-ui/ui/data-export/table-data-export-dialog.component.mjs +113 -0
  59. package/esm2022/src/app/inobeta-ui/ui/data-export/table-data-export.component.mjs +58 -0
  60. package/esm2022/src/app/inobeta-ui/ui/data-export/transformer.mjs +68 -0
  61. package/esm2022/src/app/inobeta-ui/ui/forms/array/array.mjs +26 -0
  62. package/esm2022/src/app/inobeta-ui/ui/forms/controls/checkbox.mjs +5 -0
  63. package/esm2022/src/app/inobeta-ui/ui/forms/controls/dropdown.mjs +5 -0
  64. package/esm2022/src/app/inobeta-ui/ui/forms/controls/form-control-base.mjs +80 -0
  65. package/esm2022/src/app/inobeta-ui/ui/forms/controls/radio.mjs +5 -0
  66. package/esm2022/src/app/inobeta-ui/ui/forms/controls/textbox.mjs +5 -0
  67. package/esm2022/src/app/inobeta-ui/ui/forms/dynamic-form/dynamic-form.component.mjs +118 -0
  68. package/esm2022/src/app/inobeta-ui/ui/forms/dynamic-form-array/dynamic-form-array.component.mjs +46 -0
  69. package/esm2022/src/app/inobeta-ui/ui/forms/dynamic-form-control/dynamic-form-control.component.mjs +28 -0
  70. package/esm2022/src/app/inobeta-ui/ui/forms/form-control.service.mjs +57 -0
  71. package/esm2022/src/app/inobeta-ui/ui/forms/forms.module.mjs +36 -0
  72. package/esm2022/src/app/inobeta-ui/ui/forms/forms.pipes.mjs +41 -0
  73. package/esm2022/src/app/inobeta-ui/ui/forms/forms.types.mjs +2 -0
  74. package/esm2022/src/app/inobeta-ui/ui/forms/index.mjs +12 -0
  75. package/esm2022/src/app/inobeta-ui/ui/kai-filter/filter-button/filter-action-group.component.mjs +14 -0
  76. package/esm2022/src/app/inobeta-ui/ui/kai-filter/filter-button/filter-button.component.mjs +31 -0
  77. package/esm2022/src/app/inobeta-ui/ui/kai-filter/filter.component.mjs +149 -0
  78. package/esm2022/src/app/inobeta-ui/ui/kai-filter/filter.types.mjs +30 -0
  79. package/esm2022/src/app/inobeta-ui/ui/kai-filter/filters/base/filter-base.mjs +83 -0
  80. package/esm2022/src/app/inobeta-ui/ui/kai-filter/filters/boolean/boolean-filter.component.mjs +48 -0
  81. package/esm2022/src/app/inobeta-ui/ui/kai-filter/filters/date/filter-date.component.mjs +284 -0
  82. package/esm2022/src/app/inobeta-ui/ui/kai-filter/filters/number/filter-number.component.mjs +111 -0
  83. package/esm2022/src/app/inobeta-ui/ui/kai-filter/filters/search-bar/search-bar.component.mjs +99 -0
  84. package/esm2022/src/app/inobeta-ui/ui/kai-filter/filters/tag/filter-tag.component.mjs +106 -0
  85. package/esm2022/src/app/inobeta-ui/ui/kai-filter/filters/text/filter-text.component.mjs +98 -0
  86. package/esm2022/src/app/inobeta-ui/ui/kai-filter/filters.mjs +109 -0
  87. package/esm2022/src/app/inobeta-ui/ui/kai-filter/filters.module.mjs +175 -0
  88. package/esm2022/src/app/inobeta-ui/ui/kai-filter/index.mjs +14 -0
  89. package/esm2022/src/app/inobeta-ui/ui/kai-filter/tokens.mjs +3 -0
  90. package/esm2022/src/app/inobeta-ui/ui/kai-filter/translations.mjs +51 -0
  91. package/esm2022/src/app/inobeta-ui/ui/kai-table/action.mjs +48 -0
  92. package/esm2022/src/app/inobeta-ui/ui/kai-table/cells.mjs +212 -0
  93. package/esm2022/src/app/inobeta-ui/ui/kai-table/columns/action-column.mjs +23 -0
  94. package/esm2022/src/app/inobeta-ui/ui/kai-table/columns/column.mjs +260 -0
  95. package/esm2022/src/app/inobeta-ui/ui/kai-table/columns/date-column.mjs +93 -0
  96. package/esm2022/src/app/inobeta-ui/ui/kai-table/columns/index.mjs +7 -0
  97. package/esm2022/src/app/inobeta-ui/ui/kai-table/columns/number-column.mjs +112 -0
  98. package/esm2022/src/app/inobeta-ui/ui/kai-table/columns/selection-column.mjs +149 -0
  99. package/esm2022/src/app/inobeta-ui/ui/kai-table/columns/text-column.mjs +90 -0
  100. package/esm2022/src/app/inobeta-ui/ui/kai-table/index.mjs +13 -0
  101. package/esm2022/src/app/inobeta-ui/ui/kai-table/paginator-intl.mjs +53 -0
  102. package/esm2022/src/app/inobeta-ui/ui/kai-table/remote-data-source.mjs +73 -0
  103. package/esm2022/src/app/inobeta-ui/ui/kai-table/rowgroup.mjs +17 -0
  104. package/esm2022/src/app/inobeta-ui/ui/kai-table/sort-header.mjs +37 -0
  105. package/esm2022/src/app/inobeta-ui/ui/kai-table/store/const.mjs +2 -0
  106. package/esm2022/src/app/inobeta-ui/ui/kai-table/store/index.mjs +9 -0
  107. package/esm2022/src/app/inobeta-ui/ui/kai-table/store/url-state/actions.mjs +13 -0
  108. package/esm2022/src/app/inobeta-ui/ui/kai-table/store/url-state/effects.mjs +47 -0
  109. package/esm2022/src/app/inobeta-ui/ui/kai-table/store/url-state/interfaces.mjs +2 -0
  110. package/esm2022/src/app/inobeta-ui/ui/kai-table/store/url-state/reducers.mjs +56 -0
  111. package/esm2022/src/app/inobeta-ui/ui/kai-table/store/url-state/selectors.mjs +19 -0
  112. package/esm2022/src/app/inobeta-ui/ui/kai-table/table-data-source.mjs +450 -0
  113. package/esm2022/src/app/inobeta-ui/ui/kai-table/table-url.service.mjs +129 -0
  114. package/esm2022/src/app/inobeta-ui/ui/kai-table/table.component.mjs +260 -0
  115. package/esm2022/src/app/inobeta-ui/ui/kai-table/table.module.mjs +150 -0
  116. package/esm2022/src/app/inobeta-ui/ui/kai-table/table.types.mjs +2 -0
  117. package/esm2022/src/app/inobeta-ui/ui/kai-table/tokens.mjs +13 -0
  118. package/esm2022/src/app/inobeta-ui/ui/kai-table/translations.mjs +41 -0
  119. package/esm2022/src/app/inobeta-ui/ui/main-menu/components/main-menu-bar/main-menu-bar.component.mjs +120 -0
  120. package/esm2022/src/app/inobeta-ui/ui/main-menu/components/main-menu-bar/main-menu-bar.stub.spec.mjs +38 -0
  121. package/esm2022/src/app/inobeta-ui/ui/main-menu/components/main-menu-dialog/main-menu-dialog.component.mjs +48 -0
  122. package/esm2022/src/app/inobeta-ui/ui/main-menu/components/main-menu-expanded/header-footer-buttons.component.mjs +139 -0
  123. package/esm2022/src/app/inobeta-ui/ui/main-menu/components/main-menu-expanded/main-menu-expanded.component.mjs +41 -0
  124. package/esm2022/src/app/inobeta-ui/ui/main-menu/index.mjs +13 -0
  125. package/esm2022/src/app/inobeta-ui/ui/main-menu/main-menu-test.module.mjs +24 -0
  126. package/esm2022/src/app/inobeta-ui/ui/main-menu/main-menu.module.mjs +63 -0
  127. package/esm2022/src/app/inobeta-ui/ui/main-menu/models/main-menu-button.model.mjs +2 -0
  128. package/esm2022/src/app/inobeta-ui/ui/main-menu/models/main-menu-data-set.model.mjs +2 -0
  129. package/esm2022/src/app/inobeta-ui/ui/main-menu/models/main-menu-data.model.mjs +2 -0
  130. package/esm2022/src/app/inobeta-ui/ui/material-forms/controls/autocomplete.mjs +108 -0
  131. package/esm2022/src/app/inobeta-ui/ui/material-forms/controls/button.mjs +80 -0
  132. package/esm2022/src/app/inobeta-ui/ui/material-forms/controls/checkbox.mjs +54 -0
  133. package/esm2022/src/app/inobeta-ui/ui/material-forms/controls/datepicker.mjs +96 -0
  134. package/esm2022/src/app/inobeta-ui/ui/material-forms/controls/dropdown.mjs +149 -0
  135. package/esm2022/src/app/inobeta-ui/ui/material-forms/controls/label.mjs +50 -0
  136. package/esm2022/src/app/inobeta-ui/ui/material-forms/controls/padding.mjs +26 -0
  137. package/esm2022/src/app/inobeta-ui/ui/material-forms/controls/radio.mjs +61 -0
  138. package/esm2022/src/app/inobeta-ui/ui/material-forms/controls/slide-toggle.mjs +62 -0
  139. package/esm2022/src/app/inobeta-ui/ui/material-forms/controls/textarea.mjs +63 -0
  140. package/esm2022/src/app/inobeta-ui/ui/material-forms/controls/textbox.mjs +205 -0
  141. package/esm2022/src/app/inobeta-ui/ui/material-forms/index.mjs +18 -0
  142. package/esm2022/src/app/inobeta-ui/ui/material-forms/intl/datepicker.intl.mjs +73 -0
  143. package/esm2022/src/app/inobeta-ui/ui/material-forms/material-form/material-form.component.mjs +48 -0
  144. package/esm2022/src/app/inobeta-ui/ui/material-forms/material-form/material-form.stub.spec.mjs +65 -0
  145. package/esm2022/src/app/inobeta-ui/ui/material-forms/material-form-array/material-form-array.component.mjs +18 -0
  146. package/esm2022/src/app/inobeta-ui/ui/material-forms/material-form-control/material-form-control.component.mjs +64 -0
  147. package/esm2022/src/app/inobeta-ui/ui/material-forms/material-form-test.module.mjs +32 -0
  148. package/esm2022/src/app/inobeta-ui/ui/material-forms/material-form.module.mjs +168 -0
  149. package/esm2022/src/app/inobeta-ui/ui/material-forms/translations.mjs +26 -0
  150. package/esm2022/src/app/inobeta-ui/ui/modal/index.mjs +7 -0
  151. package/esm2022/src/app/inobeta-ui/ui/modal/modal-message.component.mjs +76 -0
  152. package/esm2022/src/app/inobeta-ui/ui/modal/modal-message.model.mjs +2 -0
  153. package/esm2022/src/app/inobeta-ui/ui/modal/modal-message.service.mjs +64 -0
  154. package/esm2022/src/app/inobeta-ui/ui/modal/modal-message.service.stub.spec.mjs +15 -0
  155. package/esm2022/src/app/inobeta-ui/ui/modal/modal-test.module.mjs +26 -0
  156. package/esm2022/src/app/inobeta-ui/ui/modal/modal.module.mjs +46 -0
  157. package/esm2022/src/app/inobeta-ui/ui/modal/translations.mjs +10 -0
  158. package/esm2022/src/app/inobeta-ui/ui/toast/index.mjs +5 -0
  159. package/esm2022/src/app/inobeta-ui/ui/toast/toast-test.module.mjs +23 -0
  160. package/esm2022/src/app/inobeta-ui/ui/toast/toast.module.mjs +21 -0
  161. package/esm2022/src/app/inobeta-ui/ui/toast/toast.service.mjs +54 -0
  162. package/esm2022/src/app/inobeta-ui/ui/toast/toast.service.stub.spec.mjs +4 -0
  163. package/esm2022/src/app/inobeta-ui/ui/uploader/index.mjs +3 -0
  164. package/esm2022/src/app/inobeta-ui/ui/uploader/uploader.component.mjs +41 -0
  165. package/esm2022/src/app/inobeta-ui/ui/uploader/uploader.module.mjs +42 -0
  166. package/esm2022/src/app/inobeta-ui/ui/views/components/default-table-view/default-table-view.component.mjs +20 -0
  167. package/esm2022/src/app/inobeta-ui/ui/views/components/index.mjs +6 -0
  168. package/esm2022/src/app/inobeta-ui/ui/views/components/table-view/table-view.component.mjs +37 -0
  169. package/esm2022/src/app/inobeta-ui/ui/views/components/table-view-group/table-view-group.component.mjs +186 -0
  170. package/esm2022/src/app/inobeta-ui/ui/views/components/view-dialog/view-dialog.component.mjs +110 -0
  171. package/esm2022/src/app/inobeta-ui/ui/views/components/view-list/view-list.component.mjs +43 -0
  172. package/esm2022/src/app/inobeta-ui/ui/views/index.mjs +5 -0
  173. package/esm2022/src/app/inobeta-ui/ui/views/store/actions.mjs +11 -0
  174. package/esm2022/src/app/inobeta-ui/ui/views/store/index.mjs +3 -0
  175. package/esm2022/src/app/inobeta-ui/ui/views/store/reducer.mjs +5 -0
  176. package/esm2022/src/app/inobeta-ui/ui/views/store/views/index.mjs +4 -0
  177. package/esm2022/src/app/inobeta-ui/ui/views/store/views/reducer.mjs +19 -0
  178. package/esm2022/src/app/inobeta-ui/ui/views/store/views/selectors.mjs +5 -0
  179. package/esm2022/src/app/inobeta-ui/ui/views/store/views/table-view.mjs +13 -0
  180. package/esm2022/src/app/inobeta-ui/ui/views/translations.mjs +34 -0
  181. package/esm2022/src/app/inobeta-ui/ui/views/view.module.mjs +98 -0
  182. package/esm2022/src/app/inobeta-ui/ui/views/view.service.mjs +137 -0
  183. package/fesm2022/inobeta-ui.mjs +8610 -0
  184. package/fesm2022/inobeta-ui.mjs.map +1 -0
  185. package/index.d.ts +5 -0
  186. package/package.json +55 -0
  187. package/public_api.d.ts +16 -0
  188. package/src/app/inobeta-ui/core/filter.pipe.d.ts +7 -0
  189. package/src/app/inobeta-ui/core/index.d.ts +1 -0
  190. package/src/app/inobeta-ui/http/auth/guard.service.d.ts +96 -0
  191. package/src/app/inobeta-ui/http/auth/login.service.d.ts +63 -0
  192. package/src/app/inobeta-ui/http/auth/login.service.stub.spec.d.ts +9 -0
  193. package/src/app/inobeta-ui/http/auth/session.model.d.ts +18 -0
  194. package/src/app/inobeta-ui/http/http/auth.interceptor.d.ts +21 -0
  195. package/src/app/inobeta-ui/http/http/error.interceptor.d.ts +18 -0
  196. package/src/app/inobeta-ui/http/http/loader.interceptor.d.ts +17 -0
  197. package/src/app/inobeta-ui/http/http/loading-skeleton-container.component.d.ts +13 -0
  198. package/src/app/inobeta-ui/http/http/loading-skeleton.component.d.ts +12 -0
  199. package/src/app/inobeta-ui/http/http/loading-skeleton.directive.d.ts +27 -0
  200. package/src/app/inobeta-ui/http/http/loading-skeleton.directive.stub.spec.d.ts +13 -0
  201. package/src/app/inobeta-ui/http/http/messages.decorator.d.ts +18 -0
  202. package/src/app/inobeta-ui/http/http/role-check.directive.d.ts +17 -0
  203. package/src/app/inobeta-ui/http/http/spinner-loading.component.d.ts +9 -0
  204. package/src/app/inobeta-ui/http/http/spinner-loading.stub.spec.d.ts +5 -0
  205. package/src/app/inobeta-ui/http/http-test.module.d.ts +8 -0
  206. package/src/app/inobeta-ui/http/http.module.d.ts +20 -0
  207. package/src/app/inobeta-ui/http/index.d.ts +23 -0
  208. package/src/app/inobeta-ui/http/store/index.d.ts +10 -0
  209. package/src/app/inobeta-ui/http/store/loader/actions.d.ts +17 -0
  210. package/src/app/inobeta-ui/http/store/loader/interfaces.d.ts +8 -0
  211. package/src/app/inobeta-ui/http/store/loader/reducers.d.ts +3 -0
  212. package/src/app/inobeta-ui/http/store/loader/selectors.d.ts +5 -0
  213. package/src/app/inobeta-ui/http/store/session/actions.d.ts +20 -0
  214. package/src/app/inobeta-ui/http/store/session/effects.d.ts +16 -0
  215. package/src/app/inobeta-ui/http/store/session/interfaces.d.ts +4 -0
  216. package/src/app/inobeta-ui/http/store/session/reducers.d.ts +3 -0
  217. package/src/app/inobeta-ui/http/store/session/selectors.d.ts +4 -0
  218. package/src/app/inobeta-ui/http/translations.d.ts +12 -0
  219. package/src/app/inobeta-ui/hydration/actions.d.ts +1 -0
  220. package/src/app/inobeta-ui/hydration/effects.d.ts +13 -0
  221. package/src/app/inobeta-ui/hydration/index.d.ts +13 -0
  222. package/src/app/inobeta-ui/hydration/reducer.d.ts +2 -0
  223. package/src/app/inobeta-ui/storage/index.d.ts +3 -0
  224. package/src/app/inobeta-ui/storage/storage-test.module.d.ts +6 -0
  225. package/src/app/inobeta-ui/storage/storage.module.d.ts +6 -0
  226. package/src/app/inobeta-ui/storage/storage.service.d.ts +62 -0
  227. package/src/app/inobeta-ui/storage/storage.stub.spec.d.ts +5 -0
  228. package/src/app/inobeta-ui/translate/index.d.ts +1 -0
  229. package/src/app/inobeta-ui/translate/translate-loader.service.d.ts +11 -0
  230. package/src/app/inobeta-ui/ui/_index.scss +87 -0
  231. package/src/app/inobeta-ui/ui/breadcrumb/breadcrumb.component.d.ts +28 -0
  232. package/src/app/inobeta-ui/ui/breadcrumb/breadcrumb.module.d.ts +12 -0
  233. package/src/app/inobeta-ui/ui/breadcrumb/index.d.ts +3 -0
  234. package/src/app/inobeta-ui/ui/breadcrumb/material-breadcrumb/material-breadcrumb.component.d.ts +6 -0
  235. package/src/app/inobeta-ui/ui/data-export/data-export.module.d.ts +20 -0
  236. package/src/app/inobeta-ui/ui/data-export/data-export.service.d.ts +35 -0
  237. package/src/app/inobeta-ui/ui/data-export/formats/csv-export.service.d.ts +19 -0
  238. package/src/app/inobeta-ui/ui/data-export/formats/pdf-export.service.d.ts +20 -0
  239. package/src/app/inobeta-ui/ui/data-export/formats/xlsx-export.service.d.ts +14 -0
  240. package/src/app/inobeta-ui/ui/data-export/index.d.ts +9 -0
  241. package/src/app/inobeta-ui/ui/data-export/provider.d.ts +15 -0
  242. package/src/app/inobeta-ui/ui/data-export/table-data-export-dialog.component.d.ts +23 -0
  243. package/src/app/inobeta-ui/ui/data-export/table-data-export.component.d.ts +13 -0
  244. package/src/app/inobeta-ui/ui/data-export/transformer.d.ts +50 -0
  245. package/src/app/inobeta-ui/ui/forms/array/array.d.ts +32 -0
  246. package/src/app/inobeta-ui/ui/forms/controls/checkbox.d.ts +4 -0
  247. package/src/app/inobeta-ui/ui/forms/controls/dropdown.d.ts +4 -0
  248. package/src/app/inobeta-ui/ui/forms/controls/form-control-base.d.ts +88 -0
  249. package/src/app/inobeta-ui/ui/forms/controls/radio.d.ts +4 -0
  250. package/src/app/inobeta-ui/ui/forms/controls/textbox.d.ts +4 -0
  251. package/src/app/inobeta-ui/ui/forms/dynamic-form/dynamic-form.component.d.ts +50 -0
  252. package/src/app/inobeta-ui/ui/forms/dynamic-form-array/dynamic-form-array.component.d.ts +18 -0
  253. package/src/app/inobeta-ui/ui/forms/dynamic-form-control/dynamic-form-control.component.d.ts +11 -0
  254. package/src/app/inobeta-ui/ui/forms/form-control.service.d.ts +13 -0
  255. package/src/app/inobeta-ui/ui/forms/forms.module.d.ts +12 -0
  256. package/src/app/inobeta-ui/ui/forms/forms.pipes.d.ts +20 -0
  257. package/src/app/inobeta-ui/ui/forms/forms.types.d.ts +3 -0
  258. package/src/app/inobeta-ui/ui/forms/index.d.ts +11 -0
  259. package/src/app/inobeta-ui/ui/kai-filter/filter-button/filter-action-group.component.d.ts +5 -0
  260. package/src/app/inobeta-ui/ui/kai-filter/filter-button/filter-button.component.d.ts +8 -0
  261. package/src/app/inobeta-ui/ui/kai-filter/filter.component.d.ts +41 -0
  262. package/src/app/inobeta-ui/ui/kai-filter/filter.types.d.ts +141 -0
  263. package/src/app/inobeta-ui/ui/kai-filter/filters/base/filter-base.d.ts +42 -0
  264. package/src/app/inobeta-ui/ui/kai-filter/filters/boolean/boolean-filter.component.d.ts +12 -0
  265. package/src/app/inobeta-ui/ui/kai-filter/filters/date/filter-date.component.d.ts +56 -0
  266. package/src/app/inobeta-ui/ui/kai-filter/filters/number/filter-number.component.d.ts +27 -0
  267. package/src/app/inobeta-ui/ui/kai-filter/filters/search-bar/search-bar.component.d.ts +16 -0
  268. package/src/app/inobeta-ui/ui/kai-filter/filters/tag/filter-tag.component.d.ts +28 -0
  269. package/src/app/inobeta-ui/ui/kai-filter/filters/text/filter-text.component.d.ts +21 -0
  270. package/src/app/inobeta-ui/ui/kai-filter/filters.d.ts +16 -0
  271. package/src/app/inobeta-ui/ui/kai-filter/filters.module.d.ts +35 -0
  272. package/src/app/inobeta-ui/ui/kai-filter/index.d.ts +13 -0
  273. package/src/app/inobeta-ui/ui/kai-filter/tokens.d.ts +2 -0
  274. package/src/app/inobeta-ui/ui/kai-filter/translations.d.ts +50 -0
  275. package/src/app/inobeta-ui/ui/kai-table/_table-theme.scss +123 -0
  276. package/src/app/inobeta-ui/ui/kai-table/action.d.ts +19 -0
  277. package/src/app/inobeta-ui/ui/kai-table/cells.d.ts +88 -0
  278. package/src/app/inobeta-ui/ui/kai-table/columns/action-column.d.ts +9 -0
  279. package/src/app/inobeta-ui/ui/kai-table/columns/column.d.ts +87 -0
  280. package/src/app/inobeta-ui/ui/kai-table/columns/date-column.d.ts +21 -0
  281. package/src/app/inobeta-ui/ui/kai-table/columns/index.d.ts +6 -0
  282. package/src/app/inobeta-ui/ui/kai-table/columns/number-column.d.ts +16 -0
  283. package/src/app/inobeta-ui/ui/kai-table/columns/selection-column.d.ts +26 -0
  284. package/src/app/inobeta-ui/ui/kai-table/columns/text-column.d.ts +16 -0
  285. package/src/app/inobeta-ui/ui/kai-table/index.d.ts +12 -0
  286. package/src/app/inobeta-ui/ui/kai-table/paginator-intl.d.ts +18 -0
  287. package/src/app/inobeta-ui/ui/kai-table/remote-data-source.d.ts +60 -0
  288. package/src/app/inobeta-ui/ui/kai-table/rowgroup.d.ts +8 -0
  289. package/src/app/inobeta-ui/ui/kai-table/sort-header.d.ts +20 -0
  290. package/src/app/inobeta-ui/ui/kai-table/store/const.d.ts +1 -0
  291. package/src/app/inobeta-ui/ui/kai-table/store/index.d.ts +8 -0
  292. package/src/app/inobeta-ui/ui/kai-table/store/url-state/actions.d.ts +59 -0
  293. package/src/app/inobeta-ui/ui/kai-table/store/url-state/effects.d.ts +15 -0
  294. package/src/app/inobeta-ui/ui/kai-table/store/url-state/interfaces.d.ts +16 -0
  295. package/src/app/inobeta-ui/ui/kai-table/store/url-state/reducers.d.ts +2 -0
  296. package/src/app/inobeta-ui/ui/kai-table/store/url-state/selectors.d.ts +3 -0
  297. package/src/app/inobeta-ui/ui/kai-table/table-data-source.d.ts +164 -0
  298. package/src/app/inobeta-ui/ui/kai-table/table-url.service.d.ts +51 -0
  299. package/src/app/inobeta-ui/ui/kai-table/table.component.d.ts +79 -0
  300. package/src/app/inobeta-ui/ui/kai-table/table.module.d.ts +30 -0
  301. package/src/app/inobeta-ui/ui/kai-table/table.types.d.ts +21 -0
  302. package/src/app/inobeta-ui/ui/kai-table/tokens.d.ts +22 -0
  303. package/src/app/inobeta-ui/ui/kai-table/translations.d.ts +40 -0
  304. package/src/app/inobeta-ui/ui/main-menu/_main-menu-theme.scss +226 -0
  305. package/src/app/inobeta-ui/ui/main-menu/components/main-menu-bar/main-menu-bar.component.d.ts +56 -0
  306. package/src/app/inobeta-ui/ui/main-menu/components/main-menu-bar/main-menu-bar.stub.spec.d.ts +18 -0
  307. package/src/app/inobeta-ui/ui/main-menu/components/main-menu-dialog/main-menu-dialog.component.d.ts +13 -0
  308. package/src/app/inobeta-ui/ui/main-menu/components/main-menu-expanded/header-footer-buttons.component.d.ts +9 -0
  309. package/src/app/inobeta-ui/ui/main-menu/components/main-menu-expanded/main-menu-expanded.component.d.ts +16 -0
  310. package/src/app/inobeta-ui/ui/main-menu/index.d.ts +10 -0
  311. package/src/app/inobeta-ui/ui/main-menu/main-menu-test.module.d.ts +8 -0
  312. package/src/app/inobeta-ui/ui/main-menu/main-menu.module.d.ts +16 -0
  313. package/src/app/inobeta-ui/ui/main-menu/models/main-menu-button.model.d.ts +8 -0
  314. package/src/app/inobeta-ui/ui/main-menu/models/main-menu-data-set.model.d.ts +14 -0
  315. package/src/app/inobeta-ui/ui/main-menu/models/main-menu-data.model.d.ts +4 -0
  316. package/src/app/inobeta-ui/ui/material-forms/controls/autocomplete.d.ts +14 -0
  317. package/src/app/inobeta-ui/ui/material-forms/controls/button.d.ts +28 -0
  318. package/src/app/inobeta-ui/ui/material-forms/controls/checkbox.d.ts +10 -0
  319. package/src/app/inobeta-ui/ui/material-forms/controls/datepicker.d.ts +17 -0
  320. package/src/app/inobeta-ui/ui/material-forms/controls/dropdown.d.ts +29 -0
  321. package/src/app/inobeta-ui/ui/material-forms/controls/label.d.ts +10 -0
  322. package/src/app/inobeta-ui/ui/material-forms/controls/padding.d.ts +10 -0
  323. package/src/app/inobeta-ui/ui/material-forms/controls/radio.d.ts +10 -0
  324. package/src/app/inobeta-ui/ui/material-forms/controls/slide-toggle.d.ts +10 -0
  325. package/src/app/inobeta-ui/ui/material-forms/controls/textarea.d.ts +17 -0
  326. package/src/app/inobeta-ui/ui/material-forms/controls/textbox.d.ts +21 -0
  327. package/src/app/inobeta-ui/ui/material-forms/index.d.ts +17 -0
  328. package/src/app/inobeta-ui/ui/material-forms/intl/datepicker.intl.d.ts +25 -0
  329. package/src/app/inobeta-ui/ui/material-forms/material-form/material-form.component.d.ts +26 -0
  330. package/src/app/inobeta-ui/ui/material-forms/material-form/material-form.stub.spec.d.ts +21 -0
  331. package/src/app/inobeta-ui/ui/material-forms/material-form-array/material-form-array.component.d.ts +6 -0
  332. package/src/app/inobeta-ui/ui/material-forms/material-form-control/material-form-control.component.d.ts +19 -0
  333. package/src/app/inobeta-ui/ui/material-forms/material-form-test.module.d.ts +9 -0
  334. package/src/app/inobeta-ui/ui/material-forms/material-form.module.d.ts +49 -0
  335. package/src/app/inobeta-ui/ui/material-forms/translations.d.ts +25 -0
  336. package/src/app/inobeta-ui/ui/modal/index.d.ts +6 -0
  337. package/src/app/inobeta-ui/ui/modal/modal-message.component.d.ts +10 -0
  338. package/src/app/inobeta-ui/ui/modal/modal-message.model.d.ts +32 -0
  339. package/src/app/inobeta-ui/ui/modal/modal-message.service.d.ts +49 -0
  340. package/src/app/inobeta-ui/ui/modal/modal-message.service.stub.spec.d.ts +6 -0
  341. package/src/app/inobeta-ui/ui/modal/modal-test.module.d.ts +7 -0
  342. package/src/app/inobeta-ui/ui/modal/modal.module.d.ts +11 -0
  343. package/src/app/inobeta-ui/ui/modal/translations.d.ts +9 -0
  344. package/src/app/inobeta-ui/ui/toast/_toast-theme.scss +56 -0
  345. package/src/app/inobeta-ui/ui/toast/index.d.ts +4 -0
  346. package/src/app/inobeta-ui/ui/toast/toast-test.module.d.ts +6 -0
  347. package/src/app/inobeta-ui/ui/toast/toast.module.d.ts +7 -0
  348. package/src/app/inobeta-ui/ui/toast/toast.service.d.ts +36 -0
  349. package/src/app/inobeta-ui/ui/toast/toast.service.stub.spec.d.ts +3 -0
  350. package/src/app/inobeta-ui/ui/uploader/index.d.ts +2 -0
  351. package/src/app/inobeta-ui/ui/uploader/uploader.component.d.ts +12 -0
  352. package/src/app/inobeta-ui/ui/uploader/uploader.module.d.ts +10 -0
  353. package/src/app/inobeta-ui/ui/views/components/default-table-view/default-table-view.component.d.ts +8 -0
  354. package/src/app/inobeta-ui/ui/views/components/index.d.ts +5 -0
  355. package/src/app/inobeta-ui/ui/views/components/table-view/table-view.component.d.ts +14 -0
  356. package/src/app/inobeta-ui/ui/views/components/table-view-group/table-view-group.component.d.ts +45 -0
  357. package/src/app/inobeta-ui/ui/views/components/view-dialog/view-dialog.component.d.ts +22 -0
  358. package/src/app/inobeta-ui/ui/views/components/view-list/view-list.component.d.ts +16 -0
  359. package/src/app/inobeta-ui/ui/views/index.d.ts +4 -0
  360. package/src/app/inobeta-ui/ui/views/store/actions.d.ts +27 -0
  361. package/src/app/inobeta-ui/ui/views/store/index.d.ts +2 -0
  362. package/src/app/inobeta-ui/ui/views/store/reducer.d.ts +7 -0
  363. package/src/app/inobeta-ui/ui/views/store/views/index.d.ts +3 -0
  364. package/src/app/inobeta-ui/ui/views/store/views/reducer.d.ts +3 -0
  365. package/src/app/inobeta-ui/ui/views/store/views/selectors.d.ts +4 -0
  366. package/src/app/inobeta-ui/ui/views/store/views/table-view.d.ts +22 -0
  367. package/src/app/inobeta-ui/ui/views/translations.d.ts +33 -0
  368. package/src/app/inobeta-ui/ui/views/view.module.d.ts +23 -0
  369. package/src/app/inobeta-ui/ui/views/view.service.d.ts +40 -0
@@ -0,0 +1,56 @@
1
+ import { createReducer, on } from "@ngrx/store";
2
+ import { urlStateActions } from "./actions";
3
+ const INITIAL = {
4
+ tables: []
5
+ };
6
+ export const urlStateReducer = createReducer(INITIAL, on(urlStateActions.setFilters, (stateIn, action) => {
7
+ let state = structuredClone(stateIn);
8
+ const table = getTable(action.tableName, state.tables);
9
+ table.filters = action.params;
10
+ return {
11
+ ...state
12
+ };
13
+ }), on(urlStateActions.setPaginator, (stateIn, action) => {
14
+ let state = structuredClone(stateIn);
15
+ const table = getTable(action.tableName, state.tables);
16
+ table.page = action.params.pageIndex;
17
+ table.pageSize = action.params.pageSize;
18
+ return {
19
+ ...state
20
+ };
21
+ }), on(urlStateActions.setAggregatedColumns, (stateIn, action) => {
22
+ let state = structuredClone(stateIn);
23
+ const table = getTable(action.tableName, state.tables);
24
+ table.aggregatedColumns = { ...action.params };
25
+ return {
26
+ ...state
27
+ };
28
+ }), on(urlStateActions.setSort, (stateIn, action) => {
29
+ let state = structuredClone(stateIn);
30
+ const table = getTable(action.tableName, state.tables);
31
+ table.sort = { ...action.params };
32
+ return {
33
+ ...state
34
+ };
35
+ }), on(urlStateActions.handleViewChange, (stateIn, action) => {
36
+ let state = structuredClone(stateIn);
37
+ const table = getTable(action.tableName, state.tables);
38
+ table.view = action.params.view;
39
+ table.page = action.params.page;
40
+ table.pageSize = action.params.pageSize;
41
+ table.filters = action.params.filters;
42
+ table.aggregatedColumns = action.params.aggregatedColumns;
43
+ table.sort = action.params.sort;
44
+ return {
45
+ ...state
46
+ };
47
+ }));
48
+ function getTable(tableName, state) {
49
+ let table = state.find((table) => table.tableName === tableName);
50
+ if (!table) {
51
+ state.push({ tableName });
52
+ table = state.find((table) => table.tableName === tableName);
53
+ }
54
+ return table;
55
+ }
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdWNlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2lub2JldGEtdWkvdWkva2FpLXRhYmxlL3N0b3JlL3VybC1zdGF0ZS9yZWR1Y2Vycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNoRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRzVDLE1BQU0sT0FBTyxHQUFtQjtJQUM5QixNQUFNLEVBQUUsRUFBRTtDQUNYLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFDbEQsRUFBRSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7SUFDakQsSUFBSSxLQUFLLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2RCxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDOUIsT0FBTztRQUNMLEdBQUcsS0FBSztLQUNULENBQUE7QUFDSCxDQUFDLENBQUMsRUFDRixFQUFFLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtJQUNuRCxJQUFJLEtBQUssR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZELEtBQUssQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7SUFDckMsS0FBSyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUN4QyxPQUFPO1FBQ0wsR0FBRyxLQUFLO0tBQ1QsQ0FBQTtBQUNILENBQUMsQ0FBQyxFQUNGLEVBQUUsQ0FBQyxlQUFlLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7SUFDM0QsSUFBSSxLQUFLLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2RCxLQUFLLENBQUMsaUJBQWlCLEdBQUcsRUFBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUMsQ0FBQTtJQUM1QyxPQUFPO1FBQ0wsR0FBRyxLQUFLO0tBQ1QsQ0FBQTtBQUNILENBQUMsQ0FBQyxFQUNGLEVBQUUsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO0lBQzlDLElBQUksS0FBSyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkQsS0FBSyxDQUFDLElBQUksR0FBRyxFQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBQyxDQUFDO0lBQ2hDLE9BQU87UUFDTCxHQUFHLEtBQUs7S0FDVCxDQUFBO0FBQ0gsQ0FBQyxDQUFDLEVBQ0YsRUFBRSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtJQUN2RCxJQUFJLEtBQUssR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZELEtBQUssQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDaEMsS0FBSyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNoQyxLQUFLLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ3hDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDdEMsS0FBSyxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFDMUQsS0FBSyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNoQyxPQUFPO1FBQ0wsR0FBRyxLQUFLO0tBQ1QsQ0FBQTtBQUNILENBQUMsQ0FBQyxDQUNILENBQUM7QUFLRixTQUFTLFFBQVEsQ0FBQyxTQUFpQixFQUFFLEtBQThCO0lBQ2pFLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDakUsSUFBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1YsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDMUIsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgY3JlYXRlUmVkdWNlciwgb24gfSBmcm9tIFwiQG5ncngvc3RvcmVcIjtcbmltcG9ydCB7IHVybFN0YXRlQWN0aW9ucyB9IGZyb20gXCIuL2FjdGlvbnNcIjtcbmltcG9ydCB7IElVcmxTdGF0ZVN0YXRlLCBJYkthaVRhYmxlTmFtZWRQYXJhbXMgfSBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XG5cbmNvbnN0IElOSVRJQUw6IElVcmxTdGF0ZVN0YXRlID0ge1xuICB0YWJsZXM6IFtdXG59XG5cbmV4cG9ydCBjb25zdCB1cmxTdGF0ZVJlZHVjZXIgPSBjcmVhdGVSZWR1Y2VyKElOSVRJQUwsXG4gIG9uKHVybFN0YXRlQWN0aW9ucy5zZXRGaWx0ZXJzLCAoc3RhdGVJbiwgYWN0aW9uKSA9PiB7XG4gICAgbGV0IHN0YXRlID0gc3RydWN0dXJlZENsb25lKHN0YXRlSW4pO1xuICAgIGNvbnN0IHRhYmxlID0gZ2V0VGFibGUoYWN0aW9uLnRhYmxlTmFtZSwgc3RhdGUudGFibGVzKTtcbiAgICB0YWJsZS5maWx0ZXJzID0gYWN0aW9uLnBhcmFtcztcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGVcbiAgICB9XG4gIH0pLFxuICBvbih1cmxTdGF0ZUFjdGlvbnMuc2V0UGFnaW5hdG9yLCAoc3RhdGVJbiwgYWN0aW9uKSA9PiB7XG4gICAgbGV0IHN0YXRlID0gc3RydWN0dXJlZENsb25lKHN0YXRlSW4pO1xuICAgIGNvbnN0IHRhYmxlID0gZ2V0VGFibGUoYWN0aW9uLnRhYmxlTmFtZSwgc3RhdGUudGFibGVzKTtcbiAgICB0YWJsZS5wYWdlID0gYWN0aW9uLnBhcmFtcy5wYWdlSW5kZXg7XG4gICAgdGFibGUucGFnZVNpemUgPSBhY3Rpb24ucGFyYW1zLnBhZ2VTaXplO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZVxuICAgIH1cbiAgfSksXG4gIG9uKHVybFN0YXRlQWN0aW9ucy5zZXRBZ2dyZWdhdGVkQ29sdW1ucywgKHN0YXRlSW4sIGFjdGlvbikgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHN0cnVjdHVyZWRDbG9uZShzdGF0ZUluKTtcbiAgICBjb25zdCB0YWJsZSA9IGdldFRhYmxlKGFjdGlvbi50YWJsZU5hbWUsIHN0YXRlLnRhYmxlcyk7XG4gICAgdGFibGUuYWdncmVnYXRlZENvbHVtbnMgPSB7Li4uYWN0aW9uLnBhcmFtc31cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGVcbiAgICB9XG4gIH0pLFxuICBvbih1cmxTdGF0ZUFjdGlvbnMuc2V0U29ydCwgKHN0YXRlSW4sIGFjdGlvbikgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHN0cnVjdHVyZWRDbG9uZShzdGF0ZUluKTtcbiAgICBjb25zdCB0YWJsZSA9IGdldFRhYmxlKGFjdGlvbi50YWJsZU5hbWUsIHN0YXRlLnRhYmxlcyk7XG4gICAgdGFibGUuc29ydCA9IHsuLi5hY3Rpb24ucGFyYW1zfTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGVcbiAgICB9XG4gIH0pLFxuICBvbih1cmxTdGF0ZUFjdGlvbnMuaGFuZGxlVmlld0NoYW5nZSwgKHN0YXRlSW4sIGFjdGlvbikgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHN0cnVjdHVyZWRDbG9uZShzdGF0ZUluKTtcbiAgICBjb25zdCB0YWJsZSA9IGdldFRhYmxlKGFjdGlvbi50YWJsZU5hbWUsIHN0YXRlLnRhYmxlcyk7XG4gICAgdGFibGUudmlldyA9IGFjdGlvbi5wYXJhbXMudmlldztcbiAgICB0YWJsZS5wYWdlID0gYWN0aW9uLnBhcmFtcy5wYWdlO1xuICAgIHRhYmxlLnBhZ2VTaXplID0gYWN0aW9uLnBhcmFtcy5wYWdlU2l6ZTtcbiAgICB0YWJsZS5maWx0ZXJzID0gYWN0aW9uLnBhcmFtcy5maWx0ZXJzO1xuICAgIHRhYmxlLmFnZ3JlZ2F0ZWRDb2x1bW5zID0gYWN0aW9uLnBhcmFtcy5hZ2dyZWdhdGVkQ29sdW1ucztcbiAgICB0YWJsZS5zb3J0ID0gYWN0aW9uLnBhcmFtcy5zb3J0O1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZVxuICAgIH1cbiAgfSksXG4pO1xuXG5cblxuXG5mdW5jdGlvbiBnZXRUYWJsZSh0YWJsZU5hbWU6IHN0cmluZywgc3RhdGU6IEliS2FpVGFibGVOYW1lZFBhcmFtc1tdKSB7XG4gIGxldCB0YWJsZSA9IHN0YXRlLmZpbmQoKHRhYmxlKSA9PiB0YWJsZS50YWJsZU5hbWUgPT09IHRhYmxlTmFtZSk7XG4gIGlmKCF0YWJsZSkge1xuICAgIHN0YXRlLnB1c2goeyB0YWJsZU5hbWUgfSk7XG4gICAgdGFibGUgPSBzdGF0ZS5maW5kKCh0YWJsZSkgPT4gdGFibGUudGFibGVOYW1lID09PSB0YWJsZU5hbWUpO1xuICB9XG4gIHJldHVybiB0YWJsZTtcbn1cbiJdfQ==
@@ -0,0 +1,19 @@
1
+ import { createFeatureSelector, createSelector } from "@ngrx/store";
2
+ import { kaiTableFeatureKey } from "../const";
3
+ const selectFeature = createFeatureSelector(kaiTableFeatureKey);
4
+ const selectAllUrlStateStore = createSelector(selectFeature, (state) => {
5
+ return state.urlState;
6
+ });
7
+ const selectUrlState = (tableName) => createSelector(selectAllUrlStateStore, (state) => {
8
+ return state.tables.find((table) => table.tableName === tableName);
9
+ });
10
+ export const ibTableSelectLastQueryStringRaw = (tableName) => createSelector(selectUrlState(tableName), (state) => ({
11
+ ibfilter: state.filters,
12
+ ibpage: state.page,
13
+ ibpagesize: state.pageSize,
14
+ ibaggregatedcolumns: state.aggregatedColumns,
15
+ ibsort: state.sort,
16
+ ibview: state.view
17
+ }));
18
+ export const ibTableSelectLastQueryString = (tableName) => createSelector(ibTableSelectLastQueryStringRaw(tableName), (state) => JSON.stringify(state));
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9pbm9iZXRhLXVpL3VpL2thaS10YWJsZS9zdG9yZS91cmwtc3RhdGUvc2VsZWN0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBSzlDLE1BQU0sYUFBYSxHQUFHLHFCQUFxQixDQUFpQixrQkFBa0IsQ0FBQyxDQUFDO0FBRWhGLE1BQU0sc0JBQXNCLEdBQUcsY0FBYyxDQUMzQyxhQUFhLEVBQ2IsQ0FBQyxLQUFxQixFQUFrQixFQUFFO0lBQ3hDLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQTtBQUN2QixDQUFDLENBQ0YsQ0FBQTtBQUVELE1BQU0sY0FBYyxHQUFHLENBQUMsU0FBaUIsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUMxRCxzQkFBc0IsRUFDdEIsQ0FBQyxLQUFxQixFQUFFLEVBQUU7SUFDeEIsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQTtBQUNwRSxDQUFDLENBQ0YsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLENBQUMsU0FBaUIsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUNsRixjQUFjLENBQUMsU0FBUyxDQUFDLEVBQ3pCLENBQUMsS0FBSyxFQUFtQixFQUFFLENBQUMsQ0FBQztJQUMzQixRQUFRLEVBQUUsS0FBSyxDQUFDLE9BQU87SUFDdkIsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJO0lBQ2xCLFVBQVUsRUFBRSxLQUFLLENBQUMsUUFBUTtJQUMxQixtQkFBbUIsRUFBRSxLQUFLLENBQUMsaUJBQWlCO0lBQzVDLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSTtJQUNsQixNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUk7Q0FDbkIsQ0FBQyxDQUNILENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLFNBQWlCLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FDL0UsK0JBQStCLENBQUMsU0FBUyxDQUFDLEVBQzFDLENBQUMsS0FBSyxFQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUN6QyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlRmVhdHVyZVNlbGVjdG9yLCBjcmVhdGVTZWxlY3RvciB9IGZyb20gXCJAbmdyeC9zdG9yZVwiO1xuaW1wb3J0IHsga2FpVGFibGVGZWF0dXJlS2V5IH0gZnJvbSBcIi4uL2NvbnN0XCI7XG5pbXBvcnQgeyBJS2FpVGFibGVTdG9yZSB9IGZyb20gXCIuLlwiO1xuaW1wb3J0IHsgSVVybFN0YXRlU3RhdGUgfSBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBJYlRhYmxlUXNQYXJhbXMgfSBmcm9tIFwiLi4vLi4vdGFibGUtdXJsLnNlcnZpY2VcIjtcblxuY29uc3Qgc2VsZWN0RmVhdHVyZSA9IGNyZWF0ZUZlYXR1cmVTZWxlY3RvcjxJS2FpVGFibGVTdG9yZT4oa2FpVGFibGVGZWF0dXJlS2V5KTtcblxuY29uc3Qgc2VsZWN0QWxsVXJsU3RhdGVTdG9yZSA9IGNyZWF0ZVNlbGVjdG9yKFxuICBzZWxlY3RGZWF0dXJlLFxuICAoc3RhdGU6IElLYWlUYWJsZVN0b3JlKTogSVVybFN0YXRlU3RhdGUgPT4ge1xuICAgIHJldHVybiBzdGF0ZS51cmxTdGF0ZVxuICB9XG4pXG5cbmNvbnN0IHNlbGVjdFVybFN0YXRlID0gKHRhYmxlTmFtZTogc3RyaW5nKSA9PiBjcmVhdGVTZWxlY3RvcihcbiAgc2VsZWN0QWxsVXJsU3RhdGVTdG9yZSxcbiAgKHN0YXRlOiBJVXJsU3RhdGVTdGF0ZSkgPT4ge1xuICAgIHJldHVybiBzdGF0ZS50YWJsZXMuZmluZCgodGFibGUpID0+IHRhYmxlLnRhYmxlTmFtZSA9PT0gdGFibGVOYW1lKVxuICB9XG4pXG5cbmV4cG9ydCBjb25zdCBpYlRhYmxlU2VsZWN0TGFzdFF1ZXJ5U3RyaW5nUmF3ID0gKHRhYmxlTmFtZTogc3RyaW5nKSA9PiBjcmVhdGVTZWxlY3RvcihcbiAgc2VsZWN0VXJsU3RhdGUodGFibGVOYW1lKSxcbiAgKHN0YXRlKTogSWJUYWJsZVFzUGFyYW1zID0+ICh7XG4gICAgaWJmaWx0ZXI6IHN0YXRlLmZpbHRlcnMsXG4gICAgaWJwYWdlOiBzdGF0ZS5wYWdlLFxuICAgIGlicGFnZXNpemU6IHN0YXRlLnBhZ2VTaXplLFxuICAgIGliYWdncmVnYXRlZGNvbHVtbnM6IHN0YXRlLmFnZ3JlZ2F0ZWRDb2x1bW5zLFxuICAgIGlic29ydDogc3RhdGUuc29ydCxcbiAgICBpYnZpZXc6IHN0YXRlLnZpZXdcbiAgfSlcbilcblxuZXhwb3J0IGNvbnN0IGliVGFibGVTZWxlY3RMYXN0UXVlcnlTdHJpbmcgPSAodGFibGVOYW1lOiBzdHJpbmcpID0+IGNyZWF0ZVNlbGVjdG9yKFxuICBpYlRhYmxlU2VsZWN0TGFzdFF1ZXJ5U3RyaW5nUmF3KHRhYmxlTmFtZSksXG4gIChzdGF0ZSk6IHN0cmluZyA9PiBKU09OLnN0cmluZ2lmeShzdGF0ZSlcbilcbiJdfQ==
@@ -0,0 +1,450 @@
1
+ import { DataSource } from "@angular/cdk/collections";
2
+ import { inject } from "@angular/core";
3
+ import { BehaviorSubject, Subject, combineLatest, merge, of as observableOf, } from "rxjs";
4
+ import { filter, map } from "rxjs/operators";
5
+ import { applyFilter } from "../kai-filter/filters";
6
+ import { IB_AGGREGATE } from "./tokens";
7
+ import { Store } from "@ngrx/store";
8
+ import { urlStateActions } from "./store/url-state/actions";
9
+ /**
10
+ * Data source that accepts a client-side data array and includes native support of filtering,
11
+ * sorting (using MatSort), and pagination (using MatPaginator).
12
+ *
13
+ * Allows for sort customization by overriding sortingDataAccessor, which defines how data
14
+ * properties are accessed. Also allows for filter customization by overriding filterPredicate,
15
+ * which defines how row data is converted to a string for filter matching.
16
+ */
17
+ export class IbTableDataSource extends DataSource {
18
+ /** Stream that emits when a new data array is set on the data source. */
19
+ _data;
20
+ /** Stream emitting render data to the table (depends on ordered data changes). */
21
+ _renderData = new BehaviorSubject([]);
22
+ /** Used to react to internal changes of the paginator that are made by the data source itself. */
23
+ _internalPageChanges = new Subject();
24
+ /**
25
+ * Subscription to the changes that should trigger an update to the table's rendered rows, such
26
+ * as filtering, sorting, pagination, or base data changes.
27
+ */
28
+ _renderChangesSubscription = null;
29
+ _viewChangesSubscription = null;
30
+ tableName;
31
+ /**
32
+ * The filtered set of data that has been matched by the filter string, or all the data if there
33
+ * is no filter. Useful for knowing the set of data the table represents.
34
+ * For example, a 'selectAll()' function would likely want to select the set of filtered data
35
+ * shown to the user rather than all the data.
36
+ */
37
+ filteredData;
38
+ /** Array of data that should be rendered by the table, where each object represents one row. */
39
+ get data() {
40
+ return this._data.value;
41
+ }
42
+ set data(data) {
43
+ data = Array.isArray(data) ? data : [];
44
+ this._data.next(data);
45
+ this._initializeFilters(data);
46
+ // Normally the `filteredData` is updated by the re-render
47
+ // subscription, but that won't happen if it's inactive.
48
+ if (!this._renderChangesSubscription) {
49
+ this._filterData(data);
50
+ }
51
+ }
52
+ /**
53
+ * Instance of the IbFilter component used by the table to filter its data. Filter changes
54
+ * emitted by the IbFilter will trigger an update to the table's rendered data.
55
+ */
56
+ get filter() {
57
+ return this._filter;
58
+ }
59
+ set filter(f) {
60
+ this._filter = f;
61
+ this._initializeFilters(this.data);
62
+ this._updateChangeSubscription();
63
+ }
64
+ _filter;
65
+ /**
66
+ * Instance of the MatSort directive used by the table to control its sorting. Sort changes
67
+ * emitted by the MatSort will trigger an update to the table's rendered data.
68
+ */
69
+ get sort() {
70
+ return this._sort;
71
+ }
72
+ set sort(sort) {
73
+ this._sort = sort;
74
+ this._updateChangeSubscription();
75
+ }
76
+ _sort;
77
+ _sortState = {
78
+ active: "",
79
+ direction: "",
80
+ };
81
+ get sortState() {
82
+ return {
83
+ active: this._sortState.direction !== '' ? this._sortState.active : '',
84
+ direction: this._sortState.direction
85
+ };
86
+ }
87
+ set sortState(sort) {
88
+ this._sortState = {
89
+ active: sort?.active ?? '',
90
+ direction: sort?.direction ?? ''
91
+ };
92
+ }
93
+ /**
94
+ * Instance of the paginator component used by the table to control what page of the data is
95
+ * displayed. Page changes emitted by the paginator will trigger an update to the
96
+ * table's rendered data.
97
+ *
98
+ * Note that the data source uses the paginator's properties to calculate which page of data
99
+ * should be displayed. If the paginator receives its properties as template inputs,
100
+ * e.g. `[pageLength]=100` or `[pageIndex]=1`, then be sure that the paginator's view has been
101
+ * initialized before assigning it to this data source.
102
+ */
103
+ get paginator() {
104
+ return this._paginator;
105
+ }
106
+ set paginator(paginator) {
107
+ this._paginator = paginator;
108
+ this._updateChangeSubscription();
109
+ }
110
+ _paginator;
111
+ get columns() {
112
+ return this._columns;
113
+ }
114
+ set columns(columns) {
115
+ this._columns = columns.reduce((acc, c) => ({ [c.name]: c, ...acc }), {});
116
+ }
117
+ _columns = {};
118
+ set view(view) {
119
+ this._view = view;
120
+ this._updateViewChangeSubscription();
121
+ }
122
+ get view() {
123
+ return this._view;
124
+ }
125
+ _view;
126
+ /**
127
+ * Aggregated data by column name.
128
+ */
129
+ aggregatedData = {};
130
+ /**
131
+ * Dictionary of columns to aggregate and the function (function id) to apply.
132
+ * Note: this structure is serialized within a view
133
+ */
134
+ aggregatedColumns = {};
135
+ aggregationFunctions = inject(IB_AGGREGATE);
136
+ store = inject(Store);
137
+ /**
138
+ * Used to trigger the aggregation of a column by the user.
139
+ *
140
+ * IbTableViewGroup listens to this stream to detect state changes
141
+ */
142
+ aggregate = new Subject();
143
+ /**
144
+ * Whether the table should display the aggregation footer.
145
+ * (this reeks...)
146
+ */
147
+ get shouldDisplayAggregationFooter() {
148
+ return Object.values(this.columns).filter((c) => c.aggregate).length > 0;
149
+ }
150
+ selectionColumn;
151
+ /**
152
+ * Gets a sorted copy of the data array based on the state of the MatSort. Called
153
+ * after changes are made to the filtered data or when sort changes are emitted from MatSort.
154
+ * By default, the function retrieves the active sort and its direction and compares data
155
+ * by retrieving data using the sortingDataAccessor.
156
+ * @param data The array of data that should be sorted.
157
+ * @param sort The connected MatSort that holds the current sort state.
158
+ */
159
+ sortData = (data, sort) => {
160
+ const active = sort.active;
161
+ const direction = sort.direction;
162
+ if (!active || direction == "") {
163
+ return data;
164
+ }
165
+ const column = this._columns[active];
166
+ return data.sort((a, b) => {
167
+ let valueA = column.sortingDataAccessor(a, active);
168
+ let valueB = column.sortingDataAccessor(b, active);
169
+ // If there are data in the column that can be converted to a number,
170
+ // it must be ensured that the rest of the data
171
+ // is of the same type so as not to order incorrectly.
172
+ const valueAType = typeof valueA;
173
+ const valueBType = typeof valueB;
174
+ if (valueAType !== valueBType) {
175
+ if (valueAType === "number") {
176
+ valueA += "";
177
+ }
178
+ if (valueBType === "number") {
179
+ valueB += "";
180
+ }
181
+ }
182
+ // If both valueA and valueB exist (truthy), then compare the two. Otherwise, check if
183
+ // one value exists while the other doesn't. In this case, existing value should come last.
184
+ // This avoids inconsistent results when comparing values to undefined/null.
185
+ // If neither value exists, return 0 (equal).
186
+ let comparatorResult = 0;
187
+ if (valueA != null && valueB != null) {
188
+ // Check if one value is greater than the other; if equal, comparatorResult should remain 0.
189
+ if (valueA > valueB) {
190
+ comparatorResult = 1;
191
+ }
192
+ else if (valueA < valueB) {
193
+ comparatorResult = -1;
194
+ }
195
+ }
196
+ else if (valueA != null) {
197
+ comparatorResult = 1;
198
+ }
199
+ else if (valueB != null) {
200
+ comparatorResult = -1;
201
+ }
202
+ return comparatorResult * (direction == "asc" ? 1 : -1);
203
+ });
204
+ };
205
+ /**
206
+ * Checks if a data object matches the data source's filter.
207
+ * @param data Data object used to check against the filter.
208
+ * @param filter Filter that has been set on the data source.
209
+ * @returns Whether the filter matches against the data
210
+ */
211
+ filterPredicate = (data, filter) => {
212
+ const { ibSearchBar, ...filters } = filter;
213
+ const matchesSearchBar = this.applySearchBarFilter(data, ibSearchBar);
214
+ const matches = Object.entries(filters).every(([columnName, condition]) => {
215
+ const column = this.columns[columnName];
216
+ if (!column) {
217
+ throw Error(`ib-filter: column ${columnName} not found`);
218
+ }
219
+ const filterValue = column.filterDataAccessor(data, columnName);
220
+ return applyFilter(condition, filterValue);
221
+ });
222
+ return matches && matchesSearchBar;
223
+ };
224
+ applySearchBarFilter = (data, filter) => {
225
+ if (!filter) {
226
+ return true;
227
+ }
228
+ const dataStr = Object.keys(data)
229
+ .reduce((currentTerm, key) => {
230
+ const column = this.columns[key];
231
+ const value = column ? column.filterDataAccessor(data, key) : data[key];
232
+ return currentTerm + value + "◬";
233
+ }, "")
234
+ .toLowerCase();
235
+ return applyFilter(filter, dataStr);
236
+ };
237
+ constructor(initialData = []) {
238
+ super();
239
+ this._data = new BehaviorSubject(initialData);
240
+ this._updateChangeSubscription();
241
+ this.aggregate.subscribe((target) => {
242
+ this.aggregatedColumns[target.columnName] = target.function;
243
+ this.store.dispatch(urlStateActions.setAggregatedColumns({ tableName: this.tableName, params: { ...this.aggregatedColumns } }));
244
+ this._aggregateData(this.filteredData);
245
+ this._aggregatePaginatedData(this._pageData(this._orderData(this.filteredData)));
246
+ });
247
+ }
248
+ _initializeFilters(data) {
249
+ this.filter?.filters.forEach((f) => f.initializeFromColumn(data));
250
+ }
251
+ /**
252
+ * Subscribe to changes that should trigger an update to the table's rendered rows. When the
253
+ * changes occur, process the current state of the filter, sort, and pagination along with
254
+ * the provided base data and send it to the table for rendering.
255
+ */
256
+ _updateChangeSubscription() {
257
+ // Sorting and/or pagination should be watched if sort and/or paginator are provided.
258
+ // The events should emit whenever the component emits a change or initializes, or if no
259
+ // component is provided, a stream with just a null event should be provided.
260
+ // The `sortChange` and `pageChange` acts as a signal to the combineLatests below so that the
261
+ // pipeline can progress to the next step. Note that the value from these streams are not used,
262
+ // they purely act as a signal to progress in the pipeline.
263
+ const sortChange = this._sort
264
+ ? merge(this.sort.sortChange, this.sort.initialized)
265
+ : observableOf(null);
266
+ const pageChange = this._paginator
267
+ ? merge(this._paginator.page, this._internalPageChanges, this._paginator.initialized)
268
+ : observableOf(null);
269
+ const filterChange = this._filter
270
+ ? merge(this._filter.ibFilterUpdated, this._filter.initialized)
271
+ : observableOf(null);
272
+ const dataStream = this._data;
273
+ // Watch for base data or filter changes to provide a filtered set of data.
274
+ const filteredData = combineLatest([dataStream, filterChange]).pipe(map(([data, filterChange]) => {
275
+ if (this.filter?.initialized) {
276
+ this.store.dispatch(urlStateActions.setFilters({ tableName: this.tableName, params: this.filter?.selectedCriteria ?? {} }));
277
+ }
278
+ return this._filterData(data);
279
+ }), map((data) => this._aggregateData(data)));
280
+ // Watch for filtered data or sort changes to provide an ordered set of data.
281
+ const orderedData = combineLatest([filteredData, sortChange]).pipe(map(([data, sort]) => {
282
+ if (sort) {
283
+ this.sortState = this.sort;
284
+ this.store.dispatch(urlStateActions.setSort({ tableName: this.tableName, params: this.sortState }));
285
+ }
286
+ return this._orderData(data);
287
+ }));
288
+ // Watch for ordered data or page changes to provide a paged set of data.
289
+ const paginatedData = combineLatest([orderedData, pageChange]).pipe(map(([data]) => this._pageData(data)), map((data) => this._aggregatePaginatedData(data)));
290
+ // Watched for paged data changes and send the result to the table to render.
291
+ this._renderChangesSubscription?.unsubscribe();
292
+ this._renderChangesSubscription = paginatedData.subscribe((data) => {
293
+ this._renderData.next(data);
294
+ });
295
+ }
296
+ _updateViewChangeSubscription() {
297
+ this.view.defaultView.data = {
298
+ filter: this.filter.initialRawValue,
299
+ pageSize: this.paginator.pageSize,
300
+ aggregatedColumns: this.aggregatedColumns,
301
+ sort: {
302
+ ...this.sortState
303
+ }
304
+ };
305
+ this.view.viewDataAccessor = () => {
306
+ return {
307
+ filter: this.filter.selectedCriteria,
308
+ pageSize: this.paginator.pageSize,
309
+ aggregatedColumns: this.aggregatedColumns,
310
+ sort: {
311
+ ...this.sortState
312
+ },
313
+ };
314
+ };
315
+ const changes$ = merge(this.filter.ibQueryUpdated, this.paginator.page, this.aggregate, this.sort.sortChange);
316
+ this.view.handleStateChanges(changes$);
317
+ this._viewChangesSubscription?.unsubscribe();
318
+ this._viewChangesSubscription = this.view._activeView
319
+ // Skip initial view, initialization come from querystring
320
+ .pipe(filter((view) => !!view && !view.initial))
321
+ .subscribe(this.handleViewChange);
322
+ }
323
+ handleViewChange = (view) => {
324
+ this.paginator.firstPage();
325
+ this.paginator.pageSize = view.data.pageSize;
326
+ this.aggregatedColumns = { ...view.data.aggregatedColumns };
327
+ this.filter.value = view.data.filter;
328
+ this.sortState = view.data.sort;
329
+ this.store.dispatch(urlStateActions.handleViewChange({
330
+ tableName: this.tableName,
331
+ params: {
332
+ view: view.id,
333
+ pageSize: view.data.pageSize,
334
+ page: 0,
335
+ filters: view.data.filter,
336
+ aggregatedColumns: view.data.aggregatedColumns,
337
+ sort: {
338
+ active: view.data.sort.active,
339
+ direction: view.data.sort.direction,
340
+ },
341
+ }
342
+ }));
343
+ };
344
+ /**
345
+ * Returns a filtered data array where each row satisfies the filter.
346
+ * If no filter is set, returns the data array as provided.
347
+ */
348
+ _filterData(data) {
349
+ this.selectionColumn?.selection.clear();
350
+ this.filteredData = !this.filter?.value
351
+ ? data
352
+ : data.filter((obj) => this.filterPredicate(obj, this.filter.value));
353
+ if (this.paginator) {
354
+ this._updatePaginator(this.filteredData.length);
355
+ }
356
+ return this.filteredData;
357
+ }
358
+ /**
359
+ * Returns a sorted copy of the data if MatSort has a sort applied, otherwise just returns the
360
+ * data array as provided. Uses the default data accessor for data lookup, unless a
361
+ * sortDataAccessor function is defined.
362
+ */
363
+ _orderData(data) {
364
+ // If there is no active sort or direction, return the data without trying to sort.
365
+ if (!this.sort) {
366
+ return data;
367
+ }
368
+ return this.sortData(data.slice(), this.sort);
369
+ }
370
+ /**
371
+ * Returns a paged slice of the provided data array according to the provided paginator's page
372
+ * index and length. If there is no paginator provided, returns the data array as provided.
373
+ */
374
+ _pageData(data) {
375
+ if (!this.paginator) {
376
+ return data;
377
+ }
378
+ const startIndex = this.paginator.pageIndex * this.paginator.pageSize;
379
+ return data.slice(startIndex, startIndex + this.paginator.pageSize);
380
+ }
381
+ /**
382
+ * Updates the paginator to reflect the length of the filtered data, and makes sure that the page
383
+ * index does not exceed the paginator's last page. Values are changed in a resolved promise to
384
+ * guard against making property changes within a round of change detection.
385
+ */
386
+ _updatePaginator(filteredDataLength) {
387
+ Promise.resolve().then(() => {
388
+ const paginator = this.paginator;
389
+ if (!paginator) {
390
+ return;
391
+ }
392
+ paginator.length = filteredDataLength;
393
+ // If the page index is set beyond the page, reduce it to the last page.
394
+ if (paginator.pageIndex > 0) {
395
+ const lastPageIndex = Math.ceil(paginator.length / paginator.pageSize) - 1 || 0;
396
+ const newPageIndex = Math.min(paginator.pageIndex, lastPageIndex);
397
+ if (newPageIndex !== paginator.pageIndex) {
398
+ paginator.pageIndex = newPageIndex;
399
+ // Since the paginator only emits after user-generated changes,
400
+ // we need our own stream so we know to should re-render the data.
401
+ this._internalPageChanges.next();
402
+ }
403
+ }
404
+ });
405
+ }
406
+ _aggregateData(data) {
407
+ for (const [columnName, fun] of Object.entries(this.aggregatedColumns)) {
408
+ const f = this.aggregationFunctions.find((f) => f.id === fun);
409
+ if (!f) {
410
+ continue;
411
+ }
412
+ this.aggregatedData[columnName] = {
413
+ ...(this.aggregatedData[columnName] ?? {}),
414
+ total: f.aggregateData(data.map((i) => i[columnName])),
415
+ };
416
+ }
417
+ return data;
418
+ }
419
+ _aggregatePaginatedData(data) {
420
+ for (const [columnName, fun] of Object.entries(this.aggregatedColumns)) {
421
+ const f = this.aggregationFunctions.find((f) => f.id === fun);
422
+ if (!f) {
423
+ continue;
424
+ }
425
+ this.aggregatedData[columnName] = {
426
+ ...(this.aggregatedData[columnName] ?? {}),
427
+ currentPage: f.aggregateData(data.map((i) => i[columnName])),
428
+ };
429
+ }
430
+ return data;
431
+ }
432
+ /**
433
+ * Used by the MatTable. Called when it connects to the data source.
434
+ */
435
+ connect() {
436
+ if (!this._renderChangesSubscription) {
437
+ this._updateChangeSubscription();
438
+ }
439
+ return this._renderData;
440
+ }
441
+ /**
442
+ * Used by the MatTable. Called when it disconnects from the data source.
443
+ */
444
+ disconnect() {
445
+ this._viewChangesSubscription?.unsubscribe();
446
+ this._renderChangesSubscription?.unsubscribe();
447
+ this._renderChangesSubscription = null;
448
+ }
449
+ }
450
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtZGF0YS1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2lub2JldGEtdWkvdWkva2FpLXRhYmxlL3RhYmxlLWRhdGEtc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3ZDLE9BQU8sRUFDTCxlQUFlLEVBRWYsT0FBTyxFQUVQLGFBQWEsRUFDYixLQUFLLEVBQ0wsRUFBRSxJQUFJLFlBQVksR0FDbkIsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUtwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLE9BQU8saUJBR1gsU0FBUSxVQUFhO0lBQ3JCLHlFQUF5RTtJQUN0RCxLQUFLLENBQXVCO0lBRS9DLGtGQUFrRjtJQUMvRCxXQUFXLEdBQUcsSUFBSSxlQUFlLENBQU0sRUFBRSxDQUFDLENBQUM7SUFFOUQsa0dBQWtHO0lBQ2pGLG9CQUFvQixHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFNUQ7OztPQUdHO0lBQ0gsMEJBQTBCLEdBQXdCLElBQUksQ0FBQztJQUV2RCx3QkFBd0IsR0FBd0IsSUFBSSxDQUFDO0lBRXJELFNBQVMsQ0FBUztJQUNsQjs7Ozs7T0FLRztJQUNILFlBQVksQ0FBTTtJQUVsQixnR0FBZ0c7SUFDaEcsSUFBSSxJQUFJO1FB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LEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ1AsU0FBUztZQUNYLENBQUM7WUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxHQUFHO2dCQUNoQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzFDLFdBQVcsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2FBQzdELENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPO1FBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ25DLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsVUFBVTtRQUNSLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQztJQUN6QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9jb2xsZWN0aW9uc1wiO1xuaW1wb3J0IHsgaW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IE1hdFBhZ2luYXRvciwgUGFnZUV2ZW50IH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvclwiO1xuaW1wb3J0IHsgTWF0U29ydCwgU29ydCB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zb3J0XCI7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIFN1YnNjcmlwdGlvbixcbiAgY29tYmluZUxhdGVzdCxcbiAgbWVyZ2UsXG4gIG9mIGFzIG9ic2VydmFibGVPZixcbn0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IGZpbHRlciwgbWFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBJYkZpbHRlciB9IGZyb20gXCIuLi9rYWktZmlsdGVyL2ZpbHRlci5jb21wb25lbnRcIjtcbmltcG9ydCB7IEliRmlsdGVyRGVmLCBJYkZpbHRlclN5bnRheCB9IGZyb20gXCIuLi9rYWktZmlsdGVyL2ZpbHRlci50eXBlc1wiO1xuaW1wb3J0IHsgYXBwbHlGaWx0ZXIgfSBmcm9tIFwiLi4va2FpLWZpbHRlci9maWx0ZXJzXCI7XG5pbXBvcnQgeyBJYlRhYmxlVmlld0dyb3VwIH0gZnJvbSBcIi4uL3ZpZXdzL2NvbXBvbmVudHMvdGFibGUtdmlldy1ncm91cC90YWJsZS12aWV3LWdyb3VwLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgSVZpZXcgfSBmcm9tIFwiLi4vdmlld3Mvc3RvcmUvdmlld3MvdGFibGUtdmlld1wiO1xuaW1wb3J0IHsgSWJBZ2dyZWdhdGVSZXN1bHQgfSBmcm9tIFwiLi9jZWxsc1wiO1xuaW1wb3J0IHsgSWJDb2x1bW4sIEliU2VsZWN0aW9uQ29sdW1uIH0gZnJvbSBcIi4vY29sdW1uc1wiO1xuaW1wb3J0IHsgSUJfQUdHUkVHQVRFIH0gZnJvbSBcIi4vdG9rZW5zXCI7XG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gXCJAbmdyeC9zdG9yZVwiO1xuaW1wb3J0IHsgdXJsU3RhdGVBY3Rpb25zIH0gZnJvbSBcIi4vc3RvcmUvdXJsLXN0YXRlL2FjdGlvbnNcIjtcblxuLyoqXG4gKiBEYXRhIHNvdXJjZSB0aGF0IGFjY2VwdHMgYSBjbGllbnQtc2lkZSBkYXRhIGFycmF5IGFuZCBpbmNsdWRlcyBuYXRpdmUgc3VwcG9ydCBvZiBmaWx0ZXJpbmcsXG4gKiBzb3J0aW5nICh1c2luZyBNYXRTb3J0KSwgYW5kIHBhZ2luYXRpb24gKHVzaW5nIE1hdFBhZ2luYXRvcikuXG4gKlxuICogQWxsb3dzIGZvciBzb3J0IGN1c3RvbWl6YXRpb24gYnkgb3ZlcnJpZGluZyBzb3J0aW5nRGF0YUFjY2Vzc29yLCB3aGljaCBkZWZpbmVzIGhvdyBkYXRhXG4gKiBwcm9wZXJ0aWVzIGFyZSBhY2Nlc3NlZC4gQWxzbyBhbGxvd3MgZm9yIGZpbHRlciBjdXN0b21pemF0aW9uIGJ5IG92ZXJyaWRpbmcgZmlsdGVyUHJlZGljYXRlLFxuICogd2hpY2ggZGVmaW5lcyBob3cgcm93IGRhdGEgaXMgY29udmVydGVkIHRvIGEgc3RyaW5nIGZvciBmaWx0ZXIgbWF0Y2hpbmcuXG4gKi9cbmV4cG9ydCBjbGFzcyBJYlRhYmxlRGF0YVNvdXJjZTxcbiAgVCxcbiAgUCBleHRlbmRzIE1hdFBhZ2luYXRvciA9IE1hdFBhZ2luYXRvclxuPiBleHRlbmRzIERhdGFTb3VyY2U8VD4ge1xuICAvKiogU3RyZWFtIHRoYXQgZW1pdHMgd2hlbiBhIG5ldyBkYXRhIGFycmF5IGlzIHNldCBvbiB0aGUgZGF0YSBzb3VyY2UuICovXG4gIHByb3RlY3RlZCByZWFkb25seSBfZGF0YTogQmVoYXZpb3JTdWJqZWN0PFRbXT47XG5cbiAgLyoqIFN0cmVhbSBlbWl0dGluZyByZW5kZXIgZGF0YSB0byB0aGUgdGFibGUgKGRlcGVuZHMgb24gb3JkZXJlZCBkYXRhIGNoYW5nZXMpLiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3JlbmRlckRhdGEgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRbXT4oW10pO1xuXG4gIC8qKiBVc2VkIHRvIHJlYWN0IHRvIGludGVybmFsIGNoYW5nZXMgb2YgdGhlIHBhZ2luYXRvciB0aGF0IGFyZSBtYWRlIGJ5IHRoZSBkYXRhIHNvdXJjZSBpdHNlbGYuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2ludGVybmFsUGFnZUNoYW5nZXMgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBTdWJzY3JpcHRpb24gdG8gdGhlIGNoYW5nZXMgdGhhdCBzaG91bGQgdHJpZ2dlciBhbiB1cGRhdGUgdG8gdGhlIHRhYmxlJ3MgcmVuZGVyZWQgcm93cywgc3VjaFxuICAgKiBhcyBmaWx0ZXJpbmcsIHNvcnRpbmcsIHBhZ2luYXRpb24sIG9yIGJhc2UgZGF0YSBjaGFuZ2VzLlxuICAgKi9cbiAgX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIF92aWV3Q2hhbmdlc1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgdGFibGVOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZmlsdGVyZWQgc2V0IG9mIGRhdGEgdGhhdCBoYXMgYmVlbiBtYXRjaGVkIGJ5IHRoZSBmaWx0ZXIgc3RyaW5nLCBvciBhbGwgdGhlIGRhdGEgaWYgdGhlcmVcbiAgICogaXMgbm8gZmlsdGVyLiBVc2VmdWwgZm9yIGtub3dpbmcgdGhlIHNldCBvZiBkYXRhIHRoZSB0YWJsZSByZXByZXNlbnRzLlxuICAgKiBGb3IgZXhhbXBsZSwgYSAnc2VsZWN0QWxsKCknIGZ1bmN0aW9uIHdvdWxkIGxpa2VseSB3YW50IHRvIHNlbGVjdCB0aGUgc2V0IG9mIGZpbHRlcmVkIGRhdGFcbiAgICogc2hvd24gdG8gdGhlIHVzZXIgcmF0aGVyIHRoYW4gYWxsIHRoZSBkYXRhLlxuICAgKi9cbiAgZmlsdGVyZWREYXRhOiBUW107XG5cbiAgLyoqIEFycmF5IG9mIGRhdGEgdGhhdCBzaG91bGQgYmUgcmVuZGVyZWQgYnkgdGhlIHRhYmxlLCB3aGVyZSBlYWNoIG9iamVjdCByZXByZXNlbnRzIG9uZSByb3cuICovXG4gIGdldCBkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnZhbHVlO1xuICB9XG5cbiAgc2V0IGRhdGEoZGF0YTogVFtdKSB7XG4gICAgZGF0YSA9IEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW107XG4gICAgdGhpcy5fZGF0YS5uZXh0KGRhdGEpO1xuICAgIHRoaXMuX2luaXRpYWxpemVGaWx0ZXJzKGRhdGEpO1xuICAgIC8vIE5vcm1hbGx5IHRoZSBgZmlsdGVyZWREYXRhYCBpcyB1cGRhdGVkIGJ5IHRoZSByZS1yZW5kZXJcbiAgICAvLyBzdWJzY3JpcHRpb24sIGJ1dCB0aGF0IHdvbid0IGhhcHBlbiBpZiBpdCdzIGluYWN0aXZlLlxuICAgIGlmICghdGhpcy5fcmVuZGVyQ2hhbmdlc1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fZmlsdGVyRGF0YShkYXRhKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFuY2Ugb2YgdGhlIEliRmlsdGVyIGNvbXBvbmVudCB1c2VkIGJ5IHRoZSB0YWJsZSB0byBmaWx0ZXIgaXRzIGRhdGEuIEZpbHRlciBjaGFuZ2VzXG4gICAqIGVtaXR0ZWQgYnkgdGhlIEliRmlsdGVyIHdpbGwgdHJpZ2dlciBhbiB1cGRhdGUgdG8gdGhlIHRhYmxlJ3MgcmVuZGVyZWQgZGF0YS5cbiAgICovXG4gIGdldCBmaWx0ZXIoKTogSWJGaWx0ZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyO1xuICB9XG5cbiAgc2V0IGZpbHRlcihmOiBJYkZpbHRlciB8IG51bGwpIHtcbiAgICB0aGlzLl9maWx0ZXIgPSBmO1xuICAgIHRoaXMuX2luaXRpYWxpemVGaWx0ZXJzKHRoaXMuZGF0YSk7XG4gICAgdGhpcy5fdXBkYXRlQ2hhbmdlU3Vic2NyaXB0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIF9maWx0ZXI6IEliRmlsdGVyIHwgbnVsbDtcblxuICAvKipcbiAgICogSW5zdGFuY2Ugb2YgdGhlIE1hdFNvcnQgZGlyZWN0aXZlIHVzZWQgYnkgdGhlIHRhYmxlIHRvIGNvbnRyb2wgaXRzIHNvcnRpbmcuIFNvcnQgY2hhbmdlc1xuICAgKiBlbWl0dGVkIGJ5IHRoZSBNYXRTb3J0IHdpbGwgdHJpZ2dlciBhbiB1cGRhdGUgdG8gdGhlIHRhYmxlJ3MgcmVuZGVyZWQgZGF0YS5cbiAgICovXG4gIGdldCBzb3J0KCk6IE1hdFNvcnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fc29ydDtcbiAgfVxuXG4gIHNldCBzb3J0KHNvcnQ6IE1hdFNvcnQgfCBudWxsKSB7XG4gICAgdGhpcy5fc29ydCA9IHNvcnQ7XG4gICAgdGhpcy5fdXBkYXRlQ2hhbmdlU3Vic2NyaXB0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIF9zb3J0OiBNYXRTb3J0IHwgbnVsbDtcblxuICBfc29ydFN0YXRlOiBTb3J0ID0ge1xuICAgIGFjdGl2ZTogXCJcIixcbiAgICBkaXJlY3Rpb246IFwiXCIsXG4gIH1cbiAgZ2V0IHNvcnRTdGF0ZSgpe1xuICAgIHJldHVybiB7XG4gICAgICBhY3RpdmU6IHRoaXMuX3NvcnRTdGF0ZS5kaXJlY3Rpb24gIT09ICcnID8gdGhpcy5fc29ydFN0YXRlLmFjdGl2ZSA6ICcnLFxuICAgICAgZGlyZWN0aW9uOiB0aGlzLl9zb3J0U3RhdGUuZGlyZWN0aW9uXG4gICAgfVxuICB9XG4gIHNldCBzb3J0U3RhdGUoc29ydDogU29ydCl7XG4gICAgdGhpcy5fc29ydFN0YXRlID0ge1xuICAgICAgYWN0aXZlOiBzb3J0Py5hY3RpdmUgPz8gJycsXG4gICAgICBkaXJlY3Rpb246IHNvcnQ/LmRpcmVjdGlvbiA/PyAnJ1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFuY2Ugb2YgdGhlIHBhZ2luYXRvciBjb21wb25lbnQgdXNlZCBieSB0aGUgdGFibGUgdG8gY29udHJvbCB3aGF0IHBhZ2Ugb2YgdGhlIGRhdGEgaXNcbiAgICogZGlzcGxheWVkLiBQYWdlIGNoYW5nZXMgZW1pdHRlZCBieSB0aGUgcGFnaW5hdG9yIHdpbGwgdHJpZ2dlciBhbiB1cGRhdGUgdG8gdGhlXG4gICAqIHRhYmxlJ3MgcmVuZGVyZWQgZGF0YS5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSBkYXRhIHNvdXJjZSB1c2VzIHRoZSBwYWdpbmF0b3IncyBwcm9wZXJ0aWVzIHRvIGNhbGN1bGF0ZSB3aGljaCBwYWdlIG9mIGRhdGFcbiAgICogc2hvdWxkIGJlIGRpc3BsYXllZC4gSWYgdGhlIHBhZ2luYXRvciByZWNlaXZlcyBpdHMgcHJvcGVydGllcyBhcyB0ZW1wbGF0ZSBpbnB1dHMsXG4gICAqIGUuZy4gYFtwYWdlTGVuZ3RoXT0xMDBgIG9yIGBbcGFnZUluZGV4XT0xYCwgdGhlbiBiZSBzdXJlIHRoYXQgdGhlIHBhZ2luYXRvcidzIHZpZXcgaGFzIGJlZW5cbiAgICogaW5pdGlhbGl6ZWQgYmVmb3JlIGFzc2lnbmluZyBpdCB0byB0aGlzIGRhdGEgc291cmNlLlxuICAgKi9cbiAgZ2V0IHBhZ2luYXRvcigpOiBQIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2luYXRvcjtcbiAgfVxuXG4gIHNldCBwYWdpbmF0b3IocGFnaW5hdG9yOiBQIHwgbnVsbCkge1xuICAgIHRoaXMuX3BhZ2luYXRvciA9IHBhZ2luYXRvcjtcbiAgICB0aGlzLl91cGRhdGVDaGFuZ2VTdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhZ2luYXRvcjogUCB8IG51bGw7XG5cbiAgZ2V0IGNvbHVtbnMoKTogUmVjb3JkPHN0cmluZywgSWJDb2x1bW48dW5rbm93bj4+IHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcbiAgfVxuXG4gIHNldCBjb2x1bW5zKGNvbHVtbnM6IEliQ29sdW1uPHVua25vd24+W10pIHtcbiAgICB0aGlzLl9jb2x1bW5zID0gY29sdW1ucy5yZWR1Y2UoKGFjYywgYykgPT4gKHsgW2MubmFtZV06IGMsIC4uLmFjYyB9KSwge30pO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29sdW1uczogUmVjb3JkPHN0cmluZywgSWJDb2x1bW48dW5rbm93bj4+ID0ge307XG5cbiAgc2V0IHZpZXcodmlldzogSWJUYWJsZVZpZXdHcm91cCB8IG51bGwpIHtcbiAgICB0aGlzLl92aWV3ID0gdmlldztcbiAgICB0aGlzLl91cGRhdGVWaWV3Q2hhbmdlU3Vic2NyaXB0aW9uKCk7XG4gIH1cblxuICBnZXQgdmlldygpIHtcbiAgICByZXR1cm4gdGhpcy5fdmlldztcbiAgfVxuXG4gIHByaXZhdGUgX3ZpZXc6IEliVGFibGVWaWV3R3JvdXAgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBZ2dyZWdhdGVkIGRhdGEgYnkgY29sdW1uIG5hbWUuXG4gICAqL1xuICBhZ2dyZWdhdGVkRGF0YTogUmVjb3JkPHN0cmluZywgSWJBZ2dyZWdhdGVSZXN1bHQ+ID0ge307XG4gIC8qKlxuICAgKiBEaWN0aW9uYXJ5IG9mIGNvbHVtbnMgdG8gYWdncmVnYXRlIGFuZCB0aGUgZnVuY3Rpb24gKGZ1bmN0aW9uIGlkKSB0byBhcHBseS5cbiAgICogTm90ZTogdGhpcyBzdHJ1Y3R1cmUgaXMgc2VyaWFsaXplZCB3aXRoaW4gYSB2aWV3XG4gICAqL1xuICBhZ2dyZWdhdGVkQ29sdW1uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBhZ2dyZWdhdGlvbkZ1bmN0aW9ucyA9IGluamVjdChJQl9BR0dSRUdBVEUpO1xuICBwcm90ZWN0ZWQgc3RvcmUgPSBpbmplY3QoU3RvcmUpO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHRyaWdnZXIgdGhlIGFnZ3JlZ2F0aW9uIG9mIGEgY29sdW1uIGJ5IHRoZSB1c2VyLlxuICAgKlxuICAgKiBJYlRhYmxlVmlld0dyb3VwIGxpc3RlbnMgdG8gdGhpcyBzdHJlYW0gdG8gZGV0ZWN0IHN0YXRlIGNoYW5nZXNcbiAgICovXG4gIGFnZ3JlZ2F0ZSA9IG5ldyBTdWJqZWN0PHsgY29sdW1uTmFtZTogc3RyaW5nOyBmdW5jdGlvbjogc3RyaW5nIH0+KCk7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB0YWJsZSBzaG91bGQgZGlzcGxheSB0aGUgYWdncmVnYXRpb24gZm9vdGVyLlxuICAgKiAodGhpcyByZWVrcy4uLilcbiAgICovXG4gIGdldCBzaG91bGREaXNwbGF5QWdncmVnYXRpb25Gb290ZXIoKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5jb2x1bW5zKS5maWx0ZXIoKGMpID0+IGMuYWdncmVnYXRlKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgc2VsZWN0aW9uQ29sdW1uOiBJYlNlbGVjdGlvbkNvbHVtbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEdldHMgYSBzb3J0ZWQgY29weSBvZiB0aGUgZGF0YSBhcnJheSBiYXNlZCBvbiB0aGUgc3RhdGUgb2YgdGhlIE1hdFNvcnQuIENhbGxlZFxuICAgKiBhZnRlciBjaGFuZ2VzIGFyZSBtYWRlIHRvIHRoZSBmaWx0ZXJlZCBkYXRhIG9yIHdoZW4gc29ydCBjaGFuZ2VzIGFyZSBlbWl0dGVkIGZyb20gTWF0U29ydC5cbiAgICogQnkgZGVmYXVsdCwgdGhlIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgYWN0aXZlIHNvcnQgYW5kIGl0cyBkaXJlY3Rpb24gYW5kIGNvbXBhcmVzIGRhdGFcbiAgICogYnkgcmV0cmlldmluZyBkYXRhIHVzaW5nIHRoZSBzb3J0aW5nRGF0YUFjY2Vzc29yLlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgYXJyYXkgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSBzb3J0ZWQuXG4gICAqIEBwYXJhbSBzb3J0IFRoZSBjb25uZWN0ZWQgTWF0U29ydCB0aGF0IGhvbGRzIHRoZSBjdXJyZW50IHNvcnQgc3RhdGUuXG4gICAqL1xuICBzb3J0RGF0YTogKGRhdGE6IFRbXSwgc29ydDogTWF0U29ydCkgPT4gVFtdID0gKFxuICAgIGRhdGE6IFRbXSxcbiAgICBzb3J0OiBNYXRTb3J0XG4gICk6IFRbXSA9PiB7XG4gICAgY29uc3QgYWN0aXZlID0gc29ydC5hY3RpdmU7XG4gICAgY29uc3QgZGlyZWN0aW9uID0gc29ydC5kaXJlY3Rpb247XG4gICAgaWYgKCFhY3RpdmUgfHwgZGlyZWN0aW9uID09IFwiXCIpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuX2NvbHVtbnNbYWN0aXZlXTtcbiAgICByZXR1cm4gZGF0YS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBsZXQgdmFsdWVBID0gY29sdW1uLnNvcnRpbmdEYXRhQWNjZXNzb3IoYSwgYWN0aXZlKTtcbiAgICAgIGxldCB2YWx1ZUIgPSBjb2x1bW4uc29ydGluZ0RhdGFBY2Nlc3NvcihiLCBhY3RpdmUpO1xuXG4gICAgICAvLyBJZiB0aGVyZSBhcmUgZGF0YSBpbiB0aGUgY29sdW1uIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCB0byBhIG51bWJlcixcbiAgICAgIC8vIGl0IG11c3QgYmUgZW5zdXJlZCB0aGF0IHRoZSByZXN0IG9mIHRoZSBkYXRhXG4gICAgICAvLyBpcyBvZiB0aGUgc2FtZSB0eXBlIHNvIGFzIG5vdCB0byBvcmRlciBpbmNvcnJlY3RseS5cbiAgICAgIGNvbnN0IHZhbHVlQVR5cGUgPSB0eXBlb2YgdmFsdWVBO1xuICAgICAgY29uc3QgdmFsdWVCVHlwZSA9IHR5cGVvZiB2YWx1ZUI7XG5cbiAgICAgIGlmICh2YWx1ZUFUeXBlICE9PSB2YWx1ZUJUeXBlKSB7XG4gICAgICAgIGlmICh2YWx1ZUFUeXBlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgdmFsdWVBICs9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlQlR5cGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICB2YWx1ZUIgKz0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBib3RoIHZhbHVlQSBhbmQgdmFsdWVCIGV4aXN0ICh0cnV0aHkpLCB0aGVuIGNvbXBhcmUgdGhlIHR3by4gT3RoZXJ3aXNlLCBjaGVjayBpZlxuICAgICAgLy8gb25lIHZhbHVlIGV4aXN0cyB3aGlsZSB0aGUgb3RoZXIgZG9lc24ndC4gSW4gdGhpcyBjYXNlLCBleGlzdGluZyB2YWx1ZSBzaG91bGQgY29tZSBsYXN0LlxuICAgICAgLy8gVGhpcyBhdm9pZHMgaW5jb25zaXN0ZW50IHJlc3VsdHMgd2hlbiBjb21wYXJpbmcgdmFsdWVzIHRvIHVuZGVmaW5lZC9udWxsLlxuICAgICAgLy8gSWYgbmVpdGhlciB2YWx1ZSBleGlzdHMsIHJldHVybiAwIChlcXVhbCkuXG4gICAgICBsZXQgY29tcGFyYXRvclJlc3VsdCA9IDA7XG4gICAgICBpZiAodmFsdWVBICE9IG51bGwgJiYgdmFsdWVCICE9IG51bGwpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgb25lIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgb3RoZXI7IGlmIGVxdWFsLCBjb21wYXJhdG9yUmVzdWx0IHNob3VsZCByZW1haW4gMC5cbiAgICAgICAgaWYgKHZhbHVlQSA+IHZhbHVlQikge1xuICAgICAgICAgIGNvbXBhcmF0b3JSZXN1bHQgPSAxO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlQSA8IHZhbHVlQikge1xuICAgICAgICAgIGNvbXBhcmF0b3JSZXN1bHQgPSAtMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh2YWx1ZUEgIT0gbnVsbCkge1xuICAgICAgICBjb21wYXJhdG9yUmVzdWx0ID0gMTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWVCICE9IG51bGwpIHtcbiAgICAgICAgY29tcGFyYXRvclJlc3VsdCA9IC0xO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tcGFyYXRvclJlc3VsdCAqIChkaXJlY3Rpb24gPT0gXCJhc2NcIiA/IDEgOiAtMSk7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGRhdGEgb2JqZWN0IG1hdGNoZXMgdGhlIGRhdGEgc291cmNlJ3MgZmlsdGVyLlxuICAgKiBAcGFyYW0gZGF0YSBEYXRhIG9iamVjdCB1c2VkIHRvIGNoZWNrIGFnYWluc3QgdGhlIGZpbHRlci5cbiAgICogQHBhcmFtIGZpbHRlciBGaWx0ZXIgdGhhdCBoYXMgYmVlbiBzZXQgb24gdGhlIGRhdGEgc291cmNlLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBmaWx0ZXIgbWF0Y2hlcyBhZ2FpbnN0IHRoZSBkYXRhXG4gICAqL1xuICBmaWx0ZXJQcmVkaWNhdGU6IChkYXRhOiBULCBmaWx0ZXI6IEliRmlsdGVyU3ludGF4KSA9PiBib29sZWFuID0gKFxuICAgIGRhdGE6IFQsXG4gICAgZmlsdGVyOiBJYkZpbHRlclN5bnRheFxuICApOiBib29sZWFuID0+IHtcbiAgICBjb25zdCB7IGliU2VhcmNoQmFyLCAuLi5maWx0ZXJzIH0gPSBmaWx0ZXI7XG4gICAgY29uc3QgbWF0Y2hlc1NlYXJjaEJhciA9IHRoaXMuYXBwbHlTZWFyY2hCYXJGaWx0ZXIoZGF0YSwgaWJTZWFyY2hCYXIpO1xuXG4gICAgY29uc3QgbWF0Y2hlcyA9IE9iamVjdC5lbnRyaWVzKGZpbHRlcnMpLmV2ZXJ5KChbY29sdW1uTmFtZSwgY29uZGl0aW9uXSkgPT4ge1xuICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zW2NvbHVtbk5hbWVdO1xuICAgICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYGliLWZpbHRlcjogY29sdW1uICR7Y29sdW1uTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gY29sdW1uLmZpbHRlckRhdGFBY2Nlc3NvcihkYXRhLCBjb2x1bW5OYW1lKTtcbiAgICAgIHJldHVybiBhcHBseUZpbHRlcihjb25kaXRpb24sIGZpbHRlclZhbHVlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBtYXRjaGVzICYmIG1hdGNoZXNTZWFyY2hCYXI7XG4gIH07XG5cbiAgcHJpdmF0ZSBhcHBseVNlYXJjaEJhckZpbHRlciA9IChkYXRhOiBhbnksIGZpbHRlcjogSWJGaWx0ZXJEZWYpID0+IHtcbiAgICBpZiAoIWZpbHRlcikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YVN0ciA9IE9iamVjdC5rZXlzKGRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVxuICAgICAgLnJlZHVjZSgoY3VycmVudFRlcm06IHN0cmluZywga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zW2tleV07XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29sdW1uID8gY29sdW1uLmZpbHRlckRhdGFBY2Nlc3NvcihkYXRhLCBrZXkpIDogZGF0YVtrZXldO1xuICAgICAgICByZXR1cm4gY3VycmVudFRlcm0gKyB2YWx1ZSArIFwi4pesXCI7XG4gICAgICB9LCBcIlwiKVxuICAgICAgLnRvTG93ZXJDYXNlKCk7XG5cbiAgICByZXR1cm4gYXBwbHlGaWx0ZXIoZmlsdGVyLCBkYXRhU3RyKTtcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihpbml0aWFsRGF0YTogVFtdID0gW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2RhdGEgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRbXT4oaW5pdGlhbERhdGEpO1xuICAgIHRoaXMuX3VwZGF0ZUNoYW5nZVN1YnNjcmlwdGlvbigpO1xuICAgIHRoaXMuYWdncmVnYXRlLnN1YnNjcmliZSgodGFyZ2V0KSA9PiB7XG4gICAgICB0aGlzLmFnZ3JlZ2F0ZWRDb2x1bW5zW3RhcmdldC5jb2x1bW5OYW1lXSA9IHRhcmdldC5mdW5jdGlvbjtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2godXJsU3RhdGVBY3Rpb25zLnNldEFnZ3JlZ2F0ZWRDb2x1bW5zKHt0YWJsZU5hbWU6IHRoaXMudGFibGVOYW1lLCBwYXJhbXM6IHsuLi50aGlzLmFnZ3JlZ2F0ZWRDb2x1bW5zfX0pKTtcbiAgICAgIHRoaXMuX2FnZ3JlZ2F0ZURhdGEodGhpcy5maWx0ZXJlZERhdGEpO1xuICAgICAgdGhpcy5fYWdncmVnYXRlUGFnaW5hdGVkRGF0YShcbiAgICAgICAgdGhpcy5fcGFnZURhdGEodGhpcy5fb3JkZXJEYXRhKHRoaXMuZmlsdGVyZWREYXRhKSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0aWFsaXplRmlsdGVycyhkYXRhOiBhbnlbXSkge1xuICAgIHRoaXMuZmlsdGVyPy5maWx0ZXJzLmZvckVhY2goKGYpID0+IGYuaW5pdGlhbGl6ZUZyb21Db2x1bW4oZGF0YSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byBjaGFuZ2VzIHRoYXQgc2hvdWxkIHRyaWdnZXIgYW4gdXBkYXRlIHRvIHRoZSB0YWJsZSdzIHJlbmRlcmVkIHJvd3MuIFdoZW4gdGhlXG4gICAqIGNoYW5nZXMgb2NjdXIsIHByb2Nlc3MgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGZpbHRlciwgc29ydCwgYW5kIHBhZ2luYXRpb24gYWxvbmcgd2l0aFxuICAgKiB0aGUgcHJvdmlkZWQgYmFzZSBkYXRhIGFuZCBzZW5kIGl0IHRvIHRoZSB0YWJsZSBmb3IgcmVuZGVyaW5nLlxuICAgKi9cbiAgX3VwZGF0ZUNoYW5nZVN1YnNjcmlwdGlvbigpIHtcbiAgICAvLyBTb3J0aW5nIGFuZC9vciBwYWdpbmF0aW9uIHNob3VsZCBiZSB3YXRjaGVkIGlmIHNvcnQgYW5kL29yIHBhZ2luYXRvciBhcmUgcHJvdmlkZWQuXG4gICAgLy8gVGhlIGV2ZW50cyBzaG91bGQgZW1pdCB3aGVuZXZlciB0aGUgY29tcG9uZW50IGVtaXRzIGEgY2hhbmdlIG9yIGluaXRpYWxpemVzLCBvciBpZiBub1xuICAgIC8vIGNvbXBvbmVudCBpcyBwcm92aWRlZCwgYSBzdHJlYW0gd2l0aCBqdXN0IGEgbnVsbCBldmVudCBzaG91bGQgYmUgcHJvdmlkZWQuXG4gICAgLy8gVGhlIGBzb3J0Q2hhbmdlYCBhbmQgYHBhZ2VDaGFuZ2VgIGFjdHMgYXMgYSBzaWduYWwgdG8gdGhlIGNvbWJpbmVMYXRlc3RzIGJlbG93IHNvIHRoYXQgdGhlXG4gICAgLy8gcGlwZWxpbmUgY2FuIHByb2dyZXNzIHRvIHRoZSBuZXh0IHN0ZXAuIE5vdGUgdGhhdCB0aGUgdmFsdWUgZnJvbSB0aGVzZSBzdHJlYW1zIGFyZSBub3QgdXNlZCxcbiAgICAvLyB0aGV5IHB1cmVseSBhY3QgYXMgYSBzaWduYWwgdG8gcHJvZ3Jlc3MgaW4gdGhlIHBpcGVsaW5lLlxuICAgIGNvbnN0IHNvcnRDaGFuZ2U6IE9ic2VydmFibGU8U29ydCB8IG51bGwgfCB2b2lkPiA9IHRoaXMuX3NvcnRcbiAgICAgID8gKG1lcmdlKFxuICAgICAgICAgIHRoaXMuc29ydC5zb3J0Q2hhbmdlLFxuICAgICAgICAgIHRoaXMuc29ydC5pbml0aWFsaXplZFxuICAgICAgICApIGFzIE9ic2VydmFibGU8U29ydCB8IHZvaWQ+KVxuICAgICAgOiBvYnNlcnZhYmxlT2YobnVsbCk7XG4gICAgY29uc3QgcGFnZUNoYW5nZTogT2JzZXJ2YWJsZTxQYWdlRXZlbnQgfCBudWxsIHwgdm9pZD4gPSB0aGlzLl9wYWdpbmF0b3JcbiAgICAgID8gKG1lcmdlKFxuICAgICAgICAgIHRoaXMuX3BhZ2luYXRvci5wYWdlLFxuICAgICAgICAgIHRoaXMuX2ludGVybmFsUGFnZUNoYW5nZXMsXG4gICAgICAgICAgdGhpcy5fcGFnaW5hdG9yLmluaXRpYWxpemVkXG4gICAgICAgICkgYXMgT2JzZXJ2YWJsZTxQYWdlRXZlbnQgfCB2b2lkPilcbiAgICAgIDogb2JzZXJ2YWJsZU9mKG51bGwpO1xuICAgIGNvbnN0IGZpbHRlckNoYW5nZTogT2JzZXJ2YWJsZTxJYkZpbHRlclN5bnRheCB8IG51bGwgfCB2b2lkPiA9IHRoaXMuX2ZpbHRlclxuICAgICAgPyBtZXJnZSh0aGlzLl9maWx0ZXIuaWJGaWx0ZXJVcGRhdGVkLCB0aGlzLl9maWx0ZXIuaW5pdGlhbGl6ZWQpXG4gICAgICA6IG9ic2VydmFibGVPZihudWxsKTtcbiAgICBjb25zdCBkYXRhU3RyZWFtID0gdGhpcy5fZGF0YTtcbiAgICAvLyBXYXRjaCBmb3IgYmFzZSBkYXRhIG9yIGZpbHRlciBjaGFuZ2VzIHRvIHByb3ZpZGUgYSBmaWx0ZXJlZCBzZXQgb2YgZGF0YS5cbiAgICBjb25zdCBmaWx0ZXJlZERhdGEgPSBjb21iaW5lTGF0ZXN0KFtkYXRhU3RyZWFtLCBmaWx0ZXJDaGFuZ2VdKS5waXBlKFxuICAgICAgbWFwKChbZGF0YSwgZmlsdGVyQ2hhbmdlXSkgPT4ge1xuICAgICAgICBpZih0aGlzLmZpbHRlcj8uaW5pdGlhbGl6ZWQpe1xuICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2godXJsU3RhdGVBY3Rpb25zLnNldEZpbHRlcnMoe3RhYmxlTmFtZTogdGhpcy50YWJsZU5hbWUsIHBhcmFtczogdGhpcy5maWx0ZXI/LnNlbGVjdGVkQ3JpdGVyaWEgPz8ge319KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlckRhdGEoZGF0YSlcbiAgICAgIH0pLFxuICAgICAgbWFwKChkYXRhKSA9PiB0aGlzLl9hZ2dyZWdhdGVEYXRhKGRhdGEpKVxuICAgICk7XG4gICAgLy8gV2F0Y2ggZm9yIGZpbHRlcmVkIGRhdGEgb3Igc29ydCBjaGFuZ2VzIHRvIHByb3ZpZGUgYW4gb3JkZXJlZCBzZXQgb2YgZGF0YS5cbiAgICBjb25zdCBvcmRlcmVkRGF0YSA9IGNvbWJpbmVMYXRlc3QoW2ZpbHRlcmVkRGF0YSwgc29ydENoYW5nZV0pLnBpcGUoXG4gICAgICBtYXAoKFtkYXRhLCBzb3J0XSkgPT4ge1xuICAgICAgICBpZihzb3J0KXtcbiAgICAgICAgICB0aGlzLnNvcnRTdGF0ZSA9IHRoaXMuc29ydDtcbiAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHVybFN0YXRlQWN0aW9ucy5zZXRTb3J0KHt0YWJsZU5hbWU6IHRoaXMudGFibGVOYW1lLCBwYXJhbXM6IHRoaXMuc29ydFN0YXRlfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9vcmRlckRhdGEoZGF0YSk7XG4gICAgICB9KVxuICAgICk7XG4gICAgLy8gV2F0Y2ggZm9yIG9yZGVyZWQgZGF0YSBvciBwYWdlIGNoYW5nZXMgdG8gcHJvdmlkZSBhIHBhZ2VkIHNldCBvZiBkYXRhLlxuICAgIGNvbnN0IHBhZ2luYXRlZERhdGEgPSBjb21iaW5lTGF0ZXN0KFtvcmRlcmVkRGF0YSwgcGFnZUNoYW5nZV0pLnBpcGUoXG4gICAgICBtYXAoKFtkYXRhXSkgPT4gdGhpcy5fcGFnZURhdGEoZGF0YSkpLFxuICAgICAgbWFwKChkYXRhKSA9PiB0aGlzLl9hZ2dyZWdhdGVQYWdpbmF0ZWREYXRhKGRhdGEpKVxuICAgICk7XG4gICAgLy8gV2F0Y2hlZCBmb3IgcGFnZWQgZGF0YSBjaGFuZ2VzIGFuZCBzZW5kIHRoZSByZXN1bHQgdG8gdGhlIHRhYmxlIHRvIHJlbmRlci5cbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb24gPSBwYWdpbmF0ZWREYXRhLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgdGhpcy5fcmVuZGVyRGF0YS5uZXh0KGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlVmlld0NoYW5nZVN1YnNjcmlwdGlvbigpIHtcbiAgICB0aGlzLnZpZXcuZGVmYXVsdFZpZXcuZGF0YSA9IHtcbiAgICAgIGZpbHRlcjogdGhpcy5maWx0ZXIuaW5pdGlhbFJhd1ZhbHVlLFxuICAgICAgcGFnZVNpemU6IHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplLFxuICAgICAgYWdncmVnYXRlZENvbHVtbnM6IHRoaXMuYWdncmVnYXRlZENvbHVtbnMsXG4gICAgICBzb3J0OiB7XG4gICAgICAgIC4uLnRoaXMuc29ydFN0YXRlXG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMudmlldy52aWV3RGF0YUFjY2Vzc29yID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmlsdGVyOiB0aGlzLmZpbHRlci5zZWxlY3RlZENyaXRlcmlhLFxuICAgICAgICBwYWdlU2l6ZTogdGhpcy5wYWdpbmF0b3IucGFnZVNpemUsXG4gICAgICAgIGFnZ3JlZ2F0ZWRDb2x1bW5zOiB0aGlzLmFnZ3JlZ2F0ZWRDb2x1bW5zLFxuICAgICAgICBzb3J0OiB7XG4gICAgICAgICAgLi4udGhpcy5zb3J0U3RhdGVcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY2hhbmdlcyQgPSBtZXJnZShcbiAgICAgIHRoaXMuZmlsdGVyLmliUXVlcnlVcGRhdGVkLFxuICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZSxcbiAgICAgIHRoaXMuYWdncmVnYXRlLFxuICAgICAgdGhpcy5zb3J0LnNvcnRDaGFuZ2VcbiAgICApO1xuICAgIHRoaXMudmlldy5oYW5kbGVTdGF0ZUNoYW5nZXMoY2hhbmdlcyQpO1xuXG4gICAgdGhpcy5fdmlld0NoYW5nZXNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fdmlld0NoYW5nZXNTdWJzY3JpcHRpb24gPSB0aGlzLnZpZXcuX2FjdGl2ZVZpZXdcbiAgICAgLy8gU2tpcCBpbml0aWFsIHZpZXcsIGluaXRpYWxpemF0aW9uIGNvbWUgZnJvbSBxdWVyeXN0cmluZ1xuICAgICAgLnBpcGUoZmlsdGVyKCh2aWV3KSA9PiAhIXZpZXcgJiYgIXZpZXcuaW5pdGlhbCkpXG4gICAgICAuc3Vic2NyaWJlKHRoaXMuaGFuZGxlVmlld0NoYW5nZSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVZpZXdDaGFuZ2UgPSAodmlldzogSVZpZXcpID0+IHtcbiAgICB0aGlzLnBhZ2luYXRvci5maXJzdFBhZ2UoKTtcbiAgICB0aGlzLnBhZ2luYXRvci5wYWdlU2l6ZSA9IHZpZXcuZGF0YS5wYWdlU2l6ZTtcbiAgICB0aGlzLmFnZ3JlZ2F0ZWRDb2x1bW5zID0geyAuLi52aWV3LmRhdGEuYWdncmVnYXRlZENvbHVtbnMgfTtcbiAgICB0aGlzLmZpbHRlci52YWx1ZSA9IHZpZXcuZGF0YS5maWx0ZXI7XG4gICAgdGhpcy5zb3J0U3RhdGUgPSB2aWV3LmRhdGEuc29ydDtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHVybFN0YXRlQWN0aW9ucy5oYW5kbGVWaWV3Q2hhbmdlKHtcbiAgICAgIHRhYmxlTmFtZTogdGhpcy50YWJsZU5hbWUsXG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgdmlldzogdmlldy5pZCxcbiAgICAgICAgcGFnZVNpemU6IHZpZXcuZGF0YS5wYWdlU2l6ZSxcbiAgICAgICAgcGFnZTogMCxcbiAgICAgICAgZmlsdGVyczogdmlldy5kYXRhLmZpbHRlcixcbiAgICAgICAgYWdncmVnYXRlZENvbHVtbnM6IHZpZXcuZGF0YS5hZ2dyZWdhdGVkQ29sdW1ucyxcbiAgICAgICAgc29ydDoge1xuICAgICAgICAgIGFjdGl2ZTogdmlldy5kYXRhLnNvcnQuYWN0aXZlLFxuICAgICAgICAgIGRpcmVjdGlvbjogdmlldy5kYXRhLnNvcnQuZGlyZWN0aW9uLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgIH0pKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyBhIGZpbHRlcmVkIGRhdGEgYXJyYXkgd2hlcmUgZWFjaCByb3cgc2F0aXNmaWVzIHRoZSBmaWx0ZXIuXG4gICAqIElmIG5vIGZpbHRlciBpcyBzZXQsIHJldHVybnMgdGhlIGRhdGEgYXJyYXkgYXMgcHJvdmlkZWQuXG4gICAqL1xuICBfZmlsdGVyRGF0YShkYXRhOiBUW10pIHtcbiAgICB0aGlzLnNlbGVjdGlvbkNvbHVtbj8uc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgdGhpcy5maWx0ZXJlZERhdGEgPSAhdGhpcy5maWx0ZXI/LnZhbHVlXG4gICAgICA/IGRhdGFcbiAgICAgIDogZGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5maWx0ZXJQcmVkaWNhdGUob2JqLCB0aGlzLmZpbHRlci52YWx1ZSkpO1xuXG4gICAgaWYgKHRoaXMucGFnaW5hdG9yKSB7XG4gICAgICB0aGlzLl91cGRhdGVQYWdpbmF0b3IodGhpcy5maWx0ZXJlZERhdGEubGVuZ3RoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZERhdGE7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHNvcnRlZCBjb3B5IG9mIHRoZSBkYXRhIGlmIE1hdFNvcnQgaGFzIGEgc29ydCBhcHBsaWVkLCBvdGhlcndpc2UganVzdCByZXR1cm5zIHRoZVxuICAgKiBkYXRhIGFycmF5IGFzIHByb3ZpZGVkLiBVc2VzIHRoZSBkZWZhdWx0IGRhdGEgYWNjZXNzb3IgZm9yIGRhdGEgbG9va3VwLCB1bmxlc3MgYVxuICAgKiBzb3J0RGF0YUFjY2Vzc29yIGZ1bmN0aW9uIGlzIGRlZmluZWQuXG4gICAqL1xuICBfb3JkZXJEYXRhKGRhdGE6IFRbXSk6IFRbXSB7XG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gYWN0aXZlIHNvcnQgb3IgZGlyZWN0aW9uLCByZXR1cm4gdGhlIGRhdGEgd2l0aG91dCB0cnlpbmcgdG8gc29ydC5cbiAgICBpZiAoIXRoaXMuc29ydCkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc29ydERhdGEoZGF0YS5zbGljZSgpLCB0aGlzLnNvcnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBwYWdlZCBzbGljZSBvZiB0aGUgcHJvdmlkZWQgZGF0YSBhcnJheSBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIHBhZ2luYXRvcidzIHBhZ2VcbiAgICogaW5kZXggYW5kIGxlbmd0aC4gSWYgdGhlcmUgaXMgbm8gcGFnaW5hdG9yIHByb3ZpZGVkLCByZXR1cm5zIHRoZSBkYXRhIGFycmF5IGFzIHByb3ZpZGVkLlxuICAgKi9cbiAgX3BhZ2VEYXRhKGRhdGE6IFRbXSk6IFRbXSB7XG4gICAgaWYgKCF0aGlzLnBhZ2luYXRvcikge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCAqIHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplO1xuICAgIHJldHVybiBkYXRhLnNsaWNlKHN0YXJ0SW5kZXgsIHN0YXJ0SW5kZXggKyB0aGlzLnBhZ2luYXRvci5wYWdlU2l6ZSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgcGFnaW5hdG9yIHRvIHJlZmxlY3QgdGhlIGxlbmd0aCBvZiB0aGUgZmlsdGVyZWQgZGF0YSwgYW5kIG1ha2VzIHN1cmUgdGhhdCB0aGUgcGFnZVxuICAgKiBpbmRleCBkb2VzIG5vdCBleGNlZWQgdGhlIHBhZ2luYXRvcidzIGxhc3QgcGFnZS4gVmFsdWVzIGFyZSBjaGFuZ2VkIGluIGEgcmVzb2x2ZWQgcHJvbWlzZSB0b1xuICAgKiBndWFyZCBhZ2FpbnN0IG1ha2luZyBwcm9wZXJ0eSBjaGFuZ2VzIHdpdGhpbiBhIHJvdW5kIG9mIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAqL1xuICBfdXBkYXRlUGFnaW5hdG9yKGZpbHRlcmVkRGF0YUxlbmd0aDogbnVtYmVyKSB7XG4gICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBwYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcblxuICAgICAgaWYgKCFwYWdpbmF0b3IpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwYWdpbmF0b3IubGVuZ3RoID0gZmlsdGVyZWREYXRhTGVuZ3RoO1xuXG4gICAgICAvLyBJZiB0aGUgcGFnZSBpbmRleCBpcyBzZXQgYmV5b25kIHRoZSBwYWdlLCByZWR1Y2UgaXQgdG8gdGhlIGxhc3QgcGFnZS5cbiAgICAgIGlmIChwYWdpbmF0b3IucGFnZUluZGV4ID4gMCkge1xuICAgICAgICBjb25zdCBsYXN0UGFnZUluZGV4ID1cbiAgICAgICAgICBNYXRoLmNlaWwocGFnaW5hdG9yLmxlbmd0aCAvIHBhZ2luYXRvci5wYWdlU2l6ZSkgLSAxIHx8IDA7XG4gICAgICAgIGNvbnN0IG5ld1BhZ2VJbmRleCA9IE1hdGgubWluKHBhZ2luYXRvci5wYWdlSW5kZXgsIGxhc3RQYWdlSW5kZXgpO1xuXG4gICAgICAgIGlmIChuZXdQYWdlSW5kZXggIT09IHBhZ2luYXRvci5wYWdlSW5kZXgpIHtcbiAgICAgICAgICBwYWdpbmF0b3IucGFnZUluZGV4ID0gbmV3UGFnZUluZGV4O1xuXG4gICAgICAgICAgLy8gU2luY2UgdGhlIHBhZ2luYXRvciBvbmx5IGVtaXRzIGFmdGVyIHVzZXItZ2VuZXJhdGVkIGNoYW5nZXMsXG4gICAgICAgICAgLy8gd2UgbmVlZCBvdXIgb3duIHN0cmVhbSBzbyB3ZSBrbm93IHRvIHNob3VsZCByZS1yZW5kZXIgdGhlIGRhdGEuXG4gICAgICAgICAgdGhpcy5faW50ZXJuYWxQYWdlQ2hhbmdlcy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF9hZ2dyZWdhdGVEYXRhKGRhdGE6IFRbXSk6IFRbXSB7XG4gICAgZm9yIChjb25zdCBbY29sdW1uTmFtZSwgZnVuXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmFnZ3JlZ2F0ZWRDb2x1bW5zKSkge1xuICAgICAgY29uc3QgZiA9IHRoaXMuYWdncmVnYXRpb25GdW5jdGlvbnMuZmluZCgoZikgPT4gZi5pZCA9PT0gZnVuKTtcbiAgICAgIGlmICghZikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWdncmVnYXRlZERhdGFbY29sdW1uTmFtZV0gPSB7XG4gICAgICAgIC4uLih0aGlzLmFnZ3JlZ2F0ZWREYXRhW2NvbHVtbk5hbWVdID8/IHt9KSxcbiAgICAgICAgdG90YWw6IGYuYWdncmVnYXRlRGF0YShkYXRhLm1hcCgoaSkgPT4gaVtjb2x1bW5OYW1lXSkpLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBfYWdncmVnYXRlUGFnaW5hdGVkRGF0YShkYXRhOiBUW10pOiBUW10ge1xuICAgIGZvciAoY29uc3QgW2NvbHVtbk5hbWUsIGZ1bl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5hZ2dyZWdhdGVkQ29sdW1ucykpIHtcbiAgICAgIGNvbnN0IGYgPSB0aGlzLmFnZ3JlZ2F0aW9uRnVuY3Rpb25zLmZpbmQoKGYpID0+IGYuaWQgPT09IGZ1bik7XG4gICAgICBpZiAoIWYpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLmFnZ3JlZ2F0ZWREYXRhW2NvbHVtbk5hbWVdID0ge1xuICAgICAgICAuLi4odGhpcy5hZ2dyZWdhdGVkRGF0YVtjb2x1bW5OYW1lXSA/PyB7fSksXG4gICAgICAgIGN1cnJlbnRQYWdlOiBmLmFnZ3JlZ2F0ZURhdGEoZGF0YS5tYXAoKGkpID0+IGlbY29sdW1uTmFtZV0pKSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgdGhlIE1hdFRhYmxlLiBDYWxsZWQgd2hlbiBpdCBjb25uZWN0cyB0byB0aGUgZGF0YSBzb3VyY2UuXG4gICAqL1xuICBjb25uZWN0KCkge1xuICAgIGlmICghdGhpcy5fcmVuZGVyQ2hhbmdlc1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fdXBkYXRlQ2hhbmdlU3Vic2NyaXB0aW9uKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3JlbmRlckRhdGE7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSB0aGUgTWF0VGFibGUuIENhbGxlZCB3aGVuIGl0IGRpc2Nvbm5lY3RzIGZyb20gdGhlIGRhdGEgc291cmNlLlxuICAgKi9cbiAgZGlzY29ubmVjdCgpIHtcbiAgICB0aGlzLl92aWV3Q2hhbmdlc1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb24gPSBudWxsO1xuICB9XG59XG4iXX0=