@scion/workbench 18.0.0-beta.9 → 19.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/design/_workbench-view-global-styles.scss +0 -1
- package/fesm2022/scion-workbench.mjs +8556 -8622
- package/fesm2022/scion-workbench.mjs.map +1 -1
- package/lib/common/css-class.util.d.ts +5 -0
- package/lib/common/math.util.d.ts +7 -0
- package/lib/common/objects.util.d.ts +1 -1
- package/lib/dialog/workbench-dialog.component.d.ts +1 -2
- package/lib/layout/migration/model/workbench-layout-migration-v6.model.d.ts +35 -0
- package/lib/layout/migration/workbench-layout-migration-v6.service.d.ts +12 -0
- package/lib/layout/workbench-layout.model.d.ts +0 -1
- package/lib/layout/workbench-layout.service.d.ts +10 -12
- package/lib/layout/workench-layout-serializer.service.d.ts +1 -2
- package/lib/part/part-action-bar/part-action-bar.component.d.ts +2 -6
- package/lib/part/part-bar/part-bar.component.d.ts +66 -48
- package/lib/part/view-tab/view-tab.component.d.ts +3 -3
- package/lib/public_api.d.ts +0 -2
- package/lib/routing/routing.util.d.ts +2 -2
- package/lib/view/view-move-handler.service.d.ts +16 -14
- package/lib/view/view.component.d.ts +1 -2
- package/lib/view//311/265workbench-view.model.d.ts +1 -9
- package/lib/view-dnd/grid-drop-targets.util.d.ts +1 -1
- package/lib/view-dnd/view-drag.service.d.ts +72 -49
- package/lib/view-dnd/view-tab-drag-image-renderer.service.d.ts +11 -36
- package/package.json +8 -10
- package/esm2022/lib/activation-instant.provider.mjs +0 -29
- package/esm2022/lib/common/animation-frame.observable.mjs +0 -37
- package/esm2022/lib/common/asserts.util.mjs +0 -31
- package/esm2022/lib/common/class-list.mjs +0 -99
- package/esm2022/lib/common/coerce-observable.pipe.mjs +0 -28
- package/esm2022/lib/common/disposable.mjs +0 -11
- package/esm2022/lib/common/dom.util.mjs +0 -100
- package/esm2022/lib/common/grid-element-if-visible.pipe.mjs +0 -32
- package/esm2022/lib/common/instanceof.pipe.mjs +0 -26
- package/esm2022/lib/common/map-coerce.pipe.mjs +0 -28
- package/esm2022/lib/common/null-if-empty.pipe.mjs +0 -38
- package/esm2022/lib/common/objects.util.mjs +0 -40
- package/esm2022/lib/common/observables.mjs +0 -72
- package/esm2022/lib/common/operators.mjs +0 -27
- package/esm2022/lib/common/public_api.mjs +0 -11
- package/esm2022/lib/common/stringify-error.util.mjs +0 -19
- package/esm2022/lib/common/throw-error.util.mjs +0 -16
- package/esm2022/lib/common/typeof.pipe.mjs +0 -26
- package/esm2022/lib/common/uid.util.mjs +0 -22
- package/esm2022/lib/common//311/265destroy-ref.mjs +0 -36
- package/esm2022/lib/communication/workbench-broadcast-channel.mjs +0 -38
- package/esm2022/lib/content-projection/content-as-overlay.component.mjs +0 -114
- package/esm2022/lib/content-projection/workbench-element-references.mjs +0 -32
- package/esm2022/lib/dialog/dialog-footer/dialog-action-filter.pipe.mjs +0 -26
- package/esm2022/lib/dialog/dialog-footer/dialog-footer.component.mjs +0 -34
- package/esm2022/lib/dialog/dialog-footer/workbench-dialog-action.directive.mjs +0 -51
- package/esm2022/lib/dialog/dialog-footer/workbench-dialog-footer.directive.mjs +0 -46
- package/esm2022/lib/dialog/dialog-header/dialog-header.component.mjs +0 -33
- package/esm2022/lib/dialog/dialog-header/workbench-dialog-header.directive.mjs +0 -46
- package/esm2022/lib/dialog/movable.directive.mjs +0 -126
- package/esm2022/lib/dialog/public_api.mjs +0 -15
- package/esm2022/lib/dialog/resizable.directive.mjs +0 -392
- package/esm2022/lib/dialog/workbench-dialog.component.mjs +0 -250
- package/esm2022/lib/dialog/workbench-dialog.mjs +0 -79
- package/esm2022/lib/dialog/workbench-dialog.options.mjs +0 -11
- package/esm2022/lib/dialog/workbench-dialog.registry.mjs +0 -73
- package/esm2022/lib/dialog/workbench-dialog.service.mjs +0 -96
- package/esm2022/lib/dialog//311/265workbench-dialog.mjs +0 -310
- package/esm2022/lib/dialog//311/265workbench-dialog.service.mjs +0 -98
- package/esm2022/lib/executor/latest-task-executor.mjs +0 -55
- package/esm2022/lib/executor/single-task-executor.mjs +0 -72
- package/esm2022/lib/filter-field/filter-field.component.mjs +0 -130
- package/esm2022/lib/glass-pane/blockable.mjs +0 -11
- package/esm2022/lib/glass-pane/blocking.mjs +0 -11
- package/esm2022/lib/glass-pane/glass-pane.directive.mjs +0 -120
- package/esm2022/lib/layout/grid-element/grid-element.component.mjs +0 -111
- package/esm2022/lib/layout/main-area-layout/main-area-layout.component.mjs +0 -97
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v2.model.mjs +0 -11
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v3.model.mjs +0 -11
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v4.model.mjs +0 -11
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v5.model.mjs +0 -11
- package/esm2022/lib/layout/migration/workbench-layout-migration-v3.service.mjs +0 -117
- package/esm2022/lib/layout/migration/workbench-layout-migration-v4.service.mjs +0 -57
- package/esm2022/lib/layout/migration/workbench-layout-migration-v5.service.mjs +0 -67
- package/esm2022/lib/layout/public_api.mjs +0 -12
- package/esm2022/lib/layout/stringifier.mjs +0 -70
- package/esm2022/lib/layout/workbench-layout.component.mjs +0 -90
- package/esm2022/lib/layout/workbench-layout.factory.mjs +0 -24
- package/esm2022/lib/layout/workbench-layout.mjs +0 -16
- package/esm2022/lib/layout/workbench-layout.model.mjs +0 -62
- package/esm2022/lib/layout/workbench-layout.service.mjs +0 -68
- package/esm2022/lib/layout/workbench-layouts.util.mjs +0 -58
- package/esm2022/lib/layout/workench-layout-serializer.service.mjs +0 -109
- package/esm2022/lib/layout//311/265workbench-layout.factory.mjs +0 -54
- package/esm2022/lib/layout//311/265workbench-layout.mjs +0 -876
- package/esm2022/lib/logging/console-appender.service.mjs +0 -46
- package/esm2022/lib/logging/index.mjs +0 -15
- package/esm2022/lib/logging/logger-names.mjs +0 -32
- package/esm2022/lib/logging/logger.mjs +0 -36
- package/esm2022/lib/logging/logging-support.mjs +0 -26
- package/esm2022/lib/logging/logging.model.mjs +0 -45
- package/esm2022/lib/logging/public_api.mjs +0 -12
- package/esm2022/lib/logging//311/265logger.mjs +0 -73
- package/esm2022/lib/message-box/message-box-footer/message-box-footer.component.mjs +0 -69
- package/esm2022/lib/message-box/message-box-header/message-box-header.component.mjs +0 -28
- package/esm2022/lib/message-box/public_api.mjs +0 -11
- package/esm2022/lib/message-box/workbench-message-box.component.mjs +0 -102
- package/esm2022/lib/message-box/workbench-message-box.options.mjs +0 -2
- package/esm2022/lib/message-box/workbench-message-box.service.mjs +0 -39
- package/esm2022/lib/message-box//311/265workbench-message-box.service.mjs +0 -45
- package/esm2022/lib/microfrontend-platform/common/microfrontend.util.mjs +0 -71
- package/esm2022/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.mjs +0 -126
- package/esm2022/lib/microfrontend-platform/initialization/ng-zone-observable-decorator.mjs +0 -36
- package/esm2022/lib/microfrontend-platform/initialization/workbench-host-manifest-interceptor.service.mjs +0 -84
- package/esm2022/lib/microfrontend-platform/manifest-object-cache.service.mjs +0 -63
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-capability-validator.interceptor.mjs +0 -54
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-intent-handler.interceptor.mjs +0 -85
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog.component.mjs +0 -140
- package/esm2022/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.mjs +0 -133
- package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/microfrontend-host-message-box.component.mjs +0 -113
- package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/text-message/text-message.component.mjs +0 -43
- package/esm2022/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.mjs +0 -101
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-capability-validator.interceptor.mjs +0 -35
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-intent-handler.interceptor.mjs +0 -88
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-legacy-intent-translator.interceptor.mjs +0 -32
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box.component.mjs +0 -121
- package/esm2022/lib/microfrontend-platform/microfrontend-notification/microfrontend-notification-intent-handler.service.mjs +0 -45
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-capability-validator.interceptor.mjs +0 -39
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-installer.service.mjs +0 -120
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-intent-handler.interceptor.mjs +0 -55
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/workbench-perspective-data.mjs +0 -19
- package/esm2022/lib/microfrontend-platform/microfrontend-platform-config-loader.mjs +0 -13
- package/esm2022/lib/microfrontend-platform/microfrontend-platform.config.mjs +0 -11
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-capability-validator.interceptor.mjs +0 -31
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.mjs +0 -132
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.mjs +0 -115
- package/esm2022/lib/microfrontend-platform/microfrontend-splash/microfrontend-splash.component.mjs +0 -21
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.mjs +0 -112
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.mjs +0 -313
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-workbench-view.model.mjs +0 -23
- package/esm2022/lib/microfrontend-platform/public_api.mjs +0 -13
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-validator.interceptor.mjs +0 -31
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.mjs +0 -127
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-routes.mjs +0 -125
- package/esm2022/lib/microfrontend-platform/stable-capability-id-assigner.interceptor.mjs +0 -32
- package/esm2022/lib/microfrontend-platform/workbench-microfrontend-support.mjs +0 -191
- package/esm2022/lib/migration/workbench-migration.mjs +0 -11
- package/esm2022/lib/migration/workbench-migrator.mjs +0 -38
- package/esm2022/lib/notification/notification-css-classes.pipe.mjs +0 -24
- package/esm2022/lib/notification/notification-list.component.mjs +0 -51
- package/esm2022/lib/notification/notification.component.mjs +0 -109
- package/esm2022/lib/notification/notification.config.mjs +0 -11
- package/esm2022/lib/notification/notification.mjs +0 -19
- package/esm2022/lib/notification/notification.service.mjs +0 -134
- package/esm2022/lib/notification/public_api.mjs +0 -12
- package/esm2022/lib/notification/text-notification.component.mjs +0 -23
- package/esm2022/lib/notification//311/265notification.mjs +0 -42
- package/esm2022/lib/page-not-found/page-not-found.component.mjs +0 -26
- package/esm2022/lib/part/part-action-bar/part-action-bar.component.mjs +0 -31
- package/esm2022/lib/part/part-action-bar/part-action.directive.mjs +0 -77
- package/esm2022/lib/part/part-bar/part-bar.component.mjs +0 -444
- package/esm2022/lib/part/part-portal.pipe.mjs +0 -35
- package/esm2022/lib/part/part.component.mjs +0 -135
- package/esm2022/lib/part/public_api.mjs +0 -13
- package/esm2022/lib/part/view-context-menu/accelerator-format.pipe.mjs +0 -31
- package/esm2022/lib/part/view-context-menu/text.component.mjs +0 -38
- package/esm2022/lib/part/view-context-menu/view-menu.component.mjs +0 -89
- package/esm2022/lib/part/view-context-menu/view-menu.directive.mjs +0 -76
- package/esm2022/lib/part/view-context-menu/view-menu.service.mjs +0 -340
- package/esm2022/lib/part/view-list/view-list.component.mjs +0 -117
- package/esm2022/lib/part/view-list-button/view-list-button.component.mjs +0 -82
- package/esm2022/lib/part/view-list-item/view-list-item.component.mjs +0 -60
- package/esm2022/lib/part/view-tab/view-tab.component.mjs +0 -218
- package/esm2022/lib/part/view-tab-content/view-tab-content.component.mjs +0 -29
- package/esm2022/lib/part/view-tab-drag-image/view-tab-drag-image.component.mjs +0 -81
- package/esm2022/lib/part/workbench-part-action.registry.mjs +0 -23
- package/esm2022/lib/part/workbench-part.model.mjs +0 -19
- package/esm2022/lib/part/workbench-part.registry.mjs +0 -23
- package/esm2022/lib/part//311/265workbench-part.model.mjs +0 -146
- package/esm2022/lib/perspective/migration/model/workbench-perspective-migration-v1.model.mjs +0 -11
- package/esm2022/lib/perspective/migration/model/workbench-perspective-migration-v2.model.mjs +0 -11
- package/esm2022/lib/perspective/migration/workbench-perspective-migration-v2.service.mjs +0 -57
- package/esm2022/lib/perspective/public_api.mjs +0 -11
- package/esm2022/lib/perspective/workbench-grid-merger.service.mjs +0 -39
- package/esm2022/lib/perspective/workbench-perspective-storage.service.mjs +0 -72
- package/esm2022/lib/perspective/workbench-perspective-view-conflict-resolver.service.mjs +0 -50
- package/esm2022/lib/perspective/workbench-perspective.model.mjs +0 -2
- package/esm2022/lib/perspective/workbench-perspective.registry.mjs +0 -23
- package/esm2022/lib/perspective/workbench-perspective.service.mjs +0 -180
- package/esm2022/lib/perspective/workench-perspective-serializer.service.mjs +0 -62
- package/esm2022/lib/perspective//311/265workbench-perspective.model.mjs +0 -210
- package/esm2022/lib/popup/popup.component.mjs +0 -124
- package/esm2022/lib/popup/popup.config.mjs +0 -100
- package/esm2022/lib/popup/popup.origin.mjs +0 -11
- package/esm2022/lib/popup/popup.service.mjs +0 -339
- package/esm2022/lib/popup/public_api.mjs +0 -12
- package/esm2022/lib/portal/wb-component-portal.mjs +0 -130
- package/esm2022/lib/portal/workbench-portal-outlet.directive.mjs +0 -68
- package/esm2022/lib/public_api.mjs +0 -32
- package/esm2022/lib/registry/workbench-object-registry.mjs +0 -104
- package/esm2022/lib/routing/empty-outlet/empty-outlet.component.mjs +0 -31
- package/esm2022/lib/routing/public_api.mjs +0 -14
- package/esm2022/lib/routing/routing.model.mjs +0 -11
- package/esm2022/lib/routing/routing.util.mjs +0 -215
- package/esm2022/lib/routing/url-segment-matcher.mjs +0 -46
- package/esm2022/lib/routing/workbench-auxiliary-route-installer.service.mjs +0 -110
- package/esm2022/lib/routing/workbench-dialog-differ.mjs +0 -51
- package/esm2022/lib/routing/workbench-layout-differ.mjs +0 -61
- package/esm2022/lib/routing/workbench-message-box-differ.mjs +0 -51
- package/esm2022/lib/routing/workbench-navigational-states.mjs +0 -33
- package/esm2022/lib/routing/workbench-popup-differ.mjs +0 -51
- package/esm2022/lib/routing/workbench-route-data.mjs +0 -39
- package/esm2022/lib/routing/workbench-route-guards.mjs +0 -57
- package/esm2022/lib/routing/workbench-router-link.directive.mjs +0 -124
- package/esm2022/lib/routing/workbench-router.service.mjs +0 -19
- package/esm2022/lib/routing/workbench-url-observer.service.mjs +0 -305
- package/esm2022/lib/routing/workbench-view-outlet-differ.mjs +0 -58
- package/esm2022/lib/routing//311/265location.mjs +0 -70
- package/esm2022/lib/routing//311/265workbench-router.service.mjs +0 -359
- package/esm2022/lib/startup/public_api.mjs +0 -12
- package/esm2022/lib/startup/splash/splash.component.mjs +0 -24
- package/esm2022/lib/startup/workbench-initializer.mjs +0 -96
- package/esm2022/lib/startup/workbench-launcher.service.mjs +0 -173
- package/esm2022/lib/storage/public_api.mjs +0 -11
- package/esm2022/lib/storage/workbench-storage.mjs +0 -37
- package/esm2022/lib/testing/public_api.mjs +0 -12
- package/esm2022/lib/testing/workbench-testing.module.mjs +0 -49
- package/esm2022/lib/testing/workbench.provider.mjs +0 -60
- package/esm2022/lib/theme/workbench-theme-switcher.service.mjs +0 -72
- package/esm2022/lib/view/public_api.mjs +0 -11
- package/esm2022/lib/view/view-context-provider.mjs +0 -31
- package/esm2022/lib/view/view-move-handler.service.mjs +0 -145
- package/esm2022/lib/view/view-portal.pipe.mjs +0 -33
- package/esm2022/lib/view/view.component.mjs +0 -128
- package/esm2022/lib/view/workbench-view.model.mjs +0 -12
- package/esm2022/lib/view/workbench-view.registry.mjs +0 -23
- package/esm2022/lib/view//311/265workbench-view.model.mjs +0 -375
- package/esm2022/lib/view-dnd/grid-drop-targets.util.mjs +0 -49
- package/esm2022/lib/view-dnd/requires-drop-zone.pipe.mjs +0 -58
- package/esm2022/lib/view-dnd/view-drag.service.mjs +0 -213
- package/esm2022/lib/view-dnd/view-drop-placeholder-renderer.service.mjs +0 -89
- package/esm2022/lib/view-dnd/view-drop-zone.directive.mjs +0 -183
- package/esm2022/lib/view-dnd/view-tab-drag-image-renderer.service.mjs +0 -224
- package/esm2022/lib/workbench-config.mjs +0 -15
- package/esm2022/lib/workbench-id.mjs +0 -21
- package/esm2022/lib/workbench.component.mjs +0 -146
- package/esm2022/lib/workbench.constants.mjs +0 -41
- package/esm2022/lib/workbench.model.mjs +0 -11
- package/esm2022/lib/workbench.module.mjs +0 -101
- package/esm2022/lib/workbench.provider.mjs +0 -111
- package/esm2022/lib/workbench.service.mjs +0 -29
- package/esm2022/lib//311/265workbench.service.mjs +0 -102
- package/esm2022/public-api.mjs +0 -14
- package/esm2022/scion-workbench.mjs +0 -5
- package/lib/common/animation-frame.observable.d.ts +0 -10
- package/lib/testing/public_api.d.ts +0 -2
- package/lib/testing/workbench-testing.module.d.ts +0 -40
- package/lib/testing/workbench.provider.d.ts +0 -31
- package/lib/workbench.module.d.ts +0 -65
|
@@ -1,375 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2018-2022 Swiss Federal Railways
|
|
3
|
-
*
|
|
4
|
-
* This program and the accompanying materials are made
|
|
5
|
-
* available under the terms of the Eclipse Public License 2.0
|
|
6
|
-
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
7
|
-
*
|
|
8
|
-
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
-
*/
|
|
10
|
-
import { BehaviorSubject, combineLatest, firstValueFrom } from 'rxjs';
|
|
11
|
-
import { ChildrenOutletContexts } from '@angular/router';
|
|
12
|
-
import { ViewDragService } from '../view-dnd/view-drag.service';
|
|
13
|
-
import { map } from 'rxjs/operators';
|
|
14
|
-
import { filterArray, mapArray } from '@scion/toolkit/operators';
|
|
15
|
-
import { throwError } from '../common/throw-error.util';
|
|
16
|
-
import { WorkbenchPart } from '../part/workbench-part.model';
|
|
17
|
-
import { ɵWorkbenchService } from '../ɵworkbench.service';
|
|
18
|
-
import { WbComponentPortal } from '../portal/wb-component-portal';
|
|
19
|
-
import { assertNotInReactiveContext, computed, effect, EnvironmentInjector, inject, runInInjectionContext, signal, untracked } from '@angular/core';
|
|
20
|
-
import { ɵWorkbenchPart } from '../part/ɵworkbench-part.model';
|
|
21
|
-
import { ActivationInstantProvider } from '../activation-instant.provider';
|
|
22
|
-
import { WORKBENCH_PART_REGISTRY } from '../part/workbench-part.registry';
|
|
23
|
-
import { WorkbenchLayoutService } from '../layout/workbench-layout.service';
|
|
24
|
-
import { WorkbenchDialogRegistry } from '../dialog/workbench-dialog.registry';
|
|
25
|
-
import { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';
|
|
26
|
-
import { provideViewContext } from './view-context-provider';
|
|
27
|
-
import { WORKBENCH_ID } from '../workbench-id';
|
|
28
|
-
import { ClassList } from '../common/class-list';
|
|
29
|
-
import { Routing } from '../routing/routing.util';
|
|
30
|
-
import { WorkbenchRouteData } from '../routing/workbench-route-data';
|
|
31
|
-
import { ɵWorkbenchRouter } from '../routing/ɵworkbench-router.service';
|
|
32
|
-
import { Observables } from '@scion/toolkit/util';
|
|
33
|
-
import { Logger } from '../logging/logger';
|
|
34
|
-
export class ɵWorkbenchView {
|
|
35
|
-
constructor(id, options) {
|
|
36
|
-
this.id = id;
|
|
37
|
-
this._viewEnvironmentInjector = inject(EnvironmentInjector);
|
|
38
|
-
this._workbenchId = inject(WORKBENCH_ID);
|
|
39
|
-
this._workbenchService = inject(ɵWorkbenchService);
|
|
40
|
-
this._workbenchLayoutService = inject(WorkbenchLayoutService);
|
|
41
|
-
this._workbenchRouter = inject(ɵWorkbenchRouter);
|
|
42
|
-
this._childrenOutletContexts = inject(ChildrenOutletContexts);
|
|
43
|
-
this._partRegistry = inject(WORKBENCH_PART_REGISTRY);
|
|
44
|
-
this._viewDragService = inject(ViewDragService);
|
|
45
|
-
this._activationInstantProvider = inject(ActivationInstantProvider);
|
|
46
|
-
this._workbenchDialogRegistry = inject(WorkbenchDialogRegistry);
|
|
47
|
-
this._logger = inject(Logger);
|
|
48
|
-
this._menuItemProviders$ = new BehaviorSubject([]);
|
|
49
|
-
this._adapters = new Map();
|
|
50
|
-
this._title = signal(null);
|
|
51
|
-
this._heading = signal(null);
|
|
52
|
-
this._dirty = signal(false);
|
|
53
|
-
this._closable = signal(true);
|
|
54
|
-
this._closableComputed = computed(() => this._closable() && !this._blockedBy());
|
|
55
|
-
this._blockedBy = toSignal(inject(WorkbenchDialogRegistry).top$({ viewId: this.id }), { requireSync: true });
|
|
56
|
-
this._scrolledIntoView = signal(true);
|
|
57
|
-
this._classBasedCanCloseGuard = this.constructClassBasedCanCloseGuard();
|
|
58
|
-
this.navigationHint = signal(undefined);
|
|
59
|
-
this.navigationData = signal({});
|
|
60
|
-
this.navigationState = signal({});
|
|
61
|
-
this.urlSegments = signal([], { equal: (a, b) => a.join('/') === b.join('/') });
|
|
62
|
-
this.position = computed(() => this.part().viewIds().indexOf(this.id));
|
|
63
|
-
this.first = computed(() => this.position() === 0);
|
|
64
|
-
this.last = computed(() => this.position() === this.part().viewIds().length - 1);
|
|
65
|
-
this.part = signal(null);
|
|
66
|
-
this.active = signal(false);
|
|
67
|
-
this.blockedBy$ = toObservable(this._blockedBy);
|
|
68
|
-
this.classList = new ClassList();
|
|
69
|
-
this.menuItems$ = combineLatest([this._menuItemProviders$, this._workbenchService.viewMenuItemProviders$])
|
|
70
|
-
.pipe(map(([localMenuItemProviders, globalMenuItemProviders]) => localMenuItemProviders.concat(globalMenuItemProviders)), mapArray(menuItemFactoryFn => menuItemFactoryFn(this)), filterArray((menuItem) => menuItem !== null));
|
|
71
|
-
this.portal = this.createPortal(options.component);
|
|
72
|
-
this.touchOnActivate();
|
|
73
|
-
this.installModelUpdater();
|
|
74
|
-
this.onLayoutChange({ layout: this._workbenchRouter.getCurrentNavigationContext().layout });
|
|
75
|
-
}
|
|
76
|
-
createPortal(viewComponent) {
|
|
77
|
-
return new WbComponentPortal(viewComponent, {
|
|
78
|
-
providers: [
|
|
79
|
-
provideViewContext(this),
|
|
80
|
-
// For each view, the workbench registers auxiliary routes of all top-level routes, enabling routing on a per-view basis.
|
|
81
|
-
// But, if the workbench component itself is displayed in a router outlet, view outlets are not top-level outlets.
|
|
82
|
-
// Therefore, we instruct the outlet to act as a top-level outlet to be the target of the registered top-level view routes.
|
|
83
|
-
{ provide: ChildrenOutletContexts, useValue: this._childrenOutletContexts },
|
|
84
|
-
// Prevent injecting this part into the view because the view may be dragged to a different part.
|
|
85
|
-
{ provide: WorkbenchPart, useFactory: () => throwError(`[NullInjectorError] No provider for 'WorkbenchPart'`) },
|
|
86
|
-
{ provide: ɵWorkbenchPart, useFactory: () => throwError(`[NullInjectorError] No provider for 'ɵWorkbenchPart'`) },
|
|
87
|
-
],
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Method invoked when the workbench layout has changed.
|
|
92
|
-
*
|
|
93
|
-
* This method:
|
|
94
|
-
* - is called on every layout change, enabling the update of view properties defined in the layout (navigation hint, navigation data, part, ...).
|
|
95
|
-
* - is called on route activation (after destroyed the previous component (if any), but before constructing the new component).
|
|
96
|
-
*/
|
|
97
|
-
onLayoutChange(change) {
|
|
98
|
-
const { layout, route, previousRoute } = change;
|
|
99
|
-
const mPart = layout.part({ viewId: this.id });
|
|
100
|
-
const mView = layout.view({ viewId: this.id });
|
|
101
|
-
this.part.set(this._partRegistry.get(mPart.id));
|
|
102
|
-
this.active.set(mPart.activeViewId === this.id);
|
|
103
|
-
this.urlSegments.set(layout.urlSegments({ viewId: this.id }));
|
|
104
|
-
this.uid = mView.uid;
|
|
105
|
-
this.alternativeId = mView.alternativeId;
|
|
106
|
-
this.classList.layout = mView.cssClass;
|
|
107
|
-
// Test if a new route has been activated for this view.
|
|
108
|
-
const routeChanged = route && route.routeConfig !== previousRoute?.routeConfig;
|
|
109
|
-
if (routeChanged) {
|
|
110
|
-
this.title = Routing.lookupRouteData(route, WorkbenchRouteData.title) ?? null;
|
|
111
|
-
this.heading = Routing.lookupRouteData(route, WorkbenchRouteData.heading) ?? null;
|
|
112
|
-
this.dirty = false;
|
|
113
|
-
this.classList.route = Routing.lookupRouteData(route, WorkbenchRouteData.cssClass);
|
|
114
|
-
this.classList.application = [];
|
|
115
|
-
this._canCloseFn = undefined;
|
|
116
|
-
}
|
|
117
|
-
// Test if this view was navigated. Navigation does not necessarily cause the route to change.
|
|
118
|
-
const navigationChanged = mView.navigation?.id !== this.navigationId;
|
|
119
|
-
if (navigationChanged) {
|
|
120
|
-
this.navigationId = mView.navigation?.id;
|
|
121
|
-
this.classList.navigation = mView.navigation?.cssClass;
|
|
122
|
-
this.navigationHint.set(mView.navigation?.hint);
|
|
123
|
-
this.navigationData.set(mView.navigation?.data ?? {});
|
|
124
|
-
this.navigationState.set(layout.navigationState({ viewId: this.id }));
|
|
125
|
-
}
|
|
126
|
-
// If this view is inactive, Angular does not check it for changes as it is detached from the Angular component tree.
|
|
127
|
-
// To complete the initialization of the routed component (to ensure that `ngOnInit` is called), we manually trigger change
|
|
128
|
-
// detection. We cannot perform change detection right now because the routed component has not been activated/constructed yet.
|
|
129
|
-
// Use case: Navigating an (existing) inactive view to another route.
|
|
130
|
-
if (!this.active() && this.portal.isConstructed && routeChanged) {
|
|
131
|
-
this._workbenchRouter.getCurrentNavigationContext().registerPostNavigationAction(() => this.portal.componentRef.changeDetectorRef.detectChanges());
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Returns the component of this view. Returns `null` if not navigated the view, or before it was activated for the first time.
|
|
136
|
-
*/
|
|
137
|
-
getComponent() {
|
|
138
|
-
const outlet = Routing.resolveEffectiveOutletContext(this._childrenOutletContexts.getContext(this.id))?.outlet;
|
|
139
|
-
return outlet?.isActivated ? outlet.component : null;
|
|
140
|
-
}
|
|
141
|
-
/** @inheritDoc */
|
|
142
|
-
get title() {
|
|
143
|
-
return this._title;
|
|
144
|
-
}
|
|
145
|
-
/** @inheritDoc */
|
|
146
|
-
set title(title) {
|
|
147
|
-
untracked(() => this._title.set(title));
|
|
148
|
-
}
|
|
149
|
-
/** @inheritDoc */
|
|
150
|
-
get heading() {
|
|
151
|
-
return this._heading;
|
|
152
|
-
}
|
|
153
|
-
/** @inheritDoc */
|
|
154
|
-
set heading(heading) {
|
|
155
|
-
untracked(() => this._heading.set(heading));
|
|
156
|
-
}
|
|
157
|
-
/** @inheritDoc */
|
|
158
|
-
get dirty() {
|
|
159
|
-
return this._dirty;
|
|
160
|
-
}
|
|
161
|
-
/** @inheritDoc */
|
|
162
|
-
set dirty(dirty) {
|
|
163
|
-
untracked(() => this._dirty.set(dirty));
|
|
164
|
-
}
|
|
165
|
-
/** @inheritDoc */
|
|
166
|
-
get scrolledIntoView() {
|
|
167
|
-
return this._scrolledIntoView;
|
|
168
|
-
}
|
|
169
|
-
set scrolledIntoView(scrolledIntoView) {
|
|
170
|
-
this._scrolledIntoView.set(scrolledIntoView);
|
|
171
|
-
}
|
|
172
|
-
/** @inheritDoc */
|
|
173
|
-
set cssClass(cssClass) {
|
|
174
|
-
untracked(() => this.classList.application = cssClass);
|
|
175
|
-
}
|
|
176
|
-
/** @inheritDoc */
|
|
177
|
-
get cssClass() {
|
|
178
|
-
return this.classList.application;
|
|
179
|
-
}
|
|
180
|
-
/** @inheritDoc */
|
|
181
|
-
set closable(closable) {
|
|
182
|
-
untracked(() => this._closable.set(closable));
|
|
183
|
-
}
|
|
184
|
-
/** @inheritDoc */
|
|
185
|
-
get closable() {
|
|
186
|
-
return this._closableComputed;
|
|
187
|
-
}
|
|
188
|
-
/** @inheritDoc */
|
|
189
|
-
async activate(options) {
|
|
190
|
-
assertNotInReactiveContext(this.activate, 'Call WorkbenchView.activate() in a non-reactive (non-tracking) context, such as within the untracked() function.');
|
|
191
|
-
if (this.active() && this.part().active()) {
|
|
192
|
-
return true;
|
|
193
|
-
}
|
|
194
|
-
const currentLayout = this._workbenchLayoutService.layout();
|
|
195
|
-
return this._workbenchRouter.navigate(layout => currentLayout === layout ? layout.activateView(this.id, { activatePart: true }) : null, // cancel navigation if the layout has become stale
|
|
196
|
-
{ skipLocationChange: options?.skipLocationChange });
|
|
197
|
-
}
|
|
198
|
-
get activationInstant() {
|
|
199
|
-
return this._activationInstant;
|
|
200
|
-
}
|
|
201
|
-
/** @inheritDoc */
|
|
202
|
-
close(target) {
|
|
203
|
-
assertNotInReactiveContext(this.close, 'Call WorkbenchView.close() in a non-reactive (non-tracking) context, such as within the untracked() function.');
|
|
204
|
-
switch (target || 'self') {
|
|
205
|
-
case 'self': {
|
|
206
|
-
return this._workbenchService.closeViews(this.id);
|
|
207
|
-
}
|
|
208
|
-
case 'all-views': {
|
|
209
|
-
return this._workbenchService.closeViews(...this.part().viewIds());
|
|
210
|
-
}
|
|
211
|
-
case 'other-views': {
|
|
212
|
-
return this._workbenchService.closeViews(...this.part().viewIds().filter(viewId => viewId !== this.id));
|
|
213
|
-
}
|
|
214
|
-
case 'views-to-the-right': {
|
|
215
|
-
const viewIds = this.part().viewIds();
|
|
216
|
-
return this._workbenchService.closeViews(...viewIds.slice(viewIds.indexOf(this.id) + 1));
|
|
217
|
-
}
|
|
218
|
-
case 'views-to-the-left': {
|
|
219
|
-
const viewIds = this.part().viewIds();
|
|
220
|
-
return this._workbenchService.closeViews(...viewIds.slice(0, viewIds.indexOf(this.id)));
|
|
221
|
-
}
|
|
222
|
-
default: {
|
|
223
|
-
return Promise.resolve(false);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
move(target, options) {
|
|
228
|
-
assertNotInReactiveContext(this.move, 'Call WorkbenchView.move() in a non-reactive (non-tracking) context, such as within the untracked() function.');
|
|
229
|
-
const source = {
|
|
230
|
-
workbenchId: this._workbenchId,
|
|
231
|
-
partId: this.part().id,
|
|
232
|
-
viewId: this.id,
|
|
233
|
-
alternativeViewId: this.alternativeId,
|
|
234
|
-
viewUrlSegments: this.urlSegments(),
|
|
235
|
-
navigationHint: this.navigationHint(),
|
|
236
|
-
navigationData: this.navigationData(),
|
|
237
|
-
classList: this.classList.asMap(),
|
|
238
|
-
};
|
|
239
|
-
if (target === 'new-window') {
|
|
240
|
-
this._viewDragService.dispatchViewMoveEvent({ source, target: { workbenchId: 'new-window' } });
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
this._viewDragService.dispatchViewMoveEvent({
|
|
244
|
-
source,
|
|
245
|
-
target: {
|
|
246
|
-
elementId: target,
|
|
247
|
-
region: options?.region,
|
|
248
|
-
workbenchId: options?.workbenchId ?? this._workbenchId,
|
|
249
|
-
},
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
/** @inheritDoc */
|
|
254
|
-
canClose(canClose) {
|
|
255
|
-
const canCloseFn = this._canCloseFn = async () => {
|
|
256
|
-
try {
|
|
257
|
-
const close = runInInjectionContext(this.portal.componentRef.injector, canClose);
|
|
258
|
-
return await firstValueFrom(Observables.coerce(close), { defaultValue: true });
|
|
259
|
-
}
|
|
260
|
-
catch (error) {
|
|
261
|
-
this._logger.error(`Unhandled error while invoking 'CanClose' function of view '${this.id}'.`, error);
|
|
262
|
-
return true;
|
|
263
|
-
}
|
|
264
|
-
};
|
|
265
|
-
return {
|
|
266
|
-
dispose: () => {
|
|
267
|
-
if (canCloseFn === this._canCloseFn) {
|
|
268
|
-
this._canCloseFn = undefined;
|
|
269
|
-
}
|
|
270
|
-
},
|
|
271
|
-
};
|
|
272
|
-
}
|
|
273
|
-
/**
|
|
274
|
-
* Reference to the `CanClose` guard registered on this view, if any.
|
|
275
|
-
*/
|
|
276
|
-
get canCloseGuard() {
|
|
277
|
-
return this._canCloseFn ?? (typeof this.getComponent()?.canClose === 'function' ? this._classBasedCanCloseGuard : undefined);
|
|
278
|
-
}
|
|
279
|
-
/** @inheritDoc */
|
|
280
|
-
registerMenuItem(menuItem) {
|
|
281
|
-
assertNotInReactiveContext(this.registerMenuItem, 'Call WorkbenchView.registerMenuItem() in a non-reactive (non-tracking) context, such as within the untracked() function.');
|
|
282
|
-
const factoryFn = () => menuItem;
|
|
283
|
-
this._menuItemProviders$.next(this._menuItemProviders$.value.concat(factoryFn));
|
|
284
|
-
return {
|
|
285
|
-
dispose: () => {
|
|
286
|
-
this._menuItemProviders$.next(this._menuItemProviders$.value.filter(it => it !== factoryFn));
|
|
287
|
-
},
|
|
288
|
-
};
|
|
289
|
-
}
|
|
290
|
-
/**
|
|
291
|
-
* Reference to the handle's injector. The injector will be destroyed when closing the view.
|
|
292
|
-
*/
|
|
293
|
-
get injector() {
|
|
294
|
-
return this._viewEnvironmentInjector;
|
|
295
|
-
}
|
|
296
|
-
/**
|
|
297
|
-
* Registers an adapter for this view, replacing any previously registered adapter of the same type.
|
|
298
|
-
*
|
|
299
|
-
* Adapters enable loosely coupled extension of an object, allowing one object to be adapted to another.
|
|
300
|
-
*/
|
|
301
|
-
registerAdapter(adapterType, object) {
|
|
302
|
-
this._adapters.set(adapterType, object);
|
|
303
|
-
}
|
|
304
|
-
/**
|
|
305
|
-
* Unregisters the given adapter. Has no effect if not registered.
|
|
306
|
-
*/
|
|
307
|
-
unregisterAdapter(adapterType) {
|
|
308
|
-
this._adapters.delete(adapterType);
|
|
309
|
-
}
|
|
310
|
-
/**
|
|
311
|
-
* Adapts this object to the specified type. Returns `null` if no such object can be found.
|
|
312
|
-
*/
|
|
313
|
-
adapt(adapterType) {
|
|
314
|
-
const adapter = this._adapters.get(adapterType);
|
|
315
|
-
return adapter ? adapter : null;
|
|
316
|
-
}
|
|
317
|
-
/** @inheritDoc */
|
|
318
|
-
get destroyed() {
|
|
319
|
-
return this.portal.isDestroyed;
|
|
320
|
-
}
|
|
321
|
-
/**
|
|
322
|
-
* Updates the activation instant when this view is activated.
|
|
323
|
-
*/
|
|
324
|
-
touchOnActivate() {
|
|
325
|
-
effect(() => {
|
|
326
|
-
if (this.active()) {
|
|
327
|
-
this._activationInstant = this._activationInstantProvider.now();
|
|
328
|
-
}
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
/**
|
|
332
|
-
* Provides legacy support for deprecated class-based {@link CanClose} guard.
|
|
333
|
-
*
|
|
334
|
-
* @deprecated since version 18.0.0-beta.9. No longer needed with the removal of class-based {@link CanClose} guard.
|
|
335
|
-
*/
|
|
336
|
-
constructClassBasedCanCloseGuard() {
|
|
337
|
-
return async () => {
|
|
338
|
-
try {
|
|
339
|
-
const close = runInInjectionContext(this.portal.componentRef.injector, () => this.getComponent().canClose());
|
|
340
|
-
return await firstValueFrom(Observables.coerce(close), { defaultValue: true });
|
|
341
|
-
}
|
|
342
|
-
catch (error) {
|
|
343
|
-
this._logger.error(`Unhandled error while invoking 'CanClose' guard of view '${this.id}'.`, error);
|
|
344
|
-
return true;
|
|
345
|
-
}
|
|
346
|
-
};
|
|
347
|
-
}
|
|
348
|
-
/**
|
|
349
|
-
* Sets up automatic synchronization of {@link WorkbenchView} on every layout change.
|
|
350
|
-
*
|
|
351
|
-
* If the operation is cancelled (e.g., due to a navigation failure), it reverts the changes.
|
|
352
|
-
*/
|
|
353
|
-
installModelUpdater() {
|
|
354
|
-
Routing.activatedRoute$(this.id, { emitOn: 'always' })
|
|
355
|
-
.pipe(takeUntilDestroyed())
|
|
356
|
-
.subscribe(([previousRoute, route]) => {
|
|
357
|
-
const navigationContext = this._workbenchRouter.getCurrentNavigationContext();
|
|
358
|
-
const { layout, previousLayout, layoutDiff } = navigationContext;
|
|
359
|
-
if (layoutDiff.removedViews.includes(this.id)) {
|
|
360
|
-
return;
|
|
361
|
-
}
|
|
362
|
-
this.onLayoutChange({ layout, route, previousRoute });
|
|
363
|
-
// Revert change in case the navigation fails.
|
|
364
|
-
if (previousLayout?.hasView(this.id)) {
|
|
365
|
-
navigationContext.registerUndoAction(() => this.onLayoutChange({ layout: previousLayout, route: previousRoute, previousRoute: route }));
|
|
366
|
-
}
|
|
367
|
-
});
|
|
368
|
-
}
|
|
369
|
-
destroy() {
|
|
370
|
-
this._viewEnvironmentInjector.destroy();
|
|
371
|
-
this._workbenchDialogRegistry.dialogs({ viewId: this.id }).forEach(dialog => dialog.destroy());
|
|
372
|
-
this.portal.destroy();
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiybV3b3JrYmVuY2gtdmlldy5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL3ZpZXcvybV3b3JrYmVuY2gtdmlldy5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBYSxNQUFNLE1BQU0sQ0FBQztBQUNoRixPQUFPLEVBQXlCLHNCQUFzQixFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFDM0YsT0FBTyxFQUFDLGVBQWUsRUFBc0IsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkMsT0FBTyxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUUvRCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFHdEQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sRUFBZSwwQkFBMEIsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sRUFBWSxxQkFBcUIsRUFBVSxNQUFNLEVBQVEsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hMLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUM3RCxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RSxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RSxPQUFPLEVBQUMsc0JBQXNCLEVBQUMs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QixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDN0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN4QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjIgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBmaXJzdFZhbHVlRnJvbSwgT2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlU25hcHNob3QsIENoaWxkcmVuT3V0bGV0Q29udGV4dHMsIFVybFNlZ21lbnR9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1ZpZXdEcmFnU2VydmljZSwgVmlld01vdmVFdmVudFNvdXJjZX0gZnJvbSAnLi4vdmlldy1kbmQvdmlldy1kcmFnLnNlcnZpY2UnO1xuaW1wb3J0IHttYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7ZmlsdGVyQXJyYXksIG1hcEFycmF5fSBmcm9tICdAc2Npb24vdG9vbGtpdC9vcGVyYXRvcnMnO1xuaW1wb3J0IHtEaXNwb3NhYmxlfSBmcm9tICcuLi9jb21tb24vZGlzcG9zYWJsZSc7XG5pbXBvcnQge3Rocm93RXJyb3J9IGZyb20gJy4uL2NvbW1vbi90aHJvdy1lcnJvci51dGlsJztcbmltcG9ydCB7Q2FuQ2xvc2UsIENhbkNsb3NlRm4sIENhbkNsb3NlUmVmLCBXb3JrYmVuY2hNZW51SXRlbSwgV29ya2JlbmNoTWVudUl0ZW1GYWN0b3J5Rm59IGZyb20gJy4uL3dvcmtiZW5jaC5tb2RlbCc7XG5pbXBvcnQge1ZpZXdJZCwgV29ya2JlbmNoVmlld30gZnJvbSAnLi93b3JrYmVuY2gtdmlldy5tb2RlbCc7XG5pbXBvcnQge1dvcmtiZW5jaFBhcnR9IGZyb20gJy4uL3BhcnQvd29ya2JlbmNoLXBhcnQubW9kZWwnO1xuaW1wb3J0IHvJtVdvcmtiZW5jaFNlcnZpY2V9IGZyb20gJy4uL8m1d29ya2JlbmNoLnNlcnZpY2UnO1xuaW1wb3J0IHtDb21wb25lbnRUeXBlfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7V2JDb21wb25lbnRQb3J0YWx9IGZyb20gJy4uL3BvcnRhbC93Yi1jb21wb25lbnQtcG9ydGFsJztcbmltcG9ydCB7QWJzdHJhY3RUeXBlLCBhc3NlcnROb3RJblJlYWN0aXZlQ29udGV4dCwgY29tcHV0ZWQsIGVmZmVjdCwgRW52aXJvbm1lbnRJbmplY3RvciwgaW5qZWN0LCBJbmplY3RvciwgcnVuSW5JbmplY3Rpb25Db250ZXh0LCBTaWduYWwsIHNpZ25hbCwgVHlwZSwgdW50cmFja2VkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7ybVXb3JrYmVuY2hQYXJ0fSBmcm9tICcuLi9wYXJ0L8m1d29ya2JlbmNoLXBhcnQubW9kZWwnO1xuaW1wb3J0IHtBY3RpdmF0aW9uSW5zdGFudFByb3ZpZGVyfSBmcm9tICcuLi9hY3RpdmF0aW9uLWluc3RhbnQucHJvdmlkZXInO1xuaW1wb3J0IHtXT1JLQkVOQ0hfUEFSVF9SRUdJU1RSWX0gZnJvbSAnLi4vcGFydC93b3JrYmVuY2gtcGFydC5yZWdpc3RyeSc7XG5pbXBvcnQge1dvcmtiZW5jaExheW91dFNlcnZpY2V9IGZyb20gJy4uL2xheW91dC93b3JrYmVuY2gtbGF5b3V0LnNlcnZpY2UnO1xuaW1wb3J0IHtXb3JrYmVuY2hEaWFsb2dSZWdpc3RyeX0gZnJvbSAnLi4vZGlhbG9nL3dvcmtiZW5jaC1kaWFsb2cucmVnaXN0cnknO1xuaW1wb3J0IHt0YWtlVW50aWxEZXN0cm95ZWQsIHRvT2JzZXJ2YWJsZSwgdG9TaWduYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7cHJvdmlkZVZpZXdDb250ZXh0fSBmcm9tICcuL3ZpZXctY29udGV4dC1wcm92aWRlcic7XG5pbXBvcnQge8m1V29ya2JlbmNoRGlhbG9nfSBmcm9tICcuLi9kaWFsb2cvybV3b3JrYmVuY2gtZGlhbG9nJztcbmltcG9ydCB7QmxvY2thYmxlfSBmcm9tICcuLi9nbGFzcy1wYW5lL2Jsb2NrYWJsZSc7XG5pbXBvcnQge1dPUktCRU5DSF9JRH0gZnJvbSAnLi4vd29ya2JlbmNoLWlkJztcbmltcG9ydCB7Q2xhc3NMaXN0fSBmcm9tICcuLi9jb21tb24vY2xhc3MtbGlzdCc7XG5pbXBvcnQge05hdmlnYXRpb25EYXRhLCBOYXZpZ2F0aW9uU3RhdGV9IGZyb20gJy4uL3JvdXRpbmcvcm91dGluZy5tb2RlbCc7XG5pbXBvcnQge1JvdXRpbmd9IGZyb20gJy4uL3JvdXRpbmcvcm91dGluZy51dGlsJztcbmltcG9ydCB7V29ya2JlbmNoUm91dGVEYXRhfSBmcm9tICcuLi9yb3V0aW5nL3dvcmtiZW5jaC1yb3V0ZS1kYXRhJztcbmltcG9ydCB7ybVXb3JrYmVuY2hSb3V0ZXJ9IGZyb20gJy4uL3JvdXRpbmcvybV3b3JrYmVuY2gtcm91dGVyLnNlcnZpY2UnO1xuaW1wb3J0IHvJtVdvcmtiZW5jaExheW91dH0gZnJvbSAnLi4vbGF5b3V0L8m1d29ya2JlbmNoLWxheW91dCc7XG5pbXBvcnQge09ic2VydmFibGVzfSBmcm9tICdAc2Npb24vdG9vbGtpdC91dGlsJztcbmltcG9ydCB7TG9nZ2VyfSBmcm9tICcuLi9sb2dnaW5nL2xvZ2dlcic7XG5cbmV4cG9ydCBjbGFzcyDJtVdvcmtiZW5jaFZpZXcgaW1wbGVtZW50cyBXb3JrYmVuY2hWaWV3LCBCbG9ja2FibGUge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3ZpZXdFbnZpcm9ubWVudEluamVjdG9yID0gaW5qZWN0KEVudmlyb25tZW50SW5qZWN0b3IpO1xuICBwcml2YXRlIHJlYWRvbmx5IF93b3JrYmVuY2hJZCA9IGluamVjdChXT1JLQkVOQ0hfSUQpO1xuICBwcml2YXRlIHJlYWRvbmx5IF93b3JrYmVuY2hTZXJ2aWNlID0gaW5qZWN0KMm1V29ya2JlbmNoU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3dvcmtiZW5jaExheW91dFNlcnZpY2UgPSBpbmplY3QoV29ya2JlbmNoTGF5b3V0U2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3dvcmtiZW5jaFJvdXRlciA9IGluamVjdCjJtVdvcmtiZW5jaFJvdXRlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NoaWxkcmVuT3V0bGV0Q29udGV4dHMgPSBpbmplY3QoQ2hpbGRyZW5PdXRsZXRDb250ZXh0cyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3BhcnRSZWdpc3RyeSA9IGluamVjdChXT1JLQkVOQ0hfUEFSVF9SRUdJU1RSWSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3ZpZXdEcmFnU2VydmljZSA9IGluamVjdChWaWV3RHJhZ1NlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hY3RpdmF0aW9uSW5zdGFudFByb3ZpZGVyID0gaW5qZWN0KEFjdGl2YXRpb25JbnN0YW50UHJvdmlkZXIpO1xuICBwcml2YXRlIHJlYWRvbmx5IF93b3JrYmVuY2hEaWFsb2dSZWdpc3RyeSA9IGluamVjdChXb3JrYmVuY2hEaWFsb2dSZWdpc3RyeSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlciA9IGluamVjdChMb2dnZXIpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX21lbnVJdGVtUHJvdmlkZXJzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8V29ya2JlbmNoTWVudUl0ZW1GYWN0b3J5Rm5bXT4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hZGFwdGVycyA9IG5ldyBNYXA8VHlwZTx1bmtub3duPiB8IEFic3RyYWN0VHlwZTx1bmtub3duPiwgdW5rbm93bj4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF90aXRsZSA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaGVhZGluZyA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGlydHkgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jbG9zYWJsZSA9IHNpZ25hbCh0cnVlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfY2xvc2FibGVDb21wdXRlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2Nsb3NhYmxlKCkgJiYgIXRoaXMuX2Jsb2NrZWRCeSgpKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfYmxvY2tlZEJ5ID0gdG9TaWduYWwoaW5qZWN0KFdvcmtiZW5jaERpYWxvZ1JlZ2lzdHJ5KS50b3AkKHt2aWV3SWQ6IHRoaXMuaWR9KSwge3JlcXVpcmVTeW5jOiB0cnVlfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Njcm9sbGVkSW50b1ZpZXcgPSBzaWduYWwodHJ1ZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NsYXNzQmFzZWRDYW5DbG9zZUd1YXJkID0gdGhpcy5jb25zdHJ1Y3RDbGFzc0Jhc2VkQ2FuQ2xvc2VHdWFyZCgpO1xuXG4gIHByaXZhdGUgX2FjdGl2YXRpb25JbnN0YW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2NhbkNsb3NlRm46ICgoKSA9PiBQcm9taXNlPGJvb2xlYW4+KSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSWRlbnRpZmllcyB0aGUge0BsaW5rIE1WaWV3fS5cbiAgICpcbiAgICogQSB2aWV3IGhhbmRsZSByZXByZXNlbnRzIGEgdmlldyB3aXRoIGEgcGFydGljdWxhciB2aWV3IGlkLiBEaWZmZXJlbnQge0BsaW5rIE1WaWV3fXMgb2YgdGhlIHNhbWUgdmlldyBpZCBtYXkgc2hhcmUgdGhlIGhhbmRsZS5cbiAgICogRm9yIGV4YW1wbGUsIHdoZW4gY2hhbmdpbmcgdGhlIGxheW91dCwgdmlldyBoYW5kbGVzIGZvciB2aWV3cyB3aXRoIHRoZSBzYW1lIHZpZXcgaWQgd2lsbCBiZSByZXVzZWQsIHJlZ2FyZGxlc3Mgb2ZcbiAgICogd2hldGhlciB0aGV5IGhhdmUgdGhlIHNhbWUge0BsaW5rIE1WaWV3fS5cbiAgICovXG4gIHB1YmxpYyB1aWQhOiBzdHJpbmc7XG4gIHB1YmxpYyBhbHRlcm5hdGl2ZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBuYXZpZ2F0aW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHVibGljIG5hdmlnYXRpb25IaW50ID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHVibGljIG5hdmlnYXRpb25EYXRhID0gc2lnbmFsPE5hdmlnYXRpb25EYXRhPih7fSk7XG4gIHB1YmxpYyBuYXZpZ2F0aW9uU3RhdGUgPSBzaWduYWw8TmF2aWdhdGlvblN0YXRlPih7fSk7XG4gIHB1YmxpYyB1cmxTZWdtZW50cyA9IHNpZ25hbDxVcmxTZWdtZW50W10+KFtdLCB7ZXF1YWw6IChhLCBiKSA9PiBhLmpvaW4oJy8nKSA9PT0gYi5qb2luKCcvJyl9KTtcbiAgcHVibGljIHBvc2l0aW9uID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5wYXJ0KCkudmlld0lkcygpLmluZGV4T2YodGhpcy5pZCkpO1xuICBwdWJsaWMgZmlyc3QgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnBvc2l0aW9uKCkgPT09IDApO1xuICBwdWJsaWMgbGFzdCA9IGNvbXB1dGVkKCgpID0+IHRoaXMucG9zaXRpb24oKSA9PT0gdGhpcy5wYXJ0KCkudmlld0lkcygpLmxlbmd0aCAtIDEpO1xuXG4gIHB1YmxpYyByZWFkb25seSBwYXJ0ID0gc2lnbmFsPMm1V29ya2JlbmNoUGFydD4obnVsbCEpO1xuICBwdWJsaWMgcmVhZG9ubHkgYWN0aXZlID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIHJlYWRvbmx5IG1lbnVJdGVtcyQ6IE9ic2VydmFibGU8V29ya2JlbmNoTWVudUl0ZW1bXT47XG4gIHB1YmxpYyByZWFkb25seSBibG9ja2VkQnkkID0gdG9PYnNlcnZhYmxlPMm1V29ya2JlbmNoRGlhbG9nIHwgbnVsbD4odGhpcy5fYmxvY2tlZEJ5KTtcbiAgcHVibGljIHJlYWRvbmx5IHBvcnRhbDogV2JDb21wb25lbnRQb3J0YWw7XG4gIHB1YmxpYyByZWFkb25seSBjbGFzc0xpc3QgPSBuZXcgQ2xhc3NMaXN0KCk7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGlkOiBWaWV3SWQsIG9wdGlvbnM6IHtjb21wb25lbnQ6IENvbXBvbmVudFR5cGU8Vmlld0NvbXBvbmVudD59KSB7XG4gICAgdGhpcy5tZW51SXRlbXMkID0gY29tYmluZUxhdGVzdChbdGhpcy5fbWVudUl0ZW1Qcm92aWRlcnMkLCB0aGlzLl93b3JrYmVuY2hTZXJ2aWNlLnZpZXdNZW51SXRlbVByb3ZpZGVycyRdKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoW2xvY2FsTWVudUl0ZW1Qcm92aWRlcnMsIGdsb2JhbE1lbnVJdGVtUHJvdmlkZXJzXSkgPT4gbG9jYWxNZW51SXRlbVByb3ZpZGVycy5jb25jYXQoZ2xvYmFsTWVudUl0ZW1Qcm92aWRlcnMpKSxcbiAgICAgICAgbWFwQXJyYXkobWVudUl0ZW1GYWN0b3J5Rm4gPT4gbWVudUl0ZW1GYWN0b3J5Rm4odGhpcykpLFxuICAgICAgICBmaWx0ZXJBcnJheSgobWVudUl0ZW06IFdvcmtiZW5jaE1lbnVJdGVtIHwgbnVsbCk6IG1lbnVJdGVtIGlzIFdvcmtiZW5jaE1lbnVJdGVtID0+IG1lbnVJdGVtICE9PSBudWxsKSxcbiAgICAgICk7XG5cbiAgICB0aGlzLnBvcnRhbCA9IHRoaXMuY3JlYXRlUG9ydGFsKG9wdGlvbnMuY29tcG9uZW50KTtcbiAgICB0aGlzLnRvdWNoT25BY3RpdmF0ZSgpO1xuICAgIHRoaXMuaW5zdGFsbE1vZGVsVXBkYXRlcigpO1xuICAgIHRoaXMub25MYXlvdXRDaGFuZ2Uoe2xheW91dDogdGhpcy5fd29ya2JlbmNoUm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCgpLmxheW91dH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVQb3J0YWwodmlld0NvbXBvbmVudDogQ29tcG9uZW50VHlwZTxWaWV3Q29tcG9uZW50Pik6IFdiQ29tcG9uZW50UG9ydGFsIHtcbiAgICByZXR1cm4gbmV3IFdiQ29tcG9uZW50UG9ydGFsKHZpZXdDb21wb25lbnQsIHtcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICBwcm92aWRlVmlld0NvbnRleHQodGhpcyksXG4gICAgICAgIC8vIEZvciBlYWNoIHZpZXcsIHRoZSB3b3JrYmVuY2ggcmVnaXN0ZXJzIGF1eGlsaWFyeSByb3V0ZXMgb2YgYWxsIHRvcC1sZXZlbCByb3V0ZXMsIGVuYWJsaW5nIHJvdXRpbmcgb24gYSBwZXItdmlldyBiYXNpcy5cbiAgICAgICAgLy8gQnV0LCBpZiB0aGUgd29ya2JlbmNoIGNvbXBvbmVudCBpdHNlbGYgaXMgZGlzcGxheWVkIGluIGEgcm91dGVyIG91dGxldCwgdmlldyBvdXRsZXRzIGFyZSBub3QgdG9wLWxldmVsIG91dGxldHMuXG4gICAgICAgIC8vIFRoZXJlZm9yZSwgd2UgaW5zdHJ1Y3QgdGhlIG91dGxldCB0byBhY3QgYXMgYSB0b3AtbGV2ZWwgb3V0bGV0IHRvIGJlIHRoZSB0YXJnZXQgb2YgdGhlIHJlZ2lzdGVyZWQgdG9wLWxldmVsIHZpZXcgcm91dGVzLlxuICAgICAgICB7cHJvdmlkZTogQ2hpbGRyZW5PdXRsZXRDb250ZXh0cywgdXNlVmFsdWU6IHRoaXMuX2NoaWxkcmVuT3V0bGV0Q29udGV4dHN9LFxuICAgICAgICAvLyBQcmV2ZW50IGluamVjdGluZyB0aGlzIHBhcnQgaW50byB0aGUgdmlldyBiZWNhdXNlIHRoZSB2aWV3IG1heSBiZSBkcmFnZ2VkIHRvIGEgZGlmZmVyZW50IHBhcnQuXG4gICAgICAgIHtwcm92aWRlOiBXb3JrYmVuY2hQYXJ0LCB1c2VGYWN0b3J5OiAoKSA9PiB0aHJvd0Vycm9yKGBbTnVsbEluamVjdG9yRXJyb3JdIE5vIHByb3ZpZGVyIGZvciAnV29ya2JlbmNoUGFydCdgKX0sXG4gICAgICAgIHtwcm92aWRlOiDJtVdvcmtiZW5jaFBhcnQsIHVzZUZhY3Rvcnk6ICgpID0+IHRocm93RXJyb3IoYFtOdWxsSW5qZWN0b3JFcnJvcl0gTm8gcHJvdmlkZXIgZm9yICfJtVdvcmtiZW5jaFBhcnQnYCl9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgaW52b2tlZCB3aGVuIHRoZSB3b3JrYmVuY2ggbGF5b3V0IGhhcyBjaGFuZ2VkLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZDpcbiAgICogLSBpcyBjYWxsZWQgb24gZXZlcnkgbGF5b3V0IGNoYW5nZSwgZW5hYmxpbmcgdGhlIHVwZGF0ZSBvZiB2aWV3IHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGUgbGF5b3V0IChuYXZpZ2F0aW9uIGhpbnQsIG5hdmlnYXRpb24gZGF0YSwgcGFydCwgLi4uKS5cbiAgICogLSBpcyBjYWxsZWQgb24gcm91dGUgYWN0aXZhdGlvbiAoYWZ0ZXIgZGVzdHJveWVkIHRoZSBwcmV2aW91cyBjb21wb25lbnQgKGlmIGFueSksIGJ1dCBiZWZvcmUgY29uc3RydWN0aW5nIHRoZSBuZXcgY29tcG9uZW50KS5cbiAgICovXG4gIHByaXZhdGUgb25MYXlvdXRDaGFuZ2UoY2hhbmdlOiB7bGF5b3V0OiDJtVdvcmtiZW5jaExheW91dDsgcm91dGU/OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90OyBwcmV2aW91c1JvdXRlPzogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB8IG51bGx9KTogdm9pZCB7XG4gICAgY29uc3Qge2xheW91dCwgcm91dGUsIHByZXZpb3VzUm91dGV9ID0gY2hhbmdlO1xuXG4gICAgY29uc3QgbVBhcnQgPSBsYXlvdXQucGFydCh7dmlld0lkOiB0aGlzLmlkfSk7XG4gICAgY29uc3QgbVZpZXcgPSBsYXlvdXQudmlldyh7dmlld0lkOiB0aGlzLmlkfSk7XG5cbiAgICB0aGlzLnBhcnQuc2V0KHRoaXMuX3BhcnRSZWdpc3RyeS5nZXQobVBhcnQuaWQpKTtcbiAgICB0aGlzLmFjdGl2ZS5zZXQobVBhcnQuYWN0aXZlVmlld0lkID09PSB0aGlzLmlkKTtcbiAgICB0aGlzLnVybFNlZ21lbnRzLnNldChsYXlvdXQudXJsU2VnbWVudHMoe3ZpZXdJZDogdGhpcy5pZH0pKTtcblxuICAgIHRoaXMudWlkID0gbVZpZXcudWlkO1xuICAgIHRoaXMuYWx0ZXJuYXRpdmVJZCA9IG1WaWV3LmFsdGVybmF0aXZlSWQ7XG4gICAgdGhpcy5jbGFzc0xpc3QubGF5b3V0ID0gbVZpZXcuY3NzQ2xhc3M7XG5cbiAgICAvLyBUZXN0IGlmIGEgbmV3IHJvdXRlIGhhcyBiZWVuIGFjdGl2YXRlZCBmb3IgdGhpcyB2aWV3LlxuICAgIGNvbnN0IHJvdXRlQ2hhbmdlZCA9IHJvdXRlICYmIHJvdXRlLnJvdXRlQ29uZmlnICE9PSBwcmV2aW91c1JvdXRlPy5yb3V0ZUNvbmZpZztcbiAgICBpZiAocm91dGVDaGFuZ2VkKSB7XG4gICAgICB0aGlzLnRpdGxlID0gUm91dGluZy5sb29rdXBSb3V0ZURhdGEocm91dGUsIFdvcmtiZW5jaFJvdXRlRGF0YS50aXRsZSkgPz8gbnVsbDtcbiAgICAgIHRoaXMuaGVhZGluZyA9IFJvdXRpbmcubG9va3VwUm91dGVEYXRhKHJvdXRlLCBXb3JrYmVuY2hSb3V0ZURhdGEuaGVhZGluZykgPz8gbnVsbDtcbiAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LnJvdXRlID0gUm91dGluZy5sb29rdXBSb3V0ZURhdGEocm91dGUsIFdvcmtiZW5jaFJvdXRlRGF0YS5jc3NDbGFzcyk7XG4gICAgICB0aGlzLmNsYXNzTGlzdC5hcHBsaWNhdGlvbiA9IFtdO1xuICAgICAgdGhpcy5fY2FuQ2xvc2VGbiA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBUZXN0IGlmIHRoaXMgdmlldyB3YXMgbmF2aWdhdGVkLiBOYXZpZ2F0aW9uIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGNhdXNlIHRoZSByb3V0ZSB0byBjaGFuZ2UuXG4gICAgY29uc3QgbmF2aWdhdGlvbkNoYW5nZWQgPSBtVmlldy5uYXZpZ2F0aW9uPy5pZCAhPT0gdGhpcy5uYXZpZ2F0aW9uSWQ7XG4gICAgaWYgKG5hdmlnYXRpb25DaGFuZ2VkKSB7XG4gICAgICB0aGlzLm5hdmlnYXRpb25JZCA9IG1WaWV3Lm5hdmlnYXRpb24/LmlkO1xuICAgICAgdGhpcy5jbGFzc0xpc3QubmF2aWdhdGlvbiA9IG1WaWV3Lm5hdmlnYXRpb24/LmNzc0NsYXNzO1xuICAgICAgdGhpcy5uYXZpZ2F0aW9uSGludC5zZXQobVZpZXcubmF2aWdhdGlvbj8uaGludCk7XG4gICAgICB0aGlzLm5hdmlnYXRpb25EYXRhLnNldChtVmlldy5uYXZpZ2F0aW9uPy5kYXRhID8/IHt9KTtcbiAgICAgIHRoaXMubmF2aWdhdGlvblN0YXRlLnNldChsYXlvdXQubmF2aWdhdGlvblN0YXRlKHt2aWV3SWQ6IHRoaXMuaWR9KSk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhpcyB2aWV3IGlzIGluYWN0aXZlLCBBbmd1bGFyIGRvZXMgbm90IGNoZWNrIGl0IGZvciBjaGFuZ2VzIGFzIGl0IGlzIGRldGFjaGVkIGZyb20gdGhlIEFuZ3VsYXIgY29tcG9uZW50IHRyZWUuXG4gICAgLy8gVG8gY29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSByb3V0ZWQgY29tcG9uZW50ICh0byBlbnN1cmUgdGhhdCBgbmdPbkluaXRgIGlzIGNhbGxlZCksIHdlIG1hbnVhbGx5IHRyaWdnZXIgY2hhbmdlXG4gICAgLy8gZGV0ZWN0aW9uLiBXZSBjYW5ub3QgcGVyZm9ybSBjaGFuZ2UgZGV0ZWN0aW9uIHJpZ2h0IG5vdyBiZWNhdXNlIHRoZSByb3V0ZWQgY29tcG9uZW50IGhhcyBub3QgYmVlbiBhY3RpdmF0ZWQvY29uc3RydWN0ZWQgeWV0LlxuICAgIC8vIFVzZSBjYXNlOiBOYXZpZ2F0aW5nIGFuIChleGlzdGluZykgaW5hY3RpdmUgdmlldyB0byBhbm90aGVyIHJvdXRlLlxuICAgIGlmICghdGhpcy5hY3RpdmUoKSAmJiB0aGlzLnBvcnRhbC5pc0NvbnN0cnVjdGVkICYmIHJvdXRlQ2hhbmdlZCkge1xuICAgICAgdGhpcy5fd29ya2JlbmNoUm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCgpLnJlZ2lzdGVyUG9zdE5hdmlnYXRpb25BY3Rpb24oKCkgPT4gdGhpcy5wb3J0YWwuY29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBvZiB0aGlzIHZpZXcuIFJldHVybnMgYG51bGxgIGlmIG5vdCBuYXZpZ2F0ZWQgdGhlIHZpZXcsIG9yIGJlZm9yZSBpdCB3YXMgYWN0aXZhdGVkIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICovXG4gIHB1YmxpYyBnZXRDb21wb25lbnQ8VCA9IHVua25vd24+KCk6IFQgfCBudWxsIHtcbiAgICBjb25zdCBvdXRsZXQgPSBSb3V0aW5nLnJlc29sdmVFZmZlY3RpdmVPdXRsZXRDb250ZXh0KHRoaXMuX2NoaWxkcmVuT3V0bGV0Q29udGV4dHMuZ2V0Q29udGV4dCh0aGlzLmlkKSk/Lm91dGxldDtcbiAgICByZXR1cm4gb3V0bGV0Py5pc0FjdGl2YXRlZCA/IG91dGxldC5jb21wb25lbnQgYXMgVCA6IG51bGw7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHVibGljIGdldCB0aXRsZSgpOiBTaWduYWw8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLl90aXRsZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgc2V0IHRpdGxlKHRpdGxlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdW50cmFja2VkKCgpID0+IHRoaXMuX3RpdGxlLnNldCh0aXRsZSkpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBnZXQgaGVhZGluZygpOiBTaWduYWw8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLl9oZWFkaW5nO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBzZXQgaGVhZGluZyhoZWFkaW5nOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdW50cmFja2VkKCgpID0+IHRoaXMuX2hlYWRpbmcuc2V0KGhlYWRpbmcpKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgZ2V0IGRpcnR5KCk6IFNpZ25hbDxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RpcnR5O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBzZXQgZGlydHkoZGlydHk6IGJvb2xlYW4pIHtcbiAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5fZGlydHkuc2V0KGRpcnR5KSk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHVibGljIGdldCBzY3JvbGxlZEludG9WaWV3KCk6IFNpZ25hbDxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX3Njcm9sbGVkSW50b1ZpZXc7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNjcm9sbGVkSW50b1ZpZXcoc2Nyb2xsZWRJbnRvVmlldzogYm9vbGVhbikge1xuICAgIHRoaXMuX3Njcm9sbGVkSW50b1ZpZXcuc2V0KHNjcm9sbGVkSW50b1ZpZXcpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBzZXQgY3NzQ2xhc3MoY3NzQ2xhc3M6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdW50cmFja2VkKCgpID0+IHRoaXMuY2xhc3NMaXN0LmFwcGxpY2F0aW9uID0gY3NzQ2xhc3MpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBnZXQgY3NzQ2xhc3MoKTogU2lnbmFsPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3NMaXN0LmFwcGxpY2F0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBzZXQgY2xvc2FibGUoY2xvc2FibGU6IGJvb2xlYW4pIHtcbiAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5fY2xvc2FibGUuc2V0KGNsb3NhYmxlKSk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHVibGljIGdldCBjbG9zYWJsZSgpOiBTaWduYWw8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9jbG9zYWJsZUNvbXB1dGVkO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBhc3luYyBhY3RpdmF0ZShvcHRpb25zPzoge3NraXBMb2NhdGlvbkNoYW5nZT86IGJvb2xlYW59KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgYXNzZXJ0Tm90SW5SZWFjdGl2ZUNvbnRleHQodGhpcy5hY3RpdmF0ZSwgJ0NhbGwgV29ya2JlbmNoVmlldy5hY3RpdmF0ZSgpIGluIGEgbm9uLXJlYWN0aXZlIChub24tdHJhY2tpbmcpIGNvbnRleHQsIHN1Y2ggYXMgd2l0aGluIHRoZSB1bnRyYWNrZWQoKSBmdW5jdGlvbi4nKTtcbiAgICBpZiAodGhpcy5hY3RpdmUoKSAmJiB0aGlzLnBhcnQoKS5hY3RpdmUoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudExheW91dCA9IHRoaXMuX3dvcmtiZW5jaExheW91dFNlcnZpY2UubGF5b3V0KCk7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtiZW5jaFJvdXRlci5uYXZpZ2F0ZShcbiAgICAgIGxheW91dCA9PiBjdXJyZW50TGF5b3V0ID09PSBsYXlvdXQgPyBsYXlvdXQuYWN0aXZhdGVWaWV3KHRoaXMuaWQsIHthY3RpdmF0ZVBhcnQ6IHRydWV9KSA6IG51bGwsIC8vIGNhbmNlbCBuYXZpZ2F0aW9uIGlmIHRoZSBsYXlvdXQgaGFzIGJlY29tZSBzdGFsZVxuICAgICAge3NraXBMb2NhdGlvbkNoYW5nZTogb3B0aW9ucz8uc2tpcExvY2F0aW9uQ2hhbmdlfSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmF0aW9uSW5zdGFudCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmF0aW9uSW5zdGFudDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgY2xvc2UodGFyZ2V0PzogJ3NlbGYnIHwgJ2FsbC12aWV3cycgfCAnb3RoZXItdmlld3MnIHwgJ3ZpZXdzLXRvLXRoZS1yaWdodCcgfCAndmlld3MtdG8tdGhlLWxlZnQnKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgYXNzZXJ0Tm90SW5SZWFjdGl2ZUNvbnRleHQodGhpcy5jbG9zZSwgJ0NhbGwgV29ya2JlbmNoVmlldy5jbG9zZSgpIGluIGEgbm9uLXJlYWN0aXZlIChub24tdHJhY2tpbmcpIGNvbnRleHQsIHN1Y2ggYXMgd2l0aGluIHRoZSB1bnRyYWNrZWQoKSBmdW5jdGlvbi4nKTtcbiAgICBzd2l0Y2ggKHRhcmdldCB8fCAnc2VsZicpIHtcbiAgICAgIGNhc2UgJ3NlbGYnOiB7XG4gICAgICAgIHJldHVybiB0aGlzLl93b3JrYmVuY2hTZXJ2aWNlLmNsb3NlVmlld3ModGhpcy5pZCk7XG4gICAgICB9XG4gICAgICBjYXNlICdhbGwtdmlld3MnOiB7XG4gICAgICAgIHJldHVybiB0aGlzLl93b3JrYmVuY2hTZXJ2aWNlLmNsb3NlVmlld3MoLi4udGhpcy5wYXJ0KCkudmlld0lkcygpKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ290aGVyLXZpZXdzJzoge1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya2JlbmNoU2VydmljZS5jbG9zZVZpZXdzKC4uLnRoaXMucGFydCgpLnZpZXdJZHMoKS5maWx0ZXIodmlld0lkID0+IHZpZXdJZCAhPT0gdGhpcy5pZCkpO1xuICAgICAgfVxuICAgICAgY2FzZSAndmlld3MtdG8tdGhlLXJpZ2h0Jzoge1xuICAgICAgICBjb25zdCB2aWV3SWRzID0gdGhpcy5wYXJ0KCkudmlld0lkcygpO1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya2JlbmNoU2VydmljZS5jbG9zZVZpZXdzKC4uLnZpZXdJZHMuc2xpY2Uodmlld0lkcy5pbmRleE9mKHRoaXMuaWQpICsgMSkpO1xuICAgICAgfVxuICAgICAgY2FzZSAndmlld3MtdG8tdGhlLWxlZnQnOiB7XG4gICAgICAgIGNvbnN0IHZpZXdJZHMgPSB0aGlzLnBhcnQoKS52aWV3SWRzKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl93b3JrYmVuY2hTZXJ2aWNlLmNsb3NlVmlld3MoLi4udmlld0lkcy5zbGljZSgwLCB2aWV3SWRzLmluZGV4T2YodGhpcy5pZCkpKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBtb3ZlKHRhcmdldDogJ25ldy13aW5kb3cnKTogdm9pZDtcbiAgcHVibGljIG1vdmUocGFydElkOiBzdHJpbmcsIG9wdGlvbnM/OiB7cmVnaW9uPzogJ25vcnRoJyB8ICdzb3V0aCcgfCAnd2VzdCcgfCAnZWFzdCc7IHdvcmtiZW5jaElkPzogc3RyaW5nfSk6IHZvaWQ7XG4gIHB1YmxpYyBtb3ZlKHRhcmdldDogJ25ldy13aW5kb3cnIHwgc3RyaW5nLCBvcHRpb25zPzoge3JlZ2lvbj86ICdub3J0aCcgfCAnc291dGgnIHwgJ3dlc3QnIHwgJ2Vhc3QnOyB3b3JrYmVuY2hJZD86IHN0cmluZ30pOiB2b2lkIHtcbiAgICBhc3NlcnROb3RJblJlYWN0aXZlQ29udGV4dCh0aGlzLm1vdmUsICdDYWxsIFdvcmtiZW5jaFZpZXcubW92ZSgpIGluIGEgbm9uLXJlYWN0aXZlIChub24tdHJhY2tpbmcpIGNvbnRleHQsIHN1Y2ggYXMgd2l0aGluIHRoZSB1bnRyYWNrZWQoKSBmdW5jdGlvbi4nKTtcbiAgICBjb25zdCBzb3VyY2U6IFZpZXdNb3ZlRXZlbnRTb3VyY2UgPSB7XG4gICAgICB3b3JrYmVuY2hJZDogdGhpcy5fd29ya2JlbmNoSWQsXG4gICAgICBwYXJ0SWQ6IHRoaXMucGFydCgpLmlkLFxuICAgICAgdmlld0lkOiB0aGlzLmlkLFxuICAgICAgYWx0ZXJuYXRpdmVWaWV3SWQ6IHRoaXMuYWx0ZXJuYXRpdmVJZCxcbiAgICAgIHZpZXdVcmxTZWdtZW50czogdGhpcy51cmxTZWdtZW50cygpLFxuICAgICAgbmF2aWdhdGlvbkhpbnQ6IHRoaXMubmF2aWdhdGlvbkhpbnQoKSxcbiAgICAgIG5hdmlnYXRpb25EYXRhOiB0aGlzLm5hdmlnYXRpb25EYXRhKCksXG4gICAgICBjbGFzc0xpc3Q6IHRoaXMuY2xhc3NMaXN0LmFzTWFwKCksXG4gICAgfTtcblxuICAgIGlmICh0YXJnZXQgPT09ICduZXctd2luZG93Jykge1xuICAgICAgdGhpcy5fdmlld0RyYWdTZXJ2aWNlLmRpc3BhdGNoVmlld01vdmVFdmVudCh7c291cmNlLCB0YXJnZXQ6IHt3b3JrYmVuY2hJZDogJ25ldy13aW5kb3cnfX0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuX3ZpZXdEcmFnU2VydmljZS5kaXNwYXRjaFZpZXdNb3ZlRXZlbnQoe1xuICAgICAgICBzb3VyY2UsXG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgIGVsZW1lbnRJZDogdGFyZ2V0LFxuICAgICAgICAgIHJlZ2lvbjogb3B0aW9ucz8ucmVnaW9uLFxuICAgICAgICAgIHdvcmtiZW5jaElkOiBvcHRpb25zPy53b3JrYmVuY2hJZCA/PyB0aGlzLl93b3JrYmVuY2hJZCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgY2FuQ2xvc2UoY2FuQ2xvc2U6IENhbkNsb3NlRm4pOiBDYW5DbG9zZVJlZiB7XG4gICAgY29uc3QgY2FuQ2xvc2VGbiA9IHRoaXMuX2NhbkNsb3NlRm4gPSBhc3luYyAoKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjbG9zZSA9IHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLnBvcnRhbC5jb21wb25lbnRSZWYuaW5qZWN0b3IsIGNhbkNsb3NlKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZpcnN0VmFsdWVGcm9tKE9ic2VydmFibGVzLmNvZXJjZShjbG9zZSksIHtkZWZhdWx0VmFsdWU6IHRydWV9KTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoYFVuaGFuZGxlZCBlcnJvciB3aGlsZSBpbnZva2luZyAnQ2FuQ2xvc2UnIGZ1bmN0aW9uIG9mIHZpZXcgJyR7dGhpcy5pZH0nLmAsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICAgIGlmIChjYW5DbG9zZUZuID09PSB0aGlzLl9jYW5DbG9zZUZuKSB7XG4gICAgICAgICAgdGhpcy5fY2FuQ2xvc2VGbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZmVyZW5jZSB0byB0aGUgYENhbkNsb3NlYCBndWFyZCByZWdpc3RlcmVkIG9uIHRoaXMgdmlldywgaWYgYW55LlxuICAgKi9cbiAgcHVibGljIGdldCBjYW5DbG9zZUd1YXJkKCk6ICgoKSA9PiBQcm9taXNlPGJvb2xlYW4+KSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbkNsb3NlRm4gPz8gKHR5cGVvZiB0aGlzLmdldENvbXBvbmVudDxDYW5DbG9zZT4oKT8uY2FuQ2xvc2UgPT09ICdmdW5jdGlvbicgPyB0aGlzLl9jbGFzc0Jhc2VkQ2FuQ2xvc2VHdWFyZCA6IHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHVibGljIHJlZ2lzdGVyTWVudUl0ZW0obWVudUl0ZW06IFdvcmtiZW5jaE1lbnVJdGVtKTogRGlzcG9zYWJsZSB7XG4gICAgYXNzZXJ0Tm90SW5SZWFjdGl2ZUNvbnRleHQodGhpcy5yZWdpc3Rlck1lbnVJdGVtLCAnQ2FsbCBXb3JrYmVuY2hWaWV3LnJlZ2lzdGVyTWVudUl0ZW0oKSBpbiBhIG5vbi1yZWFjdGl2ZSAobm9uLXRyYWNraW5nKSBjb250ZXh0LCBzdWNoIGFzIHdpdGhpbiB0aGUgdW50cmFja2VkKCkgZnVuY3Rpb24uJyk7XG4gICAgY29uc3QgZmFjdG9yeUZuID0gKCk6IFdvcmtiZW5jaE1lbnVJdGVtID0+IG1lbnVJdGVtO1xuICAgIHRoaXMuX21lbnVJdGVtUHJvdmlkZXJzJC5uZXh0KHRoaXMuX21lbnVJdGVtUHJvdmlkZXJzJC52YWx1ZS5jb25jYXQoZmFjdG9yeUZuKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3Bvc2U6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5fbWVudUl0ZW1Qcm92aWRlcnMkLm5leHQodGhpcy5fbWVudUl0ZW1Qcm92aWRlcnMkLnZhbHVlLmZpbHRlcihpdCA9PiBpdCAhPT0gZmFjdG9yeUZuKSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHRoZSBoYW5kbGUncyBpbmplY3Rvci4gVGhlIGluamVjdG9yIHdpbGwgYmUgZGVzdHJveWVkIHdoZW4gY2xvc2luZyB0aGUgdmlldy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW5qZWN0b3IoKTogSW5qZWN0b3Ige1xuICAgIHJldHVybiB0aGlzLl92aWV3RW52aXJvbm1lbnRJbmplY3RvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYW4gYWRhcHRlciBmb3IgdGhpcyB2aWV3LCByZXBsYWNpbmcgYW55IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBhZGFwdGVyIG9mIHRoZSBzYW1lIHR5cGUuXG4gICAqXG4gICAqIEFkYXB0ZXJzIGVuYWJsZSBsb29zZWx5IGNvdXBsZWQgZXh0ZW5zaW9uIG9mIGFuIG9iamVjdCwgYWxsb3dpbmcgb25lIG9iamVjdCB0byBiZSBhZGFwdGVkIHRvIGFub3RoZXIuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJBZGFwdGVyPFQ+KGFkYXB0ZXJUeXBlOiBBYnN0cmFjdFR5cGU8VD4gfCBUeXBlPFQ+LCBvYmplY3Q6IFQpOiB2b2lkIHtcbiAgICB0aGlzLl9hZGFwdGVycy5zZXQoYWRhcHRlclR5cGUsIG9iamVjdCk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgdGhlIGdpdmVuIGFkYXB0ZXIuIEhhcyBubyBlZmZlY3QgaWYgbm90IHJlZ2lzdGVyZWQuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlckFkYXB0ZXIoYWRhcHRlclR5cGU6IEFic3RyYWN0VHlwZTx1bmtub3duPiB8IFR5cGU8dW5rbm93bj4pOiB2b2lkIHtcbiAgICB0aGlzLl9hZGFwdGVycy5kZWxldGUoYWRhcHRlclR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkYXB0cyB0aGlzIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIHR5cGUuIFJldHVybnMgYG51bGxgIGlmIG5vIHN1Y2ggb2JqZWN0IGNhbiBiZSBmb3VuZC5cbiAgICovXG4gIHB1YmxpYyBhZGFwdDxUPihhZGFwdGVyVHlwZTogQWJzdHJhY3RUeXBlPFQ+IHwgVHlwZTxUPik6IFQgfCBudWxsIHtcbiAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5fYWRhcHRlcnMuZ2V0KGFkYXB0ZXJUeXBlKTtcbiAgICByZXR1cm4gYWRhcHRlciA/IGFkYXB0ZXIgYXMgVCA6IG51bGw7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHVibGljIGdldCBkZXN0cm95ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucG9ydGFsLmlzRGVzdHJveWVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGFjdGl2YXRpb24gaW5zdGFudCB3aGVuIHRoaXMgdmlldyBpcyBhY3RpdmF0ZWQuXG4gICAqL1xuICBwcml2YXRlIHRvdWNoT25BY3RpdmF0ZSgpOiB2b2lkIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuYWN0aXZlKCkpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZhdGlvbkluc3RhbnQgPSB0aGlzLl9hY3RpdmF0aW9uSW5zdGFudFByb3ZpZGVyLm5vdygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGxlZ2FjeSBzdXBwb3J0IGZvciBkZXByZWNhdGVkIGNsYXNzLWJhc2VkIHtAbGluayBDYW5DbG9zZX0gZ3VhcmQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMTguMC4wLWJldGEuOS4gTm8gbG9uZ2VyIG5lZWRlZCB3aXRoIHRoZSByZW1vdmFsIG9mIGNsYXNzLWJhc2VkIHtAbGluayBDYW5DbG9zZX0gZ3VhcmQuXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdENsYXNzQmFzZWRDYW5DbG9zZUd1YXJkKCk6ICgpID0+IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjbG9zZSA9IHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLnBvcnRhbC5jb21wb25lbnRSZWYuaW5qZWN0b3IsICgpID0+IHRoaXMuZ2V0Q29tcG9uZW50PENhbkNsb3NlPigpIS5jYW5DbG9zZSgpKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZpcnN0VmFsdWVGcm9tKE9ic2VydmFibGVzLmNvZXJjZShjbG9zZSksIHtkZWZhdWx0VmFsdWU6IHRydWV9KTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoYFVuaGFuZGxlZCBlcnJvciB3aGlsZSBpbnZva2luZyAnQ2FuQ2xvc2UnIGd1YXJkIG9mIHZpZXcgJyR7dGhpcy5pZH0nLmAsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIGF1dG9tYXRpYyBzeW5jaHJvbml6YXRpb24gb2Yge0BsaW5rIFdvcmtiZW5jaFZpZXd9IG9uIGV2ZXJ5IGxheW91dCBjaGFuZ2UuXG4gICAqXG4gICAqIElmIHRoZSBvcGVyYXRpb24gaXMgY2FuY2VsbGVkIChlLmcuLCBkdWUgdG8gYSBuYXZpZ2F0aW9uIGZhaWx1cmUpLCBpdCByZXZlcnRzIHRoZSBjaGFuZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsTW9kZWxVcGRhdGVyKCk6IHZvaWQge1xuICAgIFJvdXRpbmcuYWN0aXZhdGVkUm91dGUkKHRoaXMuaWQsIHtlbWl0T246ICdhbHdheXMnfSlcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgLnN1YnNjcmliZSgoW3ByZXZpb3VzUm91dGUsIHJvdXRlXTogW0FjdGl2YXRlZFJvdXRlU25hcHNob3QgfCBudWxsLCBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90XSkgPT4ge1xuICAgICAgICBjb25zdCBuYXZpZ2F0aW9uQ29udGV4dCA9IHRoaXMuX3dvcmtiZW5jaFJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQoKTtcbiAgICAgICAgY29uc3Qge2xheW91dCwgcHJldmlvdXNMYXlvdXQsIGxheW91dERpZmZ9ID0gbmF2aWdhdGlvbkNvbnRleHQ7XG5cbiAgICAgICAgaWYgKGxheW91dERpZmYucmVtb3ZlZFZpZXdzLmluY2x1ZGVzKHRoaXMuaWQpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vbkxheW91dENoYW5nZSh7bGF5b3V0LCByb3V0ZSwgcHJldmlvdXNSb3V0ZX0pO1xuXG4gICAgICAgIC8vIFJldmVydCBjaGFuZ2UgaW4gY2FzZSB0aGUgbmF2aWdhdGlvbiBmYWlscy5cbiAgICAgICAgaWYgKHByZXZpb3VzTGF5b3V0Py5oYXNWaWV3KHRoaXMuaWQpKSB7XG4gICAgICAgICAgbmF2aWdhdGlvbkNvbnRleHQucmVnaXN0ZXJVbmRvQWN0aW9uKCgpID0+IHRoaXMub25MYXlvdXRDaGFuZ2Uoe2xheW91dDogcHJldmlvdXNMYXlvdXQsIHJvdXRlOiBwcmV2aW91c1JvdXRlISwgcHJldmlvdXNSb3V0ZTogcm91dGV9KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fdmlld0Vudmlyb25tZW50SW5qZWN0b3IuZGVzdHJveSgpO1xuICAgIHRoaXMuX3dvcmtiZW5jaERpYWxvZ1JlZ2lzdHJ5LmRpYWxvZ3Moe3ZpZXdJZDogdGhpcy5pZH0pLmZvckVhY2goZGlhbG9nID0+IGRpYWxvZy5kZXN0cm95KCkpO1xuICAgIHRoaXMucG9ydGFsLmRlc3Ryb3koKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBwc2V1ZG8tdHlwZSBmb3IgdGhlIGFjdHVhbCB7QGxpbmsgVmlld0NvbXBvbmVudH0gd2hpY2ggbXVzdCBub3QgYmUgcmVmZXJlbmNlZCBpbiBvcmRlciB0byBhdm9pZCBpbXBvcnQgY3ljbGVzLlxuICovXG50eXBlIFZpZXdDb21wb25lbnQgPSBhbnk7XG4iXX0=
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2018-2024 Swiss Federal Railways
|
|
3
|
-
*
|
|
4
|
-
* This program and the accompanying materials are made
|
|
5
|
-
* available under the terms of the Eclipse Public License 2.0
|
|
6
|
-
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
7
|
-
*
|
|
8
|
-
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
-
*/
|
|
10
|
-
import { MPart } from '../layout/workbench-layout.model';
|
|
11
|
-
import { WorkbenchLayouts } from '../layout/workbench-layouts.util';
|
|
12
|
-
/**
|
|
13
|
-
* Provides helper functions for dragging a view to a grid.
|
|
14
|
-
*/
|
|
15
|
-
export const GridDropTargets = {
|
|
16
|
-
/**
|
|
17
|
-
* Resolves the drop target for moving a view to the root part (or node) of a grid.
|
|
18
|
-
*
|
|
19
|
-
* Examples:
|
|
20
|
-
* - Droping a view at the grid's boundaries (north, south, east, west).
|
|
21
|
-
* - Dropping a view on the grid's start page (center).
|
|
22
|
-
*
|
|
23
|
-
* When dropping a view on the grid's start page, the root of the grid can be a part or a node,
|
|
24
|
-
* depending on whether the grid contains structural parts.
|
|
25
|
-
*/
|
|
26
|
-
resolve: (target) => {
|
|
27
|
-
const { grid, dropRegion, workbenchId } = target;
|
|
28
|
-
switch (dropRegion) {
|
|
29
|
-
case 'center': {
|
|
30
|
-
if (grid.root instanceof MPart) {
|
|
31
|
-
return { elementId: grid.root.id, workbenchId };
|
|
32
|
-
}
|
|
33
|
-
if (grid.activePartId) {
|
|
34
|
-
return { elementId: grid.activePartId, workbenchId };
|
|
35
|
-
}
|
|
36
|
-
return { elementId: WorkbenchLayouts.collectParts(grid.root)[0].id, workbenchId };
|
|
37
|
-
}
|
|
38
|
-
default: {
|
|
39
|
-
return {
|
|
40
|
-
elementId: grid.root.id,
|
|
41
|
-
region: dropRegion,
|
|
42
|
-
workbenchId,
|
|
43
|
-
newPart: { ratio: .2 },
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
},
|
|
48
|
-
};
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1kcm9wLXRhcmdldHMudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL3ZpZXctZG5kL2dyaWQtZHJvcC10YXJnZXRzLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFHSCxPQUFPLEVBQUMsS0FBSyxFQUFZLE1BQU0sa0NBQWtDLENBQUM7QUFDbEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFFbEU7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUc7SUFFN0I7Ozs7Ozs7OztPQVNHO0lBQ0gsT0FBTyxFQUFFLENBQUMsTUFBMEcsRUFBdUIsRUFBRTtRQUMzSSxNQUFNLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUMsR0FBRyxNQUFNLENBQUM7UUFFL0MsUUFBUSxVQUFVLEVBQUUsQ0FBQztZQUNuQixLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ2QsSUFBSSxJQUFJLENBQUMsSUFBSSxZQUFZLEtBQUssRUFBRSxDQUFDO29CQUMvQixPQUFPLEVBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFdBQVcsRUFBQyxDQUFDO2dCQUNoRCxDQUFDO2dCQUNELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUN0QixPQUFPLEVBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFDLENBQUM7Z0JBQ3JELENBQUM7Z0JBQ0QsT0FBTyxFQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUMsQ0FBQztZQUNsRixDQUFDO1lBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDUixPQUFPO29CQUNMLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3ZCLE1BQU0sRUFBRSxVQUFVO29CQUNsQixXQUFXO29CQUNYLE9BQU8sRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFFLEVBQUM7aUJBQ3JCLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDTyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDI0IFN3aXNzIEZlZGVyYWwgUmFpbHdheXNcbiAqXG4gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlXG4gKiBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMFxuICogd2hpY2ggaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiAqL1xuXG5pbXBvcnQge1ZpZXdNb3ZlRXZlbnRUYXJnZXR9IGZyb20gJy4vdmlldy1kcmFnLnNlcnZpY2UnO1xuaW1wb3J0IHtNUGFydCwgTVBhcnRHcmlkfSBmcm9tICcuLi9sYXlvdXQvd29ya2JlbmNoLWxheW91dC5tb2RlbCc7XG5pbXBvcnQge1dvcmtiZW5jaExheW91dHN9IGZyb20gJy4uL2xheW91dC93b3JrYmVuY2gtbGF5b3V0cy51dGlsJztcblxuLyoqXG4gKiBQcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBkcmFnZ2luZyBhIHZpZXcgdG8gYSBncmlkLlxuICovXG5leHBvcnQgY29uc3QgR3JpZERyb3BUYXJnZXRzID0ge1xuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgZHJvcCB0YXJnZXQgZm9yIG1vdmluZyBhIHZpZXcgdG8gdGhlIHJvb3QgcGFydCAob3Igbm9kZSkgb2YgYSBncmlkLlxuICAgKlxuICAgKiBFeGFtcGxlczpcbiAgICogLSBEcm9waW5nIGEgdmlldyBhdCB0aGUgZ3JpZCdzIGJvdW5kYXJpZXMgKG5vcnRoLCBzb3V0aCwgZWFzdCwgd2VzdCkuXG4gICAqIC0gRHJvcHBpbmcgYSB2aWV3IG9uIHRoZSBncmlkJ3Mgc3RhcnQgcGFnZSAoY2VudGVyKS5cbiAgICpcbiAgICogV2hlbiBkcm9wcGluZyBhIHZpZXcgb24gdGhlIGdyaWQncyBzdGFydCBwYWdlLCB0aGUgcm9vdCBvZiB0aGUgZ3JpZCBjYW4gYmUgYSBwYXJ0IG9yIGEgbm9kZSxcbiAgICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGdyaWQgY29udGFpbnMgc3RydWN0dXJhbCBwYXJ0cy5cbiAgICovXG4gIHJlc29sdmU6ICh0YXJnZXQ6IHtncmlkOiBNUGFydEdyaWQ7IGRyb3BSZWdpb246ICd3ZXN0JyB8ICdlYXN0JyB8ICdub3J0aCcgfCAnc291dGgnIHwgJ2NlbnRlcic7IHdvcmtiZW5jaElkOiBzdHJpbmd9KTogVmlld01vdmVFdmVudFRhcmdldCA9PiB7XG4gICAgY29uc3Qge2dyaWQsIGRyb3BSZWdpb24sIHdvcmtiZW5jaElkfSA9IHRhcmdldDtcblxuICAgIHN3aXRjaCAoZHJvcFJlZ2lvbikge1xuICAgICAgY2FzZSAnY2VudGVyJzoge1xuICAgICAgICBpZiAoZ3JpZC5yb290IGluc3RhbmNlb2YgTVBhcnQpIHtcbiAgICAgICAgICByZXR1cm4ge2VsZW1lbnRJZDogZ3JpZC5yb290LmlkLCB3b3JrYmVuY2hJZH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdyaWQuYWN0aXZlUGFydElkKSB7XG4gICAgICAgICAgcmV0dXJuIHtlbGVtZW50SWQ6IGdyaWQuYWN0aXZlUGFydElkLCB3b3JrYmVuY2hJZH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtlbGVtZW50SWQ6IFdvcmtiZW5jaExheW91dHMuY29sbGVjdFBhcnRzKGdyaWQucm9vdClbMF0uaWQsIHdvcmtiZW5jaElkfTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGdyaWQucm9vdC5pZCxcbiAgICAgICAgICByZWdpb246IGRyb3BSZWdpb24sXG4gICAgICAgICAgd29ya2JlbmNoSWQsXG4gICAgICAgICAgbmV3UGFydDoge3JhdGlvOiAuMn0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9LFxufSBhcyBjb25zdDtcbiJdfQ==
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2018-2023 Swiss Federal Railways
|
|
3
|
-
*
|
|
4
|
-
* This program and the accompanying materials are made
|
|
5
|
-
* available under the terms of the Eclipse Public License 2.0
|
|
6
|
-
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
7
|
-
*
|
|
8
|
-
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
-
*/
|
|
10
|
-
import { Pipe } from '@angular/core';
|
|
11
|
-
import { MPart } from '../layout/workbench-layout.model';
|
|
12
|
-
import { MAIN_AREA } from '../layout/workbench-layout';
|
|
13
|
-
import { WorkbenchLayouts } from '../layout/workbench-layouts.util';
|
|
14
|
-
import * as i0 from "@angular/core";
|
|
15
|
-
/**
|
|
16
|
-
* Determines whether the given element requires a drop zone in the specified region.
|
|
17
|
-
*
|
|
18
|
-
* An element requires a drop zone if its layout is divided into multiple parts in that region.
|
|
19
|
-
*/
|
|
20
|
-
export class RequiresDropZonePipe {
|
|
21
|
-
transform(element, region) {
|
|
22
|
-
return requiresDropZone(element, region);
|
|
23
|
-
}
|
|
24
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: RequiresDropZonePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
25
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.0.2", ngImport: i0, type: RequiresDropZonePipe, isStandalone: true, name: "wbRequiresDropZone" }); }
|
|
26
|
-
}
|
|
27
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: RequiresDropZonePipe, decorators: [{
|
|
28
|
-
type: Pipe,
|
|
29
|
-
args: [{ name: 'wbRequiresDropZone', standalone: true }]
|
|
30
|
-
}] });
|
|
31
|
-
function requiresDropZone(element, region) {
|
|
32
|
-
if (element instanceof MPart) {
|
|
33
|
-
// Return `false` for every part except the main area part, allowing for dragging a first part to that side in the workbench grid.
|
|
34
|
-
return element.id === MAIN_AREA;
|
|
35
|
-
}
|
|
36
|
-
const child1Visible = WorkbenchLayouts.isGridElementVisible(element.child1);
|
|
37
|
-
const child2Visible = WorkbenchLayouts.isGridElementVisible(element.child2);
|
|
38
|
-
if (child1Visible && child2Visible) {
|
|
39
|
-
switch (region) {
|
|
40
|
-
case 'north':
|
|
41
|
-
// The element requires a drop zone if the element (or its first child) is divided horizontally into multiple parts.
|
|
42
|
-
return element.direction === 'row' || requiresDropZone(element.child1, region);
|
|
43
|
-
case 'south':
|
|
44
|
-
// The element requires a drop zone if the element (or its second child) is divided horizontally into multiple parts.
|
|
45
|
-
return element.direction === 'row' || requiresDropZone(element.child2, region);
|
|
46
|
-
case 'west':
|
|
47
|
-
// The element requires a drop zone if the element (or its first child) is divided vertically into multiple parts.
|
|
48
|
-
return element.direction === 'column' || requiresDropZone(element.child1, region);
|
|
49
|
-
case 'east':
|
|
50
|
-
// The element requires a drop zone if the element (or its second child) is divided vertically into multiple parts.
|
|
51
|
-
return element.direction === 'column' || requiresDropZone(element.child2, region);
|
|
52
|
-
default:
|
|
53
|
-
return false; // unsupported
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return requiresDropZone(child1Visible ? element.child1 : element.child2, region);
|
|
57
|
-
}
|
|
58
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWlyZXMtZHJvcC16b25lLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi92aWV3LWRuZC9yZXF1aXJlcy1kcm9wLXpvbmUucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQWdCLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBQyxLQUFLLEVBQVksTUFBTSxrQ0FBa0MsQ0FBQztBQUNsRSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDckQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7O0FBRWxFOzs7O0dBSUc7QUFFSCxNQUFNLE9BQU8sb0JBQW9CO0lBRXhCLFNBQVMsQ0FBQyxPQUEwQixFQUFFLE1BQTJDO1FBQ3RGLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLENBQUM7OEdBSlUsb0JBQW9COzRHQUFwQixvQkFBb0I7OzJGQUFwQixvQkFBb0I7a0JBRGhDLElBQUk7bUJBQUMsRUFBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBQzs7QUFRcEQsU0FBUyxnQkFBZ0IsQ0FBQyxPQUEwQixFQUFFLE1BQTJDO0lBQy9GLElBQUksT0FBTyxZQUFZLEtBQUssRUFBRSxDQUFDO1FBQzdCLGtJQUFrSTtRQUNsSSxPQUFPLE9BQU8sQ0FBQyxFQUFFLEtBQUssU0FBUyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUUsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTVFLElBQUksYUFBYSxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ25DLFFBQVEsTUFBTSxFQUFFLENBQUM7WUFDZixLQUFLLE9BQU87Z0JBQ1Ysb0hBQW9IO2dCQUNwSCxPQUFPLE9BQU8sQ0FBQyxTQUFTLEtBQUssS0FBSyxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDakYsS0FBSyxPQUFPO2dCQUNWLHFIQUFxSDtnQkFDckgsT0FBTyxPQUFPLENBQUMsU0FBUyxLQUFLLEtBQUssSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2pGLEtBQUssTUFBTTtnQkFDVCxrSEFBa0g7Z0JBQ2xILE9BQU8sT0FBTyxDQUFDLFNBQVMsS0FBSyxRQUFRLElBQUksZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNwRixLQUFLLE1BQU07Z0JBQ1QsbUhBQW1IO2dCQUNuSCxPQUFPLE9BQU8sQ0FBQyxTQUFTLEtBQUssUUFBUSxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDcEY7Z0JBQ0UsT0FBTyxLQUFLLENBQUMsQ0FBQyxjQUFjO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDbkYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMyBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtQaXBlLCBQaXBlVHJhbnNmb3JtfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TVBhcnQsIE1UcmVlTm9kZX0gZnJvbSAnLi4vbGF5b3V0L3dvcmtiZW5jaC1sYXlvdXQubW9kZWwnO1xuaW1wb3J0IHtNQUlOX0FSRUF9IGZyb20gJy4uL2xheW91dC93b3JrYmVuY2gtbGF5b3V0JztcbmltcG9ydCB7V29ya2JlbmNoTGF5b3V0c30gZnJvbSAnLi4vbGF5b3V0L3dvcmtiZW5jaC1sYXlvdXRzLnV0aWwnO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gZWxlbWVudCByZXF1aXJlcyBhIGRyb3Agem9uZSBpbiB0aGUgc3BlY2lmaWVkIHJlZ2lvbi5cbiAqXG4gKiBBbiBlbGVtZW50IHJlcXVpcmVzIGEgZHJvcCB6b25lIGlmIGl0cyBsYXlvdXQgaXMgZGl2aWRlZCBpbnRvIG11bHRpcGxlIHBhcnRzIGluIHRoYXQgcmVnaW9uLlxuICovXG5AUGlwZSh7bmFtZTogJ3diUmVxdWlyZXNEcm9wWm9uZScsIHN0YW5kYWxvbmU6IHRydWV9KVxuZXhwb3J0IGNsYXNzIFJlcXVpcmVzRHJvcFpvbmVQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG5cbiAgcHVibGljIHRyYW5zZm9ybShlbGVtZW50OiBNVHJlZU5vZGUgfCBNUGFydCwgcmVnaW9uOiAnbm9ydGgnIHwgJ3NvdXRoJyB8ICdlYXN0JyB8ICd3ZXN0Jyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZXF1aXJlc0Ryb3Bab25lKGVsZW1lbnQsIHJlZ2lvbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVxdWlyZXNEcm9wWm9uZShlbGVtZW50OiBNVHJlZU5vZGUgfCBNUGFydCwgcmVnaW9uOiAnbm9ydGgnIHwgJ3NvdXRoJyB8ICdlYXN0JyB8ICd3ZXN0Jyk6IGJvb2xlYW4ge1xuICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1QYXJ0KSB7XG4gICAgLy8gUmV0dXJuIGBmYWxzZWAgZm9yIGV2ZXJ5IHBhcnQgZXhjZXB0IHRoZSBtYWluIGFyZWEgcGFydCwgYWxsb3dpbmcgZm9yIGRyYWdnaW5nIGEgZmlyc3QgcGFydCB0byB0aGF0IHNpZGUgaW4gdGhlIHdvcmtiZW5jaCBncmlkLlxuICAgIHJldHVybiBlbGVtZW50LmlkID09PSBNQUlOX0FSRUE7XG4gIH1cblxuICBjb25zdCBjaGlsZDFWaXNpYmxlID0gV29ya2JlbmNoTGF5b3V0cy5pc0dyaWRFbGVtZW50VmlzaWJsZShlbGVtZW50LmNoaWxkMSk7XG4gIGNvbnN0IGNoaWxkMlZpc2libGUgPSBXb3JrYmVuY2hMYXlvdXRzLmlzR3JpZEVsZW1lbnRWaXNpYmxlKGVsZW1lbnQuY2hpbGQyKTtcblxuICBpZiAoY2hpbGQxVmlzaWJsZSAmJiBjaGlsZDJWaXNpYmxlKSB7XG4gICAgc3dpdGNoIChyZWdpb24pIHtcbiAgICAgIGNhc2UgJ25vcnRoJzpcbiAgICAgICAgLy8gVGhlIGVsZW1lbnQgcmVxdWlyZXMgYSBkcm9wIHpvbmUgaWYgdGhlIGVsZW1lbnQgKG9yIGl0cyBmaXJzdCBjaGlsZCkgaXMgZGl2aWRlZCBob3Jpem9udGFsbHkgaW50byBtdWx0aXBsZSBwYXJ0cy5cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuZGlyZWN0aW9uID09PSAncm93JyB8fCByZXF1aXJlc0Ryb3Bab25lKGVsZW1lbnQuY2hpbGQxLCByZWdpb24pO1xuICAgICAgY2FzZSAnc291dGgnOlxuICAgICAgICAvLyBUaGUgZWxlbWVudCByZXF1aXJlcyBhIGRyb3Agem9uZSBpZiB0aGUgZWxlbWVudCAob3IgaXRzIHNlY29uZCBjaGlsZCkgaXMgZGl2aWRlZCBob3Jpem9udGFsbHkgaW50byBtdWx0aXBsZSBwYXJ0cy5cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuZGlyZWN0aW9uID09PSAncm93JyB8fCByZXF1aXJlc0Ryb3Bab25lKGVsZW1lbnQuY2hpbGQyLCByZWdpb24pO1xuICAgICAgY2FzZSAnd2VzdCc6XG4gICAgICAgIC8vIFRoZSBlbGVtZW50IHJlcXVpcmVzIGEgZHJvcCB6b25lIGlmIHRoZSBlbGVtZW50IChvciBpdHMgZmlyc3QgY2hpbGQpIGlzIGRpdmlkZWQgdmVydGljYWxseSBpbnRvIG11bHRpcGxlIHBhcnRzLlxuICAgICAgICByZXR1cm4gZWxlbWVudC5kaXJlY3Rpb24gPT09ICdjb2x1bW4nIHx8IHJlcXVpcmVzRHJvcFpvbmUoZWxlbWVudC5jaGlsZDEsIHJlZ2lvbik7XG4gICAgICBjYXNlICdlYXN0JzpcbiAgICAgICAgLy8gVGhlIGVsZW1lbnQgcmVxdWlyZXMgYSBkcm9wIHpvbmUgaWYgdGhlIGVsZW1lbnQgKG9yIGl0cyBzZWNvbmQgY2hpbGQpIGlzIGRpdmlkZWQgdmVydGljYWxseSBpbnRvIG11bHRpcGxlIHBhcnRzLlxuICAgICAgICByZXR1cm4gZWxlbWVudC5kaXJlY3Rpb24gPT09ICdjb2x1bW4nIHx8IHJlcXVpcmVzRHJvcFpvbmUoZWxlbWVudC5jaGlsZDIsIHJlZ2lvbik7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHVuc3VwcG9ydGVkXG4gICAgfVxuICB9XG4gIHJldHVybiByZXF1aXJlc0Ryb3Bab25lKGNoaWxkMVZpc2libGUgPyBlbGVtZW50LmNoaWxkMSA6IGVsZW1lbnQuY2hpbGQyLCByZWdpb24pO1xufVxuIl19
|