aril 2.0.1-dev.4 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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/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 +11 -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/tab-session.service.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-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-oxzMhRXe.mjs → aril-boot-mfe-app.component-DtspQ3J8.mjs} +3 -2
- package/fesm2022/{aril-boot-mfe-app.component-oxzMhRXe.mjs.map → aril-boot-mfe-app.component-DtspQ3J8.mjs.map} +1 -1
- package/fesm2022/{aril-boot-mfe-aril-boot-mfe-CKOM61xb.mjs → aril-boot-mfe-aril-boot-mfe-lovoFcgw.mjs} +12 -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 +4 -193
- 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 +14 -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 +184 -208
- package/scripts/mf-shared.js +47 -47
- 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 +1 -1
- package/theme/layout/index.d.ts +1 -1
- package/theme/layout/index.ts +3 -1
- package/theme/layout/service/tab-session.service.ts +138 -138
- 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 -195
- 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-CKOM61xb.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 -209
- 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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AfterViewInit, ElementRef } from '@angular/core';
|
|
1
|
+
import { AfterViewInit, ElementRef, OnDestroy } from '@angular/core';
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
declare const KTBlockUI: any;
|
|
4
4
|
interface BlockOptions {
|
|
@@ -6,23 +6,17 @@ interface BlockOptions {
|
|
|
6
6
|
overlayClass?: string;
|
|
7
7
|
message?: string;
|
|
8
8
|
}
|
|
9
|
-
export declare class Block implements AfterViewInit {
|
|
10
|
-
private element;
|
|
9
|
+
export declare class Block implements AfterViewInit, OnDestroy {
|
|
10
|
+
private readonly element;
|
|
11
11
|
constructor(element: ElementRef);
|
|
12
12
|
arilBlock: import("@angular/core").InputSignal<boolean, boolean>;
|
|
13
13
|
blockOptions: import("@angular/core").InputSignal<BlockOptions, BlockOptions>;
|
|
14
14
|
blockUI: typeof KTBlockUI;
|
|
15
15
|
target: import("@angular/core").WritableSignal<HTMLElement>;
|
|
16
16
|
ngAfterViewInit(): void;
|
|
17
|
+
ngOnDestroy(): void;
|
|
17
18
|
getTarget(element: ElementRef): HTMLElement;
|
|
18
19
|
static ɵfac: i0.ɵɵFactoryDeclaration<Block, never>;
|
|
19
20
|
static ɵdir: i0.ɵɵDirectiveDeclaration<Block, "[arilBlock]", never, { "arilBlock": { "alias": "arilBlock"; "required": true; "isSignal": true; }; "blockOptions": { "alias": "blockOptions"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
20
21
|
}
|
|
21
|
-
export declare class BlockPage {
|
|
22
|
-
constructor();
|
|
23
|
-
arilBlockPage: import("@angular/core").InputSignal<boolean, boolean>;
|
|
24
|
-
blockOptions: import("@angular/core").InputSignal<BlockOptions, BlockOptions>;
|
|
25
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<BlockPage, never>;
|
|
26
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<BlockPage, "[arilBlockPage]", never, { "arilBlockPage": { "alias": "arilBlockPage"; "required": true; "isSignal": true; }; "blockOptions": { "alias": "blockOptions"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
27
|
-
}
|
|
28
22
|
export {};
|
|
@@ -13,8 +13,8 @@ declare const PubSubEvents: {
|
|
|
13
13
|
};
|
|
14
14
|
export declare class PubSubService {
|
|
15
15
|
publish(e: CustomEvent): void;
|
|
16
|
-
subscribe(eventName: keyof typeof PubSubEvents, listener: (data: any) => void):
|
|
17
|
-
unSubscribe(eventName: keyof typeof PubSubEvents,
|
|
16
|
+
subscribe(eventName: keyof typeof PubSubEvents, listener: (data: any) => void): EventListener;
|
|
17
|
+
unSubscribe(eventName: keyof typeof PubSubEvents, handler: EventListener): void;
|
|
18
18
|
static ɵfac: i0.ɵɵFactoryDeclaration<PubSubService, never>;
|
|
19
19
|
static ɵprov: i0.ɵɵInjectableDeclaration<PubSubService>;
|
|
20
20
|
}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
export function ServiceCallMock(httpMethod, proxy, serviceURL, mockAPI, message) {
|
|
2
|
-
// return ServiceCall(httpMethod, proxy, serviceURL, message, mockAPI, true);
|
|
3
|
-
}
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZU1vY2tCYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJpbC9odHRwL3NyYy9zZXJ2aWNlTW9ja0Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxVQUFVLGVBQWUsQ0FDOUIsVUFBdUIsRUFDdkIsS0FBaUIsRUFDakIsVUFBa0IsRUFDbEIsT0FBZSxFQUNmLE9BQW1FO0lBRW5FLDZFQUE2RTtBQUM5RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSFRUUE1ldGhvZHMsIFByb3h5VHlwZXMgfSBmcm9tICcuLi9saWIvZW51bXMnO1xyXG5pbXBvcnQgeyBTZXJ2aWNlQ2FsbCB9IGZyb20gJy4vc2VydmljZUJhc2UnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIFNlcnZpY2VDYWxsTW9jayhcclxuXHRodHRwTWV0aG9kOiBIVFRQTWV0aG9kcyxcclxuXHRwcm94eTogUHJveHlUeXBlcyxcclxuXHRzZXJ2aWNlVVJMOiBzdHJpbmcsXHJcblx0bW9ja0FQSTogc3RyaW5nLFxyXG5cdG1lc3NhZ2U/OiB7IHN1Y2Nlc3M/OiBzdHJpbmc7IGVycm9yPzogc3RyaW5nOyB1c2VEZWZhdWx0OiBib29sZWFuIH1cclxuKSB7XHJcblx0Ly8gcmV0dXJuIFNlcnZpY2VDYWxsKGh0dHBNZXRob2QsIHByb3h5LCBzZXJ2aWNlVVJMLCBtZXNzYWdlLCBtb2NrQVBJLCB0cnVlKTtcclxufVxyXG4iXX0=
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { take } from 'rxjs';
|
|
3
|
-
import { bridge } from 'aril/boot/bridge';
|
|
4
|
-
import { API_CONFIGS } from 'aril/boot/config/api';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/common/http";
|
|
7
|
-
// Key başına maksimum ardışık fetch hatası: limit aşılınca o key oturum boyu yeniden denenmez.
|
|
8
|
-
// Sınırsız retry'da kalıcı hata veren bir grup (örn. silinmiş grup → 404), diğer grupların her
|
|
9
|
-
// başarılı yüklemesinde (map güncellemesi tüm enum computed'larını yeniden çalıştırır) yeniden
|
|
10
|
-
// POST edilirdi → istek/console fırtınası.
|
|
11
|
-
const MAX_FETCH_FAILURES = 3;
|
|
12
|
-
export class SelectionGroupService {
|
|
13
|
-
constructor(http) {
|
|
14
|
-
this.http = http;
|
|
15
|
-
// State cross-MFE paylaşımlı: bridge globalThis-singleton'ında yaşar (bkz. mfe-bridge.ts).
|
|
16
|
-
// Servis instance'ı MFE/tab başına çoğalsa da tüm okuma/yazma tek bridge state'ine gider.
|
|
17
|
-
this.selectionGroups = bridge.selectionGroups;
|
|
18
|
-
this.loading = bridge.selectionLoading;
|
|
19
|
-
this.loaded = bridge.selectionLoaded;
|
|
20
|
-
this.failures = bridge.selectionFailures;
|
|
21
|
-
// loadStates + invalidate yalnızca ilk instance'ta (cross-MFE bir kez): tek localStorage
|
|
22
|
-
// yüklemesi, tek `/versions` çağrısı. effect her instance'ta kurulur ama hepsi aynı paylaşılan
|
|
23
|
-
// state'i yazdığından ezme olmaz.
|
|
24
|
-
if (!bridge.selectionInitialized) {
|
|
25
|
-
bridge.selectionInitialized = true;
|
|
26
|
-
this.loadStatesFromLocalStorage();
|
|
27
|
-
this.invalidateStaleGroups();
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
// localStorage'a slim cache yazar. `effect` YERİNE bilinçli olarak doğrudan çağrılır: signal'i
|
|
31
|
-
// değiştiren her yer (fetchEnum, invalidateStaleGroups) persist'i açıkça tetikler. NOT: webpack MF
|
|
32
|
-
// config'iyle `@angular/core` artık singleton shared olduğundan effect-tabanlı persist de çalışırdı;
|
|
33
|
-
// yine de açık/öngörülebilir olması (effect içinde gizli signal-write + NG0600 riski olmaması) için
|
|
34
|
-
// doğrudan çağrı tercih edildi.
|
|
35
|
-
persistToLocalStorage() {
|
|
36
|
-
try {
|
|
37
|
-
const slim = this.slimForStorage(this.selectionGroups());
|
|
38
|
-
localStorage.setItem('selection-groups', btoa(encodeURI(JSON.stringify(slim))));
|
|
39
|
-
}
|
|
40
|
-
catch {
|
|
41
|
-
// QuotaExceededError vb. → eski cache'i koru, yeni yazımı sessizce atla.
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
loadStatesFromLocalStorage() {
|
|
45
|
-
const selectionGroups = localStorage.getItem('selection-groups');
|
|
46
|
-
if (selectionGroups) {
|
|
47
|
-
try {
|
|
48
|
-
const decodedData = decodeURI(atob(selectionGroups));
|
|
49
|
-
// Dynamic gruplar zaten persist edilmiyor (slimForStorage onları atlar) → ekstra
|
|
50
|
-
// filtre gerekmez; localStorage içeriği yalnızca Fixed gruplardır.
|
|
51
|
-
const restored = JSON.parse(decodedData);
|
|
52
|
-
this.selectionGroups.set(restored);
|
|
53
|
-
// Restore edilen gruplar loaded sayılır: aksi halde koşulsuz fetchEnum çağıran
|
|
54
|
-
// consumer'lar guard'ı geçip her oturum yeniden çeker (cache faydası kaybolur).
|
|
55
|
-
// Stale'lik kontrolü invalidateStaleGroups'un işi. null entry'ler (legacy) loaded
|
|
56
|
-
// işaretlenmez — işaretlenirse o grup bir daha hiç yüklenemezdi.
|
|
57
|
-
Object.entries(restored).forEach(([key, group]) => {
|
|
58
|
-
if (group)
|
|
59
|
-
this.loaded.set(key, true);
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
catch (e) {
|
|
63
|
-
console.error(e);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
// Dynamic grupları atlar + Fixed grupları yalnızca render (value/table/picker/export) ve invalidate
|
|
68
|
-
// için gerekli alanlara indirger. localStorage'da audit/id/açıklama gibi kullanılmayan alanları tutmaz.
|
|
69
|
-
slimForStorage(groups) {
|
|
70
|
-
const out = {};
|
|
71
|
-
for (const [key, group] of Object.entries(groups)) {
|
|
72
|
-
if (!group || group.loadStrategy === 'Dynamic')
|
|
73
|
-
continue;
|
|
74
|
-
out[key] = {
|
|
75
|
-
version: group.version,
|
|
76
|
-
selectionItems: (group.selectionItems ?? []).map((it) => ({
|
|
77
|
-
selectionKey: it.selectionKey,
|
|
78
|
-
selectionDisplay: it.selectionDisplay,
|
|
79
|
-
selectionMultiLanguageDisplays: it.selectionMultiLanguageDisplays,
|
|
80
|
-
showOrder: it.showOrder,
|
|
81
|
-
parentSelectionKey: it.parentSelectionKey
|
|
82
|
-
}))
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
return out;
|
|
86
|
-
}
|
|
87
|
-
// App init'te enum version'larını çekip localStorage'daki stale grupları temizler.
|
|
88
|
-
// Silinen grup, tüketici component'lerin `if (!selectionGroup) fetchEnum()` guard'ıyla yeniden yüklenir.
|
|
89
|
-
invalidateStaleGroups() {
|
|
90
|
-
// App-init snapshot: yalnızca localStorage'dan yüklenen gruplar kontrol edilir. Yanıt gelene
|
|
91
|
-
// kadar consumer'ların fetchEnum ile yüklediği taze gruplar taranmaz/silinmez (aksi halde
|
|
92
|
-
// taze grup silinir ve kalıcı per-component fetch guard'ları onu bir daha çekmeyebilir).
|
|
93
|
-
const keysToCheck = Object.keys(this.selectionGroups());
|
|
94
|
-
if (keysToCheck.length === 0)
|
|
95
|
-
return;
|
|
96
|
-
const hostApi = API_CONFIGS.api.replace(/\/[^\/]+\/v1$/, `/host/v1`);
|
|
97
|
-
this.http
|
|
98
|
-
.get(hostApi + '/selection-group/versions')
|
|
99
|
-
.pipe(take(1))
|
|
100
|
-
.subscribe({
|
|
101
|
-
next: (versions) => {
|
|
102
|
-
// Boş/bozuk yanıt güvenlik şeridi: aşağıdaki "listede olmayanı sil" kuralı
|
|
103
|
-
// boş listeyle tüm cache'i yanlışlıkla boşaltmasın.
|
|
104
|
-
if (!versions?.length)
|
|
105
|
-
return;
|
|
106
|
-
const latest = new Map(versions.map((v) => [v.groupName, v.version]));
|
|
107
|
-
let changed = false;
|
|
108
|
-
const next = { ...this.selectionGroups() };
|
|
109
|
-
keysToCheck.forEach((key) => {
|
|
110
|
-
const group = next[key];
|
|
111
|
-
if (!group)
|
|
112
|
-
return;
|
|
113
|
-
const separatorIndex = key.indexOf('~');
|
|
114
|
-
if (separatorIndex === -1)
|
|
115
|
-
return;
|
|
116
|
-
const serverVersion = latest.get(key.substring(0, separatorIndex));
|
|
117
|
-
// serverVersion == null: grup /versions listesinde yok → sunucudan silinmiş /
|
|
118
|
-
// yeniden adlandırılmış demektir (endpoint Fixed grupların tam listesini döner)
|
|
119
|
-
// → o da evict edilir; kalırsa kaldırılmış enum değerleri süresiz render edilir.
|
|
120
|
-
if (serverVersion == null || serverVersion !== group.version) {
|
|
121
|
-
delete next[key];
|
|
122
|
-
this.loaded.delete(key);
|
|
123
|
-
this.failures.delete(key);
|
|
124
|
-
// Uçuştaki fetch'in flag'i korunur: silinirse ikinci bir consumer guard'ı
|
|
125
|
-
// geçip duplicate /load atar ve export-overlay'in isLoading poll'ü grubu
|
|
126
|
-
// beklemeden erken geçer. Yanıt geldiğinde flag'i fetchEnum kendisi yönetir.
|
|
127
|
-
if (!this.loading.get(key)) {
|
|
128
|
-
this.loading.delete(key);
|
|
129
|
-
}
|
|
130
|
-
changed = true;
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
if (changed) {
|
|
134
|
-
this.selectionGroups.set(next);
|
|
135
|
-
this.persistToLocalStorage();
|
|
136
|
-
}
|
|
137
|
-
},
|
|
138
|
-
error: () => {
|
|
139
|
-
// versions endpoint yok/erişilemez: sessizce mevcut cache ile devam.
|
|
140
|
-
}
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
fetchEnum(groupName, parentSelectionKey = 'ALL') {
|
|
144
|
-
const key = groupName + '~' + parentSelectionKey;
|
|
145
|
-
if (this.loaded.get(key) || this.loading.get(key))
|
|
146
|
-
return;
|
|
147
|
-
if ((this.failures.get(key) ?? 0) >= MAX_FETCH_FAILURES)
|
|
148
|
-
return;
|
|
149
|
-
const payload = {
|
|
150
|
-
groupName,
|
|
151
|
-
parentSelectionKey
|
|
152
|
-
};
|
|
153
|
-
this.loading.set(key, true);
|
|
154
|
-
this.loaded.set(key, false);
|
|
155
|
-
const hostApi = API_CONFIGS.api.replace(/\/[^\/]+\/v1$/, `/host/v1`);
|
|
156
|
-
this.http
|
|
157
|
-
.post(hostApi + '/selection-group/load', payload)
|
|
158
|
-
.pipe(take(1))
|
|
159
|
-
.subscribe({
|
|
160
|
-
next: (selectionGroup) => {
|
|
161
|
-
this.loading.set(key, false);
|
|
162
|
-
this.loaded.set(key, true);
|
|
163
|
-
this.failures.delete(key);
|
|
164
|
-
this.selectionGroups.update((groups) => ({
|
|
165
|
-
...groups,
|
|
166
|
-
[key]: selectionGroup
|
|
167
|
-
}));
|
|
168
|
-
this.persistToLocalStorage();
|
|
169
|
-
},
|
|
170
|
-
// HTTP hatasında loading'i sıfırla: aksi halde guard (loaded/loading) bu enum'u
|
|
171
|
-
// kilitler. loading/loaded bridge'de cross-MFE SHARED olduğundan, tek bir anlık hata
|
|
172
|
-
// bu enum'u TÜM remote'larda hard-reload'a kadar bir daha çekilemez yapardı. loading=false
|
|
173
|
-
// → sonraki fetchEnum (component init/retry) yeniden deneyebilir. loaded zaten false kalır.
|
|
174
|
-
// Deneme sayısı MAX_FETCH_FAILURES ile sınırlı: kalıcı hatada sonsuz retry önlenir.
|
|
175
|
-
error: () => {
|
|
176
|
-
this.loading.set(key, false);
|
|
177
|
-
this.failures.set(key, (this.failures.get(key) ?? 0) + 1);
|
|
178
|
-
}
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
// key formatı: `groupName~parentSelectionKey` (fetchEnum'daki composite key ile aynı).
|
|
182
|
-
// Direkt olarak groupName geçilirse Map'te eşleşme olmaz ve her zaman false döner.
|
|
183
|
-
isLoading(key) {
|
|
184
|
-
return this.loading.get(key) ?? false;
|
|
185
|
-
}
|
|
186
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: SelectionGroupService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
187
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: SelectionGroupService, providedIn: 'root' }); }
|
|
188
|
-
}
|
|
189
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: SelectionGroupService, decorators: [{
|
|
190
|
-
type: Injectable,
|
|
191
|
-
args: [{
|
|
192
|
-
providedIn: 'root'
|
|
193
|
-
}]
|
|
194
|
-
}], ctorParameters: () => [{ type: i1.HttpClient }] });
|
|
195
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLWdyb3VwLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcmlsL3RoZW1lL2xheW91dC9zZXJ2aWNlL3NlbGVjdGlvbi1ncm91cC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU1QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7QUFJbkQsK0ZBQStGO0FBQy9GLCtGQUErRjtBQUMvRiwrRkFBK0Y7QUFDL0YsMkNBQTJDO0FBQzNDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0FBSzdCLE1BQU0sT0FBTyxxQkFBcUI7SUFTakMsWUFBNkIsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQVI3QywyRkFBMkY7UUFDM0YsMEZBQTBGO1FBQzFGLG9CQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQztRQUV4QixZQUFPLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1FBQ2xDLFdBQU0sR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDO1FBQ2hDLGFBQVEsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUM7UUFHcEQseUZBQXlGO1FBQ3pGLCtGQUErRjtRQUMvRixrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7WUFDbkMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDOUIsQ0FBQztJQUNGLENBQUM7SUFFRCwrRkFBK0Y7SUFDL0Ys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Q0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0QsQ0FBQztTQUNELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCx1RkFBdUY7SUFDdkYsbUZBQW1GO0lBQ25GLFNBQVMsQ0FBQyxHQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDO0lBQ3ZDLENBQUM7OEdBNUxXLHFCQUFxQjtrSEFBckIscUJBQXFCLGNBRnJCLE1BQU07OzJGQUVOLHFCQUFxQjtrQkFIakMsVUFBVTttQkFBQztvQkFDWCxVQUFVLEVBQUUsTUFBTTtpQkFDbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBicmlkZ2UgfSBmcm9tICdhcmlsL2Jvb3QvYnJpZGdlJztcclxuaW1wb3J0IHsgQVBJX0NPTkZJR1MgfSBmcm9tICdhcmlsL2Jvb3QvY29uZmlnL2FwaSc7XHJcblxyXG5pbXBvcnQgeyBTZWxlY3Rpb25Hcm91cERUTywgU2VsZWN0aW9uR3JvdXBWZXJzaW9uRFRPLCBTZWxlY3Rpb25SZXF1ZXN0RFRPIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2ludGVyZmFjZXMnO1xyXG5cclxuLy8gS2V5IGJhxZ/EsW5hIG1ha3NpbXVtIGFyZMSxxZ/EsWsgZmV0Y2ggaGF0YXPEsTogbGltaXQgYcWfxLFsxLFuY2EgbyBrZXkgb3R1cnVtIGJveXUgeWVuaWRlbiBkZW5lbm1lei5cclxuLy8gU8SxbsSxcnPEsXogcmV0cnknZGEga2FsxLFjxLEgaGF0YSB2ZXJlbiBiaXIgZ3J1cCAow7Zybi4gc2lsaW5tacWfIGdydXAg4oaSIDQwNCksIGRpxJ9lciBncnVwbGFyxLFuIGhlclxyXG4vLyBiYcWfYXLEsWzEsSB5w7xrbGVtZXNpbmRlIChtYXAgZ8O8bmNlbGxlbWVzaSB0w7xtIGVudW0gY29tcHV0ZWQnbGFyxLFuxLEgeWVuaWRlbiDDp2FsxLHFn3TEsXLEsXIpIHllbmlkZW5cclxuLy8gUE9TVCBlZGlsaXJkaSDihpIgaXN0ZWsvY29uc29sZSBmxLFydMSxbmFzxLEuXHJcbmNvbnN0IE1BWF9GRVRDSF9GQUlMVVJFUyA9IDM7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcblx0cHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb25Hcm91cFNlcnZpY2Uge1xyXG5cdC8vIFN0YXRlIGNyb3NzLU1GRSBwYXlsYcWfxLFtbMSxOiBicmlkZ2UgZ2xvYmFsVGhpcy1zaW5nbGV0b24nxLFuZGEgeWHFn2FyIChia3ouIG1mZS1icmlkZ2UudHMpLlxyXG5cdC8vIFNlcnZpcyBpbnN0YW5jZSfEsSBNRkUvdGFiIGJhxZ/EsW5hIMOnb8SfYWxzYSBkYSB0w7xtIG9rdW1hL3lhem1hIHRlayBicmlkZ2Ugc3RhdGUnaW5lIGdpZGVyLlxyXG5cdHNlbGVjdGlvbkdyb3VwcyA9IGJyaWRnZS5zZWxlY3Rpb25Hcm91cHM7XHJcblxyXG5cdHByaXZhdGUgcmVhZG9ubHkgbG9hZGluZyA9IGJyaWRnZS5zZWxlY3Rpb25Mb2FkaW5nO1xyXG5cdHByaXZhdGUgcmVhZG9ubHkgbG9hZGVkID0gYnJpZGdlLnNlbGVjdGlvbkxvYWRlZDtcclxuXHRwcml2YXRlIHJlYWRvbmx5IGZhaWx1cmVzID0gYnJpZGdlLnNlbGVjdGlvbkZhaWx1cmVzO1xyXG5cclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGh0dHA6IEh0dHBDbGllbnQpIHtcclxuXHRcdC8vIGxvYWRTdGF0ZXMgKyBpbnZhbGlkYXRlIHlhbG7EsXpjYSBpbGsgaW5zdGFuY2UndGEgKGNyb3NzLU1GRSBiaXIga2V6KTogdGVrIGxvY2FsU3RvcmFnZVxyXG5cdFx0Ly8gecO8a2xlbWVzaSwgdGVrIGAvdmVyc2lvbnNgIMOnYcSfcsSxc8SxLiBlZmZlY3QgaGVyIGluc3RhbmNlJ3RhIGt1cnVsdXIgYW1hIGhlcHNpIGF5bsSxIHBheWxhxZ/EsWxhblxyXG5cdFx0Ly8gc3RhdGUnaSB5YXpkxLHEn8SxbmRhbiBlem1lIG9sbWF6LlxyXG5cdFx0aWYgKCFicmlkZ2Uuc2VsZWN0aW9uSW5pdGlhbGl6ZWQpIHtcclxuXHRcdFx0YnJpZGdlLnNlbGVjdGlvbkluaXRpYWxpemVkID0gdHJ1ZTtcclxuXHRcdFx0dGhpcy5sb2FkU3RhdGVzRnJvbUxvY2FsU3RvcmFnZSgpO1xyXG5cdFx0XHR0aGlzLmludmFsaWRhdGVTdGFsZUdyb3VwcygpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gbG9jYWxTdG9yYWdlJ2Egc2xpbSBjYWNoZSB5YXphci4gYGVmZmVjdGAgWUVSxLBORSBiaWxpbsOnbGkgb2xhcmFrIGRvxJ9ydWRhbiDDp2HEn3LEsWzEsXI6IHNpZ25hbCdpXHJcblx0Ly8gZGXEn2nFn3RpcmVuIGhlciB5ZXIgKGZldGNoRW51bSwgaW52YWxpZGF0ZVN0YWxlR3JvdXBzKSBwZXJzaXN0J2kgYcOnxLFrw6dhIHRldGlrbGVyLiBOT1Q6IHdlYnBhY2sgTUZcclxuXHQvLyBjb25maWcnaXlsZSBgQGFuZ3VsYXIvY29yZWAgYXJ0xLFrIHNpbmdsZXRvbiBzaGFyZWQgb2xkdcSfdW5kYW4gZWZmZWN0LXRhYmFubMSxIHBlcnNpc3QgZGUgw6dhbMSxxZ/EsXJkxLE7XHJcblx0Ly8geWluZSBkZSBhw6fEsWsvw7ZuZ8O2csO8bGViaWxpciBvbG1hc8SxIChlZmZlY3QgacOnaW5kZSBnaXpsaSBzaWduYWwtd3JpdGUgKyBORzA2MDAgcmlza2kgb2xtYW1hc8SxKSBpw6dpblxyXG5cdC8vIGRvxJ9ydWRhbiDDp2HEn3LEsSB0ZXJjaWggZWRpbGRpLlxyXG5cdHByaXZhdGUgcGVyc2lzdFRvTG9jYWxTdG9yYWdlKCkge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Y29uc3Qgc2xpbSA9IHRoaXMuc2xpbUZvclN0b3JhZ2UodGhpcy5zZWxlY3Rpb25Hcm91cHMoKSk7XHJcblx0XHRcdGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdzZWxlY3Rpb24tZ3JvdXBzJywgYnRvYShlbmNvZGVVUkkoSlNPTi5zdHJpbmdpZnkoc2xpbSkpKSk7XHJcblx0XHR9IGNhdGNoIHtcclxuXHRcdFx0Ly8gUXVvdGFFeGNlZWRlZEVycm9yIHZiLiDihpIgZXNraSBjYWNoZSdpIGtvcnUsIHllbmkgeWF6xLFtxLEgc2Vzc2l6Y2UgYXRsYS5cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgbG9hZFN0YXRlc0Zyb21Mb2NhbFN0b3JhZ2UoKSB7XHJcblx0XHRjb25zdCBzZWxlY3Rpb25Hcm91cHMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc2VsZWN0aW9uLWdyb3VwcycpO1xyXG5cclxuXHRcdGlmIChzZWxlY3Rpb25Hcm91cHMpIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRjb25zdCBkZWNvZGVkRGF0YSA9IGRlY29kZVVSSShhdG9iKHNlbGVjdGlvbkdyb3VwcykpO1xyXG5cdFx0XHRcdC8vIER5bmFtaWMgZ3J1cGxhciB6YXRlbiBwZXJzaXN0IGVkaWxtaXlvciAoc2xpbUZvclN0b3JhZ2Ugb25sYXLEsSBhdGxhcikg4oaSIGVrc3RyYVxyXG5cdFx0XHRcdC8vIGZpbHRyZSBnZXJla21lejsgbG9jYWxTdG9yYWdlIGnDp2VyacSfaSB5YWxuxLF6Y2EgRml4ZWQgZ3J1cGxhcmTEsXIuXHJcblx0XHRcdFx0Y29uc3QgcmVzdG9yZWQ6IHsgW2tleTogc3RyaW5nXTogU2VsZWN0aW9uR3JvdXBEVE8gfCBudWxsIH0gPSBKU09OLnBhcnNlKGRlY29kZWREYXRhKTtcclxuXHRcdFx0XHR0aGlzLnNlbGVjdGlvbkdyb3Vwcy5zZXQocmVzdG9yZWQpO1xyXG5cclxuXHRcdFx0XHQvLyBSZXN0b3JlIGVkaWxlbiBncnVwbGFyIGxvYWRlZCBzYXnEsWzEsXI6IGFrc2kgaGFsZGUga2/Fn3Vsc3V6IGZldGNoRW51bSDDp2HEn8SxcmFuXHJcblx0XHRcdFx0Ly8gY29uc3VtZXInbGFyIGd1YXJkJ8SxIGdlw6dpcCBoZXIgb3R1cnVtIHllbmlkZW4gw6dla2VyIChjYWNoZSBmYXlkYXPEsSBrYXlib2x1cikuXHJcblx0XHRcdFx0Ly8gU3RhbGUnbGlrIGtvbnRyb2zDvCBpbnZhbGlkYXRlU3RhbGVHcm91cHMndW4gacWfaS4gbnVsbCBlbnRyeSdsZXIgKGxlZ2FjeSkgbG9hZGVkXHJcblx0XHRcdFx0Ly8gacWfYXJldGxlbm1leiDigJQgacWfYXJldGxlbmlyc2UgbyBncnVwIGJpciBkYWhhIGhpw6cgecO8a2xlbmVtZXpkaS5cclxuXHRcdFx0XHRPYmplY3QuZW50cmllcyhyZXN0b3JlZCkuZm9yRWFjaCgoW2tleSwgZ3JvdXBdKSA9PiB7XHJcblx0XHRcdFx0XHRpZiAoZ3JvdXApIHRoaXMubG9hZGVkLnNldChrZXksIHRydWUpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdFx0Y29uc29sZS5lcnJvcihlKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gRHluYW1pYyBncnVwbGFyxLEgYXRsYXIgKyBGaXhlZCBncnVwbGFyxLEgeWFsbsSxemNhIHJlbmRlciAodmFsdWUvdGFibGUvcGlja2VyL2V4cG9ydCkgdmUgaW52YWxpZGF0ZVxyXG5cdC8vIGnDp2luIGdlcmVrbGkgYWxhbmxhcmEgaW5kaXJnZXIuIGxvY2FsU3RvcmFnZSdkYSBhdWRpdC9pZC9hw6fEsWtsYW1hIGdpYmkga3VsbGFuxLFsbWF5YW4gYWxhbmxhcsSxIHR1dG1hei5cclxuXHRwcml2YXRlIHNsaW1Gb3JTdG9yYWdlKGdyb3VwczogeyBba2V5OiBzdHJpbmddOiBTZWxlY3Rpb25Hcm91cERUTyB8IG51bGwgfSk6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9IHtcclxuXHRcdGNvbnN0IG91dDogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0gPSB7fTtcclxuXHRcdGZvciAoY29uc3QgW2tleSwgZ3JvdXBdIG9mIE9iamVjdC5lbnRyaWVzKGdyb3VwcykpIHtcclxuXHRcdFx0aWYgKCFncm91cCB8fCBncm91cC5sb2FkU3RyYXRlZ3kgPT09ICdEeW5hbWljJykgY29udGludWU7XHJcblx0XHRcdG91dFtrZXldID0ge1xyXG5cdFx0XHRcdHZlcnNpb246IGdyb3VwLnZlcnNpb24sXHJcblx0XHRcdFx0c2VsZWN0aW9uSXRlbXM6IChncm91cC5zZWxlY3Rpb25JdGVtcyA/PyBbXSkubWFwKChpdCkgPT4gKHtcclxuXHRcdFx0XHRcdHNlbGVjdGlvbktleTogaXQuc2VsZWN0aW9uS2V5LFxyXG5cdFx0XHRcdFx0c2VsZWN0aW9uRGlzcGxheTogaXQuc2VsZWN0aW9uRGlzcGxheSxcclxuXHRcdFx0XHRcdHNlbGVjdGlvbk11bHRpTGFuZ3VhZ2VEaXNwbGF5czogaXQuc2VsZWN0aW9uTXVsdGlMYW5ndWFnZURpc3BsYXlzLFxyXG5cdFx0XHRcdFx0c2hvd09yZGVyOiBpdC5zaG93T3JkZXIsXHJcblx0XHRcdFx0XHRwYXJlbnRTZWxlY3Rpb25LZXk6IGl0LnBhcmVudFNlbGVjdGlvbktleVxyXG5cdFx0XHRcdH0pKVxyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIG91dDtcclxuXHR9XHJcblxyXG5cdC8vIEFwcCBpbml0J3RlIGVudW0gdmVyc2lvbidsYXLEsW7EsSDDp2VraXAgbG9jYWxTdG9yYWdlJ2Rha2kgc3RhbGUgZ3J1cGxhcsSxIHRlbWl6bGVyLlxyXG5cdC8vIFNpbGluZW4gZ3J1cCwgdMO8a2V0aWNpIGNvbXBvbmVudCdsZXJpbiBgaWYgKCFzZWxlY3Rpb25Hcm91cCkgZmV0Y2hFbnVtKClgIGd1YXJkJ8SxeWxhIHllbmlkZW4gecO8a2xlbmlyLlxyXG5cdHByaXZhdGUgaW52YWxpZGF0ZVN0YWxlR3JvdXBzKCkge1xyXG5cdFx0Ly8gQXBwLWluaXQgc25hcHNob3Q6IHlhbG7EsXpjYSBsb2NhbFN0b3JhZ2UnZGFuIHnDvGtsZW5lbiBncnVwbGFyIGtvbnRyb2wgZWRpbGlyLiBZYW7EsXQgZ2VsZW5lXHJcblx0XHQvLyBrYWRhciBjb25zdW1lcidsYXLEsW4gZmV0Y2hFbnVtIGlsZSB5w7xrbGVkacSfaSB0YXplIGdydXBsYXIgdGFyYW5tYXovc2lsaW5tZXogKGFrc2kgaGFsZGVcclxuXHRcdC8vIHRhemUgZ3J1cCBzaWxpbmlyIHZlIGthbMSxY8SxIHBlci1jb21wb25lbnQgZmV0Y2ggZ3VhcmQnbGFyxLEgb251IGJpciBkYWhhIMOnZWttZXllYmlsaXIpLlxyXG5cdFx0Y29uc3Qga2V5c1RvQ2hlY2sgPSBPYmplY3Qua2V5cyh0aGlzLnNlbGVjdGlvbkdyb3VwcygpKTtcclxuXHRcdGlmIChrZXlzVG9DaGVjay5sZW5ndGggPT09IDApIHJldHVybjtcclxuXHJcblx0XHRjb25zdCBob3N0QXBpID0gQVBJX0NPTkZJR1MuYXBpLnJlcGxhY2UoL1xcL1teXFwvXStcXC92MSQvLCBgL2hvc3QvdjFgKTtcclxuXHJcblx0XHR0aGlzLmh0dHBcclxuXHRcdFx0LmdldDxTZWxlY3Rpb25Hcm91cFZlcnNpb25EVE9bXT4oaG9zdEFwaSArICcvc2VsZWN0aW9uLWdyb3VwL3ZlcnNpb25zJylcclxuXHRcdFx0LnBpcGUodGFrZSgxKSlcclxuXHRcdFx0LnN1YnNjcmliZSh7XHJcblx0XHRcdFx0bmV4dDogKHZlcnNpb25zKSA9PiB7XHJcblx0XHRcdFx0XHQvLyBCb8WfL2JvenVrIHlhbsSxdCBnw7x2ZW5saWsgxZ9lcmlkaTogYcWfYcSfxLFkYWtpIFwibGlzdGVkZSBvbG1heWFuxLEgc2lsXCIga3VyYWzEsVxyXG5cdFx0XHRcdFx0Ly8gYm/FnyBsaXN0ZXlsZSB0w7xtIGNhY2hlJ2kgeWFubMSxxZ9sxLFrbGEgYm/Fn2FsdG1hc8Sxbi5cclxuXHRcdFx0XHRcdGlmICghdmVyc2lvbnM/Lmxlbmd0aCkgcmV0dXJuO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGxhdGVzdCA9IG5ldyBNYXAodmVyc2lvbnMubWFwKCh2KSA9PiBbdi5ncm91cE5hbWUsIHYudmVyc2lvbl0gYXMgW3N0cmluZywgbnVtYmVyXSkpO1xyXG5cclxuXHRcdFx0XHRcdGxldCBjaGFuZ2VkID0gZmFsc2U7XHJcblx0XHRcdFx0XHRjb25zdCBuZXh0ID0geyAuLi50aGlzLnNlbGVjdGlvbkdyb3VwcygpIH07XHJcblxyXG5cdFx0XHRcdFx0a2V5c1RvQ2hlY2suZm9yRWFjaCgoa2V5KSA9PiB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGdyb3VwID0gbmV4dFtrZXldO1xyXG5cdFx0XHRcdFx0XHRpZiAoIWdyb3VwKSByZXR1cm47XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBzZXBhcmF0b3JJbmRleCA9IGtleS5pbmRleE9mKCd+Jyk7XHJcblx0XHRcdFx0XHRcdGlmIChzZXBhcmF0b3JJbmRleCA9PT0gLTEpIHJldHVybjtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IHNlcnZlclZlcnNpb24gPSBsYXRlc3QuZ2V0KGtleS5zdWJzdHJpbmcoMCwgc2VwYXJhdG9ySW5kZXgpKTtcclxuXHJcblx0XHRcdFx0XHRcdC8vIHNlcnZlclZlcnNpb24gPT0gbnVsbDogZ3J1cCAvdmVyc2lvbnMgbGlzdGVzaW5kZSB5b2sg4oaSIHN1bnVjdWRhbiBzaWxpbm1pxZ8gL1xyXG5cdFx0XHRcdFx0XHQvLyB5ZW5pZGVuIGFkbGFuZMSxcsSxbG3EscWfIGRlbWVrdGlyIChlbmRwb2ludCBGaXhlZCBncnVwbGFyxLFuIHRhbSBsaXN0ZXNpbmkgZMO2bmVyKVxyXG5cdFx0XHRcdFx0XHQvLyDihpIgbyBkYSBldmljdCBlZGlsaXI7IGthbMSxcnNhIGthbGTEsXLEsWxtxLHFnyBlbnVtIGRlxJ9lcmxlcmkgc8O8cmVzaXogcmVuZGVyIGVkaWxpci5cclxuXHRcdFx0XHRcdFx0aWYgKHNlcnZlclZlcnNpb24gPT0gbnVsbCB8fCBzZXJ2ZXJWZXJzaW9uICE9PSBncm91cC52ZXJzaW9uKSB7XHJcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIG5leHRba2V5XTtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmxvYWRlZC5kZWxldGUoa2V5KTtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmZhaWx1cmVzLmRlbGV0ZShrZXkpO1xyXG5cdFx0XHRcdFx0XHRcdC8vIFXDp3XFn3Rha2kgZmV0Y2gnaW4gZmxhZydpIGtvcnVudXI6IHNpbGluaXJzZSBpa2luY2kgYmlyIGNvbnN1bWVyIGd1YXJkJ8SxXHJcblx0XHRcdFx0XHRcdFx0Ly8gZ2XDp2lwIGR1cGxpY2F0ZSAvbG9hZCBhdGFyIHZlIGV4cG9ydC1vdmVybGF5J2luIGlzTG9hZGluZyBwb2xsJ8O8IGdydWJ1XHJcblx0XHRcdFx0XHRcdFx0Ly8gYmVrbGVtZWRlbiBlcmtlbiBnZcOnZXIuIFlhbsSxdCBnZWxkacSfaW5kZSBmbGFnJ2kgZmV0Y2hFbnVtIGtlbmRpc2kgecO2bmV0aXIuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCF0aGlzLmxvYWRpbmcuZ2V0KGtleSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMubG9hZGluZy5kZWxldGUoa2V5KTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0Y2hhbmdlZCA9IHRydWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdGlmIChjaGFuZ2VkKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuc2VsZWN0aW9uR3JvdXBzLnNldChuZXh0KTtcclxuXHRcdFx0XHRcdFx0dGhpcy5wZXJzaXN0VG9Mb2NhbFN0b3JhZ2UoKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGVycm9yOiAoKSA9PiB7XHJcblx0XHRcdFx0XHQvLyB2ZXJzaW9ucyBlbmRwb2ludCB5b2svZXJpxZ9pbGVtZXo6IHNlc3NpemNlIG1ldmN1dCBjYWNoZSBpbGUgZGV2YW0uXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGZldGNoRW51bShncm91cE5hbWU6IHN0cmluZywgcGFyZW50U2VsZWN0aW9uS2V5OiBzdHJpbmcgPSAnQUxMJykge1xyXG5cdFx0Y29uc3Qga2V5ID0gZ3JvdXBOYW1lICsgJ34nICsgcGFyZW50U2VsZWN0aW9uS2V5O1xyXG5cclxuXHRcdGlmICh0aGlzLmxvYWRlZC5nZXQoa2V5KSB8fCB0aGlzLmxvYWRpbmcuZ2V0KGtleSkpIHJldHVybjtcclxuXHRcdGlmICgodGhpcy5mYWlsdXJlcy5nZXQoa2V5KSA/PyAwKSA+PSBNQVhfRkVUQ0hfRkFJTFVSRVMpIHJldHVybjtcclxuXHJcblx0XHRjb25zdCBwYXlsb2FkOiBTZWxlY3Rpb25SZXF1ZXN0RFRPID0ge1xyXG5cdFx0XHRncm91cE5hbWUsXHJcblx0XHRcdHBhcmVudFNlbGVjdGlvbktleVxyXG5cdFx0fTtcclxuXHJcblx0XHR0aGlzLmxvYWRpbmcuc2V0KGtleSwgdHJ1ZSk7XHJcblx0XHR0aGlzLmxvYWRlZC5zZXQoa2V5LCBmYWxzZSk7XHJcblxyXG5cdFx0Y29uc3QgaG9zdEFwaSA9IEFQSV9DT05GSUdTLmFwaS5yZXBsYWNlKC9cXC9bXlxcL10rXFwvdjEkLywgYC9ob3N0L3YxYCk7XHJcblxyXG5cdFx0dGhpcy5odHRwXHJcblx0XHRcdC5wb3N0PFNlbGVjdGlvbkdyb3VwRFRPPihob3N0QXBpICsgJy9zZWxlY3Rpb24tZ3JvdXAvbG9hZCcsIHBheWxvYWQpXHJcblx0XHRcdC5waXBlKHRha2UoMSkpXHJcblx0XHRcdC5zdWJzY3JpYmUoe1xyXG5cdFx0XHRcdG5leHQ6IChzZWxlY3Rpb25Hcm91cCkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5sb2FkaW5nLnNldChrZXksIGZhbHNlKTtcclxuXHRcdFx0XHRcdHRoaXMubG9hZGVkLnNldChrZXksIHRydWUpO1xyXG5cdFx0XHRcdFx0dGhpcy5mYWlsdXJlcy5kZWxldGUoa2V5KTtcclxuXHJcblx0XHRcdFx0XHR0aGlzLnNlbGVjdGlvbkdyb3Vwcy51cGRhdGUoKGdyb3VwcykgPT4gKHtcclxuXHRcdFx0XHRcdFx0Li4uZ3JvdXBzLFxyXG5cdFx0XHRcdFx0XHRba2V5XTogc2VsZWN0aW9uR3JvdXBcclxuXHRcdFx0XHRcdH0pKTtcclxuXHJcblx0XHRcdFx0XHR0aGlzLnBlcnNpc3RUb0xvY2FsU3RvcmFnZSgpO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0Ly8gSFRUUCBoYXRhc8SxbmRhIGxvYWRpbmcnaSBzxLFmxLFybGE6IGFrc2kgaGFsZGUgZ3VhcmQgKGxvYWRlZC9sb2FkaW5nKSBidSBlbnVtJ3VcclxuXHRcdFx0XHQvLyBraWxpdGxlci4gbG9hZGluZy9sb2FkZWQgYnJpZGdlJ2RlIGNyb3NzLU1GRSBTSEFSRUQgb2xkdcSfdW5kYW4sIHRlayBiaXIgYW5sxLFrIGhhdGFcclxuXHRcdFx0XHQvLyBidSBlbnVtJ3UgVMOcTSByZW1vdGUnbGFyZGEgaGFyZC1yZWxvYWQnYSBrYWRhciBiaXIgZGFoYSDDp2VraWxlbWV6IHlhcGFyZMSxLiBsb2FkaW5nPWZhbHNlXHJcblx0XHRcdFx0Ly8g4oaSIHNvbnJha2kgZmV0Y2hFbnVtIChjb21wb25lbnQgaW5pdC9yZXRyeSkgeWVuaWRlbiBkZW5leWViaWxpci4gbG9hZGVkIHphdGVuIGZhbHNlIGthbMSxci5cclxuXHRcdFx0XHQvLyBEZW5lbWUgc2F5xLFzxLEgTUFYX0ZFVENIX0ZBSUxVUkVTIGlsZSBzxLFuxLFybMSxOiBrYWzEsWPEsSBoYXRhZGEgc29uc3V6IHJldHJ5IMO2bmxlbmlyLlxyXG5cdFx0XHRcdGVycm9yOiAoKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLmxvYWRpbmcuc2V0KGtleSwgZmFsc2UpO1xyXG5cdFx0XHRcdFx0dGhpcy5mYWlsdXJlcy5zZXQoa2V5LCAodGhpcy5mYWlsdXJlcy5nZXQoa2V5KSA/PyAwKSArIDEpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvLyBrZXkgZm9ybWF0xLE6IGBncm91cE5hbWV+cGFyZW50U2VsZWN0aW9uS2V5YCAoZmV0Y2hFbnVtJ2Rha2kgY29tcG9zaXRlIGtleSBpbGUgYXluxLEpLlxyXG5cdC8vIERpcmVrdCBvbGFyYWsgZ3JvdXBOYW1lIGdlw6dpbGlyc2UgTWFwJ3RlIGXFn2xlxZ9tZSBvbG1heiB2ZSBoZXIgemFtYW4gZmFsc2UgZMO2bmVyLlxyXG5cdGlzTG9hZGluZyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIHRoaXMubG9hZGluZy5nZXQoa2V5KSA/PyBmYWxzZTtcclxuXHR9XHJcbn1cclxuIl19
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, input } from '@angular/core';
|
|
2
|
-
import { SplitButtonModule } from 'primeng/splitbutton';
|
|
3
|
-
import { ButtonComponent } from './button.component';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "primeng/splitbutton";
|
|
6
|
-
export class SplitButtonComponent extends ButtonComponent {
|
|
7
|
-
constructor() {
|
|
8
|
-
super(...arguments);
|
|
9
|
-
this.menu = input.required();
|
|
10
|
-
}
|
|
11
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: SplitButtonComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
12
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "17.1.2", type: SplitButtonComponent, isStandalone: true, selector: "aril-split-button", inputs: { menu: { classPropertyName: "menu", publicName: "menu", isSignal: true, isRequired: true, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<p-splitButton [label]=\"label()\" [icon]=\"_icon()\" [styleClass]=\"_styleClass()\" [model]=\"menu()\" [disabled]=\"disabled()\">\r\n</p-splitButton>\r\n", dependencies: [{ kind: "ngmodule", type: SplitButtonModule }, { kind: "component", type: i1.SplitButton, selector: "p-splitButton", inputs: ["model", "severity", "raised", "rounded", "text", "outlined", "size", "plain", "icon", "iconPos", "label", "tooltip", "tooltipOptions", "style", "styleClass", "menuStyle", "menuStyleClass", "appendTo", "dir", "expandAriaLabel", "showTransitionOptions", "hideTransitionOptions", "buttonProps", "menuButtonProps", "autofocus", "disabled", "tabindex", "menuButtonDisabled", "buttonDisabled"], outputs: ["onClick", "onMenuHide", "onMenuShow", "onDropdownClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
13
|
-
}
|
|
14
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: SplitButtonComponent, decorators: [{
|
|
15
|
-
type: Component,
|
|
16
|
-
args: [{ standalone: true, selector: 'aril-split-button', imports: [SplitButtonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<p-splitButton [label]=\"label()\" [icon]=\"_icon()\" [styleClass]=\"_styleClass()\" [model]=\"menu()\" [disabled]=\"disabled()\">\r\n</p-splitButton>\r\n" }]
|
|
17
|
-
}] });
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXQtYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FyaWwvdWkvYnV0dG9uL3NyYy9zcGxpdC1idXR0b24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJpbC91aS9idXR0b24vc3JjL3NwbGl0LWJ1dHRvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUcxRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV4RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7OztBQVNyRCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsZUFBZTtJQVB6RDs7UUFRQyxTQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBYyxDQUFDO0tBQ3BDOzhHQUZZLG9CQUFvQjtrR0FBcEIsb0JBQW9CLG9PQ2RqQyw0SkFFQSwyQ0RTVyxpQkFBaUI7OzJGQUdmLG9CQUFvQjtrQkFQaEMsU0FBUztpQ0FDRyxJQUFJLFlBQ04sbUJBQW1CLFdBRXBCLENBQUMsaUJBQWlCLENBQUMsbUJBQ1gsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBNZW51SXRlbSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgU3BsaXRCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL3NwbGl0YnV0dG9uJztcclxuXHJcbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4vYnV0dG9uLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHRzdGFuZGFsb25lOiB0cnVlLFxyXG5cdHNlbGVjdG9yOiAnYXJpbC1zcGxpdC1idXR0b24nLFxyXG5cdHRlbXBsYXRlVXJsOiAnLi9zcGxpdC1idXR0b24uY29tcG9uZW50Lmh0bWwnLFxyXG5cdGltcG9ydHM6IFtTcGxpdEJ1dHRvbk1vZHVsZV0sXHJcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcclxufSlcclxuZXhwb3J0IGNsYXNzIFNwbGl0QnV0dG9uQ29tcG9uZW50IGV4dGVuZHMgQnV0dG9uQ29tcG9uZW50IHtcclxuXHRtZW51ID0gaW5wdXQucmVxdWlyZWQ8TWVudUl0ZW1bXT4oKTtcclxufVxyXG4iLCI8cC1zcGxpdEJ1dHRvbiBbbGFiZWxdPVwibGFiZWwoKVwiIFtpY29uXT1cIl9pY29uKClcIiBbc3R5bGVDbGFzc109XCJfc3R5bGVDbGFzcygpXCIgW21vZGVsXT1cIm1lbnUoKVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZCgpXCI+XHJcbjwvcC1zcGxpdEJ1dHRvbj5cclxuIl19
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import { NgClass } from '@angular/common';
|
|
2
|
-
import { isPlatformBrowser } from '@angular/common';
|
|
3
|
-
import { ChangeDetectionStrategy, Component, Inject, PLATFORM_ID, input } from '@angular/core';
|
|
4
|
-
import * as am5 from '@amcharts/amcharts5';
|
|
5
|
-
import am5themes_Animated from '@amcharts/amcharts5/themes/Animated';
|
|
6
|
-
import * as am5xy from '@amcharts/amcharts5/xy';
|
|
7
|
-
import { ChartThemes } from '../../theme/theme';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
// EXAMPLE CHART DATA
|
|
10
|
-
// testChartData = [
|
|
11
|
-
// {
|
|
12
|
-
// label: "col1",
|
|
13
|
-
// value: 100000
|
|
14
|
-
// },
|
|
15
|
-
// {
|
|
16
|
-
// label: "col2",
|
|
17
|
-
// value: 160000
|
|
18
|
-
// },
|
|
19
|
-
// {
|
|
20
|
-
// label: "col3",
|
|
21
|
-
// value: 80000
|
|
22
|
-
// }
|
|
23
|
-
// ];
|
|
24
|
-
export class ColumnChartComponent {
|
|
25
|
-
constructor(platformId, zone) {
|
|
26
|
-
this.platformId = platformId;
|
|
27
|
-
this.zone = zone;
|
|
28
|
-
this.data = input.required();
|
|
29
|
-
this.chartId = input.required(); // must be given unique names for all charts. Its because angular and am5 rendering methods needs unique id to draw different canvas
|
|
30
|
-
this.appName = input('yeap');
|
|
31
|
-
this.chartHeight = input.required();
|
|
32
|
-
this.chartColorSet = [];
|
|
33
|
-
}
|
|
34
|
-
browserOnly(f) {
|
|
35
|
-
if (isPlatformBrowser(this.platformId)) {
|
|
36
|
-
this.zone.runOutsideAngular(() => {
|
|
37
|
-
f();
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
ngAfterViewInit() {
|
|
42
|
-
// Chart code goes in here
|
|
43
|
-
this.browserOnly(() => {
|
|
44
|
-
switch (this.appName()) {
|
|
45
|
-
case 'yeap':
|
|
46
|
-
this.chartColorSet = ChartThemes.getYeapAppColors();
|
|
47
|
-
break;
|
|
48
|
-
case 'thor':
|
|
49
|
-
this.chartColorSet = ChartThemes.getThorAppColors();
|
|
50
|
-
break;
|
|
51
|
-
case 'lena':
|
|
52
|
-
this.chartColorSet = ChartThemes.getLenaAppColors();
|
|
53
|
-
break;
|
|
54
|
-
case 'billing':
|
|
55
|
-
this.chartColorSet = ChartThemes.getThorAppColors();
|
|
56
|
-
break;
|
|
57
|
-
default:
|
|
58
|
-
this.chartColorSet = ChartThemes.getYeapAppColors();
|
|
59
|
-
break;
|
|
60
|
-
}
|
|
61
|
-
const root = am5.Root.new(this.chartId());
|
|
62
|
-
root._logo?.dispose();
|
|
63
|
-
root.setThemes([am5themes_Animated.new(root)]);
|
|
64
|
-
const chart = root.container.children.push(am5xy.XYChart.new(root, {
|
|
65
|
-
panY: false,
|
|
66
|
-
layout: root.verticalLayout
|
|
67
|
-
}));
|
|
68
|
-
const yAxis = chart.yAxes.push(am5xy.ValueAxis.new(root, {
|
|
69
|
-
renderer: am5xy.AxisRendererY.new(root, {})
|
|
70
|
-
}));
|
|
71
|
-
const xAxis = chart.xAxes.push(am5xy.CategoryAxis.new(root, {
|
|
72
|
-
renderer: am5xy.AxisRendererX.new(root, {}),
|
|
73
|
-
categoryField: 'label'
|
|
74
|
-
}));
|
|
75
|
-
xAxis.data.setAll(this.data());
|
|
76
|
-
const series = chart.series.push(am5xy.ColumnSeries.new(root, {
|
|
77
|
-
xAxis: xAxis,
|
|
78
|
-
yAxis: yAxis,
|
|
79
|
-
valueYField: 'value',
|
|
80
|
-
categoryXField: 'label',
|
|
81
|
-
stacked: true
|
|
82
|
-
}));
|
|
83
|
-
series.data.setAll(this.data());
|
|
84
|
-
xAxis.data.setAll(this.data());
|
|
85
|
-
series.columns.template.setAll({
|
|
86
|
-
stroke: am5.color(0xffffff),
|
|
87
|
-
strokeWidth: 2
|
|
88
|
-
});
|
|
89
|
-
series.columns.template.adapters.add('fill', (fill, target) => {
|
|
90
|
-
const dataContext = target.dataItem?.dataContext;
|
|
91
|
-
if (dataContext) {
|
|
92
|
-
const index = this.data().findIndex((item) => item.label === dataContext.label);
|
|
93
|
-
return am5.color(this.chartColorSet[index % this.chartColorSet.length]); // Sıralı renk seçimi
|
|
94
|
-
}
|
|
95
|
-
return fill;
|
|
96
|
-
});
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
ngOnDestroy() {
|
|
100
|
-
// Clean up chart when the component is removed
|
|
101
|
-
this.browserOnly(() => {
|
|
102
|
-
if (this.root) {
|
|
103
|
-
this.root.dispose();
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: ColumnChartComponent, deps: [{ token: PLATFORM_ID }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
108
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "17.1.2", type: ColumnChartComponent, isStandalone: true, selector: "aril-column-chart", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, chartId: { classPropertyName: "chartId", publicName: "chartId", isSignal: true, isRequired: true, transformFunction: null }, appName: { classPropertyName: "appName", publicName: "appName", isSignal: true, isRequired: false, transformFunction: null }, chartHeight: { classPropertyName: "chartHeight", publicName: "chartHeight", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `<div style="width: 100%; height:{{ chartHeight() }}px;" id="{{ chartId() }}"></div>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
109
|
-
}
|
|
110
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: ColumnChartComponent, decorators: [{
|
|
111
|
-
type: Component,
|
|
112
|
-
args: [{
|
|
113
|
-
standalone: true,
|
|
114
|
-
selector: 'aril-column-chart',
|
|
115
|
-
// templateUrl: './column-chart.component.html',
|
|
116
|
-
template: `<div style="width: 100%; height:{{ chartHeight() }}px;" id="{{ chartId() }}"></div>`,
|
|
117
|
-
imports: [NgClass],
|
|
118
|
-
changeDetection: ChangeDetectionStrategy.OnPush
|
|
119
|
-
}]
|
|
120
|
-
}], ctorParameters: () => [{ type: Object, decorators: [{
|
|
121
|
-
type: Inject,
|
|
122
|
-
args: [PLATFORM_ID]
|
|
123
|
-
}] }, { type: i0.NgZone }] });
|
|
124
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FyaWwvdWkvY2hhcnRzL3NyYy9hbUNoYXJ0cy9jb2x1bW4vY29sdW1uLWNoYXJ0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2RyxPQUFPLEtBQUssR0FBRyxNQUFNLHFCQUFxQixDQUFDO0FBQzNDLE9BQU8sa0JBQWtCLE1BQU0scUNBQXFDLENBQUM7QUFDckUsT0FBTyxLQUFLLEtBQUssTUFBTSx3QkFBd0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7O0FBVWhELHFCQUFxQjtBQUNyQixvQkFBb0I7QUFDcEIsS0FBSztBQUNMLG1CQUFtQjtBQUNuQixrQkFBa0I7QUFDbEIsTUFBTTtBQUNOLEtBQUs7QUFDTCxtQkFBbUI7QUFDbkIsa0JBQWtCO0FBQ2xCLE1BQU07QUFDTixLQUFLO0FBQ0wsbUJBQW1CO0FBQ25CLGlCQUFpQjtBQUNqQixLQUFLO0FBQ0wsS0FBSztBQVVMLE1BQU0sT0FBTyxvQkFBb0I7SUFHaEMsWUFBeUMsVUFBa0IsRUFBVSxJQUFZO1FBQXhDLGVBQVUsR0FBVixVQUFVLENBQVE7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFRO1FBRWpGLFNBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFlLENBQUM7UUFDckMsWUFBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQVUsQ0FBQyxDQUFDLG9JQUFvSTtRQUN4SyxZQUFPLEdB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LENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3JCLENBQUM7UUFDRixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7OEdBcEdXLG9CQUFvQixrQkFHWixXQUFXO2tHQUhuQixvQkFBb0IsaWxCQUp0QixxRkFBcUY7OzJGQUluRixvQkFBb0I7a0JBUmhDLFNBQVM7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLGdEQUFnRDtvQkFDaEQsUUFBUSxFQUFFLHFGQUFxRjtvQkFDL0YsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDO29CQUNsQixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDL0M7OzBCQUlhLE1BQU07MkJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEluamVjdCwgTmdab25lLCBQTEFURk9STV9JRCwgaW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCAqIGFzIGFtNSBmcm9tICdAYW1jaGFydHMvYW1jaGFydHM1JztcclxuaW1wb3J0IGFtNXRoZW1lc19BbmltYXRlZCBmcm9tICdAYW1jaGFydHMvYW1jaGFydHM1L3RoZW1lcy9BbmltYXRlZCc7XHJcbmltcG9ydCAqIGFzIGFtNXh5IGZyb20gJ0BhbWNoYXJ0cy9hbWNoYXJ0czUveHknO1xyXG5cclxuaW1wb3J0IHsgQ2hhcnRUaGVtZXMgfSBmcm9tICcuLi8uLi90aGVtZS90aGVtZSc7XHJcblxyXG5pbnRlcmZhY2UgZGF0YUl0ZW1zIHtcclxuXHRsYWJlbDogc3RyaW5nOyAvLyB0aGlzIGZpZWxkIGNhbiB1c2UgYXMgY2F0ZWdvcnlcclxuXHR2YWx1ZTogbnVtYmVyO1xyXG5cdHZhbHVlMj86IG51bWJlcjtcclxufVxyXG5cclxudHlwZSBhcHBOYW1lcyA9ICd0aG9yJyB8ICdsZW5hJyB8ICdiaWxsaW5nJyB8ICd5ZWFwJztcclxuXHJcbi8vIEVYQU1QTEUgQ0hBUlQgREFUQVxyXG4vLyB0ZXN0Q2hhcnREYXRhID0gW1xyXG4vLyBcdHtcclxuLy8gXHRcdGxhYmVsOiBcImNvbDFcIixcclxuLy8gXHRcdHZhbHVlOiAxMDAwMDBcclxuLy8gXHR9LFxyXG4vLyBcdHtcclxuLy8gXHRcdGxhYmVsOiBcImNvbDJcIixcclxuLy8gXHRcdHZhbHVlOiAxNjAwMDBcclxuLy8gXHR9LFxyXG4vLyBcdHtcclxuLy8gXHRcdGxhYmVsOiBcImNvbDNcIixcclxuLy8gXHRcdHZhbHVlOiA4MDAwMFxyXG4vLyBcdH1cclxuLy8gXTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHN0YW5kYWxvbmU6IHRydWUsXHJcblx0c2VsZWN0b3I6ICdhcmlsLWNvbHVtbi1jaGFydCcsXHJcblx0Ly8gdGVtcGxhdGVVcmw6ICcuL2NvbHVtbi1jaGFydC5jb21wb25lbnQuaHRtbCcsXHJcblx0dGVtcGxhdGU6IGA8ZGl2IHN0eWxlPVwid2lkdGg6IDEwMCU7IGhlaWdodDp7eyBjaGFydEhlaWdodCgpIH19cHg7XCIgaWQ9XCJ7eyBjaGFydElkKCkgfX1cIj48L2Rpdj5gLFxyXG5cdGltcG9ydHM6IFtOZ0NsYXNzXSxcclxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29sdW1uQ2hhcnRDb21wb25lbnQge1xyXG5cdHByaXZhdGUgcm9vdCE6IGFtNS5Sb290O1xyXG5cclxuXHRjb25zdHJ1Y3RvcihASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCwgcHJpdmF0ZSB6b25lOiBOZ1pvbmUpIHt9XHJcblxyXG5cdGRhdGEgPSBpbnB1dC5yZXF1aXJlZDxkYXRhSXRlbXNbXT4oKTtcclxuXHRjaGFydElkID0gaW5wdXQucmVxdWlyZWQ8c3RyaW5nPigpOyAvLyBtdXN0IGJlIGdpdmVuIHVuaXF1ZSBuYW1lcyBmb3IgYWxsIGNoYXJ0cy4gSXRzIGJlY2F1c2UgYW5ndWxhciBhbmQgYW01IHJlbmRlcmluZyBtZXRob2RzIG5lZWRzIHVuaXF1ZSBpZCB0byBkcmF3IGRpZmZlcmVudCBjYW52YXNcclxuXHRhcHBOYW1lID0gaW5wdXQ8YXBwTmFtZXM+KCd5ZWFwJyk7XHJcblx0Y2hhcnRIZWlnaHQgPSBpbnB1dC5yZXF1aXJlZDxzdHJpbmc+KCk7XHJcblx0Y2hhcnRDb2xvclNldDogc3RyaW5nW10gPSBbXTtcclxuXHJcblx0YnJvd3Nlck9ubHkoZjogKCkgPT4gdm9pZCkge1xyXG5cdFx0aWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcclxuXHRcdFx0dGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuXHRcdFx0XHRmKCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0bmdBZnRlclZpZXdJbml0KCkge1xyXG5cdFx0Ly8gQ2hhcnQgY29kZSBnb2VzIGluIGhlcmVcclxuXHRcdHRoaXMuYnJvd3Nlck9ubHkoKCkgPT4ge1xyXG5cdFx0XHRzd2l0Y2ggKHRoaXMuYXBwTmFtZSgpKSB7XHJcblx0XHRcdFx0Y2FzZSAneWVhcCc6XHJcblx0XHRcdFx0XHR0aGlzLmNoYXJ0Q29sb3JTZXQgPSBDaGFydFRoZW1lcy5nZXRZZWFwQXBwQ29sb3JzKCk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlICd0aG9yJzpcclxuXHRcdFx0XHRcdHRoaXMuY2hhcnRDb2xvclNldCA9IENoYXJ0VGhlbWVzLmdldFRob3JBcHBDb2xvcnMoKTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgJ2xlbmEnOlxyXG5cdFx0XHRcdFx0dGhpcy5jaGFydENvbG9yU2V0ID0gQ2hhcnRUaGVtZXMuZ2V0TGVuYUFwcENvbG9ycygpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSAnYmlsbGluZyc6XHJcblx0XHRcdFx0XHR0aGlzLmNoYXJ0Q29sb3JTZXQgPSBDaGFydFRoZW1lcy5nZXRUaG9yQXBwQ29sb3JzKCk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0dGhpcy5jaGFydENvbG9yU2V0ID0gQ2hhcnRUaGVtZXMuZ2V0WWVhcEFwcENvbG9ycygpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3Qgcm9vdCA9IGFtNS5Sb290Lm5ldyh0aGlzLmNoYXJ0SWQoKSk7XHJcblx0XHRcdHJvb3QuX2xvZ28/LmRpc3Bvc2UoKTtcclxuXHRcdFx0cm9vdC5zZXRUaGVtZXMoW2FtNXRoZW1lc19BbmltYXRlZC5uZXcocm9vdCldKTtcclxuXHJcblx0XHRcdGNvbnN0IGNoYXJ0ID0gcm9vdC5jb250YWluZXIuY2hpbGRyZW4ucHVzaChcclxuXHRcdFx0XHRhbTV4eS5YWUNoYXJ0Lm5ldyhyb290LCB7XHJcblx0XHRcdFx0XHRwYW5ZOiBmYWxzZSxcclxuXHRcdFx0XHRcdGxheW91dDogcm9vdC52ZXJ0aWNhbExheW91dFxyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0XHRjb25zdCB5QXhpcyA9IGNoYXJ0LnlBeGVzLnB1c2goXHJcblx0XHRcdFx0YW01eHkuVmFsdWVBeGlzLm5ldyhyb290LCB7XHJcblx0XHRcdFx0XHRyZW5kZXJlcjogYW01eHkuQXhpc1JlbmRlcmVyWS5uZXcocm9vdCwge30pXHJcblx0XHRcdFx0fSlcclxuXHRcdFx0KTtcclxuXHJcblx0XHRcdGNvbnN0IHhBeGlzID0gY2hhcnQueEF4ZXMucHVzaChcclxuXHRcdFx0XHRhbTV4eS5DYXRlZ29yeUF4aXMubmV3KHJvb3QsIHtcclxuXHRcdFx0XHRcdHJlbmRlcmVyOiBhbTV4eS5BeGlzUmVuZGVyZXJYLm5ldyhyb290LCB7fSksXHJcblx0XHRcdFx0XHRjYXRlZ29yeUZpZWxkOiAnbGFiZWwnXHJcblx0XHRcdFx0fSlcclxuXHRcdFx0KTtcclxuXHRcdFx0eEF4aXMuZGF0YS5zZXRBbGwodGhpcy5kYXRhKCkpO1xyXG5cclxuXHRcdFx0Y29uc3Qgc2VyaWVzID0gY2hhcnQuc2VyaWVzLnB1c2goXHJcblx0XHRcdFx0YW01eHkuQ29sdW1uU2VyaWVzLm5ldyhyb290LCB7XHJcblx0XHRcdFx0XHR4QXhpczogeEF4aXMsXHJcblx0XHRcdFx0XHR5QXhpczogeUF4aXMsXHJcblx0XHRcdFx0XHR2YWx1ZVlGaWVsZDogJ3ZhbHVlJyxcclxuXHRcdFx0XHRcdGNhdGVnb3J5WEZpZWxkOiAnbGFiZWwnLFxyXG5cdFx0XHRcdFx0c3RhY2tlZDogdHJ1ZVxyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0XHRzZXJpZXMuZGF0YS5zZXRBbGwodGhpcy5kYXRhKCkpO1xyXG5cdFx0XHR4QXhpcy5kYXRhLnNldEFsbCh0aGlzLmRhdGEoKSk7XHJcblxyXG5cdFx0XHRzZXJpZXMuY29sdW1ucy50ZW1wbGF0ZS5zZXRBbGwoe1xyXG5cdFx0XHRcdHN0cm9rZTogYW01LmNvbG9yKDB4ZmZmZmZmKSxcclxuXHRcdFx0XHRzdHJva2VXaWR0aDogMlxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdHNlcmllcy5jb2x1bW5zLnRlbXBsYXRlLmFkYXB0ZXJzLmFkZCgnZmlsbCcsIChmaWxsLCB0YXJnZXQpID0+IHtcclxuXHRcdFx0XHRjb25zdCBkYXRhQ29udGV4dDogYW55ID0gdGFyZ2V0LmRhdGFJdGVtPy5kYXRhQ29udGV4dDtcclxuXHRcdFx0XHRpZiAoZGF0YUNvbnRleHQpIHtcclxuXHRcdFx0XHRcdGNvbnN0IGluZGV4ID0gdGhpcy5kYXRhKCkuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmxhYmVsID09PSBkYXRhQ29udGV4dC5sYWJlbCk7XHJcblx0XHRcdFx0XHRyZXR1cm4gYW01LmNvbG9yKHRoaXMuY2hhcnRDb2xvclNldFtpbmRleCAlIHRoaXMuY2hhcnRDb2xvclNldC5sZW5ndGhdKTsgLy8gU8SxcmFsxLEgcmVuayBzZcOnaW1pXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiBmaWxsO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0bmdPbkRlc3Ryb3koKSB7XHJcblx0XHQvLyBDbGVhbiB1cCBjaGFydCB3aGVuIHRoZSBjb21wb25lbnQgaXMgcmVtb3ZlZFxyXG5cdFx0dGhpcy5icm93c2VyT25seSgoKSA9PiB7XHJcblx0XHRcdGlmICh0aGlzLnJvb3QpIHtcclxuXHRcdFx0XHR0aGlzLnJvb3QuZGlzcG9zZSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcbn1cclxuIl19
|