aril 1.1.64 → 1.1.66
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/boot/config/api/src/api.service.d.ts +1 -0
- package/esm2022/boot/config/api/src/api.service.mjs +15 -3
- package/esm2022/boot/host/src/bootstrap.mjs +4 -2
- package/esm2022/ui-business/assetPicker/src/asset-picker.component.mjs +63 -30
- package/esm2022/ui-business/assetPicker/src/interface.mjs +1 -1
- package/esm2022/util/directives/aril-util-directives.mjs +5 -0
- package/esm2022/util/directives/index.mjs +4 -0
- package/esm2022/util/directives/src/detail-page-customization/detail-page-customization.directive.mjs +298 -0
- package/esm2022/util/directives/src/detail-page-customization/index.mjs +3 -0
- package/esm2022/util/directives/src/detail-page-customization/models.mjs +4 -0
- package/esm2022/util/directives/src/dialog-component/plugin-dialog.component.mjs +25 -0
- package/esm2022/util/directives/src/dialog-service/plugin-dialog.service.mjs +16 -0
- package/fesm2022/aril-boot-config-api.mjs +15 -3
- package/fesm2022/aril-boot-config-api.mjs.map +1 -1
- package/fesm2022/aril-boot-host.mjs +3 -1
- package/fesm2022/aril-boot-host.mjs.map +1 -1
- package/fesm2022/aril-ui-business-assetPicker.mjs +62 -29
- package/fesm2022/aril-ui-business-assetPicker.mjs.map +1 -1
- package/fesm2022/aril-util-directives.mjs +343 -0
- package/fesm2022/aril-util-directives.mjs.map +1 -0
- package/fesm2022/aril.mjs +3 -1
- package/fesm2022/aril.mjs.map +1 -1
- package/package.json +72 -66
- package/ui-business/assetPicker/src/asset-picker.component.d.ts +7 -2
- package/ui-business/assetPicker/src/interface.d.ts +1 -0
- package/util/directives/index.d.ts +3 -0
- package/util/directives/src/detail-page-customization/detail-page-customization.directive.d.ts +26 -0
- package/util/directives/src/detail-page-customization/index.d.ts +2 -0
- package/util/directives/src/detail-page-customization/models.d.ts +53 -0
- package/util/directives/src/dialog-component/plugin-dialog.component.d.ts +10 -0
- package/util/directives/src/dialog-service/plugin-dialog.service.d.ts +7 -0
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { Directive, Inject, computed, effect, inject, signal } from '@angular/core';
|
|
2
|
+
import { ActivatedRoute, Router } from '@angular/router';
|
|
3
|
+
import { TranslocoService } from '@ngneat/transloco';
|
|
4
|
+
import { DETAIL_COMPONENT, PLUGIN_DIALOG_SERVICE } from './models';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export class DetailPageCustomizationDirective {
|
|
7
|
+
constructor(detailComponent) {
|
|
8
|
+
this.detailComponent = detailComponent;
|
|
9
|
+
this.route = inject(ActivatedRoute);
|
|
10
|
+
this.router = inject(Router);
|
|
11
|
+
this.dialogService = inject(PLUGIN_DIALOG_SERVICE); // Use token instead
|
|
12
|
+
this.translocoService = inject(TranslocoService);
|
|
13
|
+
// Internal signal to track when TabView and the menu are ready
|
|
14
|
+
this.viewsInitialized = signal(false);
|
|
15
|
+
this.getRouteConfig = () => {
|
|
16
|
+
const configs = globalThis.routeConfigs;
|
|
17
|
+
if (!configs || !Array.isArray(configs))
|
|
18
|
+
return undefined;
|
|
19
|
+
const currentUrl = this.router.url.split('?')[0];
|
|
20
|
+
let bestMatch;
|
|
21
|
+
for (const config of configs) {
|
|
22
|
+
if (!config.path)
|
|
23
|
+
continue;
|
|
24
|
+
const urlToCheck = config.path.startsWith('/') ? config.path : `/${config.path}`;
|
|
25
|
+
if (currentUrl.startsWith(urlToCheck)) {
|
|
26
|
+
bestMatch = config;
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (!bestMatch)
|
|
31
|
+
return undefined;
|
|
32
|
+
try {
|
|
33
|
+
return JSON.parse(bestMatch.content);
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
console.error('Failed to parse route config content:', e);
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
this.getProcessedTabs = computed(() => {
|
|
41
|
+
if (!this.config?.tabs)
|
|
42
|
+
return [];
|
|
43
|
+
const activeLang = this.translocoService.getActiveLang();
|
|
44
|
+
return this.config.tabs
|
|
45
|
+
.filter((tab) => tab.visible !== false)
|
|
46
|
+
.map((tab) => ({
|
|
47
|
+
id: tab.id ?? null,
|
|
48
|
+
icon: tab.icon,
|
|
49
|
+
header: tab.label ? tab.label[activeLang] : '',
|
|
50
|
+
visible: tab.visible,
|
|
51
|
+
position: tab.position,
|
|
52
|
+
components: tab.components || []
|
|
53
|
+
}));
|
|
54
|
+
});
|
|
55
|
+
this.config = this.getRouteConfig();
|
|
56
|
+
effect((onCleanup) => {
|
|
57
|
+
if (this.viewsInitialized())
|
|
58
|
+
return;
|
|
59
|
+
// Poll every animation frame until both TabView and the menu is ready
|
|
60
|
+
// The menu can be directly defined in the component from init step, or be built dynamically after waiting for a network response. So we must wait for it to be ready.
|
|
61
|
+
const checkViews = () => {
|
|
62
|
+
if (this.detailComponent.tabView?.tabs && this.detailComponent.mdInfoPluginProps?.generalMenu()?.length) {
|
|
63
|
+
this.viewsInitialized.set(true);
|
|
64
|
+
this.onViewsReady();
|
|
65
|
+
}
|
|
66
|
+
else if (!this.viewsInitialized()) {
|
|
67
|
+
frameId = requestAnimationFrame(checkViews);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
let frameId = requestAnimationFrame(checkViews);
|
|
71
|
+
onCleanup(() => {
|
|
72
|
+
cancelAnimationFrame(frameId);
|
|
73
|
+
});
|
|
74
|
+
}, { allowSignalWrites: true });
|
|
75
|
+
}
|
|
76
|
+
onViewsReady() {
|
|
77
|
+
if (!this.config)
|
|
78
|
+
return;
|
|
79
|
+
// step 1 - hide tabs based on config
|
|
80
|
+
if (this.detailComponent.tabView?.tabs) {
|
|
81
|
+
this.updateTabVisibility();
|
|
82
|
+
}
|
|
83
|
+
// step 2 - append config tabs to the static tabs (only new ones, not those matching static tabs)
|
|
84
|
+
const allConfigTabs = this.getProcessedTabs();
|
|
85
|
+
// Get IDs of existing static tabs
|
|
86
|
+
const staticTabIds = new Set();
|
|
87
|
+
if (this.detailComponent.tabView?.tabs) {
|
|
88
|
+
this.detailComponent.tabView.tabs.forEach((tabPanel) => {
|
|
89
|
+
const tabId = tabPanel?.el?.nativeElement?.id;
|
|
90
|
+
if (tabId) {
|
|
91
|
+
staticTabIds.add(tabId);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
// Filter out config tabs that are meant to *reorder* existing static tabs.
|
|
96
|
+
// Any tab whose id matches an existing static tab id is considered a "reorder"
|
|
97
|
+
// instruction; everything else (id === null OR an id that doesn't exist yet)
|
|
98
|
+
// is treated as a brand new tab.
|
|
99
|
+
const newConfigTabs = allConfigTabs.filter((tab) => {
|
|
100
|
+
// new tab when id is null/undefined
|
|
101
|
+
if (!tab.id)
|
|
102
|
+
return true;
|
|
103
|
+
// new tab when id is provided but doesn't match any static tab id
|
|
104
|
+
return !staticTabIds.has(tab.id);
|
|
105
|
+
});
|
|
106
|
+
if (newConfigTabs.length > 0 && this.detailComponent.configTabs) {
|
|
107
|
+
this.detailComponent.configTabs.set(newConfigTabs);
|
|
108
|
+
}
|
|
109
|
+
else if (newConfigTabs.length > 0) {
|
|
110
|
+
this.detailComponent.tabs = newConfigTabs;
|
|
111
|
+
}
|
|
112
|
+
// using setTimeout to ensure tabView is ready as we want to work directly with the generated elements
|
|
113
|
+
setTimeout(() => {
|
|
114
|
+
// step 3 - reorder tabs
|
|
115
|
+
this.reorderTabsByPosition();
|
|
116
|
+
// step 4 - activate tab from URL if specified
|
|
117
|
+
this.activateTabFromUrl();
|
|
118
|
+
// step 5 - update the menu
|
|
119
|
+
if (this.config?.menu) {
|
|
120
|
+
this.updateMenu(this.config.menu);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
updateTabVisibility() {
|
|
125
|
+
if (!this.config?.tabs)
|
|
126
|
+
return;
|
|
127
|
+
// Find tabs in config that have visible: false
|
|
128
|
+
const hiddenTabPositions = this.config.tabs.filter((tab) => tab.visible === false).map((tab) => tab.position);
|
|
129
|
+
hiddenTabPositions.forEach((position) => {
|
|
130
|
+
this.hideTabByPosition(position, true);
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
hideTabByPosition(position, hide = true) {
|
|
134
|
+
if (!this.detailComponent.tabView?.tabs)
|
|
135
|
+
return;
|
|
136
|
+
const panelToHide = this.detailComponent.tabView.tabs[position];
|
|
137
|
+
const tabToHide = this.detailComponent.tabView.list?.children[position];
|
|
138
|
+
if (tabToHide && panelToHide) {
|
|
139
|
+
panelToHide.el.nativeElement.hidden = hide;
|
|
140
|
+
tabToHide.style.display = 'none';
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Reorder tabs based on config positions
|
|
145
|
+
* Iterates over visible config tabs and rearranges both static and config tabs
|
|
146
|
+
*/
|
|
147
|
+
reorderTabsByPosition() {
|
|
148
|
+
if (!this.detailComponent.tabView?.tabs || !this.detailComponent.tabView?.list)
|
|
149
|
+
return;
|
|
150
|
+
const configTabs = this.getProcessedTabs();
|
|
151
|
+
const allTabs = this.detailComponent.tabView.tabs;
|
|
152
|
+
const navList = this.detailComponent.tabView.list;
|
|
153
|
+
const configTabMap = new Map();
|
|
154
|
+
configTabs.forEach((tab) => {
|
|
155
|
+
// Only treat tabs that both:
|
|
156
|
+
// - have an id
|
|
157
|
+
// - and have an explicit position
|
|
158
|
+
// as "reorder instructions" for existing static tabs.
|
|
159
|
+
// Tabs without a position (even if they have an id) are considered
|
|
160
|
+
// regular/new tabs and should keep their natural order.
|
|
161
|
+
if (tab.id && tab.position) {
|
|
162
|
+
configTabMap.set(tab.id, tab);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
// separate static from config tabs
|
|
166
|
+
const staticTabs = [];
|
|
167
|
+
const configTabInstances = [];
|
|
168
|
+
allTabs.forEach((tabPanel, index) => {
|
|
169
|
+
const tabId = tabPanel?.el?.nativeElement?.id || null;
|
|
170
|
+
const configTab = tabId ? configTabMap.get(tabId) : null;
|
|
171
|
+
if (configTab) {
|
|
172
|
+
configTabInstances.push({ tab: tabPanel, index, config: configTab });
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
staticTabs.push({ tab: tabPanel, index, id: tabId });
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
const positionMap = new Map();
|
|
179
|
+
// place config tabs at their specified positions
|
|
180
|
+
configTabInstances.forEach(({ tab, config }) => {
|
|
181
|
+
if (config.position !== undefined && config.position !== null) {
|
|
182
|
+
positionMap.set(config.position, { tab, isConfig: true, id: config.id });
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
// place static tabs at available positions (maintaining relative order)
|
|
186
|
+
let staticIndex = 0;
|
|
187
|
+
let currentPosition = 0;
|
|
188
|
+
while (staticIndex < staticTabs.length) {
|
|
189
|
+
while (positionMap.has(currentPosition)) {
|
|
190
|
+
currentPosition++;
|
|
191
|
+
}
|
|
192
|
+
// place static tab at this position
|
|
193
|
+
const staticTab = staticTabs[staticIndex];
|
|
194
|
+
positionMap.set(currentPosition, { tab: staticTab.tab, isConfig: false, id: staticTab.id });
|
|
195
|
+
staticIndex++;
|
|
196
|
+
currentPosition++;
|
|
197
|
+
}
|
|
198
|
+
// build ordered array
|
|
199
|
+
const sortedPositions = Array.from(positionMap.keys()).sort((a, b) => a - b);
|
|
200
|
+
const reorderedTabs = [];
|
|
201
|
+
const reorderedHeaders = [];
|
|
202
|
+
sortedPositions.forEach((position) => {
|
|
203
|
+
const tabInfo = positionMap.get(position);
|
|
204
|
+
reorderedTabs.push(tabInfo.tab);
|
|
205
|
+
const originalIndex = allTabs.indexOf(tabInfo.tab);
|
|
206
|
+
if (originalIndex !== -1 && navList.children[originalIndex]) {
|
|
207
|
+
reorderedHeaders.push(navList.children[originalIndex]);
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
// reorder tabs array
|
|
211
|
+
this.detailComponent.tabView.tabs.length = 0;
|
|
212
|
+
reorderedTabs.forEach((tab) => this.detailComponent.tabView.tabs.push(tab));
|
|
213
|
+
// reorder dom headers
|
|
214
|
+
reorderedHeaders.forEach((header, newIndex) => {
|
|
215
|
+
const targetHeader = navList.children[newIndex];
|
|
216
|
+
if (targetHeader && targetHeader !== header) {
|
|
217
|
+
navList.insertBefore(header, targetHeader);
|
|
218
|
+
}
|
|
219
|
+
else if (!targetHeader) {
|
|
220
|
+
navList.appendChild(header);
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
// reorder dom panels
|
|
224
|
+
const panelsContainer = allTabs[0]?.el.nativeElement.parentElement;
|
|
225
|
+
if (panelsContainer) {
|
|
226
|
+
reorderedTabs.forEach((tabPanel, newIndex) => {
|
|
227
|
+
const targetPanel = panelsContainer.children[newIndex];
|
|
228
|
+
if (targetPanel && targetPanel !== tabPanel.el.nativeElement) {
|
|
229
|
+
panelsContainer.insertBefore(tabPanel.el.nativeElement, targetPanel);
|
|
230
|
+
}
|
|
231
|
+
else if (!targetPanel) {
|
|
232
|
+
panelsContainer.appendChild(tabPanel.el.nativeElement);
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
if (this.detailComponent.tabView.cd) {
|
|
237
|
+
this.detailComponent.tabView.cd.markForCheck();
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
activateTabFromUrl() {
|
|
241
|
+
if (!this.detailComponent.tabView)
|
|
242
|
+
return;
|
|
243
|
+
const activeTabParam = this.route.snapshot.queryParamMap.get('activeTab');
|
|
244
|
+
if (activeTabParam) {
|
|
245
|
+
const activeTabIndex = Number(activeTabParam);
|
|
246
|
+
if (!isNaN(activeTabIndex) &&
|
|
247
|
+
activeTabIndex >= 0 &&
|
|
248
|
+
this.detailComponent.tabView.tabs &&
|
|
249
|
+
activeTabIndex < this.detailComponent.tabView.tabs.length) {
|
|
250
|
+
this.detailComponent.tabView.activeIndex = activeTabIndex;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
updateMenu(menuConfig) {
|
|
255
|
+
const context = {
|
|
256
|
+
router: this.router,
|
|
257
|
+
route: this.route,
|
|
258
|
+
dialogService: this.dialogService,
|
|
259
|
+
component: this.detailComponent
|
|
260
|
+
};
|
|
261
|
+
const activeLang = this.translocoService.getActiveLang();
|
|
262
|
+
const dynamicMenu = menuConfig.map((m) => ({
|
|
263
|
+
label: m.label[activeLang] ?? '',
|
|
264
|
+
icon: m.icon,
|
|
265
|
+
command: (_event) => {
|
|
266
|
+
const commandFn = new Function('ctx', m.command);
|
|
267
|
+
commandFn(context)(context);
|
|
268
|
+
}
|
|
269
|
+
}));
|
|
270
|
+
// Update the existing signal instead of replacing it to ensure change
|
|
271
|
+
// detection picks up the menu update after browser back navigation.
|
|
272
|
+
const generalMenuSignal = this.detailComponent.mdInfoPluginProps.generalMenu;
|
|
273
|
+
const existingMenu = generalMenuSignal();
|
|
274
|
+
// Avoid duplicating previously added dynamic items (identified by label/icon match)
|
|
275
|
+
const mergedMenu = [
|
|
276
|
+
...existingMenu.filter((item) => !dynamicMenu.some((dyn) => dyn.label === item.label && dyn.icon === item.icon)),
|
|
277
|
+
...dynamicMenu
|
|
278
|
+
];
|
|
279
|
+
if (generalMenuSignal?.set) {
|
|
280
|
+
generalMenuSignal.set(mergedMenu);
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
this.detailComponent.mdInfoPluginProps.generalMenu = signal(mergedMenu);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: DetailPageCustomizationDirective, deps: [{ token: DETAIL_COMPONENT }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
287
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.1.2", type: DetailPageCustomizationDirective, isStandalone: true, ngImport: i0 }); }
|
|
288
|
+
}
|
|
289
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: DetailPageCustomizationDirective, decorators: [{
|
|
290
|
+
type: Directive,
|
|
291
|
+
args: [{
|
|
292
|
+
standalone: true
|
|
293
|
+
}]
|
|
294
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
295
|
+
type: Inject,
|
|
296
|
+
args: [DETAIL_COMPONENT]
|
|
297
|
+
}] }] });
|
|
298
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLXBhZ2UtY3VzdG9taXphdGlvbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcmlsL3V0aWwvZGlyZWN0aXZlcy9zcmMvZGV0YWlsLXBhZ2UtY3VzdG9taXphdGlvbi9kZXRhaWwtcGFnZS1jdXN0b21pemF0aW9uLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBVSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUl6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVyRCxPQUFPLEVBQ04sZ0JBQWdCLEVBSWhCLHFCQUFxQixFQUVyQixNQUFNLFVBQVUsQ0FBQzs7QUFLbEIsTUFBTSxPQUFPLGdDQUFnQztJQXlENUMsWUFBdUQsZUFBZ0M7UUFBaEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBeER0RSxVQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQy9CLFdBQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEIsa0JBQWEsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLG9CQUFvQjtRQUNuRSxxQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUU3RCwrREFBK0Q7UUFDdkQscUJBQWdCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWpDLG1CQUFjLEdBQUcsR0FBNkIsRUFBRTtZQUN2RCxNQUFNLE9BQU8sR0FBSSxVQUFrQixDQUFDLFlBRXhCLENBQUM7WUFDYixJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9B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QUFDLEtBQUssRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2pELFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3QixDQUFDO1NBQ0QsQ0FBQyxDQUFDLENBQUM7UUFFSixzRUFBc0U7UUFDdEUsb0VBQW9FO1FBQ3BFLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFrQixDQUFDO1FBQ3BGLE1BQU0sWUFBWSxHQUFlLGlCQUFpQixFQUFFLENBQUM7UUFFckQsb0ZBQW9GO1FBQ3BGLE1BQU0sVUFBVSxHQUFHO1lBQ2xCLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEgsR0FBRyxXQUFXO1NBQ2QsQ0FBQztRQUVGLElBQUksaUJBQWlCLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDNUIsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ25DLENBQUM7YUFBTSxDQUFDO1lBQ1AsSUFBSSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7SUFDRixDQUFDOzhHQWxVVyxnQ0FBZ0Msa0JBeUR4QixnQkFBZ0I7a0dBekR4QixnQ0FBZ0M7OzJGQUFoQyxnQ0FBZ0M7a0JBSDVDLFNBQVM7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLElBQUk7aUJBQ2hCOzswQkEwRGEsTUFBTTsyQkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEluamVjdCwgU2lnbmFsLCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbmltcG9ydCB7IE1lbnVJdGVtIH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5cclxuaW1wb3J0IHsgVHJhbnNsb2NvU2VydmljZSB9IGZyb20gJ0BuZ25lYXQvdHJhbnNsb2NvJztcclxuXHJcbmltcG9ydCB7XHJcblx0REVUQUlMX0NPTVBPTkVOVCxcclxuXHREZXRhaWxDb21wb25lbnQsXHJcblx0RGV0YWlsQ29uZmlnLFxyXG5cdERldGFpbENvbmZpZ01lbnVJdGVtLFxyXG5cdFBMVUdJTl9ESUFMT0dfU0VSVklDRSxcclxuXHRUYWJDb25maWdcclxufSBmcm9tICcuL21vZGVscyc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuXHRzdGFuZGFsb25lOiB0cnVlXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEZXRhaWxQYWdlQ3VzdG9taXphdGlvbkRpcmVjdGl2ZSB7XHJcblx0cHJpdmF0ZSByZWFkb25seSByb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XHJcblx0cHJpdmF0ZSByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcclxuXHRwcml2YXRlIHJlYWRvbmx5IGRpYWxvZ1NlcnZpY2UgPSBpbmplY3QoUExVR0lOX0RJQUxPR19TRVJWSUNFKTsgLy8gVXNlIHRva2VuIGluc3RlYWRcclxuXHRwcml2YXRlIHJlYWRvbmx5IHRyYW5zbG9jb1NlcnZpY2UgPSBpbmplY3QoVHJhbnNsb2NvU2VydmljZSk7XHJcblxyXG5cdC8vIEludGVybmFsIHNpZ25hbCB0byB0cmFjayB3aGVuIFRhYlZpZXcgYW5kIHRoZSBtZW51IGFyZSByZWFkeVxyXG5cdHByaXZhdGUgdmlld3NJbml0aWFsaXplZCA9IHNpZ25hbChmYWxzZSk7XHJcblx0cHJpdmF0ZSBjb25maWc6IERldGFpbENvbmZpZyB8IHVuZGVmaW5lZDtcclxuXHRwcml2YXRlIGdldFJvdXRlQ29uZmlnID0gKCk6IERldGFpbENvbmZpZyB8IHVuZGVmaW5lZCA9PiB7XHJcblx0XHRjb25zdCBjb25maWdzID0gKGdsb2JhbFRoaXMgYXMgYW55KS5yb3V0ZUNvbmZpZ3MgYXNcclxuXHRcdFx0fCBBcnJheTx7IHBhdGg6IHN0cmluZzsgY29udGVudDogc3RyaW5nOyB2ZXJzaW9uOiBudW1iZXIgfT5cclxuXHRcdFx0fCB1bmRlZmluZWQ7XHJcblx0XHRpZiAoIWNvbmZpZ3MgfHwgIUFycmF5LmlzQXJyYXkoY29uZmlncykpIHJldHVybiB1bmRlZmluZWQ7XHJcblxyXG5cdFx0Y29uc3QgY3VycmVudFVybCA9IHRoaXMucm91dGVyLnVybC5zcGxpdCgnPycpWzBdO1xyXG5cclxuXHRcdGxldCBiZXN0TWF0Y2g6IHsgcGF0aDogc3RyaW5nOyBjb250ZW50OiBzdHJpbmc7IHZlcnNpb246IG51bWJlciB9IHwgdW5kZWZpbmVkO1xyXG5cclxuXHRcdGZvciAoY29uc3QgY29uZmlnIG9mIGNvbmZpZ3MpIHtcclxuXHRcdFx0aWYgKCFjb25maWcucGF0aCkgY29udGludWU7XHJcblxyXG5cdFx0XHRjb25zdCB1cmxUb0NoZWNrID0gY29uZmlnLnBhdGguc3RhcnRzV2l0aCgnLycpID8gY29uZmlnLnBhdGggOiBgLyR7Y29uZmlnLnBhdGh9YDtcclxuXHJcblx0XHRcdGlmIChjdXJyZW50VXJsLnN0YXJ0c1dpdGgodXJsVG9DaGVjaykpIHtcclxuXHRcdFx0XHRiZXN0TWF0Y2ggPSBjb25maWc7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIWJlc3RNYXRjaCkgcmV0dXJuIHVuZGVmaW5lZDtcclxuXHJcblx0XHR0cnkge1xyXG5cdFx0XHRyZXR1cm4gSlNPTi5wYXJzZShiZXN0TWF0Y2guY29udGVudCkgYXMgRGV0YWlsQ29uZmlnO1xyXG5cdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcGFyc2Ugcm91dGUgY29uZmlnIGNvbnRlbnQ6JywgZSk7XHJcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0cHJpdmF0ZSBnZXRQcm9jZXNzZWRUYWJzOiBTaWduYWw8VGFiQ29uZmlnW10+ID0gY29tcHV0ZWQoKCkgPT4ge1xyXG5cdFx0aWYgKCF0aGlzLmNvbmZpZz8udGFicykgcmV0dXJuIFtdO1xyXG5cclxuXHRcdGNvbnN0IGFjdGl2ZUxhbmcgPSB0aGlzLnRyYW5zbG9jb1NlcnZpY2UuZ2V0QWN0aXZlTGFuZygpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNvbmZpZy50YWJzXHJcblx0XHRcdC5maWx0ZXIoKHRhYikgPT4gdGFiLnZpc2libGUgIT09IGZhbHNlKVxyXG5cdFx0XHQubWFwKCh0YWIpID0+ICh7XHJcblx0XHRcdFx0aWQ6IHRhYi5pZCA/PyBudWxsLFxyXG5cdFx0XHRcdGljb246IHRhYi5pY29uLFxyXG5cdFx0XHRcdGhlYWRlcjogdGFiLmxhYmVsID8gdGFiLmxhYmVsW2FjdGl2ZUxhbmddIDogJycsXHJcblx0XHRcdFx0dmlzaWJsZTogdGFiLnZpc2libGUsXHJcblx0XHRcdFx0cG9zaXRpb246IHRhYi5wb3NpdGlvbixcclxuXHRcdFx0XHRjb21wb25lbnRzOiB0YWIuY29tcG9uZW50cyB8fCBbXVxyXG5cdFx0XHR9KSk7XHJcblx0fSk7XHJcblxyXG5cdGNvbnN0cnVjdG9yKEBJbmplY3QoREVUQUlMX0NPTVBPTkVOVCkgcHJpdmF0ZSByZWFkb25seSBkZXRhaWxDb21wb25lbnQ6IERldGFpbENvbXBvbmVudCkge1xyXG5cdFx0dGhpcy5jb25maWcgPSB0aGlzLmdldFJvdXRlQ29uZmlnKCk7XHJcblx0XHRlZmZlY3QoXHJcblx0XHRcdChvbkNsZWFudXApID0+IHtcclxuXHRcdFx0XHRpZiAodGhpcy52aWV3c0luaXRpYWxpemVkKCkpIHJldHVybjtcclxuXHJcblx0XHRcdFx0Ly8gUG9sbCBldmVyeSBhbmltYXRpb24gZnJhbWUgdW50aWwgYm90aCBUYWJWaWV3IGFuZCB0aGUgbWVudSBpcyByZWFkeVxyXG5cdFx0XHRcdC8vIFRoZSBtZW51IGNhbiBiZSBkaXJlY3RseSBkZWZpbmVkIGluIHRoZSBjb21wb25lbnQgZnJvbSBpbml0IHN0ZXAsIG9yIGJlIGJ1aWx0IGR5bmFtaWNhbGx5IGFmdGVyIHdhaXRpbmcgZm9yIGEgbmV0d29yayByZXNwb25zZS4gU28gd2UgbXVzdCB3YWl0IGZvciBpdCB0byBiZSByZWFkeS5cclxuXHRcdFx0XHRjb25zdCBjaGVja1ZpZXdzID0gKCkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuZGV0YWlsQ29tcG9uZW50LnRhYlZpZXc/LnRhYnMgJiYgdGhpcy5kZXRhaWxDb21wb25lbnQubWRJbmZvUGx1Z2luUHJvcHM/LmdlbmVyYWxNZW51KCk/Lmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnZpZXdzSW5pdGlhbGl6ZWQuc2V0KHRydWUpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLm9uVmlld3NSZWFkeSgpO1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICghdGhpcy52aWV3c0luaXRpYWxpemVkKCkpIHtcclxuXHRcdFx0XHRcdFx0ZnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShjaGVja1ZpZXdzKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRsZXQgZnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShjaGVja1ZpZXdzKTtcclxuXHJcblx0XHRcdFx0b25DbGVhbnVwKCgpID0+IHtcclxuXHRcdFx0XHRcdGNhbmNlbEFuaW1hdGlvbkZyYW1lKGZyYW1lSWQpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHR7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIG9uVmlld3NSZWFkeSgpOiB2b2lkIHtcclxuXHRcdGlmICghdGhpcy5jb25maWcpIHJldHVybjtcclxuXHJcblx0XHQvLyBzdGVwIDEgLSBoaWRlIHRhYnMgYmFzZWQgb24gY29uZmlnXHJcblx0XHRpZiAodGhpcy5kZXRhaWxDb21wb25lbnQudGFiVmlldz8udGFicykge1xyXG5cdFx0XHR0aGlzLnVwZGF0ZVRhYlZpc2liaWxpdHkoKTtcclxuXHRcdH1cclxuXHRcdC8vIHN0ZXAgMiAtIGFwcGVuZCBjb25maWcgdGFicyB0byB0aGUgc3RhdGljIHRhYnMgKG9ubHkgbmV3IG9uZXMsIG5vdCB0aG9zZSBtYXRjaGluZyBzdGF0aWMgdGFicylcclxuXHRcdGNvbnN0IGFsbENvbmZpZ1RhYnMgPSB0aGlzLmdldFByb2Nlc3NlZFRhYnMoKTtcclxuXHJcblx0XHQvLyBHZXQgSURzIG9mIGV4aXN0aW5nIHN0YXRpYyB0YWJzXHJcblx0XHRjb25zdCBzdGF0aWNUYWJJZHMgPSBuZXcgU2V0PHN0cmluZyB8IG51bWJlciB8IG51bGw+KCk7XHJcblx0XHRpZiAodGhpcy5kZXRhaWxDb21wb25lbnQudGFiVmlldz8udGFicykge1xyXG5cdFx0XHR0aGlzLmRldGFpbENvbXBvbmVudC50YWJWaWV3LnRhYnMuZm9yRWFjaCgodGFiUGFuZWwpID0+IHtcclxuXHRcdFx0XHRjb25zdCB0YWJJZCA9IHRhYlBhbmVsPy5lbD8ubmF0aXZlRWxlbWVudD8uaWQ7XHJcblx0XHRcdFx0aWYgKHRhYklkKSB7XHJcblx0XHRcdFx0XHRzdGF0aWNUYWJJZHMuYWRkKHRhYklkKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEZpbHRlciBvdXQgY29uZmlnIHRhYnMgdGhhdCBhcmUgbWVhbnQgdG8gKnJlb3JkZXIqIGV4aXN0aW5nIHN0YXRpYyB0YWJzLlxyXG5cdFx0Ly8gQW55IHRhYiB3aG9zZSBpZCBtYXRjaGVzIGFuIGV4aXN0aW5nIHN0YXRpYyB0YWIgaWQgaXMgY29uc2lkZXJlZCBhIFwicmVvcmRlclwiXHJcblx0XHQvLyBpbnN0cnVjdGlvbjsgZXZlcnl0aGluZyBlbHNlIChpZCA9PT0gbnVsbCBPUiBhbiBpZCB0aGF0IGRvZXNuJ3QgZXhpc3QgeWV0KVxyXG5cdFx0Ly8gaXMgdHJlYXRlZCBhcyBhIGJyYW5kIG5ldyB0YWIuXHJcblx0XHRjb25zdCBuZXdDb25maWdUYWJzID0gYWxsQ29uZmlnVGFicy5maWx0ZXIoKHRhYikgPT4ge1xyXG5cdFx0XHQvLyBuZXcgdGFiIHdoZW4gaWQgaXMgbnVsbC91bmRlZmluZWRcclxuXHRcdFx0aWYgKCF0YWIuaWQpIHJldHVybiB0cnVlO1xyXG5cclxuXHRcdFx0Ly8gbmV3IHRhYiB3aGVuIGlkIGlzIHByb3ZpZGVkIGJ1dCBkb2Vzbid0IG1hdGNoIGFueSBzdGF0aWMgdGFiIGlkXHJcblx0XHRcdHJldHVybiAhc3RhdGljVGFiSWRzLmhhcyh0YWIuaWQpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0aWYgKG5ld0NvbmZpZ1RhYnMubGVuZ3RoID4gMCAmJiB0aGlzLmRldGFpbENvbXBvbmVudC5jb25maWdUYWJzKSB7XHJcblx0XHRcdCh0aGlzLmRldGFpbENvbXBvbmVudC5jb25maWdUYWJzIGFzIGFueSkuc2V0KG5ld0NvbmZpZ1RhYnMpO1xyXG5cdFx0fSBlbHNlIGlmIChuZXdDb25maWdUYWJzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0dGhpcy5kZXRhaWxDb21wb25lbnQudGFicyA9IG5ld0NvbmZpZ1RhYnM7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gdXNpbmcgc2V0VGltZW91dCB0byBlbnN1cmUgdGFiVmlldyBpcyByZWFkeSBhcyB3ZSB3YW50IHRvIHdvcmsgZGlyZWN0bHkgd2l0aCB0aGUgZ2VuZXJhdGVkIGVsZW1lbnRzXHJcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0Ly8gc3RlcCAzIC0gcmVvcmRlciB0YWJzXHJcblx0XHRcdHRoaXMucmVvcmRlclRhYnNCeVBvc2l0aW9uKCk7XHJcblx0XHRcdC8vIHN0ZXAgNCAtIGFjdGl2YXRlIHRhYiBmcm9tIFVSTCBpZiBzcGVjaWZpZWRcclxuXHRcdFx0dGhpcy5hY3RpdmF0ZVRhYkZyb21VcmwoKTtcclxuXHRcdFx0Ly8gc3RlcCA1IC0gdXBkYXRlIHRoZSBtZW51XHJcblx0XHRcdGlmICh0aGlzLmNvbmZpZz8ubWVudSkge1xyXG5cdFx0XHRcdHRoaXMudXBkYXRlTWVudSh0aGlzLmNvbmZpZy5tZW51KTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHVwZGF0ZVRhYlZpc2liaWxpdHkoKTogdm9pZCB7XHJcblx0XHRpZiAoIXRoaXMuY29uZmlnPy50YWJzKSByZXR1cm47XHJcblxyXG5cdFx0Ly8gRmluZCB0YWJzIGluIGNvbmZpZyB0aGF0IGhhdmUgdmlzaWJsZTogZmFsc2VcclxuXHRcdGNvbnN0IGhpZGRlblRhYlBvc2l0aW9ucyA9IHRoaXMuY29uZmlnLnRhYnMuZmlsdGVyKCh0YWIpID0+IHRhYi52aXNpYmxlID09PSBmYWxzZSkubWFwKCh0YWIpID0+IHRhYi5wb3NpdGlvbik7XHJcblxyXG5cdFx0aGlkZGVuVGFiUG9zaXRpb25zLmZvckVhY2goKHBvc2l0aW9uKSA9PiB7XHJcblx0XHRcdHRoaXMuaGlkZVRhYkJ5UG9zaXRpb24ocG9zaXRpb24sIHRydWUpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRoaWRlVGFiQnlQb3NpdGlvbihwb3NpdGlvbjogbnVtYmVyLCBoaWRlID0gdHJ1ZSk6IHZvaWQge1xyXG5cdFx0aWYgKCF0aGlzLmRldGFpbENvbXBvbmVudC50YWJWaWV3Py50YWJzKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgcGFuZWxUb0hpZGUgPSB0aGlzLmRldGFpbENvbXBvbmVudC50YWJWaWV3LnRhYnNbcG9zaXRpb25dO1xyXG5cdFx0Y29uc3QgdGFiVG9IaWRlID0gdGhpcy5kZXRhaWxDb21wb25lbnQudGFiVmlldy5saXN0Py5jaGlsZHJlbltwb3NpdGlvbl0gYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG5cdFx0aWYgKHRhYlRvSGlkZSAmJiBwYW5lbFRvSGlkZSkge1xyXG5cdFx0XHRwYW5lbFRvSGlkZS5lbC5uYXRpdmVFbGVtZW50LmhpZGRlbiA9IGhpZGU7XHJcblx0XHRcdHRhYlRvSGlkZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVvcmRlciB0YWJzIGJhc2VkIG9uIGNvbmZpZyBwb3NpdGlvbnNcclxuXHQgKiBJdGVyYXRlcyBvdmVyIHZpc2libGUgY29uZmlnIHRhYnMgYW5kIHJlYXJyYW5nZXMgYm90aCBzdGF0aWMgYW5kIGNvbmZpZyB0YWJzXHJcblx0ICovXHJcblx0cHJpdmF0ZSByZW9yZGVyVGFic0J5UG9zaXRpb24oKTogdm9pZCB7XHJcblx0XHRpZiAoIXRoaXMuZGV0YWlsQ29tcG9uZW50LnRhYlZpZXc/LnRhYnMgfHwgIXRoaXMuZGV0YWlsQ29tcG9uZW50LnRhYlZpZXc/Lmxpc3QpIHJldHVybjtcclxuXHJcblx0XHRjb25zdCBjb25maWdUYWJzID0gdGhpcy5nZXRQcm9jZXNzZWRUYWJzKCk7XHJcblx0XHRjb25zdCBhbGxUYWJzID0gdGhpcy5kZXRhaWxDb21wb25lbnQudGFiVmlldy50YWJzO1xyXG5cdFx0Y29uc3QgbmF2TGlzdCA9IHRoaXMuZGV0YWlsQ29tcG9uZW50LnRhYlZpZXcubGlzdDtcclxuXHJcblx0XHRjb25zdCBjb25maWdUYWJNYXAgPSBuZXcgTWFwPHN0cmluZyB8IG51bWJlciB8IG51bGwsIFRhYkNvbmZpZz4oKTtcclxuXHRcdGNvbmZpZ1RhYnMuZm9yRWFjaCgodGFiKSA9PiB7XHJcblx0XHRcdC8vIE9ubHkgdHJlYXQgdGFicyB0aGF0IGJvdGg6XHJcblx0XHRcdC8vIC0gaGF2ZSBhbiBpZFxyXG5cdFx0XHQvLyAtIGFuZCBoYXZlIGFuIGV4cGxpY2l0IHBvc2l0aW9uXHJcblx0XHRcdC8vIGFzIFwicmVvcmRlciBpbnN0cnVjdGlvbnNcIiBmb3IgZXhpc3Rpbmcgc3RhdGljIHRhYnMuXHJcblx0XHRcdC8vIFRhYnMgd2l0aG91dCBhIHBvc2l0aW9uIChldmVuIGlmIHRoZXkgaGF2ZSBhbiBpZCkgYXJlIGNvbnNpZGVyZWRcclxuXHRcdFx0Ly8gcmVndWxhci9uZXcgdGFicyBhbmQgc2hvdWxkIGtlZXAgdGhlaXIgbmF0dXJhbCBvcmRlci5cclxuXHRcdFx0aWYgKHRhYi5pZCAmJiB0YWIucG9zaXRpb24pIHtcclxuXHRcdFx0XHRjb25maWdUYWJNYXAuc2V0KHRhYi5pZCwgdGFiKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gc2VwYXJhdGUgc3RhdGljIGZyb20gY29uZmlnIHRhYnNcclxuXHRcdGNvbnN0IHN0YXRpY1RhYnM6IEFycmF5PHsgdGFiOiBhbnk7IGluZGV4OiBudW1iZXI7IGlkOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIH0+ID0gW107XHJcblx0XHRjb25zdCBjb25maWdUYWJJbnN0YW5jZXM6IEFycmF5PHsgdGFiOiBhbnk7IGluZGV4OiBudW1iZXI7IGNvbmZpZzogVGFiQ29uZmlnIH0+ID0gW107XHJcblxyXG5cdFx0YWxsVGFicy5mb3JFYWNoKCh0YWJQYW5lbCwgaW5kZXgpID0+IHtcclxuXHRcdFx0Y29uc3QgdGFiSWQgPSB0YWJQYW5lbD8uZWw/Lm5hdGl2ZUVsZW1lbnQ/LmlkIHx8IG51bGw7XHJcblx0XHRcdGNvbnN0IGNvbmZpZ1RhYiA9IHRhYklkID8gY29uZmlnVGFiTWFwLmdldCh0YWJJZCkgOiBudWxsO1xyXG5cclxuXHRcdFx0aWYgKGNvbmZpZ1RhYikge1xyXG5cdFx0XHRcdGNvbmZpZ1RhYkluc3RhbmNlcy5wdXNoKHsgdGFiOiB0YWJQYW5lbCwgaW5kZXgsIGNvbmZpZzogY29uZmlnVGFiIH0pO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHN0YXRpY1RhYnMucHVzaCh7IHRhYjogdGFiUGFuZWwsIGluZGV4LCBpZDogdGFiSWQgfSk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdGNvbnN0IHBvc2l0aW9uTWFwID0gbmV3IE1hcDxudW1iZXIsIHsgdGFiOiBhbnk7IGlzQ29uZmlnOiBib29sZWFuOyBpZDogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB9PigpO1xyXG5cclxuXHRcdC8vIHBsYWNlIGNvbmZpZyB0YWJzIGF0IHRoZWlyIHNwZWNpZmllZCBwb3NpdGlvbnNcclxuXHRcdGNvbmZpZ1RhYkluc3RhbmNlcy5mb3JFYWNoKCh7IHRhYiwgY29uZmlnIH0pID0+IHtcclxuXHRcdFx0aWYgKGNvbmZpZy5wb3NpdGlvbiAhPT0gdW5kZWZpbmVkICYmIGNvbmZpZy5wb3NpdGlvbiAhPT0gbnVsbCkge1xyXG5cdFx0XHRcdHBvc2l0aW9uTWFwLnNldChjb25maWcucG9zaXRpb24sIHsgdGFiLCBpc0NvbmZpZzogdHJ1ZSwgaWQ6IGNvbmZpZy5pZCB9KTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gcGxhY2Ugc3RhdGljIHRhYnMgYXQgYXZhaWxhYmxlIHBvc2l0aW9ucyAobWFpbnRhaW5pbmcgcmVsYXRpdmUgb3JkZXIpXHJcblx0XHRsZXQgc3RhdGljSW5kZXggPSAwO1xyXG5cdFx0bGV0IGN1cnJlbnRQb3NpdGlvbiA9IDA7XHJcblxyXG5cdFx0d2hpbGUgKHN0YXRpY0luZGV4IDwgc3RhdGljVGFicy5sZW5ndGgpIHtcclxuXHRcdFx0d2hpbGUgKHBvc2l0aW9uTWFwLmhhcyhjdXJyZW50UG9zaXRpb24pKSB7XHJcblx0XHRcdFx0Y3VycmVudFBvc2l0aW9uKys7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIHBsYWNlIHN0YXRpYyB0YWIgYXQgdGhpcyBwb3NpdGlvblxyXG5cdFx0XHRjb25zdCBzdGF0aWNUYWIgPSBzdGF0aWNUYWJzW3N0YXRpY0luZGV4XTtcclxuXHRcdFx0cG9zaXRpb25NYXAuc2V0KGN1cnJlbnRQb3NpdGlvbiwgeyB0YWI6IHN0YXRpY1RhYi50YWIsIGlzQ29uZmlnOiBmYWxzZSwgaWQ6IHN0YXRpY1RhYi5pZCB9KTtcclxuXHRcdFx0c3RhdGljSW5kZXgrKztcclxuXHRcdFx0Y3VycmVudFBvc2l0aW9uKys7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYnVpbGQgb3JkZXJlZCBhcnJheVxyXG5cdFx0Y29uc3Qgc29ydGVkUG9zaXRpb25zID0gQXJyYXkuZnJvbShwb3NpdGlvbk1hcC5rZXlzKCkpLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcclxuXHRcdGNvbnN0IHJlb3JkZXJlZFRhYnM6IGFueVtdID0gW107XHJcblx0XHRjb25zdCByZW9yZGVyZWRIZWFkZXJzOiBIVE1MRWxlbWVudFtdID0gW107XHJcblxyXG5cdFx0c29ydGVkUG9zaXRpb25zLmZvckVhY2goKHBvc2l0aW9uKSA9PiB7XHJcblx0XHRcdGNvbnN0IHRhYkluZm8gPSBwb3NpdGlvbk1hcC5nZXQocG9zaXRpb24pITtcclxuXHRcdFx0cmVvcmRlcmVkVGFicy5wdXNoKHRhYkluZm8udGFiKTtcclxuXHJcblx0XHRcdGNvbnN0IG9yaWdpbmFsSW5kZXggPSBhbGxUYWJzLmluZGV4T2YodGFiSW5mby50YWIpO1xyXG5cdFx0XHRpZiAob3JpZ2luYWxJbmRleCAhPT0gLTEgJiYgbmF2TGlzdC5jaGlsZHJlbltvcmlnaW5hbEluZGV4XSkge1xyXG5cdFx0XHRcdHJlb3JkZXJlZEhlYWRlcnMucHVzaChuYXZMaXN0LmNoaWxkcmVuW29yaWdpbmFsSW5kZXhdIGFzIEhUTUxFbGVtZW50KTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gcmVvcmRlciB0YWJzIGFycmF5XHJcblx0XHR0aGlzLmRldGFpbENvbXBvbmVudC50YWJWaWV3LnRhYnMubGVuZ3RoID0gMDtcclxuXHRcdHJlb3JkZXJlZFRhYnMuZm9yRWFjaCgodGFiKSA9PiB0aGlzLmRldGFpbENvbXBvbmVudC50YWJWaWV3IS50YWJzLnB1c2godGFiKSk7XHJcblxyXG5cdFx0Ly8gcmVvcmRlciBkb20gaGVhZGVyc1xyXG5cdFx0cmVvcmRlcmVkSGVhZGVycy5mb3JFYWNoKChoZWFkZXIsIG5ld0luZGV4KSA9PiB7XHJcblx0XHRcdGNvbnN0IHRhcmdldEhlYWRlciA9IG5hdkxpc3QuY2hpbGRyZW5bbmV3SW5kZXhdO1xyXG5cdFx0XHRpZiAodGFyZ2V0SGVhZGVyICYmIHRhcmdldEhlYWRlciAhPT0gaGVhZGVyKSB7XHJcblx0XHRcdFx0bmF2TGlzdC5pbnNlcnRCZWZvcmUoaGVhZGVyLCB0YXJnZXRIZWFkZXIpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKCF0YXJnZXRIZWFkZXIpIHtcclxuXHRcdFx0XHRuYXZMaXN0LmFwcGVuZENoaWxkKGhlYWRlcik7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIHJlb3JkZXIgZG9tIHBhbmVsc1xyXG5cdFx0Y29uc3QgcGFuZWxzQ29udGFpbmVyID0gYWxsVGFic1swXT8uZWwubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG5cdFx0aWYgKHBhbmVsc0NvbnRhaW5lcikge1xyXG5cdFx0XHRyZW9yZGVyZWRUYWJzLmZvckVhY2goKHRhYlBhbmVsLCBuZXdJbmRleCkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHRhcmdldFBhbmVsID0gcGFuZWxzQ29udGFpbmVyLmNoaWxkcmVuW25ld0luZGV4XTtcclxuXHRcdFx0XHRpZiAodGFyZ2V0UGFuZWwgJiYgdGFyZ2V0UGFuZWwgIT09IHRhYlBhbmVsLmVsLm5hdGl2ZUVsZW1lbnQpIHtcclxuXHRcdFx0XHRcdHBhbmVsc0NvbnRhaW5lci5pbnNlcnRCZWZvcmUodGFiUGFuZWwuZWwubmF0aXZlRWxlbWVudCwgdGFyZ2V0UGFuZWwpO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIXRhcmdldFBhbmVsKSB7XHJcblx0XHRcdFx0XHRwYW5lbHNDb250YWluZXIuYXBwZW5kQ2hpbGQodGFiUGFuZWwuZWwubmF0aXZlRWxlbWVudCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5kZXRhaWxDb21wb25lbnQudGFiVmlldy5jZCkge1xyXG5cdFx0XHR0aGlzLmRldGFpbENvbXBvbmVudC50YWJWaWV3LmNkLm1hcmtGb3JDaGVjaygpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBhY3RpdmF0ZVRhYkZyb21VcmwoKTogdm9pZCB7XHJcblx0XHRpZiAoIXRoaXMuZGV0YWlsQ29tcG9uZW50LnRhYlZpZXcpIHJldHVybjtcclxuXHJcblx0XHRjb25zdCBhY3RpdmVUYWJQYXJhbSA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcC5nZXQoJ2FjdGl2ZVRhYicpO1xyXG5cdFx0aWYgKGFjdGl2ZVRhYlBhcmFtKSB7XHJcblx0XHRcdGNvbnN0IGFjdGl2ZVRhYkluZGV4ID0gTnVtYmVyKGFjdGl2ZVRhYlBhcmFtKTtcclxuXHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHQhaXNOYU4oYWN0aXZlVGFiSW5kZXgpICYmXHJcblx0XHRcdFx0YWN0aXZlVGFiSW5kZXggPj0gMCAmJlxyXG5cdFx0XHRcdHRoaXMuZGV0YWlsQ29tcG9uZW50LnRhYlZpZXcudGFicyAmJlxyXG5cdFx0XHRcdGFjdGl2ZVRhYkluZGV4IDwgdGhpcy5kZXRhaWxDb21wb25lbnQudGFiVmlldy50YWJzLmxlbmd0aFxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHR0aGlzLmRldGFpbENvbXBvbmVudC50YWJWaWV3LmFjdGl2ZUluZGV4ID0gYWN0aXZlVGFiSW5kZXg7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgdXBkYXRlTWVudShtZW51Q29uZmlnOiBEZXRhaWxDb25maWdNZW51SXRlbVtdKSB7XHJcblx0XHRjb25zdCBjb250ZXh0ID0ge1xyXG5cdFx0XHRyb3V0ZXI6IHRoaXMucm91dGVyLFxyXG5cdFx0XHRyb3V0ZTogdGhpcy5yb3V0ZSxcclxuXHRcdFx0ZGlhbG9nU2VydmljZTogdGhpcy5kaWFsb2dTZXJ2aWNlLFxyXG5cdFx0XHRjb21wb25lbnQ6IHRoaXMuZGV0YWlsQ29tcG9uZW50XHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbnN0IGFjdGl2ZUxhbmcgPSB0aGlzLnRyYW5zbG9jb1NlcnZpY2UuZ2V0QWN0aXZlTGFuZygpO1xyXG5cdFx0Y29uc3QgZHluYW1pY01lbnU6IE1lbnVJdGVtW10gPSBtZW51Q29uZmlnLm1hcCgobSkgPT4gKHtcclxuXHRcdFx0bGFiZWw6IG0ubGFiZWxbYWN0aXZlTGFuZ10gPz8gJycsXHJcblx0XHRcdGljb246IG0uaWNvbixcclxuXHRcdFx0Y29tbWFuZDogKF9ldmVudDogYW55KSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgY29tbWFuZEZuID0gbmV3IEZ1bmN0aW9uKCdjdHgnLCBtLmNvbW1hbmQpO1xyXG5cdFx0XHRcdGNvbW1hbmRGbihjb250ZXh0KShjb250ZXh0KTtcclxuXHRcdFx0fVxyXG5cdFx0fSkpO1xyXG5cclxuXHRcdC8vIFVwZGF0ZSB0aGUgZXhpc3Rpbmcgc2lnbmFsIGluc3RlYWQgb2YgcmVwbGFjaW5nIGl0IHRvIGVuc3VyZSBjaGFuZ2VcclxuXHRcdC8vIGRldGVjdGlvbiBwaWNrcyB1cCB0aGUgbWVudSB1cGRhdGUgYWZ0ZXIgYnJvd3NlciBiYWNrIG5hdmlnYXRpb24uXHJcblx0XHRjb25zdCBnZW5lcmFsTWVudVNpZ25hbCA9IHRoaXMuZGV0YWlsQ29tcG9uZW50Lm1kSW5mb1BsdWdpblByb3BzLmdlbmVyYWxNZW51IGFzIGFueTtcclxuXHRcdGNvbnN0IGV4aXN0aW5nTWVudTogTWVudUl0ZW1bXSA9IGdlbmVyYWxNZW51U2lnbmFsKCk7XHJcblxyXG5cdFx0Ly8gQXZvaWQgZHVwbGljYXRpbmcgcHJldmlvdXNseSBhZGRlZCBkeW5hbWljIGl0ZW1zIChpZGVudGlmaWVkIGJ5IGxhYmVsL2ljb24gbWF0Y2gpXHJcblx0XHRjb25zdCBtZXJnZWRNZW51ID0gW1xyXG5cdFx0XHQuLi5leGlzdGluZ01lbnUuZmlsdGVyKChpdGVtKSA9PiAhZHluYW1pY01lbnUuc29tZSgoZHluKSA9PiBkeW4ubGFiZWwgPT09IGl0ZW0ubGFiZWwgJiYgZHluLmljb24gPT09IGl0ZW0uaWNvbikpLFxyXG5cdFx0XHQuLi5keW5hbWljTWVudVxyXG5cdFx0XTtcclxuXHJcblx0XHRpZiAoZ2VuZXJhbE1lbnVTaWduYWw/LnNldCkge1xyXG5cdFx0XHRnZW5lcmFsTWVudVNpZ25hbC5zZXQobWVyZ2VkTWVudSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLmRldGFpbENvbXBvbmVudC5tZEluZm9QbHVnaW5Qcm9wcy5nZW5lcmFsTWVudSA9IHNpZ25hbChtZXJnZWRNZW51KTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from './detail-page-customization.directive';
|
|
2
|
+
export * from './models';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcmlsL3V0aWwvZGlyZWN0aXZlcy9zcmMvZGV0YWlsLXBhZ2UtY3VzdG9taXphdGlvbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHVDQUF1QyxDQUFDO0FBQ3RELGNBQWMsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9kZXRhaWwtcGFnZS1jdXN0b21pemF0aW9uLmRpcmVjdGl2ZSc7IFxyXG5leHBvcnQgKiBmcm9tICcuL21vZGVscyc7Il19
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
export const DETAIL_COMPONENT = new InjectionToken('DETAIL_COMPONENT');
|
|
3
|
+
export const PLUGIN_DIALOG_SERVICE = new InjectionToken('PLUGIN_DIALOG_SERVICE');
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJpbC91dGlsL2RpcmVjdGl2ZXMvc3JjL2RldGFpbC1wYWdlLWN1c3RvbWl6YXRpb24vbW9kZWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFrQnZELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFrQixrQkFBa0IsQ0FBQyxDQUFDO0FBQ3hGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLElBQUksY0FBYyxDQUFDLHVCQUF1QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiwgU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBNZW51SXRlbSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgVGFiVmlldyB9IGZyb20gJ3ByaW1lbmcvdGFidmlldyc7XHJcblxyXG5pbXBvcnQgeyBzb2xpZEljb25zIH0gZnJvbSAnYXJpbC91dGlsL2xpYic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERldGFpbENvbXBvbmVudCB7XHJcblx0bWRJbmZvUGx1Z2luUHJvcHM6IHtcclxuXHRcdGdlbmVyYWxNZW51OiBTaWduYWw8TWVudUl0ZW1bXT47XHJcblx0fTtcclxuXHQvLyBzaWduYWxzIGZvciByZWFjdGl2ZSB1cGRhdGVzXHJcblx0Y29uZmlnVGFiczogU2lnbmFsPFRhYkNvbmZpZ1tdPjtcclxuXHRhY3RpdmVUYWJDb21wb25lbnRzOiBTaWduYWw8VGFiQ29uZmlnWydjb21wb25lbnRzJ10+O1xyXG5cdHRhYnM6IFRhYkNvbmZpZ1tdO1xyXG5cdHRhYlZpZXc/OiBUYWJWaWV3O1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgREVUQUlMX0NPTVBPTkVOVCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxEZXRhaWxDb21wb25lbnQ+KCdERVRBSUxfQ09NUE9ORU5UJyk7XHJcbmV4cG9ydCBjb25zdCBQTFVHSU5fRElBTE9HX1NFUlZJQ0UgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ1BMVUdJTl9ESUFMT0dfU0VSVklDRScpO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUYWJDb25maWcge1xyXG5cdGlkOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsO1xyXG5cdGhlYWRlcjogc3RyaW5nO1xyXG5cdGljb246IGtleW9mIHR5cGVvZiBzb2xpZEljb25zO1xyXG5cdHZpc2libGU6IGJvb2xlYW47XHJcblx0cG9zaXRpb246IG51bWJlcjtcclxuXHRjb21wb25lbnRzOiBBcnJheTx7XHJcblx0XHRpZDogc3RyaW5nIHwgbnVsbDtcclxuXHRcdHBsdWdpbk5hbWU6IHN0cmluZztcclxuXHRcdHZpc2libGU6IGJvb2xlYW47XHJcblx0XHRvcmRlcj86IG51bWJlcjtcclxuXHR9PjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEZXRhaWxDb25maWdNZW51SXRlbSB7XHJcblx0bGFiZWw6IHtcclxuXHRcdFtrZXk6IHN0cmluZ106IHN0cmluZztcclxuXHR9O1xyXG5cdGNvbW1hbmQ6IHN0cmluZztcclxuXHRpY29uOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGV0YWlsQ29uZmlnIHtcclxuXHRtZW51OiBBcnJheTxEZXRhaWxDb25maWdNZW51SXRlbT47XHJcblx0dGFiczogQXJyYXk8e1xyXG5cdFx0aWQ6IHN0cmluZyB8IG51bGw7XHJcblx0XHRpY29uOiBrZXlvZiB0eXBlb2Ygc29saWRJY29ucztcclxuXHRcdGxhYmVsPzoge1xyXG5cdFx0XHRba2V5OiBzdHJpbmddOiBzdHJpbmc7XHJcblx0XHR9O1xyXG5cdFx0dmlzaWJsZTogYm9vbGVhbjtcclxuXHRcdHBvc2l0aW9uOiBudW1iZXI7XHJcblx0XHRjb21wb25lbnRzOiBBcnJheTx7XHJcblx0XHRcdGlkOiBzdHJpbmcgfCBudWxsO1xyXG5cdFx0XHRwbHVnaW5OYW1lOiBzdHJpbmc7XHJcblx0XHRcdHZpc2libGU6IGJvb2xlYW47XHJcblx0XHRcdG9yZGVyPzogbnVtYmVyO1xyXG5cdFx0fT47XHJcblx0fT47XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { ModuleFederationToolsModule } from '@angular-architects/module-federation-tools';
|
|
3
|
+
import { PLUGINS } from 'aril/boot/config/plugins';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "primeng/dynamicdialog";
|
|
6
|
+
import * as i2 from "@angular-architects/module-federation-tools";
|
|
7
|
+
export class CustomizedPluginDialogComponent {
|
|
8
|
+
constructor(dialogConfig) {
|
|
9
|
+
this.dialogConfig = dialogConfig;
|
|
10
|
+
this.PLUGINS = PLUGINS;
|
|
11
|
+
this.dialogConfig.draggable = true;
|
|
12
|
+
this.name = this.dialogConfig.data;
|
|
13
|
+
}
|
|
14
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CustomizedPluginDialogComponent, deps: [{ token: i1.DynamicDialogConfig }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
15
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.2", type: CustomizedPluginDialogComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: `<mft-wc-wrapper [options]="PLUGINS[name].options" />`, isInline: true, dependencies: [{ kind: "ngmodule", type: ModuleFederationToolsModule }, { kind: "component", type: i2.WebComponentWrapper, selector: "mft-wc-wrapper", inputs: ["options", "props", "events"] }] }); }
|
|
16
|
+
}
|
|
17
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CustomizedPluginDialogComponent, decorators: [{
|
|
18
|
+
type: Component,
|
|
19
|
+
args: [{
|
|
20
|
+
standalone: true,
|
|
21
|
+
imports: [ModuleFederationToolsModule],
|
|
22
|
+
template: `<mft-wc-wrapper [options]="PLUGINS[name].options" />`
|
|
23
|
+
}]
|
|
24
|
+
}], ctorParameters: () => [{ type: i1.DynamicDialogConfig }] });
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcmlsL3V0aWwvZGlyZWN0aXZlcy9zcmMvZGlhbG9nLWNvbXBvbmVudC9wbHVnaW4tZGlhbG9nLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSTFDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBRTFGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7OztBQU9uRCxNQUFNLE9BQU8sK0JBQStCO0lBSTNDLFlBQTZCLFlBQWlDO1FBQWpDLGlCQUFZLEdBQVosWUFBWSxDQUFxQjtRQUY5RCxZQUFPLEdBQUcsT0FBTyxDQUFDO1FBR2pCLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO0lBQ3BDLENBQUM7OEdBUFcsK0JBQStCO2tHQUEvQiwrQkFBK0Isd0VBRmpDLHNEQUFzRCwyREFEdEQsMkJBQTJCOzsyRkFHekIsK0JBQStCO2tCQUwzQyxTQUFTO21CQUFDO29CQUNWLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQztvQkFDdEMsUUFBUSxFQUFFLHNEQUFzRDtpQkFDaEUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IER5bmFtaWNEaWFsb2dDb25maWcgfSBmcm9tICdwcmltZW5nL2R5bmFtaWNkaWFsb2cnO1xyXG5cclxuaW1wb3J0IHsgTW9kdWxlRmVkZXJhdGlvblRvb2xzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXItYXJjaGl0ZWN0cy9tb2R1bGUtZmVkZXJhdGlvbi10b29scyc7XHJcblxyXG5pbXBvcnQgeyBQTFVHSU5TIH0gZnJvbSAnYXJpbC9ib290L2NvbmZpZy9wbHVnaW5zJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHN0YW5kYWxvbmU6IHRydWUsXHJcblx0aW1wb3J0czogW01vZHVsZUZlZGVyYXRpb25Ub29sc01vZHVsZV0sXHJcblx0dGVtcGxhdGU6IGA8bWZ0LXdjLXdyYXBwZXIgW29wdGlvbnNdPVwiUExVR0lOU1tuYW1lXS5vcHRpb25zXCIgLz5gXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDdXN0b21pemVkUGx1Z2luRGlhbG9nQ29tcG9uZW50IHtcclxuXHRuYW1lOiBzdHJpbmc7XHJcblx0UExVR0lOUyA9IFBMVUdJTlM7XHJcblxyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nQ29uZmlnOiBEeW5hbWljRGlhbG9nQ29uZmlnKSB7XHJcblx0XHR0aGlzLmRpYWxvZ0NvbmZpZy5kcmFnZ2FibGUgPSB0cnVlO1xyXG5cdFx0dGhpcy5uYW1lID0gdGhpcy5kaWFsb2dDb25maWcuZGF0YTtcclxuXHR9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { DialogService } from 'primeng/dynamicdialog';
|
|
3
|
+
import { CustomizedPluginDialogComponent } from '../dialog-component/plugin-dialog.component';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class CustomizedPluginDialogService extends DialogService {
|
|
6
|
+
openDialog(config) {
|
|
7
|
+
return super.open(CustomizedPluginDialogComponent, config);
|
|
8
|
+
}
|
|
9
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CustomizedPluginDialogService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
10
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CustomizedPluginDialogService, providedIn: 'root' }); }
|
|
11
|
+
}
|
|
12
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CustomizedPluginDialogService, decorators: [{
|
|
13
|
+
type: Injectable,
|
|
14
|
+
args: [{ providedIn: 'root' }]
|
|
15
|
+
}] });
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWRpYWxvZy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJpbC91dGlsL2RpcmVjdGl2ZXMvc3JjL2RpYWxvZy1zZXJ2aWNlL3BsdWdpbi1kaWFsb2cuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxhQUFhLEVBQXlDLE1BQU0sdUJBQXVCLENBQUM7QUFFN0YsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7O0FBRzlGLE1BQU0sT0FBTyw2QkFBOEIsU0FBUSxhQUFhO0lBQy9ELFVBQVUsQ0FBQyxNQUEyQjtRQUNyQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsK0JBQStCLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUQsQ0FBQzs4R0FIVyw2QkFBNkI7a0hBQTdCLDZCQUE2QixjQURoQixNQUFNOzsyRkFDbkIsNkJBQTZCO2tCQUR6QyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UsIER5bmFtaWNEaWFsb2dDb25maWcsIER5bmFtaWNEaWFsb2dSZWYgfSBmcm9tICdwcmltZW5nL2R5bmFtaWNkaWFsb2cnO1xyXG5cclxuaW1wb3J0IHsgQ3VzdG9taXplZFBsdWdpbkRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL2RpYWxvZy1jb21wb25lbnQvcGx1Z2luLWRpYWxvZy5jb21wb25lbnQnO1xyXG5cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcclxuZXhwb3J0IGNsYXNzIEN1c3RvbWl6ZWRQbHVnaW5EaWFsb2dTZXJ2aWNlIGV4dGVuZHMgRGlhbG9nU2VydmljZSB7XHJcblx0b3BlbkRpYWxvZyhjb25maWc6IER5bmFtaWNEaWFsb2dDb25maWcpOiBEeW5hbWljRGlhbG9nUmVmIHtcclxuXHRcdHJldHVybiBzdXBlci5vcGVuKEN1c3RvbWl6ZWRQbHVnaW5EaWFsb2dDb21wb25lbnQsIGNvbmZpZyk7XHJcblx0fVxyXG59XHJcbiJdfQ==
|
|
@@ -93,8 +93,7 @@ const loadApiConfigs = (httpClient, keycloak, appName, microAppService) => () =>
|
|
|
93
93
|
function setApiConfigOnMFEMode(httpClient, keycloak, appName) {
|
|
94
94
|
return () => {
|
|
95
95
|
const observable$ = httpClient
|
|
96
|
-
.get(isDevMode() ? './assets/local-configs/api.local.json'
|
|
97
|
-
: './api.json')
|
|
96
|
+
.get(isDevMode() ? './assets/local-configs/api.local.json' : './api.json')
|
|
98
97
|
.pipe(tap((configs) => {
|
|
99
98
|
Object.assign(API_CONFIGS, { ...configs });
|
|
100
99
|
if (appName !== Apps.THOR && appName !== Apps.YEAP) {
|
|
@@ -104,10 +103,23 @@ function setApiConfigOnMFEMode(httpClient, keycloak, appName) {
|
|
|
104
103
|
return firstValueFrom(observable$);
|
|
105
104
|
};
|
|
106
105
|
}
|
|
106
|
+
const loadInitData = (httpClient) => () => new Promise((resolve, _reject) => {
|
|
107
|
+
const endpoint = API_CONFIGS.api + '/ui-route-content-configs/all';
|
|
108
|
+
httpClient.get(endpoint).subscribe({
|
|
109
|
+
next: (data) => {
|
|
110
|
+
globalThis.routeConfigs = data;
|
|
111
|
+
resolve();
|
|
112
|
+
},
|
|
113
|
+
error: (err) => {
|
|
114
|
+
console.error(`Failed to load init data from ${endpoint}:`, err);
|
|
115
|
+
resolve();
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
});
|
|
107
119
|
|
|
108
120
|
/**
|
|
109
121
|
* Generated bundle index. Do not edit.
|
|
110
122
|
*/
|
|
111
123
|
|
|
112
|
-
export { API_CONFIGS, loadApiConfigs, setApiConfigOnMFEMode };
|
|
124
|
+
export { API_CONFIGS, loadApiConfigs, loadInitData, setApiConfigOnMFEMode };
|
|
113
125
|
//# sourceMappingURL=aril-boot-config-api.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aril-boot-config-api.mjs","sources":["../../projects/aril/boot/config/api/src/interfaces.ts","../../projects/aril/boot/config/api/src/api.service.ts","../../projects/aril/boot/config/api/aril-boot-config-api.ts"],"sourcesContent":["export enum Apps {\r\n\tTHOR = 'thor',\r\n\tCRM = 'crm',\r\n\tWDM = 'wdm',\r\n\tBILLING = 'billing',\r\n\tPAYMENT = 'payment',\r\n\tYEAP = 'yeap',\r\n\tMW = 'mw',\r\n\tLENA = 'lena',\r\n\tHES = 'hes',\r\n\tCTS = 'cts',\r\n\tSIS = 'sis',\r\n\tMNG = 'mng',\r\n\tMDM = 'mdm',\r\n\tSTATE_MACHINE = 'state-machine',\r\n\tREPORT = 'report',\r\n\tLGC = 'lgc',\r\n\tDMS = 'dms'\r\n}\r\n\r\nexport enum AppsRoutes {\r\n\tMNG_BASE_URL = 'mngBaseUrl',\r\n}\r\n\r\nexport interface KeycloakConfig {\r\n\turl: string;\r\n\trealm: string;\r\n\tclientId: string;\r\n}\r\n\r\nexport class ApiConfigsFactory {\r\n\tapi: string = '';\r\n\tfromMail: string = '';\r\n\tmwApi: string = '';\r\n\taiApi: string = '';\r\n\tstatusApi: string = '';\r\n\tkeycloak!: Keycloak.KeycloakConfig;\r\n\troutes: Record<AppsRoutes, string> = {\r\n\t\tmngBaseUrl: '',\r\n\t};\r\n\tprefixMap: Record<Apps, string> = {\r\n\t\t[Apps.THOR]: '',\r\n\t\t[Apps.CRM]: '',\r\n\t\t[Apps.WDM]: '',\r\n\t\t[Apps.BILLING]: '',\r\n\t\t[Apps.PAYMENT]: '',\r\n\t\t[Apps.YEAP]: '',\r\n\t\t[Apps.MW]: '',\r\n\t\t[Apps.LENA]: '',\r\n\t\t[Apps.HES]: '',\r\n\t\t[Apps.CTS]: '',\r\n\t\t[Apps.SIS]: '',\r\n\t\t[Apps.MNG]: '',\r\n\t\t[Apps.STATE_MACHINE]: '',\r\n\t\t[Apps.MDM]:'',\r\n\t\t[Apps.REPORT]: '',\r\n\t\t[Apps.LGC]: '',\r\n\t\t[Apps.DMS]: ''\r\n\t};\r\n\tgetExternalAppEndpoint(appName: Apps): string {\r\n\t\tconst prefix = this.prefixMap[appName] || this.prefixMap[Apps.MNG];\r\n\t\treturn `${new URL(this.api).origin}/${prefix}`;\r\n\t}\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { isDevMode, signal } from '@angular/core';\r\n\r\nimport { KeycloakEventType, KeycloakService } from 'keycloak-angular';\r\nimport { EMPTY, finalize, firstValueFrom, from, switchMap, tap } from 'rxjs';\r\n\r\nimport { MicroAppService } from 'aril/boot/config/apps';\r\n\r\nimport { ApiConfigsFactory, Apps } from './interfaces';\r\n\r\nexport const API_CONFIGS = new ApiConfigsFactory();\r\n\r\nexport const loadApiConfigs =\r\n\t(httpClient: HttpClient, keycloak: KeycloakService, appName: string, microAppService?: MicroAppService) => () =>\r\n\t\tnew Promise<void>((resolve) =>\r\n\t\t\thttpClient\r\n\t\t\t\t.get<ApiConfigsFactory>(isDevMode() ? './assets/local-configs/api.local.json' : './api.json')\r\n\t\t\t\t.pipe(\r\n\t\t\t\t\tswitchMap((configs) => {\r\n\t\t\t\t\t\t(globalThis as any).hostMenuItems = signal([]);\r\n\t\t\t\t\t\t(globalThis as any).pluginJson = {};\r\n\r\n\t\t\t\t\t\tObject.assign(API_CONFIGS, { ...configs });\r\n\r\n\t\t\t\t\t\treturn from(\r\n\t\t\t\t\t\t\tkeycloak.init({\r\n\t\t\t\t\t\t\t\tconfig: API_CONFIGS.keycloak,\r\n\t\t\t\t\t\t\t\tloadUserProfileAtStartUp: true,\r\n\t\t\t\t\t\t\t\tinitOptions: { onLoad: 'login-required', checkLoginIframe: false },\r\n\t\t\t\t\t\t\t\tbearerExcludedUrls: ['/assets']\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t).pipe(\r\n\t\t\t\t\t\t\tfinalize(() =>\r\n\t\t\t\t\t\t\t\taddEventListener('module-ready', (event) => {\r\n\t\t\t\t\t\t\t\t\tconst app = (event as CustomEvent).detail;\r\n\t\t\t\t\t\t\t\t\tdispatchEvent(new CustomEvent(`${app}:init-keycloak`, { detail: keycloak }));\r\n\r\n\t\t\t\t\t\t\t\t\tkeycloak.keycloakEvents$.subscribe((e) => {\r\n\t\t\t\t\t\t\t\t\t\tif (e.type === KeycloakEventType.OnAuthRefreshSuccess) {\r\n\t\t\t\t\t\t\t\t\t\t\tdispatchEvent(new CustomEvent(`${app}:update-keycloak`, { detail: keycloak }));\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}),\r\n\t\t\t\t\tswitchMap(() => microAppService?.init(httpClient, API_CONFIGS.api) ?? EMPTY)\r\n\t\t\t\t)\r\n\t\t\t\t.subscribe()\r\n\t\t\t\t.add(resolve)\r\n\t\t);\r\n\r\n/**\r\n * only works when isHostMode is true\r\n * micro-app access its own api.json file when opened in host\r\n */\r\nexport function setApiConfigOnMFEMode(\r\n\thttpClient: HttpClient,\r\n\tkeycloak: KeycloakService,\r\n\tappName: Apps\r\n): () => Promise<any> {\r\n\treturn () => {\r\n\t\tconst observable$ = httpClient\r\n\t\t\t.get<ApiConfigsFactory>(
|
|
1
|
+
{"version":3,"file":"aril-boot-config-api.mjs","sources":["../../projects/aril/boot/config/api/src/interfaces.ts","../../projects/aril/boot/config/api/src/api.service.ts","../../projects/aril/boot/config/api/aril-boot-config-api.ts"],"sourcesContent":["export enum Apps {\r\n\tTHOR = 'thor',\r\n\tCRM = 'crm',\r\n\tWDM = 'wdm',\r\n\tBILLING = 'billing',\r\n\tPAYMENT = 'payment',\r\n\tYEAP = 'yeap',\r\n\tMW = 'mw',\r\n\tLENA = 'lena',\r\n\tHES = 'hes',\r\n\tCTS = 'cts',\r\n\tSIS = 'sis',\r\n\tMNG = 'mng',\r\n\tMDM = 'mdm',\r\n\tSTATE_MACHINE = 'state-machine',\r\n\tREPORT = 'report',\r\n\tLGC = 'lgc',\r\n\tDMS = 'dms'\r\n}\r\n\r\nexport enum AppsRoutes {\r\n\tMNG_BASE_URL = 'mngBaseUrl',\r\n}\r\n\r\nexport interface KeycloakConfig {\r\n\turl: string;\r\n\trealm: string;\r\n\tclientId: string;\r\n}\r\n\r\nexport class ApiConfigsFactory {\r\n\tapi: string = '';\r\n\tfromMail: string = '';\r\n\tmwApi: string = '';\r\n\taiApi: string = '';\r\n\tstatusApi: string = '';\r\n\tkeycloak!: Keycloak.KeycloakConfig;\r\n\troutes: Record<AppsRoutes, string> = {\r\n\t\tmngBaseUrl: '',\r\n\t};\r\n\tprefixMap: Record<Apps, string> = {\r\n\t\t[Apps.THOR]: '',\r\n\t\t[Apps.CRM]: '',\r\n\t\t[Apps.WDM]: '',\r\n\t\t[Apps.BILLING]: '',\r\n\t\t[Apps.PAYMENT]: '',\r\n\t\t[Apps.YEAP]: '',\r\n\t\t[Apps.MW]: '',\r\n\t\t[Apps.LENA]: '',\r\n\t\t[Apps.HES]: '',\r\n\t\t[Apps.CTS]: '',\r\n\t\t[Apps.SIS]: '',\r\n\t\t[Apps.MNG]: '',\r\n\t\t[Apps.STATE_MACHINE]: '',\r\n\t\t[Apps.MDM]:'',\r\n\t\t[Apps.REPORT]: '',\r\n\t\t[Apps.LGC]: '',\r\n\t\t[Apps.DMS]: ''\r\n\t};\r\n\tgetExternalAppEndpoint(appName: Apps): string {\r\n\t\tconst prefix = this.prefixMap[appName] || this.prefixMap[Apps.MNG];\r\n\t\treturn `${new URL(this.api).origin}/${prefix}`;\r\n\t}\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { isDevMode, signal } from '@angular/core';\r\n\r\nimport { KeycloakEventType, KeycloakService } from 'keycloak-angular';\r\nimport { EMPTY, finalize, firstValueFrom, from, switchMap, tap } from 'rxjs';\r\n\r\nimport { MicroAppService } from 'aril/boot/config/apps';\r\n\r\nimport { ApiConfigsFactory, Apps } from './interfaces';\r\n\r\nexport const API_CONFIGS = new ApiConfigsFactory();\r\n\r\nexport const loadApiConfigs =\r\n\t(httpClient: HttpClient, keycloak: KeycloakService, appName: string, microAppService?: MicroAppService) => () =>\r\n\t\tnew Promise<void>((resolve) =>\r\n\t\t\thttpClient\r\n\t\t\t\t.get<ApiConfigsFactory>(isDevMode() ? './assets/local-configs/api.local.json' : './api.json')\r\n\t\t\t\t.pipe(\r\n\t\t\t\t\tswitchMap((configs) => {\r\n\t\t\t\t\t\t(globalThis as any).hostMenuItems = signal([]);\r\n\t\t\t\t\t\t(globalThis as any).pluginJson = {};\r\n\r\n\t\t\t\t\t\tObject.assign(API_CONFIGS, { ...configs });\r\n\r\n\t\t\t\t\t\treturn from(\r\n\t\t\t\t\t\t\tkeycloak.init({\r\n\t\t\t\t\t\t\t\tconfig: API_CONFIGS.keycloak,\r\n\t\t\t\t\t\t\t\tloadUserProfileAtStartUp: true,\r\n\t\t\t\t\t\t\t\tinitOptions: { onLoad: 'login-required', checkLoginIframe: false },\r\n\t\t\t\t\t\t\t\tbearerExcludedUrls: ['/assets']\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t).pipe(\r\n\t\t\t\t\t\t\tfinalize(() =>\r\n\t\t\t\t\t\t\t\taddEventListener('module-ready', (event) => {\r\n\t\t\t\t\t\t\t\t\tconst app = (event as CustomEvent).detail;\r\n\t\t\t\t\t\t\t\t\tdispatchEvent(new CustomEvent(`${app}:init-keycloak`, { detail: keycloak }));\r\n\r\n\t\t\t\t\t\t\t\t\tkeycloak.keycloakEvents$.subscribe((e) => {\r\n\t\t\t\t\t\t\t\t\t\tif (e.type === KeycloakEventType.OnAuthRefreshSuccess) {\r\n\t\t\t\t\t\t\t\t\t\t\tdispatchEvent(new CustomEvent(`${app}:update-keycloak`, { detail: keycloak }));\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}),\r\n\t\t\t\t\tswitchMap(() => microAppService?.init(httpClient, API_CONFIGS.api) ?? EMPTY)\r\n\t\t\t\t)\r\n\t\t\t\t.subscribe()\r\n\t\t\t\t.add(resolve)\r\n\t\t);\r\n\r\n/**\r\n * only works when isHostMode is true\r\n * micro-app access its own api.json file when opened in host\r\n */\r\nexport function setApiConfigOnMFEMode(\r\n\thttpClient: HttpClient,\r\n\tkeycloak: KeycloakService,\r\n\tappName: Apps\r\n): () => Promise<any> {\r\n\treturn () => {\r\n\t\tconst observable$ = httpClient\r\n\t\t\t.get<ApiConfigsFactory>(isDevMode() ? './assets/local-configs/api.local.json' : './api.json')\r\n\t\t\t.pipe(\r\n\t\t\t\ttap((configs) => {\r\n\t\t\t\t\tObject.assign(API_CONFIGS, { ...configs });\r\n\t\t\t\t\tif (appName !== Apps.THOR && appName !== Apps.YEAP) {\r\n\t\t\t\t\t\tAPI_CONFIGS.api = API_CONFIGS.getExternalAppEndpoint(appName);\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t);\r\n\r\n\t\treturn firstValueFrom(observable$);\r\n\t};\r\n}\r\n\r\nexport const loadInitData = (httpClient: HttpClient) => () =>\r\n\tnew Promise<void>((resolve, _reject) => {\r\n\t\tconst endpoint = API_CONFIGS.api + '/ui-route-content-configs/all';\r\n\t\thttpClient.get(endpoint).subscribe({\r\n\t\t\tnext: (data) => {\r\n\t\t\t\t(globalThis as any).routeConfigs = data;\r\n\t\t\t\tresolve();\r\n\t\t\t},\r\n\t\t\terror: (err) => {\r\n\t\t\t\tconsole.error(`Failed to load init data from ${endpoint}:`, err);\r\n\t\t\t\tresolve();\r\n\t\t\t}\r\n\t\t});\r\n\t});\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { provideAnimations } from '@angular/platform-browser/animations';
|
|
|
6
6
|
import { provideRouter, withComponentInputBinding, withHashLocation, withViewTransitions, withRouterConfig, RouteReuseStrategy, Router } from '@angular/router';
|
|
7
7
|
import { MessageService, ConfirmationService } from 'primeng/api';
|
|
8
8
|
import { KeycloakBearerInterceptor, KeycloakAngularModule, KeycloakService } from 'keycloak-angular';
|
|
9
|
-
import { loadApiConfigs } from 'aril/boot/config/api';
|
|
9
|
+
import { loadApiConfigs, loadInitData } from 'aril/boot/config/api';
|
|
10
10
|
import { ArilReuseStrategy, MicroAppService } from 'aril/boot/config/apps';
|
|
11
11
|
import { loadPlugins } from 'aril/boot/config/plugins';
|
|
12
12
|
import { acceptLanguageInterceptor } from 'aril/http';
|
|
@@ -80,9 +80,11 @@ const boot = (_appName, routes) => {
|
|
|
80
80
|
if (router)
|
|
81
81
|
globalThis.hostRouter = router;
|
|
82
82
|
const runLoadApiConfigs = loadApiConfigs(httpClient, keycloak, folderName, microAppService);
|
|
83
|
+
const runLoadInitData = loadInitData(httpClient);
|
|
83
84
|
const runLoadPlugins = loadPlugins();
|
|
84
85
|
return async () => {
|
|
85
86
|
await runLoadApiConfigs();
|
|
87
|
+
await runLoadInitData();
|
|
86
88
|
runLoadPlugins();
|
|
87
89
|
};
|
|
88
90
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aril-boot-host.mjs","sources":["../../projects/aril/boot/host/src/app.component.ts","../../projects/aril/boot/host/src/bootstrap.ts","../../projects/aril/boot/host/aril-boot-host.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { Component, NgZone, inject, signal } from '@angular/core';\r\n\r\nimport { AppLayoutComponent, LayoutService } from 'aril/theme/layout';\r\nimport { PubSubService } from 'aril/util/pub-sub';\r\n\r\nimport { appName } from './bootstrap';\r\n\t\r\ntype MenuMode = 'static' | 'expandable';\r\n\r\n@Component({\r\n\tstandalone: true,\r\n\tselector: 'aril-root',\r\n\ttemplate: ` <app-layout></app-layout> `,\r\n\timports: [AppLayoutComponent]\r\n})\r\nexport class AppComponent {\r\n\tconstructor(\r\n\t\tprivate layoutService: LayoutService,\r\n\t\tprivate pubSubService: PubSubService\r\n\t) {\r\n\t\t(<any>globalThis).activeHost = appName;\r\n\t\t(<any>globalThis).__ARIL_PAGE_TITLE__ = signal('');\r\n\t\t(<any>globalThis).ngZone = inject(NgZone);\r\n\t\t(<any>globalThis).isHostMode = true;\r\n\r\n\t\tthis.pubSubService.subscribe('menuModeChanged', (data) => {\r\n\t\t\tconst menuMode = data?.custom;\r\n\t\t\t\r\n\t\t\tif (menuMode && (menuMode === 'static' || menuMode === 'expandable')) {\t\t\t\t\r\n\t\t\t\tthis.layoutService.config.update((config) => {\r\n\t\t\t\t\tconst newConfig = {\r\n\t\t\t\t\t\t...config,\r\n\t\t\t\t\t\tmenuMode: menuMode as MenuMode\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn newConfig;\r\n\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\tif (menuMode === 'static') {\r\n\t\t\t\t\tthis.layoutService.state.staticSidebarVisible = true;\r\n\t\t\t\t} else if (menuMode === 'expandable') {\r\n\t\t\t\t\tthis.layoutService.state.staticSidebarVisible = false;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t// Always close mobile menu on mode change\r\n\t\t\t\tthis.layoutService.state.staticMenuMobileActive = false;\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n}\r\n","import { HttpClient, provideHttpClient, withInterceptors } from '@angular/common/http';\r\nimport { APP_INITIALIZER, ApplicationConfig, importProvidersFrom } from '@angular/core';\r\nimport { bootstrapApplication } from '@angular/platform-browser';\r\nimport { provideAnimations } from '@angular/platform-browser/animations';\r\nimport {\r\n\tRouteReuseStrategy,\r\n\tRouter,\r\n\tRoutes,\r\n\tprovideRouter,\r\n\twithComponentInputBinding,\r\n\twithHashLocation,\r\n\twithRouterConfig,\r\n\twithViewTransitions\r\n} from '@angular/router';\r\n\r\nimport { ConfirmationService, MessageService } from 'primeng/api';\r\n\r\nimport { KeycloakAngularModule, KeycloakBearerInterceptor, KeycloakService } from 'keycloak-angular';\r\n\r\nimport { loadApiConfigs } from 'aril/boot/config/api';\r\nimport { Apps, ArilReuseStrategy, MicroAppService } from 'aril/boot/config/apps';\r\nimport { loadPlugins } from 'aril/boot/config/plugins';\r\nimport { acceptLanguageInterceptor } from 'aril/http';\r\nimport { i18nFolderName, i18nModule } from 'aril/i18n';\r\nimport { authInterceptor, keycloakAuthInterceptor } from 'aril/keycloak';\r\nimport { provideLocaleId } from 'aril/provider';\r\n\r\nimport { AppComponent } from './app.component';\r\n\r\nexport var appName: Apps;\r\n\r\nexport const boot = (_appName: Apps, routes: Routes) => {\r\n\tappName = _appName;\r\n\tconst appConfig: ApplicationConfig = {\r\n\t\tproviders: [\r\n\t\t\tprovideAnimations(),\r\n\t\t\tprovideLocaleId(),\r\n\t\t\tKeycloakBearerInterceptor,\r\n\t\t\tprovideHttpClient(withInterceptors([acceptLanguageInterceptor, authInterceptor, keycloakAuthInterceptor])),\r\n\t\t\tprovideRouter(\r\n\t\t\t\troutes,\r\n\t\t\t\twithComponentInputBinding(),\r\n\t\t\t\twithHashLocation(),\r\n\t\t\t\twithViewTransitions(),\r\n\t\t\t\twithRouterConfig({ onSameUrlNavigation: 'reload' })\r\n\t\t\t),\r\n\t\t\t{ provide: RouteReuseStrategy, useClass: ArilReuseStrategy },\r\n\t\t\timportProvidersFrom(i18nModule, KeycloakAngularModule),\r\n\t\t\tMessageService,\r\n\t\t\tConfirmationService,\r\n\t\t\t{\r\n\t\t\t\tprovide: APP_INITIALIZER,\r\n\t\t\t\tuseFactory: (\r\n\t\t\t\t\thttpClient: HttpClient,\r\n\t\t\t\t\tkeycloak: KeycloakService,\r\n\t\t\t\t\trouter: Router,\r\n\t\t\t\t\tfolderName: typeof i18nFolderName,\r\n\t\t\t\t\tmicroAppService: MicroAppService\r\n\t\t\t\t) => {\r\n\t\t\t\t\tif (router) (globalThis as any).hostRouter = router;\r\n\r\n\t\t\t\t\tconst runLoadApiConfigs = loadApiConfigs(\r\n\t\t\t\t\t\thttpClient,\r\n\t\t\t\t\t\tkeycloak,\r\n\t\t\t\t\t\tfolderName as unknown as string,\r\n\t\t\t\t\t\tmicroAppService\r\n\t\t\t\t\t);\r\n\t\t\t\t\tconst runLoadPlugins = loadPlugins();\r\n\t\t\t\t\treturn async () => {\r\n\t\t\t\t\t\tawait runLoadApiConfigs();\r\n\t\t\t\t\t\trunLoadPlugins();\r\n\t\t\t\t\t};\r\n\t\t\t\t},\r\n\t\t\t\tmulti: true,\r\n\t\t\t\tdeps: [HttpClient, KeycloakService, Router, i18nFolderName, MicroAppService]\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tprovide: i18nFolderName,\r\n\t\t\t\tuseValue: 'host'\r\n\t\t\t}\r\n\t\t]\r\n\t};\r\n\r\n\tbootstrapApplication(AppComponent, appConfig).catch((err) => console.error(err));\r\n};\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"aril-boot-host.mjs","sources":["../../projects/aril/boot/host/src/app.component.ts","../../projects/aril/boot/host/src/bootstrap.ts","../../projects/aril/boot/host/aril-boot-host.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { Component, NgZone, inject, signal } from '@angular/core';\r\n\r\nimport { AppLayoutComponent, LayoutService } from 'aril/theme/layout';\r\nimport { PubSubService } from 'aril/util/pub-sub';\r\n\r\nimport { appName } from './bootstrap';\r\n\t\r\ntype MenuMode = 'static' | 'expandable';\r\n\r\n@Component({\r\n\tstandalone: true,\r\n\tselector: 'aril-root',\r\n\ttemplate: ` <app-layout></app-layout> `,\r\n\timports: [AppLayoutComponent]\r\n})\r\nexport class AppComponent {\r\n\tconstructor(\r\n\t\tprivate layoutService: LayoutService,\r\n\t\tprivate pubSubService: PubSubService\r\n\t) {\r\n\t\t(<any>globalThis).activeHost = appName;\r\n\t\t(<any>globalThis).__ARIL_PAGE_TITLE__ = signal('');\r\n\t\t(<any>globalThis).ngZone = inject(NgZone);\r\n\t\t(<any>globalThis).isHostMode = true;\r\n\r\n\t\tthis.pubSubService.subscribe('menuModeChanged', (data) => {\r\n\t\t\tconst menuMode = data?.custom;\r\n\t\t\t\r\n\t\t\tif (menuMode && (menuMode === 'static' || menuMode === 'expandable')) {\t\t\t\t\r\n\t\t\t\tthis.layoutService.config.update((config) => {\r\n\t\t\t\t\tconst newConfig = {\r\n\t\t\t\t\t\t...config,\r\n\t\t\t\t\t\tmenuMode: menuMode as MenuMode\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn newConfig;\r\n\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\tif (menuMode === 'static') {\r\n\t\t\t\t\tthis.layoutService.state.staticSidebarVisible = true;\r\n\t\t\t\t} else if (menuMode === 'expandable') {\r\n\t\t\t\t\tthis.layoutService.state.staticSidebarVisible = false;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t// Always close mobile menu on mode change\r\n\t\t\t\tthis.layoutService.state.staticMenuMobileActive = false;\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n}\r\n","import { HttpClient, provideHttpClient, withInterceptors } from '@angular/common/http';\r\nimport { APP_INITIALIZER, ApplicationConfig, importProvidersFrom } from '@angular/core';\r\nimport { bootstrapApplication } from '@angular/platform-browser';\r\nimport { provideAnimations } from '@angular/platform-browser/animations';\r\nimport {\r\n\tRouteReuseStrategy,\r\n\tRouter,\r\n\tRoutes,\r\n\tprovideRouter,\r\n\twithComponentInputBinding,\r\n\twithHashLocation,\r\n\twithRouterConfig,\r\n\twithViewTransitions\r\n} from '@angular/router';\r\n\r\nimport { ConfirmationService, MessageService } from 'primeng/api';\r\n\r\nimport { KeycloakAngularModule, KeycloakBearerInterceptor, KeycloakService } from 'keycloak-angular';\r\n\r\nimport { loadApiConfigs, loadInitData } from 'aril/boot/config/api';\r\nimport { Apps, ArilReuseStrategy, MicroAppService } from 'aril/boot/config/apps';\r\nimport { loadPlugins } from 'aril/boot/config/plugins';\r\nimport { acceptLanguageInterceptor } from 'aril/http';\r\nimport { i18nFolderName, i18nModule } from 'aril/i18n';\r\nimport { authInterceptor, keycloakAuthInterceptor } from 'aril/keycloak';\r\nimport { provideLocaleId } from 'aril/provider';\r\n\r\nimport { AppComponent } from './app.component';\r\n\r\nexport var appName: Apps;\r\n\r\nexport const boot = (_appName: Apps, routes: Routes) => {\r\n\tappName = _appName;\r\n\tconst appConfig: ApplicationConfig = {\r\n\t\tproviders: [\r\n\t\t\tprovideAnimations(),\r\n\t\t\tprovideLocaleId(),\r\n\t\t\tKeycloakBearerInterceptor,\r\n\t\t\tprovideHttpClient(withInterceptors([acceptLanguageInterceptor, authInterceptor, keycloakAuthInterceptor])),\r\n\t\t\tprovideRouter(\r\n\t\t\t\troutes,\r\n\t\t\t\twithComponentInputBinding(),\r\n\t\t\t\twithHashLocation(),\r\n\t\t\t\twithViewTransitions(),\r\n\t\t\t\twithRouterConfig({ onSameUrlNavigation: 'reload' })\r\n\t\t\t),\r\n\t\t\t{ provide: RouteReuseStrategy, useClass: ArilReuseStrategy },\r\n\t\t\timportProvidersFrom(i18nModule, KeycloakAngularModule),\r\n\t\t\tMessageService,\r\n\t\t\tConfirmationService,\r\n\t\t\t{\r\n\t\t\t\tprovide: APP_INITIALIZER,\r\n\t\t\t\tuseFactory: (\r\n\t\t\t\t\thttpClient: HttpClient,\r\n\t\t\t\t\tkeycloak: KeycloakService,\r\n\t\t\t\t\trouter: Router,\r\n\t\t\t\t\tfolderName: typeof i18nFolderName,\r\n\t\t\t\t\tmicroAppService: MicroAppService\r\n\t\t\t\t) => {\r\n\t\t\t\t\tif (router) (globalThis as any).hostRouter = router;\r\n\r\n\t\t\t\t\tconst runLoadApiConfigs = loadApiConfigs(\r\n\t\t\t\t\t\thttpClient,\r\n\t\t\t\t\t\tkeycloak,\r\n\t\t\t\t\t\tfolderName as unknown as string,\r\n\t\t\t\t\t\tmicroAppService\r\n\t\t\t\t\t);\r\n\t\t\t\t\tconst runLoadInitData = loadInitData(httpClient);\r\n\t\t\t\t\tconst runLoadPlugins = loadPlugins();\r\n\t\t\t\t\treturn async () => {\r\n\t\t\t\t\t\tawait runLoadApiConfigs();\r\n\t\t\t\t\t\tawait runLoadInitData();\r\n\t\t\t\t\t\trunLoadPlugins();\r\n\t\t\t\t\t};\r\n\t\t\t\t},\r\n\t\t\t\tmulti: true,\r\n\t\t\t\tdeps: [HttpClient, KeycloakService, Router, i18nFolderName, MicroAppService]\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tprovide: i18nFolderName,\r\n\t\t\t\tuseValue: 'host'\r\n\t\t\t}\r\n\t\t]\r\n\t};\r\n\r\n\tbootstrapApplication(AppComponent, appConfig).catch((err) => console.error(err));\r\n};\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|