@scion/workbench 18.0.0-beta.9 → 19.0.0-beta.1

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 (253) hide show
  1. package/design/_workbench-view-global-styles.scss +0 -1
  2. package/fesm2022/scion-workbench.mjs +8556 -8622
  3. package/fesm2022/scion-workbench.mjs.map +1 -1
  4. package/lib/common/css-class.util.d.ts +5 -0
  5. package/lib/common/math.util.d.ts +7 -0
  6. package/lib/common/objects.util.d.ts +1 -1
  7. package/lib/dialog/workbench-dialog.component.d.ts +1 -2
  8. package/lib/layout/migration/model/workbench-layout-migration-v6.model.d.ts +35 -0
  9. package/lib/layout/migration/workbench-layout-migration-v6.service.d.ts +12 -0
  10. package/lib/layout/workbench-layout.model.d.ts +0 -1
  11. package/lib/layout/workbench-layout.service.d.ts +10 -12
  12. package/lib/layout/workench-layout-serializer.service.d.ts +1 -2
  13. package/lib/part/part-action-bar/part-action-bar.component.d.ts +2 -6
  14. package/lib/part/part-bar/part-bar.component.d.ts +66 -48
  15. package/lib/part/view-tab/view-tab.component.d.ts +3 -3
  16. package/lib/public_api.d.ts +0 -2
  17. package/lib/routing/routing.util.d.ts +2 -2
  18. package/lib/view/view-move-handler.service.d.ts +16 -14
  19. package/lib/view/view.component.d.ts +1 -2
  20. package/lib/view//311/265workbench-view.model.d.ts +1 -9
  21. package/lib/view-dnd/grid-drop-targets.util.d.ts +1 -1
  22. package/lib/view-dnd/view-drag.service.d.ts +72 -49
  23. package/lib/view-dnd/view-tab-drag-image-renderer.service.d.ts +11 -36
  24. package/package.json +8 -10
  25. package/esm2022/lib/activation-instant.provider.mjs +0 -29
  26. package/esm2022/lib/common/animation-frame.observable.mjs +0 -37
  27. package/esm2022/lib/common/asserts.util.mjs +0 -31
  28. package/esm2022/lib/common/class-list.mjs +0 -99
  29. package/esm2022/lib/common/coerce-observable.pipe.mjs +0 -28
  30. package/esm2022/lib/common/disposable.mjs +0 -11
  31. package/esm2022/lib/common/dom.util.mjs +0 -100
  32. package/esm2022/lib/common/grid-element-if-visible.pipe.mjs +0 -32
  33. package/esm2022/lib/common/instanceof.pipe.mjs +0 -26
  34. package/esm2022/lib/common/map-coerce.pipe.mjs +0 -28
  35. package/esm2022/lib/common/null-if-empty.pipe.mjs +0 -38
  36. package/esm2022/lib/common/objects.util.mjs +0 -40
  37. package/esm2022/lib/common/observables.mjs +0 -72
  38. package/esm2022/lib/common/operators.mjs +0 -27
  39. package/esm2022/lib/common/public_api.mjs +0 -11
  40. package/esm2022/lib/common/stringify-error.util.mjs +0 -19
  41. package/esm2022/lib/common/throw-error.util.mjs +0 -16
  42. package/esm2022/lib/common/typeof.pipe.mjs +0 -26
  43. package/esm2022/lib/common/uid.util.mjs +0 -22
  44. package/esm2022/lib/common//311/265destroy-ref.mjs +0 -36
  45. package/esm2022/lib/communication/workbench-broadcast-channel.mjs +0 -38
  46. package/esm2022/lib/content-projection/content-as-overlay.component.mjs +0 -114
  47. package/esm2022/lib/content-projection/workbench-element-references.mjs +0 -32
  48. package/esm2022/lib/dialog/dialog-footer/dialog-action-filter.pipe.mjs +0 -26
  49. package/esm2022/lib/dialog/dialog-footer/dialog-footer.component.mjs +0 -34
  50. package/esm2022/lib/dialog/dialog-footer/workbench-dialog-action.directive.mjs +0 -51
  51. package/esm2022/lib/dialog/dialog-footer/workbench-dialog-footer.directive.mjs +0 -46
  52. package/esm2022/lib/dialog/dialog-header/dialog-header.component.mjs +0 -33
  53. package/esm2022/lib/dialog/dialog-header/workbench-dialog-header.directive.mjs +0 -46
  54. package/esm2022/lib/dialog/movable.directive.mjs +0 -126
  55. package/esm2022/lib/dialog/public_api.mjs +0 -15
  56. package/esm2022/lib/dialog/resizable.directive.mjs +0 -392
  57. package/esm2022/lib/dialog/workbench-dialog.component.mjs +0 -250
  58. package/esm2022/lib/dialog/workbench-dialog.mjs +0 -79
  59. package/esm2022/lib/dialog/workbench-dialog.options.mjs +0 -11
  60. package/esm2022/lib/dialog/workbench-dialog.registry.mjs +0 -73
  61. package/esm2022/lib/dialog/workbench-dialog.service.mjs +0 -96
  62. package/esm2022/lib/dialog//311/265workbench-dialog.mjs +0 -310
  63. package/esm2022/lib/dialog//311/265workbench-dialog.service.mjs +0 -98
  64. package/esm2022/lib/executor/latest-task-executor.mjs +0 -55
  65. package/esm2022/lib/executor/single-task-executor.mjs +0 -72
  66. package/esm2022/lib/filter-field/filter-field.component.mjs +0 -130
  67. package/esm2022/lib/glass-pane/blockable.mjs +0 -11
  68. package/esm2022/lib/glass-pane/blocking.mjs +0 -11
  69. package/esm2022/lib/glass-pane/glass-pane.directive.mjs +0 -120
  70. package/esm2022/lib/layout/grid-element/grid-element.component.mjs +0 -111
  71. package/esm2022/lib/layout/main-area-layout/main-area-layout.component.mjs +0 -97
  72. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v2.model.mjs +0 -11
  73. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v3.model.mjs +0 -11
  74. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v4.model.mjs +0 -11
  75. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v5.model.mjs +0 -11
  76. package/esm2022/lib/layout/migration/workbench-layout-migration-v3.service.mjs +0 -117
  77. package/esm2022/lib/layout/migration/workbench-layout-migration-v4.service.mjs +0 -57
  78. package/esm2022/lib/layout/migration/workbench-layout-migration-v5.service.mjs +0 -67
  79. package/esm2022/lib/layout/public_api.mjs +0 -12
  80. package/esm2022/lib/layout/stringifier.mjs +0 -70
  81. package/esm2022/lib/layout/workbench-layout.component.mjs +0 -90
  82. package/esm2022/lib/layout/workbench-layout.factory.mjs +0 -24
  83. package/esm2022/lib/layout/workbench-layout.mjs +0 -16
  84. package/esm2022/lib/layout/workbench-layout.model.mjs +0 -62
  85. package/esm2022/lib/layout/workbench-layout.service.mjs +0 -68
  86. package/esm2022/lib/layout/workbench-layouts.util.mjs +0 -58
  87. package/esm2022/lib/layout/workench-layout-serializer.service.mjs +0 -109
  88. package/esm2022/lib/layout//311/265workbench-layout.factory.mjs +0 -54
  89. package/esm2022/lib/layout//311/265workbench-layout.mjs +0 -876
  90. package/esm2022/lib/logging/console-appender.service.mjs +0 -46
  91. package/esm2022/lib/logging/index.mjs +0 -15
  92. package/esm2022/lib/logging/logger-names.mjs +0 -32
  93. package/esm2022/lib/logging/logger.mjs +0 -36
  94. package/esm2022/lib/logging/logging-support.mjs +0 -26
  95. package/esm2022/lib/logging/logging.model.mjs +0 -45
  96. package/esm2022/lib/logging/public_api.mjs +0 -12
  97. package/esm2022/lib/logging//311/265logger.mjs +0 -73
  98. package/esm2022/lib/message-box/message-box-footer/message-box-footer.component.mjs +0 -69
  99. package/esm2022/lib/message-box/message-box-header/message-box-header.component.mjs +0 -28
  100. package/esm2022/lib/message-box/public_api.mjs +0 -11
  101. package/esm2022/lib/message-box/workbench-message-box.component.mjs +0 -102
  102. package/esm2022/lib/message-box/workbench-message-box.options.mjs +0 -2
  103. package/esm2022/lib/message-box/workbench-message-box.service.mjs +0 -39
  104. package/esm2022/lib/message-box//311/265workbench-message-box.service.mjs +0 -45
  105. package/esm2022/lib/microfrontend-platform/common/microfrontend.util.mjs +0 -71
  106. package/esm2022/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.mjs +0 -126
  107. package/esm2022/lib/microfrontend-platform/initialization/ng-zone-observable-decorator.mjs +0 -36
  108. package/esm2022/lib/microfrontend-platform/initialization/workbench-host-manifest-interceptor.service.mjs +0 -84
  109. package/esm2022/lib/microfrontend-platform/manifest-object-cache.service.mjs +0 -63
  110. package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-capability-validator.interceptor.mjs +0 -54
  111. package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-intent-handler.interceptor.mjs +0 -85
  112. package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog.component.mjs +0 -140
  113. package/esm2022/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.mjs +0 -133
  114. package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/microfrontend-host-message-box.component.mjs +0 -113
  115. package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/text-message/text-message.component.mjs +0 -43
  116. package/esm2022/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.mjs +0 -101
  117. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-capability-validator.interceptor.mjs +0 -35
  118. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-intent-handler.interceptor.mjs +0 -88
  119. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-legacy-intent-translator.interceptor.mjs +0 -32
  120. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box.component.mjs +0 -121
  121. package/esm2022/lib/microfrontend-platform/microfrontend-notification/microfrontend-notification-intent-handler.service.mjs +0 -45
  122. package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-capability-validator.interceptor.mjs +0 -39
  123. package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-installer.service.mjs +0 -120
  124. package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-intent-handler.interceptor.mjs +0 -55
  125. package/esm2022/lib/microfrontend-platform/microfrontend-perspective/workbench-perspective-data.mjs +0 -19
  126. package/esm2022/lib/microfrontend-platform/microfrontend-platform-config-loader.mjs +0 -13
  127. package/esm2022/lib/microfrontend-platform/microfrontend-platform.config.mjs +0 -11
  128. package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-capability-validator.interceptor.mjs +0 -31
  129. package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.mjs +0 -132
  130. package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.mjs +0 -115
  131. package/esm2022/lib/microfrontend-platform/microfrontend-splash/microfrontend-splash.component.mjs +0 -21
  132. package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.mjs +0 -112
  133. package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.mjs +0 -313
  134. package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-workbench-view.model.mjs +0 -23
  135. package/esm2022/lib/microfrontend-platform/public_api.mjs +0 -13
  136. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-validator.interceptor.mjs +0 -31
  137. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.mjs +0 -127
  138. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-routes.mjs +0 -125
  139. package/esm2022/lib/microfrontend-platform/stable-capability-id-assigner.interceptor.mjs +0 -32
  140. package/esm2022/lib/microfrontend-platform/workbench-microfrontend-support.mjs +0 -191
  141. package/esm2022/lib/migration/workbench-migration.mjs +0 -11
  142. package/esm2022/lib/migration/workbench-migrator.mjs +0 -38
  143. package/esm2022/lib/notification/notification-css-classes.pipe.mjs +0 -24
  144. package/esm2022/lib/notification/notification-list.component.mjs +0 -51
  145. package/esm2022/lib/notification/notification.component.mjs +0 -109
  146. package/esm2022/lib/notification/notification.config.mjs +0 -11
  147. package/esm2022/lib/notification/notification.mjs +0 -19
  148. package/esm2022/lib/notification/notification.service.mjs +0 -134
  149. package/esm2022/lib/notification/public_api.mjs +0 -12
  150. package/esm2022/lib/notification/text-notification.component.mjs +0 -23
  151. package/esm2022/lib/notification//311/265notification.mjs +0 -42
  152. package/esm2022/lib/page-not-found/page-not-found.component.mjs +0 -26
  153. package/esm2022/lib/part/part-action-bar/part-action-bar.component.mjs +0 -31
  154. package/esm2022/lib/part/part-action-bar/part-action.directive.mjs +0 -77
  155. package/esm2022/lib/part/part-bar/part-bar.component.mjs +0 -444
  156. package/esm2022/lib/part/part-portal.pipe.mjs +0 -35
  157. package/esm2022/lib/part/part.component.mjs +0 -135
  158. package/esm2022/lib/part/public_api.mjs +0 -13
  159. package/esm2022/lib/part/view-context-menu/accelerator-format.pipe.mjs +0 -31
  160. package/esm2022/lib/part/view-context-menu/text.component.mjs +0 -38
  161. package/esm2022/lib/part/view-context-menu/view-menu.component.mjs +0 -89
  162. package/esm2022/lib/part/view-context-menu/view-menu.directive.mjs +0 -76
  163. package/esm2022/lib/part/view-context-menu/view-menu.service.mjs +0 -340
  164. package/esm2022/lib/part/view-list/view-list.component.mjs +0 -117
  165. package/esm2022/lib/part/view-list-button/view-list-button.component.mjs +0 -82
  166. package/esm2022/lib/part/view-list-item/view-list-item.component.mjs +0 -60
  167. package/esm2022/lib/part/view-tab/view-tab.component.mjs +0 -218
  168. package/esm2022/lib/part/view-tab-content/view-tab-content.component.mjs +0 -29
  169. package/esm2022/lib/part/view-tab-drag-image/view-tab-drag-image.component.mjs +0 -81
  170. package/esm2022/lib/part/workbench-part-action.registry.mjs +0 -23
  171. package/esm2022/lib/part/workbench-part.model.mjs +0 -19
  172. package/esm2022/lib/part/workbench-part.registry.mjs +0 -23
  173. package/esm2022/lib/part//311/265workbench-part.model.mjs +0 -146
  174. package/esm2022/lib/perspective/migration/model/workbench-perspective-migration-v1.model.mjs +0 -11
  175. package/esm2022/lib/perspective/migration/model/workbench-perspective-migration-v2.model.mjs +0 -11
  176. package/esm2022/lib/perspective/migration/workbench-perspective-migration-v2.service.mjs +0 -57
  177. package/esm2022/lib/perspective/public_api.mjs +0 -11
  178. package/esm2022/lib/perspective/workbench-grid-merger.service.mjs +0 -39
  179. package/esm2022/lib/perspective/workbench-perspective-storage.service.mjs +0 -72
  180. package/esm2022/lib/perspective/workbench-perspective-view-conflict-resolver.service.mjs +0 -50
  181. package/esm2022/lib/perspective/workbench-perspective.model.mjs +0 -2
  182. package/esm2022/lib/perspective/workbench-perspective.registry.mjs +0 -23
  183. package/esm2022/lib/perspective/workbench-perspective.service.mjs +0 -180
  184. package/esm2022/lib/perspective/workench-perspective-serializer.service.mjs +0 -62
  185. package/esm2022/lib/perspective//311/265workbench-perspective.model.mjs +0 -210
  186. package/esm2022/lib/popup/popup.component.mjs +0 -124
  187. package/esm2022/lib/popup/popup.config.mjs +0 -100
  188. package/esm2022/lib/popup/popup.origin.mjs +0 -11
  189. package/esm2022/lib/popup/popup.service.mjs +0 -339
  190. package/esm2022/lib/popup/public_api.mjs +0 -12
  191. package/esm2022/lib/portal/wb-component-portal.mjs +0 -130
  192. package/esm2022/lib/portal/workbench-portal-outlet.directive.mjs +0 -68
  193. package/esm2022/lib/public_api.mjs +0 -32
  194. package/esm2022/lib/registry/workbench-object-registry.mjs +0 -104
  195. package/esm2022/lib/routing/empty-outlet/empty-outlet.component.mjs +0 -31
  196. package/esm2022/lib/routing/public_api.mjs +0 -14
  197. package/esm2022/lib/routing/routing.model.mjs +0 -11
  198. package/esm2022/lib/routing/routing.util.mjs +0 -215
  199. package/esm2022/lib/routing/url-segment-matcher.mjs +0 -46
  200. package/esm2022/lib/routing/workbench-auxiliary-route-installer.service.mjs +0 -110
  201. package/esm2022/lib/routing/workbench-dialog-differ.mjs +0 -51
  202. package/esm2022/lib/routing/workbench-layout-differ.mjs +0 -61
  203. package/esm2022/lib/routing/workbench-message-box-differ.mjs +0 -51
  204. package/esm2022/lib/routing/workbench-navigational-states.mjs +0 -33
  205. package/esm2022/lib/routing/workbench-popup-differ.mjs +0 -51
  206. package/esm2022/lib/routing/workbench-route-data.mjs +0 -39
  207. package/esm2022/lib/routing/workbench-route-guards.mjs +0 -57
  208. package/esm2022/lib/routing/workbench-router-link.directive.mjs +0 -124
  209. package/esm2022/lib/routing/workbench-router.service.mjs +0 -19
  210. package/esm2022/lib/routing/workbench-url-observer.service.mjs +0 -305
  211. package/esm2022/lib/routing/workbench-view-outlet-differ.mjs +0 -58
  212. package/esm2022/lib/routing//311/265location.mjs +0 -70
  213. package/esm2022/lib/routing//311/265workbench-router.service.mjs +0 -359
  214. package/esm2022/lib/startup/public_api.mjs +0 -12
  215. package/esm2022/lib/startup/splash/splash.component.mjs +0 -24
  216. package/esm2022/lib/startup/workbench-initializer.mjs +0 -96
  217. package/esm2022/lib/startup/workbench-launcher.service.mjs +0 -173
  218. package/esm2022/lib/storage/public_api.mjs +0 -11
  219. package/esm2022/lib/storage/workbench-storage.mjs +0 -37
  220. package/esm2022/lib/testing/public_api.mjs +0 -12
  221. package/esm2022/lib/testing/workbench-testing.module.mjs +0 -49
  222. package/esm2022/lib/testing/workbench.provider.mjs +0 -60
  223. package/esm2022/lib/theme/workbench-theme-switcher.service.mjs +0 -72
  224. package/esm2022/lib/view/public_api.mjs +0 -11
  225. package/esm2022/lib/view/view-context-provider.mjs +0 -31
  226. package/esm2022/lib/view/view-move-handler.service.mjs +0 -145
  227. package/esm2022/lib/view/view-portal.pipe.mjs +0 -33
  228. package/esm2022/lib/view/view.component.mjs +0 -128
  229. package/esm2022/lib/view/workbench-view.model.mjs +0 -12
  230. package/esm2022/lib/view/workbench-view.registry.mjs +0 -23
  231. package/esm2022/lib/view//311/265workbench-view.model.mjs +0 -375
  232. package/esm2022/lib/view-dnd/grid-drop-targets.util.mjs +0 -49
  233. package/esm2022/lib/view-dnd/requires-drop-zone.pipe.mjs +0 -58
  234. package/esm2022/lib/view-dnd/view-drag.service.mjs +0 -213
  235. package/esm2022/lib/view-dnd/view-drop-placeholder-renderer.service.mjs +0 -89
  236. package/esm2022/lib/view-dnd/view-drop-zone.directive.mjs +0 -183
  237. package/esm2022/lib/view-dnd/view-tab-drag-image-renderer.service.mjs +0 -224
  238. package/esm2022/lib/workbench-config.mjs +0 -15
  239. package/esm2022/lib/workbench-id.mjs +0 -21
  240. package/esm2022/lib/workbench.component.mjs +0 -146
  241. package/esm2022/lib/workbench.constants.mjs +0 -41
  242. package/esm2022/lib/workbench.model.mjs +0 -11
  243. package/esm2022/lib/workbench.module.mjs +0 -101
  244. package/esm2022/lib/workbench.provider.mjs +0 -111
  245. package/esm2022/lib/workbench.service.mjs +0 -29
  246. package/esm2022/lib//311/265workbench.service.mjs +0 -102
  247. package/esm2022/public-api.mjs +0 -14
  248. package/esm2022/scion-workbench.mjs +0 -5
  249. package/lib/common/animation-frame.observable.d.ts +0 -10
  250. package/lib/testing/public_api.d.ts +0 -2
  251. package/lib/testing/workbench-testing.module.d.ts +0 -40
  252. package/lib/testing/workbench.provider.d.ts +0 -31
  253. package/lib/workbench.module.d.ts +0 -65
@@ -1,70 +0,0 @@
1
- /*
2
- * Copyright (c) 2018-2023 Swiss Federal Railways
3
- *
4
- * This program and the accompanying materials are made
5
- * available under the terms of the Eclipse Public License 2.0
6
- * which is available at https://www.eclipse.org/legal/epl-2.0/
7
- *
8
- * SPDX-License-Identifier: EPL-2.0
9
- */
10
- import { Location, LocationStrategy } from '@angular/common';
11
- import { ApplicationRef, inject, Injectable, makeEnvironmentProviders } from '@angular/core';
12
- import { Router } from '@angular/router';
13
- import { WorkbenchNavigationalStates } from './workbench-navigational-states';
14
- import * as i0 from "@angular/core";
15
- /**
16
- * Provides a set of DI providers to patch {@link Location} for the Angular router to always add workbench navigations
17
- * to the browsing history stack.
18
- *
19
- * @see ɵLocation
20
- */
21
- export function provideLocationPatch() {
22
- return makeEnvironmentProviders([
23
- {
24
- provide: Location,
25
- useClass: ɵLocation,
26
- },
27
- ]);
28
- }
29
- /**
30
- * Patches {@link Location} for the Angular router to always add workbench navigations to the browsing history stack,
31
- * even if the URL does not change.
32
- *
33
- * Rationale:
34
- * If only the layout of the workbench grid is changed, the URL does not change because the layout is passed to the
35
- * navigation as state and not as a query parameter. By default, an unchanged URL does not create a new entry in the
36
- * browsing history stack, but replaces the current entry. See Angular router.ts#setBrowserUrl
37
- */
38
- class ɵLocation extends Location {
39
- constructor() {
40
- super(inject(LocationStrategy));
41
- this._appRef = inject(ApplicationRef);
42
- }
43
- isCurrentPathEqualTo(path, query) {
44
- return super.isCurrentPathEqualTo(path, query) ? !this.isWorkbenchNavigation() : false;
45
- }
46
- /**
47
- * Indicates whether the current navigation is a workbench navigation performed through the workbench router.
48
- */
49
- isWorkbenchNavigation() {
50
- const currentNavigation = this.router?.getCurrentNavigation() ?? null;
51
- return currentNavigation !== null && WorkbenchNavigationalStates.fromNavigation(currentNavigation) !== null;
52
- }
53
- /**
54
- * Reference to the Angular router.
55
- */
56
- get router() {
57
- // Note that we cannot inject the `Router` in the constructor because the `Router` depends on `Location`,
58
- // which would cause a circular dependency at construction time. Instead, we inject the router lazy.
59
- // However, injecting the router will fail if the platform has already been destroyed, which happens
60
- // in tests that tear down before the initial navigation has finished. To avoid this error, we inject
61
- // the router only if the platform is still running.
62
- return (this._router ??= !this._appRef.destroyed ? this._appRef.injector.get(Router) : undefined);
63
- }
64
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ɵLocation, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
65
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ɵLocation }); }
66
- }
67
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ɵLocation, decorators: [{
68
- type: Injectable
69
- }], ctorParameters: () => [] });
70
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiybVsb2NhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL3JvdXRpbmcvybVsb2NhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxRQUFRLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRCxPQUFPLEVBQUMsY0FBYyxFQUF3QixNQUFNLEVBQUUsVUFBVSxFQUFFLHdCQUF3QixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQzs7QUFFNUU7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CO0lBQ2xDLE9BQU8sd0JBQXdCLENBQUM7UUFDOUI7WUFDRSxPQUFPLEVBQUUsUUFBUTtZQUNqQixRQUFRLEVBQUUsU0FBUztTQUNwQjtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQ00sU0FBVSxTQUFRLFFBQVE7SUFLOUI7UUFDRSxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUoxQixZQUFPLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBS3pDLENBQUM7SUFFZSxvQkFBb0IsQ0FBQyxJQUFZLEVBQUUsS0FBYztRQUMvRCxPQUFPLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUN6RixDQUFDO0lBRUQ7O09BRUc7SUFDSyxxQkFBcUI7UUFDM0IsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLG9CQUFvQixFQUFFLElBQUksSUFBSSxDQUFDO1FBQ3RFLE9BQU8saUJBQWlCLEtBQUssSUFBSSxJQUFJLDJCQUEyQixDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLElBQUksQ0FBQztJQUM5RyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFZLE1BQU07UUFDaEIseUdBQXlHO1FBQ3pHLG9HQUFvRztRQUNwRyxvR0FBb0c7UUFDcEcscUdBQXFHO1FBQ3JHLG9EQUFvRDtRQUNwRCxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7OEdBL0JHLFNBQVM7a0hBQVQsU0FBUzs7MkZBQVQsU0FBUztrQkFEZCxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDIzIFN3aXNzIEZlZGVyYWwgUmFpbHdheXNcbiAqXG4gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlXG4gKiBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMFxuICogd2hpY2ggaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiAqL1xuXG5pbXBvcnQge0xvY2F0aW9uLCBMb2NhdGlvblN0cmF0ZWd5fSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtBcHBsaWNhdGlvblJlZiwgRW52aXJvbm1lbnRQcm92aWRlcnMsIGluamVjdCwgSW5qZWN0YWJsZSwgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Um91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtXb3JrYmVuY2hOYXZpZ2F0aW9uYWxTdGF0ZXN9IGZyb20gJy4vd29ya2JlbmNoLW5hdmlnYXRpb25hbC1zdGF0ZXMnO1xuXG4vKipcbiAqIFByb3ZpZGVzIGEgc2V0IG9mIERJIHByb3ZpZGVycyB0byBwYXRjaCB7QGxpbmsgTG9jYXRpb259IGZvciB0aGUgQW5ndWxhciByb3V0ZXIgdG8gYWx3YXlzIGFkZCB3b3JrYmVuY2ggbmF2aWdhdGlvbnNcbiAqIHRvIHRoZSBicm93c2luZyBoaXN0b3J5IHN0YWNrLlxuICpcbiAqIEBzZWUgybVMb2NhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZUxvY2F0aW9uUGF0Y2goKTogRW52aXJvbm1lbnRQcm92aWRlcnMge1xuICByZXR1cm4gbWFrZUVudmlyb25tZW50UHJvdmlkZXJzKFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBMb2NhdGlvbixcbiAgICAgIHVzZUNsYXNzOiDJtUxvY2F0aW9uLFxuICAgIH0sXG4gIF0pO1xufVxuXG4vKipcbiAqIFBhdGNoZXMge0BsaW5rIExvY2F0aW9ufSBmb3IgdGhlIEFuZ3VsYXIgcm91dGVyIHRvIGFsd2F5cyBhZGQgd29ya2JlbmNoIG5hdmlnYXRpb25zIHRvIHRoZSBicm93c2luZyBoaXN0b3J5IHN0YWNrLFxuICogZXZlbiBpZiB0aGUgVVJMIGRvZXMgbm90IGNoYW5nZS5cbiAqXG4gKiBSYXRpb25hbGU6XG4gKiBJZiBvbmx5IHRoZSBsYXlvdXQgb2YgdGhlIHdvcmtiZW5jaCBncmlkIGlzIGNoYW5nZWQsIHRoZSBVUkwgZG9lcyBub3QgY2hhbmdlIGJlY2F1c2UgdGhlIGxheW91dCBpcyBwYXNzZWQgdG8gdGhlXG4gKiBuYXZpZ2F0aW9uIGFzIHN0YXRlIGFuZCBub3QgYXMgYSBxdWVyeSBwYXJhbWV0ZXIuIEJ5IGRlZmF1bHQsIGFuIHVuY2hhbmdlZCBVUkwgZG9lcyBub3QgY3JlYXRlIGEgbmV3IGVudHJ5IGluIHRoZVxuICogYnJvd3NpbmcgaGlzdG9yeSBzdGFjaywgYnV0IHJlcGxhY2VzIHRoZSBjdXJyZW50IGVudHJ5LiBTZWUgQW5ndWxhciByb3V0ZXIudHMjc2V0QnJvd3NlclVybFxuICovXG5ASW5qZWN0YWJsZSgvKiBETyBOT1QgUFJPVklERSB2aWEgJ3Byb3ZpZGVkSW4nIG1ldGFkYXRhIGFzIHJlZ2lzdGVyZWQgdW5kZXIgYExvY2F0aW9uYCBESSB0b2tlbi4gKi8pXG5jbGFzcyDJtUxvY2F0aW9uIGV4dGVuZHMgTG9jYXRpb24ge1xuXG4gIHByaXZhdGUgX2FwcFJlZiA9IGluamVjdChBcHBsaWNhdGlvblJlZik7XG4gIHByaXZhdGUgX3JvdXRlcjogUm91dGVyIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGluamVjdChMb2NhdGlvblN0cmF0ZWd5KSk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgaXNDdXJyZW50UGF0aEVxdWFsVG8ocGF0aDogc3RyaW5nLCBxdWVyeT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci5pc0N1cnJlbnRQYXRoRXF1YWxUbyhwYXRoLCBxdWVyeSkgPyAhdGhpcy5pc1dvcmtiZW5jaE5hdmlnYXRpb24oKSA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjdXJyZW50IG5hdmlnYXRpb24gaXMgYSB3b3JrYmVuY2ggbmF2aWdhdGlvbiBwZXJmb3JtZWQgdGhyb3VnaCB0aGUgd29ya2JlbmNoIHJvdXRlci5cbiAgICovXG4gIHByaXZhdGUgaXNXb3JrYmVuY2hOYXZpZ2F0aW9uKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGN1cnJlbnROYXZpZ2F0aW9uID0gdGhpcy5yb3V0ZXI/LmdldEN1cnJlbnROYXZpZ2F0aW9uKCkgPz8gbnVsbDtcbiAgICByZXR1cm4gY3VycmVudE5hdmlnYXRpb24gIT09IG51bGwgJiYgV29ya2JlbmNoTmF2aWdhdGlvbmFsU3RhdGVzLmZyb21OYXZpZ2F0aW9uKGN1cnJlbnROYXZpZ2F0aW9uKSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgdG8gdGhlIEFuZ3VsYXIgcm91dGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgcm91dGVyKCk6IFJvdXRlciB8IHVuZGVmaW5lZCB7XG4gICAgLy8gTm90ZSB0aGF0IHdlIGNhbm5vdCBpbmplY3QgdGhlIGBSb3V0ZXJgIGluIHRoZSBjb25zdHJ1Y3RvciBiZWNhdXNlIHRoZSBgUm91dGVyYCBkZXBlbmRzIG9uIGBMb2NhdGlvbmAsXG4gICAgLy8gd2hpY2ggd291bGQgY2F1c2UgYSBjaXJjdWxhciBkZXBlbmRlbmN5IGF0IGNvbnN0cnVjdGlvbiB0aW1lLiBJbnN0ZWFkLCB3ZSBpbmplY3QgdGhlIHJvdXRlciBsYXp5LlxuICAgIC8vIEhvd2V2ZXIsIGluamVjdGluZyB0aGUgcm91dGVyIHdpbGwgZmFpbCBpZiB0aGUgcGxhdGZvcm0gaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQsIHdoaWNoIGhhcHBlbnNcbiAgICAvLyBpbiB0ZXN0cyB0aGF0IHRlYXIgZG93biBiZWZvcmUgdGhlIGluaXRpYWwgbmF2aWdhdGlvbiBoYXMgZmluaXNoZWQuIFRvIGF2b2lkIHRoaXMgZXJyb3IsIHdlIGluamVjdFxuICAgIC8vIHRoZSByb3V0ZXIgb25seSBpZiB0aGUgcGxhdGZvcm0gaXMgc3RpbGwgcnVubmluZy5cbiAgICByZXR1cm4gKHRoaXMuX3JvdXRlciA/Pz0gIXRoaXMuX2FwcFJlZi5kZXN0cm95ZWQgPyB0aGlzLl9hcHBSZWYuaW5qZWN0b3IuZ2V0KFJvdXRlcikgOiB1bmRlZmluZWQpO1xuICB9XG59XG4iXX0=
@@ -1,359 +0,0 @@
1
- /*
2
- * Copyright (c) 2018-2024 Swiss Federal Railways
3
- *
4
- * This program and the accompanying materials are made
5
- * available under the terms of the Eclipse Public License 2.0
6
- * which is available at https://www.eclipse.org/legal/epl-2.0/
7
- *
8
- * SPDX-License-Identifier: EPL-2.0
9
- */
10
- import { Router } from '@angular/router';
11
- import { Defined } from '@scion/toolkit/util';
12
- import { assertNotInReactiveContext, inject, Injectable, Injector, NgZone, runInInjectionContext } from '@angular/core';
13
- import { WorkbenchLayoutService } from '../layout/workbench-layout.service';
14
- import { MAIN_AREA_LAYOUT_QUERY_PARAM } from '../workbench.constants';
15
- import { ANGULAR_ROUTER_MUTEX, SingleTaskExecutor } from '../executor/single-task-executor';
16
- import { firstValueFrom } from 'rxjs';
17
- import { WorkbenchNavigationalStates } from './workbench-navigational-states';
18
- import { Routing } from './routing.util';
19
- import { UrlSegmentMatcher } from './url-segment-matcher';
20
- import { Objects } from '../common/objects.util';
21
- import { WORKBENCH_VIEW_REGISTRY } from '../view/workbench-view.registry';
22
- import * as i0 from "@angular/core";
23
- /** @inheritDoc */
24
- export class ɵWorkbenchRouter {
25
- constructor() {
26
- this._router = inject(Router);
27
- this._workbenchLayoutService = inject(WorkbenchLayoutService);
28
- this._workbenchViewRegistry = inject(WORKBENCH_VIEW_REGISTRY);
29
- this._injector = inject(Injector);
30
- this._zone = inject(NgZone);
31
- /** Mutex to serialize Workbench Router navigation requests, preventing race conditions when modifying the active workbench layout to operate on the most-recent layout. */
32
- this._workbenchRouterMutex = new SingleTaskExecutor();
33
- /** Mutex to serialize Angular Router navigation requests, preventing the cancellation of previously initiated asynchronous navigations. */
34
- this._angularRouterMutex = inject(ANGULAR_ROUTER_MUTEX);
35
- /** Holds the current navigational context during a workbench navigation, or `null` if no navigation is in progress. */
36
- this._currentNavigationContext = null;
37
- // Instruct the Angular router to process navigations that do not change the current URL, i.e., when only updating navigation state.
38
- // For example, the workbench grid is passed to the navigation as state, not as a query parameter. Without this flag set, changes to
39
- // the workbench grid would not be added to the browsing history stack.
40
- // Although the `onSameUrlNavigation` flag can be set per navigation via the navigation extras, this is not sufficient because the
41
- // Angular router ignores it when navigating back and forth in the browsing history.
42
- // See Angular router.ts#setUpLocationChangeListener and router.ts#navigateToSyncWithBrowser
43
- this._router.onSameUrlNavigation = 'reload';
44
- }
45
- async navigate(commandsOrNavigateFn, extras) {
46
- assertNotInReactiveContext(this.navigate, 'Call WorkbenchRouter.navigate() in a non-reactive (non-tracking) context, such as within the untracked() function.');
47
- // Ensure to run in Angular zone.
48
- if (!NgZone.isInAngularZone()) {
49
- return this._zone.run(() => this.navigate(commandsOrNavigateFn, extras));
50
- }
51
- const navigateFn = typeof commandsOrNavigateFn === 'function' ? commandsOrNavigateFn : createNavigationFromCommands(commandsOrNavigateFn, extras ?? {});
52
- // Serialize navigation requests to avoid race conditions when modifying the active workbench layout, ensuring layout operations are performed on the most-recent layout.
53
- const newLayout = await this._workbenchRouterMutex.submit(async () => {
54
- // Wait until the initial layout is available, i.e., after completion of Angular's initial navigation.
55
- // Otherwise, this navigation would override the initial layout as given in the URL.
56
- if (!this._workbenchLayoutService.layout()) {
57
- await this.waitForInitialLayout();
58
- }
59
- // Let the navigator compute the new workbench layout.
60
- const currentLayout = this._workbenchLayoutService.layout();
61
- let newLayout = await runInInjectionContext(this._injector, () => navigateFn(currentLayout));
62
- if (!newLayout) {
63
- return null;
64
- }
65
- // Remove views marked for removal that have no `CanClose` guard.
66
- // Views with a `CanClose` guard are removed later, outside the navigation mutex, to avoid blocking the workbench router.
67
- newLayout = this.removeViewsWithoutGuard(newLayout);
68
- // Skip navigation if the layout has not changed, such as when only closing views with a `CanClose` guard.
69
- if (newLayout.equals(currentLayout, { excludeViewMarkedForRemoval: true })) {
70
- return newLayout;
71
- }
72
- // Create extras with workbench navigation instructions.
73
- extras = createNavigationExtras({ newLayout, currentLayout }, extras);
74
- // Perform the navigation.
75
- const commands = computeNavigationCommands(currentLayout.viewOutlets(), newLayout.viewOutlets());
76
- if (!await this._angularRouterMutex.submit(() => this._router.navigate(commands, extras))) {
77
- return null;
78
- }
79
- // Block subsequent navigation(s) until Angular has flushed the changed layout to the DOM.
80
- await firstValueFrom(this._zone.onStable);
81
- return newLayout;
82
- });
83
- if (!newLayout) {
84
- return false;
85
- }
86
- // Remove views marked for removal, confirming closing by calling each view's `CanClose` guard.
87
- return this.scheduleViewRemoval(newLayout);
88
- }
89
- /**
90
- * Performs changes to the current workbench layout.
91
- *
92
- * Unlike {@link navigate}, does not perform the navigation but returns the URL tree instead.
93
- *
94
- * The router will invoke the callback and pass the current layout for modification. The callback can call `inject` to get any required dependencies.
95
- *
96
- * The following example adds a part to the left of the main area, inserts a view and navigates it.
97
- *
98
- * ```ts
99
- * inject(WorkbenchRouter).createUrlTree(layout => layout
100
- * .addPart('left', {relativeTo: MAIN_AREA, align: 'left'})
101
- * .addView('navigator', {partId: 'left'})
102
- * .navigateView('navigator', ['path/to/view'])
103
- * .activateView('navigator'),
104
- * );
105
- * ```
106
- *
107
- * @param onNavigate - Specifies the callback to modify the layout.
108
- * @param extras - Controls how to perform the navigation.
109
- * @see NavigateFn
110
- */
111
- async createUrlTree(onNavigate, extras) {
112
- assertNotInReactiveContext(this.createUrlTree, 'Call WorkbenchRouter.createUrlTree() in a non-reactive (non-tracking) context, such as within the untracked() function.');
113
- // Ensure to run in Angular zone.
114
- if (!NgZone.isInAngularZone()) {
115
- return this._zone.run(() => this.createUrlTree(onNavigate, extras));
116
- }
117
- // Serialize navigation requests to avoid race conditions when modifying the active workbench layout, ensuring layout operations are performed on the most-recent layout.
118
- return this._workbenchRouterMutex.submit(async () => {
119
- // Wait until the initial layout is available, i.e., after completion of Angular's initial navigation.
120
- // Otherwise, would override the initial layout as given in the URL.
121
- if (!this._workbenchLayoutService.layout()) {
122
- await this.waitForInitialLayout();
123
- }
124
- // Let the navigator compute the new workbench layout.
125
- const currentLayout = this._workbenchLayoutService.layout();
126
- let newLayout = await runInInjectionContext(this._injector, () => onNavigate(currentLayout));
127
- if (!newLayout) {
128
- return null;
129
- }
130
- // Remove views marked for removal.
131
- newLayout.views({ markedForRemoval: true }).forEach(view => {
132
- newLayout = newLayout.removeView(view.id, { force: true });
133
- });
134
- // Create extras with workbench navigation instructions.
135
- extras = createNavigationExtras({ newLayout, currentLayout }, extras);
136
- // Create the new URL tree.
137
- const commands = computeNavigationCommands(currentLayout.viewOutlets(), newLayout.viewOutlets());
138
- return this._router.createUrlTree(commands, extras);
139
- });
140
- }
141
- /**
142
- * Remove views marked for removal that have no `CanClose` guard.
143
- */
144
- removeViewsWithoutGuard(layout) {
145
- return layout.views({ markedForRemoval: true }).reduce((layout, mView) => {
146
- const view = this._workbenchViewRegistry.get(mView.id, { orElse: null });
147
- if (!view || (view.closable() && !view.canCloseGuard)) {
148
- return layout.removeView(mView.id, { force: true });
149
- }
150
- return layout;
151
- }, layout);
152
- }
153
- /**
154
- * Removes views marked for removal, confirming closing by calling each view's `CanClose` guard.
155
- *
156
- * Guards are executed in parallel, and views are removed in separate navigations.
157
- *
158
- * @return a Promise that resolves to `true` when all marked views were successfully closed or declined closing.
159
- */
160
- async scheduleViewRemoval(layout) {
161
- const navigations = layout.views({ markedForRemoval: true })
162
- .map(mView => this._workbenchViewRegistry.get(mView.id, { orElse: null }))
163
- .filter((view) => !!view && view.closable())
164
- .map(async (view) => {
165
- // Capture current navigation id to not proceed closing if navigated in the meantime.
166
- const navigationId = view.navigationId;
167
- // Make view non-closable to prevent closing the view again while awaiting closing confirmation.
168
- view.closable = false;
169
- try {
170
- const close = await view.canCloseGuard();
171
- if (close && view.navigationId === navigationId) {
172
- return this.navigate(layout => layout.removeView(view.id, { force: true }));
173
- }
174
- return true;
175
- }
176
- finally {
177
- view.closable = true;
178
- }
179
- });
180
- // Wait for all `CanClose` guards to resolve and subsequent navigations to complete.
181
- return (await Promise.all(navigations)).every(Boolean);
182
- }
183
- /**
184
- * Returns the context of the current workbench navigation, when being invoked during navigation, or throws an error otherwise.
185
- */
186
- getCurrentNavigationContext() {
187
- if (!this._currentNavigationContext) {
188
- throw Error('[NavigateError] Navigation context not available because no navigation is in progress.');
189
- }
190
- return this._currentNavigationContext;
191
- }
192
- /**
193
- * Sets navigational contextual data.
194
- */
195
- setCurrentNavigationContext(context) {
196
- this._currentNavigationContext = context;
197
- }
198
- /**
199
- * Blocks until the initial layout is available, i.e. after completion of Angular's initial navigation.
200
- */
201
- async waitForInitialLayout() {
202
- await firstValueFrom(this._workbenchLayoutService.layout$);
203
- }
204
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ɵWorkbenchRouter, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
205
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ɵWorkbenchRouter, providedIn: 'root' }); }
206
- }
207
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ɵWorkbenchRouter, decorators: [{
208
- type: Injectable,
209
- args: [{ providedIn: 'root' }]
210
- }], ctorParameters: () => [] });
211
- /**
212
- * Creates a navigation to navigate view(s) based on the provided array of commands and extras.
213
- */
214
- function createNavigationFromCommands(commands, extras) {
215
- return (layout) => {
216
- if (extras.close) {
217
- if (extras.target) {
218
- if (commands.length || extras.hint || extras.partId || extras.relativeTo) {
219
- throw Error('[NavigateError] Commands, hint, part or relativeTo must not be set when closing a view by id.');
220
- }
221
- return layout.removeView(extras.target);
222
- }
223
- const urlSegments = Routing.commandsToSegments(commands, { relativeTo: extras.relativeTo });
224
- return layout
225
- .views({
226
- partId: extras.partId,
227
- segments: new UrlSegmentMatcher(urlSegments, { matchMatrixParams: false, matchWildcardPath: true }),
228
- navigationHint: extras.hint ?? null,
229
- })
230
- .reduce((layout, view) => layout.removeView(view.id), layout);
231
- }
232
- else {
233
- switch (extras.target ?? 'auto') {
234
- case 'blank': {
235
- return addView(layout.computeNextViewId(), layout);
236
- }
237
- case 'auto': {
238
- const urlSegments = Routing.commandsToSegments(commands, { relativeTo: extras.relativeTo });
239
- const views = layout.views({
240
- partId: extras.partId,
241
- segments: new UrlSegmentMatcher(urlSegments, { matchMatrixParams: false, matchWildcardPath: false }),
242
- navigationHint: extras.hint ?? null,
243
- });
244
- if (views.length) {
245
- return views.reduce((layout, view) => updateView(view.id, layout), layout);
246
- }
247
- else {
248
- return addView(layout.computeNextViewId(), layout);
249
- }
250
- }
251
- default: {
252
- const viewId = extras.target;
253
- if (layout.hasView(viewId)) {
254
- return updateView(viewId, layout);
255
- }
256
- else {
257
- return addView(viewId, layout);
258
- }
259
- }
260
- }
261
- }
262
- };
263
- /**
264
- * Adds the specified view to the layout.
265
- */
266
- function addView(viewId, layout) {
267
- // Default to the active part if not specified or not in the layout, with the active part of the main area taking precedence.
268
- const partId = (() => {
269
- if (extras.partId && layout.hasPart(extras.partId)) {
270
- return extras.partId;
271
- }
272
- return layout.activePart({ grid: 'mainArea' })?.id ?? layout.activePart({ grid: 'workbench' }).id;
273
- })();
274
- return layout
275
- .addView(viewId, {
276
- partId: partId,
277
- position: extras.position ?? 'after-active-view',
278
- activateView: extras.activate ?? true,
279
- activatePart: extras.activate ?? true,
280
- })
281
- .navigateView(viewId, commands, {
282
- relativeTo: extras.relativeTo,
283
- hint: extras.hint,
284
- cssClass: extras.cssClass,
285
- data: extras.data,
286
- state: extras.state,
287
- });
288
- }
289
- /**
290
- * Updates the specified view.
291
- */
292
- function updateView(viewId, layout) {
293
- if (extras.activate ?? true) {
294
- layout = layout.activateView(viewId, { activatePart: true });
295
- }
296
- return layout.navigateView(viewId, commands, {
297
- relativeTo: extras.relativeTo,
298
- hint: extras.hint,
299
- cssClass: extras.cssClass,
300
- data: extras.data,
301
- state: extras.state,
302
- });
303
- }
304
- }
305
- /**
306
- * Creates navigation extras with workbench navigation instructions.
307
- */
308
- function createNavigationExtras(layouts, extras) {
309
- const { newLayout, currentLayout } = layouts;
310
- const { workbenchGrid, mainAreaGrid } = newLayout.serialize({ excludeViewMarkedForRemoval: true });
311
- // IMPORTANT: Update `ɵWorkbenchLayout.equals` function when adding new state properties.
312
- return {
313
- ...extras,
314
- // Instruct the Angular router to process the navigation even if the URL does not change, e.g., when changing the workbench grid which is not contained in the URL.
315
- onSameUrlNavigation: 'reload',
316
- // Unset `relativeTo` because commands are already normalized to their absolute form.
317
- relativeTo: null,
318
- // Associate workbench-specific state with the navigation.
319
- state: WorkbenchNavigationalStates.create({
320
- workbenchGrid: workbenchGrid,
321
- // Fall back to the current layout's perspective if not specified by the new layout,
322
- // e.g., the navigator provides a new layout to replace the current layout.
323
- perspectiveId: newLayout.perspectiveId ?? currentLayout?.perspectiveId,
324
- maximized: newLayout.maximized,
325
- navigationStates: newLayout.navigationStates(),
326
- }),
327
- // Add the main area as query parameter.
328
- queryParams: { ...extras?.queryParams, [MAIN_AREA_LAYOUT_QUERY_PARAM]: mainAreaGrid },
329
- // Merge with existing query params unless specified an explicit strategy, e.g., for migrating an outdated layout URL.
330
- // Note that `null` is a valid strategy for clearing existing query params, so do not use the nullish coalescing operator (??).
331
- queryParamsHandling: Defined.orElse(extras?.queryParamsHandling, 'merge'),
332
- };
333
- }
334
- /**
335
- * Computes commands that can be passed to the Angular router to navigate view outlets and to remove view outlets of removed views.
336
- */
337
- function computeNavigationCommands(previousViewOutlets, nextViewOutlets) {
338
- const previousViewOutletMap = new Map(Objects.entries(previousViewOutlets));
339
- const nextViewOutletMap = new Map(Objects.entries(nextViewOutlets));
340
- const commands = new Map();
341
- const viewIds = new Set([...previousViewOutletMap.keys(), ...nextViewOutletMap.keys()]);
342
- viewIds.forEach(viewId => {
343
- // Test if the view was added to the layout.
344
- if (!previousViewOutletMap.has(viewId)) {
345
- commands.set(viewId, Routing.segmentsToCommands(nextViewOutletMap.get(viewId)));
346
- }
347
- // Test if the view was removed from the layout.
348
- else if (!nextViewOutletMap.has(viewId)) {
349
- commands.set(viewId, null);
350
- }
351
- // Test if the view was updated.
352
- else if (!new UrlSegmentMatcher(previousViewOutletMap.get(viewId), { matchMatrixParams: true, matchWildcardPath: false }).matches(nextViewOutletMap.get(viewId))) {
353
- commands.set(viewId, Routing.segmentsToCommands(nextViewOutletMap.get(viewId)));
354
- }
355
- });
356
- // Add view commands to the 'outlets' property to be interpreted by the Angular router.
357
- return commands.size ? [{ outlets: Object.fromEntries(commands) }] : [];
358
- }
359
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiybV3b3JrYmVuY2gtcm91dGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi9yb3V0aW5nL8m1d29ya2JlbmNoLXJvdXRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFtQixNQUFNLEVBQXNCLE1BQU0saUJBQWlCLENBQUM7QUFFOUUsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzVDLE9BQU8sRUFBQywwQkFBMEIsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUscUJBQXFCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdEgsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDMUUsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDcEUsT0FBTyxFQUFDLG9CQUFvQixFQUFFLGtCQUFrQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDMUYsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUU1RSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHdkMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQy9DLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDOztBQUd4RSxrQkFBa0I7QUFFbEIsTUFBTSxPQUFPLGdCQUFnQjtJQWMzQjtRQVppQixZQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pCLDRCQUF1QixH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QUFDLE1BQU0sQ0FBRSxFQUFFLEVBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUUsQ0FBQyxFQUFFLENBQUM7WUFDakssUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkYsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsdUZBQXVGO0lBQ3ZGLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3hFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjQgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7TmF2aWdhdGlvbkV4dHJhcywgUm91dGVyLCBVcmxTZWdtZW50LCBVcmxUcmVlfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtXb3JrYmVuY2hSb3V0ZXJ9IGZyb20gJy4vd29ya2JlbmNoLXJvdXRlci5zZXJ2aWNlJztcbmltcG9ydCB7RGVmaW5lZH0gZnJvbSAnQHNjaW9uL3Rvb2xraXQvdXRpbCc7XG5pbXBvcnQge2Fzc2VydE5vdEluUmVhY3RpdmVDb250ZXh0LCBpbmplY3QsIEluamVjdGFibGUsIEluamVjdG9yLCBOZ1pvbmUsIHJ1bkluSW5qZWN0aW9uQ29udGV4dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1dvcmtiZW5jaExheW91dFNlcnZpY2V9IGZyb20gJy4uL2xheW91dC93b3JrYmVuY2gtbGF5b3V0LnNlcnZpY2UnO1xuaW1wb3J0IHtNQUlOX0FSRUFfTEFZT1VUX1FVRVJZX1BBUkFNfSBmcm9tICcuLi93b3JrYmVuY2guY29uc3RhbnRzJztcbmltcG9ydCB7QU5HVUxBUl9ST1VURVJfTVVURVgsIFNpbmdsZVRhc2tFeGVjdXRvcn0gZnJvbSAnLi4vZXhlY3V0b3Ivc2luZ2xlLXRhc2stZXhlY3V0b3InO1xuaW1wb3J0IHtmaXJzdFZhbHVlRnJvbX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1dvcmtiZW5jaE5hdmlnYXRpb25hbFN0YXRlc30gZnJvbSAnLi93b3JrYmVuY2gtbmF2aWdhdGlvbmFsLXN0YXRlcyc7XG5pbXBvcnQge8m1V29ya2JlbmNoTGF5b3V0fSBmcm9tICcuLi9sYXlvdXQvybV3b3JrYmVuY2gtbGF5b3V0JztcbmltcG9ydCB7Um91dGluZ30gZnJvbSAnLi9yb3V0aW5nLnV0aWwnO1xuaW1wb3J0IHtDb21tYW5kcywgVmlld091dGxldHMsIFdvcmtiZW5jaE5hdmlnYXRpb25Db250ZXh0LCBXb3JrYmVuY2hOYXZpZ2F0aW9uRXh0cmFzfSBmcm9tICcuL3JvdXRpbmcubW9kZWwnO1xuaW1wb3J0IHtWaWV3SWR9IGZyb20gJy4uL3ZpZXcvd29ya2JlbmNoLXZpZXcubW9kZWwnO1xuaW1wb3J0IHtVcmxTZWdtZW50TWF0Y2hlcn0gZnJvbSAnLi91cmwtc2VnbWVudC1tYXRjaGVyJztcbmltcG9ydCB7T2JqZWN0c30gZnJvbSAnLi4vY29tbW9uL29iamVjdHMudXRpbCc7XG5pbXBvcnQge1dPUktCRU5DSF9WSUVXX1JFR0lTVFJZfSBmcm9tICcuLi92aWV3L3dvcmtiZW5jaC12aWV3LnJlZ2lzdHJ5JztcbmltcG9ydCB7ybVXb3JrYmVuY2hWaWV3fSBmcm9tICcuLi92aWV3L8m1d29ya2JlbmNoLXZpZXcubW9kZWwnO1xuXG4vKiogQGluaGVyaXREb2MgKi9cbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxuZXhwb3J0IGNsYXNzIMm1V29ya2JlbmNoUm91dGVyIGltcGxlbWVudHMgV29ya2JlbmNoUm91dGVyIHtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9yb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2JlbmNoTGF5b3V0U2VydmljZSA9IGluamVjdChXb3JrYmVuY2hMYXlvdXRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2JlbmNoVmlld1JlZ2lzdHJ5ID0gaW5qZWN0KFdPUktCRU5DSF9WSUVXX1JFR0lTVFJZKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICBwcml2YXRlIHJlYWRvbmx5IF96b25lID0gaW5qZWN0KE5nWm9uZSk7XG4gIC8qKiBNdXRleCB0byBzZXJpYWxpemUgV29ya2JlbmNoIFJvdXRlciBuYXZpZ2F0aW9uIHJlcXVlc3RzLCBwcmV2ZW50aW5nIHJhY2UgY29uZGl0aW9ucyB3aGVuIG1vZGlmeWluZyB0aGUgYWN0aXZlIHdvcmtiZW5jaCBsYXlvdXQgdG8gb3BlcmF0ZSBvbiB0aGUgbW9zdC1yZWNlbnQgbGF5b3V0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF93b3JrYmVuY2hSb3V0ZXJNdXRleCA9IG5ldyBTaW5nbGVUYXNrRXhlY3V0b3IoKTtcbiAgLyoqIE11dGV4IHRvIHNlcmlhbGl6ZSBBbmd1bGFyIFJvdXRlciBuYXZpZ2F0aW9uIHJlcXVlc3RzLCBwcmV2ZW50aW5nIHRoZSBjYW5jZWxsYXRpb24gb2YgcHJldmlvdXNseSBpbml0aWF0ZWQgYXN5bmNocm9ub3VzIG5hdmlnYXRpb25zLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9hbmd1bGFyUm91dGVyTXV0ZXggPSBpbmplY3QoQU5HVUxBUl9ST1VURVJfTVVURVgpO1xuICAvKiogSG9sZHMgdGhlIGN1cnJlbnQgbmF2aWdhdGlvbmFsIGNvbnRleHQgZHVyaW5nIGEgd29ya2JlbmNoIG5hdmlnYXRpb24sIG9yIGBudWxsYCBpZiBubyBuYXZpZ2F0aW9uIGlzIGluIHByb2dyZXNzLiAqL1xuICBwcml2YXRlIF9jdXJyZW50TmF2aWdhdGlvbkNvbnRleHQ6IFdvcmtiZW5jaE5hdmlnYXRpb25Db250ZXh0IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gSW5zdHJ1Y3QgdGhlIEFuZ3VsYXIgcm91dGVyIHRvIHByb2Nlc3MgbmF2aWdhdGlvbnMgdGhhdCBkbyBub3QgY2hhbmdlIHRoZSBjdXJyZW50IFVSTCwgaS5lLiwgd2hlbiBvbmx5IHVwZGF0aW5nIG5hdmlnYXRpb24gc3RhdGUuXG4gICAgLy8gRm9yIGV4YW1wbGUsIHRoZSB3b3JrYmVuY2ggZ3JpZCBpcyBwYXNzZWQgdG8gdGhlIG5hdmlnYXRpb24gYXMgc3RhdGUsIG5vdCBhcyBhIHF1ZXJ5IHBhcmFtZXRlci4gV2l0aG91dCB0aGlzIGZsYWcgc2V0LCBjaGFuZ2VzIHRvXG4gICAgLy8gdGhlIHdvcmtiZW5jaCBncmlkIHdvdWxkIG5vdCBiZSBhZGRlZCB0byB0aGUgYnJvd3NpbmcgaGlzdG9yeSBzdGFjay5cbiAgICAvLyBBbHRob3VnaCB0aGUgYG9uU2FtZVVybE5hdmlnYXRpb25gIGZsYWcgY2FuIGJlIHNldCBwZXIgbmF2aWdhdGlvbiB2aWEgdGhlIG5hdmlnYXRpb24gZXh0cmFzLCB0aGlzIGlzIG5vdCBzdWZmaWNpZW50IGJlY2F1c2UgdGhlXG4gICAgLy8gQW5ndWxhciByb3V0ZXIgaWdub3JlcyBpdCB3aGVuIG5hdmlnYXRpbmcgYmFjayBhbmQgZm9ydGggaW4gdGhlIGJyb3dzaW5nIGhpc3RvcnkuXG4gICAgLy8gU2VlIEFuZ3VsYXIgcm91dGVyLnRzI3NldFVwTG9jYXRpb25DaGFuZ2VMaXN0ZW5lciBhbmQgcm91dGVyLnRzI25hdmlnYXRlVG9TeW5jV2l0aEJyb3dzZXJcbiAgICB0aGlzLl9yb3V0ZXIub25TYW1lVXJsTmF2aWdhdGlvbiA9ICdyZWxvYWQnO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBuYXZpZ2F0ZShjb21tYW5kczogQ29tbWFuZHMsIGV4dHJhcz86IFdvcmtiZW5jaE5hdmlnYXRpb25FeHRyYXMpOiBQcm9taXNlPGJvb2xlYW4+O1xuICBwdWJsaWMgbmF2aWdhdGUobmF2aWdhdGVGbjogybVOYXZpZ2F0ZUZuLCBleHRyYXM/OiBPbWl0PE5hdmlnYXRpb25FeHRyYXMsICdyZWxhdGl2ZVRvJyB8ICdzdGF0ZSc+KTogUHJvbWlzZTxib29sZWFuPjtcbiAgcHVibGljIG5hdmlnYXRlKGNvbW1hbmRzT3JOYXZpZ2F0ZUZuOiBDb21tYW5kcyB8IMm1TmF2aWdhdGVGbiwgZXh0cmFzPzogV29ya2JlbmNoTmF2aWdhdGlvbkV4dHJhcyB8IE9taXQ8TmF2aWdhdGlvbkV4dHJhcywgJ3JlbGF0aXZlVG8nIHwgJ3N0YXRlJz4pOiBQcm9taXNlPGJvb2xlYW4+O1xuICBwdWJsaWMgYXN5bmMgbmF2aWdhdGUoY29tbWFuZHNPck5hdmlnYXRlRm46IENvbW1hbmRzIHwgybVOYXZpZ2F0ZUZuLCBleHRyYXM/OiBXb3JrYmVuY2hOYXZpZ2F0aW9uRXh0cmFzIHwgT21pdDxOYXZpZ2F0aW9uRXh0cmFzLCAncmVsYXRpdmVUbycgfCAnc3RhdGUnPik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGFzc2VydE5vdEluUmVhY3RpdmVDb250ZXh0KHRoaXMubmF2aWdhdGUsICdDYWxsIFdvcmtiZW5jaFJvdXRlci5uYXZpZ2F0ZSgpIGluIGEgbm9uLXJlYWN0aXZlIChub24tdHJhY2tpbmcpIGNvbnRleHQsIHN1Y2ggYXMgd2l0aGluIHRoZSB1bnRyYWNrZWQoKSBmdW5jdGlvbi4nKTtcblxuICAgIC8vIEVuc3VyZSB0byBydW4gaW4gQW5ndWxhciB6b25lLlxuICAgIGlmICghTmdab25lLmlzSW5Bbmd1bGFyWm9uZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fem9uZS5ydW4oKCkgPT4gdGhpcy5uYXZpZ2F0ZShjb21tYW5kc09yTmF2aWdhdGVGbiwgZXh0cmFzKSk7XG4gICAgfVxuXG4gICAgY29uc3QgbmF2aWdhdGVGbiA9IHR5cGVvZiBjb21tYW5kc09yTmF2aWdhdGVGbiA9PT0gJ2Z1bmN0aW9uJyA/IGNvbW1hbmRzT3JOYXZpZ2F0ZUZuIDogY3JlYXRlTmF2aWdhdGlvbkZyb21Db21tYW5kcyhjb21tYW5kc09yTmF2aWdhdGVGbiwgZXh0cmFzID8/IHt9KTtcblxuICAgIC8vIFNlcmlhbGl6ZSBuYXZpZ2F0aW9uIHJlcXVlc3RzIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucyB3aGVuIG1vZGlmeWluZyB0aGUgYWN0aXZlIHdvcmtiZW5jaCBsYXlvdXQsIGVuc3VyaW5nIGxheW91dCBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgb24gdGhlIG1vc3QtcmVjZW50IGxheW91dC5cbiAgICBjb25zdCBuZXdMYXlvdXQgPSBhd2FpdCB0aGlzLl93b3JrYmVuY2hSb3V0ZXJNdXRleC5zdWJtaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gV2FpdCB1bnRpbCB0aGUgaW5pdGlhbCBsYXlvdXQgaXMgYXZhaWxhYmxlLCBpLmUuLCBhZnRlciBjb21wbGV0aW9uIG9mIEFuZ3VsYXIncyBpbml0aWFsIG5hdmlnYXRpb24uXG4gICAgICAvLyBPdGhlcndpc2UsIHRoaXMgbmF2aWdhdGlvbiB3b3VsZCBvdmVycmlkZSB0aGUgaW5pdGlhbCBsYXlvdXQgYXMgZ2l2ZW4gaW4gdGhlIFVSTC5cbiAgICAgIGlmICghdGhpcy5fd29ya2JlbmNoTGF5b3V0U2VydmljZS5sYXlvdXQoKSkge1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JJbml0aWFsTGF5b3V0KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIExldCB0aGUgbmF2aWdhdG9yIGNvbXB1dGUgdGhlIG5ldyB3b3JrYmVuY2ggbGF5b3V0LlxuICAgICAgY29uc3QgY3VycmVudExheW91dCA9IHRoaXMuX3dvcmtiZW5jaExheW91dFNlcnZpY2UubGF5b3V0KCkhO1xuICAgICAgbGV0IG5ld0xheW91dDogybVXb3JrYmVuY2hMYXlvdXQgfCBudWxsID0gYXdhaXQgcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuX2luamVjdG9yLCAoKSA9PiBuYXZpZ2F0ZUZuKGN1cnJlbnRMYXlvdXQpKSBhcyDJtVdvcmtiZW5jaExheW91dDtcbiAgICAgIGlmICghbmV3TGF5b3V0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgdmlld3MgbWFya2VkIGZvciByZW1vdmFsIHRoYXQgaGF2ZSBubyBgQ2FuQ2xvc2VgIGd1YXJkLlxuICAgICAgLy8gVmlld3Mgd2l0aCBhIGBDYW5DbG9zZWAgZ3VhcmQgYXJlIHJlbW92ZWQgbGF0ZXIsIG91dHNpZGUgdGhlIG5hdmlnYXRpb24gbXV0ZXgsIHRvIGF2b2lkIGJsb2NraW5nIHRoZSB3b3JrYmVuY2ggcm91dGVyLlxuICAgICAgbmV3TGF5b3V0ID0gdGhpcy5yZW1vdmVWaWV3c1dpdGhvdXRHdWFyZChuZXdMYXlvdXQpO1xuXG4gICAgICAvLyBTa2lwIG5hdmlnYXRpb24gaWYgdGhlIGxheW91dCBoYXMgbm90IGNoYW5nZWQsIHN1Y2ggYXMgd2hlbiBvbmx5IGNsb3Npbmcgdmlld3Mgd2l0aCBhIGBDYW5DbG9zZWAgZ3VhcmQuXG4gICAgICBpZiAobmV3TGF5b3V0LmVxdWFscyhjdXJyZW50TGF5b3V0LCB7ZXhjbHVkZVZpZXdNYXJrZWRGb3JSZW1vdmFsOiB0cnVlfSkpIHtcbiAgICAgICAgcmV0dXJuIG5ld0xheW91dDtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGV4dHJhcyB3aXRoIHdvcmtiZW5jaCBuYXZpZ2F0aW9uIGluc3RydWN0aW9ucy5cbiAgICAgIGV4dHJhcyA9IGNyZWF0ZU5hdmlnYXRpb25FeHRyYXMoe25ld0xheW91dCwgY3VycmVudExheW91dH0sIGV4dHJhcyk7XG5cbiAgICAgIC8vIFBlcmZvcm0gdGhlIG5hdmlnYXRpb24uXG4gICAgICBjb25zdCBjb21tYW5kczogQ29tbWFuZHMgPSBjb21wdXRlTmF2aWdhdGlvbkNvbW1hbmRzKGN1cnJlbnRMYXlvdXQudmlld091dGxldHMoKSwgbmV3TGF5b3V0LnZpZXdPdXRsZXRzKCkpO1xuICAgICAgaWYgKCFhd2FpdCB0aGlzLl9hbmd1bGFyUm91dGVyTXV0ZXguc3VibWl0KCgpID0+IHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShjb21tYW5kcywgZXh0cmFzKSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIEJsb2NrIHN1YnNlcXVlbnQgbmF2aWdhdGlvbihzKSB1bnRpbCBBbmd1bGFyIGhhcyBmbHVzaGVkIHRoZSBjaGFuZ2VkIGxheW91dCB0byB0aGUgRE9NLlxuICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5fem9uZS5vblN0YWJsZSk7XG4gICAgICByZXR1cm4gbmV3TGF5b3V0O1xuICAgIH0pO1xuXG4gICAgaWYgKCFuZXdMYXlvdXQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgdmlld3MgbWFya2VkIGZvciByZW1vdmFsLCBjb25maXJtaW5nIGNsb3NpbmcgYnkgY2FsbGluZyBlYWNoIHZpZXcncyBgQ2FuQ2xvc2VgIGd1YXJkLlxuICAgIHJldHVybiB0aGlzLnNjaGVkdWxlVmlld1JlbW92YWwobmV3TGF5b3V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBjaGFuZ2VzIHRvIHRoZSBjdXJyZW50IHdvcmtiZW5jaCBsYXlvdXQuXG4gICAqXG4gICAqIFVubGlrZSB7QGxpbmsgbmF2aWdhdGV9LCBkb2VzIG5vdCBwZXJmb3JtIHRoZSBuYXZpZ2F0aW9uIGJ1dCByZXR1cm5zIHRoZSBVUkwgdHJlZSBpbnN0ZWFkLlxuICAgKlxuICAgKiBUaGUgcm91dGVyIHdpbGwgaW52b2tlIHRoZSBjYWxsYmFjayBhbmQgcGFzcyB0aGUgY3VycmVudCBsYXlvdXQgZm9yIG1vZGlmaWNhdGlvbi4gVGhlIGNhbGxiYWNrIGNhbiBjYWxsIGBpbmplY3RgIHRvIGdldCBhbnkgcmVxdWlyZWQgZGVwZW5kZW5jaWVzLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgYWRkcyBhIHBhcnQgdG8gdGhlIGxlZnQgb2YgdGhlIG1haW4gYXJlYSwgaW5zZXJ0cyBhIHZpZXcgYW5kIG5hdmlnYXRlcyBpdC5cbiAgICpcbiAgICogYGBgdHNcbiAgICogaW5qZWN0KFdvcmtiZW5jaFJvdXRlcikuY3JlYXRlVXJsVHJlZShsYXlvdXQgPT4gbGF5b3V0XG4gICAqICAgLmFkZFBhcnQoJ2xlZnQnLCB7cmVsYXRpdmVUbzogTUFJTl9BUkVBLCBhbGlnbjogJ2xlZnQnfSlcbiAgICogICAuYWRkVmlldygnbmF2aWdhdG9yJywge3BhcnRJZDogJ2xlZnQnfSlcbiAgICogICAubmF2aWdhdGVWaWV3KCduYXZpZ2F0b3InLCBbJ3BhdGgvdG8vdmlldyddKVxuICAgKiAgIC5hY3RpdmF0ZVZpZXcoJ25hdmlnYXRvcicpLFxuICAgKiApO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIG9uTmF2aWdhdGUgLSBTcGVjaWZpZXMgdGhlIGNhbGxiYWNrIHRvIG1vZGlmeSB0aGUgbGF5b3V0LlxuICAgKiBAcGFyYW0gZXh0cmFzIC0gQ29udHJvbHMgaG93IHRvIHBlcmZvcm0gdGhlIG5hdmlnYXRpb24uXG4gICAqIEBzZWUgTmF2aWdhdGVGblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZVVybFRyZWUob25OYXZpZ2F0ZTogKGxheW91dDogybVXb3JrYmVuY2hMYXlvdXQpID0+IFByb21pc2U8ybVXb3JrYmVuY2hMYXlvdXQgfCBudWxsPiB8IMm1V29ya2JlbmNoTGF5b3V0IHwgbnVsbCwgZXh0cmFzPzogT21pdDxOYXZpZ2F0aW9uRXh0cmFzLCAncmVsYXRpdmVUbycgfCAnc3RhdGUnPik6IFByb21pc2U8VXJsVHJlZSB8IG51bGw+IHtcbiAgICBhc3NlcnROb3RJblJlYWN0aXZlQ29udGV4dCh0aGlzLmNyZWF0ZVVybFRyZWUsICdDYWxsIFdvcmtiZW5jaFJvdXRlci5jcmVhdGVVcmxUcmVlKCkgaW4gYSBub24tcmVhY3RpdmUgKG5vbi10cmFja2luZykgY29udGV4dCwgc3VjaCBhcyB3aXRoaW4gdGhlIHVudHJhY2tlZCgpIGZ1bmN0aW9uLicpO1xuXG4gICAgLy8gRW5zdXJlIHRvIHJ1biBpbiBBbmd1bGFyIHpvbmUuXG4gICAgaWYgKCFOZ1pvbmUuaXNJbkFuZ3VsYXJab25lKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl96b25lLnJ1bigoKSA9PiB0aGlzLmNyZWF0ZVVybFRyZWUob25OYXZpZ2F0ZSwgZXh0cmFzKSk7XG4gICAgfVxuXG4gICAgLy8gU2VyaWFsaXplIG5hdmlnYXRpb24gcmVxdWVzdHMgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zIHdoZW4gbW9kaWZ5aW5nIHRoZSBhY3RpdmUgd29ya2JlbmNoIGxheW91dCwgZW5zdXJpbmcgbGF5b3V0IG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCBvbiB0aGUgbW9zdC1yZWNlbnQgbGF5b3V0LlxuICAgIHJldHVybiB0aGlzLl93b3JrYmVuY2hSb3V0ZXJNdXRleC5zdWJtaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gV2FpdCB1bnRpbCB0aGUgaW5pdGlhbCBsYXlvdXQgaXMgYXZhaWxhYmxlLCBpLmUuLCBhZnRlciBjb21wbGV0aW9uIG9mIEFuZ3VsYXIncyBpbml0aWFsIG5hdmlnYXRpb24uXG4gICAgICAvLyBPdGhlcndpc2UsIHdvdWxkIG92ZXJyaWRlIHRoZSBpbml0aWFsIGxheW91dCBhcyBnaXZlbiBpbiB0aGUgVVJMLlxuICAgICAgaWYgKCF0aGlzLl93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlLmxheW91dCgpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckluaXRpYWxMYXlvdXQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gTGV0IHRoZSBuYXZpZ2F0b3IgY29tcHV0ZSB0aGUgbmV3IHdvcmtiZW5jaCBsYXlvdXQuXG4gICAgICBjb25zdCBjdXJyZW50TGF5b3V0ID0gdGhpcy5fd29ya2JlbmNoTGF5b3V0U2VydmljZS5sYXlvdXQoKSE7XG4gICAgICBsZXQgbmV3TGF5b3V0OiDJtVdvcmtiZW5jaExheW91dCB8IG51bGwgPSBhd2FpdCBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5faW5qZWN0b3IsICgpID0+IG9uTmF2aWdhdGUoY3VycmVudExheW91dCkpO1xuICAgICAgaWYgKCFuZXdMYXlvdXQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSB2aWV3cyBtYXJrZWQgZm9yIHJlbW92YWwuXG4gICAgICBuZXdMYXlvdXQudmlld3Moe21hcmtlZEZvclJlbW92YWw6IHRydWV9KS5mb3JFYWNoKHZpZXcgPT4ge1xuICAgICAgICBuZXdMYXlvdXQgPSBuZXdMYXlvdXQhLnJlbW92ZVZpZXcodmlldy5pZCwge2ZvcmNlOiB0cnVlfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gQ3JlYXRlIGV4dHJhcyB3aXRoIHdvcmtiZW5jaCBuYXZpZ2F0aW9uIGluc3RydWN0aW9ucy5cbiAgICAgIGV4dHJhcyA9IGNyZWF0ZU5hdmlnYXRpb25FeHRyYXMoe25ld0xheW91dCwgY3VycmVudExheW91dH0sIGV4dHJhcyk7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IFVSTCB0cmVlLlxuICAgICAgY29uc3QgY29tbWFuZHM6IENvbW1hbmRzID0gY29tcHV0ZU5hdmlnYXRpb25Db21tYW5kcyhjdXJyZW50TGF5b3V0LnZpZXdPdXRsZXRzKCksIG5ld0xheW91dC52aWV3T3V0bGV0cygpKTtcbiAgICAgIHJldHVybiB0aGlzLl9yb3V0ZXIuY3JlYXRlVXJsVHJlZShjb21tYW5kcywgZXh0cmFzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdmlld3MgbWFya2VkIGZvciByZW1vdmFsIHRoYXQgaGF2ZSBubyBgQ2FuQ2xvc2VgIGd1YXJkLlxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVWaWV3c1dpdGhvdXRHdWFyZChsYXlvdXQ6IMm1V29ya2JlbmNoTGF5b3V0KTogybVXb3JrYmVuY2hMYXlvdXQge1xuICAgIHJldHVybiBsYXlvdXQudmlld3Moe21hcmtlZEZvclJlbW92YWw6IHRydWV9KS5yZWR1Y2UoKGxheW91dCwgbVZpZXcpID0+IHtcbiAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLl93b3JrYmVuY2hWaWV3UmVnaXN0cnkuZ2V0KG1WaWV3LmlkLCB7b3JFbHNlOiBudWxsfSk7XG4gICAgICBpZiAoIXZpZXcgfHwgKHZpZXcuY2xvc2FibGUoKSAmJiAhdmlldy5jYW5DbG9zZUd1YXJkKSkge1xuICAgICAgICByZXR1cm4gbGF5b3V0LnJlbW92ZVZpZXcobVZpZXcuaWQsIHtmb3JjZTogdHJ1ZX0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxheW91dDtcbiAgICB9LCBsYXlvdXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdmlld3MgbWFya2VkIGZvciByZW1vdmFsLCBjb25maXJtaW5nIGNsb3NpbmcgYnkgY2FsbGluZyBlYWNoIHZpZXcncyBgQ2FuQ2xvc2VgIGd1YXJkLlxuICAgKlxuICAgKiBHdWFyZHMgYXJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLCBhbmQgdmlld3MgYXJlIHJlbW92ZWQgaW4gc2VwYXJhdGUgbmF2aWdhdGlvbnMuXG4gICAqXG4gICAqIEByZXR1cm4gYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYHRydWVgIHdoZW4gYWxsIG1hcmtlZCB2aWV3cyB3ZXJlIHN1Y2Nlc3NmdWxseSBjbG9zZWQgb3IgZGVjbGluZWQgY2xvc2luZy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2NoZWR1bGVWaWV3UmVtb3ZhbChsYXlvdXQ6IMm1V29ya2JlbmNoTGF5b3V0KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgbmF2aWdhdGlvbnMgPSBsYXlvdXQudmlld3Moe21hcmtlZEZvclJlbW92YWw6IHRydWV9KVxuICAgICAgLm1hcChtVmlldyA9PiB0aGlzLl93b3JrYmVuY2hWaWV3UmVnaXN0cnkuZ2V0KG1WaWV3LmlkLCB7b3JFbHNlOiBudWxsfSkpXG4gICAgICAuZmlsdGVyKCh2aWV3KTogdmlldyBpcyDJtVdvcmtiZW5jaFZpZXcgPT4gISF2aWV3ICYmIHZpZXcuY2xvc2FibGUoKSlcbiAgICAgIC5tYXAoYXN5bmMgdmlldyA9PiB7XG4gICAgICAgIC8vIENhcHR1cmUgY3VycmVudCBuYXZpZ2F0aW9uIGlkIHRvIG5vdCBwcm9jZWVkIGNsb3NpbmcgaWYgbmF2aWdhdGVkIGluIHRoZSBtZWFudGltZS5cbiAgICAgICAgY29uc3QgbmF2aWdhdGlvbklkID0gdmlldy5uYXZpZ2F0aW9uSWQ7XG4gICAgICAgIC8vIE1ha2UgdmlldyBub24tY2xvc2FibGUgdG8gcHJldmVudCBjbG9zaW5nIHRoZSB2aWV3IGFnYWluIHdoaWxlIGF3YWl0aW5nIGNsb3NpbmcgY29uZmlybWF0aW9uLlxuICAgICAgICB2aWV3LmNsb3NhYmxlID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgY2xvc2UgPSBhd2FpdCB2aWV3LmNhbkNsb3NlR3VhcmQhKCk7XG4gICAgICAgICAgaWYgKGNsb3NlICYmIHZpZXcubmF2aWdhdGlvbklkID09PSBuYXZpZ2F0aW9uSWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5hdmlnYXRlKGxheW91dCA9PiBsYXlvdXQucmVtb3ZlVmlldyh2aWV3LmlkLCB7Zm9yY2U6IHRydWV9KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgIHZpZXcuY2xvc2FibGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIC8vIFdhaXQgZm9yIGFsbCBgQ2FuQ2xvc2VgIGd1YXJkcyB0byByZXNvbHZlIGFuZCBzdWJzZXF1ZW50IG5hdmlnYXRpb25zIHRvIGNvbXBsZXRlLlxuICAgIHJldHVybiAoYXdhaXQgUHJvbWlzZS5hbGwobmF2aWdhdGlvbnMpKS5ldmVyeShCb29sZWFuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHdvcmtiZW5jaCBuYXZpZ2F0aW9uLCB3aGVuIGJlaW5nIGludm9rZWQgZHVyaW5nIG5hdmlnYXRpb24sIG9yIHRocm93cyBhbiBlcnJvciBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q3VycmVudE5hdmlnYXRpb25Db250ZXh0KCk6IFdvcmtiZW5jaE5hdmlnYXRpb25Db250ZXh0IHtcbiAgICBpZiAoIXRoaXMuX2N1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1tOYXZpZ2F0ZUVycm9yXSBOYXZpZ2F0aW9uIGNvbnRleHQgbm90IGF2YWlsYWJsZSBiZWNhdXNlIG5vIG5hdmlnYXRpb24gaXMgaW4gcHJvZ3Jlc3MuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50TmF2aWdhdGlvbkNvbnRleHQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBuYXZpZ2F0aW9uYWwgY29udGV4dHVhbCBkYXRhLlxuICAgKi9cbiAgcHVibGljIHNldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dChjb250ZXh0OiBXb3JrYmVuY2hOYXZpZ2F0aW9uQ29udGV4dCB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9jdXJyZW50TmF2aWdhdGlvbkNvbnRleHQgPSBjb250ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIEJsb2NrcyB1bnRpbCB0aGUgaW5pdGlhbCBsYXlvdXQgaXMgYXZhaWxhYmxlLCBpLmUuIGFmdGVyIGNvbXBsZXRpb24gb2YgQW5ndWxhcidzIGluaXRpYWwgbmF2aWdhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckluaXRpYWxMYXlvdXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5fd29ya2JlbmNoTGF5b3V0U2VydmljZS5sYXlvdXQkKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuYXZpZ2F0aW9uIHRvIG5hdmlnYXRlIHZpZXcocykgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGFycmF5IG9mIGNvbW1hbmRzIGFuZCBleHRyYXMuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU5hdmlnYXRpb25Gcm9tQ29tbWFuZHMoY29tbWFuZHM6IENvbW1hbmRzLCBleHRyYXM6IFdvcmtiZW5jaE5hdmlnYXRpb25FeHRyYXMpOiDJtU5hdmlnYXRlRm4ge1xuICByZXR1cm4gKGxheW91dDogybVXb3JrYmVuY2hMYXlvdXQpOiDJtVdvcmtiZW5jaExheW91dCB8IG51bGwgPT4ge1xuICAgIGlmIChleHRyYXMuY2xvc2UpIHtcbiAgICAgIGlmIChleHRyYXMudGFyZ2V0KSB7XG4gICAgICAgIGlmIChjb21tYW5kcy5sZW5ndGggfHwgZXh0cmFzLmhpbnQgfHwgZXh0cmFzLnBhcnRJZCB8fCBleHRyYXMucmVsYXRpdmVUbykge1xuICAgICAgICAgIHRocm93IEVycm9yKCdbTmF2aWdhdGVFcnJvcl0gQ29tbWFuZHMsIGhpbnQsIHBhcnQgb3IgcmVsYXRpdmVUbyBtdXN0IG5vdCBiZSBzZXQgd2hlbiBjbG9zaW5nIGEgdmlldyBieSBpZC4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGF5b3V0LnJlbW92ZVZpZXcoZXh0cmFzLnRhcmdldCk7XG4gICAgICB9XG4gICAgICBjb25zdCB1cmxTZWdtZW50cyA9IFJvdXRpbmcuY29tbWFuZHNUb1NlZ21lbnRzKGNvbW1hbmRzLCB7cmVsYXRpdmVUbzogZXh0cmFzLnJlbGF0aXZlVG99KTtcbiAgICAgIHJldHVybiBsYXlvdXRcbiAgICAgICAgLnZpZXdzKHtcbiAgICAgICAgICBwYXJ0SWQ6IGV4dHJhcy5wYXJ0SWQsXG4gICAgICAgICAgc2VnbWVudHM6IG5ldyBVcmxTZWdtZW50TWF0Y2hlcih1cmxTZWdtZW50cywge21hdGNoTWF0cml4UGFyYW1zOiBmYWxzZSwgbWF0Y2hXaWxkY2FyZFBhdGg6IHRydWV9KSxcbiAgICAgICAgICBuYXZpZ2F0aW9uSGludDogZXh0cmFzLmhpbnQgPz8gbnVsbCxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlZHVjZSgobGF5b3V0LCB2aWV3KSA9PiBsYXlvdXQucmVtb3ZlVmlldyh2aWV3LmlkKSwgbGF5b3V0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzd2l0Y2ggKGV4dHJhcy50YXJnZXQgPz8gJ2F1dG8nKSB7XG4gICAgICAgIGNhc2UgJ2JsYW5rJzoge1xuICAgICAgICAgIHJldHVybiBhZGRWaWV3KGxheW91dC5jb21wdXRlTmV4dFZpZXdJZCgpLCBsYXlvdXQpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2F1dG8nOiB7XG4gICAgICAgICAgY29uc3QgdXJsU2VnbWVudHMgPSBSb3V0aW5nLmNvbW1hbmRzVG9TZWdtZW50cyhjb21tYW5kcywge3JlbGF0aXZlVG86IGV4dHJhcy5yZWxhdGl2ZVRvfSk7XG4gICAgICAgICAgY29uc3Qgdmlld3MgPSBsYXlvdXQudmlld3Moe1xuICAgICAgICAgICAgcGFydElkOiBleHRyYXMucGFydElkLFxuICAgICAgICAgICAgc2VnbWVudHM6IG5ldyBVcmxTZWdtZW50TWF0Y2hlcih1cmxTZWdtZW50cywge21hdGNoTWF0cml4UGFyYW1zOiBmYWxzZSwgbWF0Y2hXaWxkY2FyZFBhdGg6IGZhbHNlfSksXG4gICAgICAgICAgICBuYXZpZ2F0aW9uSGludDogZXh0cmFzLmhpbnQgPz8gbnVsbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAodmlld3MubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlld3MucmVkdWNlKChsYXlvdXQsIHZpZXcpID0+IHVwZGF0ZVZpZXcodmlldy5pZCwgbGF5b3V0KSwgbGF5b3V0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYWRkVmlldyhsYXlvdXQuY29tcHV0ZU5leHRWaWV3SWQoKSwgbGF5b3V0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnN0IHZpZXdJZCA9IGV4dHJhcy50YXJnZXQhO1xuICAgICAgICAgIGlmIChsYXlvdXQuaGFzVmlldyh2aWV3SWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlVmlldyh2aWV3SWQsIGxheW91dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGFkZFZpZXcodmlld0lkLCBsYXlvdXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQWRkcyB0aGUgc3BlY2lmaWVkIHZpZXcgdG8gdGhlIGxheW91dC5cbiAgICovXG4gIGZ1bmN0aW9uIGFkZFZpZXcodmlld0lkOiBzdHJpbmcsIGxheW91dDogybVXb3JrYmVuY2hMYXlvdXQpOiDJtVdvcmtiZW5jaExheW91dCB7XG4gICAgLy8gRGVmYXVsdCB0byB0aGUgYWN0aXZlIHBhcnQgaWYgbm90IHNwZWNpZmllZCBvciBub3QgaW4gdGhlIGxheW91dCwgd2l0aCB0aGUgYWN0aXZlIHBhcnQgb2YgdGhlIG1haW4gYXJlYSB0YWtpbmcgcHJlY2VkZW5jZS5cbiAgICBjb25zdCBwYXJ0SWQgPSAoKCk6IHN0cmluZyA9PiB7XG4gICAgICBpZiAoZXh0cmFzLnBhcnRJZCAmJiBsYXlvdXQuaGFzUGFydChleHRyYXMucGFydElkKSkge1xuICAgICAgICByZXR1cm4gZXh0cmFzLnBhcnRJZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsYXlvdXQuYWN0aXZlUGFydCh7Z3JpZDogJ21haW5BcmVhJ30pPy5pZCA/PyBsYXlvdXQuYWN0aXZlUGFydCh7Z3JpZDogJ3dvcmtiZW5jaCd9KS5pZDtcbiAgICB9KSgpO1xuXG4gICAgcmV0dXJuIGxheW91dFxuICAgICAgLmFkZFZpZXcodmlld0lkLCB7XG4gICAgICAgIHBhcnRJZDogcGFydElkLFxuICAgICAgICBwb3NpdGlvbjogZXh0cmFzLnBvc2l0aW9uID8/ICdhZnRlci1hY3RpdmUtdmlldycsXG4gICAgICAgIGFjdGl2YXRlVmlldzogZXh0cmFzLmFjdGl2YXRlID8/IHRydWUsXG4gICAgICAgIGFjdGl2YXRlUGFydDogZXh0cmFzLmFjdGl2YXRlID8/IHRydWUsXG4gICAgICB9KVxuICAgICAgLm5hdmlnYXRlVmlldyh2aWV3SWQsIGNvbW1hbmRzLCB7XG4gICAgICAgIHJlbGF0aXZlVG86IGV4dHJhcy5yZWxhdGl2ZVRvLFxuICAgICAgICBoaW50OiBleHRyYXMuaGludCxcbiAgICAgICAgY3NzQ2xhc3M6IGV4dHJhcy5jc3NDbGFzcyxcbiAgICAgICAgZGF0YTogZXh0cmFzLmRhdGEsXG4gICAgICAgIHN0YXRlOiBleHRyYXMuc3RhdGUsXG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBzcGVjaWZpZWQgdmlldy5cbiAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZVZpZXcodmlld0lkOiBzdHJpbmcsIGxheW91dDogybVXb3JrYmVuY2hMYXlvdXQpOiDJtVdvcmtiZW5jaExheW91dCB7XG4gICAgaWYgKGV4dHJhcy5hY3RpdmF0ZSA/PyB0cnVlKSB7XG4gICAgICBsYXlvdXQgPSBsYXlvdXQuYWN0aXZhdGVWaWV3KHZpZXdJZCwge2FjdGl2YXRlUGFydDogdHJ1ZX0pO1xuICAgIH1cblxuICAgIHJldHVybiBsYXlvdXQubmF2aWdhdGVWaWV3KHZpZXdJZCwgY29tbWFuZHMsIHtcbiAgICAgIHJlbGF0aXZlVG86IGV4dHJhcy5yZWxhdGl2ZVRvLFxuICAgICAgaGludDogZXh0cmFzLmhpbnQsXG4gICAgICBjc3NDbGFzczogZXh0cmFzLmNzc0NsYXNzLFxuICAgICAgZGF0YTogZXh0cmFzLmRhdGEsXG4gICAgICBzdGF0ZTogZXh0cmFzLnN0YXRlLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBuYXZpZ2F0aW9uIGV4dHJhcyB3aXRoIHdvcmtiZW5jaCBuYXZpZ2F0aW9uIGluc3RydWN0aW9ucy5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlTmF2aWdhdGlvbkV4dHJhcyhsYXlvdXRzOiB7bmV3TGF5b3V0OiDJtVdvcmtiZW5jaExheW91dDsgY3VycmVudExheW91dD86IMm1V29ya2JlbmNoTGF5b3V0IHwgdW5kZWZpbmVkfSwgZXh0cmFzPzogT21pdDxOYXZpZ2F0aW9uRXh0cmFzLCAncmVsYXRpdmVUbycgfCAnc3RhdGUnPik6IE5hdmlnYXRpb25FeHRyYXMge1xuICBjb25zdCB7bmV3TGF5b3V0LCBjdXJyZW50TGF5b3V0fSA9IGxheW91dHM7XG4gIGNvbnN0IHt3b3JrYmVuY2hHcmlkLCBtYWluQXJlYUdyaWR9ID0gbmV3TGF5b3V0LnNlcmlhbGl6ZSh7ZXhjbHVkZVZpZXdNYXJrZWRGb3JSZW1vdmFsOiB0cnVlfSk7XG5cbiAgLy8gSU1QT1JUQU5UOiBVcGRhdGUgYMm1V29ya2JlbmNoTGF5b3V0LmVxdWFsc2AgZnVuY3Rpb24gd2hlbiBhZGRpbmcgbmV3IHN0YXRlIHByb3BlcnRpZXMuXG5cbiAgcmV0dXJuIHtcbiAgICAuLi5leHRyYXMsXG4gICAgLy8gSW5zdHJ1Y3QgdGhlIEFuZ3VsYXIgcm91dGVyIHRvIHByb2Nlc3MgdGhlIG5hdmlnYXRpb24gZXZlbiBpZiB0aGUgVVJMIGRvZXMgbm90IGNoYW5nZSwgZS5nLiwgd2hlbiBjaGFuZ2luZyB0aGUgd29ya2JlbmNoIGdyaWQgd2hpY2ggaXMgbm90IGNvbnRhaW5lZCBpbiB0aGUgVVJMLlxuICAgIG9uU2FtZVVybE5hdmlnYXRpb246ICdyZWxvYWQnLFxuICAgIC8vIFVuc2V0IGByZWxhdGl2ZVRvYCBiZWNhdXNlIGNvbW1hbmRzIGFyZSBhbHJlYWR5IG5vcm1hbGl6ZWQgdG8gdGhlaXIgYWJzb2x1dGUgZm9ybS5cbiAgICByZWxhdGl2ZVRvOiBudWxsLFxuICAgIC8vIEFzc29jaWF0ZSB3b3JrYmVuY2gtc3BlY2lmaWMgc3RhdGUgd2l0aCB0aGUgbmF2aWdhdGlvbi5cbiAgICBzdGF0ZTogV29ya2JlbmNoTmF2aWdhdGlvbmFsU3RhdGVzLmNyZWF0ZSh7XG4gICAgICB3b3JrYmVuY2hHcmlkOiB3b3JrYmVuY2hHcmlkLFxuICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGxheW91dCdzIHBlcnNwZWN0aXZlIGlmIG5vdCBzcGVjaWZpZWQgYnkgdGhlIG5ldyBsYXlvdXQsXG4gICAgICAvLyBlLmcuLCB0aGUgbmF2aWdhdG9yIHByb3ZpZGVzIGEgbmV3IGxheW91dCB0byByZXBsYWNlIHRoZSBjdXJyZW50IGxheW91dC5cbiAgICAgIHBlcnNwZWN0aXZlSWQ6IG5ld0xheW91dC5wZXJzcGVjdGl2ZUlkID8/IGN1cnJlbnRMYXlvdXQ/LnBlcnNwZWN0aXZlSWQsXG4gICAgICBtYXhpbWl6ZWQ6IG5ld0xheW91dC5tYXhpbWl6ZWQsXG4gICAgICBuYXZpZ2F0aW9uU3RhdGVzOiBuZXdMYXlvdXQubmF2aWdhdGlvblN0YXRlcygpLFxuICAgIH0pLFxuICAgIC8vIEFkZCB0aGUgbWFpbiBhcmVhIGFzIHF1ZXJ5IHBhcmFtZXRlci5cbiAgICBxdWVyeVBhcmFtczogey4uLmV4dHJhcz8ucXVlcnlQYXJhbXMsIFtNQUlOX0FSRUFfTEFZT1VUX1FVRVJZX1BBUkFNXTogbWFpbkFyZWFHcmlkfSxcbiAgICAvLyBNZXJnZSB3aXRoIGV4aXN0aW5nIHF1ZXJ5IHBhcmFtcyB1bmxlc3Mgc3BlY2lmaWVkIGFuIGV4cGxpY2l0IHN0cmF0ZWd5LCBlLmcuLCBmb3IgbWlncmF0aW5nIGFuIG91dGRhdGVkIGxheW91dCBVUkwuXG4gICAgLy8gTm90ZSB0aGF0IGBudWxsYCBpcyBhIHZhbGlkIHN0cmF0ZWd5IGZvciBjbGVhcmluZyBleGlzdGluZyBxdWVyeSBwYXJhbXMsIHNvIGRvIG5vdCB1c2UgdGhlIG51bGxpc2ggY29hbGVzY2luZyBvcGVyYXRvciAoPz8pLlxuICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IERlZmluZWQub3JFbHNlKGV4dHJhcz8ucXVlcnlQYXJhbXNIYW5kbGluZywgJ21lcmdlJyksXG4gIH07XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgY29tbWFuZHMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBBbmd1bGFyIHJvdXRlciB0byBuYXZpZ2F0ZSB2aWV3IG91dGxldHMgYW5kIHRvIHJlbW92ZSB2aWV3IG91dGxldHMgb2YgcmVtb3ZlZCB2aWV3cy5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZU5hdmlnYXRpb25Db21tYW5kcyhwcmV2aW91c1ZpZXdPdXRsZXRzOiBWaWV3T3V0bGV0cywgbmV4dFZpZXdPdXRsZXRzOiBWaWV3T3V0bGV0cyk6IFt7b3V0bGV0czoge1tvdXRsZXQ6IFZpZXdJZF06IENvbW1hbmRzIHwgbnVsbH19XSB8IFtdIHtcbiAgY29uc3QgcHJldmlvdXNWaWV3T3V0bGV0TWFwID0gbmV3IE1hcDxWaWV3SWQsIFVybFNlZ21lbnRbXT4oT2JqZWN0cy5lbnRyaWVzKHByZXZpb3VzVmlld091dGxldHMpKTtcbiAgY29uc3QgbmV4dFZpZXdPdXRsZXRNYXAgPSBuZXcgTWFwPFZpZXdJZCwgVXJsU2VnbWVudFtdPihPYmplY3RzLmVudHJpZXMobmV4dFZpZXdPdXRsZXRzKSk7XG5cbiAgY29uc3QgY29tbWFuZHMgPSBuZXcgTWFwPFZpZXdJZCwgQ29tbWFuZHMgfCBudWxsPigpO1xuICBjb25zdCB2aWV3SWRzID0gbmV3IFNldDxWaWV3SWQ+KFsuLi5wcmV2aW91c1ZpZXdPdXRsZXRNYXAua2V5cygpLCAuLi5uZXh0Vmlld091dGxldE1hcC5rZXlzKCldKTtcblxuICB2aWV3SWRzLmZvckVhY2godmlld0lkID0+IHtcbiAgICAvLyBUZXN0IGlmIHRoZSB2aWV3IHdhcyBhZGRlZCB0byB0aGUgbGF5b3V0LlxuICAgIGlmICghcHJldmlvdXNWaWV3T3V0bGV0TWFwLmhhcyh2aWV3SWQpKSB7XG4gICAgICBjb21tYW5kcy5zZXQodmlld0lkLCBSb3V0aW5nLnNlZ21lbnRzVG9Db21tYW5kcyhuZXh0Vmlld091dGxldE1hcC5nZXQodmlld0lkKSEpKTtcbiAgICB9XG4gICAgLy8gVGVzdCBpZiB0aGUgdmlldyB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBsYXlvdXQuXG4gICAgZWxzZSBpZiAoIW5leHRWaWV3T3V0bGV0TWFwLmhhcyh2aWV3SWQpKSB7XG4gICAgICBjb21tYW5kcy5zZXQodmlld0lkLCBudWxsKTtcbiAgICB9XG4gICAgLy8gVGVzdCBpZiB0aGUgdmlldyB3YXMgdXBkYXRlZC5cbiAgICBlbHNlIGlmICghbmV3IFVybFNlZ21lbnRNYXRjaGVyKHByZXZpb3VzVmlld091dGxldE1hcC5nZXQodmlld0lkKSEsIHttYXRjaE1hdHJpeFBhcmFtczogdHJ1ZSwgbWF0Y2hXaWxkY2FyZFBhdGg6IGZhbHNlfSkubWF0Y2hlcyhuZXh0Vmlld091dGxldE1hcC5nZXQodmlld0lkKSEpKSB7XG4gICAgICBjb21tYW5kcy5zZXQodmlld0lkLCBSb3V0aW5nLnNlZ21lbnRzVG9Db21tYW5kcyhuZXh0Vmlld091dGxldE1hcC5nZXQodmlld0lkKSEpKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEFkZCB2aWV3IGNvbW1hbmRzIHRvIHRoZSAnb3V0bGV0cycgcHJvcGVydHkgdG8gYmUgaW50ZXJwcmV0ZWQgYnkgdGhlIEFuZ3VsYXIgcm91dGVyLlxuICByZXR1cm4gY29tbWFuZHMuc2l6ZSA/IFt7b3V0bGV0czogT2JqZWN0LmZyb21FbnRyaWVzKGNvbW1hbmRzKX1dIDogW107XG59XG5cbi8qKlxuICogQGluaGVyaXREb2NcbiAqIEBzZWUgTmF2aWdhdGVGblxuICovXG5leHBvcnQgdHlwZSDJtU5hdmlnYXRlRm4gPSAobGF5b3V0OiDJtVdvcmtiZW5jaExheW91dCkgPT4gUHJvbWlzZTzJtVdvcmtiZW5jaExheW91dCB8IG51bGw+IHwgybVXb3JrYmVuY2hMYXlvdXQgfCBudWxsO1xuIl19
@@ -1,12 +0,0 @@
1
- /*
2
- * Copyright (c) 2018-2023 Swiss Federal Railways
3
- *
4
- * This program and the accompanying materials are made
5
- * available under the terms of the Eclipse Public License 2.0
6
- * which is available at https://www.eclipse.org/legal/epl-2.0/
7
- *
8
- * SPDX-License-Identifier: EPL-2.0
9
- */
10
- export { WorkbenchLauncher, WorkbenchStartup } from './workbench-launcher.service';
11
- export { WORKBENCH_STARTUP, WORKBENCH_PRE_STARTUP, MICROFRONTEND_PLATFORM_PRE_STARTUP, MICROFRONTEND_PLATFORM_POST_STARTUP, WORKBENCH_POST_STARTUP } from './workbench-initializer';
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL3N0YXJ0dXAvcHVibGljX2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ2pGLE9BQU8sRUFBdUIsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsa0NBQWtDLEVBQUUsbUNBQW1DLEVBQUUsc0JBQXNCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMyBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuZXhwb3J0IHtXb3JrYmVuY2hMYXVuY2hlciwgV29ya2JlbmNoU3RhcnR1cH0gZnJvbSAnLi93b3JrYmVuY2gtbGF1bmNoZXIuc2VydmljZSc7XG5leHBvcnQge1dvcmtiZW5jaEluaXRpYWxpemVyLCBXT1JLQkVOQ0hfU1RBUlRVUCwgV09SS0JFTkNIX1BSRV9TVEFSVFVQLCBNSUNST0ZST05URU5EX1BMQVRGT1JNX1BSRV9TVEFSVFVQLCBNSUNST0ZST05URU5EX1BMQVRGT1JNX1BPU1RfU1RBUlRVUCwgV09SS0JFTkNIX1BPU1RfU1RBUlRVUH0gZnJvbSAnLi93b3JrYmVuY2gtaW5pdGlhbGl6ZXInO1xuIl19
@@ -1,24 +0,0 @@
1
- /*
2
- * Copyright (c) 2018-2022 Swiss Federal Railways
3
- *
4
- * This program and the accompanying materials are made
5
- * available under the terms of the Eclipse Public License 2.0
6
- * which is available at https://www.eclipse.org/legal/epl-2.0/
7
- *
8
- * SPDX-License-Identifier: EPL-2.0
9
- */
10
- import { ChangeDetectionStrategy, Component } from '@angular/core';
11
- import { SciThrobberComponent } from '@scion/components/throbber';
12
- import * as i0 from "@angular/core";
13
- /**
14
- * Default splash displayed while starting the workbench.
15
- */
16
- export class SplashComponent {
17
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: SplashComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
18
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.2", type: SplashComponent, isStandalone: true, selector: "wb-splash", ngImport: i0, template: "<sci-throbber type=\"ellipsis\"/>\n", styles: [":host{display:grid;justify-content:center;margin-top:3em}:host>sci-throbber{--sci-throbber-size: 80px}\n"], dependencies: [{ kind: "component", type: SciThrobberComponent, selector: "sci-throbber", inputs: ["type"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
19
- }
20
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: SplashComponent, decorators: [{
21
- type: Component,
22
- args: [{ selector: 'wb-splash', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [SciThrobberComponent], template: "<sci-throbber type=\"ellipsis\"/>\n", styles: [":host{display:grid;justify-content:center;margin-top:3em}:host>sci-throbber{--sci-throbber-size: 80px}\n"] }]
23
- }] });
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsYXNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL3N0YXJ0dXAvc3BsYXNoL3NwbGFzaC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi9zdGFydHVwL3NwbGFzaC9zcGxhc2guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDOztBQUVoRTs7R0FFRztBQVNILE1BQU0sT0FBTyxlQUFlOzhHQUFmLGVBQWU7a0dBQWYsZUFBZSxxRUN4QjVCLHFDQUNBLGtLRHFCWSxvQkFBb0I7OzJGQUVuQixlQUFlO2tCQVIzQixTQUFTOytCQUNFLFdBQVcsbUJBR0osdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1AsQ0FBQyxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMiBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7U2NpVGhyb2JiZXJDb21wb25lbnR9IGZyb20gJ0BzY2lvbi9jb21wb25lbnRzL3Rocm9iYmVyJztcblxuLyoqXG4gKiBEZWZhdWx0IHNwbGFzaCBkaXNwbGF5ZWQgd2hpbGUgc3RhcnRpbmcgdGhlIHdvcmtiZW5jaC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnd2Itc3BsYXNoJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NwbGFzaC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NwbGFzaC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1NjaVRocm9iYmVyQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgU3BsYXNoQ29tcG9uZW50IHtcbn1cbiIsIjxzY2ktdGhyb2JiZXIgdHlwZT1cImVsbGlwc2lzXCIvPlxuIl19