@scion/workbench 17.0.0-beta.9 → 18.0.0-beta.10
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.
- package/_index.scss +7 -5
- package/design/_workbench-global-styles.scss +18 -0
- package/design/_workbench-icon-font.scss +1 -1
- package/design/_workbench-popup-global-styles.scss +1 -1
- package/design/{_workbench-view-drag-image-global-styles.scss → _workbench-view-global-styles.scss} +1 -2
- package/esm2022/lib/activation-instant.provider.mjs +3 -3
- package/esm2022/lib/common/asserts.util.mjs +1 -1
- package/esm2022/lib/common/class-list.mjs +67 -29
- package/esm2022/lib/common/coerce-observable.pipe.mjs +3 -3
- package/esm2022/lib/common/dom.util.mjs +1 -1
- package/esm2022/lib/common/grid-element-if-visible.pipe.mjs +4 -4
- package/esm2022/lib/common/instanceof.pipe.mjs +3 -3
- package/esm2022/lib/common/map-coerce.pipe.mjs +3 -3
- package/esm2022/lib/common/math.util.mjs +16 -0
- package/esm2022/lib/common/null-if-empty.pipe.mjs +4 -4
- package/esm2022/lib/common/objects.util.mjs +7 -1
- package/esm2022/lib/common/observables.mjs +1 -1
- package/esm2022/lib/common/operators.mjs +1 -12
- package/esm2022/lib/common/stringify-error.util.mjs +1 -1
- package/esm2022/lib/common/typeof.pipe.mjs +3 -3
- package/esm2022/lib/common/uid.util.mjs +22 -0
- package/esm2022/lib/common//311/265destroy-ref.mjs +1 -1
- package/esm2022/lib/content-projection/content-as-overlay.component.mjs +87 -30
- package/esm2022/lib/content-projection/workbench-element-references.mjs +32 -0
- package/esm2022/lib/dialog/dialog-footer/dialog-action-filter.pipe.mjs +3 -3
- package/esm2022/lib/dialog/dialog-footer/dialog-footer.component.mjs +3 -3
- package/esm2022/lib/dialog/dialog-footer/workbench-dialog-action.directive.mjs +3 -3
- package/esm2022/lib/dialog/dialog-footer/workbench-dialog-footer.directive.mjs +3 -3
- package/esm2022/lib/dialog/dialog-header/dialog-header.component.mjs +5 -10
- package/esm2022/lib/dialog/dialog-header/workbench-dialog-header.directive.mjs +3 -3
- package/esm2022/lib/dialog/movable.directive.mjs +6 -6
- package/esm2022/lib/dialog/resizable.directive.mjs +6 -6
- package/esm2022/lib/dialog/workbench-dialog.component.mjs +27 -25
- package/esm2022/lib/dialog/workbench-dialog.mjs +61 -1
- package/esm2022/lib/dialog/workbench-dialog.registry.mjs +4 -4
- package/esm2022/lib/dialog/workbench-dialog.service.mjs +3 -3
- package/esm2022/lib/dialog//311/265workbench-dialog.mjs +99 -61
- package/esm2022/lib/dialog//311/265workbench-dialog.service.mjs +28 -25
- package/esm2022/lib/executor/latest-task-executor.mjs +55 -0
- package/esm2022/lib/executor/single-task-executor.mjs +9 -19
- package/esm2022/lib/filter-field/filter-field.component.mjs +8 -8
- package/esm2022/lib/glass-pane/glass-pane.directive.mjs +4 -4
- package/esm2022/lib/layout/grid-element/grid-element.component.mjs +10 -20
- package/esm2022/lib/layout/main-area-layout/main-area-layout.component.mjs +19 -22
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v5.model.mjs +11 -0
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v6.model.mjs +11 -0
- package/esm2022/lib/layout/migration/workbench-layout-migration-v3.service.mjs +7 -7
- package/esm2022/lib/layout/migration/workbench-layout-migration-v4.service.mjs +4 -4
- package/esm2022/lib/layout/migration/workbench-layout-migration-v5.service.mjs +67 -0
- package/esm2022/lib/layout/migration/workbench-layout-migration-v6.service.mjs +59 -0
- package/esm2022/lib/layout/stringifier.mjs +70 -0
- package/esm2022/lib/layout/workbench-layout.component.mjs +19 -23
- package/esm2022/lib/layout/workbench-layout.factory.mjs +3 -3
- package/esm2022/lib/layout/workbench-layout.mjs +1 -1
- package/esm2022/lib/layout/workbench-layout.model.mjs +1 -1
- package/esm2022/lib/layout/workbench-layout.service.mjs +28 -26
- package/esm2022/lib/layout/workbench-layouts.util.mjs +1 -9
- package/esm2022/lib/layout/workench-layout-serializer.service.mjs +22 -32
- package/esm2022/lib/layout//311/265workbench-layout.factory.mjs +6 -5
- package/esm2022/lib/layout//311/265workbench-layout.mjs +77 -66
- package/esm2022/lib/logging/console-appender.service.mjs +4 -4
- package/esm2022/lib/logging/logger.mjs +3 -3
- package/esm2022/lib/logging/logging-support.mjs +7 -13
- package/esm2022/lib/logging/logging.model.mjs +3 -3
- package/esm2022/lib/logging//311/265logger.mjs +12 -12
- package/esm2022/lib/message-box/message-box-footer/message-box-footer.component.mjs +9 -8
- package/esm2022/lib/message-box/message-box-header/message-box-header.component.mjs +5 -5
- package/esm2022/lib/message-box/workbench-message-box.component.mjs +5 -5
- package/esm2022/lib/message-box/workbench-message-box.service.mjs +3 -3
- package/esm2022/lib/message-box//311/265workbench-message-box.service.mjs +6 -5
- package/esm2022/lib/microfrontend-platform/common/microfrontend.util.mjs +22 -6
- package/esm2022/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.mjs +29 -22
- package/esm2022/lib/microfrontend-platform/initialization/ng-zone-observable-decorator.mjs +6 -6
- package/esm2022/lib/microfrontend-platform/initialization/workbench-host-manifest-interceptor.service.mjs +14 -4
- package/esm2022/lib/microfrontend-platform/manifest-object-cache.service.mjs +63 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-capability-validator.interceptor.mjs +8 -7
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-intent-handler.interceptor.mjs +4 -4
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog.component.mjs +8 -12
- package/esm2022/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.mjs +21 -12
- package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/microfrontend-host-message-box.component.mjs +10 -9
- package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/text-message/text-message.component.mjs +6 -6
- package/esm2022/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.mjs +17 -15
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-capability-validator.interceptor.mjs +6 -5
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-intent-handler.interceptor.mjs +4 -4
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-legacy-intent-translator.interceptor.mjs +4 -4
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box.component.mjs +10 -15
- package/esm2022/lib/microfrontend-platform/microfrontend-notification/microfrontend-notification-intent-handler.service.mjs +3 -3
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-capability-validator.interceptor.mjs +39 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-installer.service.mjs +120 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-intent-handler.interceptor.mjs +55 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/workbench-perspective-data.mjs +19 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-platform-config-loader.mjs +3 -3
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-capability-validator.interceptor.mjs +7 -6
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.mjs +13 -14
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.mjs +14 -30
- package/esm2022/lib/microfrontend-platform/microfrontend-splash/microfrontend-splash.component.mjs +5 -5
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.mjs +13 -29
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.mjs +92 -72
- package/esm2022/lib/microfrontend-platform/public_api.mjs +2 -1
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-validator.interceptor.mjs +8 -7
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.mjs +20 -18
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-routes.mjs +30 -8
- package/esm2022/lib/microfrontend-platform/stable-capability-id-assigner.interceptor.mjs +32 -0
- package/esm2022/lib/microfrontend-platform/workbench-microfrontend-support.mjs +29 -11
- package/esm2022/lib/migration/workbench-migrator.mjs +1 -1
- package/esm2022/lib/notification/notification-css-classes.pipe.mjs +3 -3
- package/esm2022/lib/notification/notification-list.component.mjs +6 -10
- package/esm2022/lib/notification/notification.component.mjs +6 -7
- package/esm2022/lib/notification/notification.service.mjs +8 -7
- package/esm2022/lib/notification/text-notification.component.mjs +3 -3
- package/esm2022/lib/notification//311/265notification.mjs +1 -1
- package/esm2022/lib/page-not-found/page-not-found.component.mjs +7 -9
- package/esm2022/lib/part/part-action-bar/part-action-bar.component.mjs +12 -20
- package/esm2022/lib/part/part-action-bar/part-action.directive.mjs +7 -7
- package/esm2022/lib/part/part-bar/part-bar.component.mjs +334 -265
- package/esm2022/lib/part/part-portal.pipe.mjs +10 -10
- package/esm2022/lib/part/part.component.mjs +34 -43
- package/esm2022/lib/part/view-context-menu/accelerator-format.pipe.mjs +4 -4
- package/esm2022/lib/part/view-context-menu/text.component.mjs +17 -13
- package/esm2022/lib/part/view-context-menu/view-menu.component.mjs +6 -8
- package/esm2022/lib/part/view-context-menu/view-menu.directive.mjs +5 -5
- package/esm2022/lib/part/view-context-menu/view-menu.service.mjs +50 -51
- package/esm2022/lib/part/view-list/view-list.component.mjs +42 -49
- package/esm2022/lib/part/view-list-button/view-list-button.component.mjs +23 -27
- package/esm2022/lib/part/view-list-item/view-list-item.component.mjs +16 -18
- package/esm2022/lib/part/view-tab/view-tab.component.mjs +100 -111
- package/esm2022/lib/part/view-tab-content/view-tab-content.component.mjs +5 -6
- package/esm2022/lib/part/view-tab-drag-image/view-tab-drag-image.component.mjs +17 -18
- package/esm2022/lib/part/workbench-part-action.registry.mjs +18 -42
- package/esm2022/lib/part/workbench-part.model.mjs +10 -1
- package/esm2022/lib/part/workbench-part.registry.mjs +11 -45
- package/esm2022/lib/part//311/265workbench-part.model.mjs +71 -55
- package/esm2022/lib/perspective/migration/workbench-perspective-migration-v2.service.mjs +4 -4
- package/esm2022/lib/perspective/workbench-grid-merger.service.mjs +6 -6
- package/esm2022/lib/perspective/workbench-perspective-storage.service.mjs +4 -4
- package/esm2022/lib/perspective/workbench-perspective-view-conflict-resolver.service.mjs +4 -4
- package/esm2022/lib/perspective/workbench-perspective.model.mjs +1 -1
- package/esm2022/lib/perspective/workbench-perspective.registry.mjs +11 -43
- package/esm2022/lib/perspective/workbench-perspective.service.mjs +73 -64
- package/esm2022/lib/perspective/workench-perspective-serializer.service.mjs +5 -5
- package/esm2022/lib/perspective//311/265workbench-perspective.model.mjs +62 -47
- package/esm2022/lib/popup/popup.component.mjs +6 -6
- package/esm2022/lib/popup/popup.config.mjs +27 -25
- package/esm2022/lib/popup/popup.service.mjs +171 -176
- package/esm2022/lib/portal/wb-component-portal.mjs +18 -17
- package/esm2022/lib/portal/workbench-portal-outlet.directive.mjs +4 -4
- package/esm2022/lib/public_api.mjs +1 -1
- package/esm2022/lib/registry/workbench-object-registry.mjs +38 -17
- package/esm2022/lib/routing/empty-outlet/empty-outlet.component.mjs +3 -3
- package/esm2022/lib/routing/public_api.mjs +2 -2
- package/esm2022/lib/routing/routing.model.mjs +1 -1
- package/esm2022/lib/routing/routing.util.mjs +215 -0
- package/esm2022/lib/routing/url-segment-matcher.mjs +1 -1
- package/esm2022/lib/routing/workbench-auxiliary-route-installer.service.mjs +110 -0
- package/esm2022/lib/routing/workbench-dialog-differ.mjs +6 -6
- package/esm2022/lib/routing/workbench-layout-differ.mjs +6 -13
- package/esm2022/lib/routing/workbench-message-box-differ.mjs +6 -6
- package/esm2022/lib/routing/workbench-navigational-states.mjs +2 -2
- package/esm2022/lib/routing/workbench-popup-differ.mjs +6 -6
- package/esm2022/lib/routing/workbench-route-guards.mjs +57 -0
- package/esm2022/lib/routing/workbench-router-link.directive.mjs +5 -5
- package/esm2022/lib/routing/workbench-router.service.mjs +3 -3
- package/esm2022/lib/routing/workbench-url-observer.service.mjs +143 -151
- package/esm2022/lib/routing/workbench-view-outlet-differ.mjs +58 -0
- package/esm2022/lib/routing//311/265location.mjs +3 -3
- package/esm2022/lib/routing//311/265workbench-router.service.mjs +121 -76
- package/esm2022/lib/startup/splash/splash.component.mjs +5 -5
- package/esm2022/lib/startup/workbench-initializer.mjs +1 -1
- package/esm2022/lib/startup/workbench-launcher.service.mjs +28 -16
- package/esm2022/lib/storage/workbench-storage.mjs +3 -3
- package/esm2022/lib/testing/workbench-testing.module.mjs +4 -4
- package/esm2022/lib/testing/workbench.provider.mjs +5 -5
- package/esm2022/lib/theme/workbench-theme-switcher.service.mjs +18 -22
- package/esm2022/lib/view/public_api.mjs +1 -2
- package/esm2022/lib/view/view-move-handler.service.mjs +73 -58
- package/esm2022/lib/view/view-portal.pipe.mjs +9 -9
- package/esm2022/lib/view/view.component.mjs +55 -43
- package/esm2022/lib/view/workbench-view.model.mjs +1 -1
- package/esm2022/lib/view/workbench-view.registry.mjs +11 -45
- package/esm2022/lib/view//311/265workbench-view.model.mjs +183 -153
- package/esm2022/lib/view-dnd/grid-drop-targets.util.mjs +2 -2
- package/esm2022/lib/view-dnd/requires-drop-zone.pipe.mjs +4 -4
- package/esm2022/lib/view-dnd/view-drag.service.mjs +89 -73
- package/esm2022/lib/view-dnd/view-drop-placeholder-renderer.service.mjs +9 -9
- package/esm2022/lib/view-dnd/view-drop-zone.directive.mjs +9 -9
- package/esm2022/lib/view-dnd/view-tab-drag-image-renderer.service.mjs +45 -58
- package/esm2022/lib/workbench-config.mjs +2 -2
- package/esm2022/lib/workbench-id.mjs +3 -3
- package/esm2022/lib/workbench.component.mjs +67 -55
- package/esm2022/lib/workbench.constants.mjs +1 -5
- package/esm2022/lib/workbench.model.mjs +1 -1
- package/esm2022/lib/workbench.module.mjs +4 -4
- package/esm2022/lib/workbench.provider.mjs +3 -9
- package/esm2022/lib/workbench.service.mjs +4 -4
- package/esm2022/lib//311/265workbench.service.mjs +40 -44
- package/fesm2022/scion-workbench.mjs +4348 -3628
- package/fesm2022/scion-workbench.mjs.map +1 -1
- package/lib/common/class-list.d.ts +35 -22
- package/lib/common/math.util.d.ts +7 -0
- package/lib/common/objects.util.d.ts +6 -2
- package/lib/common/operators.d.ts +1 -6
- package/lib/common/uid.util.d.ts +9 -0
- package/lib/content-projection/content-as-overlay.component.d.ts +39 -22
- package/lib/content-projection/workbench-element-references.d.ts +13 -0
- package/lib/dialog/workbench-dialog.component.d.ts +3 -2
- package/lib/dialog/workbench-dialog.d.ts +57 -13
- package/lib/dialog//311/265workbench-dialog.d.ts +38 -24
- package/lib/dialog//311/265workbench-dialog.service.d.ts +10 -11
- package/lib/executor/latest-task-executor.d.ts +26 -0
- package/lib/executor/single-task-executor.d.ts +5 -8
- package/lib/filter-field/filter-field.component.d.ts +1 -1
- package/lib/layout/grid-element/grid-element.component.d.ts +1 -8
- package/lib/layout/main-area-layout/main-area-layout.component.d.ts +0 -4
- package/lib/layout/migration/model/workbench-layout-migration-v5.model.d.ts +36 -0
- package/lib/layout/migration/model/workbench-layout-migration-v6.model.d.ts +35 -0
- package/lib/layout/migration/{workbench-layout-migration-v2.service.d.ts → workbench-layout-migration-v5.service.d.ts} +4 -5
- package/lib/layout/migration/workbench-layout-migration-v6.service.d.ts +12 -0
- package/lib/layout/stringifier.d.ts +26 -0
- package/lib/layout/workbench-layout.component.d.ts +4 -5
- package/lib/layout/workbench-layout.d.ts +9 -6
- package/lib/layout/workbench-layout.model.d.ts +4 -3
- package/lib/layout/workbench-layout.service.d.ts +14 -16
- package/lib/layout/workbench-layouts.util.d.ts +0 -6
- package/lib/layout/workench-layout-serializer.service.d.ts +13 -16
- package/lib/layout//311/265workbench-layout.d.ts +18 -19
- package/lib/layout//311/265workbench-layout.factory.d.ts +3 -2
- package/lib/logging//311/265logger.d.ts +2 -3
- package/lib/microfrontend-platform/common/microfrontend.util.d.ts +5 -1
- package/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.d.ts +7 -3
- package/lib/microfrontend-platform/manifest-object-cache.service.d.ts +33 -0
- package/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.d.ts +3 -6
- package/lib/microfrontend-platform/microfrontend-host-message-box/microfrontend-host-message-box.component.d.ts +2 -1
- package/lib/microfrontend-platform/microfrontend-host-message-box/text-message/text-message.component.d.ts +1 -1
- package/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.d.ts +2 -1
- package/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-capability-validator.interceptor.d.ts +10 -0
- package/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-installer.service.d.ts +24 -0
- package/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-intent-handler.interceptor.d.ts +20 -0
- package/lib/microfrontend-platform/microfrontend-perspective/workbench-perspective-data.d.ts +9 -0
- package/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.d.ts +4 -8
- package/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.d.ts +0 -4
- package/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.d.ts +5 -12
- package/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.d.ts +23 -33
- package/lib/microfrontend-platform/public_api.d.ts +1 -0
- package/lib/microfrontend-platform/routing/microfrontend-view-capability-validator.interceptor.d.ts +1 -1
- package/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.d.ts +3 -7
- package/lib/microfrontend-platform/routing/microfrontend-view-routes.d.ts +9 -2
- package/lib/microfrontend-platform/stable-capability-id-assigner.interceptor.d.ts +11 -0
- package/lib/notification/notification-list.component.d.ts +0 -2
- package/lib/page-not-found/page-not-found.component.d.ts +1 -0
- package/lib/part/part-action-bar/part-action-bar.component.d.ts +3 -4
- package/lib/part/part-action-bar/part-action.directive.d.ts +2 -2
- package/lib/part/part-bar/part-bar.component.d.ts +73 -63
- package/lib/part/part-portal.pipe.d.ts +3 -5
- package/lib/part/part.component.d.ts +9 -12
- package/lib/part/view-context-menu/text.component.d.ts +3 -4
- package/lib/part/view-context-menu/view-menu.directive.d.ts +1 -1
- package/lib/part/view-context-menu/view-menu.service.d.ts +13 -17
- package/lib/part/view-list/view-list.component.d.ts +8 -21
- package/lib/part/view-list-button/view-list-button.component.d.ts +8 -11
- package/lib/part/view-list-item/view-list-item.component.d.ts +3 -7
- package/lib/part/view-tab/view-tab.component.d.ts +19 -29
- package/lib/part/view-tab-drag-image/view-tab-drag-image.component.d.ts +4 -4
- package/lib/part/workbench-part-action.registry.d.ts +3 -23
- package/lib/part/workbench-part.model.d.ts +8 -27
- package/lib/part/workbench-part.registry.d.ts +3 -26
- package/lib/part//311/265workbench-part.model.d.ts +23 -17
- package/lib/perspective/workbench-perspective.model.d.ts +18 -25
- package/lib/perspective/workbench-perspective.registry.d.ts +3 -26
- package/lib/perspective/workbench-perspective.service.d.ts +16 -14
- package/lib/perspective/workench-perspective-serializer.service.d.ts +1 -1
- package/lib/perspective//311/265workbench-perspective.model.d.ts +30 -21
- package/lib/popup/popup.config.d.ts +11 -10
- package/lib/popup/popup.service.d.ts +15 -28
- package/lib/portal/wb-component-portal.d.ts +21 -5
- package/lib/public_api.d.ts +1 -1
- package/lib/registry/workbench-object-registry.d.ts +10 -6
- package/lib/routing/public_api.d.ts +2 -2
- package/lib/routing/routing.model.d.ts +25 -13
- package/lib/routing/{router.util.d.ts → routing.util.d.ts} +28 -1
- package/lib/routing/{workbench-auxiliary-routes-registrator.service.d.ts → workbench-auxiliary-route-installer.service.d.ts} +10 -3
- package/lib/routing/workbench-layout-differ.d.ts +1 -2
- package/lib/routing/workbench-navigational-states.d.ts +8 -4
- package/lib/{view/workbench-view-route-guards.d.ts → routing/workbench-route-guards.d.ts} +8 -2
- package/lib/routing/workbench-url-observer.service.d.ts +31 -55
- package/lib/routing/workbench-view-outlet-differ.d.ts +32 -0
- package/lib/routing//311/265workbench-router.service.d.ts +22 -18
- package/lib/startup/workbench-launcher.service.d.ts +4 -5
- package/lib/testing/workbench.provider.d.ts +3 -1
- package/lib/theme/workbench-theme-switcher.service.d.ts +4 -6
- package/lib/view/public_api.d.ts +0 -1
- package/lib/view/view-move-handler.service.d.ts +16 -14
- package/lib/view/view-portal.pipe.d.ts +1 -3
- package/lib/view/view.component.d.ts +21 -12
- package/lib/view/workbench-view.model.d.ts +88 -36
- package/lib/view/workbench-view.registry.d.ts +3 -27
- package/lib/view//311/265workbench-view.model.d.ts +62 -71
- package/lib/view-dnd/view-drag.service.d.ts +79 -49
- package/lib/view-dnd/view-drop-placeholder-renderer.service.d.ts +1 -1
- package/lib/view-dnd/view-tab-drag-image-renderer.service.d.ts +12 -36
- package/lib/workbench-config.d.ts +19 -7
- package/lib/workbench.component.d.ts +16 -30
- package/lib/workbench.constants.d.ts +0 -5
- package/lib/workbench.model.d.ts +31 -3
- package/lib/workbench.service.d.ts +58 -56
- package/lib//311/265workbench.service.d.ts +18 -31
- package/package.json +12 -12
- package/esm2022/lib/common/filter-by-predicate.pipe.mjs +0 -27
- package/esm2022/lib/common/filter-by-text.pipe.mjs +0 -39
- package/esm2022/lib/common/uuid.util.mjs +0 -17
- package/esm2022/lib/content-projection/content-projection.directive.mjs +0 -101
- package/esm2022/lib/content-projection/view-container.reference.mjs +0 -68
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v1.model.mjs +0 -11
- package/esm2022/lib/layout/migration/workbench-layout-migration-v2.service.mjs +0 -59
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-id-assigner.interceptor.mjs +0 -41
- package/esm2022/lib/page-not-found/format-url.pipe.mjs +0 -26
- package/esm2022/lib/part/part-action-bar/part-action-filter.pipe.mjs +0 -26
- package/esm2022/lib/routing/router.util.mjs +0 -126
- package/esm2022/lib/routing/workbench-auxiliary-routes-registrator.service.mjs +0 -94
- package/esm2022/lib/view/workbench-view-route-guards.mjs +0 -47
- package/lib/common/filter-by-predicate.pipe.d.ts +0 -10
- package/lib/common/filter-by-text.pipe.d.ts +0 -12
- package/lib/common/uuid.util.d.ts +0 -8
- package/lib/content-projection/content-projection.directive.d.ts +0 -30
- package/lib/content-projection/view-container.reference.d.ts +0 -42
- package/lib/layout/migration/model/workbench-layout-migration-v1.model.d.ts +0 -16
- package/lib/microfrontend-platform/routing/microfrontend-view-capability-id-assigner.interceptor.d.ts +0 -10
- package/lib/page-not-found/format-url.pipe.d.ts +0 -11
- package/lib/part/part-action-bar/part-action-filter.pipe.d.ts +0 -11
|
@@ -0,0 +1,215 @@
|
|
|
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 { ActivationEnd, ActivationStart, ChildrenOutletContexts, NavigationStart, PRIMARY_OUTLET, Router } from '@angular/router';
|
|
11
|
+
import { DIALOG_ID_PREFIX, MESSAGE_BOX_ID_PREFIX, POPUP_ID_PREFIX, VIEW_ID_PREFIX } from '../workbench.constants';
|
|
12
|
+
import { inject } from '@angular/core';
|
|
13
|
+
import { EMPTY, iif, of, pairwise, race, switchMap } from 'rxjs';
|
|
14
|
+
import { filter, map, startWith, take } from 'rxjs/operators';
|
|
15
|
+
/**
|
|
16
|
+
* Provides utility functions for router operations.
|
|
17
|
+
*/
|
|
18
|
+
export const Routing = {
|
|
19
|
+
/**
|
|
20
|
+
* Converts given URL segments into an array of commands that can be passed to the Angular router for navigation.
|
|
21
|
+
*/
|
|
22
|
+
segmentsToCommands: (segments) => {
|
|
23
|
+
const commands = new Array();
|
|
24
|
+
segments.forEach(segment => {
|
|
25
|
+
if (segment.path) {
|
|
26
|
+
commands.push(segment.path);
|
|
27
|
+
}
|
|
28
|
+
if (segment.parameters && Object.keys(segment.parameters).length) {
|
|
29
|
+
commands.push(segment.parameters);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
return commands;
|
|
33
|
+
},
|
|
34
|
+
/**
|
|
35
|
+
* Constructs URL segments from given commands, resolving any relative navigational symbols.
|
|
36
|
+
*
|
|
37
|
+
* This function must be called inside an injection context.
|
|
38
|
+
*/
|
|
39
|
+
commandsToSegments: (commands, options) => {
|
|
40
|
+
// Ignore `relativeTo` for absolute commands.
|
|
41
|
+
const isAbsolutePath = typeof commands[0] === 'string' && commands[0].startsWith('/');
|
|
42
|
+
const relativeTo = isAbsolutePath ? null : (options?.relativeTo || null);
|
|
43
|
+
// Angular throws the error 'NG04003: Root segment cannot have matrix parameters' when passing an empty path command
|
|
44
|
+
// followed by a matrix params object, but not when passing matrix params as the first command. For consistency, when
|
|
45
|
+
// passing matrix params as the first command, we prepend an empty path for Angular to throw the same error.
|
|
46
|
+
if (typeof commands[0] === 'object' && (!relativeTo || Routing.hasEmptyPathFromRoot(relativeTo))) {
|
|
47
|
+
commands = ['', ...commands];
|
|
48
|
+
}
|
|
49
|
+
const urlTree = inject(Router).createUrlTree(commands, { relativeTo });
|
|
50
|
+
return urlTree.root.children[relativeTo?.pathFromRoot[1]?.outlet ?? PRIMARY_OUTLET]?.segments ?? [];
|
|
51
|
+
},
|
|
52
|
+
/**
|
|
53
|
+
* Parses the given path and matrix parameters into an array of commands that can be passed to the Angular router for navigation.
|
|
54
|
+
*
|
|
55
|
+
* This function must be called inside an injection context.
|
|
56
|
+
*/
|
|
57
|
+
pathToCommands: (path) => {
|
|
58
|
+
const urlTree = inject(Router).parseUrl(path);
|
|
59
|
+
const segments = urlTree.root.children[PRIMARY_OUTLET]?.segments;
|
|
60
|
+
if (!segments) {
|
|
61
|
+
throw Error(`[RouterError] Cannot match any routes for path '${path}'.`);
|
|
62
|
+
}
|
|
63
|
+
return Routing.segmentsToCommands(segments);
|
|
64
|
+
},
|
|
65
|
+
/**
|
|
66
|
+
* Resolves the effective (=leaf) {@link ActivatedRoute} activated in a router outlet.
|
|
67
|
+
*
|
|
68
|
+
* Depending on the route hierarchy, when navigating to a child route with component-less parent routes, the route of an outlet may not be the effectively activated child route.
|
|
69
|
+
*/
|
|
70
|
+
resolveEffectiveRoute: (route) => {
|
|
71
|
+
return route.firstChild ? Routing.resolveEffectiveRoute(route.firstChild) : route;
|
|
72
|
+
},
|
|
73
|
+
/**
|
|
74
|
+
* Resolves the effective (=leaf) {@link OutletContext} of a router outlet.
|
|
75
|
+
*
|
|
76
|
+
* Depending on the route hierarchy, when navigating to a child route with component-less parent routes, the context of an outlet may not be the effectively activated child context.
|
|
77
|
+
*/
|
|
78
|
+
resolveEffectiveOutletContext: (outletContext) => {
|
|
79
|
+
const childOutletContext = outletContext?.children.getContext(PRIMARY_OUTLET);
|
|
80
|
+
return childOutletContext ? Routing.resolveEffectiveOutletContext(childOutletContext) : outletContext;
|
|
81
|
+
},
|
|
82
|
+
/**
|
|
83
|
+
* Looks for requested data on given route, or its parent route(s) if not found.
|
|
84
|
+
*/
|
|
85
|
+
lookupRouteData: (activatedRoute, dataKey) => {
|
|
86
|
+
return activatedRoute.pathFromRoot.reduceRight((resolvedData, route) => resolvedData ?? route.data[dataKey], undefined);
|
|
87
|
+
},
|
|
88
|
+
/**
|
|
89
|
+
* Tests if the given outlet matches the format of the view outlet.
|
|
90
|
+
*/
|
|
91
|
+
isViewOutlet: (outlet) => {
|
|
92
|
+
return outlet?.startsWith(VIEW_ID_PREFIX) ?? false;
|
|
93
|
+
},
|
|
94
|
+
/**
|
|
95
|
+
* Tests if the given outlet matches the format of a popup outlet.
|
|
96
|
+
*/
|
|
97
|
+
isPopupOutlet: (outlet) => {
|
|
98
|
+
return outlet?.startsWith(POPUP_ID_PREFIX) ?? false;
|
|
99
|
+
},
|
|
100
|
+
/**
|
|
101
|
+
* Tests if the given outlet matches the format of a dialog outlet.
|
|
102
|
+
*/
|
|
103
|
+
isDialogOutlet: (outlet) => {
|
|
104
|
+
return outlet?.startsWith(DIALOG_ID_PREFIX) ?? false;
|
|
105
|
+
},
|
|
106
|
+
/**
|
|
107
|
+
* Tests if the given outlet matches the format of a message box outlet.
|
|
108
|
+
*/
|
|
109
|
+
isMessageBoxOutlet: (outlet) => {
|
|
110
|
+
return outlet?.startsWith(MESSAGE_BOX_ID_PREFIX) ?? false;
|
|
111
|
+
},
|
|
112
|
+
/**
|
|
113
|
+
* Reads view outlets from given URL.
|
|
114
|
+
*
|
|
115
|
+
* A view outlet contains the URL segments of a view contained in the workbench layout.
|
|
116
|
+
*/
|
|
117
|
+
parseViewOutlets: (url) => {
|
|
118
|
+
const viewOutlets = new Map();
|
|
119
|
+
Object.entries(url.root.children).forEach(([outlet, segmentGroup]) => {
|
|
120
|
+
if (Routing.isViewOutlet(outlet)) {
|
|
121
|
+
viewOutlets.set(outlet, segmentGroup.segments);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
return viewOutlets;
|
|
125
|
+
},
|
|
126
|
+
/**
|
|
127
|
+
* Tests if given route has an empty path from root.
|
|
128
|
+
*/
|
|
129
|
+
hasEmptyPathFromRoot(route) {
|
|
130
|
+
return route.snapshot.pathFromRoot.flatMap(route => route.url).filter(segment => segment.path.length).length === 0;
|
|
131
|
+
},
|
|
132
|
+
/**
|
|
133
|
+
* Observes the route activation for the specified outlet.
|
|
134
|
+
*
|
|
135
|
+
* The observable emits after the previous component has been destroyed (if any) but before constructing the new component.
|
|
136
|
+
*
|
|
137
|
+
* Options to control when to emit:
|
|
138
|
+
* - `routeChange`: Emit only when navigating the outlet to a different route.
|
|
139
|
+
* - `routeOrParamChange`: Emit when navigating the outlet to a different route or changing params (named path params or matrix params).
|
|
140
|
+
* - `always`: Emit at every navigation, even if the outlet is not the target of the navigation.
|
|
141
|
+
*
|
|
142
|
+
* This method must be called within an injection context.
|
|
143
|
+
*
|
|
144
|
+
* Note: Listening for route activations/deactivations on the router outlet alone is insufficient for nested routes, as the outlet does not report
|
|
145
|
+
* activations/deactivations of child routes.
|
|
146
|
+
*
|
|
147
|
+
* @param outlet - Specifies the outlet to observe.
|
|
148
|
+
* @param options - Controls when to emit the observable.
|
|
149
|
+
* @return An observable emitting a tuple of the previous and current route snapshots.
|
|
150
|
+
*/
|
|
151
|
+
activatedRoute$(outlet, options) {
|
|
152
|
+
const router = inject(Router);
|
|
153
|
+
const childrenOutletContexts = inject(ChildrenOutletContexts);
|
|
154
|
+
const onNavigationStart$ = router.events.pipe(filterNavigationStart());
|
|
155
|
+
const onActivationStart$ = router.events.pipe(filterActivationStart(), filterByOutlet(outlet));
|
|
156
|
+
const onActivationEnd$ = router.events.pipe(filterActivationEnd(), filterByOutlet(outlet));
|
|
157
|
+
// On each navigation start (`NavigationStart`), subscribe to the outlet's `ActivationStart` event and then to the outlet's deactivate event,
|
|
158
|
+
// enabling continuing of the execution chain after the previous component has been destroyed.
|
|
159
|
+
//
|
|
160
|
+
// If `emitOn` is set to `always`, additionally subscribe to the outlet's `ActivationEnd` event, since no activation (`ActivationStart`) occurs if
|
|
161
|
+
// the outlet is not navigated (e.g., navigating another outlet or updating query params).
|
|
162
|
+
//
|
|
163
|
+
// Note that Angular activates nested routes from parent to child and deactivates them from child to parent, triggering multiple `ActivationStart`
|
|
164
|
+
// and `ActivationEnd` events. For the outlet, the latest `ActivationStart` and the first `ActivationEnd` events are relevant.
|
|
165
|
+
//
|
|
166
|
+
// `ActivationStart` is emitted only if the outlet is actually navigated (route or parameter change), whereas `ActivationEnd` is always emitted.
|
|
167
|
+
//
|
|
168
|
+
// If a navigation is currently in progress, start immediately, allowing subscriptions even during ongoing navigation, such as after the navigation
|
|
169
|
+
// has started.
|
|
170
|
+
return iif(() => !router.getCurrentNavigation(), onNavigationStart$, onNavigationStart$.pipe(startWith(undefined)))
|
|
171
|
+
.pipe(
|
|
172
|
+
// Subscribe to the outlet's `ActivationStart` (and also `ActivationEnd` if the `emitOn` option is set to `always`).
|
|
173
|
+
switchMap(() => options.emitOn === 'always' ? race(onActivationStart$, onActivationEnd$.pipe(take(1))) : onActivationStart$), map(event => event.snapshot), startWith(null), // initialize pairwise operator
|
|
174
|
+
pairwise(), switchMap(([previous, current]) => {
|
|
175
|
+
// If the route hasn't changed and `emitOn` is set to `always` or `routeOrParamChange`, emit immediately since no deactivation will occur.
|
|
176
|
+
const routeChanged = previous?.routeConfig !== current.routeConfig;
|
|
177
|
+
if (!routeChanged) {
|
|
178
|
+
return options.emitOn === 'routeChange' ? EMPTY : of([previous, current]);
|
|
179
|
+
}
|
|
180
|
+
// If there's no previously activated component in the outlet, emit immediately since no deactivation will occur.
|
|
181
|
+
const outletContext = Routing.resolveEffectiveOutletContext(childrenOutletContexts.getContext(outlet));
|
|
182
|
+
if (!outletContext?.outlet?.isActivated) {
|
|
183
|
+
return of([previous, current]);
|
|
184
|
+
}
|
|
185
|
+
// Delay emission until the previously activated component has been destroyed by subscribing to the outlet's deactivation event.
|
|
186
|
+
// Nested routes activate from parent to child, canceling "deactivation" subscriptions of parent outlets, so only the deactivation of the actual outlet is emitted.
|
|
187
|
+
return outletContext.outlet.deactivateEvents.pipe(map(() => [previous, current]));
|
|
188
|
+
}));
|
|
189
|
+
/**
|
|
190
|
+
* Filters {@link NavigationStart} router events.
|
|
191
|
+
*/
|
|
192
|
+
function filterNavigationStart() {
|
|
193
|
+
return filter((event) => event instanceof NavigationStart);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Filters {@link ActivationStart} router events.
|
|
197
|
+
*/
|
|
198
|
+
function filterActivationStart() {
|
|
199
|
+
return filter((event) => event instanceof ActivationStart);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Filters {@link ActivationEnd} router events. This event is emitted for each outlet regardless of whether it has been navigated or not.
|
|
203
|
+
*/
|
|
204
|
+
function filterActivationEnd() {
|
|
205
|
+
return filter((event) => event instanceof ActivationEnd);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Filters router events for the specified outlet.
|
|
209
|
+
*/
|
|
210
|
+
function filterByOutlet(outlet) {
|
|
211
|
+
return filter(event => event.snapshot.pathFromRoot[1]?.outlet === outlet);
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGluZy51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vd29ya2JlbmNoL3NyYy9saWIvcm91dGluZy9yb3V0aW5nLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQXlDLGFBQWEsRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQVMsZUFBZSxFQUFpQixjQUFjLEVBQUUsTUFBTSxFQUFtQyxNQUFNLGlCQUFpQixDQUFDO0FBRWhPLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDaEgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUVyQyxPQUFPLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBd0MsRUFBRSxFQUFvQixRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN2SCxPQUFPLEVBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUc7SUFFckI7O09BRUc7SUFDSCxrQkFBa0IsRUFBRSxDQUFDLFFBQXNCLEVBQVksRUFBRTtRQUN2RCxNQUFNLFFBQVEsR0FBRyxJQUFJLEtBQUssRUFBTyxDQUFDO1FBRWxDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDekIsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2pCLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlCLENBQUM7WUFDRCxJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFB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QUcsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRixDQUFDLENBQUMsQ0FDSCxDQUFDO1FBRUo7O1dBRUc7UUFDSCxTQUFTLHFCQUFxQjtZQUM1QixPQUFPLE1BQU0sQ0FBQyxDQUFDLEtBQTBCLEVBQTRCLEVBQUUsQ0FBQyxLQUFLLFlBQVksZUFBZSxDQUFDLENBQUM7UUFDNUcsQ0FBQztRQUVEOztXQUVHO1FBQ0gsU0FBUyxxQkFBcUI7WUFDNUIsT0FBTyxNQUFNLENBQUMsQ0FBQyxLQUEwQixFQUE0QixFQUFFLENBQUMsS0FBSyxZQUFZLGVBQWUsQ0FBQyxDQUFDO1FBQzVHLENBQUM7UUFFRDs7V0FFRztRQUNILFNBQVMsbUJBQW1CO1lBQzFCLE9BQU8sTUFBTSxDQUFDLENBQUMsS0FBMEIsRUFBMEIsRUFBRSxDQUFDLEtBQUssWUFBWSxhQUFhLENBQUMsQ0FBQztRQUN4RyxDQUFDO1FBRUQ7O1dBRUc7UUFDSCxTQUFTLGNBQWMsQ0FBNEMsTUFBYztZQUMvRSxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sS0FBSyxNQUFNLENBQUMsQ0FBQztRQUM1RSxDQUFDO0lBQ0gsQ0FBQztDQUNPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjQgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7QWN0aXZhdGVkUm91dGUsIEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIEFjdGl2YXRpb25FbmQsIEFjdGl2YXRpb25TdGFydCwgQ2hpbGRyZW5PdXRsZXRDb250ZXh0cywgRXZlbnQsIE5hdmlnYXRpb25TdGFydCwgT3V0bGV0Q29udGV4dCwgUFJJTUFSWV9PVVRMRVQsIFJvdXRlciwgUm91dGVyRXZlbnQsIFVybFNlZ21lbnQsIFVybFRyZWV9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge0NvbW1hbmRzfSBmcm9tICcuLi9yb3V0aW5nL3JvdXRpbmcubW9kZWwnO1xuaW1wb3J0IHtESUFMT0dfSURfUFJFRklYLCBNRVNTQUdFX0JPWF9JRF9QUkVGSVgsIFBPUFVQX0lEX1BSRUZJWCwgVklFV19JRF9QUkVGSVh9IGZyb20gJy4uL3dvcmtiZW5jaC5jb25zdGFudHMnO1xuaW1wb3J0IHtpbmplY3R9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtWaWV3SWR9IGZyb20gJy4uL3ZpZXcvd29ya2JlbmNoLXZpZXcubW9kZWwnO1xuaW1wb3J0IHtFTVBUWSwgaWlmLCBNb25vVHlwZU9wZXJhdG9yRnVuY3Rpb24sIE9ic2VydmFibGUsIG9mLCBPcGVyYXRvckZ1bmN0aW9uLCBwYWlyd2lzZSwgcmFjZSwgc3dpdGNoTWFwfSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZmlsdGVyLCBtYXAsIHN0YXJ0V2l0aCwgdGFrZX0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG4vKipcbiAqIFByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciByb3V0ZXIgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGNvbnN0IFJvdXRpbmcgPSB7XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGdpdmVuIFVSTCBzZWdtZW50cyBpbnRvIGFuIGFycmF5IG9mIGNvbW1hbmRzIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aGUgQW5ndWxhciByb3V0ZXIgZm9yIG5hdmlnYXRpb24uXG4gICAqL1xuICBzZWdtZW50c1RvQ29tbWFuZHM6IChzZWdtZW50czogVXJsU2VnbWVudFtdKTogQ29tbWFuZHMgPT4ge1xuICAgIGNvbnN0IGNvbW1hbmRzID0gbmV3IEFycmF5PGFueT4oKTtcblxuICAgIHNlZ21lbnRzLmZvckVhY2goc2VnbWVudCA9PiB7XG4gICAgICBpZiAoc2VnbWVudC5wYXRoKSB7XG4gICAgICAgIGNvbW1hbmRzLnB1c2goc2VnbWVudC5wYXRoKTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWdtZW50LnBhcmFtZXRlcnMgJiYgT2JqZWN0LmtleXMoc2VnbWVudC5wYXJhbWV0ZXJzKS5sZW5ndGgpIHtcbiAgICAgICAgY29tbWFuZHMucHVzaChzZWdtZW50LnBhcmFtZXRlcnMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbW1hbmRzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIFVSTCBzZWdtZW50cyBmcm9tIGdpdmVuIGNvbW1hbmRzLCByZXNvbHZpbmcgYW55IHJlbGF0aXZlIG5hdmlnYXRpb25hbCBzeW1ib2xzLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGluc2lkZSBhbiBpbmplY3Rpb24gY29udGV4dC5cbiAgICovXG4gIGNvbW1hbmRzVG9TZWdtZW50czogKGNvbW1hbmRzOiBDb21tYW5kcywgb3B0aW9ucz86IHtyZWxhdGl2ZVRvPzogQWN0aXZhdGVkUm91dGUgfCBudWxsfSk6IFVybFNlZ21lbnRbXSA9PiB7XG4gICAgLy8gSWdub3JlIGByZWxhdGl2ZVRvYCBmb3IgYWJzb2x1dGUgY29tbWFuZHMuXG4gICAgY29uc3QgaXNBYnNvbHV0ZVBhdGggPSB0eXBlb2YgY29tbWFuZHNbMF0gPT09ICdzdHJpbmcnICYmIGNvbW1hbmRzWzBdLnN0YXJ0c1dpdGgoJy8nKTtcbiAgICBjb25zdCByZWxhdGl2ZVRvID0gaXNBYnNvbHV0ZVBhdGggPyBudWxsIDogKG9wdGlvbnM/LnJlbGF0aXZlVG8gfHwgbnVsbCk7XG5cbiAgICAvLyBBbmd1bGFyIHRocm93cyB0aGUgZXJyb3IgJ05HMDQwMDM6IFJvb3Qgc2VnbWVudCBjYW5ub3QgaGF2ZSBtYXRyaXggcGFyYW1ldGVycycgd2hlbiBwYXNzaW5nIGFuIGVtcHR5IHBhdGggY29tbWFuZFxuICAgIC8vIGZvbGxvd2VkIGJ5IGEgbWF0cml4IHBhcmFtcyBvYmplY3QsIGJ1dCBub3Qgd2hlbiBwYXNzaW5nIG1hdHJpeCBwYXJhbXMgYXMgdGhlIGZpcnN0IGNvbW1hbmQuIEZvciBjb25zaXN0ZW5jeSwgd2hlblxuICAgIC8vIHBhc3NpbmcgbWF0cml4IHBhcmFtcyBhcyB0aGUgZmlyc3QgY29tbWFuZCwgd2UgcHJlcGVuZCBhbiBlbXB0eSBwYXRoIGZvciBBbmd1bGFyIHRvIHRocm93IHRoZSBzYW1lIGVycm9yLlxuICAgIGlmICh0eXBlb2YgY29tbWFuZHNbMF0gPT09ICdvYmplY3QnICYmICghcmVsYXRpdmVUbyB8fCBSb3V0aW5nLmhhc0VtcHR5UGF0aEZyb21Sb290KHJlbGF0aXZlVG8pKSkge1xuICAgICAgY29tbWFuZHMgPSBbJycsIC4uLmNvbW1hbmRzXTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmxUcmVlID0gaW5qZWN0KFJvdXRlcikuY3JlYXRlVXJsVHJlZShjb21tYW5kcywge3JlbGF0aXZlVG99KTtcbiAgICByZXR1cm4gdXJsVHJlZS5yb290LmNoaWxkcmVuW3JlbGF0aXZlVG8/LnBhdGhGcm9tUm9vdFsxXT8ub3V0bGV0ID8/IFBSSU1BUllfT1VUTEVUXT8uc2VnbWVudHMgPz8gW107XG4gIH0sXG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgZ2l2ZW4gcGF0aCBhbmQgbWF0cml4IHBhcmFtZXRlcnMgaW50byBhbiBhcnJheSBvZiBjb21tYW5kcyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIEFuZ3VsYXIgcm91dGVyIGZvciBuYXZpZ2F0aW9uLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGluc2lkZSBhbiBpbmplY3Rpb24gY29udGV4dC5cbiAgICovXG4gIHBhdGhUb0NvbW1hbmRzOiAocGF0aDogc3RyaW5nKTogQ29tbWFuZHMgPT4ge1xuICAgIGNvbnN0IHVybFRyZWUgPSBpbmplY3QoUm91dGVyKS5wYXJzZVVybChwYXRoKTtcbiAgICBjb25zdCBzZWdtZW50cyA9IHVybFRyZWUucm9vdC5jaGlsZHJlbltQUklNQVJZX09VVExFVF0/LnNlZ21lbnRzO1xuICAgIGlmICghc2VnbWVudHMpIHtcbiAgICAgIHRocm93IEVycm9yKGBbUm91dGVyRXJyb3JdIENhbm5vdCBtYXRjaCBhbnkgcm91dGVzIGZvciBwYXRoICcke3BhdGh9Jy5gKTtcbiAgICB9XG4gICAgcmV0dXJuIFJvdXRpbmcuc2VnbWVudHNUb0NvbW1hbmRzKHNlZ21lbnRzKTtcbiAgfSxcblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGVmZmVjdGl2ZSAoPWxlYWYpIHtAbGluayBBY3RpdmF0ZWRSb3V0ZX0gYWN0aXZhdGVkIGluIGEgcm91dGVyIG91dGxldC5cbiAgICpcbiAgICogRGVwZW5kaW5nIG9uIHRoZSByb3V0ZSBoaWVyYXJjaHksIHdoZW4gbmF2aWdhdGluZyB0byBhIGNoaWxkIHJvdXRlIHdpdGggY29tcG9uZW50LWxlc3MgcGFyZW50IHJvdXRlcywgdGhlIHJvdXRlIG9mIGFuIG91dGxldCBtYXkgbm90IGJlIHRoZSBlZmZlY3RpdmVseSBhY3RpdmF0ZWQgY2hpbGQgcm91dGUuXG4gICAqL1xuICByZXNvbHZlRWZmZWN0aXZlUm91dGU6IChyb3V0ZTogQWN0aXZhdGVkUm91dGUpOiBBY3RpdmF0ZWRSb3V0ZSA9PiB7XG4gICAgcmV0dXJuIHJvdXRlLmZpcnN0Q2hpbGQgPyBSb3V0aW5nLnJlc29sdmVFZmZlY3RpdmVSb3V0ZShyb3V0ZS5maXJzdENoaWxkKSA6IHJvdXRlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgZWZmZWN0aXZlICg9bGVhZikge0BsaW5rIE91dGxldENvbnRleHR9IG9mIGEgcm91dGVyIG91dGxldC5cbiAgICpcbiAgICogRGVwZW5kaW5nIG9uIHRoZSByb3V0ZSBoaWVyYXJjaHksIHdoZW4gbmF2aWdhdGluZyB0byBhIGNoaWxkIHJvdXRlIHdpdGggY29tcG9uZW50LWxlc3MgcGFyZW50IHJvdXRlcywgdGhlIGNvbnRleHQgb2YgYW4gb3V0bGV0IG1heSBub3QgYmUgdGhlIGVmZmVjdGl2ZWx5IGFjdGl2YXRlZCBjaGlsZCBjb250ZXh0LlxuICAgKi9cbiAgcmVzb2x2ZUVmZmVjdGl2ZU91dGxldENvbnRleHQ6IChvdXRsZXRDb250ZXh0OiBPdXRsZXRDb250ZXh0IHwgbnVsbCk6IE91dGxldENvbnRleHQgfCBudWxsID0+IHtcbiAgICBjb25zdCBjaGlsZE91dGxldENvbnRleHQgPSBvdXRsZXRDb250ZXh0Py5jaGlsZHJlbi5nZXRDb250ZXh0KFBSSU1BUllfT1VUTEVUKTtcbiAgICByZXR1cm4gY2hpbGRPdXRsZXRDb250ZXh0ID8gUm91dGluZy5yZXNvbHZlRWZmZWN0aXZlT3V0bGV0Q29udGV4dChjaGlsZE91dGxldENvbnRleHQpIDogb3V0bGV0Q29udGV4dDtcbiAgfSxcblxuICAvKipcbiAgICogTG9va3MgZm9yIHJlcXVlc3RlZCBkYXRhIG9uIGdpdmVuIHJvdXRlLCBvciBpdHMgcGFyZW50IHJvdXRlKHMpIGlmIG5vdCBmb3VuZC5cbiAgICovXG4gIGxvb2t1cFJvdXRlRGF0YTogPFQ+KGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBkYXRhS2V5OiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkID0+IHtcbiAgICByZXR1cm4gYWN0aXZhdGVkUm91dGUucGF0aEZyb21Sb290LnJlZHVjZVJpZ2h0KChyZXNvbHZlZERhdGEsIHJvdXRlKSA9PiByZXNvbHZlZERhdGEgPz8gcm91dGUuZGF0YVtkYXRhS2V5XSwgdW5kZWZpbmVkKTtcbiAgfSxcblxuICAvKipcbiAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG91dGxldCBtYXRjaGVzIHRoZSBmb3JtYXQgb2YgdGhlIHZpZXcgb3V0bGV0LlxuICAgKi9cbiAgaXNWaWV3T3V0bGV0OiAob3V0bGV0OiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKTogb3V0bGV0IGlzIFZpZXdJZCA9PiB7XG4gICAgcmV0dXJuIG91dGxldD8uc3RhcnRzV2l0aChWSUVXX0lEX1BSRUZJWCkgPz8gZmFsc2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFRlc3RzIGlmIHRoZSBnaXZlbiBvdXRsZXQgbWF0Y2hlcyB0aGUgZm9ybWF0IG9mIGEgcG9wdXAgb3V0bGV0LlxuICAgKi9cbiAgaXNQb3B1cE91dGxldDogKG91dGxldDogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IG91dGxldCBpcyBgcG9wdXAuJHtzdHJpbmd9YCA9PiB7XG4gICAgcmV0dXJuIG91dGxldD8uc3RhcnRzV2l0aChQT1BVUF9JRF9QUkVGSVgpID8/IGZhbHNlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBUZXN0cyBpZiB0aGUgZ2l2ZW4gb3V0bGV0IG1hdGNoZXMgdGhlIGZvcm1hdCBvZiBhIGRpYWxvZyBvdXRsZXQuXG4gICAqL1xuICBpc0RpYWxvZ091dGxldDogKG91dGxldDogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IG91dGxldCBpcyBgZGlhbG9nLiR7c3RyaW5nfWAgPT4ge1xuICAgIHJldHVybiBvdXRsZXQ/LnN0YXJ0c1dpdGgoRElBTE9HX0lEX1BSRUZJWCkgPz8gZmFsc2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFRlc3RzIGlmIHRoZSBnaXZlbiBvdXRsZXQgbWF0Y2hlcyB0aGUgZm9ybWF0IG9mIGEgbWVzc2FnZSBib3ggb3V0bGV0LlxuICAgKi9cbiAgaXNNZXNzYWdlQm94T3V0bGV0OiAob3V0bGV0OiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKTogb3V0bGV0IGlzIGBtZXNzYWdlYm94LiR7c3RyaW5nfWAgPT4ge1xuICAgIHJldHVybiBvdXRsZXQ/LnN0YXJ0c1dpdGgoTUVTU0FHRV9CT1hfSURfUFJFRklYKSA/PyBmYWxzZTtcbiAgfSxcblxuICAvKipcbiAgICogUmVhZHMgdmlldyBvdXRsZXRzIGZyb20gZ2l2ZW4gVVJMLlxuICAgKlxuICAgKiBBIHZpZXcgb3V0bGV0IGNvbnRhaW5zIHRoZSBVUkwgc2VnbWVudHMgb2YgYSB2aWV3IGNvbnRhaW5lZCBpbiB0aGUgd29ya2JlbmNoIGxheW91dC5cbiAgICovXG4gIHBhcnNlVmlld091dGxldHM6ICh1cmw6IFVybFRyZWUpOiBNYXA8Vmlld0lkLCBVcmxTZWdtZW50W10+ID0+IHtcbiAgICBjb25zdCB2aWV3T3V0bGV0cyA9IG5ldyBNYXA8Vmlld0lkLCBVcmxTZWdtZW50W10+KCk7XG4gICAgT2JqZWN0LmVudHJpZXModXJsLnJvb3QuY2hpbGRyZW4pLmZvckVhY2goKFtvdXRsZXQsIHNlZ21lbnRHcm91cF0pID0+IHtcbiAgICAgIGlmIChSb3V0aW5nLmlzVmlld091dGxldChvdXRsZXQpKSB7XG4gICAgICAgIHZpZXdPdXRsZXRzLnNldChvdXRsZXQsIHNlZ21lbnRHcm91cC5zZWdtZW50cyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHZpZXdPdXRsZXRzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBUZXN0cyBpZiBnaXZlbiByb3V0ZSBoYXMgYW4gZW1wdHkgcGF0aCBmcm9tIHJvb3QuXG4gICAqL1xuICBoYXNFbXB0eVBhdGhGcm9tUm9vdChyb3V0ZTogQWN0aXZhdGVkUm91dGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcm91dGUuc25hcHNob3QucGF0aEZyb21Sb290LmZsYXRNYXAocm91dGUgPT4gcm91dGUudXJsKS5maWx0ZXIoc2VnbWVudCA9PiBzZWdtZW50LnBhdGgubGVuZ3RoKS5sZW5ndGggPT09IDA7XG4gIH0sXG5cbiAgLyoqXG4gICAqIE9ic2VydmVzIHRoZSByb3V0ZSBhY3RpdmF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIG91dGxldC5cbiAgICpcbiAgICogVGhlIG9ic2VydmFibGUgZW1pdHMgYWZ0ZXIgdGhlIHByZXZpb3VzIGNvbXBvbmVudCBoYXMgYmVlbiBkZXN0cm95ZWQgKGlmIGFueSkgYnV0IGJlZm9yZSBjb25zdHJ1Y3RpbmcgdGhlIG5ldyBjb21wb25lbnQuXG4gICAqXG4gICAqIE9wdGlvbnMgdG8gY29udHJvbCB3aGVuIHRvIGVtaXQ6XG4gICAqIC0gYHJvdXRlQ2hhbmdlYDogRW1pdCBvbmx5IHdoZW4gbmF2aWdhdGluZyB0aGUgb3V0bGV0IHRvIGEgZGlmZmVyZW50IHJvdXRlLlxuICAgKiAtIGByb3V0ZU9yUGFyYW1DaGFuZ2VgOiBFbWl0IHdoZW4gbmF2aWdhdGluZyB0aGUgb3V0bGV0IHRvIGEgZGlmZmVyZW50IHJvdXRlIG9yIGNoYW5naW5nIHBhcmFtcyAobmFtZWQgcGF0aCBwYXJhbXMgb3IgbWF0cml4IHBhcmFtcykuXG4gICAqIC0gYGFsd2F5c2A6IEVtaXQgYXQgZXZlcnkgbmF2aWdhdGlvbiwgZXZlbiBpZiB0aGUgb3V0bGV0IGlzIG5vdCB0aGUgdGFyZ2V0IG9mIHRoZSBuYXZpZ2F0aW9uLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCB3aXRoaW4gYW4gaW5qZWN0aW9uIGNvbnRleHQuXG4gICAqXG4gICAqIE5vdGU6IExpc3RlbmluZyBmb3Igcm91dGUgYWN0aXZhdGlvbnMvZGVhY3RpdmF0aW9ucyBvbiB0aGUgcm91dGVyIG91dGxldCBhbG9uZSBpcyBpbnN1ZmZpY2llbnQgZm9yIG5lc3RlZCByb3V0ZXMsIGFzIHRoZSBvdXRsZXQgZG9lcyBub3QgcmVwb3J0XG4gICAqIGFjdGl2YXRpb25zL2RlYWN0aXZhdGlvbnMgb2YgY2hpbGQgcm91dGVzLlxuICAgKlxuICAgKiBAcGFyYW0gb3V0bGV0IC0gU3BlY2lmaWVzIHRoZSBvdXRsZXQgdG8gb2JzZXJ2ZS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDb250cm9scyB3aGVuIHRvIGVtaXQgdGhlIG9ic2VydmFibGUuXG4gICAqIEByZXR1cm4gQW4gb2JzZXJ2YWJsZSBlbWl0dGluZyBhIHR1cGxlIG9mIHRoZSBwcmV2aW91cyBhbmQgY3VycmVudCByb3V0ZSBzbmFwc2hvdHMuXG4gICAqL1xuICBhY3RpdmF0ZWRSb3V0ZSQob3V0bGV0OiBzdHJpbmcsIG9wdGlvbnM6IHtlbWl0T246ICdyb3V0ZUNoYW5nZScgfCAncm91dGVPclBhcmFtQ2hhbmdlJyB8ICdhbHdheXMnfSk6IE9ic2VydmFibGU8W0FjdGl2YXRlZFJvdXRlU25hcHNob3QgfCBudWxsLCBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90XT4ge1xuICAgIGNvbnN0IHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xuICAgIGNvbnN0IGNoaWxkcmVuT3V0bGV0Q29udGV4dHMgPSBpbmplY3QoQ2hpbGRyZW5PdXRsZXRDb250ZXh0cyk7XG5cbiAgICBjb25zdCBvbk5hdmlnYXRpb25TdGFydCQgPSByb3V0ZXIuZXZlbnRzLnBpcGUoZmlsdGVyTmF2aWdhdGlvblN0YXJ0KCkpO1xuICAgIGNvbnN0IG9uQWN0aXZhdGlvblN0YXJ0JCA9IHJvdXRlci5ldmVudHMucGlwZShmaWx0ZXJBY3RpdmF0aW9uU3RhcnQoKSwgZmlsdGVyQnlPdXRsZXQob3V0bGV0KSk7XG4gICAgY29uc3Qgb25BY3RpdmF0aW9uRW5kJCA9IHJvdXRlci5ldmVudHMucGlwZShmaWx0ZXJBY3RpdmF0aW9uRW5kKCksIGZpbHRlckJ5T3V0bGV0KG91dGxldCkpO1xuXG4gICAgLy8gT24gZWFjaCBuYXZpZ2F0aW9uIHN0YXJ0IChgTmF2aWdhdGlvblN0YXJ0YCksIHN1YnNjcmliZSB0byB0aGUgb3V0bGV0J3MgYEFjdGl2YXRpb25TdGFydGAgZXZlbnQgYW5kIHRoZW4gdG8gdGhlIG91dGxldCdzIGRlYWN0aXZhdGUgZXZlbnQsXG4gICAgLy8gZW5hYmxpbmcgY29udGludWluZyBvZiB0aGUgZXhlY3V0aW9uIGNoYWluIGFmdGVyIHRoZSBwcmV2aW91cyBjb21wb25lbnQgaGFzIGJlZW4gZGVzdHJveWVkLlxuICAgIC8vXG4gICAgLy8gSWYgYGVtaXRPbmAgaXMgc2V0IHRvIGBhbHdheXNgLCBhZGRpdGlvbmFsbHkgc3Vic2NyaWJlIHRvIHRoZSBvdXRsZXQncyBgQWN0aXZhdGlvbkVuZGAgZXZlbnQsIHNpbmNlIG5vIGFjdGl2YXRpb24gKGBBY3RpdmF0aW9uU3RhcnRgKSBvY2N1cnMgaWZcbiAgICAvLyB0aGUgb3V0bGV0IGlzIG5vdCBuYXZpZ2F0ZWQgKGUuZy4sIG5hdmlnYXRpbmcgYW5vdGhlciBvdXRsZXQgb3IgdXBkYXRpbmcgcXVlcnkgcGFyYW1zKS5cbiAgICAvL1xuICAgIC8vIE5vdGUgdGhhdCBBbmd1bGFyIGFjdGl2YXRlcyBuZXN0ZWQgcm91dGVzIGZyb20gcGFyZW50IHRvIGNoaWxkIGFuZCBkZWFjdGl2YXRlcyB0aGVtIGZyb20gY2hpbGQgdG8gcGFyZW50LCB0cmlnZ2VyaW5nIG11bHRpcGxlIGBBY3RpdmF0aW9uU3RhcnRgXG4gICAgLy8gYW5kIGBBY3RpdmF0aW9uRW5kYCBldmVudHMuIEZvciB0aGUgb3V0bGV0LCB0aGUgbGF0ZXN0IGBBY3RpdmF0aW9uU3RhcnRgIGFuZCB0aGUgZmlyc3QgYEFjdGl2YXRpb25FbmRgIGV2ZW50cyBhcmUgcmVsZXZhbnQuXG4gICAgLy9cbiAgICAvLyBgQWN0aXZhdGlvblN0YXJ0YCBpcyBlbWl0dGVkIG9ubHkgaWYgdGhlIG91dGxldCBpcyBhY3R1YWxseSBuYXZpZ2F0ZWQgKHJvdXRlIG9yIHBhcmFtZXRlciBjaGFuZ2UpLCB3aGVyZWFzIGBBY3RpdmF0aW9uRW5kYCBpcyBhbHdheXMgZW1pdHRlZC5cbiAgICAvL1xuICAgIC8vIElmIGEgbmF2aWdhdGlvbiBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MsIHN0YXJ0IGltbWVkaWF0ZWx5LCBhbGxvd2luZyBzdWJzY3JpcHRpb25zIGV2ZW4gZHVyaW5nIG9uZ29pbmcgbmF2aWdhdGlvbiwgc3VjaCBhcyBhZnRlciB0aGUgbmF2aWdhdGlvblxuICAgIC8vIGhhcyBzdGFydGVkLlxuICAgIHJldHVybiBpaWYoKCkgPT4gIXJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbigpLCBvbk5hdmlnYXRpb25TdGFydCQsIG9uTmF2aWdhdGlvblN0YXJ0JC5waXBlKHN0YXJ0V2l0aCh1bmRlZmluZWQpKSlcbiAgICAgIC5waXBlKFxuICAgICAgICAvLyBTdWJzY3JpYmUgdG8gdGhlIG91dGxldCdzIGBBY3RpdmF0aW9uU3RhcnRgIChhbmQgYWxzbyBgQWN0aXZhdGlvbkVuZGAgaWYgdGhlIGBlbWl0T25gIG9wdGlvbiBpcyBzZXQgdG8gYGFsd2F5c2ApLlxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gb3B0aW9ucy5lbWl0T24gPT09ICdhbHdheXMnID8gcmFjZShvbkFjdGl2YXRpb25TdGFydCQsIG9uQWN0aXZhdGlvbkVuZCQucGlwZSh0YWtlKDEpKSkgOiBvbkFjdGl2YXRpb25TdGFydCQpLFxuICAgICAgICBtYXAoZXZlbnQgPT4gZXZlbnQuc25hcHNob3QpLFxuICAgICAgICBzdGFydFdpdGgobnVsbCBhcyB1bmtub3duIGFzIEFjdGl2YXRlZFJvdXRlU25hcHNob3QpLCAvLyBpbml0aWFsaXplIHBhaXJ3aXNlIG9wZXJhdG9yXG4gICAgICAgIHBhaXJ3aXNlKCksXG4gICAgICAgIHN3aXRjaE1hcCgoW3ByZXZpb3VzLCBjdXJyZW50XTogW0FjdGl2YXRlZFJvdXRlU25hcHNob3QgfCBudWxsLCBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90XSk6IE9ic2VydmFibGU8W0FjdGl2YXRlZFJvdXRlU25hcHNob3QgfCBudWxsLCBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90XT4gPT4ge1xuICAgICAgICAgIC8vIElmIHRoZSByb3V0ZSBoYXNuJ3QgY2hhbmdlZCBhbmQgYGVtaXRPbmAgaXMgc2V0IHRvIGBhbHdheXNgIG9yIGByb3V0ZU9yUGFyYW1DaGFuZ2VgLCBlbWl0IGltbWVkaWF0ZWx5IHNpbmNlIG5vIGRlYWN0aXZhdGlvbiB3aWxsIG9jY3VyLlxuICAgICAgICAgIGNvbnN0IHJvdXRlQ2hhbmdlZCA9IHByZXZpb3VzPy5yb3V0ZUNvbmZpZyAhPT0gY3VycmVudC5yb3V0ZUNvbmZpZztcbiAgICAgICAgICBpZiAoIXJvdXRlQ2hhbmdlZCkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZW1pdE9uID09PSAncm91dGVDaGFuZ2UnID8gRU1QVFkgOiBvZihbcHJldmlvdXMsIGN1cnJlbnRdKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIHByZXZpb3VzbHkgYWN0aXZhdGVkIGNvbXBvbmVudCBpbiB0aGUgb3V0bGV0LCBlbWl0IGltbWVkaWF0ZWx5IHNpbmNlIG5vIGRlYWN0aXZhdGlvbiB3aWxsIG9jY3VyLlxuICAgICAgICAgIGNvbnN0IG91dGxldENvbnRleHQgPSBSb3V0aW5nLnJlc29sdmVFZmZlY3RpdmVPdXRsZXRDb250ZXh0KGNoaWxkcmVuT3V0bGV0Q29udGV4dHMuZ2V0Q29udGV4dChvdXRsZXQpKTtcbiAgICAgICAgICBpZiAoIW91dGxldENvbnRleHQ/Lm91dGxldD8uaXNBY3RpdmF0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvZihbcHJldmlvdXMsIGN1cnJlbnRdKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBEZWxheSBlbWlzc2lvbiB1bnRpbCB0aGUgcHJldmlvdXNseSBhY3RpdmF0ZWQgY29tcG9uZW50IGhhcyBiZWVuIGRlc3Ryb3llZCBieSBzdWJzY3JpYmluZyB0byB0aGUgb3V0bGV0J3MgZGVhY3RpdmF0aW9uIGV2ZW50LlxuICAgICAgICAgIC8vIE5lc3RlZCByb3V0ZXMgYWN0aXZhdGUgZnJvbSBwYXJlbnQgdG8gY2hpbGQsIGNhbmNlbGluZyBcImRlYWN0aXZhdGlvblwiIHN1YnNjcmlwdGlvbnMgb2YgcGFyZW50IG91dGxldHMsIHNvIG9ubHkgdGhlIGRlYWN0aXZhdGlvbiBvZiB0aGUgYWN0dWFsIG91dGxldCBpcyBlbWl0dGVkLlxuICAgICAgICAgIHJldHVybiBvdXRsZXRDb250ZXh0Lm91dGxldC5kZWFjdGl2YXRlRXZlbnRzIS5waXBlKG1hcCgoKSA9PiBbcHJldmlvdXMsIGN1cnJlbnRdKSk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMge0BsaW5rIE5hdmlnYXRpb25TdGFydH0gcm91dGVyIGV2ZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaWx0ZXJOYXZpZ2F0aW9uU3RhcnQoKTogT3BlcmF0b3JGdW5jdGlvbjxFdmVudCB8IFJvdXRlckV2ZW50LCBOYXZpZ2F0aW9uU3RhcnQ+IHtcbiAgICAgIHJldHVybiBmaWx0ZXIoKGV2ZW50OiBFdmVudCB8IFJvdXRlckV2ZW50KTogZXZlbnQgaXMgTmF2aWdhdGlvblN0YXJ0ID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXJzIHtAbGluayBBY3RpdmF0aW9uU3RhcnR9IHJvdXRlciBldmVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmlsdGVyQWN0aXZhdGlvblN0YXJ0KCk6IE9wZXJhdG9yRnVuY3Rpb248RXZlbnQgfCBSb3V0ZXJFdmVudCwgQWN0aXZhdGlvblN0YXJ0PiB7XG4gICAgICByZXR1cm4gZmlsdGVyKChldmVudDogRXZlbnQgfCBSb3V0ZXJFdmVudCk6IGV2ZW50IGlzIEFjdGl2YXRpb25TdGFydCA9PiBldmVudCBpbnN0YW5jZW9mIEFjdGl2YXRpb25TdGFydCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsdGVycyB7QGxpbmsgQWN0aXZhdGlvbkVuZH0gcm91dGVyIGV2ZW50cy4gVGhpcyBldmVudCBpcyBlbWl0dGVkIGZvciBlYWNoIG91dGxldCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaGFzIGJlZW4gbmF2aWdhdGVkIG9yIG5vdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaWx0ZXJBY3RpdmF0aW9uRW5kKCk6IE9wZXJhdG9yRnVuY3Rpb248RXZlbnQgfCBSb3V0ZXJFdmVudCwgQWN0aXZhdGlvbkVuZD4ge1xuICAgICAgcmV0dXJuIGZpbHRlcigoZXZlbnQ6IEV2ZW50IHwgUm91dGVyRXZlbnQpOiBldmVudCBpcyBBY3RpdmF0aW9uRW5kID0+IGV2ZW50IGluc3RhbmNlb2YgQWN0aXZhdGlvbkVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsdGVycyByb3V0ZXIgZXZlbnRzIGZvciB0aGUgc3BlY2lmaWVkIG91dGxldC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaWx0ZXJCeU91dGxldDxUIGV4dGVuZHMgQWN0aXZhdGlvblN0YXJ0IHwgQWN0aXZhdGlvbkVuZD4ob3V0bGV0OiBzdHJpbmcpOiBNb25vVHlwZU9wZXJhdG9yRnVuY3Rpb248VD4ge1xuICAgICAgcmV0dXJuIGZpbHRlcihldmVudCA9PiBldmVudC5zbmFwc2hvdC5wYXRoRnJvbVJvb3RbMV0/Lm91dGxldCA9PT0gb3V0bGV0KTtcbiAgICB9XG4gIH0sXG59IGFzIGNvbnN0O1xuXG4iXX0=
|
|
@@ -43,4 +43,4 @@ export class UrlSegmentMatcher {
|
|
|
43
43
|
});
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJsLXNlZ21lbnQtbWF0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL3JvdXRpbmcvdXJsLXNlZ21lbnQtbWF0Y2hlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUdILE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUU1Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8saUJBQWlCO0lBRTVCLFlBQW9CLFFBQXNCLEVBQVUsTUFBZ0U7UUFBaEcsYUFBUSxHQUFSLFFBQVEsQ0FBYztRQUFVLFdBQU0sR0FBTixNQUFNLENBQTBEO0lBQ3BILENBQUM7SUFFRDs7T0FFRztJQUNJLE9BQU8sQ0FBQyxRQUFzQjtRQUNuQyxJQUFJLFFBQVEsS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDL0IsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0MsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3ZDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztZQUN4RCxNQUFNLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDO1lBRXRGLElBQUksU0FBUyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDNUQsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsSUFBSSxpQkFBaUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQy9GLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjQgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7VXJsU2VnbWVudH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7T2JqZWN0c30gZnJvbSAnQHNjaW9uL3Rvb2xraXQvdXRpbCc7XG5cbi8qKlxuICogTWF0Y2hlcyBhbiBhcnJheSBvZiBVUkwgc2VnbWVudHMgYWdhaW5zdCBhbm90aGVyIGFycmF5IG9mIFVSTCBzZWdtZW50cy5cbiAqXG4gKiBGbGFnczpcbiAqIC0gbWF0Y2hXaWxkY2FyZFBhdGg6IEluZGljYXRlcyBpZiB3aWxkY2FyZCBwYXRoIG1hdGNoaW5nIGlzIGVuYWJsZWQuIElmIGVuYWJsZWQsIHRoZSBhc3RlcmlzayBgKmAgcGF0aCBtYXRjaGVzIGFueSBwYXRoIG9mIGEgc2VnbWVudC5cbiAqIC0gbWF0Y2hNYXRyaXhQYXJhbXM6IENvbnRyb2xzIHdoZXRoZXIgdG8gbWF0Y2ggbWF0cml4IHBhcmFtZXRlcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBVcmxTZWdtZW50TWF0Y2hlciB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcGF0dGVybjogVXJsU2VnbWVudFtdLCBwcml2YXRlIF9mbGFnczoge21hdGNoV2lsZGNhcmRQYXRoOiBib29sZWFuOyBtYXRjaE1hdHJpeFBhcmFtczogYm9vbGVhbn0pIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXRjaGVzIGdpdmVuIGFycmF5IG9mIFVSTCBzZWdtZW50cy5cbiAgICovXG4gIHB1YmxpYyBtYXRjaGVzKHNlZ21lbnRzOiBVcmxTZWdtZW50W10pOiBib29sZWFuIHtcbiAgICBpZiAoc2VnbWVudHMgPT09IHRoaXMuX3BhdHRlcm4pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChzZWdtZW50cy5sZW5ndGggIT09IHRoaXMuX3BhdHRlcm4ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlZ21lbnRzLmV2ZXJ5KChzZWdtZW50LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgY2hlY2tNYXRyaXhQYXJhbXMgPSB0aGlzLl9mbGFncy5tYXRjaE1hdHJpeFBhcmFtcztcbiAgICAgIGNvbnN0IGNoZWNrUGF0aCA9ICF0aGlzLl9mbGFncy5tYXRjaFdpbGRjYXJkUGF0aCB8fCB0aGlzLl9wYXR0ZXJuW2luZGV4XS5wYXRoICE9PSAnKic7XG5cbiAgICAgIGlmIChjaGVja1BhdGggJiYgc2VnbWVudC5wYXRoICE9PSB0aGlzLl9wYXR0ZXJuW2luZGV4XS5wYXRoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGVja01hdHJpeFBhcmFtcyAmJiAhT2JqZWN0cy5pc0VxdWFsKHNlZ21lbnQucGFyYW1ldGVycywgdGhpcy5fcGF0dGVybltpbmRleF0ucGFyYW1ldGVycykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,110 @@
|
|
|
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 { Component, Injectable, InjectionToken } from '@angular/core';
|
|
11
|
+
import { PRIMARY_OUTLET } from '@angular/router';
|
|
12
|
+
import PageNotFoundComponent from '../page-not-found/page-not-found.component';
|
|
13
|
+
import { WorkbenchRouteData } from './workbench-route-data';
|
|
14
|
+
import { ɵEmptyOutletComponent } from './empty-outlet/empty-outlet.component';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
import * as i1 from "../workbench-config";
|
|
17
|
+
import * as i2 from "@angular/router";
|
|
18
|
+
/**
|
|
19
|
+
* Facilitates the registration of auxiliary routes of top-level routes.
|
|
20
|
+
*/
|
|
21
|
+
export class WorkbenchAuxiliaryRouteInstaller {
|
|
22
|
+
constructor(_workbenchConfig, _router) {
|
|
23
|
+
this._workbenchConfig = _workbenchConfig;
|
|
24
|
+
this._router = _router;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Registers an auxiliary route for each top-level route, enabling navigation in the specified router outlet(s).
|
|
28
|
+
*
|
|
29
|
+
* @param outlets - Specifies outlets for which to create auxiliary routes.
|
|
30
|
+
* @param config - Specifies the config of the auxiliary routes.
|
|
31
|
+
*/
|
|
32
|
+
registerAuxiliaryRoutes(outlets, config = {}) {
|
|
33
|
+
if (!outlets.length) {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
const registeredRoutes = outlets.map(outlet => ({
|
|
37
|
+
path: '',
|
|
38
|
+
outlet,
|
|
39
|
+
providers: [{ provide: WORKBENCH_AUXILIARY_ROUTE_OUTLET, useValue: outlet }],
|
|
40
|
+
component: ɵEmptyOutletComponent,
|
|
41
|
+
children: [
|
|
42
|
+
...this._router.config
|
|
43
|
+
.filter(route => !route.outlet || route.outlet === PRIMARY_OUTLET)
|
|
44
|
+
.map(route => ({ ...route, data: { ...route.data, [WorkbenchRouteData.ɵoutlet]: outlet } })),
|
|
45
|
+
// Register wildcard route to display "Page Not Found".
|
|
46
|
+
{
|
|
47
|
+
path: '**',
|
|
48
|
+
loadComponent: () => this._workbenchConfig.pageNotFoundComponent ?? PageNotFoundComponent,
|
|
49
|
+
data: { [WorkbenchRouteData.title]: 'Page Not Found', [WorkbenchRouteData.cssClass]: 'e2e-page-not-found' },
|
|
50
|
+
canMatch: config.canMatchNotFoundPage,
|
|
51
|
+
},
|
|
52
|
+
// Register wildcard route to display blank page.
|
|
53
|
+
{
|
|
54
|
+
path: '**',
|
|
55
|
+
component: BlankComponent,
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
}));
|
|
59
|
+
this.replaceRouterConfig([
|
|
60
|
+
...this._router.config,
|
|
61
|
+
...registeredRoutes,
|
|
62
|
+
]);
|
|
63
|
+
return registeredRoutes;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Unregisters auxiliary routes for the given outlet.
|
|
67
|
+
*/
|
|
68
|
+
unregisterAuxiliaryRoutes(outlets) {
|
|
69
|
+
const outletsToRemove = new Set(outlets);
|
|
70
|
+
function shouldRemoveRoute(route) {
|
|
71
|
+
return !!route.outlet && outletsToRemove.has(route.outlet);
|
|
72
|
+
}
|
|
73
|
+
this.replaceRouterConfig(this._router.config.filter(route => !shouldRemoveRoute(route)));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Replaces the router configuration to install or uninstall auxiliary routes.
|
|
77
|
+
*/
|
|
78
|
+
replaceRouterConfig(config) {
|
|
79
|
+
// Note:
|
|
80
|
+
// - Do not use Router.resetConfig(...) which would destroy any currently routed component because copying all routes
|
|
81
|
+
// - Do not assign the router a new Routes object (Router.config = ...) to allow resolution of routes added during `NavigationStart` (since Angular 7.x)
|
|
82
|
+
// (because Angular uses a reference to the Routes object during route navigation)
|
|
83
|
+
const newRoutes = [...config];
|
|
84
|
+
this._router.config.splice(0, this._router.config.length, ...newRoutes);
|
|
85
|
+
}
|
|
86
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: WorkbenchAuxiliaryRouteInstaller, deps: [{ token: i1.WorkbenchConfig }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
87
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: WorkbenchAuxiliaryRouteInstaller, providedIn: 'root' }); }
|
|
88
|
+
}
|
|
89
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: WorkbenchAuxiliaryRouteInstaller, decorators: [{
|
|
90
|
+
type: Injectable,
|
|
91
|
+
args: [{ providedIn: 'root' }]
|
|
92
|
+
}], ctorParameters: () => [{ type: i1.WorkbenchConfig }, { type: i2.Router }] });
|
|
93
|
+
/**
|
|
94
|
+
* DI token to inject the outlet name of a workbench auxiliary route.
|
|
95
|
+
*
|
|
96
|
+
* Can be injected in a `CanMatch` guard to obtain a reference to the workbench element.
|
|
97
|
+
*/
|
|
98
|
+
export const WORKBENCH_AUXILIARY_ROUTE_OUTLET = new InjectionToken('ɵWORKBENCH_AUXILIARY_ROUTE_OUTLET');
|
|
99
|
+
/**
|
|
100
|
+
* Component to display if the outlet has not yet been navigated or no navigation information is available.
|
|
101
|
+
*/
|
|
102
|
+
export class BlankComponent {
|
|
103
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: BlankComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
104
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.2", type: BlankComponent, isStandalone: true, selector: "wb-blank", ngImport: i0, template: '', isInline: true }); }
|
|
105
|
+
}
|
|
106
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: BlankComponent, decorators: [{
|
|
107
|
+
type: Component,
|
|
108
|
+
args: [{ selector: 'wb-blank', template: '', standalone: true }]
|
|
109
|
+
}] });
|
|
110
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2JlbmNoLWF1eGlsaWFyeS1yb3V0ZS1pbnN0YWxsZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL3JvdXRpbmcvd29ya2JlbmNoLWF1eGlsaWFyeS1yb3V0ZS1pbnN0YWxsZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7RUFRRTtBQUVGLE9BQU8sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQWEsY0FBYyxFQUF3QixNQUFNLGlCQUFpQixDQUFDO0FBRWxGLE9BQU8scUJBQXFCLE1BQU0sNENBQTRDLENBQUM7QUFDL0UsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sdUNBQXVDLENBQUM7Ozs7QUFFNUU7O0dBRUc7QUFFSCxNQUFNLE9BQU8sZ0NBQWdDO0lBRTNDLFlBQW9CLGdCQUFpQyxFQUFVLE9BQWU7UUFBMUQscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQjtRQUFVLFlBQU8sR0FBUCxPQUFPLENBQVE7SUFDOUUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksdUJBQXVCLENBQUMsT0FBaUIsRUFBRSxTQUErQixFQUFFO1FBQ2pGLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEIsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM5QyxJQUFJLEVBQUUsRUFBRTtZQUNSLE1BQU07WUFDTixTQUFTLEVBQUUsQ0FBQyxFQUFDLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFDLENB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YykgMjAxOC0yMDI0IFN3aXNzIEZlZGVyYWwgUmFpbHdheXNcbipcbiogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuKiBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMFxuKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbipcbiogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiovXG5cbmltcG9ydCB7Q29tcG9uZW50LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Nhbk1hdGNoRm4sIFBSSU1BUllfT1VUTEVULCBSb3V0ZSwgUm91dGVyLCBSb3V0ZXN9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1dvcmtiZW5jaENvbmZpZ30gZnJvbSAnLi4vd29ya2JlbmNoLWNvbmZpZyc7XG5pbXBvcnQgUGFnZU5vdEZvdW5kQ29tcG9uZW50IGZyb20gJy4uL3BhZ2Utbm90LWZvdW5kL3BhZ2Utbm90LWZvdW5kLmNvbXBvbmVudCc7XG5pbXBvcnQge1dvcmtiZW5jaFJvdXRlRGF0YX0gZnJvbSAnLi93b3JrYmVuY2gtcm91dGUtZGF0YSc7XG5pbXBvcnQge8m1RW1wdHlPdXRsZXRDb21wb25lbnR9IGZyb20gJy4vZW1wdHktb3V0bGV0L2VtcHR5LW91dGxldC5jb21wb25lbnQnO1xuXG4vKipcbiAqIEZhY2lsaXRhdGVzIHRoZSByZWdpc3RyYXRpb24gb2YgYXV4aWxpYXJ5IHJvdXRlcyBvZiB0b3AtbGV2ZWwgcm91dGVzLlxuICovXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBXb3JrYmVuY2hBdXhpbGlhcnlSb3V0ZUluc3RhbGxlciB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfd29ya2JlbmNoQ29uZmlnOiBXb3JrYmVuY2hDb25maWcsIHByaXZhdGUgX3JvdXRlcjogUm91dGVyKSB7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGFuIGF1eGlsaWFyeSByb3V0ZSBmb3IgZWFjaCB0b3AtbGV2ZWwgcm91dGUsIGVuYWJsaW5nIG5hdmlnYXRpb24gaW4gdGhlIHNwZWNpZmllZCByb3V0ZXIgb3V0bGV0KHMpLlxuICAgKlxuICAgKiBAcGFyYW0gb3V0bGV0cyAtIFNwZWNpZmllcyBvdXRsZXRzIGZvciB3aGljaCB0byBjcmVhdGUgYXV4aWxpYXJ5IHJvdXRlcy5cbiAgICogQHBhcmFtIGNvbmZpZyAtIFNwZWNpZmllcyB0aGUgY29uZmlnIG9mIHRoZSBhdXhpbGlhcnkgcm91dGVzLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyQXV4aWxpYXJ5Um91dGVzKG91dGxldHM6IHN0cmluZ1tdLCBjb25maWc6IEF1eGlsaWFyeVJvdXRlQ29uZmlnID0ge30pOiBSb3V0ZXMge1xuICAgIGlmICghb3V0bGV0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3RlcmVkUm91dGVzID0gb3V0bGV0cy5tYXAob3V0bGV0ID0+ICh7XG4gICAgICBwYXRoOiAnJyxcbiAgICAgIG91dGxldCxcbiAgICAgIHByb3ZpZGVyczogW3twcm92aWRlOiBXT1JLQkVOQ0hfQVVYSUxJQVJZX1JPVVRFX09VVExFVCwgdXNlVmFsdWU6IG91dGxldH1dLFxuICAgICAgY29tcG9uZW50OiDJtUVtcHR5T3V0bGV0Q29tcG9uZW50LFxuICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgLi4udGhpcy5fcm91dGVyLmNvbmZpZ1xuICAgICAgICAgIC5maWx0ZXIocm91dGUgPT4gIXJvdXRlLm91dGxldCB8fCByb3V0ZS5vdXRsZXQgPT09IFBSSU1BUllfT1VUTEVUKVxuICAgICAgICAgIC5tYXAocm91dGUgPT4gKHsuLi5yb3V0ZSwgZGF0YTogey4uLnJvdXRlLmRhdGEsIFtXb3JrYmVuY2hSb3V0ZURhdGEuybVvdXRsZXRdOiBvdXRsZXR9fSkpLFxuICAgICAgICAvLyBSZWdpc3RlciB3aWxkY2FyZCByb3V0ZSB0byBkaXNwbGF5IFwiUGFnZSBOb3QgRm91bmRcIi5cbiAgICAgICAge1xuICAgICAgICAgIHBhdGg6ICcqKicsXG4gICAgICAgICAgbG9hZENvbXBvbmVudDogKCkgPT4gdGhpcy5fd29ya2JlbmNoQ29uZmlnLnBhZ2VOb3RGb3VuZENvbXBvbmVudCA/PyBQYWdlTm90Rm91bmRDb21wb25lbnQsXG4gICAgICAgICAgZGF0YToge1tXb3JrYmVuY2hSb3V0ZURhdGEudGl0bGVdOiAnUGFnZSBOb3QgRm91bmQnLCBbV29ya2JlbmNoUm91dGVEYXRhLmNzc0NsYXNzXTogJ2UyZS1wYWdlLW5vdC1mb3VuZCd9LFxuICAgICAgICAgIGNhbk1hdGNoOiBjb25maWcuY2FuTWF0Y2hOb3RGb3VuZFBhZ2UsXG4gICAgICAgIH0sXG4gICAgICAgIC8vIFJlZ2lzdGVyIHdpbGRjYXJkIHJvdXRlIHRvIGRpc3BsYXkgYmxhbmsgcGFnZS5cbiAgICAgICAge1xuICAgICAgICAgIHBhdGg6ICcqKicsXG4gICAgICAgICAgY29tcG9uZW50OiBCbGFua0NvbXBvbmVudCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSBzYXRpc2ZpZXMgUm91dGUpKTtcblxuICAgIHRoaXMucmVwbGFjZVJvdXRlckNvbmZpZyhbXG4gICAgICAuLi50aGlzLl9yb3V0ZXIuY29uZmlnLFxuICAgICAgLi4ucmVnaXN0ZXJlZFJvdXRlcyxcbiAgICBdKTtcblxuICAgIHJldHVybiByZWdpc3RlcmVkUm91dGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGF1eGlsaWFyeSByb3V0ZXMgZm9yIHRoZSBnaXZlbiBvdXRsZXQuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlckF1eGlsaWFyeVJvdXRlcyhvdXRsZXRzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IG91dGxldHNUb1JlbW92ZSA9IG5ldyBTZXQ8c3RyaW5nPihvdXRsZXRzKTtcblxuICAgIGZ1bmN0aW9uIHNob3VsZFJlbW92ZVJvdXRlKHJvdXRlOiBSb3V0ZSk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuICEhcm91dGUub3V0bGV0ICYmIG91dGxldHNUb1JlbW92ZS5oYXMocm91dGUub3V0bGV0KTtcbiAgICB9XG5cbiAgICB0aGlzLnJlcGxhY2VSb3V0ZXJDb25maWcodGhpcy5fcm91dGVyLmNvbmZpZy5maWx0ZXIocm91dGUgPT4gIXNob3VsZFJlbW92ZVJvdXRlKHJvdXRlKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIHRoZSByb3V0ZXIgY29uZmlndXJhdGlvbiB0byBpbnN0YWxsIG9yIHVuaW5zdGFsbCBhdXhpbGlhcnkgcm91dGVzLlxuICAgKi9cbiAgcHJpdmF0ZSByZXBsYWNlUm91dGVyQ29uZmlnKGNvbmZpZzogUm91dGVzKTogdm9pZCB7XG4gICAgLy8gTm90ZTpcbiAgICAvLyAgIC0gRG8gbm90IHVzZSBSb3V0ZXIucmVzZXRDb25maWcoLi4uKSB3aGljaCB3b3VsZCBkZXN0cm95IGFueSBjdXJyZW50bHkgcm91dGVkIGNvbXBvbmVudCBiZWNhdXNlIGNvcHlpbmcgYWxsIHJvdXRlc1xuICAgIC8vICAgLSBEbyBub3QgYXNzaWduIHRoZSByb3V0ZXIgYSBuZXcgUm91dGVzIG9iamVjdCAoUm91dGVyLmNvbmZpZyA9IC4uLikgdG8gYWxsb3cgcmVzb2x1dGlvbiBvZiByb3V0ZXMgYWRkZWQgZHVyaW5nIGBOYXZpZ2F0aW9uU3RhcnRgIChzaW5jZSBBbmd1bGFyIDcueClcbiAgICAvLyAgICAgKGJlY2F1c2UgQW5ndWxhciB1c2VzIGEgcmVmZXJlbmNlIHRvIHRoZSBSb3V0ZXMgb2JqZWN0IGR1cmluZyByb3V0ZSBuYXZpZ2F0aW9uKVxuICAgIGNvbnN0IG5ld1JvdXRlczogUm91dGVzID0gWy4uLmNvbmZpZ107XG4gICAgdGhpcy5fcm91dGVyLmNvbmZpZy5zcGxpY2UoMCwgdGhpcy5fcm91dGVyLmNvbmZpZy5sZW5ndGgsIC4uLm5ld1JvdXRlcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb25maWd1cmVzIGF1eGlsaWFyeSByb3V0ZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV4aWxpYXJ5Um91dGVDb25maWcge1xuICAvKipcbiAgICogU3BlY2lmaWVzIFwiQ2FuTWF0Y2hcIiBndWFyZChzKSB0byBpbnN0YWxsIG9uIHRoZSB3aWxkY2FyZCByb3V0ZSAoYCoqYCksXG4gICAqIHNlbGVjdGVkIGJ5IHRoZSByb3V0ZXIgaWYgbm8gcm91dGUgbWF0Y2hlcyB0aGUgcmVxdWVzdGVkIFVSTC5cbiAgICovXG4gIGNhbk1hdGNoTm90Rm91bmRQYWdlPzogQXJyYXk8Q2FuTWF0Y2hGbj47XG59XG5cbi8qKlxuICogREkgdG9rZW4gdG8gaW5qZWN0IHRoZSBvdXRsZXQgbmFtZSBvZiBhIHdvcmtiZW5jaCBhdXhpbGlhcnkgcm91dGUuXG4gKlxuICogQ2FuIGJlIGluamVjdGVkIGluIGEgYENhbk1hdGNoYCBndWFyZCB0byBvYnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIHdvcmtiZW5jaCBlbGVtZW50LlxuICovXG5leHBvcnQgY29uc3QgV09SS0JFTkNIX0FVWElMSUFSWV9ST1VURV9PVVRMRVQgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPignybVXT1JLQkVOQ0hfQVVYSUxJQVJZX1JPVVRFX09VVExFVCcpO1xuXG4vKipcbiAqIENvbXBvbmVudCB0byBkaXNwbGF5IGlmIHRoZSBvdXRsZXQgaGFzIG5vdCB5ZXQgYmVlbiBuYXZpZ2F0ZWQgb3Igbm8gbmF2aWdhdGlvbiBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuXG4gKi9cbkBDb21wb25lbnQoe3NlbGVjdG9yOiAnd2ItYmxhbmsnLCB0ZW1wbGF0ZTogJycsIHN0YW5kYWxvbmU6IHRydWV9KVxuZXhwb3J0IGNsYXNzIEJsYW5rQ29tcG9uZW50IHtcbn1cbiJdfQ==
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* SPDX-License-Identifier: EPL-2.0
|
|
9
9
|
*/
|
|
10
10
|
import { Injectable } from '@angular/core';
|
|
11
|
-
import {
|
|
11
|
+
import { Routing } from './routing.util';
|
|
12
12
|
import * as i0 from "@angular/core";
|
|
13
13
|
/**
|
|
14
14
|
* Stateful differ for finding added/removed dialogs.
|
|
@@ -21,13 +21,13 @@ export class WorkbenchDialogDiffer {
|
|
|
21
21
|
* Computes differences in the URL since last time {@link WorkbenchDialogDiffer#diff} was invoked.
|
|
22
22
|
*/
|
|
23
23
|
diff(urlTree) {
|
|
24
|
-
const dialogOutlets = Object.keys(urlTree.root.children).filter(
|
|
24
|
+
const dialogOutlets = Object.keys(urlTree.root.children).filter(Routing.isDialogOutlet);
|
|
25
25
|
return new WorkbenchDialogDiff(this._dialogDiffer.diff(dialogOutlets));
|
|
26
26
|
}
|
|
27
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
28
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
27
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: WorkbenchDialogDiffer, deps: [{ token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
28
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: WorkbenchDialogDiffer, providedIn: 'root' }); }
|
|
29
29
|
}
|
|
30
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
30
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: WorkbenchDialogDiffer, decorators: [{
|
|
31
31
|
type: Injectable,
|
|
32
32
|
args: [{ providedIn: 'root' }]
|
|
33
33
|
}], ctorParameters: () => [{ type: i0.IterableDiffers }] });
|
|
@@ -48,4 +48,4 @@ export class WorkbenchDialogDiff {
|
|
|
48
48
|
.join(', ')}`;
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2JlbmNoLWRpYWxvZy1kaWZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi9yb3V0aW5nL3dvcmtiZW5jaC1kaWFsb2ctZGlmZmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFDLFVBQVUsRUFBbUQsTUFBTSxlQUFlLENBQUM7QUFFM0YsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDOztBQUV2Qzs7R0FFRztBQUVILE1BQU0sT0FBTyxxQkFBcUI7SUFJaEMsWUFBWSxPQUF3QjtRQUNsQyxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFVLENBQUM7SUFDekQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksSUFBSSxDQUFDLE9BQWdCO1FBQzFCLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXhGLE9BQU8sSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7OEdBZlUscUJBQXFCO2tIQUFyQixxQkFBcUIsY0FEVCxNQUFNOzsyRkFDbEIscUJBQXFCO2tCQURqQyxVQUFVO21CQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQzs7QUFtQmhDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLG1CQUFtQjtJQUs5QixZQUFZLE9BQXVDO1FBSG5DLHVCQUFrQixHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDekMseUJBQW9CLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUd6RCxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDMUUsT0FBTyxFQUFFLGtCQUFrQixDQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFTSxRQUFRO1FBQ2IsT0FBTyxHQUFHLElBQUksS0FBSyxFQUFVO2FBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyx1QkFBdUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUMvRixNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMseUJBQXlCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDckcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDbEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDI0IFN3aXNzIEZlZGVyYWwgUmFpbHdheXNcbiAqXG4gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlXG4gKiBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMFxuICogd2hpY2ggaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiAqL1xuXG5pbXBvcnQge0luamVjdGFibGUsIEl0ZXJhYmxlQ2hhbmdlcywgSXRlcmFibGVEaWZmZXIsIEl0ZXJhYmxlRGlmZmVyc30gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1VybFRyZWV9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1JvdXRpbmd9IGZyb20gJy4vcm91dGluZy51dGlsJztcblxuLyoqXG4gKiBTdGF0ZWZ1bCBkaWZmZXIgZm9yIGZpbmRpbmcgYWRkZWQvcmVtb3ZlZCBkaWFsb2dzLlxuICovXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBXb3JrYmVuY2hEaWFsb2dEaWZmZXIge1xuXG4gIHByaXZhdGUgX2RpYWxvZ0RpZmZlcjogSXRlcmFibGVEaWZmZXI8c3RyaW5nPjtcblxuICBjb25zdHJ1Y3RvcihkaWZmZXJzOiBJdGVyYWJsZURpZmZlcnMpIHtcbiAgICB0aGlzLl9kaWFsb2dEaWZmZXIgPSBkaWZmZXJzLmZpbmQoW10pLmNyZWF0ZTxzdHJpbmc+KCk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgZGlmZmVyZW5jZXMgaW4gdGhlIFVSTCBzaW5jZSBsYXN0IHRpbWUge0BsaW5rIFdvcmtiZW5jaERpYWxvZ0RpZmZlciNkaWZmfSB3YXMgaW52b2tlZC5cbiAgICovXG4gIHB1YmxpYyBkaWZmKHVybFRyZWU6IFVybFRyZWUpOiBXb3JrYmVuY2hEaWFsb2dEaWZmIHtcbiAgICBjb25zdCBkaWFsb2dPdXRsZXRzID0gT2JqZWN0LmtleXModXJsVHJlZS5yb290LmNoaWxkcmVuKS5maWx0ZXIoUm91dGluZy5pc0RpYWxvZ091dGxldCk7XG5cbiAgICByZXR1cm4gbmV3IFdvcmtiZW5jaERpYWxvZ0RpZmYodGhpcy5fZGlhbG9nRGlmZmVyLmRpZmYoZGlhbG9nT3V0bGV0cykpO1xuICB9XG59XG5cbi8qKlxuICogTGlzdHMgdGhlIGRpYWxvZ3MgYWRkZWQvcmVtb3ZlZCBpbiB0aGUgY3VycmVudCBuYXZpZ2F0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgV29ya2JlbmNoRGlhbG9nRGlmZiB7XG5cbiAgcHVibGljIHJlYWRvbmx5IGFkZGVkRGlhbG9nT3V0bGV0cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIHB1YmxpYyByZWFkb25seSByZW1vdmVkRGlhbG9nT3V0bGV0cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IoY2hhbmdlczogSXRlcmFibGVDaGFuZ2VzPHN0cmluZz4gfCBudWxsKSB7XG4gICAgY2hhbmdlcz8uZm9yRWFjaEFkZGVkSXRlbSgoe2l0ZW19KSA9PiB0aGlzLmFkZGVkRGlhbG9nT3V0bGV0cy5wdXNoKGl0ZW0pKTtcbiAgICBjaGFuZ2VzPy5mb3JFYWNoUmVtb3ZlZEl0ZW0oKHtpdGVtfSkgPT4gdGhpcy5yZW1vdmVkRGlhbG9nT3V0bGV0cy5wdXNoKGl0ZW0pKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtuZXcgQXJyYXk8c3RyaW5nPigpXG4gICAgICAuY29uY2F0KHRoaXMuYWRkZWREaWFsb2dPdXRsZXRzLmxlbmd0aCA/IGBhZGRlZERpYWxvZ091dGxldHM9WyR7dGhpcy5hZGRlZERpYWxvZ091dGxldHN9XWAgOiBbXSlcbiAgICAgIC5jb25jYXQodGhpcy5yZW1vdmVkRGlhbG9nT3V0bGV0cy5sZW5ndGggPyBgcmVtb3ZlZERpYWxvZ091dGxldHM9WyR7dGhpcy5yZW1vdmVkRGlhbG9nT3V0bGV0c31dYCA6IFtdKVxuICAgICAgLmpvaW4oJywgJyl9YDtcbiAgfVxufVxuIl19
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
* SPDX-License-Identifier: EPL-2.0
|
|
9
9
|
*/
|
|
10
10
|
import { Injectable } from '@angular/core';
|
|
11
|
-
import { RouterUtils } from './router.util';
|
|
12
11
|
import * as i0 from "@angular/core";
|
|
13
12
|
/**
|
|
14
13
|
* Stateful differ for finding added/removed workbench layout elements.
|
|
@@ -21,24 +20,18 @@ export class WorkbenchLayoutDiffer {
|
|
|
21
20
|
/**
|
|
22
21
|
* Computes differences in the layout since last time {@link WorkbenchLayoutDiffer#diff} was invoked.
|
|
23
22
|
*/
|
|
24
|
-
diff(workbenchLayout
|
|
23
|
+
diff(workbenchLayout) {
|
|
25
24
|
const parts = workbenchLayout?.parts().map(part => part.id);
|
|
26
|
-
|
|
27
|
-
// Otherwise, the initial navigation for a URL with outlets of views contained in the workbench grid would fail as their view routes would be
|
|
28
|
-
// registered too late.
|
|
29
|
-
const views = new Set([
|
|
30
|
-
...RouterUtils.parseViewOutlets(urlTree).keys(),
|
|
31
|
-
...(workbenchLayout?.views().map(view => view.id) ?? []),
|
|
32
|
-
]);
|
|
25
|
+
const views = workbenchLayout?.views().map(view => view.id);
|
|
33
26
|
return new WorkbenchLayoutDiff({
|
|
34
27
|
parts: this._partsDiffer.diff(parts),
|
|
35
28
|
views: this._viewsDiffer.diff(views),
|
|
36
29
|
});
|
|
37
30
|
}
|
|
38
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
39
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
31
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: WorkbenchLayoutDiffer, deps: [{ token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
32
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: WorkbenchLayoutDiffer, providedIn: 'root' }); }
|
|
40
33
|
}
|
|
41
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
34
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: WorkbenchLayoutDiffer, decorators: [{
|
|
42
35
|
type: Injectable,
|
|
43
36
|
args: [{ providedIn: 'root' }]
|
|
44
37
|
}], ctorParameters: () => [{ type: i0.IterableDiffers }] });
|
|
@@ -65,4 +58,4 @@ export class WorkbenchLayoutDiff {
|
|
|
65
58
|
.join(', ')}`;
|
|
66
59
|
}
|
|
67
60
|
}
|
|
68
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2JlbmNoLWxheW91dC1kaWZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi9yb3V0aW5nL3dvcmtiZW5jaC1sYXlvdXQtZGlmZmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFDLFVBQVUsRUFBbUQsTUFBTSxlQUFlLENBQUM7O0FBSTNGOztHQUVHO0FBRUgsTUFBTSxPQUFPLHFCQUFxQjtJQUtoQyxZQUFZLE9BQXdCO1FBQ2xDLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQVUsQ0FBQztRQUN0RCxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFVLENBQUM7SUFDeEQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksSUFBSSxDQUFDLGVBQXdDO1FBQ2xELE1BQU0sS0FBSyxHQUFHLGVBQWUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUQsTUFBTSxLQUFLLEdBQUcsZUFBZSxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1RCxPQUFPLElBQUksbUJBQW1CLENBQUM7WUFDN0IsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUNwQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1NBQ3JDLENBQUMsQ0FBQztJQUNMLENBQUM7OEdBcEJVLHFCQUFxQjtrSEFBckIscUJBQXFCLGNBRFQsTUFBTTs7MkZBQ2xCLHFCQUFxQjtrQkFEakMsVUFBVTttQkFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUM7O0FBd0JoQzs7R0FFRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUFROUIsWUFBWSxPQUF1RjtRQU5uRixlQUFVLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUNqQyxpQkFBWSxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFFbkMsZUFBVSxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDakMsaUJBQVksR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBR2pELE9BQU8sQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRTVFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFTSxRQUFRO1FBQ2IsT0FBTyxHQUFHLElBQUksS0FBSyxFQUFVO2FBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsZUFBZSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUN2RSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUM3RSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGVBQWUsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDdkUsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDN0UsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDbEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDIzIFN3aXNzIEZlZGVyYWwgUmFpbHdheXNcbiAqXG4gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlXG4gKiBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMFxuICogd2hpY2ggaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiAqL1xuXG5pbXBvcnQge0luamVjdGFibGUsIEl0ZXJhYmxlQ2hhbmdlcywgSXRlcmFibGVEaWZmZXIsIEl0ZXJhYmxlRGlmZmVyc30gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge8m1V29ya2JlbmNoTGF5b3V0fSBmcm9tICcuLi9sYXlvdXQvybV3b3JrYmVuY2gtbGF5b3V0JztcbmltcG9ydCB7Vmlld0lkfSBmcm9tICcuLi92aWV3L3dvcmtiZW5jaC12aWV3Lm1vZGVsJztcblxuLyoqXG4gKiBTdGF0ZWZ1bCBkaWZmZXIgZm9yIGZpbmRpbmcgYWRkZWQvcmVtb3ZlZCB3b3JrYmVuY2ggbGF5b3V0IGVsZW1lbnRzLlxuICovXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBXb3JrYmVuY2hMYXlvdXREaWZmZXIge1xuXG4gIHByaXZhdGUgX3BhcnRzRGlmZmVyOiBJdGVyYWJsZURpZmZlcjxzdHJpbmc+O1xuICBwcml2YXRlIF92aWV3c0RpZmZlcjogSXRlcmFibGVEaWZmZXI8Vmlld0lkPjtcblxuICBjb25zdHJ1Y3RvcihkaWZmZXJzOiBJdGVyYWJsZURpZmZlcnMpIHtcbiAgICB0aGlzLl9wYXJ0c0RpZmZlciA9IGRpZmZlcnMuZmluZChbXSkuY3JlYXRlPHN0cmluZz4oKTtcbiAgICB0aGlzLl92aWV3c0RpZmZlciA9IGRpZmZlcnMuZmluZChbXSkuY3JlYXRlPFZpZXdJZD4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyBkaWZmZXJlbmNlcyBpbiB0aGUgbGF5b3V0IHNpbmNlIGxhc3QgdGltZSB7QGxpbmsgV29ya2JlbmNoTGF5b3V0RGlmZmVyI2RpZmZ9IHdhcyBpbnZva2VkLlxuICAgKi9cbiAgcHVibGljIGRpZmYod29ya2JlbmNoTGF5b3V0OiDJtVdvcmtiZW5jaExheW91dCB8IG51bGwpOiBXb3JrYmVuY2hMYXlvdXREaWZmIHtcbiAgICBjb25zdCBwYXJ0cyA9IHdvcmtiZW5jaExheW91dD8ucGFydHMoKS5tYXAocGFydCA9PiBwYXJ0LmlkKTtcbiAgICBjb25zdCB2aWV3cyA9IHdvcmtiZW5jaExheW91dD8udmlld3MoKS5tYXAodmlldyA9PiB2aWV3LmlkKTtcbiAgICByZXR1cm4gbmV3IFdvcmtiZW5jaExheW91dERpZmYoe1xuICAgICAgcGFydHM6IHRoaXMuX3BhcnRzRGlmZmVyLmRpZmYocGFydHMpLFxuICAgICAgdmlld3M6IHRoaXMuX3ZpZXdzRGlmZmVyLmRpZmYodmlld3MpLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogTGlzdHMgdGhlIGxheW91dCBlbGVtZW50cyBhZGRlZC9yZW1vdmVkIGluIHRoZSBjdXJyZW50IG5hdmlnYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3JrYmVuY2hMYXlvdXREaWZmIHtcblxuICBwdWJsaWMgcmVhZG9ubHkgYWRkZWRQYXJ0cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIHB1YmxpYyByZWFkb25seSByZW1vdmVkUGFydHMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gIHB1YmxpYyByZWFkb25seSBhZGRlZFZpZXdzID0gbmV3IEFycmF5PFZpZXdJZD4oKTtcbiAgcHVibGljIHJlYWRvbmx5IHJlbW92ZWRWaWV3cyA9IG5ldyBBcnJheTxWaWV3SWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoY2hhbmdlczoge3BhcnRzOiBJdGVyYWJsZUNoYW5nZXM8c3RyaW5nPiB8IG51bGw7IHZpZXdzOiBJdGVyYWJsZUNoYW5nZXM8Vmlld0lkPiB8IG51bGx9KSB7XG4gICAgY2hhbmdlcy5wYXJ0cz8uZm9yRWFjaEFkZGVkSXRlbSgoe2l0ZW19KSA9PiB0aGlzLmFkZGVkUGFydHMucHVzaChpdGVtKSk7XG4gICAgY2hhbmdlcy5wYXJ0cz8uZm9yRWFjaFJlbW92ZWRJdGVtKCh7aXRlbX0pID0+IHRoaXMucmVtb3ZlZFBhcnRzLnB1c2goaXRlbSkpO1xuXG4gICAgY2hhbmdlcy52aWV3cz8uZm9yRWFjaEFkZGVkSXRlbSgoe2l0ZW19KSA9PiB0aGlzLmFkZGVkVmlld3MucHVzaChpdGVtKSk7XG4gICAgY2hhbmdlcy52aWV3cz8uZm9yRWFjaFJlbW92ZWRJdGVtKCh7aXRlbX0pID0+IHRoaXMucmVtb3ZlZFZpZXdzLnB1c2goaXRlbSkpO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke25ldyBBcnJheTxzdHJpbmc+KClcbiAgICAgIC5jb25jYXQodGhpcy5hZGRlZFBhcnRzLmxlbmd0aCA/IGBhZGRlZFBhcnRzPVske3RoaXMuYWRkZWRQYXJ0c31dYCA6IFtdKVxuICAgICAgLmNvbmNhdCh0aGlzLnJlbW92ZWRQYXJ0cy5sZW5ndGggPyBgcmVtb3ZlZFBhcnRzPVske3RoaXMucmVtb3ZlZFBhcnRzfV1gIDogW10pXG4gICAgICAuY29uY2F0KHRoaXMuYWRkZWRWaWV3cy5sZW5ndGggPyBgYWRkZWRWaWV3cz1bJHt0aGlzLmFkZGVkVmlld3N9XWAgOiBbXSlcbiAgICAgIC5jb25jYXQodGhpcy5yZW1vdmVkVmlld3MubGVuZ3RoID8gYHJlbW92ZWRWaWV3cz1bJHt0aGlzLnJlbW92ZWRWaWV3c31dYCA6IFtdKVxuICAgICAgLmpvaW4oJywgJyl9YDtcbiAgfVxufVxuIl19
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* SPDX-License-Identifier: EPL-2.0
|
|
9
9
|
*/
|
|
10
10
|
import { Injectable } from '@angular/core';
|
|
11
|
-
import {
|
|
11
|
+
import { Routing } from './routing.util';
|
|
12
12
|
import * as i0 from "@angular/core";
|
|
13
13
|
/**
|
|
14
14
|
* Stateful differ for finding added/removed message boxes.
|
|
@@ -21,13 +21,13 @@ export class WorkbenchMessageBoxDiffer {
|
|
|
21
21
|
* Computes differences in the URL since last time {@link WorkbenchMessageBoxDiffer#diff} was invoked.
|
|
22
22
|
*/
|
|
23
23
|
diff(urlTree) {
|
|
24
|
-
const messageBoxOutlets = Object.keys(urlTree.root.children).filter(
|
|
24
|
+
const messageBoxOutlets = Object.keys(urlTree.root.children).filter(Routing.isMessageBoxOutlet);
|
|
25
25
|
return new WorkbenchMessageBoxDiff(this._messageBoxDiffer.diff(messageBoxOutlets));
|
|
26
26
|
}
|
|
27
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
28
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
27
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: WorkbenchMessageBoxDiffer, deps: [{ token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
28
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: WorkbenchMessageBoxDiffer, providedIn: 'root' }); }
|
|
29
29
|
}
|
|
30
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
30
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: WorkbenchMessageBoxDiffer, decorators: [{
|
|
31
31
|
type: Injectable,
|
|
32
32
|
args: [{ providedIn: 'root' }]
|
|
33
33
|
}], ctorParameters: () => [{ type: i0.IterableDiffers }] });
|
|
@@ -48,4 +48,4 @@ export class WorkbenchMessageBoxDiff {
|
|
|
48
48
|
.join(', ')}`;
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2JlbmNoLW1lc3NhZ2UtYm94LWRpZmZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL3JvdXRpbmcvd29ya2JlbmNoLW1lc3NhZ2UtYm94LWRpZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxVQUFVLEVBQW1ELE1BQU0sZUFBZSxDQUFDO0FBRTNGLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFFdkM7O0dBRUc7QUFFSCxNQUFNLE9BQU8seUJBQXlCO0lBSXBDLFlBQVksT0FBd0I7UUFDbEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFVLENBQUM7SUFDN0QsQ0FBQztJQUVEOztPQUVHO0lBQ0ksSUFBSSxDQUFDLE9BQWdCO1FBQzFCLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUVoRyxPQUFPLElBQUksdUJBQXVCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7SUFDckYsQ0FBQzs4R0FmVSx5QkFBeUI7a0hBQXpCLHlCQUF5QixjQURiLE1BQU07OzJGQUNsQix5QkFBeUI7a0JBRHJDLFVBQVU7bUJBQUMsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFDOztBQW1CaEM7O0dBRUc7QUFDSCxNQUFNLE9BQU8sdUJBQXVCO0lBS2xDLFlBQVksT0FBdUM7UUFIbkMsMkJBQXNCLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUM3Qyw2QkFBd0IsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBRzdELE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUMsSUFBSSxFQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM5RSxPQUFPLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUVNLFFBQVE7UUFDYixPQUFPLEdBQUcsSUFBSSxLQUFLLEVBQVU7YUFDMUIsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixJQUFJLENBQUMsc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQzNHLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyw2QkFBNkIsSUFBSSxDQUFDLHdCQUF3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUNqSCxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUNsQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjQgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7SW5qZWN0YWJsZSwgSXRlcmFibGVDaGFuZ2VzLCBJdGVyYWJsZURpZmZlciwgSXRlcmFibGVEaWZmZXJzfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7VXJsVHJlZX0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7Um91dGluZ30gZnJvbSAnLi9yb3V0aW5nLnV0aWwnO1xuXG4vKipcbiAqIFN0YXRlZnVsIGRpZmZlciBmb3IgZmluZGluZyBhZGRlZC9yZW1vdmVkIG1lc3NhZ2UgYm94ZXMuXG4gKi9cbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxuZXhwb3J0IGNsYXNzIFdvcmtiZW5jaE1lc3NhZ2VCb3hEaWZmZXIge1xuXG4gIHByaXZhdGUgX21lc3NhZ2VCb3hEaWZmZXI6IEl0ZXJhYmxlRGlmZmVyPHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IoZGlmZmVyczogSXRlcmFibGVEaWZmZXJzKSB7XG4gICAgdGhpcy5fbWVzc2FnZUJveERpZmZlciA9IGRpZmZlcnMuZmluZChbXSkuY3JlYXRlPHN0cmluZz4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyBkaWZmZXJlbmNlcyBpbiB0aGUgVVJMIHNpbmNlIGxhc3QgdGltZSB7QGxpbmsgV29ya2JlbmNoTWVzc2FnZUJveERpZmZlciNkaWZmfSB3YXMgaW52b2tlZC5cbiAgICovXG4gIHB1YmxpYyBkaWZmKHVybFRyZWU6IFVybFRyZWUpOiBXb3JrYmVuY2hNZXNzYWdlQm94RGlmZiB7XG4gICAgY29uc3QgbWVzc2FnZUJveE91dGxldHMgPSBPYmplY3Qua2V5cyh1cmxUcmVlLnJvb3QuY2hpbGRyZW4pLmZpbHRlcihSb3V0aW5nLmlzTWVzc2FnZUJveE91dGxldCk7XG5cbiAgICByZXR1cm4gbmV3IFdvcmtiZW5jaE1lc3NhZ2VCb3hEaWZmKHRoaXMuX21lc3NhZ2VCb3hEaWZmZXIuZGlmZihtZXNzYWdlQm94T3V0bGV0cykpO1xuICB9XG59XG5cbi8qKlxuICogTGlzdHMgdGhlIG1lc3NhZ2UgYm94ZXMgYWRkZWQvcmVtb3ZlZCBpbiB0aGUgY3VycmVudCBuYXZpZ2F0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgV29ya2JlbmNoTWVzc2FnZUJveERpZmYge1xuXG4gIHB1YmxpYyByZWFkb25seSBhZGRlZE1lc3NhZ2VCb3hPdXRsZXRzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgcHVibGljIHJlYWRvbmx5IHJlbW92ZWRNZXNzYWdlQm94T3V0bGV0cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IoY2hhbmdlczogSXRlcmFibGVDaGFuZ2VzPHN0cmluZz4gfCBudWxsKSB7XG4gICAgY2hhbmdlcz8uZm9yRWFjaEFkZGVkSXRlbSgoe2l0ZW19KSA9PiB0aGlzLmFkZGVkTWVzc2FnZUJveE91dGxldHMucHVzaChpdGVtKSk7XG4gICAgY2hhbmdlcz8uZm9yRWFjaFJlbW92ZWRJdGVtKCh7aXRlbX0pID0+IHRoaXMucmVtb3ZlZE1lc3NhZ2VCb3hPdXRsZXRzLnB1c2goaXRlbSkpO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke25ldyBBcnJheTxzdHJpbmc+KClcbiAgICAgIC5jb25jYXQodGhpcy5hZGRlZE1lc3NhZ2VCb3hPdXRsZXRzLmxlbmd0aCA/IGBhZGRlZE1lc3NhZ2VCb3hPdXRsZXRzPVske3RoaXMuYWRkZWRNZXNzYWdlQm94T3V0bGV0c31dYCA6IFtdKVxuICAgICAgLmNvbmNhdCh0aGlzLnJlbW92ZWRNZXNzYWdlQm94T3V0bGV0cy5sZW5ndGggPyBgcmVtb3ZlZE1lc3NhZ2VCb3hPdXRsZXRzPVske3RoaXMucmVtb3ZlZE1lc3NhZ2VCb3hPdXRsZXRzfV1gIDogW10pXG4gICAgICAuam9pbignLCAnKX1gO1xuICB9XG59XG4iXX0=
|