@acorex-platform/module-application-management-client 0.0.38 → 0.0.46
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-application-management-client-assign-features.command-cU7MY74u.mjs → acorex-platform-module-application-management-client-assign-features.command-CEuIYheD.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-application-management-client-assign-features.command-cU7MY74u.mjs.map → acorex-platform-module-application-management-client-assign-features.command-CEuIYheD.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-application-management-client-contracts-entities-app-term.mjs +14 -0
- package/fesm2022/acorex-platform-module-application-management-client-contracts-entities-app-term.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-application-management-client-contracts-entities-app-version.mjs +15 -0
- package/fesm2022/acorex-platform-module-application-management-client-contracts-entities-app-version.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-application-management-client-contracts-entities-application.mjs +14 -0
- package/fesm2022/acorex-platform-module-application-management-client-contracts-entities-application.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-application-management-client-contracts-entities-edition.mjs +14 -0
- package/fesm2022/acorex-platform-module-application-management-client-contracts-entities-edition.mjs.map +1 -1
- package/fesm2022/{acorex-platform-module-application-management-client-contracts-entity-catalog-acorex-platform-module-application-management-client-contracts-entity-catalog-joJGmPZP.mjs → acorex-platform-module-application-management-client-contracts-entity-catalog-acorex-platform-module-application-management-client-contracts-entity-catalog-311tpDhr.mjs} +5 -5
- package/fesm2022/{acorex-platform-module-application-management-client-contracts-entity-catalog-acorex-platform-module-application-management-client-contracts-entity-catalog-joJGmPZP.mjs.map → acorex-platform-module-application-management-client-contracts-entity-catalog-acorex-platform-module-application-management-client-contracts-entity-catalog-311tpDhr.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-application-management-client-contracts-entity-catalog-app-term.entity-BfVDQrrt.mjs → acorex-platform-module-application-management-client-contracts-entity-catalog-app-term.entity-DDvm1sOg.mjs} +16 -2
- package/fesm2022/acorex-platform-module-application-management-client-contracts-entity-catalog-app-term.entity-DDvm1sOg.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-application-management-client-contracts-entity-catalog-app-version.entity-BVuFZBZ0.mjs → acorex-platform-module-application-management-client-contracts-entity-catalog-app-version.entity-DjOMTlcp.mjs} +17 -2
- package/fesm2022/acorex-platform-module-application-management-client-contracts-entity-catalog-app-version.entity-DjOMTlcp.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-application-management-client-contracts-entity-catalog-application.entity-BYn6bLjH.mjs → acorex-platform-module-application-management-client-contracts-entity-catalog-application.entity-BWOz1V1N.mjs} +16 -2
- package/fesm2022/acorex-platform-module-application-management-client-contracts-entity-catalog-application.entity-BWOz1V1N.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-application-management-client-contracts-entity-catalog-edition.entity-DOhvvPnU.mjs → acorex-platform-module-application-management-client-contracts-entity-catalog-edition.entity-VjrQsh0t.mjs} +16 -2
- package/fesm2022/acorex-platform-module-application-management-client-contracts-entity-catalog-edition.entity-VjrQsh0t.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-application-management-client-contracts-entity-catalog.mjs +1 -1
- package/fesm2022/acorex-platform-module-application-management-client-contracts.mjs +21 -1
- package/fesm2022/acorex-platform-module-application-management-client-contracts.mjs.map +1 -1
- package/fesm2022/{acorex-platform-module-application-management-client-features-editor.component-D9Tfh0gb.mjs → acorex-platform-module-application-management-client-features-editor.component-Cg1oFhmZ.mjs} +4 -3
- package/fesm2022/acorex-platform-module-application-management-client-features-editor.component-Cg1oFhmZ.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-application-management-client-features-widget-edit.component-B9YJsZFp.mjs → acorex-platform-module-application-management-client-features-widget-edit.component-B_fnVBe5.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-application-management-client-features-widget-edit.component-B9YJsZFp.mjs.map → acorex-platform-module-application-management-client-features-widget-edit.component-B_fnVBe5.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-application-management-client.mjs +88 -57
- package/fesm2022/acorex-platform-module-application-management-client.mjs.map +1 -1
- package/package.json +1 -1
- package/types/acorex-platform-module-application-management-client-contracts.d.ts +15 -4
- package/fesm2022/acorex-platform-module-application-management-client-contracts-entity-catalog-app-term.entity-BfVDQrrt.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-application-management-client-contracts-entity-catalog-app-version.entity-BVuFZBZ0.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-application-management-client-contracts-entity-catalog-application.entity-BYn6bLjH.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-application-management-client-contracts-entity-catalog-edition.entity-DOhvvPnU.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-application-management-client-features-editor.component-D9Tfh0gb.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-module-application-management-client-contracts.mjs","sources":["../../../../libs/modules/application-management/contracts/src/lib/context.definitions.ts","../../../../libs/modules/application-management/contracts/src/features.keys.ts","../../../../libs/modules/application-management/contracts/src/menu.keys.ts","../../../../libs/modules/application-management/contracts/src/permission.keys.ts","../../../../libs/modules/application-management/contracts/src/settings.keys.ts","../../../../libs/modules/application-management/contracts/src/server-commands.ts","../../../../libs/modules/application-management/contracts/src/module-setup.provider.ts","../../../../libs/modules/application-management/contracts/src/industry-pack.constants.ts","../../../../libs/modules/application-management/contracts/src/root-config.ts","../../../../libs/modules/application-management/contracts/src/index.ts","../../../../libs/modules/application-management/contracts/src/acorex-platform-module-application-management-client-contracts.ts"],"sourcesContent":["import type { AXPContextDefinition } from '@acorex-platform/framework-shared/core';\n\n//#region ---- Application context definitions ----\n\nexport const AXM_APPLICATION_CONTEXT_DEFINITIONS: AXPContextDefinition[] = [\n {\n name: 'applicationTitle',\n title: 'Application title',\n description: 'Display name of the active application from the session (title or name).',\n order: 31,\n capabilities: ['ai'],\n },\n];\n\n//#endregion\n","// Management feature removed - module name is used directly as feature key\nexport const AXMApplicationManagementFeatureKeys = {} as const;\n\n","export const AXPApplicationManagementMenuKeys = {\n Root: 'ApplicationManagement:Menu',\n Applications: 'ApplicationManagement:Menu:Applications',\n AppTerms: 'ApplicationManagement:Menu:AppTerms',\n ReleaseNotes: 'ApplicationManagement:Menu:ReleaseNotes',\n HelpRoot: 'ApplicationManagement:Menu:Help',\n HelpReleaseNotes: 'ApplicationManagement:Menu:Help.ReleaseNotes',\n HelpTerms: 'ApplicationManagement:Menu:Help.Terms',\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 */\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 */\nexport const AXMPermissionsKeys = {\n ApplicationManagement: {\n Root: AXPApplicationsPlatformPermissionKeys.MaintainApplications,\n Applications: AXPApplicationsPlatformPermissionKeys.MaintainApplications,\n ReleaseNotes: AXPApplicationsPlatformPermissionKeys.MaintainApplications,\n AppTerms: AXPApplicationsPlatformPermissionKeys.MaintainApplications,\n },\n} as const;\n","//#region ---- Application Info Settings ----\n\nexport enum AXPApplicationInfoSettings {\n // Application Info\n DisplayPattern = 'ApplicationManagement:Setting:ApplicationInfo.DisplayPattern',\n\n // Application Terms\n ApplicationTerms = 'ApplicationManagement:Setting:Startup.ApplicationTerms',\n\n // App Version\n InitVersion = 'ApplicationManagement:Setting:AppVersion.InitVersion',\n\n // Release Notes\n ReleaseNotes = 'ApplicationManagement:Setting:Startup.ReleaseNotes',\n\n /** Last selected edition modules checklist view mode (`type` | `domain`). */\n EditionModulesViewMode = 'ApplicationManagement:Setting:EditionModules.ViewMode',\n}\n\n/**\n * Get the setting key for tracking if a specific version has been seen\n * @param versionNumber The version number to check\n * @returns The setting key for that version\n */\nexport function getAppVersionSeenKey(versionNumber: string): string {\n return `ApplicationManagement:Setting:AppVersion.IsSeen.${versionNumber}`;\n}\n\n//#endregion\n","//#region ----- Application management server commands -----\n\nexport const AXMApplicationManagementServerCommands = {\n SetupTenant: 'ApplicationManagement:Server:SetupTenant',\n} as const;\n\nexport interface AXMSetupTenantInput {\n /** Target tenant id. Required unless `allTenants` is true. */\n tenantId?: string;\n /**\n * When true, run setup for every tenant row (demo seed / ops).\n * Ignores `tenantId`.\n */\n allTenants?: boolean;\n /**\n * When set, only these modules run (must still be subscribed).\n * When omitted, all subscribed modules with registered setup handlers run.\n */\n moduleNames?: string[];\n /**\n * Apply industry starter-pack contributions after module setup.\n * Default true when tenant has `industryId` and matching contributions exist.\n */\n applyStarterPack?: boolean;\n /** Force re-run even when ledger version matches (future use). */\n force?: boolean;\n}\n\nexport interface AXMSetupTenantResult {\n tenantIds: string[];\n modulesRun: string[];\n industryPacksRun: string[];\n}\n\n//#endregion\n","//#region ----- Module setup & industry pack providers -----\n\n/**\n * Context passed to every module setup / industry pack contribution.\n * Handlers must be idempotent (create-if-missing / upsert by stable keys).\n */\nexport interface TenantModuleSetupContext {\n tenantId: string;\n /** Tenant `industryId` when set. */\n industryId?: string;\n /** Resolved `BusinessCore.Industry.code` when available (e.g. `CONSTR`). */\n industryCode?: string;\n /** Modules enabled for this tenant via active subscription → edition. */\n enabledModules: readonly string[];\n /** When true, industry pack contributions may run after module setup. */\n applyStarterPack: boolean;\n}\n\nexport interface ModuleSetupProvider {\n /** Module name matching edition `modulesAndFeatures.modules` (e.g. `ProjectManagement`). */\n moduleName: string;\n /** Other module names that must complete setup first. */\n dependsOn?: readonly string[];\n /**\n * When true, run even if the module is not listed on the tenant's edition\n * (platform core: settings, tenant org defaults, etc.).\n */\n always?: boolean;\n /** Bump when master data shape changes so callers can force re-apply. */\n version?: string;\n /** Source label for diagnostics. */\n layer?: string;\n run(context: TenantModuleSetupContext): Promise<void>;\n}\n\nexport interface IndustryPackContributionProvider {\n /** Industry code from `BusinessCore.Industry.code` (e.g. `CONSTR`). */\n industryCode: string;\n /** Module that owns this contribution; skipped if module is not enabled. */\n moduleName: string;\n dependsOn?: readonly string[];\n version?: string;\n layer?: string;\n run(context: TenantModuleSetupContext): Promise<void>;\n}\n\nexport const MODULE_SETUP_PROVIDER = Symbol('MODULE_SETUP_PROVIDER');\nexport const INDUSTRY_PACK_PROVIDER = Symbol('INDUSTRY_PACK_PROVIDER');\n\n/** Nest `multi: true` registration for a module's tenant setup handler. */\nexport function provideModuleSetup(provider: ModuleSetupProvider) {\n return {\n provide: MODULE_SETUP_PROVIDER,\n useValue: provider,\n multi: true,\n } as const;\n}\n\n/** Nest `multi: true` registration for an industry starter-pack contribution. */\nexport function provideIndustryPackContribution(provider: IndustryPackContributionProvider) {\n return {\n provide: INDUSTRY_PACK_PROVIDER,\n useValue: provider,\n multi: true,\n } as const;\n}\n\n//#endregion\n","//#region ----- Industry pack codes -----\n\n/** Coarse industry codes used by starter packs (`BusinessCore.Industry.code`). */\nexport const AXM_INDUSTRY_PACK_CODES = {\n Construction: 'CONSTR',\n Software: 'SOFTWARE',\n} as const;\n\nexport type AXMIndustryPackCode =\n (typeof AXM_INDUSTRY_PACK_CODES)[keyof typeof AXM_INDUSTRY_PACK_CODES];\n\n//#endregion\n","const config = {\n i18n: 'application-management',\n module: 'ApplicationManagement',\n};\n\nexport const RootConfig = {\n config,\n module: {\n route: 'application-management',\n name: config.module,\n title: `@${config.i18n}:module.title`,\n icon: 'fa-light fa-cogs',\n },\n entities: {\n application: {\n name: 'Application',\n title: `@${config.i18n}:applications.entities.application.title`,\n titlePlural: `@${config.i18n}:applications.entities.application.plural`,\n icon: 'fa-light fa-cube',\n },\n edition: {\n name: 'Edition',\n title: `@${config.i18n}:editions.entities.edition.title`,\n titlePlural: `@${config.i18n}:editions.entities.edition.plural`,\n icon: 'fa-light fa-layer-group',\n },\n appVersion: {\n name: 'AppVersion',\n title: `@${config.i18n}:app-versions.entities.app-version.title`,\n titlePlural: `@${config.i18n}:app-versions.entities.app-version.plural`,\n icon: 'fa-light fa-code-branch',\n },\n appTerm: {\n name: 'AppTerm',\n title: `@${config.i18n}:app-terms.entities.app-term.title`,\n titlePlural: `@${config.i18n}:app-terms.entities.app-term.plural`,\n pageTitle: `@${config.i18n}:app-terms.pages.terms-page.title`,\n pageDescription: `@${config.i18n}:app-terms.pages.terms-page.description`,\n icon: 'fa-light fa-scale-balanced',\n },\n },\n queries: {\n reports: {\n getApplicationVersionsTimeline: `${config.module}:Reports:GetApplicationVersionsTimeline`,\n getApplicationVersionsChartData: `${config.module}:Reports:GetApplicationVersionsChartData`,\n },\n },\n} as const;\n\n// Keep the old export for backward compatibility\nexport const AXMApplicationManagementModuleConst = {\n moduleName: 'ApplicationManagement',\n moduleRoute: 'application-management',\n i18n: 'platform-management',\n} as const;\n","//#region ---- Contracts barrel ----\n\nexport * from './lib/context.definitions';\nexport * from './features.keys';\nexport * from './menu.keys';\nexport * from './permission.keys';\nexport * from './settings.keys';\nexport * from './server-commands';\nexport * from './module-setup.provider';\nexport * from './industry-pack.constants';\n\nexport * from './root-config';\n\n//#endregion\n\nexport * from './entities';\n\n//#region ---- Entity types (for static import in client UI) ----\n\nexport type { AXMAppTermEntityModel, AXMAppTermViewModel } from './entities/app-term/app-term.types';\nexport type { AXMAppVersionEntityModel, AXMAppVersionListComponentModel } from './entities/app-version/app-version.types';\nexport type { AXMApplicationManagementApplicationEntityModel } from './entities/application/application.types';\nexport type { AXMApplicationManagementEditionEntityModel } from './entities/edition/edition.types';\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-application-management-client-contracts.mjs","sources":["../../../../libs/modules/application-management/contracts/src/lib/context.definitions.ts","../../../../libs/modules/application-management/contracts/src/features.keys.ts","../../../../libs/modules/application-management/contracts/src/menu.keys.ts","../../../../libs/modules/application-management/contracts/src/permission.keys.ts","../../../../libs/modules/application-management/contracts/src/settings.keys.ts","../../../../libs/modules/application-management/contracts/src/server-commands.ts","../../../../libs/modules/application-management/contracts/src/module-setup.provider.ts","../../../../libs/modules/application-management/contracts/src/industry-pack.constants.ts","../../../../libs/modules/application-management/contracts/src/root-config.ts","../../../../libs/modules/application-management/contracts/src/manifest.ts","../../../../libs/modules/application-management/contracts/src/index.ts","../../../../libs/modules/application-management/contracts/src/acorex-platform-module-application-management-client-contracts.ts"],"sourcesContent":["import type { AXPContextDefinition } from '@acorex-platform/framework-shared/core';\n\n//#region ---- Application context definitions ----\n\nexport const AXM_APPLICATION_CONTEXT_DEFINITIONS: AXPContextDefinition[] = [\n {\n name: 'applicationTitle',\n title: 'Application title',\n description: 'Display name of the active application from the session (title or name).',\n order: 31,\n capabilities: ['ai'],\n },\n];\n\n//#endregion\n","// Management feature removed - module name is used directly as feature key\nexport const AXMApplicationManagementFeatureKeys = {} as const;\n\n","export const AXPApplicationManagementMenuKeys = {\n Root: 'ApplicationManagement:Menu',\n Applications: 'ApplicationManagement:Menu:Applications',\n AppTerms: 'ApplicationManagement:Menu:AppTerms',\n ReleaseNotes: 'ApplicationManagement:Menu:ReleaseNotes',\n HelpRoot: 'ApplicationManagement:Menu:Help',\n HelpReleaseNotes: 'ApplicationManagement:Menu:Help.ReleaseNotes',\n HelpTerms: 'ApplicationManagement:Menu:Help.Terms',\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 */\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 */\nexport const AXMPermissionsKeys = {\n ApplicationManagement: {\n Root: AXPApplicationsPlatformPermissionKeys.MaintainApplications,\n Applications: AXPApplicationsPlatformPermissionKeys.MaintainApplications,\n ReleaseNotes: AXPApplicationsPlatformPermissionKeys.MaintainApplications,\n AppTerms: AXPApplicationsPlatformPermissionKeys.MaintainApplications,\n },\n} as const;\n","//#region ---- Application Info Settings ----\n\nexport enum AXPApplicationInfoSettings {\n // Application Info\n DisplayPattern = 'ApplicationManagement:Setting:ApplicationInfo.DisplayPattern',\n\n // Application Terms\n ApplicationTerms = 'ApplicationManagement:Setting:Startup.ApplicationTerms',\n\n // App Version\n InitVersion = 'ApplicationManagement:Setting:AppVersion.InitVersion',\n\n // Release Notes\n ReleaseNotes = 'ApplicationManagement:Setting:Startup.ReleaseNotes',\n\n /** Last selected edition modules checklist view mode (`type` | `domain`). */\n EditionModulesViewMode = 'ApplicationManagement:Setting:EditionModules.ViewMode',\n}\n\n/**\n * Get the setting key for tracking if a specific version has been seen\n * @param versionNumber The version number to check\n * @returns The setting key for that version\n */\nexport function getAppVersionSeenKey(versionNumber: string): string {\n return `ApplicationManagement:Setting:AppVersion.IsSeen.${versionNumber}`;\n}\n\n//#endregion\n","//#region ----- Application management server commands -----\n\nexport const AXMApplicationManagementServerCommands = {\n SetupTenant: 'ApplicationManagement:Server:SetupTenant',\n} as const;\n\nexport interface AXMSetupTenantInput {\n /** Target tenant id. Required unless `allTenants` is true. */\n tenantId?: string;\n /**\n * When true, run setup for every tenant row (demo seed / ops).\n * Ignores `tenantId`.\n */\n allTenants?: boolean;\n /**\n * When set, only these modules run (must still be subscribed).\n * When omitted, all subscribed modules with registered setup handlers run.\n */\n moduleNames?: string[];\n /**\n * Apply industry starter-pack contributions after module setup.\n * Default true when tenant has `industryId` and matching contributions exist.\n */\n applyStarterPack?: boolean;\n /** Force re-run even when ledger version matches (future use). */\n force?: boolean;\n}\n\nexport interface AXMSetupTenantResult {\n tenantIds: string[];\n modulesRun: string[];\n industryPacksRun: string[];\n}\n\n//#endregion\n","//#region ----- Module setup & industry pack providers -----\n\n/**\n * Context passed to every module setup / industry pack contribution.\n * Handlers must be idempotent (create-if-missing / upsert by stable keys).\n */\nexport interface TenantModuleSetupContext {\n tenantId: string;\n /** Tenant `industryId` when set. */\n industryId?: string;\n /** Resolved `BusinessCore.Industry.code` when available (e.g. `CONSTR`). */\n industryCode?: string;\n /** Modules enabled for this tenant via active subscription → edition. */\n enabledModules: readonly string[];\n /** When true, industry pack contributions may run after module setup. */\n applyStarterPack: boolean;\n}\n\nexport interface ModuleSetupProvider {\n /** Module name matching edition `modulesAndFeatures.modules` (e.g. `ProjectManagement`). */\n moduleName: string;\n /** Other module names that must complete setup first. */\n dependsOn?: readonly string[];\n /**\n * When true, run even if the module is not listed on the tenant's edition\n * (platform core: settings, tenant org defaults, etc.).\n */\n always?: boolean;\n /** Bump when master data shape changes so callers can force re-apply. */\n version?: string;\n /** Source label for diagnostics. */\n layer?: string;\n run(context: TenantModuleSetupContext): Promise<void>;\n}\n\nexport interface IndustryPackContributionProvider {\n /** Industry code from `BusinessCore.Industry.code` (e.g. `CONSTR`). */\n industryCode: string;\n /** Module that owns this contribution; skipped if module is not enabled. */\n moduleName: string;\n dependsOn?: readonly string[];\n version?: string;\n layer?: string;\n run(context: TenantModuleSetupContext): Promise<void>;\n}\n\nexport const MODULE_SETUP_PROVIDER = Symbol('MODULE_SETUP_PROVIDER');\nexport const INDUSTRY_PACK_PROVIDER = Symbol('INDUSTRY_PACK_PROVIDER');\n\n/** Nest `multi: true` registration for a module's tenant setup handler. */\nexport function provideModuleSetup(provider: ModuleSetupProvider) {\n return {\n provide: MODULE_SETUP_PROVIDER,\n useValue: provider,\n multi: true,\n } as const;\n}\n\n/** Nest `multi: true` registration for an industry starter-pack contribution. */\nexport function provideIndustryPackContribution(provider: IndustryPackContributionProvider) {\n return {\n provide: INDUSTRY_PACK_PROVIDER,\n useValue: provider,\n multi: true,\n } as const;\n}\n\n//#endregion\n","//#region ----- Industry pack codes -----\n\n/** Coarse industry codes used by starter packs (`BusinessCore.Industry.code`). */\nexport const AXM_INDUSTRY_PACK_CODES = {\n Construction: 'CONSTR',\n Software: 'SOFTWARE',\n} as const;\n\nexport type AXMIndustryPackCode =\n (typeof AXM_INDUSTRY_PACK_CODES)[keyof typeof AXM_INDUSTRY_PACK_CODES];\n\n//#endregion\n","const config = {\n i18n: 'application-management',\n module: 'ApplicationManagement',\n};\n\nexport const RootConfig = {\n config,\n module: {\n route: 'application-management',\n name: config.module,\n title: `@${config.i18n}:module.title`,\n icon: 'fa-light fa-cogs',\n },\n entities: {\n application: {\n name: 'Application',\n title: `@${config.i18n}:applications.entities.application.title`,\n titlePlural: `@${config.i18n}:applications.entities.application.plural`,\n icon: 'fa-light fa-cube',\n },\n edition: {\n name: 'Edition',\n title: `@${config.i18n}:editions.entities.edition.title`,\n titlePlural: `@${config.i18n}:editions.entities.edition.plural`,\n icon: 'fa-light fa-layer-group',\n },\n appVersion: {\n name: 'AppVersion',\n title: `@${config.i18n}:app-versions.entities.app-version.title`,\n titlePlural: `@${config.i18n}:app-versions.entities.app-version.plural`,\n icon: 'fa-light fa-code-branch',\n },\n appTerm: {\n name: 'AppTerm',\n title: `@${config.i18n}:app-terms.entities.app-term.title`,\n titlePlural: `@${config.i18n}:app-terms.entities.app-term.plural`,\n pageTitle: `@${config.i18n}:app-terms.pages.terms-page.title`,\n pageDescription: `@${config.i18n}:app-terms.pages.terms-page.description`,\n icon: 'fa-light fa-scale-balanced',\n },\n },\n queries: {\n reports: {\n getApplicationVersionsTimeline: `${config.module}:Reports:GetApplicationVersionsTimeline`,\n getApplicationVersionsChartData: `${config.module}:Reports:GetApplicationVersionsChartData`,\n },\n },\n} as const;\n\n// Keep the old export for backward compatibility\nexport const AXMApplicationManagementModuleConst = {\n moduleName: 'ApplicationManagement',\n moduleRoute: 'application-management',\n i18n: 'platform-management',\n} as const;\n","//#region ---- Imports ----\n\nimport { AXPModuleManifest } from '@acorex-platform/framework-shared/core';\nimport { RootConfig } from './root-config';\n\n//#endregion\n\n//#region ---- Manifest Definition ----\n\n/**\n * Application Management Module Manifest.\n * Defines module metadata, features, and provider references.\n */\nexport const ApplicationManagementManifest: AXPModuleManifest = {\n name: RootConfig.module.name,\n version: '1.0.0',\n title: RootConfig.module.title,\n icon: RootConfig.module.icon,\n i18n: RootConfig.config.i18n,\n type: 'platform',\n domain: 'platform',\n required: true,\n\n // Module dependencies (optional)\n};\n\n//#endregion\n\n","//#region ---- Contracts barrel ----\n\nexport * from './lib/context.definitions';\nexport * from './features.keys';\nexport * from './menu.keys';\nexport * from './permission.keys';\nexport * from './settings.keys';\nexport * from './server-commands';\nexport * from './module-setup.provider';\nexport * from './industry-pack.constants';\n\nexport * from './root-config';\nexport * from './manifest';\n\n//#endregion\n\nexport * from './entities';\n\n//#region ---- Entity types (for static import in client UI) ----\n\nexport type { AXMAppTermEntityModel, AXMAppTermViewModel } from './entities/app-term/app-term.types';\nexport type { AXMAppVersionEntityModel, AXMAppVersionListComponentModel } from './entities/app-version/app-version.types';\nexport type { AXMApplicationManagementApplicationEntityModel } from './entities/application/application.types';\nexport type { AXMApplicationManagementEditionEntityModel } from './entities/edition/edition.types';\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -18,13 +18,14 @@ import { AXButtonGroupModule } from '@acorex/components/button-group';
|
|
|
18
18
|
import { AXButtonModule } from '@acorex/components/button';
|
|
19
19
|
import * as i3 from '@acorex/components/decorators';
|
|
20
20
|
import { AXDecoratorModule } from '@acorex/components/decorators';
|
|
21
|
-
import {
|
|
21
|
+
import { AXPModuleManifestRegistry } from '@acorex-platform/framework-client/core';
|
|
22
22
|
import { AXPSettingsService } from '@acorex-platform/framework-client/common';
|
|
23
|
-
import { AXPPlatformScope } from '@acorex-platform/framework-shared/core';
|
|
23
|
+
import { AXP_MODULE_TYPE, AXP_MODULE_DOMAIN, resolveModuleType, resolveModuleDomain, AXPPlatformScope } from '@acorex-platform/framework-shared/core';
|
|
24
24
|
import * as i7 from '@acorex-platform/framework-client/layout/widget-core';
|
|
25
25
|
import { AXPWidgetCoreModule } from '@acorex-platform/framework-client/layout/widget-core';
|
|
26
26
|
import { AXPApplicationInfoSettings } from '@acorex-platform/module-application-management-client/contracts';
|
|
27
27
|
|
|
28
|
+
//#region ----- Imports -----
|
|
28
29
|
//#endregion
|
|
29
30
|
//#region ----- Constants -----
|
|
30
31
|
const I18N = '@application-management:editions.modules-editor';
|
|
@@ -582,4 +583,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
582
583
|
}], propDecorators: { initialValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "initialValue", required: false }] }], readOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readOnly", required: false }] }], valueChanged: [{ type: i0.Output, args: ["valueChanged"] }] } });
|
|
583
584
|
|
|
584
585
|
export { AXPFeaturesEditorComponent as A };
|
|
585
|
-
//# sourceMappingURL=acorex-platform-module-application-management-client-features-editor.component-
|
|
586
|
+
//# sourceMappingURL=acorex-platform-module-application-management-client-features-editor.component-Cg1oFhmZ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-application-management-client-features-editor.component-Cg1oFhmZ.mjs","sources":["../../../../libs/modules/application-management/client/src/lib/features/features-widget/features-editor.component.ts","../../../../libs/modules/application-management/client/src/lib/features/features-widget/features-editor.component.html"],"sourcesContent":["//#region ----- Imports -----\n\nimport {\n Component,\n ViewEncapsulation,\n computed,\n inject,\n signal,\n input,\n output,\n OnInit,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { AXFormModule } from '@acorex/components/form';\nimport { AXCheckBoxModule } from '@acorex/components/check-box';\nimport { AXLabelModule } from '@acorex/components/label';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { AXTooltipModule } from '@acorex/components/tooltip';\nimport { AXSearchBoxModule } from '@acorex/components/search-box';\nimport { AXButtonGroupModule } from '@acorex/components/button-group';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXValueChangedEvent } from '@acorex/cdk/common';\nimport {\n AXPModuleFeatureDefinition,\n AXPModuleManifestRegistry,\n} from '@acorex-platform/framework-client/core';\nimport { AXPSettingsService } from '@acorex-platform/framework-client/common';\nimport {\n AXP_MODULE_DOMAIN,\n AXP_MODULE_TYPE,\n AXPPlatformScope,\n resolveModuleDomain,\n resolveModuleType,\n type AXPModuleManifest,\n type AXPModuleType,\n type AXPWidgetNode,\n} from '@acorex-platform/framework-shared/core';\nimport { AXPWidgetCoreModule } from '@acorex-platform/framework-client/layout/widget-core';\nimport { AXPApplicationInfoSettings } from '@acorex-platform/module-application-management-client/contracts';\n\n//#endregion\n\n//#region ----- Types -----\n\ntype EditionModulesViewMode = 'type' | 'domain';\n\ntype ModuleListItem = AXPModuleManifest & {\n translatedTitle?: string;\n translatedDescription?: string;\n featureSearchText?: string;\n};\n\ntype ModuleGroupView = {\n id: string;\n titleKey: string;\n modules: ModuleListItem[];\n};\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst I18N = '@application-management:editions.modules-editor';\n\nconst TYPE_ORDER: AXPModuleType[] = [\n AXP_MODULE_TYPE.platform,\n AXP_MODULE_TYPE.domain,\n AXP_MODULE_TYPE.integration,\n];\n\nconst DOMAIN_ORDER: string[] = [\n AXP_MODULE_DOMAIN.platform,\n AXP_MODULE_DOMAIN.humanCapital,\n AXP_MODULE_DOMAIN.projectManagement,\n AXP_MODULE_DOMAIN.assetMaintenance,\n AXP_MODULE_DOMAIN.workplaceSafety,\n AXP_MODULE_DOMAIN.assessmentLearning,\n AXP_MODULE_DOMAIN.financeCommerce,\n AXP_MODULE_DOMAIN.customerSupplier,\n AXP_MODULE_DOMAIN.communication,\n AXP_MODULE_DOMAIN.ai,\n AXP_MODULE_DOMAIN.contentDocuments,\n AXP_MODULE_DOMAIN.data,\n AXP_MODULE_DOMAIN.operations,\n AXP_MODULE_DOMAIN.weather,\n AXP_MODULE_DOMAIN.sourceControl,\n AXP_MODULE_DOMAIN.general,\n];\n\n//#endregion\n\n//#region ----- Features Editor Component -----\n\n@Component({\n selector: 'axm-features-editor',\n templateUrl: './features-editor.component.html',\n styleUrl: './features-editor.component.css',\n imports: [\n CommonModule,\n FormsModule,\n AXFormModule,\n AXCheckBoxModule,\n AXLabelModule,\n AXTranslationModule,\n AXTooltipModule,\n AXSearchBoxModule,\n AXButtonGroupModule,\n AXButtonModule,\n AXDecoratorModule,\n AXPWidgetCoreModule,\n ],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.Eager,\n host: {\n class: 'axm-features-editor flex flex-col w-full min-h-0',\n },\n})\nexport class AXPFeaturesEditorComponent implements OnInit {\n //#region ----- Services & Dependencies -----\n\n private readonly manifestRegistry = inject(AXPModuleManifestRegistry);\n private readonly translationService = inject(AXTranslationService);\n private readonly settingsService = inject(AXPSettingsService);\n\n //#endregion\n\n //#region ----- Inputs / Outputs -----\n\n /** Initial value: { modules: string[], features: Record<string, any> } */\n initialValue = input<{ modules?: string[]; features?: Record<string, any> }>({});\n\n /** Whether the editor is in read-only mode */\n readOnly = input<boolean>(false);\n\n /** Event emitted when modules/features selection/values change */\n valueChanged = output<{ modules: string[]; features: Record<string, any> }>();\n\n //#endregion\n\n //#region ----- State Signals -----\n\n protected readonly i18n = I18N;\n\n protected readonly searchTerm = signal('');\n\n protected readonly viewMode = signal<EditionModulesViewMode>('type');\n\n /** All available module manifests with translated titles */\n private readonly allModules = signal<ModuleListItem[]>([]);\n\n /** Selected module names */\n protected readonly selectedModules = signal<Set<string>>(new Set());\n\n /** Expanded module names */\n protected readonly expandedModules = signal<Set<string>>(new Set());\n\n /** Expanded feature full names */\n protected readonly expandedFeatures = signal<Set<string>>(new Set());\n\n /** Map of feature values: Record<featureName, featureValue> */\n protected readonly featureValues = signal<Record<string, any>>({});\n\n /** Cache for widget nodes to prevent re-creation and blinking */\n private readonly widgetNodeCache = new Map<string, AXPWidgetNode>();\n\n /** Cache for feature data to prevent re-computation */\n private readonly moduleFeaturesCache = new Map<\n string,\n Array<{\n key: string;\n fullName: string;\n definition: AXPModuleFeatureDefinition;\n isEnabled: boolean;\n widgetNode: AXPWidgetNode | null;\n }>\n >();\n\n /** Set of modules that are currently loading features */\n private readonly loadingFeatures = signal<Set<string>>(new Set());\n\n /** Signal to trigger change detection when features are loaded */\n private readonly featuresLoaded = signal<number>(0);\n\n //#endregion\n\n //#region ----- Computed Properties -----\n\n /** Required module names (always enabled, cannot be disabled) */\n protected readonly requiredModules = computed(() => {\n return new Set(this.allModules().filter((m) => m.required === true).map((m) => m.name));\n });\n\n /** Modules that are dependencies of selected modules (auto-selected and disabled) */\n protected readonly dependencyModules = computed(() => {\n const selected = this.selectedModules();\n const allManifests = this.manifestRegistry.getAll();\n const dependencySet = new Set<string>();\n\n for (const manifest of allManifests) {\n if (selected.has(manifest.name) && manifest.dependencies) {\n for (const dep of manifest.dependencies) {\n if (!dep.includes('.')) {\n dependencySet.add(dep);\n }\n }\n }\n }\n\n return dependencySet;\n });\n\n /** Always-available (required) modules matching the current search */\n protected readonly alwaysAvailableModules = computed(() => {\n return this.sortModules(\n this.allModules().filter((m) => m.required === true && this.matchesSearch(m)),\n );\n });\n\n /** Grouped non-required modules for the active view mode */\n protected readonly moduleGroups = computed((): ModuleGroupView[] => {\n const modules = this.sortModules(\n this.allModules().filter((m) => m.required !== true && this.matchesSearch(m)),\n );\n\n if (this.viewMode() === 'type') {\n return this.groupByType(modules);\n }\n return this.groupByDomain(modules);\n });\n\n protected readonly hasVisibleModules = computed(() => {\n return this.alwaysAvailableModules().length > 0 || this.moduleGroups().some((g) => g.modules.length > 0);\n });\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n ngOnInit() {\n // Sync paint only — never await settings/i18n/initialize on the critical path\n // (settings.get can hang on session ready and previously left the UI stuck).\n const manifests = this.manifestRegistry.getAll();\n this.allModules.set(\n manifests.map((manifest) => ({\n ...manifest,\n translatedTitle: manifest.title,\n translatedDescription: manifest.description || '',\n featureSearchText: '',\n })),\n );\n\n const initialValue = this.initialValue();\n const initialModules = new Set<string>(initialValue.modules || []);\n\n if (initialValue.features) {\n for (const featureKey of Object.keys(initialValue.features)) {\n const [moduleName] = featureKey.split(':');\n if (moduleName) {\n initialModules.add(moduleName);\n }\n }\n }\n\n this.requiredModules().forEach((moduleName) => {\n initialModules.add(moduleName);\n });\n\n this.ensureDependencies(initialModules);\n this.selectedModules.set(initialModules);\n\n if (initialValue.features) {\n this.featureValues.set(initialValue.features);\n }\n\n this.widgetNodeCache.clear();\n this.moduleFeaturesCache.clear();\n\n // Prefer sync cache — scoped get() can block on session/scope load.\n const cachedViewMode = this.settingsService.peekCached(\n AXPApplicationInfoSettings.EditionModulesViewMode,\n );\n if (cachedViewMode === 'type' || cachedViewMode === 'domain') {\n this.viewMode.set(cachedViewMode);\n }\n\n void this.hydrateAsync();\n }\n\n private async hydrateAsync(): Promise<void> {\n try {\n if (this.allModules().length === 0) {\n await this.manifestRegistry.initialize();\n const manifests = this.manifestRegistry.getAll();\n this.allModules.set(\n manifests.map((manifest) => ({\n ...manifest,\n translatedTitle: manifest.title,\n translatedDescription: manifest.description || '',\n featureSearchText: '',\n })),\n );\n this.requiredModules().forEach((moduleName) => {\n const selected = new Set(this.selectedModules());\n selected.add(moduleName);\n this.ensureDependencies(selected);\n this.selectedModules.set(selected);\n });\n }\n\n const modules = this.allModules();\n const enriched = await Promise.all(\n modules.map(async (module) => {\n let translatedTitle = module.title;\n try {\n translatedTitle =\n (await this.translationService.translateAsync(module.title)) || module.title;\n } catch {\n // keep raw title\n }\n return {\n ...module,\n translatedTitle,\n } satisfies ModuleListItem;\n }),\n );\n this.allModules.set(enriched);\n } catch (error) {\n console.warn('Features editor background hydrate failed', error);\n }\n }\n\n //#endregion\n\n //#region ----- Grouping & Search -----\n\n private matchesSearch(module: ModuleListItem): boolean {\n const term = String(this.searchTerm() ?? '')\n .trim()\n .toLowerCase();\n if (!term) {\n return true;\n }\n\n const haystack = [\n module.translatedTitle,\n module.translatedDescription,\n module.title,\n module.description,\n module.name,\n module.featureSearchText,\n ]\n .filter(Boolean)\n .join(' ')\n .toLowerCase();\n\n return haystack.includes(term);\n }\n\n private sortModules(modules: ModuleListItem[]): ModuleListItem[] {\n return [...modules].sort((a, b) => {\n const titleA = a.translatedTitle || a.title || '';\n const titleB = b.translatedTitle || b.title || '';\n return titleA.localeCompare(titleB, undefined, { sensitivity: 'base' });\n });\n }\n\n private groupByType(modules: ModuleListItem[]): ModuleGroupView[] {\n const buckets = new Map<AXPModuleType, ModuleListItem[]>();\n for (const type of TYPE_ORDER) {\n buckets.set(type, []);\n }\n\n for (const module of modules) {\n const type = resolveModuleType(module);\n const list = buckets.get(type) ?? [];\n list.push(module);\n buckets.set(type, list);\n }\n\n return TYPE_ORDER.filter((type) => (buckets.get(type)?.length ?? 0) > 0).map((type) => ({\n id: `type:${type}`,\n titleKey: `${I18N}.types.${type}`,\n modules: buckets.get(type) ?? [],\n }));\n }\n\n private groupByDomain(modules: ModuleListItem[]): ModuleGroupView[] {\n const buckets = new Map<string, ModuleListItem[]>();\n\n for (const module of modules) {\n const domain = resolveModuleDomain(module);\n const list = buckets.get(domain) ?? [];\n list.push(module);\n buckets.set(domain, list);\n }\n\n const known = DOMAIN_ORDER.filter((domain) => (buckets.get(domain)?.length ?? 0) > 0);\n const extra = [...buckets.keys()]\n .filter((domain) => !DOMAIN_ORDER.includes(domain))\n .sort((a, b) => a.localeCompare(b));\n\n return [...known, ...extra].map((domain) => ({\n id: `domain:${domain}`,\n titleKey: `${I18N}.domains.${domain}`,\n modules: buckets.get(domain) ?? [],\n }));\n }\n\n //#endregion\n\n //#region ----- Public API -----\n\n public getValue(): { modules: string[]; features: Record<string, any> } {\n return {\n modules: Array.from(this.selectedModules()),\n features: this.featureValues(),\n };\n }\n\n public setValue(value: { modules?: string[]; features?: Record<string, any> }): void {\n if (value.modules) {\n this.selectedModules.set(new Set(value.modules));\n }\n if (value.features) {\n this.featureValues.set(value.features);\n }\n this.emitValueChanged();\n }\n\n //#endregion\n\n //#region ----- Data Loading -----\n\n private createWidgetNode(definition: AXPModuleFeatureDefinition, fullName: string): AXPWidgetNode | null {\n if (!definition.interface) {\n return null;\n }\n\n const currentValue = this.featureValues()[fullName];\n const defaultValue =\n currentValue !== undefined && currentValue !== null ? currentValue : definition.defaultValue;\n\n let widgetNode = this.widgetNodeCache.get(fullName);\n\n if (!widgetNode) {\n widgetNode = {\n type: definition.interface.type,\n name: fullName,\n defaultValue: defaultValue,\n options: definition.interface.options || {},\n };\n this.widgetNodeCache.set(fullName, widgetNode);\n } else if (widgetNode.defaultValue !== defaultValue) {\n widgetNode.defaultValue = defaultValue;\n }\n\n return widgetNode;\n }\n\n private emitValueChanged(): void {\n this.valueChanged.emit(this.getValue());\n }\n\n private ensureDependencies(modules: Set<string>): void {\n const allManifests = this.manifestRegistry.getAll();\n let changed = true;\n\n while (changed) {\n changed = false;\n for (const manifest of allManifests) {\n if (modules.has(manifest.name) && manifest.dependencies) {\n for (const dep of manifest.dependencies) {\n if (!dep.includes('.') && !modules.has(dep)) {\n modules.add(dep);\n changed = true;\n }\n }\n }\n }\n }\n }\n\n protected getModuleFeatures(module: AXPModuleManifest): Array<{\n key: string;\n fullName: string;\n definition: AXPModuleFeatureDefinition;\n isEnabled: boolean;\n widgetNode: AXPWidgetNode | null;\n }> {\n this.featuresLoaded();\n\n const moduleFeatures = this.manifestRegistry.getModuleFeatures(module.name);\n if (moduleFeatures.length === 0) {\n return [];\n }\n\n const cacheKey = module.name;\n const currentValues = this.featureValues();\n const cached = this.moduleFeaturesCache.get(cacheKey);\n if (cached) {\n cached.forEach((feature) => {\n const currentValue = currentValues[feature.fullName];\n feature.isEnabled = currentValue !== undefined && currentValue !== null;\n\n if (feature.widgetNode) {\n const newDefaultValue =\n currentValue !== undefined && currentValue !== null\n ? currentValue\n : feature.definition.defaultValue;\n if (feature.widgetNode.defaultValue !== newDefaultValue) {\n feature.widgetNode.defaultValue = newDefaultValue;\n }\n }\n });\n return cached;\n }\n\n const features = moduleFeatures.map((featureDef) => {\n const fullName = featureDef.name;\n const shortKey = featureDef.key;\n const currentValue = currentValues[fullName];\n const isEnabled = currentValue !== undefined && currentValue !== null;\n const widgetNode = this.createWidgetNode(featureDef, fullName);\n\n return {\n key: shortKey,\n fullName,\n definition: featureDef,\n isEnabled,\n widgetNode,\n };\n });\n\n this.moduleFeaturesCache.set(cacheKey, features);\n return features;\n }\n\n private async loadModuleFeatures(module: AXPModuleManifest): Promise<void> {\n try {\n this.moduleFeaturesCache.delete(module.name);\n this.featuresLoaded.update((v) => v + 1);\n } finally {\n this.loadingFeatures.update((set) => {\n const newSet = new Set(set);\n newSet.delete(module.name);\n return newSet;\n });\n }\n }\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n protected onSearchTermChange(value: string | null | undefined): void {\n this.searchTerm.set(String(value ?? ''));\n }\n\n protected onViewModeChange(mode: EditionModulesViewMode): void {\n if (this.viewMode() === mode) {\n return;\n }\n this.viewMode.set(mode);\n // Fire-and-forget; do not block UI if scope load is slow.\n void this.settingsService\n .scope(AXPPlatformScope.User)\n .set(AXPApplicationInfoSettings.EditionModulesViewMode, mode)\n .catch((error) => {\n console.warn('Failed to persist edition modules view mode', error);\n });\n }\n\n protected toggleModule(module: AXPModuleManifest): void {\n const moduleName = module.name;\n const expanded = new Set(this.expandedModules());\n if (expanded.has(moduleName)) {\n expanded.delete(moduleName);\n } else {\n expanded.add(moduleName);\n if (!this.loadingFeatures().has(moduleName)) {\n this.loadingFeatures.update((set) => new Set(set).add(moduleName));\n this.loadModuleFeatures(module).catch((error) => {\n console.error(`Failed to refresh features for module ${moduleName}:`, error);\n });\n }\n }\n this.expandedModules.set(expanded);\n }\n\n protected toggleFeature(fullName: string): void {\n const expanded = new Set(this.expandedFeatures());\n if (expanded.has(fullName)) {\n expanded.delete(fullName);\n } else {\n expanded.add(fullName);\n }\n this.expandedFeatures.set(expanded);\n }\n\n protected isModuleExpanded(moduleName: string): boolean {\n return this.expandedModules().has(moduleName);\n }\n\n protected isFeatureExpanded(fullName: string): boolean {\n return this.expandedFeatures().has(fullName);\n }\n\n protected isModuleSelected(moduleName: string): boolean {\n if (this.selectedModules().has(moduleName)) {\n return true;\n }\n const featureValue = this.featureValues()[moduleName];\n return featureValue !== undefined && featureValue !== null;\n }\n\n protected isModuleRequired(moduleName: string): boolean {\n return this.requiredModules().has(moduleName);\n }\n\n protected isModuleDependency(moduleName: string): boolean {\n return this.dependencyModules().has(moduleName);\n }\n\n protected isModuleDisabled(moduleName: string): boolean {\n return this.isModuleRequired(moduleName) || this.isModuleDependency(moduleName);\n }\n\n protected canEnableModule(moduleName: string): boolean {\n const manifest = this.manifestRegistry.get(moduleName);\n if (!manifest?.dependencies || manifest.dependencies.length === 0) {\n return true;\n }\n\n const selected = this.selectedModules();\n const moduleDeps = manifest.dependencies.filter((dep) => !dep.includes('.'));\n return moduleDeps.every((dep) => selected.has(dep));\n }\n\n protected getMissingDependencies(moduleName: string): string[] {\n const manifest = this.manifestRegistry.get(moduleName);\n if (!manifest?.dependencies || manifest.dependencies.length === 0) {\n return [];\n }\n\n const selected = this.selectedModules();\n const moduleDeps = manifest.dependencies.filter((dep) => !dep.includes('.'));\n return moduleDeps.filter((dep) => !selected.has(dep));\n }\n\n protected getDependentModules(moduleName: string): string[] {\n const allManifests = this.manifestRegistry.getAll();\n return allManifests.filter((m) => m.dependencies?.includes(moduleName)).map((m) => m.name);\n }\n\n protected getModuleIcon(module: AXPModuleManifest): string {\n return module.icon || 'fa-light fa-cube';\n }\n\n protected hasModuleFeatures(module: AXPModuleManifest): boolean {\n return this.manifestRegistry.getModuleFeatures(module.name).length > 0;\n }\n\n protected onModuleToggle(module: AXPModuleManifest, event: AXValueChangedEvent): void {\n if (this.readOnly() || this.isModuleDisabled(module.name)) {\n return;\n }\n\n const selectedModules = new Set(this.selectedModules());\n const currentValues = { ...this.featureValues() };\n\n if (event.value) {\n selectedModules.add(module.name);\n currentValues[module.name] = true;\n this.ensureDependencies(selectedModules);\n\n if (!this.loadingFeatures().has(module.name)) {\n setTimeout(() => {\n this.loadingFeatures.update((set) => new Set(set).add(module.name));\n this.loadModuleFeatures(module).catch((error) => {\n console.error(`Failed to refresh features for module ${module.name}:`, error);\n this.loadingFeatures.update((set) => {\n const newSet = new Set(set);\n newSet.delete(module.name);\n return newSet;\n });\n });\n }, 0);\n }\n } else {\n const dependentModules = this.getDependentModules(module.name);\n const hasSelectedDependents = dependentModules.some((dep) => selectedModules.has(dep));\n\n if (hasSelectedDependents) {\n return;\n }\n\n selectedModules.delete(module.name);\n delete currentValues[module.name];\n }\n\n this.selectedModules.set(selectedModules);\n this.featureValues.set(currentValues);\n this.emitValueChanged();\n }\n\n protected onFeatureToggle(\n feature: {\n fullName: string;\n definition: AXPModuleFeatureDefinition;\n widgetNode: AXPWidgetNode | null;\n },\n event: AXValueChangedEvent,\n ): void {\n if (this.readOnly()) {\n return;\n }\n\n const currentValues = { ...this.featureValues() };\n\n if (event.value) {\n if (currentValues[feature.fullName] === undefined || currentValues[feature.fullName] === null) {\n currentValues[feature.fullName] =\n feature.definition.type === 'boolean' ? true : feature.definition.defaultValue;\n }\n } else {\n delete currentValues[feature.fullName];\n }\n\n this.featureValues.set(currentValues);\n this.emitValueChanged();\n }\n\n protected onFeatureValueChange(featureFullName: string, value: any): void {\n if (this.readOnly()) {\n return;\n }\n\n const currentValues = { ...this.featureValues() };\n currentValues[featureFullName] = value;\n this.featureValues.set(currentValues);\n this.emitValueChanged();\n }\n\n //#endregion\n}\n\n//#endregion\n","<!-- ----- Toolbar: search + view mode ----- -->\n<div class=\"axm-features-editor__toolbar\">\n <ax-search-box\n class=\"flex-1 min-w-[12rem]\"\n look=\"outline\"\n [placeholder]=\"(i18n + '.search-placeholder' | translate | async) || ''\"\n [ngModel]=\"searchTerm()\"\n [delayTime]=\"300\"\n (ngModelChange)=\"onSearchTermChange($event)\">\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n\n <ax-button-group selection=\"single\" look=\"outline\" class=\"shrink-0\">\n <ax-button-group-item\n [text]=\"(i18n + '.view-mode.type' | translate | async) ?? ''\"\n [selected]=\"viewMode() === 'type'\"\n [data]=\"'type'\"\n (onClick)=\"onViewModeChange('type')\">\n </ax-button-group-item>\n <ax-button-group-item\n [text]=\"(i18n + '.view-mode.domain' | translate | async) ?? ''\"\n [selected]=\"viewMode() === 'domain'\"\n [data]=\"'domain'\"\n (onClick)=\"onViewModeChange('domain')\">\n </ax-button-group-item>\n </ax-button-group>\n</div>\n\n<!-- ----- Module groups list ----- -->\n<div class=\"axm-features-editor__list overflow-auto\">\n <!--->\n <!-- ----- Empty search / filter result ----- -->\n @if (!hasVisibleModules()) {\n <div class=\"text-sm text-muted py-6 text-center\">\n {{ i18n + '.empty' | translate | async }}\n </div>\n }\n <!-- ----- Grouped modules with Always Available pinned first ----- -->\n @else {\n <!--->\n <!-- ----- Always available (required) modules ----- -->\n @if (alwaysAvailableModules().length > 0) {\n <section class=\"axm-features-editor__group\">\n <div class=\"axm-features-editor__group-title\">\n {{ i18n + '.always-available' | translate | async }}\n </div>\n <div class=\"flex flex-col gap-2\">\n @for (module of alwaysAvailableModules(); track module.name) {\n <ng-container *ngTemplateOutlet=\"moduleTemplate; context: { $implicit: module, level: 0 }\">\n </ng-container>\n }\n </div>\n </section>\n }\n\n @for (group of moduleGroups(); track group.id) {\n <section class=\"axm-features-editor__group\">\n <div class=\"axm-features-editor__group-title\">\n {{ group.titleKey | translate | async }}\n </div>\n <div class=\"flex flex-col gap-2\">\n @for (module of group.modules; track module.name) {\n <ng-container *ngTemplateOutlet=\"moduleTemplate; context: { $implicit: module, level: 0 }\">\n </ng-container>\n }\n </div>\n </section>\n }\n }\n</div>\n\n<!-- ----- Module row template ----- -->\n<ng-template #moduleTemplate let-module let-level=\"level\">\n <div class=\"flex flex-col\">\n <!-- ----- Module checkbox row ----- -->\n <div class=\"flex items-center gap-3 rounded hover:bg-surface-lowest\" [style.padding-left.px]=\"level * 32\">\n <span class=\"w-4\"></span>\n\n <ax-check-box\n [ngModel]=\"isModuleSelected(module.name)\"\n [readonly]=\"readOnly() || isModuleDisabled(module.name)\"\n [class.opacity-50]=\"isModuleDependency(module.name) && !isModuleRequired(module.name)\"\n (onValueChanged)=\"onModuleToggle(module, $event)\"\n (click)=\"$event.stopPropagation()\">\n </ax-check-box>\n\n <i [class]=\"getModuleIcon(module) + ' text-primary fa-fw'\"></i>\n\n <span class=\"flex-1 font-semibold\">{{ module.title | translate | async }}</span>\n\n <!--->\n <!-- ----- Required badge ----- -->\n @if (isModuleRequired(module.name)) {\n <span class=\"text-xs text-primary font-medium\">\n ({{ i18n + '.badges.required' | translate | async }})\n </span>\n }\n\n <!--->\n <!-- ----- Dependency badge ----- -->\n @if (isModuleDependency(module.name) && !isModuleRequired(module.name)) {\n <span class=\"text-xs text-secondary font-medium\">\n ({{ i18n + '.badges.dependency' | translate | async }})\n </span>\n }\n </div>\n\n <!--->\n <!-- ----- Nested features when module selected ----- -->\n @if (isModuleSelected(module.name) && hasModuleFeatures(module)) {\n <div class=\"flex flex-col gap-3 py-4 px-3\">\n @for (feature of getModuleFeatures(module); track feature.fullName) {\n <ng-container\n *ngTemplateOutlet=\"featureTemplate; context: { $implicit: feature, module: module, level: level + 1 }\">\n </ng-container>\n }\n </div>\n }\n </div>\n</ng-template>\n\n<!-- ----- Feature row template ----- -->\n<ng-template #featureTemplate let-feature let-module=\"module\" let-level=\"level\">\n <div class=\"flex flex-col\">\n <div class=\"flex items-start gap-3 rounded hover:bg-surface-lowest\" [style.padding-left.px]=\"level * 32\">\n <span class=\"w-4\"></span>\n\n <ax-check-box\n [ngModel]=\"feature.isEnabled\"\n [readonly]=\"readOnly()\"\n (onValueChanged)=\"onFeatureToggle(feature, $event)\"\n (click)=\"$event.stopPropagation()\">\n </ax-check-box>\n\n <div class=\"flex flex-col flex-1 gap-1.5\">\n <div class=\"flex items-center gap-2\">\n <i class=\"fa-light fa-toggle-on text-secondary\"></i>\n <span class=\"font-semibold\">{{ feature.definition.title | translate | async }}</span>\n </div>\n\n <!--->\n <!-- ----- Feature description ----- -->\n @if (feature.definition.description) {\n <div class=\"text-sm text-muted ms-6 leading-relaxed\">\n {{ feature.definition.description | translate | async }}\n </div>\n }\n\n <!--->\n <!-- ----- Feature config widget ----- -->\n @if (feature.isEnabled && feature.widgetNode) {\n <div class=\"mt-3 ms-6 ax-sm\">\n <ng-container\n axp-widget-renderer\n [node]=\"feature.widgetNode\"\n [mode]=\"readOnly() ? 'view' : 'edit'\"\n (onValueChanged)=\"onFeatureValueChange(feature.fullName, $event.widget.getValue())\">\n </ng-container>\n </div>\n }\n </div>\n </div>\n </div>\n</ng-template>\n"],"names":["i3","i6","i8"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AXPValueWidgetComponent } from '@acorex-platform/framework-client/layout/widget-core';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
3
|
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
|
4
|
-
import { A as AXPFeaturesEditorComponent } from './acorex-platform-module-application-management-client-features-editor.component-
|
|
4
|
+
import { A as AXPFeaturesEditorComponent } from './acorex-platform-module-application-management-client-features-editor.component-Cg1oFhmZ.mjs';
|
|
5
5
|
|
|
6
6
|
class AXPModuleFeatureEditorWidgetEditComponent extends AXPValueWidgetComponent {
|
|
7
7
|
// #region ---------------- UI Handlers ----------------
|
|
@@ -39,4 +39,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
39
39
|
}] });
|
|
40
40
|
|
|
41
41
|
export { AXPModuleFeatureEditorWidgetEditComponent };
|
|
42
|
-
//# sourceMappingURL=acorex-platform-module-application-management-client-features-widget-edit.component-
|
|
42
|
+
//# sourceMappingURL=acorex-platform-module-application-management-client-features-widget-edit.component-B_fnVBe5.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-module-application-management-client-features-widget-edit.component-
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-application-management-client-features-widget-edit.component-B_fnVBe5.mjs","sources":["../../../../libs/modules/application-management/client/src/lib/features/features-widget/features-widget-edit.component.ts"],"sourcesContent":["import { AXPValueWidgetComponent } from '@acorex-platform/framework-client/layout/widget-core';\n\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { AXPFeaturesEditorComponent } from './features-editor.component';\n\n@Component({\n template: `\n <axm-features-editor\n [initialValue]=\"getValue() || {}\"\n [readOnly]=\"false\"\n (valueChanged)=\"onEditorValueChanged($event)\">\n </axm-features-editor>\n `,\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n AXPFeaturesEditorComponent\n]\n})\nexport class AXPModuleFeatureEditorWidgetEditComponent extends AXPValueWidgetComponent<{ modules: string[]; features: Record<string, any> }> {\n\n // #region ---------------- UI Handlers ----------------\n\n /**\n * Handles value changes from the editor.\n */\n protected onEditorValueChanged(value: { modules: string[]; features: Record<string, any> }): void {\n this.setValue(value);\n }\n // #endregion\n\n}\n\n"],"names":[],"mappings":";;;;;AAmBM,MAAO,yCAA0C,SAAQ,uBAA6E,CAAA;;AAI1I;;AAEG;AACO,IAAA,oBAAoB,CAAC,KAA2D,EAAA;AACxF,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;IACtB;8GATW,yCAAyC,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yCAAyC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAb1C;;;;;;AAMT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAIC,0BAA0B,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAGjB,yCAAyC,EAAA,UAAA,EAAA,CAAA;kBAdrD,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE;;;;;;AAMT,EAAA,CAAA;AACD,oBAAA,UAAU,EAAE,IAAI;oBAChB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,OAAO,EAAE;wBACP;AACH;AACA,iBAAA;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AXPSettingsService, AXP_APP_VERSION_PROVIDER, AXPPlatformBrandingService, AXP_PLATFORM_BRANDING_SETTING_KEYS, AXP_EXPERIENCE_SETTINGS_GROUP, AXP_EXPERIENCE_SETTINGS_SECTIONS, AXPSearchCommandProvider, createEntityCommandOptions, AXPNavBarSlotComponent, AXP_SETTING_DEFINITION_PROVIDER, AXP_SEARCH_PROVIDER, AXP_STATUS_PROVIDERS, AXP_MENU_PROVIDER } from '@acorex-platform/framework-client/common';
|
|
2
2
|
import * as i2$2 from '@acorex-platform/framework-client/core';
|
|
3
|
-
import { objectKeyValueTransforms, AXPAppStartUpService, AXP_APP_STARTUP_PRIORITY, AXPComponentSlotModule,
|
|
3
|
+
import { objectKeyValueTransforms, AXPAppStartUpService, AXP_APP_STARTUP_PRIORITY, AXPComponentSlotModule, AXP_CONTEXT_DEFINITION_PROVIDER, provideLazyProvider, AXP_FEATURE_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/core';
|
|
4
4
|
import { AXPSessionService, AXP_PERMISSION_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/auth';
|
|
5
5
|
import { AXPEntityService, AXP_ENTITY_CONFIG_TOKEN } from '@acorex-platform/framework-client/layout/entity';
|
|
6
6
|
import { AXPCommandService, provideCommandSetups } from '@acorex-platform/framework-client/runtime';
|
|
@@ -157,6 +157,10 @@ class AXMShowReleaseNotesCommand {
|
|
|
157
157
|
const comp = (await Promise.resolve().then(function () { return listVersion_component; })).AXMListVersionComponent;
|
|
158
158
|
await this.popupService.open(comp, {
|
|
159
159
|
title: await this.translateService.translateAsync('@application-management:application-info.menus.release-notes.title'),
|
|
160
|
+
size: 'md',
|
|
161
|
+
closeButton: true,
|
|
162
|
+
closeOnBackdropClick: true,
|
|
163
|
+
draggable: false,
|
|
160
164
|
});
|
|
161
165
|
return { success: true, kind: 'object', data: undefined };
|
|
162
166
|
}
|
|
@@ -192,16 +196,26 @@ const axmShowReleaseNotesCommandDefinition = defineCommand({
|
|
|
192
196
|
categories: [AXP_COMMAND_DEFINITION_CATEGORY_PLATFORM],
|
|
193
197
|
});
|
|
194
198
|
|
|
199
|
+
//#region ----- Imports -----
|
|
200
|
+
//#endregion
|
|
201
|
+
//#region ----- Component -----
|
|
195
202
|
class AXMNotifyAppVersionComponent extends AXBasePageComponent {
|
|
196
203
|
constructor() {
|
|
197
204
|
super(...arguments);
|
|
198
|
-
|
|
205
|
+
//#region ----- Services & Dependencies -----
|
|
206
|
+
this.translationService = inject(AXTranslationService);
|
|
199
207
|
this.sanitize = inject(DomSanitizer);
|
|
208
|
+
this.isShowAgain = true;
|
|
200
209
|
}
|
|
210
|
+
//#endregion
|
|
211
|
+
//#region ----- Lifecycle -----
|
|
201
212
|
ngOnInit() {
|
|
202
213
|
super.ngOnInit();
|
|
203
|
-
|
|
214
|
+
const html = resolveMultiLanguageString(this.data.changeLog, this.translationService.getActiveLang());
|
|
215
|
+
this.safeData = this.sanitize.bypassSecurityTrustHtml(html);
|
|
204
216
|
}
|
|
217
|
+
//#endregion
|
|
218
|
+
//#region ----- Event Handlers -----
|
|
205
219
|
send() {
|
|
206
220
|
this.close({ data: this.data, isShowAgain: !this.isShowAgain });
|
|
207
221
|
}
|
|
@@ -213,33 +227,82 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
213
227
|
args: [{ selector: 'axm-notify-app-version', imports: [CommonModule, AXLabelModule, AXCheckBoxModule, AXDecoratorModule, AXButtonModule, AXTranslationModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ax-content class=\"block px-4 py-4 text-base/6\" [innerHTML]=\"safeData\"></ax-content>\n<ax-footer class=\"flex items-center justify-between p-2\">\n <ax-check-box [(value)]=\"isShowAgain\">\n <ax-label>Don't Show Again</ax-label>\n </ax-check-box>\n <ax-button color=\"primary\" (click)=\"send()\" [text]=\"'@general:actions.ok.title' | translate | async\"></ax-button>\n</ax-footer>\n\n" }]
|
|
214
228
|
}] });
|
|
215
229
|
|
|
230
|
+
//#region ----- Component -----
|
|
216
231
|
class AXMListVersionComponent extends AXBasePageComponent {
|
|
217
232
|
constructor() {
|
|
218
233
|
super(...arguments);
|
|
234
|
+
//#region ----- Services & Dependencies -----
|
|
219
235
|
this.entityService = inject(AXPEntityService);
|
|
220
|
-
this.appVersionService = this.entityService
|
|
236
|
+
this.appVersionService = this.entityService
|
|
237
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.appVersion.name)
|
|
238
|
+
.data();
|
|
221
239
|
this.formatService = inject(AXFormatService);
|
|
222
|
-
this.
|
|
240
|
+
this.translateService = inject(AXTranslationService);
|
|
241
|
+
this.sanitizer = inject(DomSanitizer);
|
|
242
|
+
//#endregion
|
|
243
|
+
//#region ----- State Signals -----
|
|
223
244
|
this.versions = signal([], /* @ts-ignore */
|
|
224
245
|
...(ngDevMode ? [{ debugName: "versions" }] : /* istanbul ignore next */ []));
|
|
246
|
+
this.loading = signal(true, /* @ts-ignore */
|
|
247
|
+
...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
|
|
248
|
+
this.loadFailed = signal(false, /* @ts-ignore */
|
|
249
|
+
...(ngDevMode ? [{ debugName: "loadFailed" }] : /* istanbul ignore next */ []));
|
|
225
250
|
}
|
|
251
|
+
//#endregion
|
|
252
|
+
//#region ----- Lifecycle -----
|
|
226
253
|
async ngOnInit() {
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
254
|
+
await this.loadVersions();
|
|
255
|
+
}
|
|
256
|
+
//#endregion
|
|
257
|
+
//#region ----- Data Loading -----
|
|
258
|
+
async loadVersions() {
|
|
259
|
+
this.loading.set(true);
|
|
260
|
+
this.loadFailed.set(false);
|
|
261
|
+
try {
|
|
262
|
+
const result = await this.appVersionService.query({
|
|
263
|
+
take: 1000,
|
|
264
|
+
skip: 0,
|
|
265
|
+
sort: [{ field: 'publishDate', dir: 'desc' }],
|
|
266
|
+
});
|
|
267
|
+
const versionLabelTemplate = await this.translateService.translateAsync('@application-management:application-info.release-notes.version-label');
|
|
268
|
+
const latestBadge = await this.translateService.translateAsync('@application-management:application-info.release-notes.latest-badge');
|
|
269
|
+
const items = [...(result.items ?? [])].sort((left, right) => {
|
|
270
|
+
const leftTime = Date.parse(String(left.publishDate ?? '')) || 0;
|
|
271
|
+
const rightTime = Date.parse(String(right.publishDate ?? '')) || 0;
|
|
272
|
+
if (rightTime !== leftTime) {
|
|
273
|
+
return rightTime - leftTime;
|
|
274
|
+
}
|
|
275
|
+
return String(right.versionNumber ?? '').localeCompare(String(left.versionNumber ?? ''), undefined, {
|
|
276
|
+
numeric: true,
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
const mappedItems = items.map((item, index) => {
|
|
280
|
+
const versionNumber = String(item.versionNumber ?? '');
|
|
281
|
+
const publishDateLabel = this.formatService.format(item.publishDate, 'datetime', {
|
|
282
|
+
format: 'date',
|
|
283
|
+
});
|
|
284
|
+
const title = versionLabelTemplate.replace('{{version}}', versionNumber);
|
|
285
|
+
return {
|
|
286
|
+
id: item.id,
|
|
287
|
+
title: index === 0 ? `${title} · ${latestBadge}` : title,
|
|
288
|
+
versionNumber,
|
|
289
|
+
publishDateLabel,
|
|
290
|
+
isLatest: index === 0,
|
|
291
|
+
content: this.sanitizer.bypassSecurityTrustHtml(resolveMultiLanguageString(item.changeLog, this.translateService.getActiveLang())) ?? '',
|
|
292
|
+
};
|
|
293
|
+
});
|
|
294
|
+
this.versions.set(mappedItems);
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
this.loadFailed.set(true);
|
|
298
|
+
this.versions.set([]);
|
|
299
|
+
}
|
|
300
|
+
finally {
|
|
301
|
+
this.loading.set(false);
|
|
302
|
+
}
|
|
240
303
|
}
|
|
241
304
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMListVersionComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
242
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMListVersionComponent, isStandalone: true, selector: "axm-list-version", usesInheritance: true, ngImport: i0, template: "<div class=\"
|
|
305
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMListVersionComponent, isStandalone: true, selector: "axm-list-version", usesInheritance: true, ngImport: i0, template: "<div class=\"axm-release-notes\">\n <!-- ----- Loading state while versions are fetched ----- -->\n @if (loading()) {\n <div class=\"axm-release-notes__state\">\n {{ '@application-management:application-info.release-notes.loading' | translate | async }}\n </div>\n }\n <!-- ----- Error state when the query fails ----- -->\n @else if (loadFailed()) {\n <div class=\"axm-release-notes__state axm-release-notes__state--error\">\n {{ '@application-management:application-info.release-notes.load-failed' | translate | async }}\n </div>\n }\n <!-- ----- Empty state when no AppVersion rows exist ----- -->\n @else if (versions().length === 0) {\n <div class=\"axm-release-notes__state\">\n {{ '@application-management:application-info.release-notes.empty' | translate | async }}\n </div>\n }\n <!-- ----- Version timeline: header = version, body = publish date + changelog ----- -->\n @else {\n <ax-time-line mode=\"icon\" class=\"axm-release-notes__timeline\">\n @for (version of versions(); track version.id) {\n <ax-time-line-item\n [text]=\"version.title\"\n [isActive]=\"version.isLatest\"\n [isCollapsed]=\"!version.isLatest\"\n >\n <ax-icon class=\"fa-solid fa-rocket\"></ax-icon>\n <div class=\"axm-release-notes__item\">\n <div class=\"axm-release-notes__meta\">\n <span class=\"axm-release-notes__meta-label\">\n {{ '@application-management:application-info.release-notes.published-label' | translate | async }}\n </span>\n <time class=\"axm-release-notes__meta-date\">{{ version.publishDateLabel }}</time>\n </div>\n <div class=\"axm-release-notes__changelog\" [innerHTML]=\"version.content\"></div>\n </div>\n </ax-time-line-item>\n }\n </ax-time-line>\n }\n</div>\n\n<ax-footer class=\"axm-release-notes__footer\">\n <ax-button\n [text]=\"'@general:actions.ok.title' | translate | async\"\n color=\"primary\"\n (onClick)=\"this.close()\"\n ></ax-button>\n</ax-footer>\n", styles: [":host{display:block}.axm-release-notes{min-height:24rem;max-height:min(70vh,36rem);overflow:auto;padding:.75rem 1.25rem .5rem}.axm-release-notes__state{display:flex;align-items:center;justify-content:center;min-height:16rem;padding:1.5rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface)/.72);font-size:.95rem}.axm-release-notes__state--error{color:rgb(var(--ax-sys-color-danger)/.95)}.axm-release-notes__timeline{display:block;padding-inline-end:.25rem}.axm-release-notes__item{display:flex;flex-direction:column;gap:.7rem;padding:.2rem .35rem .95rem}.axm-release-notes__meta{display:flex;flex-wrap:wrap;align-items:baseline;gap:.35rem .5rem;color:rgb(var(--ax-sys-color-on-surface)/.62);font-size:.8125rem;line-height:1.35}.axm-release-notes__meta-label{font-weight:600}.axm-release-notes__meta-date{font-variant-numeric:tabular-nums}.axm-release-notes__changelog{color:rgb(var(--ax-sys-color-on-surface)/.9);font-size:.9375rem;line-height:1.6}.axm-release-notes__changelog ::ng-deep ul{margin:0;padding-inline-start:1.2rem;display:flex;flex-direction:column;gap:.55rem;list-style:disc}.axm-release-notes__changelog ::ng-deep li{padding-inline-start:.2rem}.axm-release-notes__changelog ::ng-deep li::marker{color:rgb(var(--ax-sys-color-primary)/.75)}.axm-release-notes__changelog ::ng-deep strong,.axm-release-notes__changelog ::ng-deep b{font-weight:700;color:rgb(var(--ax-sys-color-on-surface)/.96)}.axm-release-notes__changelog ::ng-deep em,.axm-release-notes__changelog ::ng-deep i{font-style:italic;color:rgb(var(--ax-sys-color-on-surface)/.84)}.axm-release-notes__footer{display:flex;justify-content:flex-end;gap:.5rem;padding-top:.25rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXTimeLineModule }, { kind: "component", type: i1$2.AXTimeLineComponent, selector: "ax-time-line", inputs: ["mode"] }, { kind: "component", type: i1$2.AXTimeLineItemComponent, selector: "ax-time-line-item", inputs: ["text", "isActive", "isCollapsed"], outputs: ["isCollapsedChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i3.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: AXFormatModule }, { kind: "ngmodule", type: AXDateTimeModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i4.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
243
306
|
}
|
|
244
307
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMListVersionComponent, decorators: [{
|
|
245
308
|
type: Component,
|
|
@@ -251,7 +314,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
251
314
|
AXDateTimeModule,
|
|
252
315
|
AXButtonModule,
|
|
253
316
|
AXTranslationModule,
|
|
254
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"
|
|
317
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"axm-release-notes\">\n <!-- ----- Loading state while versions are fetched ----- -->\n @if (loading()) {\n <div class=\"axm-release-notes__state\">\n {{ '@application-management:application-info.release-notes.loading' | translate | async }}\n </div>\n }\n <!-- ----- Error state when the query fails ----- -->\n @else if (loadFailed()) {\n <div class=\"axm-release-notes__state axm-release-notes__state--error\">\n {{ '@application-management:application-info.release-notes.load-failed' | translate | async }}\n </div>\n }\n <!-- ----- Empty state when no AppVersion rows exist ----- -->\n @else if (versions().length === 0) {\n <div class=\"axm-release-notes__state\">\n {{ '@application-management:application-info.release-notes.empty' | translate | async }}\n </div>\n }\n <!-- ----- Version timeline: header = version, body = publish date + changelog ----- -->\n @else {\n <ax-time-line mode=\"icon\" class=\"axm-release-notes__timeline\">\n @for (version of versions(); track version.id) {\n <ax-time-line-item\n [text]=\"version.title\"\n [isActive]=\"version.isLatest\"\n [isCollapsed]=\"!version.isLatest\"\n >\n <ax-icon class=\"fa-solid fa-rocket\"></ax-icon>\n <div class=\"axm-release-notes__item\">\n <div class=\"axm-release-notes__meta\">\n <span class=\"axm-release-notes__meta-label\">\n {{ '@application-management:application-info.release-notes.published-label' | translate | async }}\n </span>\n <time class=\"axm-release-notes__meta-date\">{{ version.publishDateLabel }}</time>\n </div>\n <div class=\"axm-release-notes__changelog\" [innerHTML]=\"version.content\"></div>\n </div>\n </ax-time-line-item>\n }\n </ax-time-line>\n }\n</div>\n\n<ax-footer class=\"axm-release-notes__footer\">\n <ax-button\n [text]=\"'@general:actions.ok.title' | translate | async\"\n color=\"primary\"\n (onClick)=\"this.close()\"\n ></ax-button>\n</ax-footer>\n", styles: [":host{display:block}.axm-release-notes{min-height:24rem;max-height:min(70vh,36rem);overflow:auto;padding:.75rem 1.25rem .5rem}.axm-release-notes__state{display:flex;align-items:center;justify-content:center;min-height:16rem;padding:1.5rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface)/.72);font-size:.95rem}.axm-release-notes__state--error{color:rgb(var(--ax-sys-color-danger)/.95)}.axm-release-notes__timeline{display:block;padding-inline-end:.25rem}.axm-release-notes__item{display:flex;flex-direction:column;gap:.7rem;padding:.2rem .35rem .95rem}.axm-release-notes__meta{display:flex;flex-wrap:wrap;align-items:baseline;gap:.35rem .5rem;color:rgb(var(--ax-sys-color-on-surface)/.62);font-size:.8125rem;line-height:1.35}.axm-release-notes__meta-label{font-weight:600}.axm-release-notes__meta-date{font-variant-numeric:tabular-nums}.axm-release-notes__changelog{color:rgb(var(--ax-sys-color-on-surface)/.9);font-size:.9375rem;line-height:1.6}.axm-release-notes__changelog ::ng-deep ul{margin:0;padding-inline-start:1.2rem;display:flex;flex-direction:column;gap:.55rem;list-style:disc}.axm-release-notes__changelog ::ng-deep li{padding-inline-start:.2rem}.axm-release-notes__changelog ::ng-deep li::marker{color:rgb(var(--ax-sys-color-primary)/.75)}.axm-release-notes__changelog ::ng-deep strong,.axm-release-notes__changelog ::ng-deep b{font-weight:700;color:rgb(var(--ax-sys-color-on-surface)/.96)}.axm-release-notes__changelog ::ng-deep em,.axm-release-notes__changelog ::ng-deep i{font-style:italic;color:rgb(var(--ax-sys-color-on-surface)/.84)}.axm-release-notes__footer{display:flex;justify-content:flex-end;gap:.5rem;padding-top:.25rem}\n"] }]
|
|
255
318
|
}] });
|
|
256
319
|
|
|
257
320
|
var listVersion_component = /*#__PURE__*/Object.freeze({
|
|
@@ -462,7 +525,7 @@ class AXMListTermsComponent extends AXPPageLayoutBaseComponent {
|
|
|
462
525
|
provide: AXPPageLayoutBase,
|
|
463
526
|
useExisting: AXMListTermsComponent,
|
|
464
527
|
},
|
|
465
|
-
], usesInheritance: true, ngImport: i0, template: "<axp-page-layout *translate=\"let t\">\n @if(loaded()){\n
|
|
528
|
+
], usesInheritance: true, ngImport: i0, template: "<axp-page-layout *translate=\"let t\">\n @if (loaded()) {\n <axp-page-content id=\"contentDiv\" axOutlineContainer target=\"h2\" [scrollableElementId]=\"'axp-page-layout'\" [activationOffset]=\"120\" class=\"flex flex-row!\">\n <div class=\"flex flex-col\">\n @for (term of terms; track term.id) {\n <div class=\"flex flex-col\">\n <h2 class=\"px-4 font-semibold text-xl\">{{ term.title }}</h2>\n <p class=\"px-4 text-sm leading-5 opacity-65\">\n {{ term.effectiveDate | format: 'datetime' | async }}\n </p>\n <div class=\"pt-3 pb-6 px-4 text-base/6\" [innerHTML]=\"term.content | safe: 'html'\"></div>\n </div>\n }\n </div>\n @if (showScrollSide()) {\n <div class=\"hidden lg:block min-w-60\">\n <ax-side-menu axOutlineSideMenu look=\"with-line\" class=\"w-full sticky top-24\"></ax-side-menu>\n </div>\n }\n </axp-page-content>\n }\n</axp-page-layout>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXFormatModule }, { 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: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i6.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: AXSideMenuModule }, { kind: "component", type: i2$1.AXSideMenuComponent, selector: "ax-side-menu", inputs: ["items", "look", "location", "mode"], outputs: ["itemsChange"] }, { kind: "directive", type: i2$1.AXOutlineSideMenuDirective, selector: "[axOutlineSideMenu]", exportAs: ["axOutlineSideMenu"] }, { kind: "component", type: AXPPageLayoutComponent, selector: "axp-page-layout" }, { kind: "directive", type: AXOutlineContainerDirective, selector: "[axOutlineContainer]", inputs: ["target", "smoothScroll", "showHashItem", "activationOffset", "copyUrlOnClick", "activateLastAtBottom", "scrollableElementId"], exportAs: ["axOutlineContainer"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i4$1.AXFormatPipe, name: "format" }, { kind: "pipe", type: AXSafePipe, name: "safe" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
466
529
|
}
|
|
467
530
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMListTermsComponent, decorators: [{
|
|
468
531
|
type: Component,
|
|
@@ -482,7 +545,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
482
545
|
provide: AXPPageLayoutBase,
|
|
483
546
|
useExisting: AXMListTermsComponent,
|
|
484
547
|
},
|
|
485
|
-
], template: "<axp-page-layout *translate=\"let t\">\n @if(loaded()){\n
|
|
548
|
+
], template: "<axp-page-layout *translate=\"let t\">\n @if (loaded()) {\n <axp-page-content id=\"contentDiv\" axOutlineContainer target=\"h2\" [scrollableElementId]=\"'axp-page-layout'\" [activationOffset]=\"120\" class=\"flex flex-row!\">\n <div class=\"flex flex-col\">\n @for (term of terms; track term.id) {\n <div class=\"flex flex-col\">\n <h2 class=\"px-4 font-semibold text-xl\">{{ term.title }}</h2>\n <p class=\"px-4 text-sm leading-5 opacity-65\">\n {{ term.effectiveDate | format: 'datetime' | async }}\n </p>\n <div class=\"pt-3 pb-6 px-4 text-base/6\" [innerHTML]=\"term.content | safe: 'html'\"></div>\n </div>\n }\n </div>\n @if (showScrollSide()) {\n <div class=\"hidden lg:block min-w-60\">\n <ax-side-menu axOutlineSideMenu look=\"with-line\" class=\"w-full sticky top-24\"></ax-side-menu>\n </div>\n }\n </axp-page-content>\n }\n</axp-page-layout>\n" }]
|
|
486
549
|
}], propDecorators: { onResize: [{
|
|
487
550
|
type: HostListener,
|
|
488
551
|
args: ['window:resize']
|
|
@@ -664,7 +727,7 @@ const AXPModuleFeatureEditorWidget = {
|
|
|
664
727
|
component: () => import('./acorex-platform-module-application-management-client-features-widget-view.component-yKbBTqym.mjs').then((c) => c.AXPFeaturesWidgetViewComponent),
|
|
665
728
|
},
|
|
666
729
|
edit: {
|
|
667
|
-
component: () => import('./acorex-platform-module-application-management-client-features-widget-edit.component-
|
|
730
|
+
component: () => import('./acorex-platform-module-application-management-client-features-widget-edit.component-B_fnVBe5.mjs').then((c) => c.AXPModuleFeatureEditorWidgetEditComponent),
|
|
668
731
|
},
|
|
669
732
|
column: {
|
|
670
733
|
component: () => import('./acorex-platform-module-application-management-client-features-widget-column.component-C2OEG0LL.mjs').then((c) => c.AXPFeaturesWidgetColumnComponent),
|
|
@@ -711,26 +774,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
711
774
|
}]
|
|
712
775
|
}] });
|
|
713
776
|
|
|
714
|
-
//#region ---- Imports ----
|
|
715
|
-
//#endregion
|
|
716
|
-
//#region ---- Manifest Definition ----
|
|
717
|
-
/**
|
|
718
|
-
* Application Management Module Manifest.
|
|
719
|
-
* Defines module metadata, features, and provider references.
|
|
720
|
-
*/
|
|
721
|
-
const ApplicationManagementManifest = {
|
|
722
|
-
name: RootConfig.module.name,
|
|
723
|
-
version: '1.0.0',
|
|
724
|
-
title: RootConfig.module.title,
|
|
725
|
-
icon: RootConfig.module.icon,
|
|
726
|
-
i18n: RootConfig.config.i18n,
|
|
727
|
-
type: 'platform',
|
|
728
|
-
domain: 'platform',
|
|
729
|
-
required: true,
|
|
730
|
-
// Module dependencies (optional)
|
|
731
|
-
};
|
|
732
|
-
//#endregion
|
|
733
|
-
|
|
734
777
|
class AXMSearchCommandProvider extends AXPSearchCommandProvider {
|
|
735
778
|
constructor() {
|
|
736
779
|
super(...arguments);
|
|
@@ -821,15 +864,9 @@ class AXMApplicationManagementModule {
|
|
|
821
864
|
},
|
|
822
865
|
{
|
|
823
866
|
key: 'assign-features',
|
|
824
|
-
command: () => import('./acorex-platform-module-application-management-client-assign-features.command-
|
|
867
|
+
command: () => import('./acorex-platform-module-application-management-client-assign-features.command-CEuIYheD.mjs').then((c) => c.AXMAssignFeaturesCommand),
|
|
825
868
|
},
|
|
826
869
|
]),
|
|
827
|
-
// Module Manifest Provider
|
|
828
|
-
{
|
|
829
|
-
provide: AXP_MODULE_MANIFEST_PROVIDER,
|
|
830
|
-
useValue: ApplicationManagementManifest,
|
|
831
|
-
multi: true,
|
|
832
|
-
},
|
|
833
870
|
// Provider references (now using tokens)
|
|
834
871
|
provideLazyProvider(AXP_STATUS_PROVIDERS, () => import('./acorex-platform-module-application-management-client-application-status.provider-Bz6cknzi.mjs').then(m => m.AXMApplicationStatusProvider)),
|
|
835
872
|
provideLazyProvider(AXP_FEATURE_DEFINITION_PROVIDER, () => import('./acorex-platform-module-application-management-client-feature-definition.provider-V-wfUEZf.mjs').then(m => m.AXPApplicationManagementFeatureDefinitionProvider)),
|
|
@@ -943,15 +980,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
943
980
|
},
|
|
944
981
|
{
|
|
945
982
|
key: 'assign-features',
|
|
946
|
-
command: () => import('./acorex-platform-module-application-management-client-assign-features.command-
|
|
983
|
+
command: () => import('./acorex-platform-module-application-management-client-assign-features.command-CEuIYheD.mjs').then((c) => c.AXMAssignFeaturesCommand),
|
|
947
984
|
},
|
|
948
985
|
]),
|
|
949
|
-
// Module Manifest Provider
|
|
950
|
-
{
|
|
951
|
-
provide: AXP_MODULE_MANIFEST_PROVIDER,
|
|
952
|
-
useValue: ApplicationManagementManifest,
|
|
953
|
-
multi: true,
|
|
954
|
-
},
|
|
955
986
|
// Provider references (now using tokens)
|
|
956
987
|
provideLazyProvider(AXP_STATUS_PROVIDERS, () => import('./acorex-platform-module-application-management-client-application-status.provider-Bz6cknzi.mjs').then(m => m.AXMApplicationStatusProvider)),
|
|
957
988
|
provideLazyProvider(AXP_FEATURE_DEFINITION_PROVIDER, () => import('./acorex-platform-module-application-management-client-feature-definition.provider-V-wfUEZf.mjs').then(m => m.AXPApplicationManagementFeatureDefinitionProvider)),
|