@energycap/components 0.41.0 → 0.41.1-ECAP-27592-angular-17.20241219-1718

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 (258) hide show
  1. package/{esm2020 → esm2022}/energycap-components.mjs +4 -4
  2. package/{esm2020 → esm2022}/lib/components.module.mjs +418 -418
  3. package/{esm2020 → esm2022}/lib/controls/banner/banner.component.mjs +109 -109
  4. package/{esm2020 → esm2022}/lib/controls/button/button.component.mjs +106 -106
  5. package/{esm2020 → esm2022}/lib/controls/button/copy-button-base.directive.mjs +67 -67
  6. package/{esm2020 → esm2022}/lib/controls/button/copy-button.directive.mjs +28 -28
  7. package/{esm2020 → esm2022}/lib/controls/button/copy-table-button.directive.mjs +43 -43
  8. package/{esm2020 → esm2022}/lib/controls/calendar/calendar-item.component.mjs +59 -59
  9. package/{esm2020 → esm2022}/lib/controls/calendar/calendar.component.mjs +200 -200
  10. package/{esm2020 → esm2022}/lib/controls/calendar/calendar.types.mjs +3 -3
  11. package/{esm2020 → esm2022}/lib/controls/checkbox/checkbox.component.mjs +140 -140
  12. package/{esm2020 → esm2022}/lib/controls/collapsible-toggle/collapsible-toggle.component.mjs +38 -38
  13. package/{esm2020 → esm2022}/lib/controls/combobox/combobox.component.mjs +879 -879
  14. package/{esm2020 → esm2022}/lib/controls/date-input/date-input.component.mjs +256 -256
  15. package/{esm2020 → esm2022}/lib/controls/dropdown/dropdown.component.mjs +243 -243
  16. package/{esm2020 → esm2022}/lib/controls/file-upload/file-upload.component.mjs +261 -261
  17. package/{esm2020 → esm2022}/lib/controls/form-control/form-control.component.mjs +104 -104
  18. package/{esm2020 → esm2022}/lib/controls/form-control-base.mjs +151 -151
  19. package/{esm2020 → esm2022}/lib/controls/form-control-label/form-control-label.component.mjs +136 -136
  20. package/{esm2020 → esm2022}/lib/controls/form-group/form-group.component.mjs +261 -261
  21. package/{esm2020 → esm2022}/lib/controls/help-popover/help-popover.component.mjs +31 -31
  22. package/{esm2020 → esm2022}/lib/controls/item-picker/item-picker.component.mjs +329 -329
  23. package/{esm2020 → esm2022}/lib/controls/link-button/link-button.component.mjs +11 -11
  24. package/{esm2020 → esm2022}/lib/controls/menu/menu.component.mjs +485 -485
  25. package/{esm2020 → esm2022}/lib/controls/navigation/link-item.mjs +1 -1
  26. package/{esm2020 → esm2022}/lib/controls/navigation/nav-group.mjs +38 -38
  27. package/{esm2020 → esm2022}/lib/controls/navigation/nav-item-active.directive.mjs +92 -92
  28. package/{esm2020 → esm2022}/lib/controls/navigation/nav-item.mjs +1 -1
  29. package/{esm2020 → esm2022}/lib/controls/numericbox/numericbox.component.mjs +372 -372
  30. package/{esm2020 → esm2022}/lib/controls/popover/popover.component.mjs +117 -117
  31. package/{esm2020 → esm2022}/lib/controls/radio-button/radio-button-option.mjs +2 -2
  32. package/{esm2020 → esm2022}/lib/controls/radio-button/radio-button.component.mjs +82 -82
  33. package/{esm2020 → esm2022}/lib/controls/select/select.component.mjs +88 -88
  34. package/{esm2020 → esm2022}/lib/controls/tabs/tabs.component.mjs +47 -47
  35. package/{esm2020 → esm2022}/lib/controls/textbox/textbox.component.mjs +155 -155
  36. package/{esm2020 → esm2022}/lib/core/cache.service.mjs +105 -105
  37. package/esm2022/lib/core/custom-validators.mjs +29 -0
  38. package/esm2022/lib/core/date-time-helper.mjs +220 -0
  39. package/{esm2020 → esm2022}/lib/core/error.service.mjs +61 -61
  40. package/{esm2020 → esm2022}/lib/core/router-helper.service.mjs +111 -111
  41. package/{esm2020 → esm2022}/lib/core/scroll.service.mjs +89 -89
  42. package/{esm2020 → esm2022}/lib/core/telemetry-tracker.service.mjs +16 -16
  43. package/{esm2020 → esm2022}/lib/core/telemetry.service.mjs +38 -38
  44. package/{esm2020 → esm2022}/lib/core/validation-message.service.mjs +185 -185
  45. package/{esm2020 → esm2022}/lib/core/validation-patterns.mjs +30 -30
  46. package/{esm2020 → esm2022}/lib/core/window.service.mjs +186 -186
  47. package/{esm2020 → esm2022}/lib/display/app-bar/app-bar.component.mjs +46 -46
  48. package/esm2022/lib/display/avatar/avatar.component.mjs +67 -0
  49. package/{esm2020 → esm2022}/lib/display/avatar/avatar.service.mjs +64 -64
  50. package/{esm2020 → esm2022}/lib/display/confirm/confirm.component.mjs +168 -168
  51. package/{esm2020 → esm2022}/lib/display/dialog/dialog-content.mjs +1 -1
  52. package/{esm2020 → esm2022}/lib/display/dialog/dialog-group/dialog-group.component.mjs +63 -63
  53. package/{esm2020 → esm2022}/lib/display/dialog/dialog-types.mjs +76 -76
  54. package/{esm2020 → esm2022}/lib/display/dialog/dialog.component.mjs +281 -281
  55. package/{esm2020 → esm2022}/lib/display/dialog/dialog.service.mjs +71 -71
  56. package/{esm2020 → esm2022}/lib/display/help/help-types.mjs +1 -1
  57. package/{esm2020 → esm2022}/lib/display/hierarchy/hierarchy-base.mjs +111 -111
  58. package/{esm2020 → esm2022}/lib/display/hierarchy/hierarchy-mocks.spec.mjs +53 -53
  59. package/{esm2020 → esm2022}/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.mjs +61 -61
  60. package/{esm2020 → esm2022}/lib/display/item-display/item-display.component.mjs +81 -81
  61. package/{esm2020 → esm2022}/lib/display/json-display/json-display.component.mjs +47 -47
  62. package/{esm2020 → esm2022}/lib/display/resizable/resizable-base.mjs +120 -120
  63. package/{esm2020 → esm2022}/lib/display/resizable/resizable.component.mjs +52 -52
  64. package/{esm2020 → esm2022}/lib/display/spinner/spinner.component.mjs +12 -12
  65. package/{esm2020 → esm2022}/lib/display/splash/splash.component.mjs +42 -42
  66. package/{esm2020 → esm2022}/lib/display/splash/splash.service.mjs +35 -35
  67. package/{esm2020 → esm2022}/lib/display/table/resizable-column.component.mjs +20 -20
  68. package/{esm2020 → esm2022}/lib/display/table/resizable-table.directive.mjs +227 -227
  69. package/{esm2020 → esm2022}/lib/display/table/searchable-table.component.mjs +342 -342
  70. package/{esm2020 → esm2022}/lib/display/table/table-detail-row.component.mjs +19 -19
  71. package/{esm2020 → esm2022}/lib/display/table/table-locked-column.component.mjs +58 -58
  72. package/{esm2020 → esm2022}/lib/display/table/table-master-header-row.component.mjs +14 -14
  73. package/{esm2020 → esm2022}/lib/display/table/table-master-row.component.mjs +163 -163
  74. package/{esm2020 → esm2022}/lib/display/table/table-pagination.component.mjs +155 -155
  75. package/{esm2020 → esm2022}/lib/display/table/table-selectable-row.component.mjs +235 -235
  76. package/{esm2020 → esm2022}/lib/display/table/table.component.mjs +249 -249
  77. package/{esm2020 → esm2022}/lib/display/tags/tag.mjs +17 -17
  78. package/{esm2020 → esm2022}/lib/display/tags/tags.component.mjs +77 -77
  79. package/{esm2020 → esm2022}/lib/display/toast/toast/toast.component.mjs +77 -77
  80. package/{esm2020 → esm2022}/lib/display/toast/toast-types.mjs +7 -7
  81. package/{esm2020 → esm2022}/lib/display/toast/toast.service.mjs +35 -35
  82. package/{esm2020 → esm2022}/lib/display/toast/toaster/toaster.component.mjs +114 -114
  83. package/{esm2020 → esm2022}/lib/display/tooltip/tooltip.component.mjs +28 -28
  84. package/{esm2020 → esm2022}/lib/display/tooltip/tooltip.service.mjs +78 -78
  85. package/{esm2020 → esm2022}/lib/display/tooltip-directive/tooltip.directive.mjs +173 -173
  86. package/{esm2020 → esm2022}/lib/display/tour/tour-types.mjs +33 -33
  87. package/{esm2020 → esm2022}/lib/display/tour/tour.component.mjs +398 -398
  88. package/{esm2020 → esm2022}/lib/display/tour/tour.service.mjs +75 -75
  89. package/{esm2020 → esm2022}/lib/display/tree/tree.component.mjs +135 -135
  90. package/{esm2020 → esm2022}/lib/display/view-overlay/view-overlay.component.mjs +58 -58
  91. package/{esm2020 → esm2022}/lib/shared/directives/click-area-for/click-area-for.directive.mjs +32 -32
  92. package/{esm2020 → esm2022}/lib/shared/directives/if-viewport-width/if-viewport-width.directive.mjs +111 -111
  93. package/esm2022/lib/shared/directives/popup/popup-container.directive.mjs +166 -0
  94. package/{esm2020 → esm2022}/lib/shared/display/pipes/date-display.pipe.mjs +50 -50
  95. package/{esm2020 → esm2022}/lib/shared/display/pipes/highlight-text.pipe.mjs +30 -30
  96. package/{esm2020 → esm2022}/lib/shared/display/pipes/relative-date.pipe.mjs +62 -62
  97. package/{esm2020 → esm2022}/lib/shared/display/pipes/row-count.pipe.mjs +48 -48
  98. package/{esm2020 → esm2022}/lib/shared/display/pipes/time-display.pipe.mjs +41 -41
  99. package/esm2022/lib/shared/display.mjs +6 -0
  100. package/esm2022/lib/shared/form-group.helper.mjs +67 -0
  101. package/{esm2020 → esm2022}/lib/shared/json-helper.mjs +18 -18
  102. package/esm2022/lib/shared/lodash-helper.mjs +52 -0
  103. package/{esm2020 → esm2022}/lib/shared/page/page-base/page-base.component.mjs +387 -387
  104. package/{esm2020 → esm2022}/lib/shared/page/page-statuses.mjs +22 -22
  105. package/{esm2020 → esm2022}/lib/shared/page/page-title/page-title.component.mjs +23 -23
  106. package/{esm2020 → esm2022}/lib/shared/page/page-view/page-view.component.mjs +147 -147
  107. package/{esm2020 → esm2022}/lib/shared/testing/copy-button-base-test-injector-factory.spec.mjs +16 -16
  108. package/{esm2020 → esm2022}/lib/shared/testing/hierarchy-base-test-injector-factory.spec.mjs +16 -16
  109. package/{esm2020 → esm2022}/lib/shared/testing/page-base-component-test-helper.spec.mjs +37 -37
  110. package/esm2022/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs +98 -0
  111. package/{esm2020 → esm2022}/lib/shared/testing/public-mocks.spec.mjs +148 -148
  112. package/{esm2020 → esm2022}/lib/shared/testing/spy-factory.spec.mjs +39 -39
  113. package/{esm2020 → esm2022}/lib/shared/testing/translation-mocks.spec.mjs +56 -56
  114. package/{esm2020 → esm2022}/lib/shared/user-preference.service.mjs +17 -17
  115. package/{esm2020 → esm2022}/lib/shared/wizard/wizard-base/wizard-base.component.mjs +246 -246
  116. package/{esm2020 → esm2022}/lib/shared/wizard/wizard-buttons/wizard-buttons.component.mjs +68 -68
  117. package/{esm2020 → esm2022}/lib/shared/wizard/wizard-progress/wizard-progress.component.mjs +18 -18
  118. package/{esm2020 → esm2022}/public-api.mjs +114 -114
  119. package/{fesm2020 → fesm2022}/energycap-components.mjs +11797 -11793
  120. package/fesm2022/energycap-components.mjs.map +1 -0
  121. package/index.d.ts +5 -5
  122. package/lib/components.module.d.ts +91 -91
  123. package/lib/controls/banner/banner.component.d.ts +50 -50
  124. package/lib/controls/button/button.component.d.ts +78 -78
  125. package/lib/controls/button/copy-button-base.directive.d.ts +20 -20
  126. package/lib/controls/button/copy-button.directive.d.ts +14 -14
  127. package/lib/controls/button/copy-table-button.directive.d.ts +19 -19
  128. package/lib/controls/calendar/calendar-item.component.d.ts +17 -17
  129. package/lib/controls/calendar/calendar.component.d.ts +54 -54
  130. package/lib/controls/calendar/calendar.types.d.ts +7 -7
  131. package/lib/controls/checkbox/checkbox.component.d.ts +65 -65
  132. package/lib/controls/collapsible-toggle/collapsible-toggle.component.d.ts +25 -25
  133. package/lib/controls/combobox/combobox.component.d.ts +418 -418
  134. package/lib/controls/date-input/date-input.component.d.ts +80 -80
  135. package/lib/controls/dropdown/dropdown.component.d.ts +161 -161
  136. package/lib/controls/file-upload/file-upload.component.d.ts +124 -124
  137. package/lib/controls/form-control/form-control.component.d.ts +30 -30
  138. package/lib/controls/form-control-base.d.ts +110 -110
  139. package/lib/controls/form-control-label/form-control-label.component.d.ts +73 -73
  140. package/lib/controls/form-group/form-group.component.d.ts +105 -105
  141. package/lib/controls/help-popover/help-popover.component.d.ts +11 -11
  142. package/lib/controls/item-picker/item-picker.component.d.ts +164 -164
  143. package/lib/controls/link-button/link-button.component.d.ts +5 -5
  144. package/lib/controls/menu/menu.component.d.ts +255 -255
  145. package/lib/controls/navigation/link-item.d.ts +32 -32
  146. package/lib/controls/navigation/nav-group.d.ts +18 -18
  147. package/lib/controls/navigation/nav-item-active.directive.d.ts +42 -42
  148. package/lib/controls/navigation/nav-item.d.ts +31 -31
  149. package/lib/controls/numericbox/numericbox.component.d.ts +148 -148
  150. package/lib/controls/popover/popover.component.d.ts +51 -51
  151. package/lib/controls/radio-button/radio-button-option.d.ts +19 -19
  152. package/lib/controls/radio-button/radio-button.component.d.ts +53 -53
  153. package/lib/controls/select/select.component.d.ts +44 -44
  154. package/lib/controls/tabs/tabs.component.d.ts +30 -30
  155. package/lib/controls/textbox/textbox.component.d.ts +107 -107
  156. package/lib/core/cache.service.d.ts +33 -33
  157. package/lib/core/custom-validators.d.ts +20 -20
  158. package/lib/core/date-time-helper.d.ts +101 -101
  159. package/lib/core/error.service.d.ts +20 -20
  160. package/lib/core/router-helper.service.d.ts +48 -48
  161. package/lib/core/scroll.service.d.ts +36 -36
  162. package/lib/core/telemetry-tracker.service.d.ts +13 -13
  163. package/lib/core/telemetry.service.d.ts +31 -31
  164. package/lib/core/validation-message.service.d.ts +26 -26
  165. package/lib/core/validation-patterns.d.ts +22 -22
  166. package/lib/core/window.service.d.ts +116 -116
  167. package/lib/display/app-bar/app-bar.component.d.ts +20 -20
  168. package/lib/display/avatar/avatar.component.d.ts +35 -35
  169. package/lib/display/avatar/avatar.service.d.ts +24 -24
  170. package/lib/display/confirm/confirm.component.d.ts +123 -123
  171. package/lib/display/dialog/dialog-content.d.ts +19 -19
  172. package/lib/display/dialog/dialog-group/dialog-group.component.d.ts +32 -32
  173. package/lib/display/dialog/dialog-types.d.ts +130 -130
  174. package/lib/display/dialog/dialog.component.d.ts +120 -120
  175. package/lib/display/dialog/dialog.service.d.ts +48 -48
  176. package/lib/display/help/help-types.d.ts +33 -33
  177. package/lib/display/hierarchy/hierarchy-base.d.ts +97 -97
  178. package/lib/display/hierarchy/hierarchy-mocks.spec.d.ts +53 -53
  179. package/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.d.ts +34 -34
  180. package/lib/display/item-display/item-display.component.d.ts +43 -43
  181. package/lib/display/json-display/json-display.component.d.ts +16 -16
  182. package/lib/display/resizable/resizable-base.d.ts +67 -67
  183. package/lib/display/resizable/resizable.component.d.ts +31 -31
  184. package/lib/display/spinner/spinner.component.d.ts +5 -5
  185. package/lib/display/splash/splash.component.d.ts +16 -16
  186. package/lib/display/splash/splash.service.d.ts +22 -22
  187. package/lib/display/table/resizable-column.component.d.ts +10 -10
  188. package/lib/display/table/resizable-table.directive.d.ts +93 -93
  189. package/lib/display/table/searchable-table.component.d.ts +206 -206
  190. package/lib/display/table/table-detail-row.component.d.ts +8 -8
  191. package/lib/display/table/table-locked-column.component.d.ts +20 -20
  192. package/lib/display/table/table-master-header-row.component.d.ts +9 -9
  193. package/lib/display/table/table-master-row.component.d.ts +113 -113
  194. package/lib/display/table/table-pagination.component.d.ts +91 -91
  195. package/lib/display/table/table-selectable-row.component.d.ts +102 -102
  196. package/lib/display/table/table.component.d.ts +121 -121
  197. package/lib/display/tags/tag.d.ts +18 -18
  198. package/lib/display/tags/tags.component.d.ts +48 -48
  199. package/lib/display/toast/toast/toast.component.d.ts +23 -23
  200. package/lib/display/toast/toast-types.d.ts +24 -24
  201. package/lib/display/toast/toast.service.d.ts +20 -20
  202. package/lib/display/toast/toaster/toaster.component.d.ts +35 -35
  203. package/lib/display/tooltip/tooltip.component.d.ts +70 -70
  204. package/lib/display/tooltip/tooltip.service.d.ts +16 -16
  205. package/lib/display/tooltip-directive/tooltip.directive.d.ts +44 -44
  206. package/lib/display/tour/tour-types.d.ts +70 -70
  207. package/lib/display/tour/tour.component.d.ts +147 -147
  208. package/lib/display/tour/tour.service.d.ts +38 -38
  209. package/lib/display/tree/tree.component.d.ts +75 -75
  210. package/lib/display/view-overlay/view-overlay.component.d.ts +38 -38
  211. package/lib/shared/directives/click-area-for/click-area-for.directive.d.ts +14 -14
  212. package/lib/shared/directives/if-viewport-width/if-viewport-width.directive.d.ts +60 -60
  213. package/lib/shared/directives/popup/popup-container.directive.d.ts +101 -101
  214. package/lib/shared/display/pipes/date-display.pipe.d.ts +21 -21
  215. package/lib/shared/display/pipes/highlight-text.pipe.d.ts +9 -9
  216. package/lib/shared/display/pipes/relative-date.pipe.d.ts +36 -36
  217. package/lib/shared/display/pipes/row-count.pipe.d.ts +23 -23
  218. package/lib/shared/display/pipes/time-display.pipe.d.ts +18 -18
  219. package/lib/shared/display.d.ts +42 -42
  220. package/lib/shared/form-group.helper.d.ts +31 -31
  221. package/lib/shared/json-helper.d.ts +7 -7
  222. package/lib/shared/lodash-helper.d.ts +18 -18
  223. package/lib/shared/page/page-base/page-base.component.d.ts +259 -259
  224. package/lib/shared/page/page-statuses.d.ts +13 -13
  225. package/lib/shared/page/page-title/page-title.component.d.ts +9 -9
  226. package/lib/shared/page/page-view/page-view.component.d.ts +102 -102
  227. package/lib/shared/testing/copy-button-base-test-injector-factory.spec.d.ts +4 -4
  228. package/lib/shared/testing/hierarchy-base-test-injector-factory.spec.d.ts +4 -4
  229. package/lib/shared/testing/page-base-component-test-helper.spec.d.ts +30 -30
  230. package/lib/shared/testing/page-base-component-test-injector-factory.spec.d.ts +28 -28
  231. package/lib/shared/testing/public-mocks.spec.d.ts +90 -90
  232. package/lib/shared/testing/spy-factory.spec.d.ts +27 -27
  233. package/lib/shared/testing/translation-mocks.spec.d.ts +30 -30
  234. package/lib/shared/user-preference.service.d.ts +13 -13
  235. package/lib/shared/wizard/wizard-base/wizard-base.component.d.ts +134 -134
  236. package/lib/shared/wizard/wizard-buttons/wizard-buttons.component.d.ts +27 -27
  237. package/lib/shared/wizard/wizard-progress/wizard-progress.component.d.ts +10 -10
  238. package/package.json +12 -18
  239. package/public-api.d.ts +111 -111
  240. package/schematics/rxjs-7-upgrade/index.d.ts +3 -3
  241. package/schematics/rxjs-7-upgrade/index.js +67 -67
  242. package/schematics/rxjs-7-upgrade/schema.d.ts +4 -4
  243. package/schematics/rxjs-7-upgrade/schema.js +2 -2
  244. package/schematics/utilities/typescript.d.ts +7 -7
  245. package/schematics/utilities/typescript.js +41 -41
  246. package/schematics/utilities/workspace.d.ts +8 -8
  247. package/schematics/utilities/workspace.js +71 -71
  248. package/esm2020/lib/core/custom-validators.mjs +0 -29
  249. package/esm2020/lib/core/date-time-helper.mjs +0 -220
  250. package/esm2020/lib/display/avatar/avatar.component.mjs +0 -67
  251. package/esm2020/lib/shared/directives/popup/popup-container.directive.mjs +0 -163
  252. package/esm2020/lib/shared/display.mjs +0 -6
  253. package/esm2020/lib/shared/form-group.helper.mjs +0 -67
  254. package/esm2020/lib/shared/lodash-helper.mjs +0 -51
  255. package/esm2020/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs +0 -98
  256. package/fesm2015/energycap-components.mjs +0 -12211
  257. package/fesm2015/energycap-components.mjs.map +0 -1
  258. package/fesm2020/energycap-components.mjs.map +0 -1
@@ -1,61 +1,61 @@
1
- import { Injectable } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export function isApiError(errorResponse) {
4
- // errorResponse is typed HttpErrorResponse if the api returns an error
5
- if (errorResponse.error && errorResponse.error.hasOwnProperty('status') && errorResponse.error.status.hasOwnProperty('message')) {
6
- return true;
7
- }
8
- // BillCAPture APIs return errors in a different format
9
- if (errorResponse.error && errorResponse.error.hasOwnProperty('Message')) {
10
- return true;
11
- }
12
- return false;
13
- }
14
- export class ErrorService {
15
- constructor() { }
16
- /**
17
- * Parse an error that comes from the API for use inside the forms
18
- * In most cases this isn't required because the error handler will do it automatically,
19
- * but if you need to analyze the error message you can use this to extract it safely.
20
- * NOTE: Because it can be used for comparison the result is not translated. You must translate
21
- * it before providing it to the user.
22
- * @param error The error object from the API
23
- */
24
- parseApiError(errorResponse, unknownErrorDefault) {
25
- if (typeof errorResponse === 'string') {
26
- return errorResponse;
27
- }
28
- // errorResponse is typed HttpErrorResponse if the api returns an error
29
- let apiErrorMessage = unknownErrorDefault || 'DefaultUnknownError_SC';
30
- if (errorResponse && isApiError(errorResponse)) {
31
- try {
32
- apiErrorMessage = errorResponse.error.status?.message || errorResponse.error.Message;
33
- }
34
- catch (error) {
35
- //log the real error to the console (for developers) but just return the generic error to the user
36
- this.logConsoleError(error);
37
- }
38
- }
39
- else {
40
- this.logConsoleError(errorResponse);
41
- }
42
- return apiErrorMessage;
43
- }
44
- /**
45
- * Just a safe wrapper around console.error in case the browser doesn't have one exposed
46
- */
47
- logConsoleError(error) {
48
- if (console && typeof (console.error) === 'function') {
49
- console.error('unknown error:', error);
50
- }
51
- }
52
- }
53
- ErrorServicefac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ErrorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
54
- ErrorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ErrorService, providedIn: 'root' });
55
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ErrorService, decorators: [{
56
- type: Injectable,
57
- args: [{
58
- providedIn: 'root'
59
- }]
60
- }], ctorParameters: function () { return []; } });
61
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb3JlL2Vycm9yLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFHM0MsTUFBTSxVQUFVLFVBQVUsQ0FBQyxhQUFrQjtJQUMzQyx1RUFBdUU7SUFDdkUsSUFBSSxhQUFhLENBQUMsS0FBSyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRTtRQUMvSCxPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsdURBQXVEO0lBQ3ZELElBQUksYUFBYSxDQUFDLEtBQUssSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRTtRQUN4RSxPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBS0QsTUFBTSxPQUFPLFlBQVk7SUFFdkIsZ0JBQWdCLENBQUM7SUFFakI7Ozs7Ozs7T0FPRztJQUNJLGFBQWEsQ0FBQyxhQUFrQixFQUFFLG1CQUE0QjtRQUNuRSxJQUFJLE9BQU8sYUFBYSxLQUFLLFFBQVEsRUFBRTtZQUNyQyxPQUFPLGFBQWEsQ0FBQztTQUN0QjtRQUVELHVFQUF1RTtRQUN2RSxJQUFJLGVBQWUsR0FBVyxtQkFBbUIsSUFBSSx3QkFBd0IsQ0FBQztRQUU5RSxJQUFJLGFBQWEsSUFBSSxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDOUMsSUFBSTtnQkFDRixlQUFlLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO2FBQ3RGO1lBQUMsT0FBTyxLQUFLLEVBQUU7Z0JBQ2Qsa0dBQWtHO2dCQUNsRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzdCO1NBQ0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDckM7UUFFRCxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxlQUFlLENBQUMsS0FBVTtRQUMvQixJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLFVBQVUsRUFBRTtZQUNwRCxPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3hDO0lBQ0gsQ0FBQzs7eUdBekNVLFlBQVk7NkdBQVosWUFBWSxjQUZYLE1BQU07MkZBRVAsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzQXBpRXJyb3IoZXJyb3JSZXNwb25zZTogYW55KTogYm9vbGVhbiB7XHJcbiAgLy8gZXJyb3JSZXNwb25zZSBpcyB0eXBlZCBIdHRwRXJyb3JSZXNwb25zZSBpZiB0aGUgYXBpIHJldHVybnMgYW4gZXJyb3JcclxuICBpZiAoZXJyb3JSZXNwb25zZS5lcnJvciAmJiBlcnJvclJlc3BvbnNlLmVycm9yLmhhc093blByb3BlcnR5KCdzdGF0dXMnKSAmJiBlcnJvclJlc3BvbnNlLmVycm9yLnN0YXR1cy5oYXNPd25Qcm9wZXJ0eSgnbWVzc2FnZScpKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vIEJpbGxDQVB0dXJlIEFQSXMgcmV0dXJuIGVycm9ycyBpbiBhIGRpZmZlcmVudCBmb3JtYXRcclxuICBpZiAoZXJyb3JSZXNwb25zZS5lcnJvciAmJiBlcnJvclJlc3BvbnNlLmVycm9yLmhhc093blByb3BlcnR5KCdNZXNzYWdlJykpIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGZhbHNlO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFcnJvclNlcnZpY2Uge1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXJzZSBhbiBlcnJvciB0aGF0IGNvbWVzIGZyb20gdGhlIEFQSSBmb3IgdXNlIGluc2lkZSB0aGUgZm9ybXNcclxuICAgKiBJbiBtb3N0IGNhc2VzIHRoaXMgaXNuJ3QgcmVxdWlyZWQgYmVjYXVzZSB0aGUgZXJyb3IgaGFuZGxlciB3aWxsIGRvIGl0IGF1dG9tYXRpY2FsbHksXHJcbiAgICogYnV0IGlmIHlvdSBuZWVkIHRvIGFuYWx5emUgdGhlIGVycm9yIG1lc3NhZ2UgeW91IGNhbiB1c2UgdGhpcyB0byBleHRyYWN0IGl0IHNhZmVseS5cclxuICAgKiBOT1RFOiBCZWNhdXNlIGl0IGNhbiBiZSB1c2VkIGZvciBjb21wYXJpc29uIHRoZSByZXN1bHQgaXMgbm90IHRyYW5zbGF0ZWQuIFlvdSBtdXN0IHRyYW5zbGF0ZVxyXG4gICAqIGl0IGJlZm9yZSBwcm92aWRpbmcgaXQgdG8gdGhlIHVzZXIuXHJcbiAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvciBvYmplY3QgZnJvbSB0aGUgQVBJXHJcbiAgICovXHJcbiAgcHVibGljIHBhcnNlQXBpRXJyb3IoZXJyb3JSZXNwb25zZTogYW55LCB1bmtub3duRXJyb3JEZWZhdWx0Pzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICh0eXBlb2YgZXJyb3JSZXNwb25zZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgcmV0dXJuIGVycm9yUmVzcG9uc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXJyb3JSZXNwb25zZSBpcyB0eXBlZCBIdHRwRXJyb3JSZXNwb25zZSBpZiB0aGUgYXBpIHJldHVybnMgYW4gZXJyb3JcclxuICAgIGxldCBhcGlFcnJvck1lc3NhZ2U6IHN0cmluZyA9IHVua25vd25FcnJvckRlZmF1bHQgfHwgJ0RlZmF1bHRVbmtub3duRXJyb3JfU0MnO1xyXG5cclxuICAgIGlmIChlcnJvclJlc3BvbnNlICYmIGlzQXBpRXJyb3IoZXJyb3JSZXNwb25zZSkpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhcGlFcnJvck1lc3NhZ2UgPSBlcnJvclJlc3BvbnNlLmVycm9yLnN0YXR1cz8ubWVzc2FnZSB8fCBlcnJvclJlc3BvbnNlLmVycm9yLk1lc3NhZ2U7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgLy9sb2cgdGhlIHJlYWwgZXJyb3IgdG8gdGhlIGNvbnNvbGUgKGZvciBkZXZlbG9wZXJzKSBidXQganVzdCByZXR1cm4gdGhlIGdlbmVyaWMgZXJyb3IgdG8gdGhlIHVzZXJcclxuICAgICAgICB0aGlzLmxvZ0NvbnNvbGVFcnJvcihlcnJvcik7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubG9nQ29uc29sZUVycm9yKGVycm9yUmVzcG9uc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhcGlFcnJvck1lc3NhZ2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBKdXN0IGEgc2FmZSB3cmFwcGVyIGFyb3VuZCBjb25zb2xlLmVycm9yIGluIGNhc2UgdGhlIGJyb3dzZXIgZG9lc24ndCBoYXZlIG9uZSBleHBvc2VkXHJcbiAgICovXHJcbiAgcHVibGljIGxvZ0NvbnNvbGVFcnJvcihlcnJvcjogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoY29uc29sZSAmJiB0eXBlb2YgKGNvbnNvbGUuZXJyb3IpID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3Vua25vd24gZXJyb3I6JywgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export function isApiError(errorResponse) {
4
+ // errorResponse is typed HttpErrorResponse if the api returns an error
5
+ if (errorResponse.error && errorResponse.error.hasOwnProperty('status') && errorResponse.error.status.hasOwnProperty('message')) {
6
+ return true;
7
+ }
8
+ // BillCAPture APIs return errors in a different format
9
+ if (errorResponse.error && errorResponse.error.hasOwnProperty('Message')) {
10
+ return true;
11
+ }
12
+ return false;
13
+ }
14
+ export class ErrorService {
15
+ constructor() { }
16
+ /**
17
+ * Parse an error that comes from the API for use inside the forms
18
+ * In most cases this isn't required because the error handler will do it automatically,
19
+ * but if you need to analyze the error message you can use this to extract it safely.
20
+ * NOTE: Because it can be used for comparison the result is not translated. You must translate
21
+ * it before providing it to the user.
22
+ * @param error The error object from the API
23
+ */
24
+ parseApiError(errorResponse, unknownErrorDefault) {
25
+ if (typeof errorResponse === 'string') {
26
+ return errorResponse;
27
+ }
28
+ // errorResponse is typed HttpErrorResponse if the api returns an error
29
+ let apiErrorMessage = unknownErrorDefault || 'DefaultUnknownError_SC';
30
+ if (errorResponse && isApiError(errorResponse)) {
31
+ try {
32
+ apiErrorMessage = errorResponse.error.status?.message || errorResponse.error.Message;
33
+ }
34
+ catch (error) {
35
+ //log the real error to the console (for developers) but just return the generic error to the user
36
+ this.logConsoleError(error);
37
+ }
38
+ }
39
+ else {
40
+ this.logConsoleError(errorResponse);
41
+ }
42
+ return apiErrorMessage;
43
+ }
44
+ /**
45
+ * Just a safe wrapper around console.error in case the browser doesn't have one exposed
46
+ */
47
+ logConsoleError(error) {
48
+ if (console && typeof (console.error) === 'function') {
49
+ console.error('unknown error:', error);
50
+ }
51
+ }
52
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ErrorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
53
+ static { thisprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ErrorService, providedIn: 'root' }); }
54
+ }
55
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ErrorService, decorators: [{
56
+ type: Injectable,
57
+ args: [{
58
+ providedIn: 'root'
59
+ }]
60
+ }], ctorParameters: function () { return []; } });
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb3JlL2Vycm9yLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFHM0MsTUFBTSxVQUFVLFVBQVUsQ0FBQyxhQUFrQjtJQUMzQyx1RUFBdUU7SUFDdkUsSUFBSSxhQUFhLENBQUMsS0FBSyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRTtRQUMvSCxPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsdURBQXVEO0lBQ3ZELElBQUksYUFBYSxDQUFDLEtBQUssSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRTtRQUN4RSxPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBS0QsTUFBTSxPQUFPLFlBQVk7SUFFdkIsZ0JBQWdCLENBQUM7SUFFakI7Ozs7Ozs7T0FPRztJQUNJLGFBQWEsQ0FBQyxhQUFrQixFQUFFLG1CQUE0QjtRQUNuRSxJQUFJLE9BQU8sYUFBYSxLQUFLLFFBQVEsRUFBRTtZQUNyQyxPQUFPLGFBQWEsQ0FBQztTQUN0QjtRQUVELHVFQUF1RTtRQUN2RSxJQUFJLGVBQWUsR0FBVyxtQkFBbUIsSUFBSSx3QkFBd0IsQ0FBQztRQUU5RSxJQUFJLGFBQWEsSUFBSSxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDOUMsSUFBSTtnQkFDRixlQUFlLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO2FBQ3RGO1lBQUMsT0FBTyxLQUFLLEVBQUU7Z0JBQ2Qsa0dBQWtHO2dCQUNsRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzdCO1NBQ0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDckM7UUFFRCxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxlQUFlLENBQUMsS0FBVTtRQUMvQixJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLFVBQVUsRUFBRTtZQUNwRCxPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3hDO0lBQ0gsQ0FBQzsrR0F6Q1UsWUFBWTttSEFBWixZQUFZLGNBRlgsTUFBTTs7NEZBRVAsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzQXBpRXJyb3IoZXJyb3JSZXNwb25zZTogYW55KTogYm9vbGVhbiB7XHJcbiAgLy8gZXJyb3JSZXNwb25zZSBpcyB0eXBlZCBIdHRwRXJyb3JSZXNwb25zZSBpZiB0aGUgYXBpIHJldHVybnMgYW4gZXJyb3JcclxuICBpZiAoZXJyb3JSZXNwb25zZS5lcnJvciAmJiBlcnJvclJlc3BvbnNlLmVycm9yLmhhc093blByb3BlcnR5KCdzdGF0dXMnKSAmJiBlcnJvclJlc3BvbnNlLmVycm9yLnN0YXR1cy5oYXNPd25Qcm9wZXJ0eSgnbWVzc2FnZScpKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vIEJpbGxDQVB0dXJlIEFQSXMgcmV0dXJuIGVycm9ycyBpbiBhIGRpZmZlcmVudCBmb3JtYXRcclxuICBpZiAoZXJyb3JSZXNwb25zZS5lcnJvciAmJiBlcnJvclJlc3BvbnNlLmVycm9yLmhhc093blByb3BlcnR5KCdNZXNzYWdlJykpIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGZhbHNlO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFcnJvclNlcnZpY2Uge1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXJzZSBhbiBlcnJvciB0aGF0IGNvbWVzIGZyb20gdGhlIEFQSSBmb3IgdXNlIGluc2lkZSB0aGUgZm9ybXNcclxuICAgKiBJbiBtb3N0IGNhc2VzIHRoaXMgaXNuJ3QgcmVxdWlyZWQgYmVjYXVzZSB0aGUgZXJyb3IgaGFuZGxlciB3aWxsIGRvIGl0IGF1dG9tYXRpY2FsbHksXHJcbiAgICogYnV0IGlmIHlvdSBuZWVkIHRvIGFuYWx5emUgdGhlIGVycm9yIG1lc3NhZ2UgeW91IGNhbiB1c2UgdGhpcyB0byBleHRyYWN0IGl0IHNhZmVseS5cclxuICAgKiBOT1RFOiBCZWNhdXNlIGl0IGNhbiBiZSB1c2VkIGZvciBjb21wYXJpc29uIHRoZSByZXN1bHQgaXMgbm90IHRyYW5zbGF0ZWQuIFlvdSBtdXN0IHRyYW5zbGF0ZVxyXG4gICAqIGl0IGJlZm9yZSBwcm92aWRpbmcgaXQgdG8gdGhlIHVzZXIuXHJcbiAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvciBvYmplY3QgZnJvbSB0aGUgQVBJXHJcbiAgICovXHJcbiAgcHVibGljIHBhcnNlQXBpRXJyb3IoZXJyb3JSZXNwb25zZTogYW55LCB1bmtub3duRXJyb3JEZWZhdWx0Pzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICh0eXBlb2YgZXJyb3JSZXNwb25zZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgcmV0dXJuIGVycm9yUmVzcG9uc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXJyb3JSZXNwb25zZSBpcyB0eXBlZCBIdHRwRXJyb3JSZXNwb25zZSBpZiB0aGUgYXBpIHJldHVybnMgYW4gZXJyb3JcclxuICAgIGxldCBhcGlFcnJvck1lc3NhZ2U6IHN0cmluZyA9IHVua25vd25FcnJvckRlZmF1bHQgfHwgJ0RlZmF1bHRVbmtub3duRXJyb3JfU0MnO1xyXG5cclxuICAgIGlmIChlcnJvclJlc3BvbnNlICYmIGlzQXBpRXJyb3IoZXJyb3JSZXNwb25zZSkpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhcGlFcnJvck1lc3NhZ2UgPSBlcnJvclJlc3BvbnNlLmVycm9yLnN0YXR1cz8ubWVzc2FnZSB8fCBlcnJvclJlc3BvbnNlLmVycm9yLk1lc3NhZ2U7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgLy9sb2cgdGhlIHJlYWwgZXJyb3IgdG8gdGhlIGNvbnNvbGUgKGZvciBkZXZlbG9wZXJzKSBidXQganVzdCByZXR1cm4gdGhlIGdlbmVyaWMgZXJyb3IgdG8gdGhlIHVzZXJcclxuICAgICAgICB0aGlzLmxvZ0NvbnNvbGVFcnJvcihlcnJvcik7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubG9nQ29uc29sZUVycm9yKGVycm9yUmVzcG9uc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhcGlFcnJvck1lc3NhZ2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBKdXN0IGEgc2FmZSB3cmFwcGVyIGFyb3VuZCBjb25zb2xlLmVycm9yIGluIGNhc2UgdGhlIGJyb3dzZXIgZG9lc24ndCBoYXZlIG9uZSBleHBvc2VkXHJcbiAgICovXHJcbiAgcHVibGljIGxvZ0NvbnNvbGVFcnJvcihlcnJvcjogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoY29uc29sZSAmJiB0eXBlb2YgKGNvbnNvbGUuZXJyb3IpID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3Vua25vd24gZXJyb3I6JywgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
@@ -1,111 +1,111 @@
1
- import { convertToParamMap, NavigationStart, NavigationEnd } from "@angular/router";
2
- import { Injectable } from "@angular/core";
3
- import { filter } from 'rxjs/operators';
4
- import * as i0 from "@angular/core";
5
- export class RouterHelper {
6
- /**
7
- * Traverses the pathFromRoot and combines all of the route parameters into
8
- * one Params object and returns it
9
- * @param route - ActivatedRouteSnapshot
10
- * @see https://angular.io/api/router/ActivatedRouteSnapshot#pathFromRoot
11
- */
12
- getFullRouteParams(route) {
13
- const params = {};
14
- route.pathFromRoot.forEach(snapshot => {
15
- snapshot.paramMap.keys.forEach(key => {
16
- params[key] = snapshot.paramMap.get(key);
17
- });
18
- });
19
- return params;
20
- }
21
- /**
22
- * Traverses the pathFromRoot and combines all of the route paramters into
23
- * one ParamMap and returns it
24
- * @param route - ActivatedRouteSnapshot
25
- * @see https://angular.io/api/router/ActivatedRouteSnapshot#pathFromRoot
26
- */
27
- getFullRouteParamMap(route) {
28
- const params = this.getFullRouteParams(route);
29
- return convertToParamMap(params);
30
- }
31
- /**
32
- * Traverses the pathFromRoot and combines all of the route paths into
33
- * a url from root to the provided activated route.
34
- * @param route - ActivatedRouteSnapshot
35
- * @see https://angular.io/api/router/ActivatedRouteSnapshot#pathFromRoot
36
- */
37
- serializeUrlFromRoot(route) {
38
- let url = '';
39
- const paths = [];
40
- route.pathFromRoot.forEach(r => {
41
- r.url.forEach(s => {
42
- paths.push(s.path);
43
- });
44
- });
45
- url = paths.join('/');
46
- return url;
47
- }
48
- /**
49
- * Look at the first two child activated routes of a page route and combine the
50
- * url segments of each. These will contain the paths for the current view that
51
- * correspond to a primary and secondary tab. Assumes the URL structure is
52
- * /{page}/{primary}/{secondary}
53
- * @param pageRoute - The ActivatedRoute for the 'page' portion of the url. E.g. meter/:meterId
54
- */
55
- getViewUrlSegments(pageRoute) {
56
- let segments = [];
57
- const primaryViewRoute = pageRoute.firstChild;
58
- if (primaryViewRoute) {
59
- segments = segments.concat(primaryViewRoute.snapshot.url);
60
- const secondaryViewRoute = primaryViewRoute.firstChild;
61
- if (secondaryViewRoute) {
62
- segments = segments.concat(secondaryViewRoute.snapshot.url);
63
- }
64
- }
65
- return segments;
66
- }
67
- /**
68
- * Returns the 'last firstChild' of the provided route tree
69
- * @param route - ActivatedRoute
70
- */
71
- getLastRouteDescendant(route) {
72
- while (route.firstChild) {
73
- route = route.firstChild;
74
- }
75
- return route;
76
- }
77
- /**
78
- * Wrap code that will force the user to navigate based on some network call in a piece of logic that will cancel the action if there is another
79
- * navigation event while we wait for the call to complete. This is a common problem with trying to pick a default child when a user switches between modules.
80
- * @param asyncCall The async code to execute while watching for router navigation events. This code always executed and the result is returned
81
- * @param doIfNoNavigation The code to execute only if no navigation events happen while asyncCall is executing. It is passed the result of the async call
82
- * @param router The router instance to listen for navigation events.
83
- */
84
- async executeWithNavigationWatcher(asyncCall, doIfNoNavigation, router) {
85
- let eventOccurred = false;
86
- let subscription = router.events.pipe(filter(e => e instanceof NavigationStart || e instanceof NavigationEnd)).subscribe(() => {
87
- eventOccurred = true;
88
- });
89
- try {
90
- let result = await asyncCall();
91
- if (!eventOccurred) {
92
- await doIfNoNavigation(result);
93
- }
94
- subscription.unsubscribe();
95
- return result;
96
- }
97
- catch (error) {
98
- subscription.unsubscribe();
99
- throw error;
100
- }
101
- }
102
- }
103
- RouterHelperfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RouterHelper, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
104
- RouterHelper.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RouterHelper, providedIn: 'root' });
105
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RouterHelper, decorators: [{
106
- type: Injectable,
107
- args: [{
108
- providedIn: 'root'
109
- }]
110
- }] });
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLWhlbHBlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2NvcmUvcm91dGVyLWhlbHBlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBa0MsaUJBQWlCLEVBQWdELGVBQWUsRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsSyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFLeEMsTUFBTSxPQUFPLFlBQVk7SUFDdkI7Ozs7O09BS0c7SUFDSSxrQkFBa0IsQ0FBQyxLQUE2QjtRQUNyRCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDbEIsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDcEMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0MsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLG9CQUFvQixDQUFDLEtBQTZCO1FBQ3ZELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxPQUFPLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLG9CQUFvQixDQUFDLEtBQTZCO1FBQ3ZELElBQUksR0FBRyxHQUFVLEVBQUUsQ0FBQztRQUNwQixNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7UUFDM0IsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDN0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2hCLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxrQkFBa0IsQ0FBQyxTQUF5QjtRQUNqRCxJQUFJLFFBQVEsR0FBaUIsRUFBRSxDQUFDO1FBRWhDLE1BQU0sZ0JBQWdCLEdBQTBCLFNBQVMsQ0FBQyxVQUFVLENBQUM7UUFDckUsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQixRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUQsTUFBTSxrQkFBa0IsR0FBMEIsZ0JBQWdCLENBQUMsVUFBVSxDQUFDO1lBQzlFLElBQUksa0JBQWtCLEVBQUU7Z0JBQ3RCLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUM3RDtTQUNGO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLHNCQUFzQixDQUFDLEtBQXFCO1FBQ2pELE9BQU8sS0FBSyxDQUFDLFVBQVUsRUFBRTtZQUN2QixLQUFLLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztTQUMxQjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBSSxTQUEyQixFQUFFLGdCQUE4QyxFQUFFLE1BQWM7UUFDdEksSUFBSSxhQUFhLEdBQVksS0FBSyxDQUFDO1FBQ25DLElBQUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNuQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksZUFBZSxJQUFJLENBQUMsWUFBWSxhQUFhLENBQUMsQ0FDeEUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2YsYUFBYSxHQUFHLElBQUksQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUVILElBQUk7WUFDRixJQUFJLE1BQU0sR0FBRyxNQUFNLFNBQVMsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ2xCLE1BQU0sZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDaEM7WUFDRCxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDM0IsT0FBTyxNQUFNLENBQUM7U0FFZjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzNCLE1BQU0sS0FBSyxDQUFDO1NBQ2I7SUFDSCxDQUFDOzt5R0ExR1UsWUFBWTs2R0FBWixZQUFZLGNBRlgsTUFBTTsyRkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhcmFtcywgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgY29udmVydFRvUGFyYW1NYXAsIFBhcmFtTWFwLCBBY3RpdmF0ZWRSb3V0ZSwgVXJsU2VnbWVudCwgUm91dGVyLCBOYXZpZ2F0aW9uU3RhcnQsIE5hdmlnYXRpb25FbmQgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSb3V0ZXJIZWxwZXIge1xyXG4gIC8qKlxyXG4gICAqIFRyYXZlcnNlcyB0aGUgcGF0aEZyb21Sb290IGFuZCBjb21iaW5lcyBhbGwgb2YgdGhlIHJvdXRlIHBhcmFtZXRlcnMgaW50b1xyXG4gICAqIG9uZSBQYXJhbXMgb2JqZWN0IGFuZCByZXR1cm5zIGl0XHJcbiAgICogQHBhcmFtIHJvdXRlIC0gQWN0aXZhdGVkUm91dGVTbmFwc2hvdFxyXG4gICAqIEBzZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9yb3V0ZXIvQWN0aXZhdGVkUm91dGVTbmFwc2hvdCNwYXRoRnJvbVJvb3RcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0RnVsbFJvdXRlUGFyYW1zKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogUGFyYW1zIHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xyXG4gICAgcm91dGUucGF0aEZyb21Sb290LmZvckVhY2goc25hcHNob3QgPT4ge1xyXG4gICAgICBzbmFwc2hvdC5wYXJhbU1hcC5rZXlzLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICBwYXJhbXNba2V5XSA9IHNuYXBzaG90LnBhcmFtTWFwLmdldChrZXkpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHBhcmFtcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyYXZlcnNlcyB0aGUgcGF0aEZyb21Sb290IGFuZCBjb21iaW5lcyBhbGwgb2YgdGhlIHJvdXRlIHBhcmFtdGVycyBpbnRvXHJcbiAgICogb25lIFBhcmFtTWFwIGFuZCByZXR1cm5zIGl0XHJcbiAgICogQHBhcmFtIHJvdXRlIC0gQWN0aXZhdGVkUm91dGVTbmFwc2hvdFxyXG4gICAqIEBzZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9yb3V0ZXIvQWN0aXZhdGVkUm91dGVTbmFwc2hvdCNwYXRoRnJvbVJvb3RcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0RnVsbFJvdXRlUGFyYW1NYXAocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBQYXJhbU1hcCB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmdldEZ1bGxSb3V0ZVBhcmFtcyhyb3V0ZSk7XHJcbiAgICByZXR1cm4gY29udmVydFRvUGFyYW1NYXAocGFyYW1zKTtcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogVHJhdmVyc2VzIHRoZSBwYXRoRnJvbVJvb3QgYW5kIGNvbWJpbmVzIGFsbCBvZiB0aGUgcm91dGUgcGF0aHMgaW50b1xyXG4gICAqIGEgdXJsIGZyb20gcm9vdCB0byB0aGUgcHJvdmlkZWQgYWN0aXZhdGVkIHJvdXRlLlxyXG4gICAqIEBwYXJhbSByb3V0ZSAtIEFjdGl2YXRlZFJvdXRlU25hcHNob3RcclxuICAgKiBAc2VlIGh0dHBzOi8vYW5ndWxhci5pby9hcGkvcm91dGVyL0FjdGl2YXRlZFJvdXRlU25hcHNob3QjcGF0aEZyb21Sb290XHJcbiAgICovXHJcbiAgcHVibGljIHNlcmlhbGl6ZVVybEZyb21Sb290KHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogc3RyaW5nIHtcclxuICAgIGxldCB1cmw6c3RyaW5nID0gJyc7XHJcbiAgICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXTtcclxuICAgIHJvdXRlLnBhdGhGcm9tUm9vdC5mb3JFYWNoKHIgPT4ge1xyXG4gICAgICByLnVybC5mb3JFYWNoKHMgPT4ge1xyXG4gICAgICAgIHBhdGhzLnB1c2gocy5wYXRoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHVybCA9IHBhdGhzLmpvaW4oJy8nKTtcclxuICAgIHJldHVybiB1cmw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb29rIGF0IHRoZSBmaXJzdCB0d28gY2hpbGQgYWN0aXZhdGVkIHJvdXRlcyBvZiBhIHBhZ2Ugcm91dGUgYW5kIGNvbWJpbmUgdGhlIFxyXG4gICAqIHVybCBzZWdtZW50cyBvZiBlYWNoLiBUaGVzZSB3aWxsIGNvbnRhaW4gdGhlIHBhdGhzIGZvciB0aGUgY3VycmVudCB2aWV3IHRoYXRcclxuICAgKiBjb3JyZXNwb25kIHRvIGEgcHJpbWFyeSBhbmQgc2Vjb25kYXJ5IHRhYi4gQXNzdW1lcyB0aGUgVVJMIHN0cnVjdHVyZSBpcyBcclxuICAgKiAve3BhZ2V9L3twcmltYXJ5fS97c2Vjb25kYXJ5fVxyXG4gICAqIEBwYXJhbSBwYWdlUm91dGUgLSBUaGUgQWN0aXZhdGVkUm91dGUgZm9yIHRoZSAncGFnZScgcG9ydGlvbiBvZiB0aGUgdXJsLiBFLmcuIG1ldGVyLzptZXRlcklkXHJcbiAgICovXHJcbiAgcHVibGljIGdldFZpZXdVcmxTZWdtZW50cyhwYWdlUm91dGU6IEFjdGl2YXRlZFJvdXRlKTogVXJsU2VnbWVudFtdIHtcclxuICAgIGxldCBzZWdtZW50czogVXJsU2VnbWVudFtdID0gW107XHJcblxyXG4gICAgY29uc3QgcHJpbWFyeVZpZXdSb3V0ZTogQWN0aXZhdGVkUm91dGUgfCBudWxsID0gcGFnZVJvdXRlLmZpcnN0Q2hpbGQ7XHJcbiAgICBpZiAocHJpbWFyeVZpZXdSb3V0ZSkge1xyXG4gICAgICBzZWdtZW50cyA9IHNlZ21lbnRzLmNvbmNhdChwcmltYXJ5Vmlld1JvdXRlLnNuYXBzaG90LnVybCk7XHJcbiAgICAgIGNvbnN0IHNlY29uZGFyeVZpZXdSb3V0ZTogQWN0aXZhdGVkUm91dGUgfCBudWxsID0gcHJpbWFyeVZpZXdSb3V0ZS5maXJzdENoaWxkO1xyXG4gICAgICBpZiAoc2Vjb25kYXJ5Vmlld1JvdXRlKSB7XHJcbiAgICAgICAgc2VnbWVudHMgPSBzZWdtZW50cy5jb25jYXQoc2Vjb25kYXJ5Vmlld1JvdXRlLnNuYXBzaG90LnVybCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2VnbWVudHM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSAnbGFzdCBmaXJzdENoaWxkJyBvZiB0aGUgcHJvdmlkZWQgcm91dGUgdHJlZVxyXG4gICAqIEBwYXJhbSByb3V0ZSAtIEFjdGl2YXRlZFJvdXRlXHJcbiAgICovXHJcbiAgcHVibGljIGdldExhc3RSb3V0ZURlc2NlbmRhbnQocm91dGU6IEFjdGl2YXRlZFJvdXRlKTogQWN0aXZhdGVkUm91dGUge1xyXG4gICAgd2hpbGUgKHJvdXRlLmZpcnN0Q2hpbGQpIHtcclxuICAgICAgcm91dGUgPSByb3V0ZS5maXJzdENoaWxkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJvdXRlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV3JhcCBjb2RlIHRoYXQgd2lsbCBmb3JjZSB0aGUgdXNlciB0byBuYXZpZ2F0ZSBiYXNlZCBvbiBzb21lIG5ldHdvcmsgY2FsbCBpbiBhIHBpZWNlIG9mIGxvZ2ljIHRoYXQgd2lsbCBjYW5jZWwgdGhlIGFjdGlvbiBpZiB0aGVyZSBpcyBhbm90aGVyXHJcbiAgICogbmF2aWdhdGlvbiBldmVudCB3aGlsZSB3ZSB3YWl0IGZvciB0aGUgY2FsbCB0byBjb21wbGV0ZS4gVGhpcyBpcyBhIGNvbW1vbiBwcm9ibGVtIHdpdGggdHJ5aW5nIHRvIHBpY2sgYSBkZWZhdWx0IGNoaWxkIHdoZW4gYSB1c2VyIHN3aXRjaGVzIGJldHdlZW4gbW9kdWxlcy5cclxuICAgKiBAcGFyYW0gYXN5bmNDYWxsIFRoZSBhc3luYyBjb2RlIHRvIGV4ZWN1dGUgd2hpbGUgd2F0Y2hpbmcgZm9yIHJvdXRlciBuYXZpZ2F0aW9uIGV2ZW50cy4gVGhpcyBjb2RlIGFsd2F5cyBleGVjdXRlZCBhbmQgdGhlIHJlc3VsdCBpcyByZXR1cm5lZFxyXG4gICAqIEBwYXJhbSBkb0lmTm9OYXZpZ2F0aW9uIFRoZSBjb2RlIHRvIGV4ZWN1dGUgb25seSBpZiBubyBuYXZpZ2F0aW9uIGV2ZW50cyBoYXBwZW4gd2hpbGUgYXN5bmNDYWxsIGlzIGV4ZWN1dGluZy4gSXQgaXMgcGFzc2VkIHRoZSByZXN1bHQgb2YgdGhlIGFzeW5jIGNhbGxcclxuICAgKiBAcGFyYW0gcm91dGVyIFRoZSByb3V0ZXIgaW5zdGFuY2UgdG8gbGlzdGVuIGZvciBuYXZpZ2F0aW9uIGV2ZW50cy5cclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgZXhlY3V0ZVdpdGhOYXZpZ2F0aW9uV2F0Y2hlcjxUPihhc3luY0NhbGw6ICgpID0+IFByb21pc2U8VD4sIGRvSWZOb05hdmlnYXRpb246IChyZXN1bHQ6IFQpID0+IFByb21pc2U8dm9pZD4sIHJvdXRlcjogUm91dGVyKTogUHJvbWlzZTxUPiB7XHJcbiAgICBsZXQgZXZlbnRPY2N1cnJlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHN1YnNjcmlwdGlvbiA9IHJvdXRlci5ldmVudHMucGlwZShcclxuICAgICAgZmlsdGVyKGUgPT4gZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCB8fCBlIGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZClcclxuICAgICkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgZXZlbnRPY2N1cnJlZCA9IHRydWU7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYXN5bmNDYWxsKCk7XHJcbiAgICAgIGlmICghZXZlbnRPY2N1cnJlZCkge1xyXG4gICAgICAgIGF3YWl0IGRvSWZOb05hdmlnYXRpb24ocmVzdWx0KTtcclxuICAgICAgfVxyXG4gICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgXHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
1
+ import { Injectable } from "@angular/core";
2
+ import { convertToParamMap, NavigationEnd, NavigationStart } from "@angular/router";
3
+ import { filter } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ export class RouterHelper {
6
+ /**
7
+ * Traverses the pathFromRoot and combines all of the route parameters into
8
+ * one Params object and returns it
9
+ * @param route - ActivatedRouteSnapshot
10
+ * @see https://angular.io/api/router/ActivatedRouteSnapshot#pathFromRoot
11
+ */
12
+ getFullRouteParams(route) {
13
+ const params = {};
14
+ route.pathFromRoot.forEach(snapshot => {
15
+ snapshot.paramMap.keys.forEach(key => {
16
+ params[key] = snapshot.paramMap.get(key);
17
+ });
18
+ });
19
+ return params;
20
+ }
21
+ /**
22
+ * Traverses the pathFromRoot and combines all of the route paramters into
23
+ * one ParamMap and returns it
24
+ * @param route - ActivatedRouteSnapshot
25
+ * @see https://angular.io/api/router/ActivatedRouteSnapshot#pathFromRoot
26
+ */
27
+ getFullRouteParamMap(route) {
28
+ const params = this.getFullRouteParams(route);
29
+ return convertToParamMap(params);
30
+ }
31
+ /**
32
+ * Traverses the pathFromRoot and combines all of the route paths into
33
+ * a url from root to the provided activated route.
34
+ * @param route - ActivatedRouteSnapshot
35
+ * @see https://angular.io/api/router/ActivatedRouteSnapshot#pathFromRoot
36
+ */
37
+ serializeUrlFromRoot(route) {
38
+ let url = '';
39
+ const paths = [];
40
+ route.pathFromRoot.forEach(r => {
41
+ r.url.forEach(s => {
42
+ paths.push(s.path);
43
+ });
44
+ });
45
+ url = paths.join('/');
46
+ return url;
47
+ }
48
+ /**
49
+ * Look at the first two child activated routes of a page route and combine the
50
+ * url segments of each. These will contain the paths for the current view that
51
+ * correspond to a primary and secondary tab. Assumes the URL structure is
52
+ * /{page}/{primary}/{secondary}
53
+ * @param pageRoute - The ActivatedRoute for the 'page' portion of the url. E.g. meter/:meterId
54
+ */
55
+ getViewUrlSegments(pageRoute) {
56
+ let segments = [];
57
+ const primaryViewRoute = pageRoute.firstChild;
58
+ if (primaryViewRoute) {
59
+ segments = segments.concat(primaryViewRoute.snapshot.url);
60
+ const secondaryViewRoute = primaryViewRoute.firstChild;
61
+ if (secondaryViewRoute) {
62
+ segments = segments.concat(secondaryViewRoute.snapshot.url);
63
+ }
64
+ }
65
+ return segments;
66
+ }
67
+ /**
68
+ * Returns the 'last firstChild' of the provided route tree
69
+ * @param route - ActivatedRoute
70
+ */
71
+ getLastRouteDescendant(route) {
72
+ while (route.firstChild) {
73
+ route = route.firstChild;
74
+ }
75
+ return route;
76
+ }
77
+ /**
78
+ * Wrap code that will force the user to navigate based on some network call in a piece of logic that will cancel the action if there is another
79
+ * navigation event while we wait for the call to complete. This is a common problem with trying to pick a default child when a user switches between modules.
80
+ * @param asyncCall The async code to execute while watching for router navigation events. This code always executed and the result is returned
81
+ * @param doIfNoNavigation The code to execute only if no navigation events happen while asyncCall is executing. It is passed the result of the async call
82
+ * @param router The router instance to listen for navigation events.
83
+ */
84
+ async executeWithNavigationWatcher(asyncCall, doIfNoNavigation, router) {
85
+ let eventOccurred = false;
86
+ let subscription = router.events.pipe(filter(e => e instanceof NavigationStart || e instanceof NavigationEnd)).subscribe(() => {
87
+ eventOccurred = true;
88
+ });
89
+ try {
90
+ let result = await asyncCall();
91
+ if (!eventOccurred) {
92
+ await doIfNoNavigation(result);
93
+ }
94
+ subscription.unsubscribe();
95
+ return result;
96
+ }
97
+ catch (error) {
98
+ subscription.unsubscribe();
99
+ throw error;
100
+ }
101
+ }
102
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RouterHelper, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
103
+ static { thisprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RouterHelper, providedIn: 'root' }); }
104
+ }
105
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RouterHelper, decorators: [{
106
+ type: Injectable,
107
+ args: [{
108
+ providedIn: 'root'
109
+ }]
110
+ }] });
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLWhlbHBlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2NvcmUvcm91dGVyLWhlbHBlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUEwQyxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUF3QyxNQUFNLGlCQUFpQixDQUFDO0FBQ2xLLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFLeEMsTUFBTSxPQUFPLFlBQVk7SUFDdkI7Ozs7O09BS0c7SUFDSSxrQkFBa0IsQ0FBQyxLQUE2QjtRQUNyRCxNQUFNLE1BQU0sR0FBVyxFQUFFLENBQUM7UUFDMUIsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDcEMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0MsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLG9CQUFvQixDQUFDLEtBQTZCO1FBQ3ZELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxPQUFPLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLG9CQUFvQixDQUFDLEtBQTZCO1FBQ3ZELElBQUksR0FBRyxHQUFVLEVBQUUsQ0FBQztRQUNwQixNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7UUFDM0IsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDN0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2hCLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxrQkFBa0IsQ0FBQyxTQUF5QjtRQUNqRCxJQUFJLFFBQVEsR0FBaUIsRUFBRSxDQUFDO1FBRWhDLE1BQU0sZ0JBQWdCLEdBQTBCLFNBQVMsQ0FBQyxVQUFVLENBQUM7UUFDckUsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQixRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUQsTUFBTSxrQkFBa0IsR0FBMEIsZ0JBQWdCLENBQUMsVUFBVSxDQUFDO1lBQzlFLElBQUksa0JBQWtCLEVBQUU7Z0JBQ3RCLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUM3RDtTQUNGO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLHNCQUFzQixDQUFDLEtBQXFCO1FBQ2pELE9BQU8sS0FBSyxDQUFDLFVBQVUsRUFBRTtZQUN2QixLQUFLLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztTQUMxQjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBSSxTQUEyQixFQUFFLGdCQUE4QyxFQUFFLE1BQWM7UUFDdEksSUFBSSxhQUFhLEdBQVksS0FBSyxDQUFDO1FBQ25DLElBQUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNuQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksZUFBZSxJQUFJLENBQUMsWUFBWSxhQUFhLENBQUMsQ0FDeEUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2YsYUFBYSxHQUFHLElBQUksQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUVILElBQUk7WUFDRixJQUFJLE1BQU0sR0FBRyxNQUFNLFNBQVMsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ2xCLE1BQU0sZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDaEM7WUFDRCxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDM0IsT0FBTyxNQUFNLENBQUM7U0FFZjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzNCLE1BQU0sS0FBSyxDQUFDO1NBQ2I7SUFDSCxDQUFDOytHQTFHVSxZQUFZO21IQUFaLFlBQVksY0FGWCxNQUFNOzs0RkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgY29udmVydFRvUGFyYW1NYXAsIE5hdmlnYXRpb25FbmQsIE5hdmlnYXRpb25TdGFydCwgUGFyYW1NYXAsIFBhcmFtcywgUm91dGVyLCBVcmxTZWdtZW50IH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSb3V0ZXJIZWxwZXIge1xyXG4gIC8qKlxyXG4gICAqIFRyYXZlcnNlcyB0aGUgcGF0aEZyb21Sb290IGFuZCBjb21iaW5lcyBhbGwgb2YgdGhlIHJvdXRlIHBhcmFtZXRlcnMgaW50b1xyXG4gICAqIG9uZSBQYXJhbXMgb2JqZWN0IGFuZCByZXR1cm5zIGl0XHJcbiAgICogQHBhcmFtIHJvdXRlIC0gQWN0aXZhdGVkUm91dGVTbmFwc2hvdFxyXG4gICAqIEBzZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9yb3V0ZXIvQWN0aXZhdGVkUm91dGVTbmFwc2hvdCNwYXRoRnJvbVJvb3RcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0RnVsbFJvdXRlUGFyYW1zKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogUGFyYW1zIHtcclxuICAgIGNvbnN0IHBhcmFtczogUGFyYW1zID0ge307XHJcbiAgICByb3V0ZS5wYXRoRnJvbVJvb3QuZm9yRWFjaChzbmFwc2hvdCA9PiB7XHJcbiAgICAgIHNuYXBzaG90LnBhcmFtTWFwLmtleXMuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgIHBhcmFtc1trZXldID0gc25hcHNob3QucGFyYW1NYXAuZ2V0KGtleSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcGFyYW1zO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJhdmVyc2VzIHRoZSBwYXRoRnJvbVJvb3QgYW5kIGNvbWJpbmVzIGFsbCBvZiB0aGUgcm91dGUgcGFyYW10ZXJzIGludG9cclxuICAgKiBvbmUgUGFyYW1NYXAgYW5kIHJldHVybnMgaXRcclxuICAgKiBAcGFyYW0gcm91dGUgLSBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90XHJcbiAgICogQHNlZSBodHRwczovL2FuZ3VsYXIuaW8vYXBpL3JvdXRlci9BY3RpdmF0ZWRSb3V0ZVNuYXBzaG90I3BhdGhGcm9tUm9vdFxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRGdWxsUm91dGVQYXJhbU1hcChyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IFBhcmFtTWFwIHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuZ2V0RnVsbFJvdXRlUGFyYW1zKHJvdXRlKTtcclxuICAgIHJldHVybiBjb252ZXJ0VG9QYXJhbU1hcChwYXJhbXMpO1xyXG4gIH1cclxuICBcclxuICAvKipcclxuICAgKiBUcmF2ZXJzZXMgdGhlIHBhdGhGcm9tUm9vdCBhbmQgY29tYmluZXMgYWxsIG9mIHRoZSByb3V0ZSBwYXRocyBpbnRvXHJcbiAgICogYSB1cmwgZnJvbSByb290IHRvIHRoZSBwcm92aWRlZCBhY3RpdmF0ZWQgcm91dGUuXHJcbiAgICogQHBhcmFtIHJvdXRlIC0gQWN0aXZhdGVkUm91dGVTbmFwc2hvdFxyXG4gICAqIEBzZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9yb3V0ZXIvQWN0aXZhdGVkUm91dGVTbmFwc2hvdCNwYXRoRnJvbVJvb3RcclxuICAgKi9cclxuICBwdWJsaWMgc2VyaWFsaXplVXJsRnJvbVJvb3Qocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBzdHJpbmcge1xyXG4gICAgbGV0IHVybDpzdHJpbmcgPSAnJztcclxuICAgIGNvbnN0IHBhdGhzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgcm91dGUucGF0aEZyb21Sb290LmZvckVhY2gociA9PiB7XHJcbiAgICAgIHIudXJsLmZvckVhY2gocyA9PiB7XHJcbiAgICAgICAgcGF0aHMucHVzaChzLnBhdGgpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgdXJsID0gcGF0aHMuam9pbignLycpO1xyXG4gICAgcmV0dXJuIHVybDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvb2sgYXQgdGhlIGZpcnN0IHR3byBjaGlsZCBhY3RpdmF0ZWQgcm91dGVzIG9mIGEgcGFnZSByb3V0ZSBhbmQgY29tYmluZSB0aGUgXHJcbiAgICogdXJsIHNlZ21lbnRzIG9mIGVhY2guIFRoZXNlIHdpbGwgY29udGFpbiB0aGUgcGF0aHMgZm9yIHRoZSBjdXJyZW50IHZpZXcgdGhhdFxyXG4gICAqIGNvcnJlc3BvbmQgdG8gYSBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgdGFiLiBBc3N1bWVzIHRoZSBVUkwgc3RydWN0dXJlIGlzIFxyXG4gICAqIC97cGFnZX0ve3ByaW1hcnl9L3tzZWNvbmRhcnl9XHJcbiAgICogQHBhcmFtIHBhZ2VSb3V0ZSAtIFRoZSBBY3RpdmF0ZWRSb3V0ZSBmb3IgdGhlICdwYWdlJyBwb3J0aW9uIG9mIHRoZSB1cmwuIEUuZy4gbWV0ZXIvOm1ldGVySWRcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0Vmlld1VybFNlZ21lbnRzKHBhZ2VSb3V0ZTogQWN0aXZhdGVkUm91dGUpOiBVcmxTZWdtZW50W10ge1xyXG4gICAgbGV0IHNlZ21lbnRzOiBVcmxTZWdtZW50W10gPSBbXTtcclxuXHJcbiAgICBjb25zdCBwcmltYXJ5Vmlld1JvdXRlOiBBY3RpdmF0ZWRSb3V0ZSB8IG51bGwgPSBwYWdlUm91dGUuZmlyc3RDaGlsZDtcclxuICAgIGlmIChwcmltYXJ5Vmlld1JvdXRlKSB7XHJcbiAgICAgIHNlZ21lbnRzID0gc2VnbWVudHMuY29uY2F0KHByaW1hcnlWaWV3Um91dGUuc25hcHNob3QudXJsKTtcclxuICAgICAgY29uc3Qgc2Vjb25kYXJ5Vmlld1JvdXRlOiBBY3RpdmF0ZWRSb3V0ZSB8IG51bGwgPSBwcmltYXJ5Vmlld1JvdXRlLmZpcnN0Q2hpbGQ7XHJcbiAgICAgIGlmIChzZWNvbmRhcnlWaWV3Um91dGUpIHtcclxuICAgICAgICBzZWdtZW50cyA9IHNlZ21lbnRzLmNvbmNhdChzZWNvbmRhcnlWaWV3Um91dGUuc25hcHNob3QudXJsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzZWdtZW50cztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlICdsYXN0IGZpcnN0Q2hpbGQnIG9mIHRoZSBwcm92aWRlZCByb3V0ZSB0cmVlXHJcbiAgICogQHBhcmFtIHJvdXRlIC0gQWN0aXZhdGVkUm91dGVcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0TGFzdFJvdXRlRGVzY2VuZGFudChyb3V0ZTogQWN0aXZhdGVkUm91dGUpOiBBY3RpdmF0ZWRSb3V0ZSB7XHJcbiAgICB3aGlsZSAocm91dGUuZmlyc3RDaGlsZCkge1xyXG4gICAgICByb3V0ZSA9IHJvdXRlLmZpcnN0Q2hpbGQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcm91dGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXcmFwIGNvZGUgdGhhdCB3aWxsIGZvcmNlIHRoZSB1c2VyIHRvIG5hdmlnYXRlIGJhc2VkIG9uIHNvbWUgbmV0d29yayBjYWxsIGluIGEgcGllY2Ugb2YgbG9naWMgdGhhdCB3aWxsIGNhbmNlbCB0aGUgYWN0aW9uIGlmIHRoZXJlIGlzIGFub3RoZXJcclxuICAgKiBuYXZpZ2F0aW9uIGV2ZW50IHdoaWxlIHdlIHdhaXQgZm9yIHRoZSBjYWxsIHRvIGNvbXBsZXRlLiBUaGlzIGlzIGEgY29tbW9uIHByb2JsZW0gd2l0aCB0cnlpbmcgdG8gcGljayBhIGRlZmF1bHQgY2hpbGQgd2hlbiBhIHVzZXIgc3dpdGNoZXMgYmV0d2VlbiBtb2R1bGVzLlxyXG4gICAqIEBwYXJhbSBhc3luY0NhbGwgVGhlIGFzeW5jIGNvZGUgdG8gZXhlY3V0ZSB3aGlsZSB3YXRjaGluZyBmb3Igcm91dGVyIG5hdmlnYXRpb24gZXZlbnRzLiBUaGlzIGNvZGUgYWx3YXlzIGV4ZWN1dGVkIGFuZCB0aGUgcmVzdWx0IGlzIHJldHVybmVkXHJcbiAgICogQHBhcmFtIGRvSWZOb05hdmlnYXRpb24gVGhlIGNvZGUgdG8gZXhlY3V0ZSBvbmx5IGlmIG5vIG5hdmlnYXRpb24gZXZlbnRzIGhhcHBlbiB3aGlsZSBhc3luY0NhbGwgaXMgZXhlY3V0aW5nLiBJdCBpcyBwYXNzZWQgdGhlIHJlc3VsdCBvZiB0aGUgYXN5bmMgY2FsbFxyXG4gICAqIEBwYXJhbSByb3V0ZXIgVGhlIHJvdXRlciBpbnN0YW5jZSB0byBsaXN0ZW4gZm9yIG5hdmlnYXRpb24gZXZlbnRzLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBleGVjdXRlV2l0aE5hdmlnYXRpb25XYXRjaGVyPFQ+KGFzeW5jQ2FsbDogKCkgPT4gUHJvbWlzZTxUPiwgZG9JZk5vTmF2aWdhdGlvbjogKHJlc3VsdDogVCkgPT4gUHJvbWlzZTx2b2lkPiwgcm91dGVyOiBSb3V0ZXIpOiBQcm9taXNlPFQ+IHtcclxuICAgIGxldCBldmVudE9jY3VycmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgc3Vic2NyaXB0aW9uID0gcm91dGVyLmV2ZW50cy5waXBlKFxyXG4gICAgICBmaWx0ZXIoZSA9PiBlIGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0IHx8IGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKVxyXG4gICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICBldmVudE9jY3VycmVkID0gdHJ1ZTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBhc3luY0NhbGwoKTtcclxuICAgICAgaWYgKCFldmVudE9jY3VycmVkKSB7XHJcbiAgICAgICAgYXdhaXQgZG9JZk5vTmF2aWdhdGlvbihyZXN1bHQpO1xyXG4gICAgICB9XHJcbiAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICBcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
@@ -1,89 +1,89 @@
1
- import { Injectable } from "@angular/core";
2
- import * as i0 from "@angular/core";
3
- export class ScrollService {
4
- constructor() { }
5
- /**
6
- * Given a container and the target element to scroll to, we will set the scroll top on
7
- * the container to bring the target into view.
8
- *
9
- * @param scrollContainerSelector A valid CSS selector string for the scroll container.
10
- * @param targetElementSelector A valid CSS selector string for the target element.
11
- * @param topPadding The amount of space to leave above the target
12
- * to keep it from being pinned to the top of the scrollContainer. Defaults
13
- * to 32px, the default height of a menu item.
14
- */
15
- scrollToItem(scrollContainerSelector, targetElementSelector, topPadding = 32) {
16
- let scrollContainer = document.querySelector(scrollContainerSelector);
17
- if (!scrollContainer) {
18
- return;
19
- }
20
- let targetElement = scrollContainer.querySelector(targetElementSelector);
21
- if (!targetElement) {
22
- return;
23
- }
24
- let targetRect = targetElement.getBoundingClientRect();
25
- let containerRect = scrollContainer.getBoundingClientRect();
26
- // Only scroll if the target is outside of the view bounds of the container
27
- if (targetRect.bottom > containerRect.bottom || targetRect.top < containerRect.top) {
28
- scrollContainer.scrollTop =
29
- (targetRect.top - containerRect.top) + scrollContainer.scrollTop - topPadding;
30
- }
31
- }
32
- /**
33
- * Return the value of the scrollTop property for an HTMLElement that matches the selector
34
- * @param scrollContainerSelector A valid CSS selector
35
- */
36
- getCurrentScrollPosition(scrollContainerSelector) {
37
- let scrollContainer = document.querySelector(scrollContainerSelector);
38
- if (scrollContainer) {
39
- return scrollContainer.scrollTop;
40
- }
41
- else {
42
- console.error(`Scroll container '${scrollContainerSelector}' does not exist.`);
43
- return 0;
44
- }
45
- }
46
- /**
47
- * Set the scrollTop of an HTMLElement that matches the selector to a specific position
48
- * @param scrollContainerSelector A valid CSS selector
49
- * @param position
50
- */
51
- scrollToPosition(scrollContainerSelector, position) {
52
- let scrollContainer = document.querySelector(scrollContainerSelector);
53
- if (scrollContainer) {
54
- scrollContainer.scrollTop = position;
55
- }
56
- else {
57
- console.error(`Scroll container '${scrollContainerSelector}' does not exist.`);
58
- }
59
- }
60
- /**
61
- * Given a container and the target element to scroll to, we will set the scroll top on
62
- * the container to bring the target into view, with the item in the center of the scroll container.
63
- *
64
- * @param scrollContainerSelector A valid CSS selector string for the scroll container.
65
- * @param targetElementSelector A valid CSS selector string for the target element.
66
- */
67
- scrollItemCentered(scrollContainerSelector, targetElementSelector) {
68
- try {
69
- let scrollContainer = document.querySelector(scrollContainerSelector);
70
- if (scrollContainer) {
71
- let containerHeight = scrollContainer.getBoundingClientRect().height;
72
- // Pad the top with half of the height of the container to put the target in the middle
73
- this.scrollToItem(scrollContainerSelector, targetElementSelector, containerHeight * .5);
74
- }
75
- }
76
- catch (error) {
77
- console.error(`Error scrolling target into view. Container selector: ${scrollContainerSelector}. Target selector: ${targetElementSelector}`, error);
78
- }
79
- }
80
- }
81
- ScrollServicefac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ScrollService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
82
- ScrollService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ScrollService, providedIn: 'root' });
83
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ScrollService, decorators: [{
84
- type: Injectable,
85
- args: [{
86
- providedIn: 'root'
87
- }]
88
- }], ctorParameters: function () { return []; } });
89
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29yZS9zY3JvbGwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUszQyxNQUFNLE9BQU8sYUFBYTtJQUV0QixnQkFBZ0IsQ0FBQztJQUVqQjs7Ozs7Ozs7O09BU0c7SUFDSSxZQUFZLENBQUMsdUJBQStCLEVBQUUscUJBQTZCLEVBQUUsVUFBVSxHQUFHLEVBQUU7UUFDL0YsSUFBSSxlQUFlLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDbEIsT0FBTztTQUNWO1FBQ0QsSUFBSSxhQUFhLEdBQUcsZUFBZSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDaEIsT0FBTztTQUNWO1FBRUQsSUFBSSxVQUFVLEdBQUcsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDdkQsSUFBSSxhQUFhLEdBQUcsZUFBZSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFFNUQsMkVBQTJFO1FBQzNFLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxHQUFHLEdBQUcsYUFBYSxDQUFDLEdBQUcsRUFBRTtZQUNoRixlQUFlLENBQUMsU0FBUztnQkFDckIsQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQztTQUNyRjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSx3QkFBd0IsQ0FBQyx1QkFBK0I7UUFDM0QsSUFBSSxlQUFlLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3RFLElBQUksZUFBZSxFQUFFO1lBQ2pCLE9BQU8sZUFBZSxDQUFDLFNBQVMsQ0FBQztTQUNwQzthQUFNO1lBQ0gsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsdUJBQXVCLG1CQUFtQixDQUFDLENBQUM7WUFDL0UsT0FBTyxDQUFDLENBQUM7U0FDWjtJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksZ0JBQWdCLENBQUMsdUJBQStCLEVBQUUsUUFBZ0I7UUFDckUsSUFBSSxlQUFlLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3RFLElBQUksZUFBZSxFQUFFO1lBQ2pCLGVBQWUsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1NBQ3hDO2FBQU07WUFDSCxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQix1QkFBdUIsbUJBQW1CLENBQUMsQ0FBQztTQUNsRjtJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxrQkFBa0IsQ0FBQyx1QkFBK0IsRUFBRSxxQkFBNkI7UUFDcEYsSUFBSTtZQUNBLElBQUksZUFBZSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUN0RSxJQUFJLGVBQWUsRUFBRTtnQkFDakIsSUFBSSxlQUFlLEdBQUcsZUFBZSxDQUFDLHFCQUFxQixFQUFFLENBQUMsTUFBTSxDQUFDO2dCQUNyRSx1RkFBdUY7Z0JBQ3ZGLElBQUksQ0FBQyxZQUFZLENBQUMsdUJBQXVCLEVBQUUscUJBQXFCLEVBQUUsZUFBZSxHQUFHLEVBQUUsQ0FBQyxDQUFBO2FBQzFGO1NBQ0o7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNaLE9BQU8sQ0FBQyxLQUFLLENBQUMseURBQXlELHVCQUF1Qix1QkFBdUIscUJBQXFCLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUN4SjtJQUNMLENBQUM7OzBHQWhGUSxhQUFhOzhHQUFiLGFBQWEsY0FGVixNQUFNOzJGQUVULGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFNjcm9sbFNlcnZpY2Uge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHaXZlbiBhIGNvbnRhaW5lciBhbmQgdGhlIHRhcmdldCBlbGVtZW50IHRvIHNjcm9sbCB0bywgd2Ugd2lsbCBzZXQgdGhlIHNjcm9sbCB0b3Agb25cclxuICAgICAqICB0aGUgY29udGFpbmVyIHRvIGJyaW5nIHRoZSB0YXJnZXQgaW50byB2aWV3LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBzY3JvbGxDb250YWluZXJTZWxlY3RvciBBIHZhbGlkIENTUyBzZWxlY3RvciBzdHJpbmcgZm9yIHRoZSBzY3JvbGwgY29udGFpbmVyLlxyXG4gICAgICogQHBhcmFtIHRhcmdldEVsZW1lbnRTZWxlY3RvciBBIHZhbGlkIENTUyBzZWxlY3RvciBzdHJpbmcgZm9yIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB0b3BQYWRkaW5nIFRoZSBhbW91bnQgb2Ygc3BhY2UgdG8gbGVhdmUgYWJvdmUgdGhlIHRhcmdldFxyXG4gICAgICogdG8ga2VlcCBpdCBmcm9tIGJlaW5nIHBpbm5lZCB0byB0aGUgdG9wIG9mIHRoZSBzY3JvbGxDb250YWluZXIuIERlZmF1bHRzXHJcbiAgICAgKiB0byAzMnB4LCB0aGUgZGVmYXVsdCBoZWlnaHQgb2YgYSBtZW51IGl0ZW0uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzY3JvbGxUb0l0ZW0oc2Nyb2xsQ29udGFpbmVyU2VsZWN0b3I6IHN0cmluZywgdGFyZ2V0RWxlbWVudFNlbGVjdG9yOiBzdHJpbmcsIHRvcFBhZGRpbmcgPSAzMik6IHZvaWQge1xyXG4gICAgICAgIGxldCBzY3JvbGxDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNjcm9sbENvbnRhaW5lclNlbGVjdG9yKTtcclxuICAgICAgICBpZiAoIXNjcm9sbENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB0YXJnZXRFbGVtZW50ID0gc2Nyb2xsQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IodGFyZ2V0RWxlbWVudFNlbGVjdG9yKTtcclxuICAgICAgICBpZiAoIXRhcmdldEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRhcmdldFJlY3QgPSB0YXJnZXRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGxldCBjb250YWluZXJSZWN0ID0gc2Nyb2xsQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgICAvLyBPbmx5IHNjcm9sbCBpZiB0aGUgdGFyZ2V0IGlzIG91dHNpZGUgb2YgdGhlIHZpZXcgYm91bmRzIG9mIHRoZSBjb250YWluZXJcclxuICAgICAgICBpZiAodGFyZ2V0UmVjdC5ib3R0b20gPiBjb250YWluZXJSZWN0LmJvdHRvbSB8fCB0YXJnZXRSZWN0LnRvcCA8IGNvbnRhaW5lclJlY3QudG9wKSB7XHJcbiAgICAgICAgICAgIHNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3AgPVxyXG4gICAgICAgICAgICAgICAgKHRhcmdldFJlY3QudG9wIC0gY29udGFpbmVyUmVjdC50b3ApICsgc2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCAtIHRvcFBhZGRpbmc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc2Nyb2xsVG9wIHByb3BlcnR5IGZvciBhbiBIVE1MRWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yXHJcbiAgICAgKiBAcGFyYW0gc2Nyb2xsQ29udGFpbmVyU2VsZWN0b3IgQSB2YWxpZCBDU1Mgc2VsZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEN1cnJlbnRTY3JvbGxQb3NpdGlvbihzY3JvbGxDb250YWluZXJTZWxlY3Rvcjogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgc2Nyb2xsQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzY3JvbGxDb250YWluZXJTZWxlY3Rvcik7XHJcbiAgICAgICAgaWYgKHNjcm9sbENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICByZXR1cm4gc2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBTY3JvbGwgY29udGFpbmVyICcke3Njcm9sbENvbnRhaW5lclNlbGVjdG9yfScgZG9lcyBub3QgZXhpc3QuYCk7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgc2Nyb2xsVG9wIG9mIGFuIEhUTUxFbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IgdG8gYSBzcGVjaWZpYyBwb3NpdGlvblxyXG4gICAgICogQHBhcmFtIHNjcm9sbENvbnRhaW5lclNlbGVjdG9yIEEgdmFsaWQgQ1NTIHNlbGVjdG9yXHJcbiAgICAgKiBAcGFyYW0gcG9zaXRpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNjcm9sbFRvUG9zaXRpb24oc2Nyb2xsQ29udGFpbmVyU2VsZWN0b3I6IHN0cmluZywgcG9zaXRpb246IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGxldCBzY3JvbGxDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNjcm9sbENvbnRhaW5lclNlbGVjdG9yKTtcclxuICAgICAgICBpZiAoc2Nyb2xsQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3AgPSBwb3NpdGlvbjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBTY3JvbGwgY29udGFpbmVyICcke3Njcm9sbENvbnRhaW5lclNlbGVjdG9yfScgZG9lcyBub3QgZXhpc3QuYCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogIEdpdmVuIGEgY29udGFpbmVyIGFuZCB0aGUgdGFyZ2V0IGVsZW1lbnQgdG8gc2Nyb2xsIHRvLCB3ZSB3aWxsIHNldCB0aGUgc2Nyb2xsIHRvcCBvblxyXG4gICAgICogIHRoZSBjb250YWluZXIgdG8gYnJpbmcgdGhlIHRhcmdldCBpbnRvIHZpZXcsIHdpdGggdGhlIGl0ZW0gaW4gdGhlIGNlbnRlciBvZiB0aGUgc2Nyb2xsIGNvbnRhaW5lci5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gc2Nyb2xsQ29udGFpbmVyU2VsZWN0b3IgQSB2YWxpZCBDU1Mgc2VsZWN0b3Igc3RyaW5nIGZvciB0aGUgc2Nyb2xsIGNvbnRhaW5lci5cclxuICAgICAqIEBwYXJhbSB0YXJnZXRFbGVtZW50U2VsZWN0b3IgQSB2YWxpZCBDU1Mgc2VsZWN0b3Igc3RyaW5nIGZvciB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzY3JvbGxJdGVtQ2VudGVyZWQoc2Nyb2xsQ29udGFpbmVyU2VsZWN0b3I6IHN0cmluZywgdGFyZ2V0RWxlbWVudFNlbGVjdG9yOiBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgc2Nyb2xsQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzY3JvbGxDb250YWluZXJTZWxlY3Rvcik7XHJcbiAgICAgICAgICAgIGlmIChzY3JvbGxDb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBjb250YWluZXJIZWlnaHQgPSBzY3JvbGxDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgLy8gUGFkIHRoZSB0b3Agd2l0aCBoYWxmIG9mIHRoZSBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lciB0byBwdXQgdGhlIHRhcmdldCBpbiB0aGUgbWlkZGxlXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvSXRlbShzY3JvbGxDb250YWluZXJTZWxlY3RvciwgdGFyZ2V0RWxlbWVudFNlbGVjdG9yLCBjb250YWluZXJIZWlnaHQgKiAuNSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIHNjcm9sbGluZyB0YXJnZXQgaW50byB2aWV3LiBDb250YWluZXIgc2VsZWN0b3I6ICR7c2Nyb2xsQ29udGFpbmVyU2VsZWN0b3J9LiBUYXJnZXQgc2VsZWN0b3I6ICAke3RhcmdldEVsZW1lbnRTZWxlY3Rvcn1gLCBlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==
1
+ import { Injectable } from "@angular/core";
2
+ import * as i0 from "@angular/core";
3
+ export class ScrollService {
4
+ constructor() { }
5
+ /**
6
+ * Given a container and the target element to scroll to, we will set the scroll top on
7
+ * the container to bring the target into view.
8
+ *
9
+ * @param scrollContainerSelector A valid CSS selector string for the scroll container.
10
+ * @param targetElementSelector A valid CSS selector string for the target element.
11
+ * @param topPadding The amount of space to leave above the target
12
+ * to keep it from being pinned to the top of the scrollContainer. Defaults
13
+ * to 32px, the default height of a menu item.
14
+ */
15
+ scrollToItem(scrollContainerSelector, targetElementSelector, topPadding = 32) {
16
+ let scrollContainer = document.querySelector(scrollContainerSelector);
17
+ if (!scrollContainer) {
18
+ return;
19
+ }
20
+ let targetElement = scrollContainer.querySelector(targetElementSelector);
21
+ if (!targetElement) {
22
+ return;
23
+ }
24
+ let targetRect = targetElement.getBoundingClientRect();
25
+ let containerRect = scrollContainer.getBoundingClientRect();
26
+ // Only scroll if the target is outside of the view bounds of the container
27
+ if (targetRect.bottom > containerRect.bottom || targetRect.top < containerRect.top) {
28
+ scrollContainer.scrollTop =
29
+ (targetRect.top - containerRect.top) + scrollContainer.scrollTop - topPadding;
30
+ }
31
+ }
32
+ /**
33
+ * Return the value of the scrollTop property for an HTMLElement that matches the selector
34
+ * @param scrollContainerSelector A valid CSS selector
35
+ */
36
+ getCurrentScrollPosition(scrollContainerSelector) {
37
+ let scrollContainer = document.querySelector(scrollContainerSelector);
38
+ if (scrollContainer) {
39
+ return scrollContainer.scrollTop;
40
+ }
41
+ else {
42
+ console.error(`Scroll container '${scrollContainerSelector}' does not exist.`);
43
+ return 0;
44
+ }
45
+ }
46
+ /**
47
+ * Set the scrollTop of an HTMLElement that matches the selector to a specific position
48
+ * @param scrollContainerSelector A valid CSS selector
49
+ * @param position
50
+ */
51
+ scrollToPosition(scrollContainerSelector, position) {
52
+ let scrollContainer = document.querySelector(scrollContainerSelector);
53
+ if (scrollContainer) {
54
+ scrollContainer.scrollTop = position;
55
+ }
56
+ else {
57
+ console.error(`Scroll container '${scrollContainerSelector}' does not exist.`);
58
+ }
59
+ }
60
+ /**
61
+ * Given a container and the target element to scroll to, we will set the scroll top on
62
+ * the container to bring the target into view, with the item in the center of the scroll container.
63
+ *
64
+ * @param scrollContainerSelector A valid CSS selector string for the scroll container.
65
+ * @param targetElementSelector A valid CSS selector string for the target element.
66
+ */
67
+ scrollItemCentered(scrollContainerSelector, targetElementSelector) {
68
+ try {
69
+ let scrollContainer = document.querySelector(scrollContainerSelector);
70
+ if (scrollContainer) {
71
+ let containerHeight = scrollContainer.getBoundingClientRect().height;
72
+ // Pad the top with half of the height of the container to put the target in the middle
73
+ this.scrollToItem(scrollContainerSelector, targetElementSelector, containerHeight * .5);
74
+ }
75
+ }
76
+ catch (error) {
77
+ console.error(`Error scrolling target into view. Container selector: ${scrollContainerSelector}. Target selector: ${targetElementSelector}`, error);
78
+ }
79
+ }
80
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ScrollService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
81
+ static { thisprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ScrollService, providedIn: 'root' }); }
82
+ }
83
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ScrollService, decorators: [{
84
+ type: Injectable,
85
+ args: [{
86
+ providedIn: 'root'
87
+ }]
88
+ }], ctorParameters: function () { return []; } });
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29yZS9zY3JvbGwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUszQyxNQUFNLE9BQU8sYUFBYTtJQUV0QixnQkFBZ0IsQ0FBQztJQUVqQjs7Ozs7Ozs7O09BU0c7SUFDSSxZQUFZLENBQUMsdUJBQStCLEVBQUUscUJBQTZCLEVBQUUsVUFBVSxHQUFHLEVBQUU7UUFDL0YsSUFBSSxlQUFlLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDbEIsT0FBTztTQUNWO1FBQ0QsSUFBSSxhQUFhLEdBQUcsZUFBZSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDaEIsT0FBTztTQUNWO1FBRUQsSUFBSSxVQUFVLEdBQUcsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDdkQsSUFBSSxhQUFhLEdBQUcsZUFBZSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFFNUQsMkVBQTJFO1FBQzNFLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxHQUFHLEdBQUcsYUFBYSxDQUFDLEdBQUcsRUFBRTtZQUNoRixlQUFlLENBQUMsU0FBUztnQkFDckIsQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQztTQUNyRjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSx3QkFBd0IsQ0FBQyx1QkFBK0I7UUFDM0QsSUFBSSxlQUFlLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3RFLElBQUksZUFBZSxFQUFFO1lBQ2pCLE9BQU8sZUFBZSxDQUFDLFNBQVMsQ0FBQztTQUNwQzthQUFNO1lBQ0gsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsdUJBQXVCLG1CQUFtQixDQUFDLENBQUM7WUFDL0UsT0FBTyxDQUFDLENBQUM7U0FDWjtJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksZ0JBQWdCLENBQUMsdUJBQStCLEVBQUUsUUFBZ0I7UUFDckUsSUFBSSxlQUFlLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3RFLElBQUksZUFBZSxFQUFFO1lBQ2pCLGVBQWUsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1NBQ3hDO2FBQU07WUFDSCxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQix1QkFBdUIsbUJBQW1CLENBQUMsQ0FBQztTQUNsRjtJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxrQkFBa0IsQ0FBQyx1QkFBK0IsRUFBRSxxQkFBNkI7UUFDcEYsSUFBSTtZQUNBLElBQUksZUFBZSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUN0RSxJQUFJLGVBQWUsRUFBRTtnQkFDakIsSUFBSSxlQUFlLEdBQUcsZUFBZSxDQUFDLHFCQUFxQixFQUFFLENBQUMsTUFBTSxDQUFDO2dCQUNyRSx1RkFBdUY7Z0JBQ3ZGLElBQUksQ0FBQyxZQUFZLENBQUMsdUJBQXVCLEVBQUUscUJBQXFCLEVBQUUsZUFBZSxHQUFHLEVBQUUsQ0FBQyxDQUFBO2FBQzFGO1NBQ0o7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNaLE9BQU8sQ0FBQyxLQUFLLENBQUMseURBQXlELHVCQUF1Qix1QkFBdUIscUJBQXFCLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUN4SjtJQUNMLENBQUM7K0dBaEZRLGFBQWE7bUhBQWIsYUFBYSxjQUZWLE1BQU07OzRGQUVULGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFNjcm9sbFNlcnZpY2Uge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHaXZlbiBhIGNvbnRhaW5lciBhbmQgdGhlIHRhcmdldCBlbGVtZW50IHRvIHNjcm9sbCB0bywgd2Ugd2lsbCBzZXQgdGhlIHNjcm9sbCB0b3Agb25cclxuICAgICAqICB0aGUgY29udGFpbmVyIHRvIGJyaW5nIHRoZSB0YXJnZXQgaW50byB2aWV3LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBzY3JvbGxDb250YWluZXJTZWxlY3RvciBBIHZhbGlkIENTUyBzZWxlY3RvciBzdHJpbmcgZm9yIHRoZSBzY3JvbGwgY29udGFpbmVyLlxyXG4gICAgICogQHBhcmFtIHRhcmdldEVsZW1lbnRTZWxlY3RvciBBIHZhbGlkIENTUyBzZWxlY3RvciBzdHJpbmcgZm9yIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB0b3BQYWRkaW5nIFRoZSBhbW91bnQgb2Ygc3BhY2UgdG8gbGVhdmUgYWJvdmUgdGhlIHRhcmdldFxyXG4gICAgICogdG8ga2VlcCBpdCBmcm9tIGJlaW5nIHBpbm5lZCB0byB0aGUgdG9wIG9mIHRoZSBzY3JvbGxDb250YWluZXIuIERlZmF1bHRzXHJcbiAgICAgKiB0byAzMnB4LCB0aGUgZGVmYXVsdCBoZWlnaHQgb2YgYSBtZW51IGl0ZW0uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzY3JvbGxUb0l0ZW0oc2Nyb2xsQ29udGFpbmVyU2VsZWN0b3I6IHN0cmluZywgdGFyZ2V0RWxlbWVudFNlbGVjdG9yOiBzdHJpbmcsIHRvcFBhZGRpbmcgPSAzMik6IHZvaWQge1xyXG4gICAgICAgIGxldCBzY3JvbGxDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNjcm9sbENvbnRhaW5lclNlbGVjdG9yKTtcclxuICAgICAgICBpZiAoIXNjcm9sbENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB0YXJnZXRFbGVtZW50ID0gc2Nyb2xsQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IodGFyZ2V0RWxlbWVudFNlbGVjdG9yKTtcclxuICAgICAgICBpZiAoIXRhcmdldEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRhcmdldFJlY3QgPSB0YXJnZXRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGxldCBjb250YWluZXJSZWN0ID0gc2Nyb2xsQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgICAvLyBPbmx5IHNjcm9sbCBpZiB0aGUgdGFyZ2V0IGlzIG91dHNpZGUgb2YgdGhlIHZpZXcgYm91bmRzIG9mIHRoZSBjb250YWluZXJcclxuICAgICAgICBpZiAodGFyZ2V0UmVjdC5ib3R0b20gPiBjb250YWluZXJSZWN0LmJvdHRvbSB8fCB0YXJnZXRSZWN0LnRvcCA8IGNvbnRhaW5lclJlY3QudG9wKSB7XHJcbiAgICAgICAgICAgIHNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3AgPVxyXG4gICAgICAgICAgICAgICAgKHRhcmdldFJlY3QudG9wIC0gY29udGFpbmVyUmVjdC50b3ApICsgc2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCAtIHRvcFBhZGRpbmc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc2Nyb2xsVG9wIHByb3BlcnR5IGZvciBhbiBIVE1MRWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yXHJcbiAgICAgKiBAcGFyYW0gc2Nyb2xsQ29udGFpbmVyU2VsZWN0b3IgQSB2YWxpZCBDU1Mgc2VsZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEN1cnJlbnRTY3JvbGxQb3NpdGlvbihzY3JvbGxDb250YWluZXJTZWxlY3Rvcjogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgc2Nyb2xsQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzY3JvbGxDb250YWluZXJTZWxlY3Rvcik7XHJcbiAgICAgICAgaWYgKHNjcm9sbENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICByZXR1cm4gc2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBTY3JvbGwgY29udGFpbmVyICcke3Njcm9sbENvbnRhaW5lclNlbGVjdG9yfScgZG9lcyBub3QgZXhpc3QuYCk7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgc2Nyb2xsVG9wIG9mIGFuIEhUTUxFbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IgdG8gYSBzcGVjaWZpYyBwb3NpdGlvblxyXG4gICAgICogQHBhcmFtIHNjcm9sbENvbnRhaW5lclNlbGVjdG9yIEEgdmFsaWQgQ1NTIHNlbGVjdG9yXHJcbiAgICAgKiBAcGFyYW0gcG9zaXRpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNjcm9sbFRvUG9zaXRpb24oc2Nyb2xsQ29udGFpbmVyU2VsZWN0b3I6IHN0cmluZywgcG9zaXRpb246IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGxldCBzY3JvbGxDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNjcm9sbENvbnRhaW5lclNlbGVjdG9yKTtcclxuICAgICAgICBpZiAoc2Nyb2xsQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3AgPSBwb3NpdGlvbjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBTY3JvbGwgY29udGFpbmVyICcke3Njcm9sbENvbnRhaW5lclNlbGVjdG9yfScgZG9lcyBub3QgZXhpc3QuYCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogIEdpdmVuIGEgY29udGFpbmVyIGFuZCB0aGUgdGFyZ2V0IGVsZW1lbnQgdG8gc2Nyb2xsIHRvLCB3ZSB3aWxsIHNldCB0aGUgc2Nyb2xsIHRvcCBvblxyXG4gICAgICogIHRoZSBjb250YWluZXIgdG8gYnJpbmcgdGhlIHRhcmdldCBpbnRvIHZpZXcsIHdpdGggdGhlIGl0ZW0gaW4gdGhlIGNlbnRlciBvZiB0aGUgc2Nyb2xsIGNvbnRhaW5lci5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gc2Nyb2xsQ29udGFpbmVyU2VsZWN0b3IgQSB2YWxpZCBDU1Mgc2VsZWN0b3Igc3RyaW5nIGZvciB0aGUgc2Nyb2xsIGNvbnRhaW5lci5cclxuICAgICAqIEBwYXJhbSB0YXJnZXRFbGVtZW50U2VsZWN0b3IgQSB2YWxpZCBDU1Mgc2VsZWN0b3Igc3RyaW5nIGZvciB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzY3JvbGxJdGVtQ2VudGVyZWQoc2Nyb2xsQ29udGFpbmVyU2VsZWN0b3I6IHN0cmluZywgdGFyZ2V0RWxlbWVudFNlbGVjdG9yOiBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgc2Nyb2xsQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzY3JvbGxDb250YWluZXJTZWxlY3Rvcik7XHJcbiAgICAgICAgICAgIGlmIChzY3JvbGxDb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBjb250YWluZXJIZWlnaHQgPSBzY3JvbGxDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgLy8gUGFkIHRoZSB0b3Agd2l0aCBoYWxmIG9mIHRoZSBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lciB0byBwdXQgdGhlIHRhcmdldCBpbiB0aGUgbWlkZGxlXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvSXRlbShzY3JvbGxDb250YWluZXJTZWxlY3RvciwgdGFyZ2V0RWxlbWVudFNlbGVjdG9yLCBjb250YWluZXJIZWlnaHQgKiAuNSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIHNjcm9sbGluZyB0YXJnZXQgaW50byB2aWV3LiBDb250YWluZXIgc2VsZWN0b3I6ICR7c2Nyb2xsQ29udGFpbmVyU2VsZWN0b3J9LiBUYXJnZXQgc2VsZWN0b3I6ICAke3RhcmdldEVsZW1lbnRTZWxlY3Rvcn1gLCBlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==