aril 2.0.1-dev.3 → 2.0.1-dev.5
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/bridge/src/mfe-bridge.d.ts +33 -0
- package/boot/config/apps/src/interfaces.d.ts +7 -1
- package/boot/config/apps/src/route-close.service.d.ts +8 -3
- package/boot/config/apps/src/route-permissions.d.ts +2 -2
- package/esm2022/boot/bridge/src/mfe-bridge.mjs +18 -1
- package/esm2022/boot/config/api/src/interfaces.mjs +3 -2
- package/esm2022/boot/config/apps/src/apps.service.mjs +2 -2
- package/esm2022/boot/config/apps/src/custom-route-reuse-strategy.class.mjs +4 -4
- package/esm2022/boot/config/apps/src/interfaces.mjs +2 -1
- package/esm2022/boot/config/apps/src/route-close.service.mjs +11 -4
- package/esm2022/boot/config/apps/src/route-permissions.mjs +24 -6
- package/esm2022/boot/config/plugins/src/plugins.service.mjs +7 -5
- package/esm2022/boot/host/src/bootstrap.mjs +5 -3
- package/esm2022/boot/mfe/src/bootstrap.mjs +15 -3
- package/esm2022/http/index.mjs +1 -2
- package/esm2022/http/src/serviceBase.mjs +4 -4
- package/esm2022/http/src/serviceStateMethods.mjs +9 -1
- package/esm2022/keycloak/src/auth.interceptor.mjs +5 -2
- package/esm2022/selection/aril-selection.mjs +5 -0
- package/esm2022/selection/index.mjs +2 -0
- package/esm2022/selection/src/interfaces.mjs +2 -0
- package/esm2022/selection/src/selection-group.service.mjs +195 -0
- package/esm2022/theme/layout/app/profileSidebar/modals/edit-profile-modal/edit-profile-modal.component.mjs +2 -2
- package/esm2022/theme/layout/index.mjs +4 -2
- package/esm2022/theme/layout/service/breadcrumb-publisher.service.mjs +12 -4
- package/esm2022/theme/layout/service/interfaces/interfaces.mjs +1 -1
- package/esm2022/ui/button/index.mjs +1 -2
- package/esm2022/ui/button/src/button.component.mjs +5 -2
- package/esm2022/ui/charts/index.mjs +1 -11
- package/esm2022/ui/lib/index.mjs +1 -4
- package/esm2022/ui/lib/src/form/form-error-message.directive.mjs +9 -5
- package/esm2022/ui/multiSelect/src/multi-select.component.mjs +25 -25
- package/esm2022/ui/relativeDateSelector/src/relative-date-selector.component.mjs +2 -2
- package/esm2022/ui/selectBox/src/select-box.component.mjs +11 -34
- package/esm2022/ui/table/src/table.component.mjs +10 -5
- package/esm2022/ui/value/src/value.component.mjs +3 -2
- package/esm2022/ui-business/enumPicker/src/enum-picker.component.mjs +14 -6
- package/esm2022/util/activity/aril-util-activity.mjs +5 -0
- package/esm2022/util/activity/index.mjs +4 -0
- package/esm2022/util/activity/src/activity.constants.mjs +4 -0
- package/esm2022/util/activity/src/activity.service.mjs +218 -0
- package/esm2022/util/activity/src/activity.types.mjs +2 -0
- package/esm2022/util/block/src/block.mjs +9 -25
- package/esm2022/util/pub-sub/src/pub-sub.service.mjs +10 -5
- package/fesm2022/{aril-app.component-s14ruALV.mjs → aril-app.component-MjG_tPEe.mjs} +2 -1
- package/fesm2022/{aril-app.component-s14ruALV.mjs.map → aril-app.component-MjG_tPEe.mjs.map} +1 -1
- package/fesm2022/aril-boot-bridge.mjs +17 -0
- package/fesm2022/aril-boot-bridge.mjs.map +1 -1
- package/fesm2022/aril-boot-config-api.mjs +2 -1
- package/fesm2022/aril-boot-config-api.mjs.map +1 -1
- package/fesm2022/aril-boot-config-apps.mjs +36 -12
- package/fesm2022/aril-boot-config-apps.mjs.map +1 -1
- package/fesm2022/aril-boot-config-plugins.mjs +6 -4
- package/fesm2022/aril-boot-config-plugins.mjs.map +1 -1
- package/fesm2022/aril-boot-host.mjs +4 -2
- package/fesm2022/aril-boot-host.mjs.map +1 -1
- package/fesm2022/{aril-boot-mfe-app.component-AS4MzEo2.mjs → aril-boot-mfe-app.component-DtspQ3J8.mjs} +3 -2
- package/fesm2022/{aril-boot-mfe-app.component-AS4MzEo2.mjs.map → aril-boot-mfe-app.component-DtspQ3J8.mjs.map} +1 -1
- package/fesm2022/{aril-boot-mfe-aril-boot-mfe-Ui9Cv3UC.mjs → aril-boot-mfe-aril-boot-mfe-lovoFcgw.mjs} +16 -4
- package/fesm2022/aril-boot-mfe-aril-boot-mfe-lovoFcgw.mjs.map +1 -0
- package/fesm2022/aril-boot-mfe.mjs +2 -1
- package/fesm2022/aril-boot-mfe.mjs.map +1 -1
- package/fesm2022/aril-http.mjs +11 -7
- package/fesm2022/aril-http.mjs.map +1 -1
- package/fesm2022/aril-keycloak.mjs +4 -1
- package/fesm2022/aril-keycloak.mjs.map +1 -1
- package/fesm2022/aril-selection.mjs +202 -0
- package/fesm2022/aril-selection.mjs.map +1 -0
- package/fesm2022/aril-theme-layout.mjs +14 -66
- package/fesm2022/aril-theme-layout.mjs.map +1 -1
- package/fesm2022/aril-ui-business-enumPicker.mjs +14 -6
- package/fesm2022/aril-ui-business-enumPicker.mjs.map +1 -1
- package/fesm2022/aril-ui-button.mjs +5 -17
- package/fesm2022/aril-ui-button.mjs.map +1 -1
- package/fesm2022/aril-ui-charts.mjs +4 -1302
- package/fesm2022/aril-ui-charts.mjs.map +1 -1
- package/fesm2022/aril-ui-lib.mjs +10 -98
- package/fesm2022/aril-ui-lib.mjs.map +1 -1
- package/fesm2022/aril-ui-multiSelect.mjs +24 -24
- package/fesm2022/aril-ui-multiSelect.mjs.map +1 -1
- package/fesm2022/aril-ui-relativeDateSelector.mjs +1 -1
- package/fesm2022/aril-ui-relativeDateSelector.mjs.map +1 -1
- package/fesm2022/aril-ui-selectBox.mjs +10 -33
- package/fesm2022/aril-ui-selectBox.mjs.map +1 -1
- package/fesm2022/aril-ui-table.mjs +9 -4
- package/fesm2022/aril-ui-table.mjs.map +1 -1
- package/fesm2022/aril-ui-value.mjs +2 -1
- package/fesm2022/aril-ui-value.mjs.map +1 -1
- package/fesm2022/aril-util-activity.mjs +228 -0
- package/fesm2022/aril-util-activity.mjs.map +1 -0
- package/fesm2022/aril-util-block.mjs +9 -25
- package/fesm2022/aril-util-block.mjs.map +1 -1
- package/fesm2022/aril-util-pub-sub.mjs +9 -4
- package/fesm2022/aril-util-pub-sub.mjs.map +1 -1
- package/fesm2022/aril.mjs +18 -5
- package/fesm2022/aril.mjs.map +1 -1
- package/http/index.d.ts +0 -1
- package/http/src/serviceStateMethods.d.ts +1 -0
- package/package.json +210 -234
- package/scripts/mf-shared.js +47 -0
- package/selection/index.d.ts +1 -0
- package/selection/src/interfaces.d.ts +8 -0
- package/{theme/layout/service → selection/src}/selection-group.service.d.ts +9 -5
- package/theme/layout/index.d.ts +1 -1
- package/theme/layout/index.ts +3 -1
- package/theme/layout/service/breadcrumb-publisher.service.ts +18 -8
- package/theme/layout/service/interfaces/interfaces.d.ts +3 -17
- package/theme/layout/service/interfaces/interfaces.ts +6 -18
- package/ui/button/index.d.ts +0 -1
- package/ui/button/src/button.component.d.ts +2 -0
- package/ui/charts/index.d.ts +0 -10
- package/ui/lib/index.d.ts +0 -3
- package/ui/lib/src/form/form-error-message.directive.d.ts +4 -3
- package/ui/multiSelect/src/multi-select.component.d.ts +4 -5
- package/ui/selectBox/src/select-box.component.d.ts +2 -7
- package/ui/table/src/table.component.d.ts +3 -2
- package/util/activity/index.d.ts +3 -0
- package/util/activity/src/activity.constants.d.ts +3 -0
- package/util/activity/src/activity.service.d.ts +35 -0
- package/util/activity/src/activity.types.d.ts +13 -0
- package/util/block/src/block.d.ts +4 -10
- package/util/pub-sub/src/pub-sub.service.d.ts +2 -2
- package/esm2022/http/src/serviceMockBase.mjs +0 -4
- package/esm2022/theme/layout/service/selection-group.service.mjs +0 -65
- package/esm2022/ui/button/src/split-button.component.mjs +0 -18
- package/esm2022/ui/charts/src/amCharts/column/column-chart.component.mjs +0 -124
- package/esm2022/ui/charts/src/amCharts/line/line-chart.component.mjs +0 -164
- package/esm2022/ui/charts/src/amCharts/pie/pie-chart.component.mjs +0 -116
- package/esm2022/ui/charts/src/highCharts/area/area-chart.component.mjs +0 -114
- package/esm2022/ui/charts/src/highCharts/bar/bar-chart.component.mjs +0 -100
- package/esm2022/ui/charts/src/highCharts/column/column-chart.component.mjs +0 -117
- package/esm2022/ui/charts/src/highCharts/heatmap/heatMap-chart.component.mjs +0 -252
- package/esm2022/ui/charts/src/highCharts/line/line-chart-series.component.mjs +0 -89
- package/esm2022/ui/charts/src/highCharts/line/line-chart.component.mjs +0 -82
- package/esm2022/ui/charts/src/highCharts/pie/pie-chart.component.mjs +0 -137
- package/esm2022/ui/charts/src/theme/theme.mjs +0 -54
- package/esm2022/ui/dxEditor/aril-ui-dxEditor.mjs +0 -5
- package/esm2022/ui/dxEditor/index.mjs +0 -2
- package/esm2022/ui/dxEditor/src/dx-editor.component.mjs +0 -26
- package/esm2022/ui/lib/src/form/form-field-builder.mjs +0 -23
- package/esm2022/ui/lib/src/input/common-input-validators.service.mjs +0 -49
- package/esm2022/ui/lib/src/input/input-disabled.directive.mjs +0 -25
- package/esm2022/ui/overlayPanel/aril-ui-overlayPanel.mjs +0 -5
- package/esm2022/ui/overlayPanel/index.mjs +0 -2
- package/esm2022/ui/overlayPanel/src/overlay-panel.component.mjs +0 -20
- package/esm2022/ui/tooltip/aril-ui-tooltip.mjs +0 -5
- package/esm2022/ui/tooltip/index.mjs +0 -2
- package/esm2022/ui/tooltip/src/tooltip-component.mjs +0 -23
- package/esm2022/ui/treeTable/aril-ui-treeTable.mjs +0 -5
- package/esm2022/ui/treeTable/index.mjs +0 -2
- package/esm2022/ui/treeTable/src/tree-table.component.mjs +0 -55
- package/esm2022/ui-business/operation-types-dialog/aril-ui-business-operation-types-dialog.mjs +0 -5
- package/esm2022/ui-business/operation-types-dialog/index.mjs +0 -2
- package/esm2022/ui-business/operation-types-dialog/src/operation-types-dialog.component.mjs +0 -76
- package/esm2022/util/unwrap/aril-util-unwrap.mjs +0 -5
- package/esm2022/util/unwrap/index.mjs +0 -2
- package/esm2022/util/unwrap/src/unwrap-tag.directive.mjs +0 -24
- package/fesm2022/aril-boot-mfe-aril-boot-mfe-Ui9Cv3UC.mjs.map +0 -1
- package/fesm2022/aril-ui-business-operation-types-dialog.mjs +0 -83
- package/fesm2022/aril-ui-business-operation-types-dialog.mjs.map +0 -1
- package/fesm2022/aril-ui-dxEditor.mjs +0 -33
- package/fesm2022/aril-ui-dxEditor.mjs.map +0 -1
- package/fesm2022/aril-ui-overlayPanel.mjs +0 -27
- package/fesm2022/aril-ui-overlayPanel.mjs.map +0 -1
- package/fesm2022/aril-ui-tooltip.mjs +0 -30
- package/fesm2022/aril-ui-tooltip.mjs.map +0 -1
- package/fesm2022/aril-ui-treeTable.mjs +0 -62
- package/fesm2022/aril-ui-treeTable.mjs.map +0 -1
- package/fesm2022/aril-util-unwrap.mjs +0 -31
- package/fesm2022/aril-util-unwrap.mjs.map +0 -1
- package/http/src/serviceMockBase.d.ts +0 -6
- package/theme/layout/service/selection-group.service.ts +0 -73
- package/ui/button/src/split-button.component.d.ts +0 -8
- package/ui/charts/src/amCharts/column/column-chart.component.d.ts +0 -25
- package/ui/charts/src/amCharts/line/line-chart.component.d.ts +0 -26
- package/ui/charts/src/amCharts/pie/pie-chart.component.d.ts +0 -24
- package/ui/charts/src/highCharts/area/area-chart.component.d.ts +0 -20
- package/ui/charts/src/highCharts/bar/bar-chart.component.d.ts +0 -26
- package/ui/charts/src/highCharts/column/column-chart.component.d.ts +0 -28
- package/ui/charts/src/highCharts/heatmap/heatMap-chart.component.d.ts +0 -32
- package/ui/charts/src/highCharts/line/line-chart-series.component.d.ts +0 -21
- package/ui/charts/src/highCharts/line/line-chart.component.d.ts +0 -21
- package/ui/charts/src/highCharts/pie/pie-chart.component.d.ts +0 -27
- package/ui/charts/src/theme/theme.d.ts +0 -5
- package/ui/dxEditor/index.d.ts +0 -1
- package/ui/dxEditor/src/dx-editor.component.d.ts +0 -11
- package/ui/lib/src/form/form-field-builder.d.ts +0 -8
- package/ui/lib/src/input/common-input-validators.service.d.ts +0 -20
- package/ui/lib/src/input/input-disabled.directive.d.ts +0 -9
- package/ui/overlayPanel/index.d.ts +0 -1
- package/ui/overlayPanel/src/overlay-panel.component.d.ts +0 -8
- package/ui/tooltip/index.d.ts +0 -1
- package/ui/tooltip/src/tooltip-component.d.ts +0 -14
- package/ui/treeTable/index.d.ts +0 -1
- package/ui/treeTable/src/tree-table.component.d.ts +0 -21
- package/ui-business/operation-types-dialog/index.d.ts +0 -1
- package/ui-business/operation-types-dialog/src/operation-types-dialog.component.d.ts +0 -28
- package/util/unwrap/index.d.ts +0 -1
- package/util/unwrap/src/unwrap-tag.directive.d.ts +0 -9
|
@@ -21,6 +21,14 @@ export class Block {
|
|
|
21
21
|
this.target.set(this.getTarget(this.element));
|
|
22
22
|
this.blockUI = new KTBlockUI(this.target(), this.blockOptions());
|
|
23
23
|
}
|
|
24
|
+
ngOnDestroy() {
|
|
25
|
+
// KTBlockUI instance'ı KTUtilElementDataStore'da tutuluyor; release overlay'i kaldırır,
|
|
26
|
+
// destroy global store kaydını siler (aksi halde directive yok olsa da DOM bellekte kalır).
|
|
27
|
+
if (this.blockUI) {
|
|
28
|
+
this.blockUI.release();
|
|
29
|
+
this.blockUI.destroy();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
24
32
|
getTarget(element) {
|
|
25
33
|
let nativeElement = element.nativeElement;
|
|
26
34
|
while (nativeElement && !nativeElement.clientWidth)
|
|
@@ -37,28 +45,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
|
|
|
37
45
|
selector: '[arilBlock]'
|
|
38
46
|
}]
|
|
39
47
|
}], ctorParameters: () => [{ type: i0.ElementRef }] });
|
|
40
|
-
|
|
41
|
-
constructor() {
|
|
42
|
-
this.arilBlockPage = input.required();
|
|
43
|
-
this.blockOptions = input({});
|
|
44
|
-
const blockUI = new KTBlockUI(document.body, this.blockOptions());
|
|
45
|
-
effect(() => {
|
|
46
|
-
if (this.arilBlockPage()) {
|
|
47
|
-
blockUI.block();
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
blockUI.release();
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: BlockPage, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
55
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "17.1.2", type: BlockPage, isStandalone: true, selector: "[arilBlockPage]", inputs: { arilBlockPage: { classPropertyName: "arilBlockPage", publicName: "arilBlockPage", isSignal: true, isRequired: true, transformFunction: null }, blockOptions: { classPropertyName: "blockOptions", publicName: "blockOptions", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
|
|
56
|
-
}
|
|
57
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: BlockPage, decorators: [{
|
|
58
|
-
type: Directive,
|
|
59
|
-
args: [{
|
|
60
|
-
standalone: true,
|
|
61
|
-
selector: '[arilBlockPage]'
|
|
62
|
-
}]
|
|
63
|
-
}], ctorParameters: () => [] });
|
|
64
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcmlsL3V0aWwvYmxvY2svc3JjL2Jsb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQWM1RixNQUFNLE9BQU8sS0FBSztJQUNqQixZQUFvQixPQUFtQjtRQUFuQixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBWXZDLGNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFXLENBQUM7UUFDdEMsaUJBQVksR0FBRyxLQUFLLENBQWUsRUFBRSxDQUFDLENBQUM7UUFHdkMsV0FBTSxHQUFHLE1BQU0sQ0FBYyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBZnhELE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDWCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO2dCQUNuQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO29CQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN0QixDQUFDO3FCQUFNLENBQUM7b0JBQ1AsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDeEIsQ0FBQztZQUNGLENBQUM7UUFDRixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFRRCxlQUFlO1FBQ2QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsU0FBUyxDQUFDLE9BQW1CO1FBQzVCLElBQUksYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7UUFDMUMsT0FBTyxhQUFhLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVztZQUFFLGFBQWEsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlGLE9BQU8sYUFBYSxDQUFDO0lBQ3RCLENBQUM7OEdBNUJXLEtBQUs7a0dBQUwsS0FBSzs7MkZBQUwsS0FBSztrQkFKakIsU0FBUzttQkFBQztvQkFDVixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLGFBQWE7aUJBQ3ZCOztBQW9DRCxNQUFNLE9BQU8sU0FBUztJQUNyQjtRQVlBLGtCQUFhLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBVyxDQUFDO1FBQzFDLGlCQUFZLEdBQUcsS0FBSyxDQUFlLEVBQUUsQ0FBQyxDQUFDO1FBWnRDLE1BQU0sT0FBTyxHQUFHLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFFbEUsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNYLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUM7Z0JBQzFCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNqQixDQUFDO2lCQUFNLENBQUM7Z0JBQ1AsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25CLENBQUM7UUFDRixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7OEdBWFcsU0FBUztrR0FBVCxTQUFTOzsyRkFBVCxTQUFTO2tCQUpyQixTQUFTO21CQUFDO29CQUNWLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsaUJBQWlCO2lCQUMzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgZWZmZWN0LCBpbnB1dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5kZWNsYXJlIGNvbnN0IEtUQmxvY2tVSTogYW55O1xyXG5cclxuaW50ZXJmYWNlIEJsb2NrT3B0aW9ucyB7XHJcblx0ekluZGV4PzogbnVtYmVyO1xyXG5cdG92ZXJsYXlDbGFzcz86IHN0cmluZztcclxuXHRtZXNzYWdlPzogc3RyaW5nO1xyXG59XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuXHRzdGFuZGFsb25lOiB0cnVlLFxyXG5cdHNlbGVjdG9yOiAnW2FyaWxCbG9ja10nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCbG9jayBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZikge1xyXG5cdFx0ZWZmZWN0KCgpID0+IHtcclxuXHRcdFx0aWYgKHRoaXMudGFyZ2V0KCkpIHtcclxuXHRcdFx0XHRpZiAodGhpcy5hcmlsQmxvY2soKSkge1xyXG5cdFx0XHRcdFx0dGhpcy5ibG9ja1VJLmJsb2NrKCk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHRoaXMuYmxvY2tVSS5yZWxlYXNlKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGFyaWxCbG9jayA9IGlucHV0LnJlcXVpcmVkPGJvb2xlYW4+KCk7XHJcblx0YmxvY2tPcHRpb25zID0gaW5wdXQ8QmxvY2tPcHRpb25zPih7fSk7XHJcblxyXG5cdGJsb2NrVUk6IHR5cGVvZiBLVEJsb2NrVUk7XHJcblx0dGFyZ2V0ID0gc2lnbmFsPEhUTUxFbGVtZW50Pih0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XHJcblxyXG5cdG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuXHRcdHRoaXMudGFyZ2V0LnNldCh0aGlzLmdldFRhcmdldCh0aGlzLmVsZW1lbnQpKTtcclxuXHRcdHRoaXMuYmxvY2tVSSA9IG5ldyBLVEJsb2NrVUkodGhpcy50YXJnZXQoKSwgdGhpcy5ibG9ja09wdGlvbnMoKSk7XHJcblx0fVxyXG5cclxuXHRnZXRUYXJnZXQoZWxlbWVudDogRWxlbWVudFJlZik6IEhUTUxFbGVtZW50IHtcclxuXHRcdGxldCBuYXRpdmVFbGVtZW50ID0gZWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG5cdFx0d2hpbGUgKG5hdGl2ZUVsZW1lbnQgJiYgIW5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGgpIG5hdGl2ZUVsZW1lbnQgPSBuYXRpdmVFbGVtZW50LmNoaWxkcmVuWzBdO1xyXG5cdFx0cmV0dXJuIG5hdGl2ZUVsZW1lbnQ7XHJcblx0fVxyXG59XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuXHRzdGFuZGFsb25lOiB0cnVlLFxyXG5cdHNlbGVjdG9yOiAnW2FyaWxCbG9ja1BhZ2VdJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQmxvY2tQYWdlIHtcclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHRcdGNvbnN0IGJsb2NrVUkgPSBuZXcgS1RCbG9ja1VJKGRvY3VtZW50LmJvZHksIHRoaXMuYmxvY2tPcHRpb25zKCkpO1xyXG5cclxuXHRcdGVmZmVjdCgoKSA9PiB7XHJcblx0XHRcdGlmICh0aGlzLmFyaWxCbG9ja1BhZ2UoKSkge1xyXG5cdFx0XHRcdGJsb2NrVUkuYmxvY2soKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRibG9ja1VJLnJlbGVhc2UoKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRhcmlsQmxvY2tQYWdlID0gaW5wdXQucmVxdWlyZWQ8Ym9vbGVhbj4oKTtcclxuXHRibG9ja09wdGlvbnMgPSBpbnB1dDxCbG9ja09wdGlvbnM+KHt9KTtcclxufVxyXG4iXX0=
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcmlsL3V0aWwvYmxvY2svc3JjL2Jsb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUF5QixNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFjdkcsTUFBTSxPQUFPLEtBQUs7SUFDakIsWUFBNkIsT0FBbUI7UUFBbkIsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQVloRCxjQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBVyxDQUFDO1FBQ3RDLGlCQUFZLEdBQUcsS0FBSyxDQUFlLEVBQUUsQ0FBQyxDQUFDO1FBR3ZDLFdBQU0sR0FBRyxNQUFNLENBQWMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQWZ4RCxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1gsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztvQkFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDdEIsQ0FBQztxQkFBTSxDQUFDO29CQUNQLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3hCLENBQUM7WUFDRixDQUFDO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBUUQsZUFBZTtRQUNkLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELFdBQVc7UUFDVix3RkFBd0Y7UUFDeEYsNEZBQTRGO1FBQzVGLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN4QixDQUFDO0lBQ0YsQ0FBQztJQUVELFNBQVMsQ0FBQyxPQUFtQjtRQUM1QixJQUFJLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO1FBQzFDLE9BQU8sYUFBYSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVc7WUFBRSxhQUFhLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RixPQUFPLGFBQWEsQ0FBQztJQUN0QixDQUFDOzhHQXJDVyxLQUFLO2tHQUFMLEtBQUs7OzJGQUFMLEtBQUs7a0JBSmpCLFNBQVM7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxhQUFhO2lCQUN2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgT25EZXN0cm95LCBlZmZlY3QsIGlucHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmRlY2xhcmUgY29uc3QgS1RCbG9ja1VJOiBhbnk7XHJcblxyXG5pbnRlcmZhY2UgQmxvY2tPcHRpb25zIHtcclxuXHR6SW5kZXg/OiBudW1iZXI7XHJcblx0b3ZlcmxheUNsYXNzPzogc3RyaW5nO1xyXG5cdG1lc3NhZ2U/OiBzdHJpbmc7XHJcbn1cclxuXHJcbkBEaXJlY3RpdmUoe1xyXG5cdHN0YW5kYWxvbmU6IHRydWUsXHJcblx0c2VsZWN0b3I6ICdbYXJpbEJsb2NrXSdcclxufSlcclxuZXhwb3J0IGNsYXNzIEJsb2NrIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnQ6IEVsZW1lbnRSZWYpIHtcclxuXHRcdGVmZmVjdCgoKSA9PiB7XHJcblx0XHRcdGlmICh0aGlzLnRhcmdldCgpKSB7XHJcblx0XHRcdFx0aWYgKHRoaXMuYXJpbEJsb2NrKCkpIHtcclxuXHRcdFx0XHRcdHRoaXMuYmxvY2tVSS5ibG9jaygpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHR0aGlzLmJsb2NrVUkucmVsZWFzZSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRhcmlsQmxvY2sgPSBpbnB1dC5yZXF1aXJlZDxib29sZWFuPigpO1xyXG5cdGJsb2NrT3B0aW9ucyA9IGlucHV0PEJsb2NrT3B0aW9ucz4oe30pO1xyXG5cclxuXHRibG9ja1VJOiB0eXBlb2YgS1RCbG9ja1VJO1xyXG5cdHRhcmdldCA9IHNpZ25hbDxIVE1MRWxlbWVudD4odGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xyXG5cclxuXHRuZ0FmdGVyVmlld0luaXQoKSB7XHJcblx0XHR0aGlzLnRhcmdldC5zZXQodGhpcy5nZXRUYXJnZXQodGhpcy5lbGVtZW50KSk7XHJcblx0XHR0aGlzLmJsb2NrVUkgPSBuZXcgS1RCbG9ja1VJKHRoaXMudGFyZ2V0KCksIHRoaXMuYmxvY2tPcHRpb25zKCkpO1xyXG5cdH1cclxuXHJcblx0bmdPbkRlc3Ryb3koKSB7XHJcblx0XHQvLyBLVEJsb2NrVUkgaW5zdGFuY2UnxLEgS1RVdGlsRWxlbWVudERhdGFTdG9yZSdkYSB0dXR1bHV5b3I7IHJlbGVhc2Ugb3ZlcmxheSdpIGthbGTEsXLEsXIsXHJcblx0XHQvLyBkZXN0cm95IGdsb2JhbCBzdG9yZSBrYXlkxLFuxLEgc2lsZXIgKGFrc2kgaGFsZGUgZGlyZWN0aXZlIHlvayBvbHNhIGRhIERPTSBiZWxsZWt0ZSBrYWzEsXIpLlxyXG5cdFx0aWYgKHRoaXMuYmxvY2tVSSkge1xyXG5cdFx0XHR0aGlzLmJsb2NrVUkucmVsZWFzZSgpO1xyXG5cdFx0XHR0aGlzLmJsb2NrVUkuZGVzdHJveSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Z2V0VGFyZ2V0KGVsZW1lbnQ6IEVsZW1lbnRSZWYpOiBIVE1MRWxlbWVudCB7XHJcblx0XHRsZXQgbmF0aXZlRWxlbWVudCA9IGVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuXHRcdHdoaWxlIChuYXRpdmVFbGVtZW50ICYmICFuYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoKSBuYXRpdmVFbGVtZW50ID0gbmF0aXZlRWxlbWVudC5jaGlsZHJlblswXTtcclxuXHRcdHJldHVybiBuYXRpdmVFbGVtZW50O1xyXG5cdH1cclxufVxyXG4iXX0=
|
|
@@ -11,12 +11,17 @@ export class PubSubService {
|
|
|
11
11
|
dispatchEvent(new CustomEvent(e.name, { detail: e.data }));
|
|
12
12
|
}
|
|
13
13
|
subscribe(eventName, listener) {
|
|
14
|
-
addEventListener
|
|
14
|
+
// addEventListener'a kaydedilen wrapper'ı döndür: unSubscribe ancak AYNI referansla kaldırabilir.
|
|
15
|
+
// Eskiden anonim wrapper kaydedilip orijinal listener kaldırılmaya çalışılıyordu; referanslar
|
|
16
|
+
// eşleşmediği için unSubscribe hiçbir zaman çalışmıyordu (kalıcı window listener leak'i).
|
|
17
|
+
const handler = (event) => {
|
|
15
18
|
listener(event.detail);
|
|
16
|
-
}
|
|
19
|
+
};
|
|
20
|
+
addEventListener(eventName, handler);
|
|
21
|
+
return handler;
|
|
17
22
|
}
|
|
18
|
-
unSubscribe(eventName,
|
|
19
|
-
removeEventListener(eventName,
|
|
23
|
+
unSubscribe(eventName, handler) {
|
|
24
|
+
removeEventListener(eventName, handler);
|
|
20
25
|
}
|
|
21
26
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: PubSubService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
22
27
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: PubSubService, providedIn: 'root' }); }
|
|
@@ -27,4 +32,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
|
|
|
27
32
|
providedIn: 'root'
|
|
28
33
|
}]
|
|
29
34
|
}] });
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHViLXN1Yi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJpbC91dGlsL3B1Yi1zdWIvc3JjL3B1Yi1zdWIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFVM0MsTUFBTSxZQUFZLEdBQUc7SUFDcEIsZUFBZSxFQUFFLGlCQUFpQjtJQUNsQyxlQUFlLEVBQUUsaUJBQWlCO0lBQ2xDLGlCQUFpQixFQUFFLG1CQUFtQjtDQUN0QyxDQUFDO0FBS0YsTUFBTSxPQUFPLGFBQWE7SUFDekIsT0FBTyxDQUFDLENBQWM7UUFDckIsYUFBYSxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsU0FBUyxDQUFDLFNBQW9DLEVBQUUsUUFBNkI7UUFDNUUsa0dBQWtHO1FBQ2xHLDhGQUE4RjtRQUM5RiwwRkFBMEY7UUFDMUYsTUFBTSxPQUFPLEdBQWtCLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDN0MsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixDQUFDLENBQUM7UUFDRixnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDckMsT0FBTyxPQUFPLENBQUM7SUFDaEIsQ0FBQztJQUVELFdBQVcsQ0FBQyxTQUFvQyxFQUFFLE9BQXNCO1FBQ3ZFLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN6QyxDQUFDOzhHQWxCVyxhQUFhO2tIQUFiLGFBQWEsY0FGYixNQUFNOzsyRkFFTixhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNYLFVBQVUsRUFBRSxNQUFNO2lCQUNsQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxudHlwZSBDdXN0b21FdmVudCA9IHtcclxuXHRuYW1lOiBrZXlvZiB0eXBlb2YgUHViU3ViRXZlbnRzO1xyXG5cdGRhdGE6IHtcclxuXHRcdHBhdGg6IHN0cmluZztcclxuXHRcdGN1c3RvbT86IGFueTtcclxuXHR9O1xyXG59O1xyXG5cclxuY29uc3QgUHViU3ViRXZlbnRzID0ge1xyXG5cdGxhbmd1YWdlQ2hhbmdlZDogJ2xhbmd1YWdlQ2hhbmdlZCcsXHJcblx0bWVudU1vZGVDaGFuZ2VkOiAnbWVudU1vZGVDaGFuZ2VkJyxcclxuXHRicmVhZGNydW1iVXBkYXRlZDogJ2JyZWFkY3J1bWJVcGRhdGVkJ1xyXG59O1xyXG5cclxuQEluamVjdGFibGUoe1xyXG5cdHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgUHViU3ViU2VydmljZSB7XHJcblx0cHVibGlzaChlOiBDdXN0b21FdmVudCkge1xyXG5cdFx0ZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoZS5uYW1lLCB7IGRldGFpbDogZS5kYXRhIH0pKTtcclxuXHR9XHJcblxyXG5cdHN1YnNjcmliZShldmVudE5hbWU6IGtleW9mIHR5cGVvZiBQdWJTdWJFdmVudHMsIGxpc3RlbmVyOiAoZGF0YTogYW55KSA9PiB2b2lkKTogRXZlbnRMaXN0ZW5lciB7XHJcblx0XHQvLyBhZGRFdmVudExpc3RlbmVyJ2Ega2F5ZGVkaWxlbiB3cmFwcGVyJ8SxIGTDtm5kw7xyOiB1blN1YnNjcmliZSBhbmNhayBBWU5JIHJlZmVyYW5zbGEga2FsZMSxcmFiaWxpci5cclxuXHRcdC8vIEVza2lkZW4gYW5vbmltIHdyYXBwZXIga2F5ZGVkaWxpcCBvcmlqaW5hbCBsaXN0ZW5lciBrYWxkxLFyxLFsbWF5YSDDp2FsxLHFn8SxbMSxeW9yZHU7IHJlZmVyYW5zbGFyXHJcblx0XHQvLyBlxZ9sZcWfbWVkacSfaSBpw6dpbiB1blN1YnNjcmliZSBoacOnYmlyIHphbWFuIMOnYWzEscWfbcSxeW9yZHUgKGthbMSxY8SxIHdpbmRvdyBsaXN0ZW5lciBsZWFrJ2kpLlxyXG5cdFx0Y29uc3QgaGFuZGxlcjogRXZlbnRMaXN0ZW5lciA9IChldmVudDogYW55KSA9PiB7XHJcblx0XHRcdGxpc3RlbmVyKGV2ZW50LmRldGFpbCk7XHJcblx0XHR9O1xyXG5cdFx0YWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpO1xyXG5cdFx0cmV0dXJuIGhhbmRsZXI7XHJcblx0fVxyXG5cclxuXHR1blN1YnNjcmliZShldmVudE5hbWU6IGtleW9mIHR5cGVvZiBQdWJTdWJFdmVudHMsIGhhbmRsZXI6IEV2ZW50TGlzdGVuZXIpIHtcclxuXHRcdHJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTtcclxuXHR9XHJcbn1cclxuIl19
|
|
@@ -19,6 +19,7 @@ import 'aril/boot/base';
|
|
|
19
19
|
import 'aril/boot/config/api';
|
|
20
20
|
import 'aril/boot/config/plugins';
|
|
21
21
|
import 'aril/i18n';
|
|
22
|
+
import 'aril/util/activity';
|
|
22
23
|
import 'aril/util/pub-sub';
|
|
23
24
|
import 'ngx-monaco-editor-v2';
|
|
24
25
|
import 'aril/provider';
|
|
@@ -180,4 +181,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
|
|
|
180
181
|
}], ctorParameters: () => [{ type: i1.Router }, { type: i2.TranslocoService }, { type: i3.PrimeNGConfig }, { type: i3$1.MfeBridge }] });
|
|
181
182
|
|
|
182
183
|
export { AppComponent };
|
|
183
|
-
//# sourceMappingURL=aril-app.component-
|
|
184
|
+
//# sourceMappingURL=aril-app.component-MjG_tPEe.mjs.map
|
package/fesm2022/{aril-app.component-s14ruALV.mjs.map → aril-app.component-MjG_tPEe.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aril-app.component-s14ruALV.mjs","sources":["../../projects/aril/boot/mfe/src/app.component.ts"],"sourcesContent":["import { LocationStrategy } from '@angular/common';\r\nimport { Component, ElementRef, effect, inject } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { EventType, Router, type Event as RouterEvent } from '@angular/router';\r\n\r\nimport { PrimeNGConfig } from 'primeng/api';\r\n\r\nimport { ModuleFederationToolsModule } from '@angular-architects/module-federation-tools';\r\nimport { TranslocoService } from '@ngneat/transloco';\r\n\r\nimport { MfeBridge } from 'aril/boot/bridge';\r\nimport { safeNavigate } from 'aril/boot/config/apps';\r\nimport { LanguageCode, TR_TRANSLATIONS } from 'aril/boot/config/translate';\r\nimport { BreadcrumbService, MFELayoutComponent } from 'aril/theme/layout';\r\n\r\nimport { appName } from './bootstrap';\r\n\r\n/**\r\n * Tab izolasyonlu MFE app root.\r\n *\r\n * Her `<app-${appName}>` custom element instance'ı kendi `createApplication`'ını yarattığı için\r\n * (bkz. `bootstrap.ts` `MFEAppElement`), `AppComponent` constructor'ı her tab için **bağımsız**\r\n * çalışır — paylaşılan Injector/Router yok. Bu yüzden host Router subscription'ı her tab için\r\n * ayrı kurulur ama \"tab-id filter\" ile **sadece o tab'a ait** `NavigationEnd`'leri MFE Router'a\r\n * iletir; diğer tab'lerin navigation'ları ignore edilir.\r\n *\r\n * Tab kimliği `<app-${appName}>` element'inde `aril-tab-id` attribute olarak yazılır\r\n * (`ArilWebComponentWrapper` route.queryParams._tab'ten okuyup set eder). Filter karşılaştırması:\r\n * `window.history.state._tab === tabId` — `navigateToTab` `extras.state._tab` ile yazıyor.\r\n */\r\n@Component({\r\n\tstandalone: true,\r\n\ttemplate: `<mfe-layout></mfe-layout>`,\r\n\timports: [ModuleFederationToolsModule, MFELayoutComponent]\r\n})\r\nexport class AppComponent {\r\n\tprivate readonly elementRef = inject(ElementRef);\r\n\r\n\tconstructor(\r\n\t\tprivate readonly router: Router,\r\n\t\tprivate readonly translocoService: TranslocoService,\r\n\t\tprivate readonly primeNgConfig: PrimeNGConfig,\r\n\t\tprivate readonly bridgeSvc: MfeBridge\r\n\t) {\r\n\t\t// Bu tab'ın kimliği — wrapper component `aril-tab-id` attribute olarak yazıyor.\r\n\t\t// İlk yükleme cycle'ında URL'de henüz `_tab` yok; NavService `firstCheckForRoute`\r\n\t\t// sonradan `replaceUrl` ile ekliyor. Wrapper queryParams.subscribe ile attribute'u\r\n\t\t// güncelliyor — bu yüzden constructor'da değil, her NavigationEnd'de fresh okuyoruz.\r\n\t\tconst readMyTabId = (): string => (this.elementRef.nativeElement as HTMLElement).getAttribute('aril-tab-id') ?? '';\r\n\r\n\t\tconst initialTabId = readMyTabId();\r\n\t\tconst locStrategy = inject(LocationStrategy);\r\n\t\tconst sameRouter = this.router === this.bridgeSvc.hostRouter;\r\n\t\tconsole.log(\r\n\t\t\t`[MFE:${appName}] host modu — tab=\"${initialTabId || '(pending)'}\" ` +\r\n\t\t\t\t`LocationStrategy=${locStrategy.constructor.name} ` +\r\n\t\t\t\t`router===hostRouter? ${sameRouter}`\r\n\t\t);\r\n\t\tconst initial = this.bridgeSvc.hostRouter!.url;\r\n\t\tconsole.log(`[MFE:${appName}] initial sync:`, initial);\r\n\t\tsafeNavigate(this.router, initial);\r\n\r\n\t\t// MFE içi `routerLink`/`router.navigate` host Router'a yansımıyor (IsolatedLocationStrategy\r\n\t\t// browser hash'ı değiştirmiyor) — NavService tab navLink'ini güncelleyemiyor.\r\n\t\t// MFE NavigationEnd'i `bridge.activeMFEUrl`'a (kaynak tabId ile) yazarız;\r\n\t\t// AppLayoutComponent effect → `syncActiveTabNavLinkForTab(tabId, url)` ile sadece\r\n\t\t// kaynak tab'ın navLink'i güncellenir → cross-tab kontaminasyonu yok.\r\n\t\t// Tab title resolve — kaynak öncelik sırası (en spesifik → en geniş):\r\n\t\t// 1. `route.title` (ÖNERİLEN — Angular Router 16+ standardı, sayfa <title>'ını da set eder)\r\n\t\t// 2. `data.tabName` (ÖNERİLEN — tab adı sayfa <title>'ından farklı olmalıysa)\r\n\t\t// 3. `data.title` (DEPRECATED — geriye uyumluluk için var; yeni route'larda kullanmayın,\r\n\t\t// `route.title` ile aynı semantiği taşıyor ama Angular contract dışı kalıyor)\r\n\t\t// 4. `data.breadcrumb` — mevcut breadcrumb template'i fallback olarak kullanılır\r\n\t\t// (single-brace `{key}` placeholder, literal string, i18n YOK)\r\n\t\t//\r\n\t\t// i18n key'lerinde `{{placeholder}}` Transloco interpolation'ı `BreadcrumbService.keyValues`\r\n\t\t// ile doldurulur. Component cevap geldiğinde `breadcrumbService.set('GatewayMaterialSerialNumber',\r\n\t\t// '12345')` her iki path'i de besler — effect ile re-compute, dinamik tab adı\r\n\t\t// (\"12345 - Modem Detay\").\r\n\t\tconst breadcrumbService = inject(BreadcrumbService);\r\n\t\tconst computeTabTitle = (): string | undefined => {\r\n\t\t\tlet route = this.router.routerState.snapshot.root;\r\n\t\t\twhile (route.firstChild) route = route.firstChild;\r\n\t\t\tconst params = breadcrumbService.keyValues();\r\n\r\n\t\t\tconst i18nKey =\r\n\t\t\t\t(route.title as string | undefined) ??\r\n\t\t\t\t(route.data?.['title'] as string | undefined) ??\r\n\t\t\t\t(route.data?.['tabName'] as string | undefined);\r\n\t\t\tif (i18nKey) {\r\n\t\t\t\tconst translated = this.translocoService.translate(i18nKey, params);\r\n\t\t\t\treturn translated || i18nKey;\r\n\t\t\t}\r\n\r\n\t\t\tconst breadcrumb = route.data?.['breadcrumb'] as string | undefined;\r\n\t\t\tif (breadcrumb) {\r\n\t\t\t\treturn breadcrumb.replace(/\\{([^}]+)\\}/g, (_, key: string) => params[key] ?? '...');\r\n\t\t\t}\r\n\r\n\t\t\treturn undefined;\r\n\t\t};\r\n\r\n\t\tlet lastUrl: string | undefined;\r\n\t\tlet lastTabIdForTitle: string | undefined;\r\n\r\n\t\tthis.router.events.pipe(takeUntilDestroyed()).subscribe((event: RouterEvent) => {\r\n\t\t\tif (event.type === EventType.NavigationEnd) {\r\n\t\t\t\tconst url = event.urlAfterRedirects ?? event.url;\r\n\t\t\t\tconst myTabId = readMyTabId();\r\n\t\t\t\tif (!myTabId) return;\r\n\t\t\t\tlastUrl = url;\r\n\t\t\t\tlastTabIdForTitle = myTabId;\r\n\t\t\t\tconst title = computeTabTitle();\r\n\t\t\t\tconst prev = this.bridgeSvc.activeMFEUrl();\r\n\t\t\t\tif (prev?.tabId === myTabId && prev?.url === url && prev?.title === title) return;\r\n\t\t\t\tthis.bridgeSvc.activeMFEUrl.set({ tabId: myTabId, url, title });\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// Component cevap gelince `breadcrumbService.set('meterNo', '12345')` keyValues'ı\r\n\t\t// günceller; effect ile yakalayıp tab title'ı yeniden hesaplarız → \"12345 - Sayaç\r\n\t\t// Detayı\" gibi dinamik sonuçlar tab adına yansır.\r\n\t\teffect(\r\n\t\t\t() => {\r\n\t\t\t\tbreadcrumbService.keyValues();\r\n\t\t\t\tif (!lastUrl || !lastTabIdForTitle) return;\r\n\t\t\t\tconst title = computeTabTitle();\r\n\t\t\t\tconst prev = this.bridgeSvc.activeMFEUrl();\r\n\t\t\t\tif (prev?.tabId === lastTabIdForTitle && prev?.url === lastUrl && prev?.title === title) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tthis.bridgeSvc.activeMFEUrl.set({ tabId: lastTabIdForTitle, url: lastUrl, title });\r\n\t\t\t},\r\n\t\t\t{ allowSignalWrites: true }\r\n\t\t);\r\n\r\n\t\tconst mfePrefix = `/${appName}`;\r\n\r\n\t\tthis.bridgeSvc.hostRouter!.events.pipe(takeUntilDestroyed()).subscribe((event: RouterEvent) => {\r\n\t\t\tif (event.type === EventType.NavigationEnd) {\r\n\t\t\t\tconst target = event.urlAfterRedirects ?? event.url;\r\n\t\t\t\tif (target !== mfePrefix && !target.startsWith(`${mfePrefix}/`)) return;\r\n\t\t\t\t// **Tab izolasyonu filter**: navigation'ın hedef tab'ı bu instance mı?\r\n\t\t\t\t// `IsolatedLocationStrategy` sayesinde host'a sadece tab tıklamaları\r\n\t\t\t\t// (`tabState({_tab})` ile) gelir — `history.state._tab` her zaman dolu.\r\n\t\t\t\tconst myTabId = readMyTabId();\r\n\t\t\t\tif (myTabId) {\r\n\t\t\t\t\tconst navTabId = (window.history.state as Record<string, unknown> | null)?.['_tab'];\r\n\t\t\t\t\tif (navTabId !== myTabId) return;\r\n\t\t\t\t}\r\n\t\t\t\t// `lastNavigated`/`router.url===target` early-return YOK: izole Router'da (her tab\r\n\t\t\t\t// kendi Router'ı) bir tab'a geri dönüldüğünde MFE Router zaten hedef URL'dedir;\r\n\t\t\t\t// navigate atlanırsa NavigationEnd fire etmez → `BreadcrumbPublisherService` yeniden\r\n\t\t\t\t// yayın yapmaz ve app.layout tab geçişinde breadcrumb'ı `set([])` ile temizlediği için\r\n\t\t\t\t// breadcrumb boş kalır. `onSameUrlNavigation:'reload'` aynı URL'e navigate'i\r\n\t\t\t\t// NavigationEnd ile garanti eder → breadcrumb + tab navLink yeniden yayınlanır.\r\n\t\t\t\tconsole.log(`[MFE:${appName}] tab=\"${myTabId || '(pending)'}\" host NavigationEnd → navigate:`, target);\r\n\t\t\t\tsafeNavigate(this.router, target);\r\n\t\t\t} else if (event.type === EventType.NavigationCancel) {\r\n\t\t\t\tconsole.warn(`[MFE:${appName}] host NavigationCancel:`, event.url, 'reason:', event.reason);\r\n\t\t\t} else if (event.type === EventType.NavigationError) {\r\n\t\t\t\tconsole.error(`[MFE:${appName}] host NavigationError:`, event.url, 'err:', event.error);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.bridgeSvc.activeMF.set(appName);\r\n\t\tconst lang: LanguageCode = (localStorage.getItem('lang') as LanguageCode) ?? LanguageCode.TR;\r\n\r\n\t\tthis.translocoService.setActiveLang(lang);\r\n\r\n\t\tthis.setLocale(lang);\r\n\t}\r\n\r\n\tsetLocale(lang: LanguageCode) {\r\n\t\tif (!lang?.length) return;\r\n\r\n\t\tif (lang === LanguageCode.TR) {\r\n\t\t\tthis.primeNgConfig.setTranslation(TR_TRANSLATIONS);\r\n\t\t}\r\n\t}\r\n}\r\n"],"names":["i4"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAiBA;;;;;;;;;;;;AAYG;MAMU,YAAY,CAAA;AAGxB,IAAA,WAAA,CACkB,MAAc,EACd,gBAAkC,EAClC,aAA4B,EAC5B,SAAoB,EAAA;QAHpB,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;QACd,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAClC,IAAa,CAAA,aAAA,GAAb,aAAa,CAAe;QAC5B,IAAS,CAAA,SAAA,GAAT,SAAS,CAAW;AANrB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;;;;;AAYhD,QAAA,MAAM,WAAW,GAAG,MAAe,IAAI,CAAC,UAAU,CAAC,aAA6B,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAEnH,QAAA,MAAM,YAAY,GAAG,WAAW,EAAE,CAAC;AACnC,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;QAC7D,OAAO,CAAC,GAAG,CACV,CAAA,KAAA,EAAQ,OAAO,CAAsB,mBAAA,EAAA,YAAY,IAAI,WAAW,CAAI,EAAA,CAAA;AACnE,YAAA,CAAA,iBAAA,EAAoB,WAAW,CAAC,WAAW,CAAC,IAAI,CAAG,CAAA,CAAA;YACnD,CAAwB,qBAAA,EAAA,UAAU,CAAE,CAAA,CACrC,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,UAAW,CAAC,GAAG,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,CAAA,KAAA,EAAQ,OAAO,CAAiB,eAAA,CAAA,EAAE,OAAO,CAAC,CAAC;AACvD,QAAA,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;;;;;;;;;;;;;;;;;;AAmBnC,QAAA,MAAM,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACpD,MAAM,eAAe,GAAG,MAAyB;YAChD,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC;YAClD,OAAO,KAAK,CAAC,UAAU;AAAE,gBAAA,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;AAClD,YAAA,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,EAAE,CAAC;AAE7C,YAAA,MAAM,OAAO,GACX,KAAK,CAAC,KAA4B;AAClC,gBAAA,KAAK,CAAC,IAAI,GAAG,OAAO,CAAwB;AAC5C,gBAAA,KAAK,CAAC,IAAI,GAAG,SAAS,CAAwB,CAAC;YACjD,IAAI,OAAO,EAAE;AACZ,gBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACpE,OAAO,UAAU,IAAI,OAAO,CAAC;aAC7B;YAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,GAAG,YAAY,CAAuB,CAAC;YACpE,IAAI,UAAU,EAAE;gBACf,OAAO,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,GAAW,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC;aACpF;AAED,YAAA,OAAO,SAAS,CAAC;AAClB,SAAC,CAAC;AAEF,QAAA,IAAI,OAA2B,CAAC;AAChC,QAAA,IAAI,iBAAqC,CAAC;AAE1C,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,KAAkB,KAAI;YAC9E,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,aAAa,EAAE;gBAC3C,MAAM,GAAG,GAAG,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,GAAG,CAAC;AACjD,gBAAA,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;AAC9B,gBAAA,IAAI,CAAC,OAAO;oBAAE,OAAO;gBACrB,OAAO,GAAG,GAAG,CAAC;gBACd,iBAAiB,GAAG,OAAO,CAAC;AAC5B,gBAAA,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;gBAChC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;AAC3C,gBAAA,IAAI,IAAI,EAAE,KAAK,KAAK,OAAO,IAAI,IAAI,EAAE,GAAG,KAAK,GAAG,IAAI,IAAI,EAAE,KAAK,KAAK,KAAK;oBAAE,OAAO;AAClF,gBAAA,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;aAChE;AACF,SAAC,CAAC,CAAC;;;;QAKH,MAAM,CACL,MAAK;YACJ,iBAAiB,CAAC,SAAS,EAAE,CAAC;AAC9B,YAAA,IAAI,CAAC,OAAO,IAAI,CAAC,iBAAiB;gBAAE,OAAO;AAC3C,YAAA,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;AAC3C,YAAA,IAAI,IAAI,EAAE,KAAK,KAAK,iBAAiB,IAAI,IAAI,EAAE,GAAG,KAAK,OAAO,IAAI,IAAI,EAAE,KAAK,KAAK,KAAK,EAAE;gBACxF,OAAO;aACP;AACD,YAAA,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AACpF,SAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC3B,CAAC;AAEF,QAAA,MAAM,SAAS,GAAG,CAAI,CAAA,EAAA,OAAO,EAAE,CAAC;AAEhC,QAAA,IAAI,CAAC,SAAS,CAAC,UAAW,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,KAAkB,KAAI;YAC7F,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,aAAa,EAAE;gBAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,GAAG,CAAC;AACpD,gBAAA,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA,EAAG,SAAS,CAAA,CAAA,CAAG,CAAC;oBAAE,OAAO;;;;AAIxE,gBAAA,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;gBAC9B,IAAI,OAAO,EAAE;oBACZ,MAAM,QAAQ,GAAI,MAAM,CAAC,OAAO,CAAC,KAAwC,GAAG,MAAM,CAAC,CAAC;oBACpF,IAAI,QAAQ,KAAK,OAAO;wBAAE,OAAO;iBACjC;;;;;;;AAOD,gBAAA,OAAO,CAAC,GAAG,CAAC,CAAA,KAAA,EAAQ,OAAO,CAAA,OAAA,EAAU,OAAO,IAAI,WAAW,CAAA,gCAAA,CAAkC,EAAE,MAAM,CAAC,CAAC;AACvG,gBAAA,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;aAClC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,gBAAgB,EAAE;AACrD,gBAAA,OAAO,CAAC,IAAI,CAAC,CAAQ,KAAA,EAAA,OAAO,0BAA0B,EAAE,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;aAC5F;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,eAAe,EAAE;AACpD,gBAAA,OAAO,CAAC,KAAK,CAAC,CAAQ,KAAA,EAAA,OAAO,yBAAyB,EAAE,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;aACxF;AACF,SAAC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACrC,QAAA,MAAM,IAAI,GAAkB,YAAY,CAAC,OAAO,CAAC,MAAM,CAAkB,IAAI,YAAY,CAAC,EAAE,CAAC;AAE7F,QAAA,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;AAE1C,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;KACrB;AAED,IAAA,SAAS,CAAC,IAAkB,EAAA;QAC3B,IAAI,CAAC,IAAI,EAAE,MAAM;YAAE,OAAO;AAE1B,QAAA,IAAI,IAAI,KAAK,YAAY,CAAC,EAAE,EAAE;AAC7B,YAAA,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;SACnD;KACD;8GAhJW,YAAY,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,aAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAZ,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,EAHd,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA,yBAAA,CAA2B,EAC3B,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,2BAA2B,+BAAE,kBAAkB,EAAA,QAAA,EAAA,YAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FAE7C,YAAY,EAAA,UAAA,EAAA,CAAA;kBALxB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,CAA2B,yBAAA,CAAA;AACrC,oBAAA,OAAO,EAAE,CAAC,2BAA2B,EAAE,kBAAkB,CAAC;AAC1D,iBAAA,CAAA;;;;;"}
|
|
1
|
+
{"version":3,"file":"aril-app.component-MjG_tPEe.mjs","sources":["../../projects/aril/boot/mfe/src/app.component.ts"],"sourcesContent":["import { LocationStrategy } from '@angular/common';\r\nimport { Component, ElementRef, effect, inject } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { EventType, Router, type Event as RouterEvent } from '@angular/router';\r\n\r\nimport { PrimeNGConfig } from 'primeng/api';\r\n\r\nimport { ModuleFederationToolsModule } from '@angular-architects/module-federation-tools';\r\nimport { TranslocoService } from '@ngneat/transloco';\r\n\r\nimport { MfeBridge } from 'aril/boot/bridge';\r\nimport { safeNavigate } from 'aril/boot/config/apps';\r\nimport { LanguageCode, TR_TRANSLATIONS } from 'aril/boot/config/translate';\r\nimport { BreadcrumbService, MFELayoutComponent } from 'aril/theme/layout';\r\n\r\nimport { appName } from './bootstrap';\r\n\r\n/**\r\n * Tab izolasyonlu MFE app root.\r\n *\r\n * Her `<app-${appName}>` custom element instance'ı kendi `createApplication`'ını yarattığı için\r\n * (bkz. `bootstrap.ts` `MFEAppElement`), `AppComponent` constructor'ı her tab için **bağımsız**\r\n * çalışır — paylaşılan Injector/Router yok. Bu yüzden host Router subscription'ı her tab için\r\n * ayrı kurulur ama \"tab-id filter\" ile **sadece o tab'a ait** `NavigationEnd`'leri MFE Router'a\r\n * iletir; diğer tab'lerin navigation'ları ignore edilir.\r\n *\r\n * Tab kimliği `<app-${appName}>` element'inde `aril-tab-id` attribute olarak yazılır\r\n * (`ArilWebComponentWrapper` route.queryParams._tab'ten okuyup set eder). Filter karşılaştırması:\r\n * `window.history.state._tab === tabId` — `navigateToTab` `extras.state._tab` ile yazıyor.\r\n */\r\n@Component({\r\n\tstandalone: true,\r\n\ttemplate: `<mfe-layout></mfe-layout>`,\r\n\timports: [ModuleFederationToolsModule, MFELayoutComponent]\r\n})\r\nexport class AppComponent {\r\n\tprivate readonly elementRef = inject(ElementRef);\r\n\r\n\tconstructor(\r\n\t\tprivate readonly router: Router,\r\n\t\tprivate readonly translocoService: TranslocoService,\r\n\t\tprivate readonly primeNgConfig: PrimeNGConfig,\r\n\t\tprivate readonly bridgeSvc: MfeBridge\r\n\t) {\r\n\t\t// Bu tab'ın kimliği — wrapper component `aril-tab-id` attribute olarak yazıyor.\r\n\t\t// İlk yükleme cycle'ında URL'de henüz `_tab` yok; NavService `firstCheckForRoute`\r\n\t\t// sonradan `replaceUrl` ile ekliyor. Wrapper queryParams.subscribe ile attribute'u\r\n\t\t// güncelliyor — bu yüzden constructor'da değil, her NavigationEnd'de fresh okuyoruz.\r\n\t\tconst readMyTabId = (): string => (this.elementRef.nativeElement as HTMLElement).getAttribute('aril-tab-id') ?? '';\r\n\r\n\t\tconst initialTabId = readMyTabId();\r\n\t\tconst locStrategy = inject(LocationStrategy);\r\n\t\tconst sameRouter = this.router === this.bridgeSvc.hostRouter;\r\n\t\tconsole.log(\r\n\t\t\t`[MFE:${appName}] host modu — tab=\"${initialTabId || '(pending)'}\" ` +\r\n\t\t\t\t`LocationStrategy=${locStrategy.constructor.name} ` +\r\n\t\t\t\t`router===hostRouter? ${sameRouter}`\r\n\t\t);\r\n\t\tconst initial = this.bridgeSvc.hostRouter!.url;\r\n\t\tconsole.log(`[MFE:${appName}] initial sync:`, initial);\r\n\t\tsafeNavigate(this.router, initial);\r\n\r\n\t\t// MFE içi `routerLink`/`router.navigate` host Router'a yansımıyor (IsolatedLocationStrategy\r\n\t\t// browser hash'ı değiştirmiyor) — NavService tab navLink'ini güncelleyemiyor.\r\n\t\t// MFE NavigationEnd'i `bridge.activeMFEUrl`'a (kaynak tabId ile) yazarız;\r\n\t\t// AppLayoutComponent effect → `syncActiveTabNavLinkForTab(tabId, url)` ile sadece\r\n\t\t// kaynak tab'ın navLink'i güncellenir → cross-tab kontaminasyonu yok.\r\n\t\t// Tab title resolve — kaynak öncelik sırası (en spesifik → en geniş):\r\n\t\t// 1. `route.title` (ÖNERİLEN — Angular Router 16+ standardı, sayfa <title>'ını da set eder)\r\n\t\t// 2. `data.tabName` (ÖNERİLEN — tab adı sayfa <title>'ından farklı olmalıysa)\r\n\t\t// 3. `data.title` (DEPRECATED — geriye uyumluluk için var; yeni route'larda kullanmayın,\r\n\t\t// `route.title` ile aynı semantiği taşıyor ama Angular contract dışı kalıyor)\r\n\t\t// 4. `data.breadcrumb` — mevcut breadcrumb template'i fallback olarak kullanılır\r\n\t\t// (single-brace `{key}` placeholder, literal string, i18n YOK)\r\n\t\t//\r\n\t\t// i18n key'lerinde `{{placeholder}}` Transloco interpolation'ı `BreadcrumbService.keyValues`\r\n\t\t// ile doldurulur. Component cevap geldiğinde `breadcrumbService.set('GatewayMaterialSerialNumber',\r\n\t\t// '12345')` her iki path'i de besler — effect ile re-compute, dinamik tab adı\r\n\t\t// (\"12345 - Modem Detay\").\r\n\t\tconst breadcrumbService = inject(BreadcrumbService);\r\n\t\tconst computeTabTitle = (): string | undefined => {\r\n\t\t\tlet route = this.router.routerState.snapshot.root;\r\n\t\t\twhile (route.firstChild) route = route.firstChild;\r\n\t\t\tconst params = breadcrumbService.keyValues();\r\n\r\n\t\t\tconst i18nKey =\r\n\t\t\t\t(route.title as string | undefined) ??\r\n\t\t\t\t(route.data?.['title'] as string | undefined) ??\r\n\t\t\t\t(route.data?.['tabName'] as string | undefined);\r\n\t\t\tif (i18nKey) {\r\n\t\t\t\tconst translated = this.translocoService.translate(i18nKey, params);\r\n\t\t\t\treturn translated || i18nKey;\r\n\t\t\t}\r\n\r\n\t\t\tconst breadcrumb = route.data?.['breadcrumb'] as string | undefined;\r\n\t\t\tif (breadcrumb) {\r\n\t\t\t\treturn breadcrumb.replace(/\\{([^}]+)\\}/g, (_, key: string) => params[key] ?? '...');\r\n\t\t\t}\r\n\r\n\t\t\treturn undefined;\r\n\t\t};\r\n\r\n\t\tlet lastUrl: string | undefined;\r\n\t\tlet lastTabIdForTitle: string | undefined;\r\n\r\n\t\tthis.router.events.pipe(takeUntilDestroyed()).subscribe((event: RouterEvent) => {\r\n\t\t\tif (event.type === EventType.NavigationEnd) {\r\n\t\t\t\tconst url = event.urlAfterRedirects ?? event.url;\r\n\t\t\t\tconst myTabId = readMyTabId();\r\n\t\t\t\tif (!myTabId) return;\r\n\t\t\t\tlastUrl = url;\r\n\t\t\t\tlastTabIdForTitle = myTabId;\r\n\t\t\t\tconst title = computeTabTitle();\r\n\t\t\t\tconst prev = this.bridgeSvc.activeMFEUrl();\r\n\t\t\t\tif (prev?.tabId === myTabId && prev?.url === url && prev?.title === title) return;\r\n\t\t\t\tthis.bridgeSvc.activeMFEUrl.set({ tabId: myTabId, url, title });\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// Component cevap gelince `breadcrumbService.set('meterNo', '12345')` keyValues'ı\r\n\t\t// günceller; effect ile yakalayıp tab title'ı yeniden hesaplarız → \"12345 - Sayaç\r\n\t\t// Detayı\" gibi dinamik sonuçlar tab adına yansır.\r\n\t\teffect(\r\n\t\t\t() => {\r\n\t\t\t\tbreadcrumbService.keyValues();\r\n\t\t\t\tif (!lastUrl || !lastTabIdForTitle) return;\r\n\t\t\t\tconst title = computeTabTitle();\r\n\t\t\t\tconst prev = this.bridgeSvc.activeMFEUrl();\r\n\t\t\t\tif (prev?.tabId === lastTabIdForTitle && prev?.url === lastUrl && prev?.title === title) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tthis.bridgeSvc.activeMFEUrl.set({ tabId: lastTabIdForTitle, url: lastUrl, title });\r\n\t\t\t},\r\n\t\t\t{ allowSignalWrites: true }\r\n\t\t);\r\n\r\n\t\tconst mfePrefix = `/${appName}`;\r\n\r\n\t\tthis.bridgeSvc.hostRouter!.events.pipe(takeUntilDestroyed()).subscribe((event: RouterEvent) => {\r\n\t\t\tif (event.type === EventType.NavigationEnd) {\r\n\t\t\t\tconst target = event.urlAfterRedirects ?? event.url;\r\n\t\t\t\tif (target !== mfePrefix && !target.startsWith(`${mfePrefix}/`)) return;\r\n\t\t\t\t// **Tab izolasyonu filter**: navigation'ın hedef tab'ı bu instance mı?\r\n\t\t\t\t// `IsolatedLocationStrategy` sayesinde host'a sadece tab tıklamaları\r\n\t\t\t\t// (`tabState({_tab})` ile) gelir — `history.state._tab` her zaman dolu.\r\n\t\t\t\tconst myTabId = readMyTabId();\r\n\t\t\t\tif (myTabId) {\r\n\t\t\t\t\tconst navTabId = (window.history.state as Record<string, unknown> | null)?.['_tab'];\r\n\t\t\t\t\tif (navTabId !== myTabId) return;\r\n\t\t\t\t}\r\n\t\t\t\t// `lastNavigated`/`router.url===target` early-return YOK: izole Router'da (her tab\r\n\t\t\t\t// kendi Router'ı) bir tab'a geri dönüldüğünde MFE Router zaten hedef URL'dedir;\r\n\t\t\t\t// navigate atlanırsa NavigationEnd fire etmez → `BreadcrumbPublisherService` yeniden\r\n\t\t\t\t// yayın yapmaz ve app.layout tab geçişinde breadcrumb'ı `set([])` ile temizlediği için\r\n\t\t\t\t// breadcrumb boş kalır. `onSameUrlNavigation:'reload'` aynı URL'e navigate'i\r\n\t\t\t\t// NavigationEnd ile garanti eder → breadcrumb + tab navLink yeniden yayınlanır.\r\n\t\t\t\tconsole.log(`[MFE:${appName}] tab=\"${myTabId || '(pending)'}\" host NavigationEnd → navigate:`, target);\r\n\t\t\t\tsafeNavigate(this.router, target);\r\n\t\t\t} else if (event.type === EventType.NavigationCancel) {\r\n\t\t\t\tconsole.warn(`[MFE:${appName}] host NavigationCancel:`, event.url, 'reason:', event.reason);\r\n\t\t\t} else if (event.type === EventType.NavigationError) {\r\n\t\t\t\tconsole.error(`[MFE:${appName}] host NavigationError:`, event.url, 'err:', event.error);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.bridgeSvc.activeMF.set(appName);\r\n\t\tconst lang: LanguageCode = (localStorage.getItem('lang') as LanguageCode) ?? LanguageCode.TR;\r\n\r\n\t\tthis.translocoService.setActiveLang(lang);\r\n\r\n\t\tthis.setLocale(lang);\r\n\t}\r\n\r\n\tsetLocale(lang: LanguageCode) {\r\n\t\tif (!lang?.length) return;\r\n\r\n\t\tif (lang === LanguageCode.TR) {\r\n\t\t\tthis.primeNgConfig.setTranslation(TR_TRANSLATIONS);\r\n\t\t}\r\n\t}\r\n}\r\n"],"names":["i4"],"mappings":"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"}
|
|
@@ -36,6 +36,17 @@ class MfeBridge {
|
|
|
36
36
|
* navigation'ları otomatik tab-aware olur, Strategy doğru tab handle'ını korur.
|
|
37
37
|
*/
|
|
38
38
|
this.activeTabId = signal('');
|
|
39
|
+
/**
|
|
40
|
+
* Enum (SelectionGroup) cache — cross-MFE paylaşımlı. `SelectionGroupService` her MFE/tab'da
|
|
41
|
+
* ayrı instance olsa da (Module Federation shared yok) hepsi bu tek state üzerinden okur/yazar
|
|
42
|
+
* → tek enum cache, tek `/versions` çağrısı, MFE'ler arası localStorage ezme yok.
|
|
43
|
+
*/
|
|
44
|
+
this.selectionGroups = signal({});
|
|
45
|
+
this.selectionLoaded = new Map();
|
|
46
|
+
this.selectionLoading = new Map();
|
|
47
|
+
/** Key başına ardışık fetch hatası sayısı — limit aşımında fetchEnum o key'i denemeyi bırakır. */
|
|
48
|
+
this.selectionFailures = new Map();
|
|
49
|
+
this.selectionInitialized = false;
|
|
39
50
|
this.hostNgZone = null;
|
|
40
51
|
this.hostRouter = null;
|
|
41
52
|
/**
|
|
@@ -86,6 +97,12 @@ const bridge = (() => {
|
|
|
86
97
|
if (!g[BRIDGE_SLOT]) {
|
|
87
98
|
g[BRIDGE_SLOT] = new MfeBridge();
|
|
88
99
|
}
|
|
100
|
+
const backfill = g[BRIDGE_SLOT];
|
|
101
|
+
backfill.selectionGroups ??= signal({});
|
|
102
|
+
backfill.selectionLoaded ??= new Map();
|
|
103
|
+
backfill.selectionLoading ??= new Map();
|
|
104
|
+
backfill.selectionFailures ??= new Map();
|
|
105
|
+
backfill.selectionInitialized ??= false;
|
|
89
106
|
return g[BRIDGE_SLOT];
|
|
90
107
|
})();
|
|
91
108
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aril-boot-bridge.mjs","sources":["../../projects/aril/boot/bridge/src/mfe-bridge.ts","../../projects/aril/boot/bridge/src/provide-mfe-bridge.ts","../../projects/aril/boot/bridge/aril-boot-bridge.ts"],"sourcesContent":["import type { Location } from '@angular/common';\r\nimport { NgZone, Signal, effect, signal } from '@angular/core';\r\nimport type { Router } from '@angular/router';\r\n\r\nimport type { Apps, PluginMenuItem } from 'aril/boot/config/apps';\r\n\r\nexport interface RouteConfig {\r\n\tpath: string;\r\n\tcontent: string;\r\n\tversion: number;\r\n}\r\n\r\nexport interface Breadcrumb {\r\n\tlabel: string;\r\n\turl?: string;\r\n}\r\n\r\nexport interface LegacyWindowSlots {\r\n\tactiveHost?: Apps;\r\n\tactiveMF?: Apps;\r\n\thostMenuItems?: Signal<PluginMenuItem[]>;\r\n\tpluginJson?: Record<string, unknown>;\r\n\trouteConfigs?: RouteConfig[];\r\n\tngZone?: NgZone;\r\n\thostRouter?: Router;\r\n\t__ARIL_PAGE_TITLE__?: Signal<string>;\r\n}\r\n\r\nexport class MfeBridge {\r\n\treadonly activeHost = signal<Apps | null>(null);\r\n\treadonly activeMF = signal<Apps | null>(null);\r\n\treadonly hostMenuItems = signal<PluginMenuItem[]>([]);\r\n\treadonly pluginJson = signal<Record<string, unknown>>({});\r\n\treadonly routeConfigs = signal<RouteConfig[] | null>(null);\r\n\treadonly pageTitle = signal<string>('');\r\n\treadonly breadcrumbs = signal<Breadcrumb[]>([]);\r\n\t/**\r\n\t * Bir MFE Router'ında olan son `NavigationEnd`'in URL'i ve **hangi tab'a ait olduğu**.\r\n\t * MFE içi sayfa içi navigation'lar host Router'a yansımayabiliyor → `NavService` tab\r\n\t * navLink'ini güncellemek için bu signal'ı izler.\r\n\t *\r\n\t * **Neden tabId taşıyor**: Birden fazla tab'ın MFE Router'ı async event tetikleyebilir\r\n\t * (örn. hidden container'daki tab2 `?activeTab=1` replaceState yaparken). `activeTabId`'ye\r\n\t * bakarak update yaparsak yanlış tab'ı kontamine ederiz. Mesajda kaynak tabId'yi taşıyıp\r\n\t * `NavService.syncActiveTabNavLinkForTab(tabId, url)` ile spesifik tab'ı update ederiz.\r\n\t *\r\n\t * **Custom `equal`**: AppComponent her MFE NavigationEnd'de `set({tabId, url})` çağırır;\r\n\t * yeni object reference olduğu için default reference-equality re-emit eder. Bu durumda\r\n\t * aynı tab+url ile sürekli effect tetiklenir → tab navLink'i kullanıcının anasayfaya\r\n\t * geçtiği gibi (host route'lar MFE NavigationEnd tetiklemez ama signal eski değerinde\r\n\t * kalır) state değişikliklerini geri alır. Value-equality ile yalnızca gerçek URL\r\n\t * değişikliklerinde tetiklensin.\r\n\t */\r\n\treadonly activeMFEUrl = signal<{ tabId: string; url: string; title?: string } | null>(null, {\r\n\t\tequal: (a, b) => a?.tabId === b?.tabId && a?.url === b?.url && a?.title === b?.title\r\n\t});\r\n\r\n\t/**\r\n\t * Aktif tab'ın `tabId`'si — `NavService` tab değişimlerinde günceller.\r\n\t * Plugin Router proxy'leri (`provideHostRouter`) bu signal'ı okuyup `navigate`/`navigateByUrl`\r\n\t * çağrılarına `extras.state._tab` enjekte eder → plugin'lerin yaptığı tüm host\r\n\t * navigation'ları otomatik tab-aware olur, Strategy doğru tab handle'ını korur.\r\n\t */\r\n\treadonly activeTabId = signal<string>('');\r\n\r\n\thostNgZone: NgZone | null = null;\r\n\thostRouter: Router | null = null;\r\n\t/**\r\n\t * Host (shell) `Location` servisi. Host modda MFE/plugin child injector'larından\r\n\t * erişilemez (child Location izole `IsolatedLocationStrategy`'ye bağlı); browser\r\n\t * adres çubuğuna `replaceState` ile yazmak isteyen directive'ler (örn. `?activeTab`\r\n\t * senkronizasyonu) bunu kullanır. `hostRouter` ile aynı pattern.\r\n\t */\r\n\thostLocation: Location | null = null;\r\n\r\n\tprivate mirrored = false;\r\n\r\n\tmirrorToWindow(): void {\r\n\t\tif (this.mirrored || typeof window === 'undefined') return;\r\n\t\tthis.mirrored = true;\r\n\r\n\t\tconst w = window as Window & LegacyWindowSlots;\r\n\r\n\t\tw.hostMenuItems = this.hostMenuItems;\r\n\t\tw.__ARIL_PAGE_TITLE__ = this.pageTitle;\r\n\r\n\t\teffect(() => {\r\n\t\t\tw.activeHost = this.activeHost() ?? undefined;\r\n\t\t});\r\n\t\teffect(() => {\r\n\t\t\tw.activeMF = this.activeMF() ?? undefined;\r\n\t\t});\r\n\t\teffect(() => {\r\n\t\t\tw.pluginJson = this.pluginJson();\r\n\t\t});\r\n\t\teffect(() => {\r\n\t\t\tw.routeConfigs = this.routeConfigs() ?? undefined;\r\n\t\t});\r\n\r\n\t\tObject.defineProperty(w, 'ngZone', {\r\n\t\t\tconfigurable: true,\r\n\t\t\tget: () => this.hostNgZone\r\n\t\t});\r\n\t\tObject.defineProperty(w, 'hostRouter', {\r\n\t\t\tconfigurable: true,\r\n\t\t\tget: () => this.hostRouter\r\n\t\t});\r\n\t}\r\n}\r\n\r\n// Module Federation shared config olmadığı durumlar için globalThis slot\r\n// üzerinden tek instance garantisi. Host ve her remote MFE ayrı bundle olsa\r\n// bile aynı JS realm'inde aynı instance'ı okur — eski globalThis sözleşmesinin\r\n// yaptığı görevi tek bir tipli slotta birleştirir.\r\nconst BRIDGE_SLOT = '__arilMfeBridge__';\r\ntype BridgeSlotHost = { [BRIDGE_SLOT]?: MfeBridge };\r\nexport const bridge: MfeBridge = (() => {\r\n\tconst g = globalThis as unknown as BridgeSlotHost;\r\n\tif (!g[BRIDGE_SLOT]) {\r\n\t\tg[BRIDGE_SLOT] = new MfeBridge();\r\n\t}\r\n\treturn g[BRIDGE_SLOT]!;\r\n})();\r\n","import { makeEnvironmentProviders } from '@angular/core';\r\n\r\nimport { MfeBridge, bridge } from './mfe-bridge';\r\n\r\nexport function provideMfeBridge() {\r\n\treturn makeEnvironmentProviders([{ provide: MfeBridge, useValue: bridge }]);\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-bridge.mjs","sources":["../../projects/aril/boot/bridge/src/mfe-bridge.ts","../../projects/aril/boot/bridge/src/provide-mfe-bridge.ts","../../projects/aril/boot/bridge/aril-boot-bridge.ts"],"sourcesContent":["import type { Location } from '@angular/common';\r\nimport { NgZone, Signal, effect, signal } from '@angular/core';\r\nimport type { Router } from '@angular/router';\r\n\r\nimport type { Apps, PluginMenuItem } from 'aril/boot/config/apps';\r\n\r\nexport interface RouteConfig {\r\n\tpath: string;\r\n\tcontent: string;\r\n\tversion: number;\r\n}\r\n\r\nexport interface Breadcrumb {\r\n\tlabel: string;\r\n\turl?: string;\r\n}\r\n\r\n// Selection-group (enum) modeli — cache state (aşağıda `selectionGroups`) bridge'de yaşadığından\r\n// tipi de burada tanımlanır; `theme/layout` bu tipleri re-export eder (bridge↔theme/layout circular\r\n// entry-point'ini önlemek için bağımlılık tek yönlü: theme/layout → bridge).\r\nexport interface SelectionItem {\r\n\tid: number;\r\n\tgroupId: number;\r\n\tselectionKey: string;\r\n\tselectionDisplay: string;\r\n\tshowOrder: number;\r\n\tparentSelectionKey: string;\r\n\tselectionMultiLanguageDisplays?: Record<string, string>;\r\n}\r\n\r\nexport interface SelectionGroupDTO {\r\n\tid: number;\r\n\tgroupName: string;\r\n\tgroupDescription: string;\r\n\tgroupComment: string;\r\n\tloadStrategy: string;\r\n\tdynamicQuery: string;\r\n\tparentGroupId: number;\r\n\tselectionItems: SelectionItem[];\r\n\tversion?: number;\r\n}\r\n\r\nexport interface LegacyWindowSlots {\r\n\tactiveHost?: Apps;\r\n\tactiveMF?: Apps;\r\n\thostMenuItems?: Signal<PluginMenuItem[]>;\r\n\tpluginJson?: Record<string, unknown>;\r\n\trouteConfigs?: RouteConfig[];\r\n\tngZone?: NgZone;\r\n\thostRouter?: Router;\r\n\t__ARIL_PAGE_TITLE__?: Signal<string>;\r\n}\r\n\r\nexport class MfeBridge {\r\n\treadonly activeHost = signal<Apps | null>(null);\r\n\treadonly activeMF = signal<Apps | null>(null);\r\n\treadonly hostMenuItems = signal<PluginMenuItem[]>([]);\r\n\treadonly pluginJson = signal<Record<string, unknown>>({});\r\n\treadonly routeConfigs = signal<RouteConfig[] | null>(null);\r\n\treadonly pageTitle = signal<string>('');\r\n\treadonly breadcrumbs = signal<Breadcrumb[]>([]);\r\n\t/**\r\n\t * Bir MFE Router'ında olan son `NavigationEnd`'in URL'i ve **hangi tab'a ait olduğu**.\r\n\t * MFE içi sayfa içi navigation'lar host Router'a yansımayabiliyor → `NavService` tab\r\n\t * navLink'ini güncellemek için bu signal'ı izler.\r\n\t *\r\n\t * **Neden tabId taşıyor**: Birden fazla tab'ın MFE Router'ı async event tetikleyebilir\r\n\t * (örn. hidden container'daki tab2 `?activeTab=1` replaceState yaparken). `activeTabId`'ye\r\n\t * bakarak update yaparsak yanlış tab'ı kontamine ederiz. Mesajda kaynak tabId'yi taşıyıp\r\n\t * `NavService.syncActiveTabNavLinkForTab(tabId, url)` ile spesifik tab'ı update ederiz.\r\n\t *\r\n\t * **Custom `equal`**: AppComponent her MFE NavigationEnd'de `set({tabId, url})` çağırır;\r\n\t * yeni object reference olduğu için default reference-equality re-emit eder. Bu durumda\r\n\t * aynı tab+url ile sürekli effect tetiklenir → tab navLink'i kullanıcının anasayfaya\r\n\t * geçtiği gibi (host route'lar MFE NavigationEnd tetiklemez ama signal eski değerinde\r\n\t * kalır) state değişikliklerini geri alır. Value-equality ile yalnızca gerçek URL\r\n\t * değişikliklerinde tetiklensin.\r\n\t */\r\n\treadonly activeMFEUrl = signal<{ tabId: string; url: string; title?: string } | null>(null, {\r\n\t\tequal: (a, b) => a?.tabId === b?.tabId && a?.url === b?.url && a?.title === b?.title\r\n\t});\r\n\r\n\t/**\r\n\t * Aktif tab'ın `tabId`'si — `NavService` tab değişimlerinde günceller.\r\n\t * Plugin Router proxy'leri (`provideHostRouter`) bu signal'ı okuyup `navigate`/`navigateByUrl`\r\n\t * çağrılarına `extras.state._tab` enjekte eder → plugin'lerin yaptığı tüm host\r\n\t * navigation'ları otomatik tab-aware olur, Strategy doğru tab handle'ını korur.\r\n\t */\r\n\treadonly activeTabId = signal<string>('');\r\n\r\n\t/**\r\n\t * Enum (SelectionGroup) cache — cross-MFE paylaşımlı. `SelectionGroupService` her MFE/tab'da\r\n\t * ayrı instance olsa da (Module Federation shared yok) hepsi bu tek state üzerinden okur/yazar\r\n\t * → tek enum cache, tek `/versions` çağrısı, MFE'ler arası localStorage ezme yok.\r\n\t */\r\n\treadonly selectionGroups = signal<{ [key: string]: SelectionGroupDTO | null }>({});\r\n\treadonly selectionLoaded = new Map<string, boolean>();\r\n\treadonly selectionLoading = new Map<string, boolean>();\r\n\t/** Key başına ardışık fetch hatası sayısı — limit aşımında fetchEnum o key'i denemeyi bırakır. */\r\n\treadonly selectionFailures = new Map<string, number>();\r\n\tselectionInitialized = false;\r\n\r\n\thostNgZone: NgZone | null = null;\r\n\thostRouter: Router | null = null;\r\n\t/**\r\n\t * Host (shell) `Location` servisi. Host modda MFE/plugin child injector'larından\r\n\t * erişilemez (child Location izole `IsolatedLocationStrategy`'ye bağlı); browser\r\n\t * adres çubuğuna `replaceState` ile yazmak isteyen directive'ler (örn. `?activeTab`\r\n\t * senkronizasyonu) bunu kullanır. `hostRouter` ile aynı pattern.\r\n\t */\r\n\thostLocation: Location | null = null;\r\n\r\n\tprivate mirrored = false;\r\n\r\n\tmirrorToWindow(): void {\r\n\t\tif (this.mirrored || typeof window === 'undefined') return;\r\n\t\tthis.mirrored = true;\r\n\r\n\t\tconst w = window as Window & LegacyWindowSlots;\r\n\r\n\t\tw.hostMenuItems = this.hostMenuItems;\r\n\t\tw.__ARIL_PAGE_TITLE__ = this.pageTitle;\r\n\r\n\t\teffect(() => {\r\n\t\t\tw.activeHost = this.activeHost() ?? undefined;\r\n\t\t});\r\n\t\teffect(() => {\r\n\t\t\tw.activeMF = this.activeMF() ?? undefined;\r\n\t\t});\r\n\t\teffect(() => {\r\n\t\t\tw.pluginJson = this.pluginJson();\r\n\t\t});\r\n\t\teffect(() => {\r\n\t\t\tw.routeConfigs = this.routeConfigs() ?? undefined;\r\n\t\t});\r\n\r\n\t\tObject.defineProperty(w, 'ngZone', {\r\n\t\t\tconfigurable: true,\r\n\t\t\tget: () => this.hostNgZone\r\n\t\t});\r\n\t\tObject.defineProperty(w, 'hostRouter', {\r\n\t\t\tconfigurable: true,\r\n\t\t\tget: () => this.hostRouter\r\n\t\t});\r\n\t}\r\n}\r\n\r\n// Module Federation shared config olmadığı durumlar için globalThis slot\r\n// üzerinden tek instance garantisi. Host ve her remote MFE ayrı bundle olsa\r\n// bile aynı JS realm'inde aynı instance'ı okur — eski globalThis sözleşmesinin\r\n// yaptığı görevi tek bir tipli slotta birleştirir.\r\nconst BRIDGE_SLOT = '__arilMfeBridge__';\r\ntype BridgeSlotHost = { [BRIDGE_SLOT]?: MfeBridge };\r\n\r\n// Staggered deploy guard'ı için mutable görünüm: slot'u ESKİ bir aril build'inin MfeBridge'i\r\n// doldurmuş olabilir (app'ler ayrı repolardan bağımsız deploy edilir; alan listesi build'ler\r\n// arası genişler). Sonradan eklenen alanlar eski instance'ta yoktur → backfill edilmezse yeni\r\n// lib'li bundle ilk okumada TypeError alır. readonly compile-time kısıtı burada bilinçli aşılır.\r\ntype BridgeBackfill = {\r\n\tselectionGroups?: MfeBridge['selectionGroups'];\r\n\tselectionLoaded?: MfeBridge['selectionLoaded'];\r\n\tselectionLoading?: MfeBridge['selectionLoading'];\r\n\tselectionFailures?: MfeBridge['selectionFailures'];\r\n\tselectionInitialized?: boolean;\r\n};\r\n\r\nexport const bridge: MfeBridge = (() => {\r\n\tconst g = globalThis as unknown as BridgeSlotHost;\r\n\tif (!g[BRIDGE_SLOT]) {\r\n\t\tg[BRIDGE_SLOT] = new MfeBridge();\r\n\t}\r\n\r\n\tconst backfill = g[BRIDGE_SLOT] as unknown as BridgeBackfill;\r\n\tbackfill.selectionGroups ??= signal<{ [key: string]: SelectionGroupDTO | null }>({});\r\n\tbackfill.selectionLoaded ??= new Map<string, boolean>();\r\n\tbackfill.selectionLoading ??= new Map<string, boolean>();\r\n\tbackfill.selectionFailures ??= new Map<string, number>();\r\n\tbackfill.selectionInitialized ??= false;\r\n\r\n\treturn g[BRIDGE_SLOT]!;\r\n})();\r\n","import { makeEnvironmentProviders } from '@angular/core';\r\n\r\nimport { MfeBridge, bridge } from './mfe-bridge';\r\n\r\nexport function provideMfeBridge() {\r\n\treturn makeEnvironmentProviders([{ provide: MfeBridge, useValue: bridge }]);\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -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":["import { Apps } from 'aril/boot/config/apps';\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\tenvironment: 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 } from '@angular/core';\r\n\r\nimport { KeycloakEventType, KeycloakService } from 'keycloak-angular';\r\nimport { EMPTY, catchError, finalize, firstValueFrom, from, fromEvent, switchMap, takeUntil, tap } from 'rxjs';\r\n\r\nimport { RouteConfig, bridge } from 'aril/boot/bridge';\r\nimport { Apps, MicroAppService } from 'aril/boot/config/apps';\r\n\r\nimport { ApiConfigsFactory } 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\tbridge.hostMenuItems.set([]);\r\n\t\t\t\t\t\tbridge.pluginJson.set({});\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$.pipe(takeUntil(fromEvent(window, 'beforeunload'))).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\t// Browser arka plandayken refresh edilince token endpoint 400 (invalid_grant /\r\n\t\t\t\t\t\t\t// süresi dolmuş refresh token / silent-SSO timeout) dönüp `keycloak.init()` reject\r\n\t\t\t\t\t\t\t// olabiliyor. Yakalanmazsa \"ERROR undefined\" + auth'suz bozuk açılış oluyordu.\r\n\t\t\t\t\t\t\t// Hatayı yakalayıp temiz yeniden login'e yönlendir (Keycloak login → mevcut URL'e döner).\r\n\t\t\t\t\t\t\tcatchError((err) => {\r\n\t\t\t\t\t\t\t\tconsole.error(\"Keycloak init başarısız — yeniden login'e yönlendiriliyor:\", err);\r\n\t\t\t\t\t\t\t\tvoid keycloak.login();\r\n\t\t\t\t\t\t\t\treturn EMPTY;\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(\r\n\t\t\t\t\t\t() =>\r\n\t\t\t\t\t\t\tmicroAppService?.init(httpClient, API_CONFIGS.api).pipe(\r\n\t\t\t\t\t\t\t\ttap((result) => {\r\n\t\t\t\t\t\t\t\t\tbridge.hostMenuItems.set(result.menuItems);\r\n\t\t\t\t\t\t\t\t\tbridge.pluginJson.set(result.plugins);\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t) ?? EMPTY\r\n\t\t\t\t\t)\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<RouteConfig[]>(endpoint).subscribe({\r\n\t\t\tnext: (data) => {\r\n\t\t\t\tbridge.routeConfigs.set(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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"}
|
|
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":["import { Apps } from 'aril/boot/config/apps';\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\tenvironment: 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\t[Apps.EVENT_GATEWAY]: ''\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 } from '@angular/core';\r\n\r\nimport { KeycloakEventType, KeycloakService } from 'keycloak-angular';\r\nimport { EMPTY, catchError, finalize, firstValueFrom, from, fromEvent, switchMap, takeUntil, tap } from 'rxjs';\r\n\r\nimport { RouteConfig, bridge } from 'aril/boot/bridge';\r\nimport { Apps, MicroAppService } from 'aril/boot/config/apps';\r\n\r\nimport { ApiConfigsFactory } 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\tbridge.hostMenuItems.set([]);\r\n\t\t\t\t\t\tbridge.pluginJson.set({});\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$.pipe(takeUntil(fromEvent(window, 'beforeunload'))).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\t// Browser arka plandayken refresh edilince token endpoint 400 (invalid_grant /\r\n\t\t\t\t\t\t\t// süresi dolmuş refresh token / silent-SSO timeout) dönüp `keycloak.init()` reject\r\n\t\t\t\t\t\t\t// olabiliyor. Yakalanmazsa \"ERROR undefined\" + auth'suz bozuk açılış oluyordu.\r\n\t\t\t\t\t\t\t// Hatayı yakalayıp temiz yeniden login'e yönlendir (Keycloak login → mevcut URL'e döner).\r\n\t\t\t\t\t\t\tcatchError((err) => {\r\n\t\t\t\t\t\t\t\tconsole.error(\"Keycloak init başarısız — yeniden login'e yönlendiriliyor:\", err);\r\n\t\t\t\t\t\t\t\tvoid keycloak.login();\r\n\t\t\t\t\t\t\t\treturn EMPTY;\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(\r\n\t\t\t\t\t\t() =>\r\n\t\t\t\t\t\t\tmicroAppService?.init(httpClient, API_CONFIGS.api).pipe(\r\n\t\t\t\t\t\t\t\ttap((result) => {\r\n\t\t\t\t\t\t\t\t\tbridge.hostMenuItems.set(result.menuItems);\r\n\t\t\t\t\t\t\t\t\tbridge.pluginJson.set(result.plugins);\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t) ?? EMPTY\r\n\t\t\t\t\t)\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<RouteConfig[]>(endpoint).subscribe({\r\n\t\t\tnext: (data) => {\r\n\t\t\t\tbridge.routeConfigs.set(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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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, Injectable, ElementRef, Component, ViewChild, Input, Renderer2, ViewEncapsulation, isDevMode,
|
|
2
|
+
import { inject, Injectable, ElementRef, Component, ViewChild, Input, Renderer2, ViewEncapsulation, isDevMode, DestroyRef, signal, Directive, HostListener } from '@angular/core';
|
|
3
3
|
import * as i1 from '@angular/router';
|
|
4
4
|
import { Router, NavigationEnd, DefaultUrlSerializer } from '@angular/router';
|
|
5
5
|
import { WebComponentWrapper, startsWith } from '@angular-architects/module-federation-tools';
|
|
6
6
|
import { KeycloakAuthGuard, KeycloakService } from 'keycloak-angular';
|
|
7
|
-
import { map, catchError, of } from 'rxjs';
|
|
7
|
+
import { map, catchError, of, Subject } from 'rxjs';
|
|
8
8
|
import { ForbiddenComponent, NotFoundComponent } from 'aril/boot/pages';
|
|
9
9
|
import { loadRemoteModule } from '@angular-architects/module-federation-runtime';
|
|
10
10
|
import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
|
|
@@ -12,26 +12,44 @@ import { MessageService } from 'primeng/api';
|
|
|
12
12
|
import { TranslocoService } from '@ngneat/transloco';
|
|
13
13
|
import { filter, tap, map as map$1 } from 'rxjs/operators';
|
|
14
14
|
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
const exactPermissions = new Map();
|
|
16
|
+
const patternPermissions = [];
|
|
17
|
+
function setRoutePermissions(menuItems, routePermissions) {
|
|
18
|
+
exactPermissions.clear();
|
|
19
|
+
patternPermissions.length = 0;
|
|
18
20
|
buildPermissionsMap(menuItems);
|
|
21
|
+
buildPatternList(routePermissions);
|
|
19
22
|
}
|
|
20
23
|
function getRoutePermissions(url) {
|
|
21
24
|
const normalizedUrl = url.split('?')[0].replace(/^\//, '');
|
|
22
|
-
return
|
|
25
|
+
return exactPermissions.get(normalizedUrl) ?? patternPermissions.find((p) => p.regex.test(normalizedUrl))?.roles;
|
|
23
26
|
}
|
|
24
27
|
function buildPermissionsMap(items) {
|
|
25
28
|
for (const item of items) {
|
|
26
29
|
if (item.routerLink && item.permittedRoles?.length) {
|
|
27
30
|
const normalized = item.routerLink.replace(/^\//, '');
|
|
28
|
-
|
|
31
|
+
exactPermissions.set(normalized, item.permittedRoles);
|
|
29
32
|
}
|
|
30
33
|
if (item.items?.length) {
|
|
31
34
|
buildPermissionsMap(item.items);
|
|
32
35
|
}
|
|
33
36
|
}
|
|
34
37
|
}
|
|
38
|
+
function buildPatternList(routePermissions) {
|
|
39
|
+
if (!routePermissions?.length) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
for (const entry of routePermissions) {
|
|
43
|
+
if (entry.routerLink && entry.permittedRoles?.length) {
|
|
44
|
+
patternPermissions.push({ regex: globToRegExp(entry.routerLink), roles: entry.permittedRoles });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function globToRegExp(pattern) {
|
|
49
|
+
const normalized = pattern.replace(/^\//, '').replace(/[.+?^${}()|[\]\\]/g, '\\$&');
|
|
50
|
+
const body = normalized.replace(/\*\*|\*/g, (match) => (match === '**' ? '.*' : '[^/]+'));
|
|
51
|
+
return new RegExp(`^${body}$`);
|
|
52
|
+
}
|
|
35
53
|
|
|
36
54
|
class AuthGuard extends KeycloakAuthGuard {
|
|
37
55
|
constructor() {
|
|
@@ -304,7 +322,7 @@ class MicroAppService {
|
|
|
304
322
|
return httpClient
|
|
305
323
|
.get(isDevMode() ? './assets/local-configs/app.local.json' : hostAPI + '/ui-sidebar-configs')
|
|
306
324
|
.pipe(map((apps) => {
|
|
307
|
-
setRoutePermissions(apps.menuItems);
|
|
325
|
+
setRoutePermissions(apps.menuItems, apps.routePermissions);
|
|
308
326
|
const routes = this.buildRoutes([...apps.modules, ...apps.plugins]);
|
|
309
327
|
this.router.resetConfig([
|
|
310
328
|
...this.router.config,
|
|
@@ -392,14 +410,21 @@ var Apps;
|
|
|
392
410
|
Apps["REPORT"] = "report";
|
|
393
411
|
Apps["LGC"] = "lgc";
|
|
394
412
|
Apps["DMS"] = "dms";
|
|
413
|
+
Apps["EVENT_GATEWAY"] = "event-gateway";
|
|
395
414
|
})(Apps || (Apps = {}));
|
|
396
415
|
|
|
397
416
|
class RouteCloseService {
|
|
398
417
|
constructor() {
|
|
399
|
-
this.
|
|
418
|
+
this.deleteRouteSubject = new Subject();
|
|
419
|
+
/**
|
|
420
|
+
* Kapatılan tab key'lerinin kuyruğu. Tek-slot signal yerine Subject kullanılıyor:
|
|
421
|
+
* toplu kapatmada (closeAll/closeOthers/closeToRight) ardışık çağrıların her biri ayrı
|
|
422
|
+
* emit olur ve tüketici hepsini işler. Signal coalescing'i son key dışındakileri düşürüyordu.
|
|
423
|
+
*/
|
|
424
|
+
this.deleteRoute$ = this.deleteRouteSubject.asObservable();
|
|
400
425
|
}
|
|
401
426
|
deleteStoredRoute(key) {
|
|
402
|
-
this.
|
|
427
|
+
this.deleteRouteSubject.next(key);
|
|
403
428
|
}
|
|
404
429
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: RouteCloseService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
405
430
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: RouteCloseService, providedIn: 'root' }); }
|
|
@@ -461,8 +486,7 @@ class CustomRouteReuseStrategy {
|
|
|
461
486
|
* type-safe ve handle GC'ye uğradığında bellek otomatik temizlenir.
|
|
462
487
|
*/
|
|
463
488
|
this.preservedCustomEls = new WeakMap();
|
|
464
|
-
|
|
465
|
-
const key = this.routeCloseService.deleteRoute().key;
|
|
489
|
+
this.routeCloseService.deleteRoute$.pipe(takeUntilDestroyed()).subscribe((key) => {
|
|
466
490
|
if (!key)
|
|
467
491
|
return;
|
|
468
492
|
console.log(`[Strategy] cleanup tetiklendi key="${key}" storedKeys=[${Object.keys(this.storedRoutes).join(',')}]`);
|