@acorex-platform/module-settings-management-client 0.0.21
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/fesm2022/acorex-platform-module-settings-management-client-contracts.mjs +146 -0
- package/fesm2022/acorex-platform-module-settings-management-client-contracts.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-settings-management-client-setting-page.component-eAaMh3-8.mjs +441 -0
- package/fesm2022/acorex-platform-module-settings-management-client-setting-page.component-eAaMh3-8.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-settings-management-client-setting-view.component-CSJ-1pfO.mjs +306 -0
- package/fesm2022/acorex-platform-module-settings-management-client-setting-view.component-CSJ-1pfO.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-settings-management-client.mjs +1028 -0
- package/fesm2022/acorex-platform-module-settings-management-client.mjs.map +1 -0
- package/package.json +28 -0
- package/types/acorex-platform-module-settings-management-client-contracts.d.ts +166 -0
- package/types/acorex-platform-module-settings-management-client.d.ts +72 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
//#region ---- Command Keys ----
|
|
2
|
+
const AXMSettingsManagementCommandKeys = {
|
|
3
|
+
Client: {
|
|
4
|
+
Reset: 'SettingsManagement.Client:Reset',
|
|
5
|
+
Export: 'SettingsManagement.Client:Export',
|
|
6
|
+
Import: 'SettingsManagement.Client:Import',
|
|
7
|
+
},
|
|
8
|
+
ScopedSettings: {
|
|
9
|
+
Patch: 'SettingsManagement:ScopedSettings:Patch',
|
|
10
|
+
Set: 'SettingsManagement:ScopedSettings:Set',
|
|
11
|
+
SetOne: 'SettingsManagement:ScopedSettings:SetOne',
|
|
12
|
+
Delete: 'SettingsManagement:ScopedSettings:Delete',
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
//#endregion
|
|
16
|
+
|
|
17
|
+
//#region ---- Query Keys ----
|
|
18
|
+
const AXMSettingsManagementQueryKeys = {
|
|
19
|
+
ScopedSettings: {
|
|
20
|
+
Fetch: 'SettingsManagement:ScopedSettings:Fetch',
|
|
21
|
+
Load: 'SettingsManagement:ScopedSettings:Load',
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
//#endregion
|
|
25
|
+
|
|
26
|
+
//#region ---- Settings sync keys provider value ----
|
|
27
|
+
const axmSettingsSyncKeys = {
|
|
28
|
+
scopedFetchQueryKey: AXMSettingsManagementQueryKeys.ScopedSettings.Fetch,
|
|
29
|
+
scopedPatchCommandKey: AXMSettingsManagementCommandKeys.ScopedSettings.Patch,
|
|
30
|
+
};
|
|
31
|
+
//#endregion
|
|
32
|
+
|
|
33
|
+
//#region ---- Settings defaults multi-provider ----
|
|
34
|
+
const SETTINGS_DEFAULTS_PROVIDER = Symbol('SETTINGS_DEFAULTS_PROVIDER');
|
|
35
|
+
/** Suggested priority bands per layer. */
|
|
36
|
+
const SETTINGS_DEFAULTS_PRIORITY = {
|
|
37
|
+
framework: 0,
|
|
38
|
+
module: 50,
|
|
39
|
+
app: 100,
|
|
40
|
+
};
|
|
41
|
+
/** Builds a {@link SettingsDefaultsProvider} from a static key-value map. */
|
|
42
|
+
function createStaticSettingsDefaultsProvider(options) {
|
|
43
|
+
return {
|
|
44
|
+
scope: options.scope,
|
|
45
|
+
priority: options.priority,
|
|
46
|
+
layer: options.layer,
|
|
47
|
+
provide: async () => ({ ...options.values }),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/** Nest provider registration helper (`multi: true`). */
|
|
51
|
+
function provideSettingsDefaults(provider) {
|
|
52
|
+
return {
|
|
53
|
+
provide: SETTINGS_DEFAULTS_PROVIDER,
|
|
54
|
+
useValue: provider,
|
|
55
|
+
multi: true,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//#endregion
|
|
59
|
+
|
|
60
|
+
//#region ---- Encrypted setting keys (server at-rest) ----
|
|
61
|
+
/**
|
|
62
|
+
* Registers setting keys that must be stored encrypted in the server settings DB.
|
|
63
|
+
* Client definitions use `isEncrypted: true` for the same keys (implies `cacheable: false`).
|
|
64
|
+
*/
|
|
65
|
+
const SETTINGS_ENCRYPTED_KEYS_PROVIDER = Symbol('SETTINGS_ENCRYPTED_KEYS_PROVIDER');
|
|
66
|
+
/** Nest provider registration helper (`multi: true`). */
|
|
67
|
+
function provideEncryptedSettingKeys(keys) {
|
|
68
|
+
return {
|
|
69
|
+
provide: SETTINGS_ENCRYPTED_KEYS_PROVIDER,
|
|
70
|
+
useValue: keys,
|
|
71
|
+
multi: true,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//#endregion
|
|
75
|
+
|
|
76
|
+
//#region ---- Settings entity sync multi-provider ----
|
|
77
|
+
const SETTINGS_ENTITY_SYNC_HANDLER = Symbol('SETTINGS_ENTITY_SYNC_HANDLER');
|
|
78
|
+
//#endregion
|
|
79
|
+
|
|
80
|
+
//#region ---- Settings change reactor multi-provider ----
|
|
81
|
+
const SETTINGS_CHANGE_REACTOR = Symbol('SETTINGS_CHANGE_REACTOR');
|
|
82
|
+
//#endregion
|
|
83
|
+
|
|
84
|
+
const AXPSettingsManagementMenuKeys = {
|
|
85
|
+
TenantApplicationSettings: 'Settings:Tenant:Application',
|
|
86
|
+
PlatformSettings: 'Settings:Platform',
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Applications & Platform capabilities used by this module.
|
|
91
|
+
* Domain capability keys for this module. Root groups live in `AXPCommonPermissionGroupKeys` (common contracts).
|
|
92
|
+
*
|
|
93
|
+
* Own user settings (scope U) require no permission — always available to the signed-in user.
|
|
94
|
+
*/
|
|
95
|
+
const AXPApplicationsPlatformPermissionKeys = {
|
|
96
|
+
Access: 'ApplicationsPlatform:Permission:Access',
|
|
97
|
+
MaintainApplications: 'ApplicationsPlatform:Permission:MaintainApplications',
|
|
98
|
+
MaintainTenants: 'ApplicationsPlatform:Permission:MaintainTenants',
|
|
99
|
+
MaintainPlatformShell: 'ApplicationsPlatform:Permission:MaintainPlatformShell',
|
|
100
|
+
MaintainLandingPages: 'ApplicationsPlatform:Permission:MaintainLandingPages',
|
|
101
|
+
MaintainIdentifiers: 'ApplicationsPlatform:Permission:MaintainIdentifiers',
|
|
102
|
+
MaintainTenantSettings: 'ApplicationsPlatform:Permission:MaintainTenantSettings',
|
|
103
|
+
MaintainPlatformSettings: 'ApplicationsPlatform:Permission:MaintainPlatformSettings',
|
|
104
|
+
MaintainLocales: 'ApplicationsPlatform:Permission:MaintainLocales',
|
|
105
|
+
UseDevTools: 'ApplicationsPlatform:Permission:UseDevTools',
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* @deprecated Prefer {@link AXPApplicationsPlatformPermissionKeys}.
|
|
109
|
+
* Legacy nested shape kept so existing imports compile during migration.
|
|
110
|
+
* User settings are intentionally omitted — no capability key; always allowed for self.
|
|
111
|
+
*/
|
|
112
|
+
const AXMSettingsManagementPermissionKeys = {
|
|
113
|
+
TenantSettings: {
|
|
114
|
+
Management: AXPApplicationsPlatformPermissionKeys.MaintainTenantSettings,
|
|
115
|
+
},
|
|
116
|
+
PlatformSettings: {
|
|
117
|
+
Management: AXPApplicationsPlatformPermissionKeys.MaintainPlatformSettings,
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
//#region ---- Module Configuration ----
|
|
122
|
+
const config = {
|
|
123
|
+
i18n: 'settings-management',
|
|
124
|
+
module: 'SettingsManagement',
|
|
125
|
+
};
|
|
126
|
+
const RootConfig = {
|
|
127
|
+
config,
|
|
128
|
+
module: {
|
|
129
|
+
route: 'settings',
|
|
130
|
+
name: config.module,
|
|
131
|
+
title: '@settings-management:module.title',
|
|
132
|
+
icon: 'fa-light fa-gear',
|
|
133
|
+
},
|
|
134
|
+
entities: {},
|
|
135
|
+
};
|
|
136
|
+
//#endregion
|
|
137
|
+
|
|
138
|
+
//#region ---- Contracts barrel ----
|
|
139
|
+
//#endregion
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Generated bundle index. Do not edit.
|
|
143
|
+
*/
|
|
144
|
+
|
|
145
|
+
export { AXMSettingsManagementCommandKeys, AXMSettingsManagementPermissionKeys, AXMSettingsManagementQueryKeys, AXPApplicationsPlatformPermissionKeys, AXPSettingsManagementMenuKeys, RootConfig, SETTINGS_CHANGE_REACTOR, SETTINGS_DEFAULTS_PRIORITY, SETTINGS_DEFAULTS_PROVIDER, SETTINGS_ENCRYPTED_KEYS_PROVIDER, SETTINGS_ENTITY_SYNC_HANDLER, axmSettingsSyncKeys, createStaticSettingsDefaultsProvider, provideEncryptedSettingKeys, provideSettingsDefaults };
|
|
146
|
+
//# sourceMappingURL=acorex-platform-module-settings-management-client-contracts.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-settings-management-client-contracts.mjs","sources":["../../../../libs/modules/settings-management/contracts/src/commands.keys.ts","../../../../libs/modules/settings-management/contracts/src/queries.keys.ts","../../../../libs/modules/settings-management/contracts/src/settings-sync-keys.ts","../../../../libs/modules/settings-management/contracts/src/settings-defaults.provider.ts","../../../../libs/modules/settings-management/contracts/src/settings-encrypted-keys.provider.ts","../../../../libs/modules/settings-management/contracts/src/settings-entity-sync.provider.ts","../../../../libs/modules/settings-management/contracts/src/settings-change-reactor.provider.ts","../../../../libs/modules/settings-management/contracts/src/menu.keys.ts","../../../../libs/modules/settings-management/contracts/src/permission.keys.ts","../../../../libs/modules/settings-management/contracts/src/root-config.ts","../../../../libs/modules/settings-management/contracts/src/index.ts","../../../../libs/modules/settings-management/contracts/src/acorex-platform-module-settings-management-client-contracts.ts"],"sourcesContent":["//#region ---- Command Keys ----\n\nexport const AXMSettingsManagementCommandKeys = {\n Client: {\n Reset: 'SettingsManagement.Client:Reset',\n Export: 'SettingsManagement.Client:Export',\n Import: 'SettingsManagement.Client:Import',\n },\n ScopedSettings: {\n Patch: 'SettingsManagement:ScopedSettings:Patch',\n Set: 'SettingsManagement:ScopedSettings:Set',\n SetOne: 'SettingsManagement:ScopedSettings:SetOne',\n Delete: 'SettingsManagement:ScopedSettings:Delete',\n },\n} as const;\n\n//#endregion\n","//#region ---- Query Keys ----\n\nexport const AXMSettingsManagementQueryKeys = {\n ScopedSettings: {\n Fetch: 'SettingsManagement:ScopedSettings:Fetch',\n Load: 'SettingsManagement:ScopedSettings:Load',\n },\n} as const;\n\n//#endregion\n","import type { AXPSettingsSyncKeys } from '@acorex-platform/framework-shared/core';\n\nimport { AXMSettingsManagementCommandKeys } from './commands.keys';\nimport { AXMSettingsManagementQueryKeys } from './queries.keys';\n\n//#region ---- Settings sync keys provider value ----\n\nexport const axmSettingsSyncKeys: AXPSettingsSyncKeys = {\n scopedFetchQueryKey: AXMSettingsManagementQueryKeys.ScopedSettings.Fetch,\n scopedPatchCommandKey: AXMSettingsManagementCommandKeys.ScopedSettings.Patch,\n};\n\n//#endregion\n","//#region ---- Settings defaults multi-provider ----\n\n/** Platform scope key aligned with server {@link SettingsPlatformScope}. */\nexport type SettingsDefaultsScope = 'P' | 'T' | 'U';\n\n/**\n * Contributes default setting values for a single scope partition.\n * Register with {@link provideSettingsDefaults} (Nest `multi: true`).\n * Higher {@link SettingsDefaultsProvider.priority} wins on key conflicts within the same scope.\n */\nexport interface SettingsDefaultsProvider {\n scope: SettingsDefaultsScope;\n /** Merge order within the same scope; higher overrides lower. Default 0. */\n priority?: number;\n /** Source label for diagnostics (e.g. `framework`, `locale-management`, `demo-api`). */\n layer?: string;\n provide(): Promise<Record<string, unknown>>;\n}\n\nexport const SETTINGS_DEFAULTS_PROVIDER = Symbol('SETTINGS_DEFAULTS_PROVIDER');\n\n/** Suggested priority bands per layer. */\nexport const SETTINGS_DEFAULTS_PRIORITY = {\n framework: 0,\n module: 50,\n app: 100,\n} as const;\n\nexport interface StaticSettingsDefaultsProviderOptions {\n scope: SettingsDefaultsScope;\n values: Record<string, unknown>;\n priority?: number;\n layer?: string;\n}\n\n/** Builds a {@link SettingsDefaultsProvider} from a static key-value map. */\nexport function createStaticSettingsDefaultsProvider(\n options: StaticSettingsDefaultsProviderOptions,\n): SettingsDefaultsProvider {\n return {\n scope: options.scope,\n priority: options.priority,\n layer: options.layer,\n provide: async () => ({ ...options.values }),\n };\n}\n\n/** Nest provider registration helper (`multi: true`). */\nexport function provideSettingsDefaults(provider: SettingsDefaultsProvider) {\n return {\n provide: SETTINGS_DEFAULTS_PROVIDER,\n useValue: provider,\n multi: true,\n } as const;\n}\n\n//#endregion\n","//#region ---- Encrypted setting keys (server at-rest) ----\n\n/**\n * Registers setting keys that must be stored encrypted in the server settings DB.\n * Client definitions use `isEncrypted: true` for the same keys (implies `cacheable: false`).\n */\nexport const SETTINGS_ENCRYPTED_KEYS_PROVIDER = Symbol('SETTINGS_ENCRYPTED_KEYS_PROVIDER');\n\n/** Nest provider registration helper (`multi: true`). */\nexport function provideEncryptedSettingKeys(keys: readonly string[]) {\n return {\n provide: SETTINGS_ENCRYPTED_KEYS_PROVIDER,\n useValue: keys,\n multi: true,\n } as const;\n}\n\n//#endregion\n","//#region ---- Settings entity sync multi-provider ----\n\n/** Platform scope key aligned with server {@link SettingsPlatformScope}. */\nexport type SettingsEntitySyncScope = 'P' | 'T' | 'U';\n\nexport interface SettingsEntitySyncContext {\n scope: SettingsEntitySyncScope;\n tenantId?: string;\n userId?: string;\n}\n\n/**\n * Syncs tenant-scoped settings with canonical entity fields (read overlay + write-through).\n * Register with Nest `multi: true` and `useExisting` on {@link SETTINGS_ENTITY_SYNC_HANDLER}.\n */\nexport interface SettingsEntitySyncHandler {\n scopes: SettingsEntitySyncScope[];\n\n /** Overlay entity-sourced values onto effective settings before returning to clients. */\n overlayRead?(\n context: SettingsEntitySyncContext,\n effectiveValues: Record<string, unknown>,\n ): Promise<Record<string, unknown>>;\n\n /** Called after settings persist; push mapped keys to entity storage. */\n syncWrite?(\n context: SettingsEntitySyncContext,\n changedKeys: string[],\n values: Record<string, unknown>,\n ): Promise<void>;\n}\n\nexport const SETTINGS_ENTITY_SYNC_HANDLER = Symbol('SETTINGS_ENTITY_SYNC_HANDLER');\n\n//#endregion\n","//#region ---- Settings change reactor multi-provider ----\n\n/** Platform scope key aligned with server {@link SettingsPlatformScope}. */\nexport type SettingsChangeReactorScope = 'P' | 'T' | 'U';\n\nexport interface SettingsChangeReactorContext {\n scope: SettingsChangeReactorScope;\n tenantId?: string;\n userId?: string;\n}\n\n/**\n * Runs operational side effects after settings persist (schedules, caches, infrastructure sync).\n * Register with Nest `multi: true` and `useExisting` on {@link SETTINGS_CHANGE_REACTOR}.\n */\nexport interface SettingsChangeReactor {\n scopes: SettingsChangeReactorScope[];\n\n /** Keys this reactor cares about. When omitted, all changed keys trigger {@link react}. */\n watchedKeys?: string[];\n\n react(\n context: SettingsChangeReactorContext,\n changedKeys: string[],\n values: Record<string, unknown>,\n ): Promise<void>;\n}\n\nexport const SETTINGS_CHANGE_REACTOR = Symbol('SETTINGS_CHANGE_REACTOR');\n\n//#endregion\n","export const AXPSettingsManagementMenuKeys = {\n TenantApplicationSettings: 'Settings:Tenant:Application',\n PlatformSettings: 'Settings:Platform',\n} as const;\n\n","/**\n * Applications & Platform capabilities used by this module.\n * Domain capability keys for this module. Root groups live in `AXPCommonPermissionGroupKeys` (common contracts).\n *\n * Own user settings (scope U) require no permission — always available to the signed-in user.\n */\nexport const AXPApplicationsPlatformPermissionKeys = {\n Access: 'ApplicationsPlatform:Permission:Access',\n MaintainApplications: 'ApplicationsPlatform:Permission:MaintainApplications',\n MaintainTenants: 'ApplicationsPlatform:Permission:MaintainTenants',\n MaintainPlatformShell: 'ApplicationsPlatform:Permission:MaintainPlatformShell',\n MaintainLandingPages: 'ApplicationsPlatform:Permission:MaintainLandingPages',\n MaintainIdentifiers: 'ApplicationsPlatform:Permission:MaintainIdentifiers',\n MaintainTenantSettings: 'ApplicationsPlatform:Permission:MaintainTenantSettings',\n MaintainPlatformSettings: 'ApplicationsPlatform:Permission:MaintainPlatformSettings',\n MaintainLocales: 'ApplicationsPlatform:Permission:MaintainLocales',\n UseDevTools: 'ApplicationsPlatform:Permission:UseDevTools',\n} as const;\n\n/**\n * @deprecated Prefer {@link AXPApplicationsPlatformPermissionKeys}.\n * Legacy nested shape kept so existing imports compile during migration.\n * User settings are intentionally omitted — no capability key; always allowed for self.\n */\nexport const AXMSettingsManagementPermissionKeys = {\n TenantSettings: {\n Management: AXPApplicationsPlatformPermissionKeys.MaintainTenantSettings,\n },\n PlatformSettings: {\n Management: AXPApplicationsPlatformPermissionKeys.MaintainPlatformSettings,\n },\n} as const;\n","//#region ---- Module Configuration ----\n\nconst config = {\n i18n: 'settings-management',\n module: 'SettingsManagement',\n};\n\nexport const RootConfig = {\n config,\n module: {\n route: 'settings',\n name: config.module,\n title: '@settings-management:module.title',\n icon: 'fa-light fa-gear',\n },\n entities: {},\n};\n\n//#endregion\n","//#region ---- Contracts barrel ----\n\nexport * from './commands.keys';\nexport * from './queries.keys';\nexport * from './settings-sync-keys';\nexport * from './settings-defaults.provider';\nexport * from './settings-encrypted-keys.provider';\nexport * from './settings-entity-sync.provider';\nexport * from './settings-change-reactor.provider';\nexport * from './menu.keys';\nexport * from './permission.keys';\n\nexport * from './root-config';\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAAA;AAEO,MAAM,gCAAgC,GAAG;AAC9C,IAAA,MAAM,EAAE;AACN,QAAA,KAAK,EAAE,iCAAiC;AACxC,QAAA,MAAM,EAAE,kCAAkC;AAC1C,QAAA,MAAM,EAAE,kCAAkC;AAC3C,KAAA;AACD,IAAA,cAAc,EAAE;AACd,QAAA,KAAK,EAAE,yCAAyC;AAChD,QAAA,GAAG,EAAE,uCAAuC;AAC5C,QAAA,MAAM,EAAE,0CAA0C;AAClD,QAAA,MAAM,EAAE,0CAA0C;AACnD,KAAA;;AAGH;;AChBA;AAEO,MAAM,8BAA8B,GAAG;AAC5C,IAAA,cAAc,EAAE;AACd,QAAA,KAAK,EAAE,yCAAyC;AAChD,QAAA,IAAI,EAAE,wCAAwC;AAC/C,KAAA;;AAGH;;ACJA;AAEO,MAAM,mBAAmB,GAAwB;AACtD,IAAA,mBAAmB,EAAE,8BAA8B,CAAC,cAAc,CAAC,KAAK;AACxE,IAAA,qBAAqB,EAAE,gCAAgC,CAAC,cAAc,CAAC,KAAK;;AAG9E;;ACZA;MAmBa,0BAA0B,GAAG,MAAM,CAAC,4BAA4B;AAE7E;AACO,MAAM,0BAA0B,GAAG;AACxC,IAAA,SAAS,EAAE,CAAC;AACZ,IAAA,MAAM,EAAE,EAAE;AACV,IAAA,GAAG,EAAE,GAAG;;AAUV;AACM,SAAU,oCAAoC,CAClD,OAA8C,EAAA;IAE9C,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;AACpB,QAAA,OAAO,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;KAC7C;AACH;AAEA;AACM,SAAU,uBAAuB,CAAC,QAAkC,EAAA;IACxE,OAAO;AACL,QAAA,OAAO,EAAE,0BAA0B;AACnC,QAAA,QAAQ,EAAE,QAAQ;AAClB,QAAA,KAAK,EAAE,IAAI;KACH;AACZ;AAEA;;ACxDA;AAEA;;;AAGG;MACU,gCAAgC,GAAG,MAAM,CAAC,kCAAkC;AAEzF;AACM,SAAU,2BAA2B,CAAC,IAAuB,EAAA;IACjE,OAAO;AACL,QAAA,OAAO,EAAE,gCAAgC;AACzC,QAAA,QAAQ,EAAE,IAAI;AACd,QAAA,KAAK,EAAE,IAAI;KACH;AACZ;AAEA;;ACjBA;MAgCa,4BAA4B,GAAG,MAAM,CAAC,8BAA8B;AAEjF;;AClCA;MA4Ba,uBAAuB,GAAG,MAAM,CAAC,yBAAyB;AAEvE;;AC9BO,MAAM,6BAA6B,GAAG;AACzC,IAAA,yBAAyB,EAAE,6BAA6B;AACxD,IAAA,gBAAgB,EAAE,mBAAmB;;;ACFzC;;;;;AAKG;AACI,MAAM,qCAAqC,GAAG;AACnD,IAAA,MAAM,EAAE,wCAAwC;AAChD,IAAA,oBAAoB,EAAE,sDAAsD;AAC5E,IAAA,eAAe,EAAE,iDAAiD;AAClE,IAAA,qBAAqB,EAAE,uDAAuD;AAC9E,IAAA,oBAAoB,EAAE,sDAAsD;AAC5E,IAAA,mBAAmB,EAAE,qDAAqD;AAC1E,IAAA,sBAAsB,EAAE,wDAAwD;AAChF,IAAA,wBAAwB,EAAE,0DAA0D;AACpF,IAAA,eAAe,EAAE,iDAAiD;AAClE,IAAA,WAAW,EAAE,6CAA6C;;AAG5D;;;;AAIG;AACI,MAAM,mCAAmC,GAAG;AACjD,IAAA,cAAc,EAAE;QACd,UAAU,EAAE,qCAAqC,CAAC,sBAAsB;AACzE,KAAA;AACD,IAAA,gBAAgB,EAAE;QAChB,UAAU,EAAE,qCAAqC,CAAC,wBAAwB;AAC3E,KAAA;;;AC9BH;AAEA,MAAM,MAAM,GAAG;AACb,IAAA,IAAI,EAAE,qBAAqB;AAC3B,IAAA,MAAM,EAAE,oBAAoB;CAC7B;AAEM,MAAM,UAAU,GAAG;IACxB,MAAM;AACN,IAAA,MAAM,EAAE;AACN,QAAA,KAAK,EAAE,UAAU;QACjB,IAAI,EAAE,MAAM,CAAC,MAAM;AACnB,QAAA,KAAK,EAAE,mCAAmC;AAC1C,QAAA,IAAI,EAAE,kBAAkB;AACzB,KAAA;AACD,IAAA,QAAQ,EAAE,EAAE;;AAGd;;AClBA;AAcA;;ACdA;;AAEG;;;;"}
|
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
import { resolvePlatformScopeName, resolvePlatformScopeKey, AXPKeyboardShortcutPriority } from '@acorex-platform/framework-shared/core';
|
|
2
|
+
import { AXBadgeModule } from '@acorex/components/badge';
|
|
3
|
+
import { AXBreadcrumbsModule } from '@acorex/components/breadcrumbs';
|
|
4
|
+
import * as i6 from '@acorex/components/button';
|
|
5
|
+
import { AXButtonModule } from '@acorex/components/button';
|
|
6
|
+
import * as i4 from '@acorex/components/decorators';
|
|
7
|
+
import { AXDecoratorModule } from '@acorex/components/decorators';
|
|
8
|
+
import { AXDropdownButtonModule } from '@acorex/components/dropdown-button';
|
|
9
|
+
import * as i8 from '@acorex/components/loading';
|
|
10
|
+
import { AXLoadingModule } from '@acorex/components/loading';
|
|
11
|
+
import * as i3 from '@acorex/components/search-box';
|
|
12
|
+
import { AXSearchBoxModule } from '@acorex/components/search-box';
|
|
13
|
+
import * as i7 from '@acorex/components/tabs';
|
|
14
|
+
import { AXTabsModule } from '@acorex/components/tabs';
|
|
15
|
+
import * as i5 from '@acorex/core/translation';
|
|
16
|
+
import { AXTranslationModule } from '@acorex/core/translation';
|
|
17
|
+
import { AXUnsubscriber } from '@acorex/core/utils';
|
|
18
|
+
import { AXPUnsavedChangesPopstateService, traceSettingsPageRouteLoad } from '@acorex-platform/framework-client/common';
|
|
19
|
+
import { AXPDeviceService, AXHighlightService, AXPHookService, AXPKeyboardShortcutRegistry } from '@acorex-platform/framework-client/core';
|
|
20
|
+
import { AXPThemeLayoutBlockComponent, AXPThemeLayoutListComponent, AXPThemeLayoutListItemComponent, AXPThemeLayoutToolbarComponent, AXPThemeLayoutHeaderComponent, AXPThemeLayoutStartSideComponent } from '@acorex-platform/framework-client/layout/components';
|
|
21
|
+
import { AXPPageLayoutBaseComponent, resolveDetailsViewFooterCommandShortcuts, AXPPageLayoutComponent, AXPPageLayoutBase } from '@acorex-platform/framework-client/layout/views';
|
|
22
|
+
import * as i1$1 from '@angular/common';
|
|
23
|
+
import { CommonModule } from '@angular/common';
|
|
24
|
+
import * as i0 from '@angular/core';
|
|
25
|
+
import { inject, DestroyRef, ElementRef, viewChild, effect, untracked, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
26
|
+
import * as i1 from '@angular/forms';
|
|
27
|
+
import { FormsModule } from '@angular/forms';
|
|
28
|
+
import * as i2 from '@angular/router';
|
|
29
|
+
import { ActivatedRoute, NavigationEnd, RouterModule } from '@angular/router';
|
|
30
|
+
import { filter } from 'rxjs';
|
|
31
|
+
import { AXPSettingsViewModel } from './acorex-platform-module-settings-management-client.mjs';
|
|
32
|
+
|
|
33
|
+
class AXPSettingPageComponent extends AXPPageLayoutBaseComponent {
|
|
34
|
+
constructor() {
|
|
35
|
+
super(...arguments);
|
|
36
|
+
this.vm = inject(AXPSettingsViewModel);
|
|
37
|
+
this.deviceService = inject(AXPDeviceService);
|
|
38
|
+
this.activatedRoute = inject(ActivatedRoute);
|
|
39
|
+
this.unsubscribe = inject(AXUnsubscriber);
|
|
40
|
+
this.highlightService = inject(AXHighlightService);
|
|
41
|
+
this.hooks = inject(AXPHookService);
|
|
42
|
+
this.unsavedChangesPopstate = inject(AXPUnsavedChangesPopstateService);
|
|
43
|
+
this.destroyRef = inject(DestroyRef);
|
|
44
|
+
this.elementRef = inject(ElementRef);
|
|
45
|
+
this.shortcutRegistry = inject(AXPKeyboardShortcutRegistry);
|
|
46
|
+
this.sidebarTabs = viewChild('sidebarTabs', /* @ts-ignore */
|
|
47
|
+
...(ngDevMode ? [{ debugName: "sidebarTabs" }] : /* istanbul ignore next */ []));
|
|
48
|
+
this.sidebarTabChangeSuppressed = false;
|
|
49
|
+
/** Prevents VM→URL sync from stripping the route group during refresh hydration. */
|
|
50
|
+
this.loadingFromRoute = false;
|
|
51
|
+
/** Serializes overlapping route loads (e.g. init + NavigationEnd) so `loadingFromRoute` cannot clear early. */
|
|
52
|
+
this.routeLoadChain = Promise.resolve();
|
|
53
|
+
/** Syncs the line indicator when the active group changes programmatically (route load / navigation). */
|
|
54
|
+
this.#sidebarTabsIndicatorEffect = effect(() => {
|
|
55
|
+
const groups = this.vm.groups();
|
|
56
|
+
const activeName = this.vm.activateGroup()?.name;
|
|
57
|
+
if (!groups.length || !activeName || this.vm.isSearching()) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const index = groups.findIndex((group) => group.name === activeName);
|
|
61
|
+
if (index < 0) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
untracked(() => queueMicrotask(() => {
|
|
65
|
+
this.sidebarTabChangeSuppressed = true;
|
|
66
|
+
try {
|
|
67
|
+
this.sidebarTabs()?.select(index);
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
this.sidebarTabChangeSuppressed = false;
|
|
71
|
+
}
|
|
72
|
+
}));
|
|
73
|
+
}, /* @ts-ignore */
|
|
74
|
+
...(ngDevMode ? [{ debugName: "#sidebarTabsIndicatorEffect" }] : /* istanbul ignore next */ []));
|
|
75
|
+
this.#effect = effect(() => {
|
|
76
|
+
if (!this.vm.isLoaded() || this.loadingFromRoute) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const expression = this.vm.searchExpression();
|
|
80
|
+
const app = this.sessionService.application?.name;
|
|
81
|
+
const scope = resolvePlatformScopeName(this.vm.scope());
|
|
82
|
+
const group = this.vm.activateGroup()?.name;
|
|
83
|
+
//
|
|
84
|
+
if (this.vm.isSearching()) {
|
|
85
|
+
this.router.navigate([app, 'settings', scope, group ?? ''], {
|
|
86
|
+
queryParams: { q: expression },
|
|
87
|
+
});
|
|
88
|
+
setTimeout(() => {
|
|
89
|
+
this.highlightService.highlight('#ax-settings', expression);
|
|
90
|
+
}, 100);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// On desktop, scope-only URLs are redirected to the first group in loadFromRoute.
|
|
94
|
+
// Do not sync back to a group-less URL while that redirect is pending.
|
|
95
|
+
if (!group && this.deviceService.isLarge()) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
this.router.navigate([app, 'settings', scope, group ?? '']);
|
|
99
|
+
this.highlightService.clear();
|
|
100
|
+
}, /* @ts-ignore */
|
|
101
|
+
...(ngDevMode ? [{ debugName: "#effect" }] : /* istanbul ignore next */ []));
|
|
102
|
+
}
|
|
103
|
+
/** Syncs the line indicator when the active group changes programmatically (route load / navigation). */
|
|
104
|
+
#sidebarTabsIndicatorEffect;
|
|
105
|
+
#effect;
|
|
106
|
+
async ngOnInit() {
|
|
107
|
+
await super.ngOnInit();
|
|
108
|
+
this.registerKeyboardShortcuts();
|
|
109
|
+
this.unsavedChangesPopstate.registerSource({
|
|
110
|
+
id: 'axp-setting-page',
|
|
111
|
+
isDirty: () => this.vm.isDirty(),
|
|
112
|
+
});
|
|
113
|
+
this.destroyRef.onDestroy(() => this.unsavedChangesPopstate.unregisterSource('axp-setting-page'));
|
|
114
|
+
//
|
|
115
|
+
this.router.events
|
|
116
|
+
.pipe(this.unsubscribe.takeUntilDestroy, filter((event) => event instanceof NavigationEnd))
|
|
117
|
+
.subscribe(() => {
|
|
118
|
+
void this.enqueueLoadFromRoute();
|
|
119
|
+
});
|
|
120
|
+
await this.enqueueLoadFromRoute();
|
|
121
|
+
}
|
|
122
|
+
enqueueLoadFromRoute() {
|
|
123
|
+
const load = this.routeLoadChain.then(() => this.loadFromRoute());
|
|
124
|
+
this.routeLoadChain = load.catch(() => undefined);
|
|
125
|
+
return load;
|
|
126
|
+
}
|
|
127
|
+
async loadFromRoute() {
|
|
128
|
+
if (this.unsavedChangesPopstate.isHandlingPopstate()) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
this.loadingFromRoute = true;
|
|
132
|
+
try {
|
|
133
|
+
const snapshot = this.activatedRoute.snapshot;
|
|
134
|
+
const routerScope = resolvePlatformScopeKey(snapshot.paramMap.get('scope')?.trim().toLowerCase());
|
|
135
|
+
const vmScope = this.vm.scope();
|
|
136
|
+
const query = snapshot.queryParamMap.get('q');
|
|
137
|
+
const groupFromRoute = this.getGroupFromRouteSync();
|
|
138
|
+
//
|
|
139
|
+
if (vmScope != routerScope || !this.vm.isLoaded()) {
|
|
140
|
+
traceSettingsPageRouteLoad(routerScope, vmScope !== routerScope ? 'scope-changed' : 'not-loaded-yet');
|
|
141
|
+
await this.vm.load(routerScope);
|
|
142
|
+
}
|
|
143
|
+
const activeGroup = this.vm.activateGroup()?.name;
|
|
144
|
+
if (groupFromRoute === activeGroup && this.vm.isDirty() && !this.unsavedChangesConfirm.hasLeaveConfirmed()) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const hasQuery = !!query?.trim();
|
|
148
|
+
if (groupFromRoute && groupFromRoute === activeGroup && !hasQuery && !this.vm.isSearching()) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (groupFromRoute !== activeGroup) {
|
|
152
|
+
this.vm.unloadActivateGroup();
|
|
153
|
+
}
|
|
154
|
+
if (!hasQuery) {
|
|
155
|
+
this.vm.clearSearch();
|
|
156
|
+
}
|
|
157
|
+
let group = groupFromRoute;
|
|
158
|
+
if (!group && this.deviceService.isLarge() && !this.vm.isSearching()) {
|
|
159
|
+
group = this.vm.groups()?.[0]?.name;
|
|
160
|
+
if (group) {
|
|
161
|
+
this.vm.setActivateGroupByName(group);
|
|
162
|
+
this.recompute();
|
|
163
|
+
await this.router.navigate([group], { relativeTo: this.activatedRoute, replaceUrl: true });
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
else if (group) {
|
|
168
|
+
this.vm.setActivateGroupByName(group);
|
|
169
|
+
this.recompute();
|
|
170
|
+
}
|
|
171
|
+
if (hasQuery) {
|
|
172
|
+
await this.vm.search(query);
|
|
173
|
+
this.recompute();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
finally {
|
|
177
|
+
this.loadingFromRoute = false;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
getGroupFromRouteSync() {
|
|
181
|
+
let route = this.activatedRoute.snapshot;
|
|
182
|
+
while (route) {
|
|
183
|
+
const group = route.paramMap.get('group');
|
|
184
|
+
if (group) {
|
|
185
|
+
return group;
|
|
186
|
+
}
|
|
187
|
+
route = route.firstChild ?? null;
|
|
188
|
+
}
|
|
189
|
+
return undefined;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* `ax-tabs` selects on click before we can confirm. Revert synchronously, then confirm + navigate.
|
|
193
|
+
*/
|
|
194
|
+
handleSidebarTabChanged(event) {
|
|
195
|
+
if (this.sidebarTabChangeSuppressed) {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
const groups = this.vm.groups();
|
|
199
|
+
const target = groups[event.index];
|
|
200
|
+
const activeName = this.vm.activateGroup()?.name;
|
|
201
|
+
if (!target || target.name === activeName || this.vm.isSearching()) {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
const activeIndex = groups.findIndex((group) => group.name === activeName);
|
|
205
|
+
if (activeIndex >= 0) {
|
|
206
|
+
this.sidebarTabChangeSuppressed = true;
|
|
207
|
+
try {
|
|
208
|
+
this.sidebarTabs()?.select(activeIndex);
|
|
209
|
+
}
|
|
210
|
+
finally {
|
|
211
|
+
this.sidebarTabChangeSuppressed = false;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
void this.completeGroupSwitch(target.name);
|
|
215
|
+
}
|
|
216
|
+
async handleSelectGroup(item) {
|
|
217
|
+
if (item.name === this.vm.activateGroup()?.name) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
if (!(await this.confirmLeaveIfDirty())) {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
await this.router.navigate([`${item.name}`], { relativeTo: this.activatedRoute });
|
|
224
|
+
}
|
|
225
|
+
async completeGroupSwitch(groupName) {
|
|
226
|
+
if (!(await this.confirmLeaveIfDirty())) {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
await this.router.navigate([groupName], { relativeTo: this.activatedRoute });
|
|
230
|
+
}
|
|
231
|
+
//#region ---- Keyboard Shortcuts ----
|
|
232
|
+
registerKeyboardShortcuts() {
|
|
233
|
+
const saveKeys = resolveDetailsViewFooterCommandShortcuts('update-entity');
|
|
234
|
+
const discardKeys = resolveDetailsViewFooterCommandShortcuts('discard');
|
|
235
|
+
const group = '@general:keyboard-shortcuts.groups.settings';
|
|
236
|
+
const shortcuts = [];
|
|
237
|
+
if (saveKeys?.length) {
|
|
238
|
+
shortcuts.push({
|
|
239
|
+
keys: saveKeys,
|
|
240
|
+
title: '@general:actions.apply.title',
|
|
241
|
+
group,
|
|
242
|
+
allowInEditableFields: true,
|
|
243
|
+
when: () => this.canExecuteSaveShortcut(),
|
|
244
|
+
handler: () => {
|
|
245
|
+
void this.vm.apply();
|
|
246
|
+
},
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
if (discardKeys?.length) {
|
|
250
|
+
shortcuts.push({
|
|
251
|
+
keys: discardKeys,
|
|
252
|
+
title: '@general:actions.discard.title',
|
|
253
|
+
group,
|
|
254
|
+
allowInEditableFields: true,
|
|
255
|
+
when: () => this.canExecuteDiscardShortcut(),
|
|
256
|
+
handler: () => {
|
|
257
|
+
void this.executeDiscardViaShortcut();
|
|
258
|
+
},
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
if (shortcuts.length === 0) {
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
this.shortcutRegistry.register({
|
|
265
|
+
owner: this.destroyRef,
|
|
266
|
+
elementRef: this.elementRef,
|
|
267
|
+
id: 'settings-page-core',
|
|
268
|
+
priority: AXPKeyboardShortcutPriority.Page,
|
|
269
|
+
scope: group,
|
|
270
|
+
shortcuts,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
canExecuteSaveShortcut() {
|
|
274
|
+
if (this.vm.isSaving() || this.vm.isBusy()) {
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
277
|
+
return this.vm.isDirty();
|
|
278
|
+
}
|
|
279
|
+
canExecuteDiscardShortcut() {
|
|
280
|
+
if (this.vm.isSaving() || this.vm.isBusy()) {
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
if (this.unsavedChangesConfirm.isConfirmPending()) {
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
return this.vm.isDirty();
|
|
287
|
+
}
|
|
288
|
+
async executeDiscardViaShortcut() {
|
|
289
|
+
if (!this.canExecuteDiscardShortcut()) {
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
const confirmed = await this.unsavedChangesConfirm.confirmIfDirty(true, {
|
|
293
|
+
title: '@general:messages.unsaved-changes.title',
|
|
294
|
+
message: '@general:messages.discard-changes.message',
|
|
295
|
+
approveLeaveOnConfirm: false,
|
|
296
|
+
});
|
|
297
|
+
if (!confirmed) {
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
await this.vm.discard();
|
|
301
|
+
}
|
|
302
|
+
//#endregion
|
|
303
|
+
//#region ---- Leave Page Gate ----
|
|
304
|
+
async canDeactivate() {
|
|
305
|
+
if (this.unsavedChangesConfirm.hasLeaveConfirmed()) {
|
|
306
|
+
return true;
|
|
307
|
+
}
|
|
308
|
+
return this.confirmLeaveIfDirty();
|
|
309
|
+
}
|
|
310
|
+
onBeforeTabClose() {
|
|
311
|
+
return this.unsavedChangesConfirm.confirmIfDirty(this.shouldPromptLeave(), {
|
|
312
|
+
approveLeaveOnConfirm: false,
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
shouldPromptLeave() {
|
|
316
|
+
return this.vm.isDirty();
|
|
317
|
+
}
|
|
318
|
+
async confirmLeaveIfDirty() {
|
|
319
|
+
const wasDirty = this.shouldPromptLeave();
|
|
320
|
+
const confirmed = await this.unsavedChangesConfirm.confirmIfDirty(wasDirty);
|
|
321
|
+
if (confirmed && wasDirty) {
|
|
322
|
+
await this.vm.discard();
|
|
323
|
+
}
|
|
324
|
+
return confirmed;
|
|
325
|
+
}
|
|
326
|
+
//#endregion
|
|
327
|
+
//#region ---------------- Page Configuration Overrides ----------------
|
|
328
|
+
async getSecondaryMenuItems() {
|
|
329
|
+
if (!this.vm.activateGroup()) {
|
|
330
|
+
return [];
|
|
331
|
+
}
|
|
332
|
+
const items = [
|
|
333
|
+
{
|
|
334
|
+
title: await this.translateService.translateAsync('@settings-management:settings.actions.restore-defaults.title'),
|
|
335
|
+
icon: 'fa-light fa-rotate-left',
|
|
336
|
+
color: 'danger',
|
|
337
|
+
command: { name: 'restore-defaults' },
|
|
338
|
+
},
|
|
339
|
+
];
|
|
340
|
+
const payload = await this.hooks.runAsync('settings-page.secondary-actions', { items });
|
|
341
|
+
return payload.items ?? items;
|
|
342
|
+
}
|
|
343
|
+
async getPageTitle() {
|
|
344
|
+
const group = this.vm.activateGroup();
|
|
345
|
+
const groupHeadingKey = group?.pageTitle ?? group?.title;
|
|
346
|
+
const scopeTitle = await this.translateService.translateAsync('@settings-management:module.terms.scopes.' + this.vm.scopeTitle());
|
|
347
|
+
if (!this.vm.isSearching()) {
|
|
348
|
+
return groupHeadingKey ?? scopeTitle;
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
return this.translateService.translateAsync('@settings-management:settings.components.search.title', {
|
|
352
|
+
params: { q: this.vm.searchExpression() },
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
async getPageDescription() {
|
|
357
|
+
const groupDescription = this.vm.activateGroup()?.description;
|
|
358
|
+
const scopeDescription = await this.translateService.translateAsync('@settings-management:module.terms.scopes.' + this.vm.scopeDescription());
|
|
359
|
+
if (!this.vm.isSearching()) {
|
|
360
|
+
return groupDescription ?? scopeDescription;
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
return this.translateService.translateAsync('@settings-management:settings.components.search.description');
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
hasUnsavedChanges() {
|
|
367
|
+
return this.vm.isDirty();
|
|
368
|
+
}
|
|
369
|
+
async getBackButton() {
|
|
370
|
+
if (this.vm.activateGroup()) {
|
|
371
|
+
return {
|
|
372
|
+
title: await this.translateService.translateAsync('@settings-management:module.terms.scopes.' + this.vm.scopeTitle()),
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
return null;
|
|
376
|
+
}
|
|
377
|
+
async onBackButtonClick() {
|
|
378
|
+
if (!(await this.confirmLeaveIfDirty())) {
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
const app = this.sessionService.application?.name;
|
|
382
|
+
const scope = resolvePlatformScopeName(this.vm.scope());
|
|
383
|
+
this.router.navigate([app, 'settings', scope]);
|
|
384
|
+
}
|
|
385
|
+
async execute(command) {
|
|
386
|
+
switch (command.name) {
|
|
387
|
+
case 'restore-defaults':
|
|
388
|
+
await this.vm.resetToDefault();
|
|
389
|
+
break;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPSettingPageComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
393
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPSettingPageComponent, isStandalone: true, selector: "ng-component", host: { classAttribute: "axp-setting-page" }, providers: [
|
|
394
|
+
AXUnsubscriber,
|
|
395
|
+
AXPSettingsViewModel,
|
|
396
|
+
{
|
|
397
|
+
provide: AXPPageLayoutBase,
|
|
398
|
+
useExisting: AXPSettingPageComponent,
|
|
399
|
+
},
|
|
400
|
+
], viewQueries: [{ propertyName: "sidebarTabs", first: true, predicate: ["sidebarTabs"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<axp-page-layout *translate=\"let t\">\n @if (vm.showGroups()) {\n <axp-layout-start-side>\n <axp-layout-header>\n <axp-layout-title>{{\n '@settings-management:module.terms.scopes.' + vm.scopeTitle() | translate | async\n }}</axp-layout-title>\n <axp-layout-toolbar>\n <ax-search-box [delayTime]=\"300\" [ngModel]=\"vm.searchExpression()\" (onValueChanged)=\"vm.search($event.value)\"\n [placeholder]=\"'@settings-management:settings.components.search.placeholder' | translate | async\">\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n </axp-layout-toolbar>\n </axp-layout-header>\n <axp-layout-content>\n <ax-tabs #sidebarTabs [look]=\"'with-line-color'\" [location]=\"'end'\" [fitParent]=\"true\"\n (onActiveTabChanged)=\"handleSidebarTabChanged($event)\">\n @for (item of vm.groups(); track item.name) {\n <ax-tab-item [key]=\"item.name\" [text]=\"(item.title | translate | async)!\"\n [active]=\"vm.activateGroup()?.name === item.name && !vm.isSearching()\">\n <ax-prefix>\n <ax-icon icon=\"{{ item.icon }} fa-fw fa-regular\"></ax-icon>\n </ax-prefix>\n </ax-tab-item>\n }\n </ax-tabs>\n </axp-layout-content>\n </axp-layout-start-side>\n }\n\n <axp-page-content id=\"ax-settings\">\n @if (vm.hasActivateGroup() || vm.isSearching()) {\n <router-outlet></router-outlet>\n } @else {\n <axp-layout-list>\n @for (item of vm.groups(); track $index) {\n <axp-layout-list-item (click)=\"handleSelectGroup(item)\">\n <axp-layout-prefix>\n <ax-icon icon=\"far ${{ item.icon }}\" class=\"text-gray-500\"></ax-icon>\n </axp-layout-prefix>\n <axp-layout-content>\n <a class=\"font-semibold\">{{ item.title | translate | async }}</a>\n </axp-layout-content>\n <axp-layout-suffix>\n <ax-icon icon=\" far fa-chevron-right\" class=\"text-gray-400\"></ax-icon>\n </axp-layout-suffix>\n </axp-layout-list-item>\n }\n </axp-layout-list>\n }\n </axp-page-content>\n\n @if (vm.isDirty()) {\n <axp-page-footer class=\"--animated\">\n <axp-layout-suffix>\n <ax-button [class.ax-sm]=\"deviceService.isSmall()\" [disabled]=\"vm.isBusy() || vm.isSaving()\"\n [text]=\"'@general:actions.discard.title' | translate | async\" (onClick)=\"vm.discard()\">\n </ax-button>\n <ax-button [class.ax-sm]=\"deviceService.isSmall()\" [disabled]=\"vm.isBusy() || vm.isSaving()\"\n [text]=\"'@general:actions.apply.title' | translate | async\" (onClick)=\"vm.apply()\" [color]=\"'secondary'\">\n @if (vm.isSaving()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </axp-layout-suffix>\n </axp-page-footer>\n }\n</axp-page-layout>", styles: ["@layer properties;.axp-setting-page ax-tabs{--ax-comp-tabs-default-border-radius: 0}.axp-setting-page ax-tabs ax-tab-item{margin-block:0px;border-radius:0!important;padding-block:calc(var(--spacing, .25rem) * 3);--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}.axp-setting-page axp-layout-section axp-layout-content{display:flex;width:100%;flex-direction:column}:where(.axp-setting-page axp-layout-section axp-layout-content>:not(:last-child)){--tw-divide-y-reverse: 0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.axp-setting-page axp-layout-section axp-layout-content>:not(:last-child)){--tw-border-style: dashed;border-style:dashed}:where(.axp-setting-page axp-layout-section axp-layout-content>:not(:last-child)){border-color:var(--color-gray-200, oklch(92.8% .006 264.531))}.axp-setting-page axp-layout-section axp-layout-content .--item-container{display:grid;align-items:flex-start;column-gap:calc(var(--spacing, .25rem) * 6);row-gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 4);grid-template-columns:minmax(0,1fr)}@media(width>=64rem){.axp-setting-page axp-layout-section axp-layout-content .--item-container{padding-inline:calc(var(--spacing, .25rem) * 6)}}@media(width>=80rem){.axp-setting-page axp-layout-section axp-layout-content .--item-container{padding-inline:calc(var(--spacing, .25rem) * 8)}}@media(width>=96rem){.axp-setting-page axp-layout-section axp-layout-content .--item-container{padding-inline:calc(var(--spacing, .25rem) * 10)}}@media(min-width:640px){.axp-setting-page axp-layout-section axp-layout-content .--item-container{grid-template-columns:minmax(11rem,34%) minmax(0,max-content)}}.axp-setting-page axp-layout-section axp-layout-content .--item-container:has(.--is-hidden){display:none}.axp-setting-page axp-layout-section axp-layout-content .--item-container .--item-label{min-width:0px;grid-column:1 / -1}@media(min-width:640px){.axp-setting-page axp-layout-section axp-layout-content .--item-container .--item-label{grid-column:auto}}.axp-setting-page axp-layout-section axp-layout-content .--item-container .--item-control{min-width:0px;width:100%;max-width:100%;grid-column:1 / -1}@media(min-width:640px){.axp-setting-page axp-layout-section axp-layout-content .--item-container .--item-control{grid-column:2;width:clamp(14rem,36vw,24rem)}}@media(min-width:1024px){.axp-setting-page axp-layout-section axp-layout-content .--item-container .--item-control{width:clamp(16rem,28vw,28rem)}}@media(min-width:1280px){.axp-setting-page axp-layout-section axp-layout-content .--item-container .--item-control{width:clamp(18rem,24vw,32rem)}}.axp-setting-page axp-layout-section axp-layout-content .--item-container.--stacked-control{grid-template-columns:minmax(0,1fr)}.axp-setting-page axp-layout-section axp-layout-content .--item-container.--stacked-control .--item-label,.axp-setting-page axp-layout-section axp-layout-content .--item-container.--stacked-control .--item-control{grid-column:1 / -1}.axp-setting-page axp-layout-section axp-layout-content .--item-container.--stacked-control .--item-control{width:100%;max-width:100%}@media(min-width:640px){.axp-setting-page axp-layout-section axp-layout-content .--item-container.--wide-control .--item-control{width:clamp(20rem,50vw,36rem)}}@media(min-width:1280px){.axp-setting-page axp-layout-section axp-layout-content .--item-container.--wide-control .--item-control{width:clamp(24rem,40vw,42rem)}}.axp-setting-page axp-layout-section axp-layout-content .--item-container axp-layout-description{margin-top:calc(var(--spacing, .25rem) * 2);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)))}.axp-setting-page axp-layout-start-side{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.axp-setting-page #ax-settings{padding:calc(var(--spacing, .25rem) * 4)}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-divide-y-reverse{syntax: \"*\"; inherits: false; initial-value: 0;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial;--tw-divide-y-reverse: 0;--tw-border-style: solid}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "ngmodule", type:
|
|
401
|
+
//
|
|
402
|
+
AXSearchBoxModule }, { kind: "component", type: i3.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i4.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i4.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "component", type: i4.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXBreadcrumbsModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i6.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXTabsModule }, { kind: "component", type: i7.AXTabsComponent, selector: "ax-tabs", inputs: ["look", "location", "fitParent", "minWidth", "content"], outputs: ["onActiveTabChanged"] }, { kind: "component", type: i7.AXTabItemComponent, selector: "ax-tab-item", inputs: ["disabled", "text", "key", "headerTemplate", "active"], outputs: ["disabledChange", "onClick", "onBlur", "onFocus", "activeChange"] }, { kind: "ngmodule", type: AXBadgeModule }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i8.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXDropdownButtonModule }, { kind: "component", type:
|
|
403
|
+
//
|
|
404
|
+
AXPPageLayoutComponent, selector: "axp-page-layout" }, { kind: "component", type: AXPThemeLayoutBlockComponent, selector: " axp-page-content, axp-page-footer-container, axp-page-footer, axp-page-header, axp-page-header-container, axp-page-toolbar, axp-layout-content, axp-layout-page-content, axp-layout-sections, axp-layout-body, axp-layout-page-body, axp-layout-prefix, axp-layout-suffix, axp-layout-title-bar, axp-layout-title, axp-layout-title-actions, axp-layout-nav-button, axp-layout-description, axp-layout-breadcrumbs, axp-layout-list-action, " }, { kind: "component", type: AXPThemeLayoutListComponent, selector: "axp-layout-list" }, { kind: "component", type: AXPThemeLayoutListItemComponent, selector: "axp-layout-list-item" }, { kind: "component", type: AXPThemeLayoutToolbarComponent, selector: "axp-layout-toolbar" }, { kind: "component", type: AXPThemeLayoutHeaderComponent, selector: "axp-layout-header" }, { kind: "component", type: AXPThemeLayoutStartSideComponent, selector: "axp-layout-page-start-side, axp-layout-start-side" }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
405
|
+
}
|
|
406
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPSettingPageComponent, decorators: [{
|
|
407
|
+
type: Component,
|
|
408
|
+
args: [{ standalone: true, imports: [
|
|
409
|
+
CommonModule,
|
|
410
|
+
FormsModule,
|
|
411
|
+
RouterModule,
|
|
412
|
+
//
|
|
413
|
+
AXSearchBoxModule,
|
|
414
|
+
AXDecoratorModule,
|
|
415
|
+
AXBreadcrumbsModule,
|
|
416
|
+
AXTranslationModule,
|
|
417
|
+
AXButtonModule,
|
|
418
|
+
AXTabsModule,
|
|
419
|
+
AXBadgeModule,
|
|
420
|
+
AXLoadingModule,
|
|
421
|
+
AXDropdownButtonModule,
|
|
422
|
+
//
|
|
423
|
+
AXPPageLayoutComponent,
|
|
424
|
+
AXPThemeLayoutBlockComponent,
|
|
425
|
+
AXPThemeLayoutListComponent,
|
|
426
|
+
AXPThemeLayoutListItemComponent,
|
|
427
|
+
AXPThemeLayoutToolbarComponent,
|
|
428
|
+
AXPThemeLayoutHeaderComponent,
|
|
429
|
+
AXPThemeLayoutStartSideComponent,
|
|
430
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [
|
|
431
|
+
AXUnsubscriber,
|
|
432
|
+
AXPSettingsViewModel,
|
|
433
|
+
{
|
|
434
|
+
provide: AXPPageLayoutBase,
|
|
435
|
+
useExisting: AXPSettingPageComponent,
|
|
436
|
+
},
|
|
437
|
+
], host: { class: 'axp-setting-page' }, template: "<axp-page-layout *translate=\"let t\">\n @if (vm.showGroups()) {\n <axp-layout-start-side>\n <axp-layout-header>\n <axp-layout-title>{{\n '@settings-management:module.terms.scopes.' + vm.scopeTitle() | translate | async\n }}</axp-layout-title>\n <axp-layout-toolbar>\n <ax-search-box [delayTime]=\"300\" [ngModel]=\"vm.searchExpression()\" (onValueChanged)=\"vm.search($event.value)\"\n [placeholder]=\"'@settings-management:settings.components.search.placeholder' | translate | async\">\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n </axp-layout-toolbar>\n </axp-layout-header>\n <axp-layout-content>\n <ax-tabs #sidebarTabs [look]=\"'with-line-color'\" [location]=\"'end'\" [fitParent]=\"true\"\n (onActiveTabChanged)=\"handleSidebarTabChanged($event)\">\n @for (item of vm.groups(); track item.name) {\n <ax-tab-item [key]=\"item.name\" [text]=\"(item.title | translate | async)!\"\n [active]=\"vm.activateGroup()?.name === item.name && !vm.isSearching()\">\n <ax-prefix>\n <ax-icon icon=\"{{ item.icon }} fa-fw fa-regular\"></ax-icon>\n </ax-prefix>\n </ax-tab-item>\n }\n </ax-tabs>\n </axp-layout-content>\n </axp-layout-start-side>\n }\n\n <axp-page-content id=\"ax-settings\">\n @if (vm.hasActivateGroup() || vm.isSearching()) {\n <router-outlet></router-outlet>\n } @else {\n <axp-layout-list>\n @for (item of vm.groups(); track $index) {\n <axp-layout-list-item (click)=\"handleSelectGroup(item)\">\n <axp-layout-prefix>\n <ax-icon icon=\"far ${{ item.icon }}\" class=\"text-gray-500\"></ax-icon>\n </axp-layout-prefix>\n <axp-layout-content>\n <a class=\"font-semibold\">{{ item.title | translate | async }}</a>\n </axp-layout-content>\n <axp-layout-suffix>\n <ax-icon icon=\" far fa-chevron-right\" class=\"text-gray-400\"></ax-icon>\n </axp-layout-suffix>\n </axp-layout-list-item>\n }\n </axp-layout-list>\n }\n </axp-page-content>\n\n @if (vm.isDirty()) {\n <axp-page-footer class=\"--animated\">\n <axp-layout-suffix>\n <ax-button [class.ax-sm]=\"deviceService.isSmall()\" [disabled]=\"vm.isBusy() || vm.isSaving()\"\n [text]=\"'@general:actions.discard.title' | translate | async\" (onClick)=\"vm.discard()\">\n </ax-button>\n <ax-button [class.ax-sm]=\"deviceService.isSmall()\" [disabled]=\"vm.isBusy() || vm.isSaving()\"\n [text]=\"'@general:actions.apply.title' | translate | async\" (onClick)=\"vm.apply()\" [color]=\"'secondary'\">\n @if (vm.isSaving()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </axp-layout-suffix>\n </axp-page-footer>\n }\n</axp-page-layout>", styles: ["@layer properties;.axp-setting-page ax-tabs{--ax-comp-tabs-default-border-radius: 0}.axp-setting-page ax-tabs ax-tab-item{margin-block:0px;border-radius:0!important;padding-block:calc(var(--spacing, .25rem) * 3);--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}.axp-setting-page axp-layout-section axp-layout-content{display:flex;width:100%;flex-direction:column}:where(.axp-setting-page axp-layout-section axp-layout-content>:not(:last-child)){--tw-divide-y-reverse: 0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.axp-setting-page axp-layout-section axp-layout-content>:not(:last-child)){--tw-border-style: dashed;border-style:dashed}:where(.axp-setting-page axp-layout-section axp-layout-content>:not(:last-child)){border-color:var(--color-gray-200, oklch(92.8% .006 264.531))}.axp-setting-page axp-layout-section axp-layout-content .--item-container{display:grid;align-items:flex-start;column-gap:calc(var(--spacing, .25rem) * 6);row-gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 4);grid-template-columns:minmax(0,1fr)}@media(width>=64rem){.axp-setting-page axp-layout-section axp-layout-content .--item-container{padding-inline:calc(var(--spacing, .25rem) * 6)}}@media(width>=80rem){.axp-setting-page axp-layout-section axp-layout-content .--item-container{padding-inline:calc(var(--spacing, .25rem) * 8)}}@media(width>=96rem){.axp-setting-page axp-layout-section axp-layout-content .--item-container{padding-inline:calc(var(--spacing, .25rem) * 10)}}@media(min-width:640px){.axp-setting-page axp-layout-section axp-layout-content .--item-container{grid-template-columns:minmax(11rem,34%) minmax(0,max-content)}}.axp-setting-page axp-layout-section axp-layout-content .--item-container:has(.--is-hidden){display:none}.axp-setting-page axp-layout-section axp-layout-content .--item-container .--item-label{min-width:0px;grid-column:1 / -1}@media(min-width:640px){.axp-setting-page axp-layout-section axp-layout-content .--item-container .--item-label{grid-column:auto}}.axp-setting-page axp-layout-section axp-layout-content .--item-container .--item-control{min-width:0px;width:100%;max-width:100%;grid-column:1 / -1}@media(min-width:640px){.axp-setting-page axp-layout-section axp-layout-content .--item-container .--item-control{grid-column:2;width:clamp(14rem,36vw,24rem)}}@media(min-width:1024px){.axp-setting-page axp-layout-section axp-layout-content .--item-container .--item-control{width:clamp(16rem,28vw,28rem)}}@media(min-width:1280px){.axp-setting-page axp-layout-section axp-layout-content .--item-container .--item-control{width:clamp(18rem,24vw,32rem)}}.axp-setting-page axp-layout-section axp-layout-content .--item-container.--stacked-control{grid-template-columns:minmax(0,1fr)}.axp-setting-page axp-layout-section axp-layout-content .--item-container.--stacked-control .--item-label,.axp-setting-page axp-layout-section axp-layout-content .--item-container.--stacked-control .--item-control{grid-column:1 / -1}.axp-setting-page axp-layout-section axp-layout-content .--item-container.--stacked-control .--item-control{width:100%;max-width:100%}@media(min-width:640px){.axp-setting-page axp-layout-section axp-layout-content .--item-container.--wide-control .--item-control{width:clamp(20rem,50vw,36rem)}}@media(min-width:1280px){.axp-setting-page axp-layout-section axp-layout-content .--item-container.--wide-control .--item-control{width:clamp(24rem,40vw,42rem)}}.axp-setting-page axp-layout-section axp-layout-content .--item-container axp-layout-description{margin-top:calc(var(--spacing, .25rem) * 2);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)))}.axp-setting-page axp-layout-start-side{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.axp-setting-page #ax-settings{padding:calc(var(--spacing, .25rem) * 4)}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-divide-y-reverse{syntax: \"*\"; inherits: false; initial-value: 0;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial;--tw-divide-y-reverse: 0;--tw-border-style: solid}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
|
|
438
|
+
}], propDecorators: { sidebarTabs: [{ type: i0.ViewChild, args: ['sidebarTabs', { isSignal: true }] }] } });
|
|
439
|
+
|
|
440
|
+
export { AXPSettingPageComponent };
|
|
441
|
+
//# sourceMappingURL=acorex-platform-module-settings-management-client-setting-page.component-eAaMh3-8.mjs.map
|