@scion/workbench 17.0.0-beta.5 → 17.0.0-beta.7
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/esm2022/lib/common/class-list.mjs +61 -0
- package/esm2022/lib/common/grid-element-if-visible.pipe.mjs +32 -0
- package/esm2022/lib/dialog/workbench-dialog.mjs +1 -1
- package/esm2022/lib/dialog/workbench-dialog.options.mjs +1 -1
- package/esm2022/lib/dialog//311/265workbench-dialog.mjs +2 -20
- package/esm2022/lib/layout/main-area-layout/main-area-layout.component.mjs +13 -16
- package/esm2022/lib/layout/workbench-layout.component.mjs +12 -12
- package/esm2022/lib/layout/workbench-layouts.util.mjs +30 -0
- package/esm2022/lib/logging/logger-names.mjs +8 -9
- package/esm2022/lib/logging/logger.mjs +1 -1
- package/esm2022/lib/logging//311/265logger.mjs +3 -3
- package/esm2022/lib/microfrontend-platform/common/microfrontend.util.mjs +55 -0
- package/esm2022/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.mjs +32 -20
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-capability-validator.interceptor.mjs +53 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-intent-handler.interceptor.mjs +85 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog.component.mjs +140 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.mjs +122 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.mjs +3 -3
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-capability-validator.interceptor.mjs +30 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.mjs +130 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.mjs +16 -28
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.mjs +7 -29
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.mjs +70 -124
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-workbench-view.model.mjs +23 -0
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-id-assigner.interceptor.mjs +41 -0
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-validator.interceptor.mjs +30 -0
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.mjs +123 -0
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-routes.mjs +98 -0
- package/esm2022/lib/microfrontend-platform/workbench-microfrontend-support.mjs +31 -35
- package/esm2022/lib/part/part-bar/part-bar.component.mjs +2 -1
- package/esm2022/lib/part/part.component.mjs +2 -1
- package/esm2022/lib/part/view-context-menu/view-menu.service.mjs +37 -25
- package/esm2022/lib/part/view-tab/view-tab.component.mjs +4 -3
- package/esm2022/lib/perspective/workbench-perspective-storage.service.mjs +1 -1
- package/esm2022/lib/perspective/workbench-perspective-view-conflict-resolver.service.mjs +1 -1
- package/esm2022/lib/perspective//311/265workbench-perspective.model.mjs +1 -1
- package/esm2022/lib/routing/public_api.mjs +1 -1
- package/esm2022/lib/routing/router.util.mjs +20 -43
- package/esm2022/lib/routing/routing.model.mjs +11 -0
- package/esm2022/lib/routing/workbench-auxiliary-routes-registrator.service.mjs +1 -2
- package/esm2022/lib/routing/workbench-dialog-differ.mjs +51 -0
- package/esm2022/lib/routing/workbench-navigational-states.mjs +28 -18
- package/esm2022/lib/routing/workbench-route-data.mjs +6 -15
- package/esm2022/lib/routing/workbench-router-link.directive.mjs +2 -3
- package/esm2022/lib/routing/workbench-router.service.mjs +5 -5
- package/esm2022/lib/routing/workbench-url-observer.service.mjs +37 -12
- package/esm2022/lib/view/view.component.mjs +6 -9
- package/esm2022/lib/view/workbench-view.model.mjs +1 -1
- package/esm2022/lib/view//311/265workbench-view.model.mjs +34 -6
- package/esm2022/lib/view-dnd/grid-drop-targets.util.mjs +49 -0
- package/esm2022/lib/view-dnd/view-drag.service.mjs +1 -1
- package/esm2022/lib/view-dnd/view-tab-drag-image-renderer.service.mjs +6 -6
- package/esm2022/lib/workbench.constants.mjs +6 -2
- package/fesm2022/scion-workbench.mjs +1065 -544
- package/fesm2022/scion-workbench.mjs.map +1 -1
- package/lib/common/class-list.d.ts +51 -0
- package/lib/common/grid-element-if-visible.pipe.d.ts +13 -0
- package/lib/dialog/workbench-dialog.d.ts +2 -6
- package/lib/dialog/workbench-dialog.options.d.ts +1 -1
- package/lib/dialog//311/265workbench-dialog.d.ts +2 -4
- package/lib/layout/main-area-layout/main-area-layout.component.d.ts +4 -7
- package/lib/layout/workbench-layout.component.d.ts +3 -3
- package/lib/layout/workbench-layouts.util.d.ts +10 -0
- package/lib/logging/logger-names.d.ts +7 -7
- package/lib/logging/logger.d.ts +5 -1
- package/lib/logging//311/265logger.d.ts +1 -1
- package/lib/microfrontend-platform/common/microfrontend.util.d.ts +22 -0
- package/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.d.ts +15 -9
- package/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-capability-validator.interceptor.d.ts +11 -0
- package/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-intent-handler.interceptor.d.ts +28 -0
- package/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog.component.d.ts +52 -0
- package/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.d.ts +37 -0
- package/lib/microfrontend-platform/microfrontend-popup/{microfrontend-popup-capability-interceptor.service.d.ts → microfrontend-popup-capability-validator.interceptor.d.ts} +3 -3
- package/lib/microfrontend-platform/microfrontend-popup/{microfrontend-popup-intent-interceptor.service.d.ts → microfrontend-popup-intent-handler.interceptor.d.ts} +9 -6
- package/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.d.ts +7 -10
- package/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.d.ts +2 -9
- package/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.d.ts +8 -14
- package/lib/microfrontend-platform/microfrontend-view/microfrontend-workbench-view.model.d.ts +14 -0
- package/lib/microfrontend-platform/routing/microfrontend-view-capability-id-assigner.interceptor.d.ts +10 -0
- package/lib/microfrontend-platform/routing/{microfrontend-view-capability-interceptor.service.d.ts → microfrontend-view-capability-validator.interceptor.d.ts} +3 -3
- package/lib/microfrontend-platform/routing/{microfrontend-view-intent-interceptor.service.d.ts → microfrontend-view-intent-handler.interceptor.d.ts} +6 -5
- package/lib/microfrontend-platform/routing/microfrontend-view-routes.d.ts +49 -0
- package/lib/microfrontend-platform/workbench-microfrontend-support.d.ts +1 -0
- package/lib/part/view-context-menu/view-menu.service.d.ts +3 -2
- package/lib/perspective/workbench-perspective-storage.service.d.ts +1 -1
- package/lib/perspective/workbench-perspective-view-conflict-resolver.service.d.ts +1 -1
- package/lib/routing/public_api.d.ts +2 -1
- package/lib/routing/router.util.d.ts +12 -20
- package/lib/routing/routing.model.d.ts +30 -0
- package/lib/routing/workbench-auxiliary-routes-registrator.service.d.ts +2 -3
- package/lib/routing/workbench-dialog-differ.d.ts +25 -0
- package/lib/routing/workbench-navigational-states.d.ts +16 -13
- package/lib/routing/workbench-route-data.d.ts +5 -13
- package/lib/routing/workbench-router.service.d.ts +7 -22
- package/lib/routing/workbench-url-observer.service.d.ts +13 -1
- package/lib/view/workbench-view.model.d.ts +9 -8
- package/lib/view//311/265workbench-view.model.d.ts +21 -2
- package/lib/view-dnd/grid-drop-targets.util.d.ts +22 -0
- package/lib/view-dnd/view-drag.service.d.ts +58 -47
- package/lib/workbench.constants.d.ts +4 -0
- package/package.json +2 -2
- package/esm2022/lib/common/grid-element-visible.pipe.mjs +0 -29
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-capability-interceptor.service.mjs +0 -30
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-interceptor.service.mjs +0 -130
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-navigational-states.mjs +0 -22
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-routes.mjs +0 -71
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-interceptor.service.mjs +0 -54
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-intent-interceptor.service.mjs +0 -123
- package/esm2022/lib/routing/navigation-state.resolver.mjs +0 -54
- package/lib/common/grid-element-visible.pipe.d.ts +0 -13
- package/lib/microfrontend-platform/routing/microfrontend-navigational-states.d.ts +0 -11
- package/lib/microfrontend-platform/routing/microfrontend-routes.d.ts +0 -38
- package/lib/routing/navigation-state.resolver.d.ts +0 -12
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { NgZone, OnDestroy } from '@angular/core';
|
|
2
2
|
import { Observable } from 'rxjs';
|
|
3
3
|
import { UrlSegment } from '@angular/router';
|
|
4
|
+
import { ClassListMap } from '../common/class-list';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
/**
|
|
6
7
|
* Events fired during view drag and drop operation.
|
|
@@ -130,62 +131,72 @@ export interface ViewDragData {
|
|
|
130
131
|
viewTabWidth: number;
|
|
131
132
|
viewTabHeight: number;
|
|
132
133
|
workbenchId: string;
|
|
134
|
+
classList?: ClassListMap;
|
|
133
135
|
}
|
|
134
136
|
/**
|
|
135
137
|
* Event emitted when moving a view.
|
|
136
138
|
*/
|
|
137
139
|
export interface ViewMoveEvent {
|
|
138
|
-
source:
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
140
|
+
source: ViewMoveEventSource;
|
|
141
|
+
target: ViewMoveEventTarget;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Describes a view to be moved to another location.
|
|
145
|
+
*/
|
|
146
|
+
export interface ViewMoveEventSource {
|
|
147
|
+
viewId: string;
|
|
148
|
+
partId: string;
|
|
149
|
+
viewUrlSegments: UrlSegment[];
|
|
150
|
+
workbenchId: string;
|
|
151
|
+
classList?: ClassListMap;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Describes the target location for moving a view.
|
|
155
|
+
*/
|
|
156
|
+
export interface ViewMoveEventTarget {
|
|
157
|
+
/**
|
|
158
|
+
* Part (or node) where (or relative to which) to add the view.
|
|
159
|
+
*
|
|
160
|
+
* Rules for different regions:
|
|
161
|
+
* - If not specifying a region, {@link elementId} is mandatory and must reference a part.
|
|
162
|
+
* - For regions `north`, `south`, `east`, or `west`, {@link elementId} can reference a part or node,
|
|
163
|
+
* relative to which to align the view. If not set, the view is aligned relative to the root of
|
|
164
|
+
* the entire layout.
|
|
165
|
+
*
|
|
166
|
+
* Note: Property is ignored when moving the view to a new window.
|
|
167
|
+
*/
|
|
168
|
+
elementId?: string;
|
|
169
|
+
/**
|
|
170
|
+
* Region of {@link elementId} where to add the view (in a new part).
|
|
171
|
+
*
|
|
172
|
+
* If not specified, {@link elementId} must reference a part to which to add the view.
|
|
173
|
+
*
|
|
174
|
+
* Note:
|
|
175
|
+
* - Property is ignored when moving the view to a new window.
|
|
176
|
+
* - Property is required if {@link elementId} is a node.
|
|
177
|
+
*/
|
|
178
|
+
region?: 'north' | 'east' | 'south' | 'west';
|
|
179
|
+
/**
|
|
180
|
+
* Position where to insert the view. The position is zero-based. If not set, adds the view after the active view.
|
|
181
|
+
*/
|
|
182
|
+
position?: number | 'start' | 'end';
|
|
183
|
+
/**
|
|
184
|
+
* Identifier of the target workbench, or 'new-window' to move the view to a new browser window.
|
|
185
|
+
*/
|
|
186
|
+
workbenchId: string | 'new-window';
|
|
187
|
+
/**
|
|
188
|
+
* Describes the part to be created if the region is 'north', 'east', 'south', or 'west'.
|
|
189
|
+
*/
|
|
190
|
+
newPart?: {
|
|
171
191
|
/**
|
|
172
|
-
*
|
|
192
|
+
* Identity of the new part. If not set, assigns a UUID.
|
|
173
193
|
*/
|
|
174
|
-
|
|
194
|
+
id?: string;
|
|
175
195
|
/**
|
|
176
|
-
*
|
|
196
|
+
* Proportional size of the part relative to the reference part.
|
|
197
|
+
* The ratio is the closed interval [0,1]. If not set, defaults to `0.5`.
|
|
177
198
|
*/
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* Identity of the new part. If not set, assigns a UUID.
|
|
181
|
-
*/
|
|
182
|
-
id?: string;
|
|
183
|
-
/**
|
|
184
|
-
* Proportional size of the part relative to the reference part.
|
|
185
|
-
* The ratio is the closed interval [0,1]. If not set, defaults to `0.5`.
|
|
186
|
-
*/
|
|
187
|
-
ratio?: number;
|
|
188
|
-
};
|
|
199
|
+
ratio?: number;
|
|
189
200
|
};
|
|
190
201
|
}
|
|
191
202
|
export interface ViewDragEventListenerOptions extends EventListenerOptions {
|
|
@@ -16,6 +16,10 @@ export declare const VIEW_ID_PREFIX = "view.";
|
|
|
16
16
|
* Represents the id prefix of popups.
|
|
17
17
|
*/
|
|
18
18
|
export declare const POPUP_ID_PREFIX = "popup.";
|
|
19
|
+
/**
|
|
20
|
+
* Represents the id prefix of dialogs.
|
|
21
|
+
*/
|
|
22
|
+
export declare const DIALOG_ID_PREFIX = "dialog.";
|
|
19
23
|
/**
|
|
20
24
|
* Name of the query parameter that contains the layout of the main area.
|
|
21
25
|
*/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@scion/workbench",
|
|
3
|
-
"version": "17.0.0-beta.
|
|
3
|
+
"version": "17.0.0-beta.7",
|
|
4
4
|
"description": "SCION Workbench enables the creation of Angular web applications that require a flexible layout to arrange content side-by-side or stacked, all personalizable by the user via drag & drop.",
|
|
5
5
|
"license": "EPL-2.0",
|
|
6
6
|
"private": false,
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"@scion/components": "^17.0.0",
|
|
40
40
|
"@scion/toolkit": "^1.4.0",
|
|
41
41
|
"@scion/microfrontend-platform": "^1.2.1",
|
|
42
|
-
"@scion/workbench-client": "^1.0.0-beta.
|
|
42
|
+
"@scion/workbench-client": "^1.0.0-beta.21",
|
|
43
43
|
"rxjs": "^7.8.0"
|
|
44
44
|
},
|
|
45
45
|
"peerDependenciesMeta": {
|
|
@@ -1,29 +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 { isGridElementVisible } from '../layout/ɵworkbench-layout';
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
/**
|
|
14
|
-
* Tests if given element is visible.
|
|
15
|
-
*
|
|
16
|
-
* @see isGridElementVisible
|
|
17
|
-
*/
|
|
18
|
-
export class GridElementVisiblePipe {
|
|
19
|
-
transform(gridElement) {
|
|
20
|
-
return !!gridElement && isGridElementVisible(gridElement);
|
|
21
|
-
}
|
|
22
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: GridElementVisiblePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
23
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.0.3", ngImport: i0, type: GridElementVisiblePipe, isStandalone: true, name: "wbGridElementVisible" }); }
|
|
24
|
-
}
|
|
25
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: GridElementVisiblePipe, decorators: [{
|
|
26
|
-
type: Pipe,
|
|
27
|
-
args: [{ name: 'wbGridElementVisible', standalone: true }]
|
|
28
|
-
}] });
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1lbGVtZW50LXZpc2libGUucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL2NvbW1vbi9ncmlkLWVsZW1lbnQtdmlzaWJsZS5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFDLElBQUksRUFBZ0IsTUFBTSxlQUFlLENBQUM7QUFFbEQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7O0FBRWpFOzs7O0dBSUc7QUFFSCxNQUFNLE9BQU8sc0JBQXNCO0lBRTFCLFNBQVMsQ0FBQyxXQUFpRDtRQUNoRSxPQUFPLENBQUMsQ0FBQyxXQUFXLElBQUksb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDNUQsQ0FBQzs4R0FKVSxzQkFBc0I7NEdBQXRCLHNCQUFzQjs7MkZBQXRCLHNCQUFzQjtrQkFEbEMsSUFBSTttQkFBQyxFQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDIzIFN3aXNzIEZlZGVyYWwgUmFpbHdheXNcbiAqXG4gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlXG4gKiBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMFxuICogd2hpY2ggaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiAqL1xuXG5pbXBvcnQge1BpcGUsIFBpcGVUcmFuc2Zvcm19IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtNUGFydCwgTVRyZWVOb2RlfSBmcm9tICcuLi9sYXlvdXQvd29ya2JlbmNoLWxheW91dC5tb2RlbCc7XG5pbXBvcnQge2lzR3JpZEVsZW1lbnRWaXNpYmxlfSBmcm9tICcuLi9sYXlvdXQvybV3b3JrYmVuY2gtbGF5b3V0JztcblxuLyoqXG4gKiBUZXN0cyBpZiBnaXZlbiBlbGVtZW50IGlzIHZpc2libGUuXG4gKlxuICogQHNlZSBpc0dyaWRFbGVtZW50VmlzaWJsZVxuICovXG5AUGlwZSh7bmFtZTogJ3diR3JpZEVsZW1lbnRWaXNpYmxlJywgc3RhbmRhbG9uZTogdHJ1ZX0pXG5leHBvcnQgY2xhc3MgR3JpZEVsZW1lbnRWaXNpYmxlUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuXG4gIHB1YmxpYyB0cmFuc2Zvcm0oZ3JpZEVsZW1lbnQ6IE1UcmVlTm9kZSB8IE1QYXJ0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IGdyaWRFbGVtZW50IGlzIChNVHJlZU5vZGUgfCBNUGFydCkge1xuICAgIHJldHVybiAhIWdyaWRFbGVtZW50ICYmIGlzR3JpZEVsZW1lbnRWaXNpYmxlKGdyaWRFbGVtZW50KTtcbiAgfVxufVxuIl19
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { WorkbenchCapabilities } from '@scion/workbench-client';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
/**
|
|
5
|
-
* Asserts popup capabilities to have required properties.
|
|
6
|
-
*/
|
|
7
|
-
export class MicrofrontendPopupCapabilityInterceptor {
|
|
8
|
-
async intercept(capability) {
|
|
9
|
-
if (capability.type !== WorkbenchCapabilities.Popup) {
|
|
10
|
-
return capability;
|
|
11
|
-
}
|
|
12
|
-
const popupCapability = capability;
|
|
13
|
-
// Assert the popup capability to have a qualifier set.
|
|
14
|
-
if (!popupCapability.qualifier || !Object.keys(popupCapability.qualifier).length) {
|
|
15
|
-
throw Error(`[NullQualifierError] Popup capability requires a qualifier [capability=${JSON.stringify(popupCapability)}]`);
|
|
16
|
-
}
|
|
17
|
-
// Assert the popup capability to have a path set.
|
|
18
|
-
const path = popupCapability.properties?.path;
|
|
19
|
-
if (path === undefined || path === null) {
|
|
20
|
-
throw Error(`[NullPathError] Popup capability requires a path to the microfrontend in its properties [capability=${JSON.stringify(popupCapability)}]`);
|
|
21
|
-
}
|
|
22
|
-
return popupCapability;
|
|
23
|
-
}
|
|
24
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: MicrofrontendPopupCapabilityInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
25
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: MicrofrontendPopupCapabilityInterceptor }); }
|
|
26
|
-
}
|
|
27
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: MicrofrontendPopupCapabilityInterceptor, decorators: [{
|
|
28
|
-
type: Injectable
|
|
29
|
-
}] });
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm9mcm9udGVuZC1wb3B1cC1jYXBhYmlsaXR5LWludGVyY2VwdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi9taWNyb2Zyb250ZW5kLXBsYXRmb3JtL21pY3JvZnJvbnRlbmQtcG9wdXAvbWljcm9mcm9udGVuZC1wb3B1cC1jYXBhYmlsaXR5LWludGVyY2VwdG9yLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBV0EsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMscUJBQXFCLEVBQTJCLE1BQU0seUJBQXlCLENBQUM7O0FBRXhGOztHQUVHO0FBRUgsTUFBTSxPQUFPLHVDQUF1QztJQUUzQyxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQXNCO1FBQzNDLElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUU7WUFDbkQsT0FBTyxVQUFVLENBQUM7U0FDbkI7UUFFRCxNQUFNLGVBQWUsR0FBRyxVQUFzQyxDQUFDO1FBQy9ELHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRTtZQUNoRixNQUFNLEtBQUssQ0FBQywwRUFBMEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDM0g7UUFFRCxrREFBa0Q7UUFDbEQsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUM7UUFDOUMsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7WUFDdkMsTUFBTSxLQUFLLENBQUMsdUdBQXVHLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3hKO1FBRUQsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQzs4R0FwQlUsdUNBQXVDO2tIQUF2Qyx1Q0FBdUM7OzJGQUF2Qyx1Q0FBdUM7a0JBRG5ELFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjIgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7Q2FwYWJpbGl0eSwgQ2FwYWJpbGl0eUludGVyY2VwdG9yfSBmcm9tICdAc2Npb24vbWljcm9mcm9udGVuZC1wbGF0Zm9ybSc7XG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtXb3JrYmVuY2hDYXBhYmlsaXRpZXMsIFdvcmtiZW5jaFBvcHVwQ2FwYWJpbGl0eX0gZnJvbSAnQHNjaW9uL3dvcmtiZW5jaC1jbGllbnQnO1xuXG4vKipcbiAqIEFzc2VydHMgcG9wdXAgY2FwYWJpbGl0aWVzIHRvIGhhdmUgcmVxdWlyZWQgcHJvcGVydGllcy5cbiAqL1xuQEluamVjdGFibGUoLyogRE8gTk9UIFBST1ZJREUgdmlhICdwcm92aWRlZEluJyBtZXRhZGF0YSBhcyBvbmx5IHJlZ2lzdGVyZWQgaWYgbWljcm9mcm9udGVuZCBzdXBwb3J0IGlzIGVuYWJsZWQuICovKVxuZXhwb3J0IGNsYXNzIE1pY3JvZnJvbnRlbmRQb3B1cENhcGFiaWxpdHlJbnRlcmNlcHRvciBpbXBsZW1lbnRzIENhcGFiaWxpdHlJbnRlcmNlcHRvciB7XG5cbiAgcHVibGljIGFzeW5jIGludGVyY2VwdChjYXBhYmlsaXR5OiBDYXBhYmlsaXR5KTogUHJvbWlzZTxDYXBhYmlsaXR5PiB7XG4gICAgaWYgKGNhcGFiaWxpdHkudHlwZSAhPT0gV29ya2JlbmNoQ2FwYWJpbGl0aWVzLlBvcHVwKSB7XG4gICAgICByZXR1cm4gY2FwYWJpbGl0eTtcbiAgICB9XG5cbiAgICBjb25zdCBwb3B1cENhcGFiaWxpdHkgPSBjYXBhYmlsaXR5IGFzIFdvcmtiZW5jaFBvcHVwQ2FwYWJpbGl0eTtcbiAgICAvLyBBc3NlcnQgdGhlIHBvcHVwIGNhcGFiaWxpdHkgdG8gaGF2ZSBhIHF1YWxpZmllciBzZXQuXG4gICAgaWYgKCFwb3B1cENhcGFiaWxpdHkucXVhbGlmaWVyIHx8ICFPYmplY3Qua2V5cyhwb3B1cENhcGFiaWxpdHkucXVhbGlmaWVyKS5sZW5ndGgpIHtcbiAgICAgIHRocm93IEVycm9yKGBbTnVsbFF1YWxpZmllckVycm9yXSBQb3B1cCBjYXBhYmlsaXR5IHJlcXVpcmVzIGEgcXVhbGlmaWVyIFtjYXBhYmlsaXR5PSR7SlNPTi5zdHJpbmdpZnkocG9wdXBDYXBhYmlsaXR5KX1dYCk7XG4gICAgfVxuXG4gICAgLy8gQXNzZXJ0IHRoZSBwb3B1cCBjYXBhYmlsaXR5IHRvIGhhdmUgYSBwYXRoIHNldC5cbiAgICBjb25zdCBwYXRoID0gcG9wdXBDYXBhYmlsaXR5LnByb3BlcnRpZXM/LnBhdGg7XG4gICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCB8fCBwYXRoID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBFcnJvcihgW051bGxQYXRoRXJyb3JdIFBvcHVwIGNhcGFiaWxpdHkgcmVxdWlyZXMgYSBwYXRoIHRvIHRoZSBtaWNyb2Zyb250ZW5kIGluIGl0cyBwcm9wZXJ0aWVzIFtjYXBhYmlsaXR5PSR7SlNPTi5zdHJpbmdpZnkocG9wdXBDYXBhYmlsaXR5KX1dYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvcHVwQ2FwYWJpbGl0eTtcbiAgfVxufVxuIl19
|
|
@@ -1,130 +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 { Injectable } from '@angular/core';
|
|
11
|
-
import { APP_IDENTITY, mapToBody, MessageClient, MessageHeaders, ResponseStatusCodes } from '@scion/microfrontend-platform';
|
|
12
|
-
import { WorkbenchCapabilities, ɵWorkbenchCommands } from '@scion/workbench-client';
|
|
13
|
-
import { MicrofrontendPopupComponent } from './microfrontend-popup.component';
|
|
14
|
-
import { LoggerNames } from '../../logging';
|
|
15
|
-
import { Beans } from '@scion/toolkit/bean-manager';
|
|
16
|
-
import { stringifyError } from '../../common/stringify-error.util';
|
|
17
|
-
import { Arrays, Maps } from '@scion/toolkit/util';
|
|
18
|
-
import { MicrofrontendViewRoutes } from '../routing/microfrontend-routes';
|
|
19
|
-
import { MicrofrontendHostPopupComponent } from '../microfrontend-host-popup/microfrontend-host-popup.component';
|
|
20
|
-
import * as i0 from "@angular/core";
|
|
21
|
-
import * as i1 from "../../popup/popup.service";
|
|
22
|
-
import * as i2 from "../../view/workbench-view.registry";
|
|
23
|
-
import * as i3 from "../../logging";
|
|
24
|
-
/**
|
|
25
|
-
* Handles microfrontend popup intents, instructing the Workbench {@link PopupService} to navigate to the microfrontend of a given popup capability.
|
|
26
|
-
*
|
|
27
|
-
* Popup intents are handled in this interceptor in order to support microfrontends not using the SCION Workbench. They are not transported to the providing application.
|
|
28
|
-
*/
|
|
29
|
-
export class MicrofrontendPopupIntentInterceptor {
|
|
30
|
-
constructor(_popupService, _viewRegistry, _logger) {
|
|
31
|
-
this._popupService = _popupService;
|
|
32
|
-
this._viewRegistry = _viewRegistry;
|
|
33
|
-
this._logger = _logger;
|
|
34
|
-
this._openedPopups = new Set();
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Popup intents are handled in this interceptor and then swallowed.
|
|
38
|
-
*/
|
|
39
|
-
intercept(intentMessage, next) {
|
|
40
|
-
if (intentMessage.intent.type === WorkbenchCapabilities.Popup) {
|
|
41
|
-
// Do not block the call until the popup is closed.
|
|
42
|
-
// Otherwise, the caller may receive a timeout error if not closing the popup before delivery confirmation expires.
|
|
43
|
-
this.consumePopupIntent(intentMessage).catch(error => this._logger.error('[PopupOpenError] Failed to open popup.', LoggerNames.MICROFRONTEND, intentMessage, error));
|
|
44
|
-
return Promise.resolve();
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
return next.handle(intentMessage);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
async consumePopupIntent(message) {
|
|
51
|
-
const popupId = message.body.popupId;
|
|
52
|
-
const replyTo = message.headers.get(MessageHeaders.ReplyTo);
|
|
53
|
-
// Ignore subsequent intents if a popup is already open, as it would lead to the first popup being closed.
|
|
54
|
-
if (this._openedPopups.has(popupId)) {
|
|
55
|
-
this._logger.warn('Ignoring popup intent because multiple popup providers found that match the popup intent. Most likely this is not intended and may indicate an incorrect manifest configuration.', message.intent);
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
this._openedPopups.add(popupId);
|
|
59
|
-
try {
|
|
60
|
-
const result = await this.openPopup(message);
|
|
61
|
-
await Beans.get(MessageClient).publish(replyTo, result, { headers: new Map().set(MessageHeaders.Status, ResponseStatusCodes.TERMINAL) });
|
|
62
|
-
}
|
|
63
|
-
catch (error) {
|
|
64
|
-
await Beans.get(MessageClient).publish(replyTo, stringifyError(error), { headers: new Map().set(MessageHeaders.Status, ResponseStatusCodes.ERROR) });
|
|
65
|
-
}
|
|
66
|
-
finally {
|
|
67
|
-
this._openedPopups.delete(popupId);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Opens a workbench popup for displaying the microfrontend of a popup capability.
|
|
72
|
-
*/
|
|
73
|
-
async openPopup(message) {
|
|
74
|
-
const command = message.body;
|
|
75
|
-
const capability = message.capability;
|
|
76
|
-
const isHostProvider = capability.metadata.appSymbolicName === Beans.get(APP_IDENTITY);
|
|
77
|
-
this._logger.debug(() => 'Handling microfrontend popup command', LoggerNames.MICROFRONTEND, command);
|
|
78
|
-
const popupContext = {
|
|
79
|
-
popupId: command.popupId,
|
|
80
|
-
capability: capability,
|
|
81
|
-
params: new Map([
|
|
82
|
-
...Maps.coerce(message.intent.params),
|
|
83
|
-
...Maps.coerce(message.intent.qualifier),
|
|
84
|
-
]),
|
|
85
|
-
closeOnFocusLost: command.closeStrategy?.onFocusLost ?? true,
|
|
86
|
-
referrer: this.getReferrer(command),
|
|
87
|
-
};
|
|
88
|
-
return this._popupService.open({
|
|
89
|
-
component: isHostProvider ? MicrofrontendHostPopupComponent : MicrofrontendPopupComponent,
|
|
90
|
-
input: popupContext,
|
|
91
|
-
anchor: this.observePopupOrigin$(command),
|
|
92
|
-
context: command.context,
|
|
93
|
-
align: command.align,
|
|
94
|
-
size: capability.properties?.size,
|
|
95
|
-
closeStrategy: isHostProvider ? command.closeStrategy : {
|
|
96
|
-
...command.closeStrategy,
|
|
97
|
-
onFocusLost: false, // Closing the popup on focus loss is handled in {MicrofrontendPopupComponent}
|
|
98
|
-
},
|
|
99
|
-
cssClass: Arrays.coerce(capability.properties?.cssClass).concat(Arrays.coerce(command.cssClass)),
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Constructs an Observable that, upon subscription, emits the position of the popup anchor, and then each time it is repositioned.
|
|
104
|
-
*/
|
|
105
|
-
observePopupOrigin$(command) {
|
|
106
|
-
return Beans.get(MessageClient).observe$(ɵWorkbenchCommands.popupOriginTopic(command.popupId)).pipe(mapToBody());
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Returns information about the context in which a popup was opened.
|
|
110
|
-
*/
|
|
111
|
-
getReferrer(command) {
|
|
112
|
-
if (!command.context?.viewId) {
|
|
113
|
-
return {};
|
|
114
|
-
}
|
|
115
|
-
const view = this._viewRegistry.get(command.context.viewId);
|
|
116
|
-
if (!MicrofrontendViewRoutes.isMicrofrontendRoute(view.urlSegments)) {
|
|
117
|
-
return { viewId: view.id };
|
|
118
|
-
}
|
|
119
|
-
return {
|
|
120
|
-
viewId: view.id,
|
|
121
|
-
viewCapabilityId: MicrofrontendViewRoutes.parseParams(view.urlSegments).viewCapabilityId,
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: MicrofrontendPopupIntentInterceptor, deps: [{ token: i1.PopupService }, { token: i2.WorkbenchViewRegistry }, { token: i3.Logger }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
125
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: MicrofrontendPopupIntentInterceptor }); }
|
|
126
|
-
}
|
|
127
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: MicrofrontendPopupIntentInterceptor, decorators: [{
|
|
128
|
-
type: Injectable
|
|
129
|
-
}], ctorParameters: () => [{ type: i1.PopupService }, { type: i2.WorkbenchViewRegistry }, { type: i3.Logger }] });
|
|
130
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm9mcm9udGVuZC1wb3B1cC1pbnRlbnQtaW50ZXJjZXB0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL21pY3JvZnJvbnRlbmQtcGxhdGZvcm0vbWljcm9mcm9udGVuZC1wb3B1cC9taWNyb2Zyb250ZW5kLXBvcHVwLWludGVudC1pbnRlcmNlcHRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsWUFBWSxFQUE2QyxTQUFTLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQ3JLLE9BQU8sRUFBQyxxQkFBcUIsRUFBbUUsa0JBQWtCLEVBQXlCLE1BQU0seUJBQXlCLENBQUM7QUFDM0ssT0FBTyxFQUFDLDJCQUEyQixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFFNUUsT0FBTyxFQUFTLFdBQVcsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDbEQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQ2pFLE9BQU8sRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFJakQsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDeEUsT0FBTyxFQUFDLCtCQUErQixFQUFDLE1BQU0sZ0VBQWdFLENBQUM7Ozs7O0FBRS9HOzs7O0dBSUc7QUFFSCxNQUFNLE9BQU8sbUNBQW1DO0lBSTlDLFlBQW9CLGFBQTJCLEVBQzNCLGFBQW9DLEVBQ3BDLE9BQWU7UUFGZixrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUMz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QUFhLENBQUMsQ0FBQyxRQUFRLENBQWMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDaEksQ0FBQztJQUVEOztPQUVHO0lBQ0ssV0FBVyxDQUFDLE9BQStCO1FBQ2pELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRTtZQUM1QixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsdUJBQXVCLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ25FLE9BQU8sRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBQyxDQUFDO1NBQzFCO1FBRUQsT0FBTztZQUNMLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNmLGdCQUFnQixFQUFFLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsZ0JBQWdCO1NBQ3pGLENBQUM7SUFDSixDQUFDOzhHQTFHVSxtQ0FBbUM7a0hBQW5DLG1DQUFtQzs7MkZBQW5DLG1DQUFtQztrQkFEL0MsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMiBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QVBQX0lERU5USVRZLCBIYW5kbGVyLCBJbnRlbnRJbnRlcmNlcHRvciwgSW50ZW50TWVzc2FnZSwgbWFwVG9Cb2R5LCBNZXNzYWdlQ2xpZW50LCBNZXNzYWdlSGVhZGVycywgUmVzcG9uc2VTdGF0dXNDb2Rlc30gZnJvbSAnQHNjaW9uL21pY3JvZnJvbnRlbmQtcGxhdGZvcm0nO1xuaW1wb3J0IHtXb3JrYmVuY2hDYXBhYmlsaXRpZXMsIFdvcmtiZW5jaFBvcHVwQ2FwYWJpbGl0eSwgV29ya2JlbmNoUG9wdXBSZWZlcnJlciwgybVQb3B1cENvbnRleHQsIMm1V29ya2JlbmNoQ29tbWFuZHMsIMm1V29ya2JlbmNoUG9wdXBDb21tYW5kfSBmcm9tICdAc2Npb24vd29ya2JlbmNoLWNsaWVudCc7XG5pbXBvcnQge01pY3JvZnJvbnRlbmRQb3B1cENvbXBvbmVudH0gZnJvbSAnLi9taWNyb2Zyb250ZW5kLXBvcHVwLmNvbXBvbmVudCc7XG5pbXBvcnQge09ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtMb2dnZXIsIExvZ2dlck5hbWVzfSBmcm9tICcuLi8uLi9sb2dnaW5nJztcbmltcG9ydCB7QmVhbnN9IGZyb20gJ0BzY2lvbi90b29sa2l0L2JlYW4tbWFuYWdlcic7XG5pbXBvcnQge3N0cmluZ2lmeUVycm9yfSBmcm9tICcuLi8uLi9jb21tb24vc3RyaW5naWZ5LWVycm9yLnV0aWwnO1xuaW1wb3J0IHtBcnJheXMsIE1hcHN9IGZyb20gJ0BzY2lvbi90b29sa2l0L3V0aWwnO1xuaW1wb3J0IHtQb3B1cFNlcnZpY2V9IGZyb20gJy4uLy4uL3BvcHVwL3BvcHVwLnNlcnZpY2UnO1xuaW1wb3J0IHtQb3B1cE9yaWdpbn0gZnJvbSAnLi4vLi4vcG9wdXAvcG9wdXAub3JpZ2luJztcbmltcG9ydCB7V29ya2JlbmNoVmlld1JlZ2lzdHJ5fSBmcm9tICcuLi8uLi92aWV3L3dvcmtiZW5jaC12aWV3LnJlZ2lzdHJ5JztcbmltcG9ydCB7TWljcm9mcm9udGVuZFZpZXdSb3V0ZXN9IGZyb20gJy4uL3JvdXRpbmcvbWljcm9mcm9udGVuZC1yb3V0ZXMnO1xuaW1wb3J0IHtNaWNyb2Zyb250ZW5kSG9zdFBvcHVwQ29tcG9uZW50fSBmcm9tICcuLi9taWNyb2Zyb250ZW5kLWhvc3QtcG9wdXAvbWljcm9mcm9udGVuZC1ob3N0LXBvcHVwLmNvbXBvbmVudCc7XG5cbi8qKlxuICogSGFuZGxlcyBtaWNyb2Zyb250ZW5kIHBvcHVwIGludGVudHMsIGluc3RydWN0aW5nIHRoZSBXb3JrYmVuY2gge0BsaW5rIFBvcHVwU2VydmljZX0gdG8gbmF2aWdhdGUgdG8gdGhlIG1pY3JvZnJvbnRlbmQgb2YgYSBnaXZlbiBwb3B1cCBjYXBhYmlsaXR5LlxuICpcbiAqIFBvcHVwIGludGVudHMgYXJlIGhhbmRsZWQgaW4gdGhpcyBpbnRlcmNlcHRvciBpbiBvcmRlciB0byBzdXBwb3J0IG1pY3JvZnJvbnRlbmRzIG5vdCB1c2luZyB0aGUgU0NJT04gV29ya2JlbmNoLiBUaGV5IGFyZSBub3QgdHJhbnNwb3J0ZWQgdG8gdGhlIHByb3ZpZGluZyBhcHBsaWNhdGlvbi5cbiAqL1xuQEluamVjdGFibGUoLyogRE8gTk9UIFBST1ZJREUgdmlhICdwcm92aWRlZEluJyBtZXRhZGF0YSBhcyBvbmx5IHJlZ2lzdGVyZWQgaWYgbWljcm9mcm9udGVuZCBzdXBwb3J0IGlzIGVuYWJsZWQuICovKVxuZXhwb3J0IGNsYXNzIE1pY3JvZnJvbnRlbmRQb3B1cEludGVudEludGVyY2VwdG9yIGltcGxlbWVudHMgSW50ZW50SW50ZXJjZXB0b3Ige1xuXG4gIHByaXZhdGUgX29wZW5lZFBvcHVwcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3BvcHVwU2VydmljZTogUG9wdXBTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF92aWV3UmVnaXN0cnk6IFdvcmtiZW5jaFZpZXdSZWdpc3RyeSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfbG9nZ2VyOiBMb2dnZXIpIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3B1cCBpbnRlbnRzIGFyZSBoYW5kbGVkIGluIHRoaXMgaW50ZXJjZXB0b3IgYW5kIHRoZW4gc3dhbGxvd2VkLlxuICAgKi9cbiAgcHVibGljIGludGVyY2VwdChpbnRlbnRNZXNzYWdlOiBJbnRlbnRNZXNzYWdlLCBuZXh0OiBIYW5kbGVyPEludGVudE1lc3NhZ2U+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGludGVudE1lc3NhZ2UuaW50ZW50LnR5cGUgPT09IFdvcmtiZW5jaENhcGFiaWxpdGllcy5Qb3B1cCkge1xuICAgICAgLy8gRG8gbm90IGJsb2NrIHRoZSBjYWxsIHVudGlsIHRoZSBwb3B1cCBpcyBjbG9zZWQuXG4gICAgICAvLyBPdGhlcndpc2UsIHRoZSBjYWxsZXIgbWF5IHJlY2VpdmUgYSB0aW1lb3V0IGVycm9yIGlmIG5vdCBjbG9zaW5nIHRoZSBwb3B1cCBiZWZvcmUgZGVsaXZlcnkgY29uZmlybWF0aW9uIGV4cGlyZXMuXG4gICAgICB0aGlzLmNvbnN1bWVQb3B1cEludGVudChpbnRlbnRNZXNzYWdlKS5jYXRjaChlcnJvciA9PiB0aGlzLl9sb2dnZXIuZXJyb3IoJ1tQb3B1cE9wZW5FcnJvcl0gRmFpbGVkIHRvIG9wZW4gcG9wdXAuJywgTG9nZ2VyTmFtZXMuTUlDUk9GUk9OVEVORCwgaW50ZW50TWVzc2FnZSwgZXJyb3IpKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gbmV4dC5oYW5kbGUoaW50ZW50TWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb25zdW1lUG9wdXBJbnRlbnQobWVzc2FnZTogSW50ZW50TWVzc2FnZTzJtVdvcmtiZW5jaFBvcHVwQ29tbWFuZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwb3B1cElkID0gbWVzc2FnZS5ib2R5IS5wb3B1cElkO1xuICAgIGNvbnN0IHJlcGx5VG8gPSBtZXNzYWdlLmhlYWRlcnMuZ2V0KE1lc3NhZ2VIZWFkZXJzLlJlcGx5VG8pO1xuXG4gICAgLy8gSWdub3JlIHN1YnNlcXVlbnQgaW50ZW50cyBpZiBhIHBvcHVwIGlzIGFscmVhZHkgb3BlbiwgYXMgaXQgd291bGQgbGVhZCB0byB0aGUgZmlyc3QgcG9wdXAgYmVpbmcgY2xvc2VkLlxuICAgIGlmICh0aGlzLl9vcGVuZWRQb3B1cHMuaGFzKHBvcHVwSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybignSWdub3JpbmcgcG9wdXAgaW50ZW50IGJlY2F1c2UgbXVsdGlwbGUgcG9wdXAgcHJvdmlkZXJzIGZvdW5kIHRoYXQgbWF0Y2ggdGhlIHBvcHVwIGludGVudC4gTW9zdCBsaWtlbHkgdGhpcyBpcyBub3QgaW50ZW5kZWQgYW5kIG1heSBpbmRpY2F0ZSBhbiBpbmNvcnJlY3QgbWFuaWZlc3QgY29uZmlndXJhdGlvbi4nLCBtZXNzYWdlLmludGVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fb3BlbmVkUG9wdXBzLmFkZChwb3B1cElkKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5vcGVuUG9wdXAobWVzc2FnZSk7XG4gICAgICBhd2FpdCBCZWFucy5nZXQoTWVzc2FnZUNsaWVudCkucHVibGlzaChyZXBseVRvLCByZXN1bHQsIHtoZWFkZXJzOiBuZXcgTWFwKCkuc2V0KE1lc3NhZ2VIZWFkZXJzLlN0YXR1cywgUmVzcG9uc2VTdGF0dXNDb2Rlcy5URVJNSU5BTCl9KTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBCZWFucy5nZXQoTWVzc2FnZUNsaWVudCkucHVibGlzaChyZXBseVRvLCBzdHJpbmdpZnlFcnJvcihlcnJvciksIHtoZWFkZXJzOiBuZXcgTWFwKCkuc2V0KE1lc3NhZ2VIZWFkZXJzLlN0YXR1cywgUmVzcG9uc2VTdGF0dXNDb2Rlcy5FUlJPUil9KTtcbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICB0aGlzLl9vcGVuZWRQb3B1cHMuZGVsZXRlKHBvcHVwSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyBhIHdvcmtiZW5jaCBwb3B1cCBmb3IgZGlzcGxheWluZyB0aGUgbWljcm9mcm9udGVuZCBvZiBhIHBvcHVwIGNhcGFiaWxpdHkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG9wZW5Qb3B1cChtZXNzYWdlOiBJbnRlbnRNZXNzYWdlPMm1V29ya2JlbmNoUG9wdXBDb21tYW5kPik6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgY29tbWFuZCA9IG1lc3NhZ2UuYm9keSE7XG4gICAgY29uc3QgY2FwYWJpbGl0eSA9IG1lc3NhZ2UuY2FwYWJpbGl0eSBhcyBXb3JrYmVuY2hQb3B1cENhcGFiaWxpdHk7XG4gICAgY29uc3QgaXNIb3N0UHJvdmlkZXIgPSBjYXBhYmlsaXR5Lm1ldGFkYXRhIS5hcHBTeW1ib2xpY05hbWUgPT09IEJlYW5zLmdldChBUFBfSURFTlRJVFkpO1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiAnSGFuZGxpbmcgbWljcm9mcm9udGVuZCBwb3B1cCBjb21tYW5kJywgTG9nZ2VyTmFtZXMuTUlDUk9GUk9OVEVORCwgY29tbWFuZCk7XG5cbiAgICBjb25zdCBwb3B1cENvbnRleHQ6IMm1UG9wdXBDb250ZXh0ID0ge1xuICAgICAgcG9wdXBJZDogY29tbWFuZC5wb3B1cElkLFxuICAgICAgY2FwYWJpbGl0eTogY2FwYWJpbGl0eSxcbiAgICAgIHBhcmFtczogbmV3IE1hcChbXG4gICAgICAgIC4uLk1hcHMuY29lcmNlKG1lc3NhZ2UuaW50ZW50LnBhcmFtcyksXG4gICAgICAgIC4uLk1hcHMuY29lcmNlKG1lc3NhZ2UuaW50ZW50LnF1YWxpZmllciksXG4gICAgICBdKSxcbiAgICAgIGNsb3NlT25Gb2N1c0xvc3Q6IGNvbW1hbmQuY2xvc2VTdHJhdGVneT8ub25Gb2N1c0xvc3QgPz8gdHJ1ZSxcbiAgICAgIHJlZmVycmVyOiB0aGlzLmdldFJlZmVycmVyKGNvbW1hbmQpLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5fcG9wdXBTZXJ2aWNlLm9wZW4oe1xuICAgICAgY29tcG9uZW50OiBpc0hvc3RQcm92aWRlciA/IE1pY3JvZnJvbnRlbmRIb3N0UG9wdXBDb21wb25lbnQgOiBNaWNyb2Zyb250ZW5kUG9wdXBDb21wb25lbnQsXG4gICAgICBpbnB1dDogcG9wdXBDb250ZXh0LFxuICAgICAgYW5jaG9yOiB0aGlzLm9ic2VydmVQb3B1cE9yaWdpbiQoY29tbWFuZCksXG4gICAgICBjb250ZXh0OiBjb21tYW5kLmNvbnRleHQsXG4gICAgICBhbGlnbjogY29tbWFuZC5hbGlnbixcbiAgICAgIHNpemU6IGNhcGFiaWxpdHkucHJvcGVydGllcz8uc2l6ZSxcbiAgICAgIGNsb3NlU3RyYXRlZ3k6IGlzSG9zdFByb3ZpZGVyID8gY29tbWFuZC5jbG9zZVN0cmF0ZWd5IDoge1xuICAgICAgICAuLi5jb21tYW5kLmNsb3NlU3RyYXRlZ3ksXG4gICAgICAgIG9uRm9jdXNMb3N0OiBmYWxzZSwgLy8gQ2xvc2luZyB0aGUgcG9wdXAgb24gZm9jdXMgbG9zcyBpcyBoYW5kbGVkIGluIHtNaWNyb2Zyb250ZW5kUG9wdXBDb21wb25lbnR9XG4gICAgICB9LFxuICAgICAgY3NzQ2xhc3M6IEFycmF5cy5jb2VyY2UoY2FwYWJpbGl0eS5wcm9wZXJ0aWVzPy5jc3NDbGFzcykuY29uY2F0KEFycmF5cy5jb2VyY2UoY29tbWFuZC5jc3NDbGFzcykpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYW4gT2JzZXJ2YWJsZSB0aGF0LCB1cG9uIHN1YnNjcmlwdGlvbiwgZW1pdHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBwb3B1cCBhbmNob3IsIGFuZCB0aGVuIGVhY2ggdGltZSBpdCBpcyByZXBvc2l0aW9uZWQuXG4gICAqL1xuICBwcml2YXRlIG9ic2VydmVQb3B1cE9yaWdpbiQoY29tbWFuZDogybVXb3JrYmVuY2hQb3B1cENvbW1hbmQpOiBPYnNlcnZhYmxlPFBvcHVwT3JpZ2luPiB7XG4gICAgcmV0dXJuIEJlYW5zLmdldChNZXNzYWdlQ2xpZW50KS5vYnNlcnZlJDxQb3B1cE9yaWdpbj4oybVXb3JrYmVuY2hDb21tYW5kcy5wb3B1cE9yaWdpblRvcGljKGNvbW1hbmQucG9wdXBJZCkpLnBpcGUobWFwVG9Cb2R5KCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRleHQgaW4gd2hpY2ggYSBwb3B1cCB3YXMgb3BlbmVkLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRSZWZlcnJlcihjb21tYW5kOiDJtVdvcmtiZW5jaFBvcHVwQ29tbWFuZCk6IFdvcmtiZW5jaFBvcHVwUmVmZXJyZXIge1xuICAgIGlmICghY29tbWFuZC5jb250ZXh0Py52aWV3SWQpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBjb25zdCB2aWV3ID0gdGhpcy5fdmlld1JlZ2lzdHJ5LmdldChjb21tYW5kLmNvbnRleHQudmlld0lkKTtcbiAgICBpZiAoIU1pY3JvZnJvbnRlbmRWaWV3Um91dGVzLmlzTWljcm9mcm9udGVuZFJvdXRlKHZpZXcudXJsU2VnbWVudHMpKSB7XG4gICAgICByZXR1cm4ge3ZpZXdJZDogdmlldy5pZH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZpZXdJZDogdmlldy5pZCxcbiAgICAgIHZpZXdDYXBhYmlsaXR5SWQ6IE1pY3JvZnJvbnRlbmRWaWV3Um91dGVzLnBhcnNlUGFyYW1zKHZpZXcudXJsU2VnbWVudHMpLnZpZXdDYXBhYmlsaXR5SWQsXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
@@ -1,22 +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
|
-
/**
|
|
11
|
-
* Keys for associating microfrontend-specific data with a navigation.
|
|
12
|
-
*
|
|
13
|
-
* State can be read from {@link ActivatedRoute.data} using the {@link WorkbenchRouteData.state} key.
|
|
14
|
-
*/
|
|
15
|
-
export var MicrofrontendNavigationalStates;
|
|
16
|
-
(function (MicrofrontendNavigationalStates) {
|
|
17
|
-
/**
|
|
18
|
-
* Key for associating transient parameters with a navigation.
|
|
19
|
-
*/
|
|
20
|
-
MicrofrontendNavigationalStates.transientParams = 'ɵtransientParams';
|
|
21
|
-
})(MicrofrontendNavigationalStates || (MicrofrontendNavigationalStates = {}));
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm9mcm9udGVuZC1uYXZpZ2F0aW9uYWwtc3RhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vd29ya2JlbmNoL3NyYy9saWIvbWljcm9mcm9udGVuZC1wbGF0Zm9ybS9yb3V0aW5nL21pY3JvZnJvbnRlbmQtbmF2aWdhdGlvbmFsLXN0YXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVIOzs7O0dBSUc7QUFDSCxNQUFNLEtBQVcsK0JBQStCLENBSy9DO0FBTEQsV0FBaUIsK0JBQStCO0lBQzlDOztPQUVHO0lBQ1UsK0NBQWUsR0FBRyxrQkFBa0IsQ0FBQztBQUNwRCxDQUFDLEVBTGdCLCtCQUErQixLQUEvQiwrQkFBK0IsUUFLL0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjIgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogS2V5cyBmb3IgYXNzb2NpYXRpbmcgbWljcm9mcm9udGVuZC1zcGVjaWZpYyBkYXRhIHdpdGggYSBuYXZpZ2F0aW9uLlxuICpcbiAqIFN0YXRlIGNhbiBiZSByZWFkIGZyb20ge0BsaW5rIEFjdGl2YXRlZFJvdXRlLmRhdGF9IHVzaW5nIHRoZSB7QGxpbmsgV29ya2JlbmNoUm91dGVEYXRhLnN0YXRlfSBrZXkuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgTWljcm9mcm9udGVuZE5hdmlnYXRpb25hbFN0YXRlcyB7XG4gIC8qKlxuICAgKiBLZXkgZm9yIGFzc29jaWF0aW5nIHRyYW5zaWVudCBwYXJhbWV0ZXJzIHdpdGggYSBuYXZpZ2F0aW9uLlxuICAgKi9cbiAgZXhwb3J0IGNvbnN0IHRyYW5zaWVudFBhcmFtcyA9ICfJtXRyYW5zaWVudFBhcmFtcyc7XG59XG4iXX0=
|
|
@@ -1,71 +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 { Dictionaries } from '@scion/toolkit/util';
|
|
11
|
-
import { WorkbenchRouteData } from '../../routing/workbench-route-data';
|
|
12
|
-
import { MicrofrontendNavigationalStates } from './microfrontend-navigational-states';
|
|
13
|
-
export var MicrofrontendViewRoutes;
|
|
14
|
-
(function (MicrofrontendViewRoutes) {
|
|
15
|
-
/**
|
|
16
|
-
* Route prefix to identify routes of microfrontends.
|
|
17
|
-
*/
|
|
18
|
-
MicrofrontendViewRoutes.ROUTE_PREFIX = '~';
|
|
19
|
-
function isMicrofrontendRoute(route) {
|
|
20
|
-
const segments = Array.isArray(route) ? route : route.url;
|
|
21
|
-
return segments.length === 2 && segments[0].path === MicrofrontendViewRoutes.ROUTE_PREFIX;
|
|
22
|
-
}
|
|
23
|
-
MicrofrontendViewRoutes.isMicrofrontendRoute = isMicrofrontendRoute;
|
|
24
|
-
/**
|
|
25
|
-
* Parses the params of a given microfrontend route. Throws if not a valid microfrontend route.
|
|
26
|
-
*
|
|
27
|
-
* Note that transient parameters are not part of the URL segments and are only returned if passing a {@link ActivatedRouteSnapshot} object.
|
|
28
|
-
*/
|
|
29
|
-
function parseParams(route) {
|
|
30
|
-
if (!isMicrofrontendRoute(route)) {
|
|
31
|
-
throw Error(`[NullMicrofrontendRouteError] Given URL segments do not match a microfrontend route. [segments=${route.toString()}]`);
|
|
32
|
-
}
|
|
33
|
-
const segments = Array.isArray(route) ? route : route.url;
|
|
34
|
-
return {
|
|
35
|
-
viewCapabilityId: segments[1].path,
|
|
36
|
-
qualifier: segments[0].parameters,
|
|
37
|
-
urlParams: segments[1].parameters,
|
|
38
|
-
transientParams: Array.isArray(route) ? {} : route.data[WorkbenchRouteData.state]?.[MicrofrontendNavigationalStates.transientParams] || {},
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
MicrofrontendViewRoutes.parseParams = parseParams;
|
|
42
|
-
/**
|
|
43
|
-
* Splits given params into two groups of URL and transient params.
|
|
44
|
-
*
|
|
45
|
-
* URL params are passed with the URL, transient params via transient state. Transient params do not survive a page reload.
|
|
46
|
-
*/
|
|
47
|
-
function splitParams(params, viewCapability) {
|
|
48
|
-
const transientParamNames = new Set(viewCapability.params?.filter(param => param.transient).map(param => param.name));
|
|
49
|
-
return Object.entries(Dictionaries.coerce(params)).reduce((groups, [name, value]) => {
|
|
50
|
-
if (transientParamNames.has(name)) {
|
|
51
|
-
groups.transientParams[name] = value;
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
groups.urlParams[name] = value;
|
|
55
|
-
}
|
|
56
|
-
return groups;
|
|
57
|
-
}, { urlParams: {}, transientParams: {} });
|
|
58
|
-
}
|
|
59
|
-
MicrofrontendViewRoutes.splitParams = splitParams;
|
|
60
|
-
/**
|
|
61
|
-
* Builds the command array to be passed to the workbench router for navigating to a microfrontend view.
|
|
62
|
-
*
|
|
63
|
-
* Format: ['~', {qualifier}, '<viewCapabilityId>', {params}]
|
|
64
|
-
*/
|
|
65
|
-
function buildRouterNavigateCommand(viewCapabilityId, qualifier, params) {
|
|
66
|
-
const paramsCommand = Object.keys(params).length > 0 ? [params] : [];
|
|
67
|
-
return [MicrofrontendViewRoutes.ROUTE_PREFIX, qualifier, viewCapabilityId, ...paramsCommand];
|
|
68
|
-
}
|
|
69
|
-
MicrofrontendViewRoutes.buildRouterNavigateCommand = buildRouterNavigateCommand;
|
|
70
|
-
})(MicrofrontendViewRoutes || (MicrofrontendViewRoutes = {}));
|
|
71
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm9mcm9udGVuZC1yb3V0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi9taWNyb2Zyb250ZW5kLXBsYXRmb3JtL3JvdXRpbmcvbWljcm9mcm9udGVuZC1yb3V0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFLSCxPQUFPLEVBQUMsWUFBWSxFQUFhLE1BQU0scUJBQXFCLENBQUM7QUFDN0QsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDdEUsT0FBTyxFQUFDLCtCQUErQixFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFFcEYsTUFBTSxLQUFXLHVCQUF1QixDQTJEdkM7QUEzREQsV0FBaUIsdUJBQXVCO0lBRXRDOztPQUVHO0lBQ1Usb0NBQVksR0FBRyxHQUFHLENBQUM7SUFFaEMsU0FBZ0Isb0JBQW9CLENBQUMsS0FBNEM7UUFDL0UsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQzFELE9BQU8sUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyx3QkFBQSxZQUFZLENBQUM7SUFDcEUsQ0FBQztJQUhlLDRDQUFvQix1QkFHbkMsQ0FBQTtJQUVEOzs7O09BSUc7SUFDSCxTQUFnQixXQUFXLENBQUMsS0FBNEM7UUFDdEUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2hDLE1BQU0sS0FBSyxDQUFDLGtHQUFrRyxLQUFLLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ3BJO1FBRUQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQzFELE9BQU87WUFDTCxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUNsQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVU7WUFDakMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVO1lBQ2pDLGVBQWUsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFO1NBQzNJLENBQUM7SUFDSixDQUFDO0lBWmUsbUNBQVcsY0FZMUIsQ0FBQTtJQUVEOzs7O09BSUc7SUFDSCxTQUFnQixXQUFXLENBQUMsTUFBaUQsRUFBRSxjQUF1QztRQUNwSCxNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRXRILE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDbEYsSUFBSSxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2pDLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO2FBQ3RDO2lCQUNJO2dCQUNILE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO2FBQ2hDO1lBQ0QsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxFQUFFLEVBQUMsU0FBUyxFQUFFLEVBQWdCLEVBQUUsZUFBZSxFQUFFLEVBQWdCLEVBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFaZSxtQ0FBVyxjQVkxQixDQUFBO0lBRUQ7Ozs7T0FJRztJQUNILFNBQWdCLDBCQUEwQixDQUFDLGdCQUF3QixFQUFFLFNBQW9CLEVBQUUsTUFBYztRQUN2RyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNyRSxPQUFPLENBQUMsd0JBQUEsWUFBWSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFIZSxrREFBMEIsNkJBR3pDLENBQUE7QUFDSCxDQUFDLEVBM0RnQix1QkFBdUIsS0FBdkIsdUJBQXVCLFFBMkR2QyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMiBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBQYXJhbXMsIFVybFNlZ21lbnR9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1dvcmtiZW5jaFZpZXdDYXBhYmlsaXR5fSBmcm9tICdAc2Npb24vd29ya2JlbmNoLWNsaWVudCc7XG5pbXBvcnQge1F1YWxpZmllcn0gZnJvbSAnQHNjaW9uL21pY3JvZnJvbnRlbmQtcGxhdGZvcm0nO1xuaW1wb3J0IHtEaWN0aW9uYXJpZXMsIERpY3Rpb25hcnl9IGZyb20gJ0BzY2lvbi90b29sa2l0L3V0aWwnO1xuaW1wb3J0IHtXb3JrYmVuY2hSb3V0ZURhdGF9IGZyb20gJy4uLy4uL3JvdXRpbmcvd29ya2JlbmNoLXJvdXRlLWRhdGEnO1xuaW1wb3J0IHtNaWNyb2Zyb250ZW5kTmF2aWdhdGlvbmFsU3RhdGVzfSBmcm9tICcuL21pY3JvZnJvbnRlbmQtbmF2aWdhdGlvbmFsLXN0YXRlcyc7XG5cbmV4cG9ydCBuYW1lc3BhY2UgTWljcm9mcm9udGVuZFZpZXdSb3V0ZXMge1xuXG4gIC8qKlxuICAgKiBSb3V0ZSBwcmVmaXggdG8gaWRlbnRpZnkgcm91dGVzIG9mIG1pY3JvZnJvbnRlbmRzLlxuICAgKi9cbiAgZXhwb3J0IGNvbnN0IFJPVVRFX1BSRUZJWCA9ICd+JztcblxuICBleHBvcnQgZnVuY3Rpb24gaXNNaWNyb2Zyb250ZW5kUm91dGUocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfCBVcmxTZWdtZW50W10pOiBib29sZWFuIHtcbiAgICBjb25zdCBzZWdtZW50cyA9IEFycmF5LmlzQXJyYXkocm91dGUpID8gcm91dGUgOiByb3V0ZS51cmw7XG4gICAgcmV0dXJuIHNlZ21lbnRzLmxlbmd0aCA9PT0gMiAmJiBzZWdtZW50c1swXS5wYXRoID09PSBST1VURV9QUkVGSVg7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHRoZSBwYXJhbXMgb2YgYSBnaXZlbiBtaWNyb2Zyb250ZW5kIHJvdXRlLiBUaHJvd3MgaWYgbm90IGEgdmFsaWQgbWljcm9mcm9udGVuZCByb3V0ZS5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRyYW5zaWVudCBwYXJhbWV0ZXJzIGFyZSBub3QgcGFydCBvZiB0aGUgVVJMIHNlZ21lbnRzIGFuZCBhcmUgb25seSByZXR1cm5lZCBpZiBwYXNzaW5nIGEge0BsaW5rIEFjdGl2YXRlZFJvdXRlU25hcHNob3R9IG9iamVjdC5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBwYXJzZVBhcmFtcyhyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB8IFVybFNlZ21lbnRbXSk6IE1pY3JvZnJvbnRlbmRSb3V0ZVBhcmFtcyB7XG4gICAgaWYgKCFpc01pY3JvZnJvbnRlbmRSb3V0ZShyb3V0ZSkpIHtcbiAgICAgIHRocm93IEVycm9yKGBbTnVsbE1pY3JvZnJvbnRlbmRSb3V0ZUVycm9yXSBHaXZlbiBVUkwgc2VnbWVudHMgZG8gbm90IG1hdGNoIGEgbWljcm9mcm9udGVuZCByb3V0ZS4gW3NlZ21lbnRzPSR7cm91dGUudG9TdHJpbmcoKX1dYCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VnbWVudHMgPSBBcnJheS5pc0FycmF5KHJvdXRlKSA/IHJvdXRlIDogcm91dGUudXJsO1xuICAgIHJldHVybiB7XG4gICAgICB2aWV3Q2FwYWJpbGl0eUlkOiBzZWdtZW50c1sxXS5wYXRoLFxuICAgICAgcXVhbGlmaWVyOiBzZWdtZW50c1swXS5wYXJhbWV0ZXJzLFxuICAgICAgdXJsUGFyYW1zOiBzZWdtZW50c1sxXS5wYXJhbWV0ZXJzLFxuICAgICAgdHJhbnNpZW50UGFyYW1zOiBBcnJheS5pc0FycmF5KHJvdXRlKSA/IHt9IDogcm91dGUuZGF0YVtXb3JrYmVuY2hSb3V0ZURhdGEuc3RhdGVdPy5bTWljcm9mcm9udGVuZE5hdmlnYXRpb25hbFN0YXRlcy50cmFuc2llbnRQYXJhbXNdIHx8IHt9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3BsaXRzIGdpdmVuIHBhcmFtcyBpbnRvIHR3byBncm91cHMgb2YgVVJMIGFuZCB0cmFuc2llbnQgcGFyYW1zLlxuICAgKlxuICAgKiBVUkwgcGFyYW1zIGFyZSBwYXNzZWQgd2l0aCB0aGUgVVJMLCB0cmFuc2llbnQgcGFyYW1zIHZpYSB0cmFuc2llbnQgc3RhdGUuIFRyYW5zaWVudCBwYXJhbXMgZG8gbm90IHN1cnZpdmUgYSBwYWdlIHJlbG9hZC5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBzcGxpdFBhcmFtcyhwYXJhbXM6IE1hcDxzdHJpbmcsIGFueT4gfCBEaWN0aW9uYXJ5IHwgdW5kZWZpbmVkLCB2aWV3Q2FwYWJpbGl0eTogV29ya2JlbmNoVmlld0NhcGFiaWxpdHkpOiB7dXJsUGFyYW1zOiBEaWN0aW9uYXJ5OyB0cmFuc2llbnRQYXJhbXM6IERpY3Rpb25hcnl9IHtcbiAgICBjb25zdCB0cmFuc2llbnRQYXJhbU5hbWVzID0gbmV3IFNldCh2aWV3Q2FwYWJpbGl0eS5wYXJhbXM/LmZpbHRlcihwYXJhbSA9PiBwYXJhbS50cmFuc2llbnQpLm1hcChwYXJhbSA9PiBwYXJhbS5uYW1lKSk7XG5cbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoRGljdGlvbmFyaWVzLmNvZXJjZShwYXJhbXMpKS5yZWR1Y2UoKGdyb3VwcywgW25hbWUsIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKHRyYW5zaWVudFBhcmFtTmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIGdyb3Vwcy50cmFuc2llbnRQYXJhbXNbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBncm91cHMudXJsUGFyYW1zW25hbWVdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZ3JvdXBzO1xuICAgIH0sIHt1cmxQYXJhbXM6IHt9IGFzIERpY3Rpb25hcnksIHRyYW5zaWVudFBhcmFtczoge30gYXMgRGljdGlvbmFyeX0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgY29tbWFuZCBhcnJheSB0byBiZSBwYXNzZWQgdG8gdGhlIHdvcmtiZW5jaCByb3V0ZXIgZm9yIG5hdmlnYXRpbmcgdG8gYSBtaWNyb2Zyb250ZW5kIHZpZXcuXG4gICAqXG4gICAqIEZvcm1hdDogWyd+Jywge3F1YWxpZmllcn0sICc8dmlld0NhcGFiaWxpdHlJZD4nLCB7cGFyYW1zfV1cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBidWlsZFJvdXRlck5hdmlnYXRlQ29tbWFuZCh2aWV3Q2FwYWJpbGl0eUlkOiBzdHJpbmcsIHF1YWxpZmllcjogUXVhbGlmaWVyLCBwYXJhbXM6IFBhcmFtcyk6IGFueVtdIHtcbiAgICBjb25zdCBwYXJhbXNDb21tYW5kID0gT2JqZWN0LmtleXMocGFyYW1zKS5sZW5ndGggPiAwID8gW3BhcmFtc10gOiBbXTtcbiAgICByZXR1cm4gW1JPVVRFX1BSRUZJWCwgcXVhbGlmaWVyLCB2aWV3Q2FwYWJpbGl0eUlkLCAuLi5wYXJhbXNDb21tYW5kXTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1pY3JvZnJvbnRlbmRSb3V0ZVBhcmFtcyB7XG4gIHZpZXdDYXBhYmlsaXR5SWQ6IHN0cmluZztcbiAgcXVhbGlmaWVyOiBQYXJhbXM7XG4gIHVybFBhcmFtczogUGFyYW1zO1xuICB0cmFuc2llbnRQYXJhbXM6IFBhcmFtcztcbn1cbiJdfQ==
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { WorkbenchCapabilities } from '@scion/workbench-client';
|
|
3
|
-
import { Crypto } from '@scion/toolkit/crypto';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
/**
|
|
6
|
-
* Asserts view capabilities to have required properties and assigns each view capability a stable identifer required for persistent navigation.
|
|
7
|
-
*/
|
|
8
|
-
export class MicrofrontendViewCapabilityInterceptor {
|
|
9
|
-
async intercept(capability) {
|
|
10
|
-
if (capability.type !== WorkbenchCapabilities.View) {
|
|
11
|
-
return capability;
|
|
12
|
-
}
|
|
13
|
-
const viewCapability = capability;
|
|
14
|
-
// Assert the view capability to have a qualifier set.
|
|
15
|
-
if (!viewCapability.qualifier || !Object.keys(viewCapability.qualifier).length) {
|
|
16
|
-
throw Error(`[NullQualifierError] View capability requires a qualifier [capability=${JSON.stringify(viewCapability)}]`);
|
|
17
|
-
}
|
|
18
|
-
// Assert the view capability to have a path set.
|
|
19
|
-
const path = viewCapability.properties?.path;
|
|
20
|
-
if (path === undefined || path === null) {
|
|
21
|
-
throw Error(`[NullPathError] View capability requires a path to the microfrontend in its properties [capability=${JSON.stringify(viewCapability)}]`);
|
|
22
|
-
}
|
|
23
|
-
// Set a stable identifier required for persistent navigation.
|
|
24
|
-
return {
|
|
25
|
-
...viewCapability,
|
|
26
|
-
metadata: {
|
|
27
|
-
...viewCapability.metadata,
|
|
28
|
-
id: await createStableViewIdentifier(viewCapability),
|
|
29
|
-
},
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: MicrofrontendViewCapabilityInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
33
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: MicrofrontendViewCapabilityInterceptor }); }
|
|
34
|
-
}
|
|
35
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: MicrofrontendViewCapabilityInterceptor, decorators: [{
|
|
36
|
-
type: Injectable
|
|
37
|
-
}] });
|
|
38
|
-
/**
|
|
39
|
-
* Creates a stable identifier for given view capability.
|
|
40
|
-
*/
|
|
41
|
-
async function createStableViewIdentifier(capability) {
|
|
42
|
-
const qualifier = capability.qualifier;
|
|
43
|
-
const vendor = capability.metadata.appSymbolicName;
|
|
44
|
-
// Create identifier consisting of vendor and sorted qualifier entries.
|
|
45
|
-
const identifier = Object.keys(qualifier)
|
|
46
|
-
.sort()
|
|
47
|
-
.reduce((acc, qualifierKey) => acc.concat(qualifierKey).concat(`${qualifier[qualifierKey]}`), [vendor])
|
|
48
|
-
.join(';');
|
|
49
|
-
// Hash the identifier.
|
|
50
|
-
const identifierHash = await Crypto.digest(identifier);
|
|
51
|
-
// Use the first 7 digits of the hash.
|
|
52
|
-
return identifierHash.substring(0, 7);
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm9mcm9udGVuZC12aWV3LWNhcGFiaWxpdHktaW50ZXJjZXB0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL21pY3JvZnJvbnRlbmQtcGxhdGZvcm0vcm91dGluZy9taWNyb2Zyb250ZW5kLXZpZXctY2FwYWJpbGl0eS1pbnRlcmNlcHRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVdBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFDLHFCQUFxQixFQUEwQixNQUFNLHlCQUF5QixDQUFDO0FBQ3ZGLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQzs7QUFFN0M7O0dBRUc7QUFFSCxNQUFNLE9BQU8sc0NBQXNDO0lBRTFDLEtBQUssQ0FBQyxTQUFTLENBQUMsVUFBc0I7UUFDM0MsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLHFCQUFxQixDQUFDLElBQUksRUFBRTtZQUNsRCxPQUFPLFVBQVUsQ0FBQztTQUNuQjtRQUVELE1BQU0sY0FBYyxHQUFHLFVBQXFDLENBQUM7UUFDN0Qsc0RBQXNEO1FBQ3RELElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFO1lBQzlFLE1BQU0sS0FBSyxDQUFDLHlFQUF5RSxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN6SDtRQUVELGlEQUFpRDtRQUNqRCxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQztRQUM3QyxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtZQUN2QyxNQUFNLEtBQUssQ0FBQyxzR0FBc0csSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDdEo7UUFFRCw4REFBOEQ7UUFDOUQsT0FBTztZQUNMLEdBQUcsY0FBYztZQUNqQixRQUFRLEVBQUU7Z0JBQ1IsR0FBRyxjQUFjLENBQUMsUUFBUztnQkFDM0IsRUFBRSxFQUFFLE1BQU0sMEJBQTBCLENBQUMsY0FBYyxDQUFDO2FBQ3JEO1NBQ0YsQ0FBQztJQUNKLENBQUM7OEdBM0JVLHNDQUFzQztrSEFBdEMsc0NBQXNDOzsyRkFBdEMsc0NBQXNDO2tCQURsRCxVQUFVOztBQStCWDs7R0FFRztBQUNILEtBQUssVUFBVSwwQkFBMEIsQ0FBQyxVQUFtQztJQUMzRSxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsU0FBVSxDQUFDO0lBQ3hDLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxRQUFTLENBQUMsZUFBZSxDQUFDO0lBRXBELHVFQUF1RTtJQUN2RSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztTQUN0QyxJQUFJLEVBQUU7U0FDTixNQUFNLENBQ0wsQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ3BGLENBQUMsTUFBTSxDQUFDLENBQ1Q7U0FDQSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFYix1QkFBdUI7SUFDdkIsTUFBTSxjQUFjLEdBQUcsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZELHNDQUFzQztJQUN0QyxPQUFPLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjIgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7Q2FwYWJpbGl0eSwgQ2FwYWJpbGl0eUludGVyY2VwdG9yfSBmcm9tICdAc2Npb24vbWljcm9mcm9udGVuZC1wbGF0Zm9ybSc7XG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtXb3JrYmVuY2hDYXBhYmlsaXRpZXMsIFdvcmtiZW5jaFZpZXdDYXBhYmlsaXR5fSBmcm9tICdAc2Npb24vd29ya2JlbmNoLWNsaWVudCc7XG5pbXBvcnQge0NyeXB0b30gZnJvbSAnQHNjaW9uL3Rvb2xraXQvY3J5cHRvJztcblxuLyoqXG4gKiBBc3NlcnRzIHZpZXcgY2FwYWJpbGl0aWVzIHRvIGhhdmUgcmVxdWlyZWQgcHJvcGVydGllcyBhbmQgYXNzaWducyBlYWNoIHZpZXcgY2FwYWJpbGl0eSBhIHN0YWJsZSBpZGVudGlmZXIgcmVxdWlyZWQgZm9yIHBlcnNpc3RlbnQgbmF2aWdhdGlvbi5cbiAqL1xuQEluamVjdGFibGUoLyogRE8gTk9UIFBST1ZJREUgdmlhICdwcm92aWRlZEluJyBtZXRhZGF0YSBhcyBvbmx5IHJlZ2lzdGVyZWQgaWYgbWljcm9mcm9udGVuZCBzdXBwb3J0IGlzIGVuYWJsZWQuICovKVxuZXhwb3J0IGNsYXNzIE1pY3JvZnJvbnRlbmRWaWV3Q2FwYWJpbGl0eUludGVyY2VwdG9yIGltcGxlbWVudHMgQ2FwYWJpbGl0eUludGVyY2VwdG9yIHtcblxuICBwdWJsaWMgYXN5bmMgaW50ZXJjZXB0KGNhcGFiaWxpdHk6IENhcGFiaWxpdHkpOiBQcm9taXNlPENhcGFiaWxpdHk+IHtcbiAgICBpZiAoY2FwYWJpbGl0eS50eXBlICE9PSBXb3JrYmVuY2hDYXBhYmlsaXRpZXMuVmlldykge1xuICAgICAgcmV0dXJuIGNhcGFiaWxpdHk7XG4gICAgfVxuXG4gICAgY29uc3Qgdmlld0NhcGFiaWxpdHkgPSBjYXBhYmlsaXR5IGFzIFdvcmtiZW5jaFZpZXdDYXBhYmlsaXR5O1xuICAgIC8vIEFzc2VydCB0aGUgdmlldyBjYXBhYmlsaXR5IHRvIGhhdmUgYSBxdWFsaWZpZXIgc2V0LlxuICAgIGlmICghdmlld0NhcGFiaWxpdHkucXVhbGlmaWVyIHx8ICFPYmplY3Qua2V5cyh2aWV3Q2FwYWJpbGl0eS5xdWFsaWZpZXIpLmxlbmd0aCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFtOdWxsUXVhbGlmaWVyRXJyb3JdIFZpZXcgY2FwYWJpbGl0eSByZXF1aXJlcyBhIHF1YWxpZmllciBbY2FwYWJpbGl0eT0ke0pTT04uc3RyaW5naWZ5KHZpZXdDYXBhYmlsaXR5KX1dYCk7XG4gICAgfVxuXG4gICAgLy8gQXNzZXJ0IHRoZSB2aWV3IGNhcGFiaWxpdHkgdG8gaGF2ZSBhIHBhdGggc2V0LlxuICAgIGNvbnN0IHBhdGggPSB2aWV3Q2FwYWJpbGl0eS5wcm9wZXJ0aWVzPy5wYXRoO1xuICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQgfHwgcGF0aCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFtOdWxsUGF0aEVycm9yXSBWaWV3IGNhcGFiaWxpdHkgcmVxdWlyZXMgYSBwYXRoIHRvIHRoZSBtaWNyb2Zyb250ZW5kIGluIGl0cyBwcm9wZXJ0aWVzIFtjYXBhYmlsaXR5PSR7SlNPTi5zdHJpbmdpZnkodmlld0NhcGFiaWxpdHkpfV1gKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgYSBzdGFibGUgaWRlbnRpZmllciByZXF1aXJlZCBmb3IgcGVyc2lzdGVudCBuYXZpZ2F0aW9uLlxuICAgIHJldHVybiB7XG4gICAgICAuLi52aWV3Q2FwYWJpbGl0eSxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIC4uLnZpZXdDYXBhYmlsaXR5Lm1ldGFkYXRhISxcbiAgICAgICAgaWQ6IGF3YWl0IGNyZWF0ZVN0YWJsZVZpZXdJZGVudGlmaWVyKHZpZXdDYXBhYmlsaXR5KSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzdGFibGUgaWRlbnRpZmllciBmb3IgZ2l2ZW4gdmlldyBjYXBhYmlsaXR5LlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVTdGFibGVWaWV3SWRlbnRpZmllcihjYXBhYmlsaXR5OiBXb3JrYmVuY2hWaWV3Q2FwYWJpbGl0eSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHF1YWxpZmllciA9IGNhcGFiaWxpdHkucXVhbGlmaWVyITtcbiAgY29uc3QgdmVuZG9yID0gY2FwYWJpbGl0eS5tZXRhZGF0YSEuYXBwU3ltYm9saWNOYW1lO1xuXG4gIC8vIENyZWF0ZSBpZGVudGlmaWVyIGNvbnNpc3Rpbmcgb2YgdmVuZG9yIGFuZCBzb3J0ZWQgcXVhbGlmaWVyIGVudHJpZXMuXG4gIGNvbnN0IGlkZW50aWZpZXIgPSBPYmplY3Qua2V5cyhxdWFsaWZpZXIpXG4gICAgLnNvcnQoKVxuICAgIC5yZWR1Y2UoXG4gICAgICAoYWNjLCBxdWFsaWZpZXJLZXkpID0+IGFjYy5jb25jYXQocXVhbGlmaWVyS2V5KS5jb25jYXQoYCR7cXVhbGlmaWVyW3F1YWxpZmllcktleV19YCksXG4gICAgICBbdmVuZG9yXSxcbiAgICApXG4gICAgLmpvaW4oJzsnKTtcblxuICAvLyBIYXNoIHRoZSBpZGVudGlmaWVyLlxuICBjb25zdCBpZGVudGlmaWVySGFzaCA9IGF3YWl0IENyeXB0by5kaWdlc3QoaWRlbnRpZmllcik7XG4gIC8vIFVzZSB0aGUgZmlyc3QgNyBkaWdpdHMgb2YgdGhlIGhhc2guXG4gIHJldHVybiBpZGVudGlmaWVySGFzaC5zdWJzdHJpbmcoMCwgNyk7XG59XG4iXX0=
|