@simplysm/angular 14.0.19 → 14.0.22
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/dist/core/provideSdAngular.js +1 -1
- package/dist/core/providers/sd-activated-modal.provider.d.ts +13 -0
- package/dist/core/providers/sd-activated-modal.provider.d.ts.map +1 -0
- package/dist/core/providers/sd-activated-modal.provider.js +15 -0
- package/dist/core/providers/sd-app-structure.provider.d.ts +3 -64
- package/dist/core/providers/sd-app-structure.provider.d.ts.map +1 -1
- package/dist/core/providers/sd-app-structure.provider.js +1 -252
- package/dist/core/providers/sd-app-structure.types.d.ts +52 -0
- package/dist/core/providers/sd-app-structure.types.d.ts.map +1 -0
- package/dist/core/providers/sd-app-structure.types.js +1 -0
- package/dist/core/providers/sd-app-structure.utils.d.ts +13 -0
- package/dist/core/providers/sd-app-structure.utils.d.ts.map +1 -0
- package/dist/core/providers/sd-app-structure.utils.js +250 -0
- package/dist/{ui/overlay/busy → core/providers}/sd-busy.provider.d.ts +1 -1
- package/dist/core/providers/sd-busy.provider.d.ts.map +1 -0
- package/dist/{ui/overlay/busy → core/providers}/sd-busy.provider.js +1 -1
- package/dist/core/providers/sd-print.provider.js +1 -1
- package/dist/core/providers/sd-service-client-factory.provider.js +1 -1
- package/dist/{ui/overlay/toast → core/providers}/sd-toast.provider.d.ts +1 -1
- package/dist/core/providers/sd-toast.provider.d.ts.map +1 -0
- package/dist/{ui/overlay/toast → core/providers}/sd-toast.provider.js +3 -3
- package/dist/core/types/select-modal-output-result.d.ts +8 -0
- package/dist/core/types/select-modal-output-result.d.ts.map +1 -0
- package/dist/core/types/select-modal-output-result.js +1 -0
- package/dist/core/utils/setups/setupCanDeactivate.js +1 -1
- package/dist/core/utils/useViewTitleSignal.js +1 -1
- package/dist/core/utils/useViewTypeSignal.js +1 -1
- package/dist/features/base/sd-base-container.control.js +1 -1
- package/dist/features/data-view/sd-data-detail.control.js +1 -1
- package/dist/features/data-view/sd-data-sheet.control.d.ts +24 -37
- package/dist/features/data-view/sd-data-sheet.control.d.ts.map +1 -1
- package/dist/features/data-view/sd-data-sheet.control.js +98 -152
- package/dist/features/data-view/sd-data-sheet.types.d.ts +17 -0
- package/dist/features/data-view/sd-data-sheet.types.d.ts.map +1 -0
- package/dist/features/data-view/sd-data-sheet.types.js +1 -0
- package/dist/{core/utils/setups → features/data-view}/setupCloserWhenSingleSelectionChange.d.ts +1 -1
- package/dist/features/data-view/setupCloserWhenSingleSelectionChange.d.ts.map +1 -0
- package/dist/features/data-view/useDataSheetExcelManager.d.ts +14 -0
- package/dist/features/data-view/useDataSheetExcelManager.d.ts.map +1 -0
- package/dist/features/data-view/useDataSheetExcelManager.js +31 -0
- package/dist/features/data-view/useDataSheetFilterManager.d.ts +13 -0
- package/dist/features/data-view/useDataSheetFilterManager.d.ts.map +1 -0
- package/dist/features/data-view/useDataSheetFilterManager.js +19 -0
- package/dist/features/data-view/useDataSheetInlineEditManager.d.ts +26 -0
- package/dist/features/data-view/useDataSheetInlineEditManager.d.ts.map +1 -0
- package/dist/features/data-view/useDataSheetInlineEditManager.js +54 -0
- package/dist/features/data-view/useDataSheetModalEditManager.d.ts +19 -0
- package/dist/features/data-view/useDataSheetModalEditManager.d.ts.map +1 -0
- package/dist/features/data-view/useDataSheetModalEditManager.js +44 -0
- package/dist/features/data-view/useDataSheetRefreshManager.d.ts +25 -0
- package/dist/features/data-view/useDataSheetRefreshManager.d.ts.map +1 -0
- package/dist/features/data-view/useDataSheetRefreshManager.js +50 -0
- package/dist/features/permission-table/sd-permission-table.control.d.ts +1 -1
- package/dist/features/permission-table/sd-permission-table.control.d.ts.map +1 -1
- package/dist/index.d.ts +12 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -5
- package/dist/ui/data/sheet/sd-sheet-config.modal.d.ts +1 -2
- package/dist/ui/data/sheet/sd-sheet-config.modal.d.ts.map +1 -1
- package/dist/ui/data/sheet/sd-sheet-config.modal.js +8 -11
- package/dist/ui/data/sheet/sd-sheet.control.d.ts +22 -30
- package/dist/ui/data/sheet/sd-sheet.control.d.ts.map +1 -1
- package/dist/ui/data/sheet/sd-sheet.control.js +52 -210
- package/dist/ui/data/sheet/useSheetCellStyling.d.ts +22 -0
- package/dist/ui/data/sheet/useSheetCellStyling.d.ts.map +1 -0
- package/dist/ui/data/sheet/useSheetCellStyling.js +95 -0
- package/dist/ui/data/sheet/useSheetColumnResizing.d.ts +17 -0
- package/dist/ui/data/sheet/useSheetColumnResizing.d.ts.map +1 -0
- package/dist/ui/data/sheet/useSheetColumnResizing.js +65 -0
- package/dist/ui/data/sheet/useSheetDisplayPipeline.d.ts +24 -0
- package/dist/ui/data/sheet/useSheetDisplayPipeline.d.ts.map +1 -0
- package/dist/ui/data/sheet/useSheetDisplayPipeline.js +52 -0
- package/dist/ui/form/button/sd-modal-select-button.control.d.ts +1 -7
- package/dist/ui/form/button/sd-modal-select-button.control.d.ts.map +1 -1
- package/dist/ui/form/button/sd-modal-select-button.control.js +1 -1
- package/dist/ui/form/choice/sd-state-preset.control.js +1 -1
- package/dist/ui/form/select/sd-select.control.d.ts +1 -1
- package/dist/ui/form/select/sd-select.control.d.ts.map +1 -1
- package/dist/ui/form/select/sd-select.control.js +23 -27
- package/dist/ui/layout/sd-gap.control.d.ts +1 -2
- package/dist/ui/layout/sd-gap.control.d.ts.map +1 -1
- package/dist/ui/layout/sd-gap.control.js +22 -24
- package/dist/ui/navigation/menu-utils.d.ts +2 -7
- package/dist/ui/navigation/menu-utils.d.ts.map +1 -1
- package/dist/ui/overlay/busy/sd-busy-container.control.d.ts +1 -1
- package/dist/ui/overlay/busy/sd-busy-container.control.d.ts.map +1 -1
- package/dist/ui/overlay/busy/sd-busy-container.control.js +1 -1
- package/dist/ui/overlay/modal/sd-confirm-modal.control.d.ts.map +1 -1
- package/dist/ui/overlay/modal/sd-confirm-modal.control.js +29 -23
- package/dist/ui/overlay/modal/sd-modal.control.js +1 -1
- package/dist/ui/overlay/modal/sd-modal.provider.d.ts +0 -10
- package/dist/ui/overlay/modal/sd-modal.provider.d.ts.map +1 -1
- package/dist/ui/overlay/modal/sd-modal.provider.js +1 -13
- package/dist/ui/overlay/modal/sd-prompt-modal.control.d.ts.map +1 -1
- package/dist/ui/overlay/modal/sd-prompt-modal.control.js +40 -33
- package/dist/ui/overlay/toast/sd-toast.control.d.ts +1 -1
- package/dist/ui/overlay/toast/sd-toast.control.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/core/provideSdAngular.ts +1 -1
- package/src/core/providers/sd-activated-modal.provider.ts +12 -0
- package/src/core/providers/sd-app-structure.provider.ts +2 -405
- package/src/core/providers/sd-app-structure.types.ts +60 -0
- package/src/core/providers/sd-app-structure.utils.ts +350 -0
- package/src/{ui/overlay/busy → core/providers}/sd-busy.provider.ts +1 -1
- package/src/core/providers/sd-print.provider.ts +1 -1
- package/src/core/providers/sd-service-client-factory.provider.ts +1 -1
- package/src/{ui/overlay/toast → core/providers}/sd-toast.provider.ts +4 -4
- package/src/core/types/select-modal-output-result.ts +7 -0
- package/src/core/utils/setups/setupCanDeactivate.ts +1 -1
- package/src/core/utils/useViewTitleSignal.ts +1 -1
- package/src/core/utils/useViewTypeSignal.ts +1 -1
- package/src/features/base/sd-base-container.control.ts +1 -1
- package/src/features/data-view/sd-data-detail.control.ts +1 -1
- package/src/features/data-view/sd-data-sheet.control.ts +117 -216
- package/src/features/data-view/sd-data-sheet.types.ts +18 -0
- package/src/{core/utils/setups → features/data-view}/setupCloserWhenSingleSelectionChange.ts +1 -1
- package/src/features/data-view/useDataSheetExcelManager.ts +57 -0
- package/src/features/data-view/useDataSheetFilterManager.ts +30 -0
- package/src/features/data-view/useDataSheetInlineEditManager.ts +89 -0
- package/src/features/data-view/useDataSheetModalEditManager.ts +76 -0
- package/src/features/data-view/useDataSheetRefreshManager.ts +90 -0
- package/src/features/permission-table/sd-permission-table.control.ts +1 -1
- package/src/index.ts +17 -11
- package/src/ui/data/sheet/sd-sheet-config.modal.ts +7 -11
- package/src/ui/data/sheet/sd-sheet.control.ts +50 -238
- package/src/ui/data/sheet/useSheetCellStyling.ts +113 -0
- package/src/ui/data/sheet/useSheetColumnResizing.ts +92 -0
- package/src/ui/data/sheet/useSheetDisplayPipeline.ts +64 -0
- package/src/ui/form/button/sd-modal-select-button.control.ts +1 -8
- package/src/ui/form/choice/sd-state-preset.control.ts +1 -1
- package/src/ui/form/select/sd-select.control.ts +21 -26
- package/src/ui/layout/sd-gap.control.ts +17 -21
- package/src/ui/navigation/menu-utils.ts +3 -7
- package/src/ui/overlay/busy/sd-busy-container.control.ts +1 -1
- package/src/ui/overlay/modal/sd-confirm-modal.control.ts +8 -26
- package/src/ui/overlay/modal/sd-modal.control.ts +1 -1
- package/src/ui/overlay/modal/sd-modal.provider.ts +1 -10
- package/src/ui/overlay/modal/sd-prompt-modal.control.ts +17 -43
- package/src/ui/overlay/toast/sd-toast.control.ts +1 -1
- package/dist/core/utils/setups/setupCloserWhenSingleSelectionChange.d.ts.map +0 -1
- package/dist/ui/overlay/busy/sd-busy.provider.d.ts.map +0 -1
- package/dist/ui/overlay/toast/sd-toast.provider.d.ts.map +0 -1
- /package/dist/{core/utils/setups → features/data-view}/setupCloserWhenSingleSelectionChange.js +0 -0
|
@@ -5,7 +5,7 @@ import { toSignal } from "@angular/core/rxjs-interop";
|
|
|
5
5
|
import { NavigationCancel, NavigationEnd, NavigationError, NavigationStart, Router, } from "@angular/router";
|
|
6
6
|
import { SwUpdate } from "@angular/service-worker";
|
|
7
7
|
import { provideNgIconsConfig } from "@ng-icons/core";
|
|
8
|
-
import { SdBusyProvider } from "
|
|
8
|
+
import { SdBusyProvider } from "./providers/sd-busy.provider";
|
|
9
9
|
import { SdAngularConfigProvider } from "./providers/sd-angular-config.provider";
|
|
10
10
|
import { SdThemeProvider } from "./providers/sd-theme-provider";
|
|
11
11
|
import { SdLocalStorageProvider } from "./providers/sd-local-storage.provider";
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ISdModal } from "../../ui/overlay/modal/sd-modal.provider";
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* 모달 내부에서 inject하여 사용하는 프로바이더
|
|
5
|
+
*/
|
|
6
|
+
export declare class SdActivatedModalProvider<T extends ISdModal<any> = ISdModal<any>> {
|
|
7
|
+
modalComponent: import("@angular/core").WritableSignal<any>;
|
|
8
|
+
contentComponent: import("@angular/core").WritableSignal<T | undefined>;
|
|
9
|
+
canDeactiveFn: () => boolean;
|
|
10
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SdActivatedModalProvider<any>, never>;
|
|
11
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<SdActivatedModalProvider<any>>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=sd-activated-modal.provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sd-activated-modal.provider.d.ts","sourceRoot":"","sources":["../../../src/core/providers/sd-activated-modal.provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;;AAEzE;;GAEG;AACH,qBACa,wBAAwB,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC;IAC3E,cAAc,8CAA0B;IACxC,gBAAgB,wDAAoC;IACpD,aAAa,EAAE,MAAM,OAAO,CAAc;yCAH/B,wBAAwB;6CAAxB,wBAAwB;CAIpC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Injectable, signal } from "@angular/core";
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* 모달 내부에서 inject하여 사용하는 프로바이더
|
|
5
|
+
*/
|
|
6
|
+
export class SdActivatedModalProvider {
|
|
7
|
+
modalComponent = signal(undefined, ...(ngDevMode ? [{ debugName: "modalComponent" }] : /* istanbul ignore next */ []));
|
|
8
|
+
contentComponent = signal(undefined, ...(ngDevMode ? [{ debugName: "contentComponent" }] : /* istanbul ignore next */ []));
|
|
9
|
+
canDeactiveFn = () => true;
|
|
10
|
+
static ɵfac = function SdActivatedModalProvider_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SdActivatedModalProvider)(); };
|
|
11
|
+
static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: SdActivatedModalProvider, factory: SdActivatedModalProvider.ɵfac });
|
|
12
|
+
}
|
|
13
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SdActivatedModalProvider, [{
|
|
14
|
+
type: Injectable
|
|
15
|
+
}], null, null); })();
|
|
@@ -1,79 +1,18 @@
|
|
|
1
1
|
import type { Signal } from "@angular/core";
|
|
2
|
+
import type { TSdAppStructureItem, ISdFlatMenu } from "./sd-app-structure.types";
|
|
2
3
|
import * as i0 from "@angular/core";
|
|
3
4
|
export declare function usePermsSignal<K extends string>(viewCodes: string[], keys: K[]): Signal<K[]>;
|
|
4
5
|
export declare abstract class SdAppStructureProvider<TModule = unknown> {
|
|
5
6
|
abstract items: TSdAppStructureItem<TModule>[];
|
|
6
7
|
abstract usableModules: Signal<TModule[] | undefined>;
|
|
7
8
|
abstract permRecord: Signal<Record<string, boolean> | undefined>;
|
|
8
|
-
usableMenus: Signal<ISdMenu
|
|
9
|
+
usableMenus: Signal<import("./sd-app-structure.types").ISdMenu[]>;
|
|
9
10
|
usableFlatMenus: Signal<ISdFlatMenu<TModule>[]>;
|
|
10
|
-
getPermissionsByStructure(items: TSdAppStructureItem<TModule>[], codeChain?: string[]): ISdPermission<TModule>[];
|
|
11
|
+
getPermissionsByStructure(items: TSdAppStructureItem<TModule>[], codeChain?: string[]): import("./sd-app-structure.types").ISdPermission<TModule>[];
|
|
11
12
|
getTitleByFullCode(fullCode: string): string;
|
|
12
13
|
getItemChainByFullCode(fullCode: string): TSdAppStructureItem<TModule>[];
|
|
13
14
|
getPermsByFullCode<K extends string>(fullCodes: string[], permKeys: K[]): K[];
|
|
14
15
|
static ɵfac: i0.ɵɵFactoryDeclaration<SdAppStructureProvider<any>, never>;
|
|
15
16
|
static ɵprov: i0.ɵɵInjectableDeclaration<SdAppStructureProvider<any>>;
|
|
16
17
|
}
|
|
17
|
-
export declare abstract class SdAppStructureUtils {
|
|
18
|
-
static getTitleByFullCode<TModule>(items: TSdAppStructureItem<TModule>[], fullCode: string): string;
|
|
19
|
-
static getPermsByFullCode<TModule, K extends string>(items: TSdAppStructureItem<TModule>[], fullCodes: string[], permKeys: K[], permRecord: Record<string, boolean> | undefined): K[];
|
|
20
|
-
static getItemChainByFullCode<TModule>(items: TSdAppStructureItem<TModule>[], fullCode: string): TSdAppStructureItem<TModule>[];
|
|
21
|
-
static getMenus<TModule>(items: TSdAppStructureItem<TModule>[], codeChain: string[], usableModules: TModule[] | undefined, permRecord: Record<string, boolean> | undefined): ISdMenu<TModule>[];
|
|
22
|
-
static getFlatMenus<TModule>(items: TSdAppStructureItem<TModule>[], usableModules: TModule[] | undefined, permRecord: Record<string, boolean> | undefined): ISdFlatMenu<TModule>[];
|
|
23
|
-
static getPermissions<TModule>(items: TSdAppStructureItem<TModule>[], codeChain: string[], usableModules: TModule[] | undefined): ISdPermission<TModule>[];
|
|
24
|
-
static getFlatPermissions<TModule>(items: TSdAppStructureItem<TModule>[], usableModules: TModule[] | undefined): ISdFlatPermission<TModule>[];
|
|
25
|
-
private static _isUsableModulesChain;
|
|
26
|
-
private static _isUsableModules;
|
|
27
|
-
}
|
|
28
|
-
export type TSdAppStructureItem<TModule = unknown> = ISdAppStructureGroupItem<TModule> | ISdAppStructureLeafItem<TModule>;
|
|
29
|
-
interface ISdAppStructureGroupItem<TModule> {
|
|
30
|
-
code: string;
|
|
31
|
-
title: string;
|
|
32
|
-
modules?: TModule[];
|
|
33
|
-
requiredModules?: TModule[];
|
|
34
|
-
icon?: string;
|
|
35
|
-
children: TSdAppStructureItem<TModule>[];
|
|
36
|
-
}
|
|
37
|
-
interface ISdAppStructureLeafItem<TModule> {
|
|
38
|
-
code: string;
|
|
39
|
-
title: string;
|
|
40
|
-
modules?: TModule[];
|
|
41
|
-
requiredModules?: TModule[];
|
|
42
|
-
perms?: ("use" | "edit")[];
|
|
43
|
-
subPerms?: ISdAppStructureSubPermission<TModule>[];
|
|
44
|
-
icon?: string;
|
|
45
|
-
isNotMenu?: boolean;
|
|
46
|
-
}
|
|
47
|
-
interface ISdAppStructureSubPermission<TModule> {
|
|
48
|
-
code: string;
|
|
49
|
-
title: string;
|
|
50
|
-
modules?: TModule[];
|
|
51
|
-
requiredModules?: TModule[];
|
|
52
|
-
perms: ("use" | "edit")[];
|
|
53
|
-
}
|
|
54
|
-
export interface ISdMenu<TModule = unknown> {
|
|
55
|
-
title: string;
|
|
56
|
-
codeChain: string[];
|
|
57
|
-
icon: string | undefined;
|
|
58
|
-
modules: TModule[] | undefined;
|
|
59
|
-
children: ISdMenu<TModule>[] | undefined;
|
|
60
|
-
}
|
|
61
|
-
export interface ISdFlatMenu<TModule = unknown> {
|
|
62
|
-
titleChain: string[];
|
|
63
|
-
codeChain: string[];
|
|
64
|
-
modulesChain: TModule[][];
|
|
65
|
-
}
|
|
66
|
-
export interface ISdPermission<TModule = unknown> {
|
|
67
|
-
title: string;
|
|
68
|
-
codeChain: string[];
|
|
69
|
-
modules: TModule[] | undefined;
|
|
70
|
-
perms: ("use" | "edit")[] | undefined;
|
|
71
|
-
children: ISdPermission<TModule>[] | undefined;
|
|
72
|
-
}
|
|
73
|
-
export interface ISdFlatPermission<TModule = unknown> {
|
|
74
|
-
titleChain: string[];
|
|
75
|
-
codeChain: string[];
|
|
76
|
-
modulesChain: TModule[][];
|
|
77
|
-
}
|
|
78
|
-
export {};
|
|
79
18
|
//# sourceMappingURL=sd-app-structure.provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-app-structure.provider.d.ts","sourceRoot":"","sources":["../../../src/core/providers/sd-app-structure.provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;;
|
|
1
|
+
{"version":3,"file":"sd-app-structure.provider.d.ts","sourceRoot":"","sources":["../../../src/core/providers/sd-app-structure.provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;;AAGjF,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAG5F;AAID,8BACsB,sBAAsB,CAAC,OAAO,GAAG,OAAO;IAC5D,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;IAC/C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,CAAC;IACtD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;IAEjE,WAAW,uDAET;IACF,eAAe,iCAEb;IAEF,yBAAyB,CAAC,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,GAAE,MAAM,EAAO;IAIzF,kBAAkB,CAAC,QAAQ,EAAE,MAAM;IAInC,sBAAsB,CAAC,QAAQ,EAAE,MAAM;IAIvC,kBAAkB,CAAC,CAAC,SAAS,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;yCAxBzD,sBAAsB;6CAAtB,sBAAsB;CAgC3C"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { computed, inject, Injectable } from "@angular/core";
|
|
2
|
+
import { SdAppStructureUtils } from "./sd-app-structure.utils";
|
|
2
3
|
import * as i0 from "@angular/core";
|
|
3
4
|
export function usePermsSignal(viewCodes, keys) {
|
|
4
5
|
const sdAppStructure = inject(SdAppStructureProvider);
|
|
@@ -28,255 +29,3 @@ export class SdAppStructureProvider {
|
|
|
28
29
|
type: Injectable,
|
|
29
30
|
args: [{ providedIn: "root" }]
|
|
30
31
|
}], null, null); })();
|
|
31
|
-
export class SdAppStructureUtils {
|
|
32
|
-
//---------- Info
|
|
33
|
-
static getTitleByFullCode(items, fullCode) {
|
|
34
|
-
const itemChain = this.getItemChainByFullCode(items, fullCode);
|
|
35
|
-
if (itemChain.length === 0) {
|
|
36
|
-
throw new Error(`Item not found for fullCode: ${fullCode}`);
|
|
37
|
-
}
|
|
38
|
-
const parent = itemChain
|
|
39
|
-
.slice(0, -1)
|
|
40
|
-
.map((item) => item.title)
|
|
41
|
-
.join(" > ");
|
|
42
|
-
const current = itemChain.last().title;
|
|
43
|
-
return (parent ? `[${parent}] ` : "") + current;
|
|
44
|
-
}
|
|
45
|
-
static getPermsByFullCode(items, fullCodes, permKeys, permRecord) {
|
|
46
|
-
if (permRecord === undefined)
|
|
47
|
-
return [];
|
|
48
|
-
const result = [];
|
|
49
|
-
for (const permKey of permKeys) {
|
|
50
|
-
// 해당 권한이 설정되어있거나
|
|
51
|
-
if (fullCodes.some((fullCode) => permRecord[fullCode + "." + permKey])) {
|
|
52
|
-
result.push(permKey);
|
|
53
|
-
}
|
|
54
|
-
// 권한이라는것이 아얘 존재하지 않거나
|
|
55
|
-
else if (fullCodes.every((fullCode) => {
|
|
56
|
-
const item = this.getItemChainByFullCode(items, fullCode).last();
|
|
57
|
-
return item != null && !("perms" in item);
|
|
58
|
-
})) {
|
|
59
|
-
result.push(permKey);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return result;
|
|
63
|
-
}
|
|
64
|
-
static getItemChainByFullCode(items, fullCode) {
|
|
65
|
-
const codeChain = fullCode.split(".");
|
|
66
|
-
const result = [];
|
|
67
|
-
let cursorChildren = items;
|
|
68
|
-
for (const currCode of codeChain) {
|
|
69
|
-
const cursor = cursorChildren.single((item) => item.code === currCode);
|
|
70
|
-
if (cursor == null)
|
|
71
|
-
return [];
|
|
72
|
-
cursorChildren = "children" in cursor ? cursor.children : [];
|
|
73
|
-
result.push(cursor);
|
|
74
|
-
}
|
|
75
|
-
return result;
|
|
76
|
-
}
|
|
77
|
-
//---------- Menus
|
|
78
|
-
static getMenus(items, codeChain, usableModules, permRecord) {
|
|
79
|
-
const resultMenus = [];
|
|
80
|
-
for (const item of items) {
|
|
81
|
-
if ("isNotMenu" in item && item.isNotMenu)
|
|
82
|
-
continue;
|
|
83
|
-
const currCodeChain = [...codeChain, item.code];
|
|
84
|
-
// 모듈 활성화 여부 확인
|
|
85
|
-
if (!this._isUsableModules(item.modules, item.requiredModules, usableModules))
|
|
86
|
-
continue;
|
|
87
|
-
// 그룹 메뉴
|
|
88
|
-
if ("children" in item) {
|
|
89
|
-
const children = this.getMenus(item.children, currCodeChain, usableModules, permRecord);
|
|
90
|
-
// 자식 중 표시 가능한 게 있으면 그룹 메뉴 포함
|
|
91
|
-
if (children.length > 0) {
|
|
92
|
-
resultMenus.push({
|
|
93
|
-
title: item.title,
|
|
94
|
-
icon: item.icon,
|
|
95
|
-
codeChain: currCodeChain,
|
|
96
|
-
modules: item.modules,
|
|
97
|
-
children,
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
// Leaf 메뉴
|
|
102
|
-
else {
|
|
103
|
-
const code = currCodeChain.join(".");
|
|
104
|
-
if (item.perms != null && !permRecord?.[code + ".use"])
|
|
105
|
-
continue;
|
|
106
|
-
resultMenus.push({
|
|
107
|
-
title: item.title,
|
|
108
|
-
icon: item.icon,
|
|
109
|
-
codeChain: currCodeChain,
|
|
110
|
-
modules: item.modules,
|
|
111
|
-
children: undefined,
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
return resultMenus;
|
|
116
|
-
}
|
|
117
|
-
static getFlatMenus(items, usableModules, permRecord) {
|
|
118
|
-
const resultFlatMenus = [];
|
|
119
|
-
const queue = items.map((item) => ({
|
|
120
|
-
item,
|
|
121
|
-
titleChain: [],
|
|
122
|
-
codeChain: [],
|
|
123
|
-
modulesChain: [],
|
|
124
|
-
requiredModulesChain: [],
|
|
125
|
-
}));
|
|
126
|
-
while (queue.length > 0) {
|
|
127
|
-
const { item, titleChain, codeChain, modulesChain, requiredModulesChain } = queue.shift();
|
|
128
|
-
if ("isNotMenu" in item && item.isNotMenu)
|
|
129
|
-
continue;
|
|
130
|
-
const currTitleChain = [...titleChain, item.title];
|
|
131
|
-
const currCodeChain = [...codeChain, item.code];
|
|
132
|
-
const currModulesChain = item.modules ? [...modulesChain, item.modules] : modulesChain;
|
|
133
|
-
const currRequiredModulesChain = item.requiredModules
|
|
134
|
-
? [...requiredModulesChain, item.requiredModules]
|
|
135
|
-
: requiredModulesChain;
|
|
136
|
-
if (!this._isUsableModulesChain(currModulesChain, currRequiredModulesChain, usableModules))
|
|
137
|
-
continue;
|
|
138
|
-
if ("children" in item) {
|
|
139
|
-
for (const child of item.children) {
|
|
140
|
-
queue.push({
|
|
141
|
-
item: child,
|
|
142
|
-
titleChain: currTitleChain,
|
|
143
|
-
codeChain: currCodeChain,
|
|
144
|
-
modulesChain: currModulesChain,
|
|
145
|
-
requiredModulesChain: currRequiredModulesChain,
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
else if (item.perms == null || Boolean(permRecord?.[currCodeChain.join(".") + ".use"])) {
|
|
150
|
-
resultFlatMenus.push({
|
|
151
|
-
titleChain: currTitleChain,
|
|
152
|
-
codeChain: currCodeChain,
|
|
153
|
-
modulesChain: currModulesChain,
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
return resultFlatMenus;
|
|
158
|
-
}
|
|
159
|
-
//---------- Perms
|
|
160
|
-
static getPermissions(items, codeChain, usableModules) {
|
|
161
|
-
const results = [];
|
|
162
|
-
for (const item of items) {
|
|
163
|
-
const currCodeChain = [...codeChain, item.code];
|
|
164
|
-
// 모듈 활성화 여부 확인
|
|
165
|
-
if (!this._isUsableModules(item.modules, item.requiredModules, usableModules))
|
|
166
|
-
continue;
|
|
167
|
-
// 그룹
|
|
168
|
-
if ("children" in item) {
|
|
169
|
-
const children = this.getPermissions(item.children, currCodeChain, usableModules);
|
|
170
|
-
results.push({
|
|
171
|
-
title: item.title,
|
|
172
|
-
codeChain: currCodeChain,
|
|
173
|
-
modules: item.modules,
|
|
174
|
-
perms: undefined,
|
|
175
|
-
children: children,
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
// Leaf
|
|
179
|
-
else {
|
|
180
|
-
results.push({
|
|
181
|
-
title: item.title,
|
|
182
|
-
codeChain: currCodeChain,
|
|
183
|
-
perms: item.perms,
|
|
184
|
-
modules: item.modules,
|
|
185
|
-
children: item.subPerms?.map((subPerm) => ({
|
|
186
|
-
title: subPerm.title,
|
|
187
|
-
codeChain: [...currCodeChain, subPerm.code],
|
|
188
|
-
perms: subPerm.perms,
|
|
189
|
-
modules: subPerm.modules,
|
|
190
|
-
children: undefined,
|
|
191
|
-
})),
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
return results;
|
|
196
|
-
}
|
|
197
|
-
static getFlatPermissions(items, usableModules) {
|
|
198
|
-
const results = [];
|
|
199
|
-
const queue = items.map((item) => ({
|
|
200
|
-
item,
|
|
201
|
-
titleChain: [],
|
|
202
|
-
codeChain: [],
|
|
203
|
-
modulesChain: [],
|
|
204
|
-
requiredModulesChain: [],
|
|
205
|
-
}));
|
|
206
|
-
while (queue.length > 0) {
|
|
207
|
-
const { item, titleChain, codeChain, modulesChain, requiredModulesChain } = queue.shift();
|
|
208
|
-
const currTitleChain = [...titleChain, item.title];
|
|
209
|
-
const currCodeChain = [...codeChain, item.code];
|
|
210
|
-
const currModulesChain = item.modules ? [...modulesChain, item.modules] : modulesChain;
|
|
211
|
-
const currRequiredModulesChain = item.requiredModules
|
|
212
|
-
? [...requiredModulesChain, item.requiredModules]
|
|
213
|
-
: requiredModulesChain;
|
|
214
|
-
if (!this._isUsableModulesChain(currModulesChain, currRequiredModulesChain, usableModules))
|
|
215
|
-
continue;
|
|
216
|
-
// 1. 자식 enqueue
|
|
217
|
-
if ("children" in item) {
|
|
218
|
-
for (const child of item.children) {
|
|
219
|
-
queue.push({
|
|
220
|
-
item: child,
|
|
221
|
-
titleChain: currTitleChain,
|
|
222
|
-
codeChain: currCodeChain,
|
|
223
|
-
modulesChain: currModulesChain,
|
|
224
|
-
requiredModulesChain: currRequiredModulesChain,
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
// 1. 직접 perms 처리
|
|
229
|
-
if ("perms" in item) {
|
|
230
|
-
for (const perm of item.perms ?? []) {
|
|
231
|
-
results.push({
|
|
232
|
-
titleChain: currTitleChain,
|
|
233
|
-
codeChain: [...currCodeChain, perm],
|
|
234
|
-
modulesChain: currModulesChain,
|
|
235
|
-
});
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
// 2. subPerms 처리
|
|
239
|
-
if ("subPerms" in item) {
|
|
240
|
-
for (const subPerm of item.subPerms ?? []) {
|
|
241
|
-
// subPerm도 모듈 체크
|
|
242
|
-
if (!this._isUsableModules(subPerm.modules, subPerm.requiredModules, usableModules))
|
|
243
|
-
continue;
|
|
244
|
-
for (const perm of subPerm.perms) {
|
|
245
|
-
results.push({
|
|
246
|
-
titleChain: currTitleChain,
|
|
247
|
-
codeChain: [...currCodeChain, subPerm.code, perm],
|
|
248
|
-
modulesChain: [...currModulesChain, subPerm.modules ?? []],
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
return results;
|
|
255
|
-
}
|
|
256
|
-
//-- Modules (private)
|
|
257
|
-
static _isUsableModulesChain(modulesChain, requiredModulesChain, usableModules) {
|
|
258
|
-
// 각 레벨의 modules (OR) 체크
|
|
259
|
-
for (const modules of modulesChain) {
|
|
260
|
-
if (!this._isUsableModules(modules, undefined, usableModules)) {
|
|
261
|
-
return false;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
// 각 레벨의 requiredModules (AND) 체크
|
|
265
|
-
for (const requiredModules of requiredModulesChain) {
|
|
266
|
-
if (!this._isUsableModules(undefined, requiredModules, usableModules)) {
|
|
267
|
-
return false;
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
return true;
|
|
271
|
-
}
|
|
272
|
-
static _isUsableModules(modules, requiredModules, usableModules) {
|
|
273
|
-
// 1. requiredModules: 모두 있어야 함 (AND)
|
|
274
|
-
if (requiredModules && requiredModules.length > 0) {
|
|
275
|
-
if (!requiredModules.every((m) => usableModules?.includes(m))) {
|
|
276
|
-
return false;
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
// 2. modules: 하나라도 있으면 됨 (OR)
|
|
280
|
-
return (modules == null || modules.length === 0 || modules.some((m) => usableModules?.includes(m)));
|
|
281
|
-
}
|
|
282
|
-
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export type TSdAppStructureItem<TModule = unknown> = ISdAppStructureGroupItem<TModule> | ISdAppStructureLeafItem<TModule>;
|
|
2
|
+
export interface ISdAppStructureGroupItem<TModule> {
|
|
3
|
+
code: string;
|
|
4
|
+
title: string;
|
|
5
|
+
modules?: TModule[];
|
|
6
|
+
requiredModules?: TModule[];
|
|
7
|
+
icon?: string;
|
|
8
|
+
children: TSdAppStructureItem<TModule>[];
|
|
9
|
+
}
|
|
10
|
+
export interface ISdAppStructureLeafItem<TModule> {
|
|
11
|
+
code: string;
|
|
12
|
+
title: string;
|
|
13
|
+
modules?: TModule[];
|
|
14
|
+
requiredModules?: TModule[];
|
|
15
|
+
perms?: ("use" | "edit")[];
|
|
16
|
+
subPerms?: ISdAppStructureSubPermission<TModule>[];
|
|
17
|
+
icon?: string;
|
|
18
|
+
url?: string;
|
|
19
|
+
isNotMenu?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface ISdAppStructureSubPermission<TModule> {
|
|
22
|
+
code: string;
|
|
23
|
+
title: string;
|
|
24
|
+
modules?: TModule[];
|
|
25
|
+
requiredModules?: TModule[];
|
|
26
|
+
perms: ("use" | "edit")[];
|
|
27
|
+
}
|
|
28
|
+
export interface ISdMenu {
|
|
29
|
+
title: string;
|
|
30
|
+
codeChain: string[];
|
|
31
|
+
url?: string;
|
|
32
|
+
icon?: string;
|
|
33
|
+
children?: ISdMenu[];
|
|
34
|
+
}
|
|
35
|
+
export interface ISdFlatMenu<TModule = unknown> {
|
|
36
|
+
titleChain: string[];
|
|
37
|
+
codeChain: string[];
|
|
38
|
+
modulesChain: TModule[][];
|
|
39
|
+
}
|
|
40
|
+
export interface ISdPermission<TModule = unknown> {
|
|
41
|
+
title: string;
|
|
42
|
+
codeChain: string[];
|
|
43
|
+
modules: TModule[] | undefined;
|
|
44
|
+
perms: ("use" | "edit")[] | undefined;
|
|
45
|
+
children: ISdPermission<TModule>[] | undefined;
|
|
46
|
+
}
|
|
47
|
+
export interface ISdFlatPermission<TModule = unknown> {
|
|
48
|
+
titleChain: string[];
|
|
49
|
+
codeChain: string[];
|
|
50
|
+
modulesChain: TModule[][];
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=sd-app-structure.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sd-app-structure.types.d.ts","sourceRoot":"","sources":["../../../src/core/providers/sd-app-structure.types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,CAAC,OAAO,GAAG,OAAO,IAC7C,wBAAwB,CAAC,OAAO,CAAC,GACjC,uBAAuB,CAAC,OAAO,CAAC,CAAC;AAErC,MAAM,WAAW,wBAAwB,CAAC,OAAO;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,uBAAuB,CAAC,OAAO;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,4BAA4B,CAAC,OAAO,CAAC,EAAE,CAAC;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,4BAA4B,CAAC,OAAO;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC;IAC5B,KAAK,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,WAAW,CAAC,OAAO,GAAG,OAAO;IAC5C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,OAAO,EAAE,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa,CAAC,OAAO,GAAG,OAAO;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;IAC/B,KAAK,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC;IACtC,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC;CAChD;AAED,MAAM,WAAW,iBAAiB,CAAC,OAAO,GAAG,OAAO;IAClD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,OAAO,EAAE,EAAE,CAAC;CAC3B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { TSdAppStructureItem, ISdMenu, ISdFlatMenu, ISdPermission, ISdFlatPermission } from "./sd-app-structure.types";
|
|
2
|
+
export declare abstract class SdAppStructureUtils {
|
|
3
|
+
static getTitleByFullCode<TModule>(items: TSdAppStructureItem<TModule>[], fullCode: string): string;
|
|
4
|
+
static getPermsByFullCode<TModule, K extends string>(items: TSdAppStructureItem<TModule>[], fullCodes: string[], permKeys: K[], permRecord: Record<string, boolean> | undefined): K[];
|
|
5
|
+
static getItemChainByFullCode<TModule>(items: TSdAppStructureItem<TModule>[], fullCode: string): TSdAppStructureItem<TModule>[];
|
|
6
|
+
static getMenus<TModule>(items: TSdAppStructureItem<TModule>[], codeChain: string[], usableModules: TModule[] | undefined, permRecord: Record<string, boolean> | undefined): ISdMenu[];
|
|
7
|
+
static getFlatMenus<TModule>(items: TSdAppStructureItem<TModule>[], usableModules: TModule[] | undefined, permRecord: Record<string, boolean> | undefined): ISdFlatMenu<TModule>[];
|
|
8
|
+
static getPermissions<TModule>(items: TSdAppStructureItem<TModule>[], codeChain: string[], usableModules: TModule[] | undefined): ISdPermission<TModule>[];
|
|
9
|
+
static getFlatPermissions<TModule>(items: TSdAppStructureItem<TModule>[], usableModules: TModule[] | undefined): ISdFlatPermission<TModule>[];
|
|
10
|
+
private static _isUsableModulesChain;
|
|
11
|
+
private static _isUsableModules;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=sd-app-structure.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sd-app-structure.utils.d.ts","sourceRoot":"","sources":["../../../src/core/providers/sd-app-structure.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,OAAO,EACP,WAAW,EACX,aAAa,EACb,iBAAiB,EAClB,MAAM,0BAA0B,CAAC;AAElC,8BAAsB,mBAAmB;IAGvC,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM;IAa1F,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC,SAAS,MAAM,EACjD,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,EACrC,SAAS,EAAE,MAAM,EAAE,EACnB,QAAQ,EAAE,CAAC,EAAE,EACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC9C,CAAC,EAAE;IAuBN,MAAM,CAAC,sBAAsB,CAAC,OAAO,EACnC,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,EACrC,QAAQ,EAAE,MAAM,GACf,mBAAmB,CAAC,OAAO,CAAC,EAAE;IAkBjC,MAAM,CAAC,QAAQ,CAAC,OAAO,EACrB,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,EACrC,SAAS,EAAE,MAAM,EAAE,EACnB,aAAa,EAAE,OAAO,EAAE,GAAG,SAAS,EACpC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC9C,OAAO,EAAE;IA2CZ,MAAM,CAAC,YAAY,CAAC,OAAO,EACzB,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,EACrC,aAAa,EAAE,OAAO,EAAE,GAAG,SAAS,EACpC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC9C,WAAW,CAAC,OAAO,CAAC,EAAE;IA0DzB,MAAM,CAAC,cAAc,CAAC,OAAO,EAC3B,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,EACrC,SAAS,EAAE,MAAM,EAAE,EACnB,aAAa,EAAE,OAAO,EAAE,GAAG,SAAS,GACnC,aAAa,CAAC,OAAO,CAAC,EAAE;IAyC3B,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAC/B,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,EACrC,aAAa,EAAE,OAAO,EAAE,GAAG,SAAS;IAgFtC,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAsBpC,OAAO,CAAC,MAAM,CAAC,gBAAgB;CAiBhC"}
|