@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.
Files changed (36) hide show
  1. 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
  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
  3. package/fesm2022/acorex-platform-module-application-management-client-contracts-entities-app-term.mjs +14 -0
  4. package/fesm2022/acorex-platform-module-application-management-client-contracts-entities-app-term.mjs.map +1 -1
  5. package/fesm2022/acorex-platform-module-application-management-client-contracts-entities-app-version.mjs +15 -0
  6. package/fesm2022/acorex-platform-module-application-management-client-contracts-entities-app-version.mjs.map +1 -1
  7. package/fesm2022/acorex-platform-module-application-management-client-contracts-entities-application.mjs +14 -0
  8. package/fesm2022/acorex-platform-module-application-management-client-contracts-entities-application.mjs.map +1 -1
  9. package/fesm2022/acorex-platform-module-application-management-client-contracts-entities-edition.mjs +14 -0
  10. package/fesm2022/acorex-platform-module-application-management-client-contracts-entities-edition.mjs.map +1 -1
  11. 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
  12. 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
  13. 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
  14. package/fesm2022/acorex-platform-module-application-management-client-contracts-entity-catalog-app-term.entity-DDvm1sOg.mjs.map +1 -0
  15. 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
  16. package/fesm2022/acorex-platform-module-application-management-client-contracts-entity-catalog-app-version.entity-DjOMTlcp.mjs.map +1 -0
  17. 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
  18. package/fesm2022/acorex-platform-module-application-management-client-contracts-entity-catalog-application.entity-BWOz1V1N.mjs.map +1 -0
  19. 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
  20. package/fesm2022/acorex-platform-module-application-management-client-contracts-entity-catalog-edition.entity-VjrQsh0t.mjs.map +1 -0
  21. package/fesm2022/acorex-platform-module-application-management-client-contracts-entity-catalog.mjs +1 -1
  22. package/fesm2022/acorex-platform-module-application-management-client-contracts.mjs +21 -1
  23. package/fesm2022/acorex-platform-module-application-management-client-contracts.mjs.map +1 -1
  24. 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
  25. package/fesm2022/acorex-platform-module-application-management-client-features-editor.component-Cg1oFhmZ.mjs.map +1 -0
  26. 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
  27. 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
  28. package/fesm2022/acorex-platform-module-application-management-client.mjs +88 -57
  29. package/fesm2022/acorex-platform-module-application-management-client.mjs.map +1 -1
  30. package/package.json +1 -1
  31. package/types/acorex-platform-module-application-management-client-contracts.d.ts +15 -4
  32. package/fesm2022/acorex-platform-module-application-management-client-contracts-entity-catalog-app-term.entity-BfVDQrrt.mjs.map +0 -1
  33. package/fesm2022/acorex-platform-module-application-management-client-contracts-entity-catalog-app-version.entity-BVuFZBZ0.mjs.map +0 -1
  34. package/fesm2022/acorex-platform-module-application-management-client-contracts-entity-catalog-application.entity-BYn6bLjH.mjs.map +0 -1
  35. package/fesm2022/acorex-platform-module-application-management-client-contracts-entity-catalog-edition.entity-DOhvvPnU.mjs.map +0 -1
  36. 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 { AXP_MODULE_TYPE, AXP_MODULE_DOMAIN, AXPModuleManifestRegistry, resolveModuleType, resolveModuleDomain } from '@acorex-platform/framework-client/core';
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-D9Tfh0gb.mjs.map
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-D9Tfh0gb.mjs';
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-B9YJsZFp.mjs.map
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-B9YJsZFp.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
+ {"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, AXP_MODULE_MANIFEST_PROVIDER, AXP_CONTEXT_DEFINITION_PROVIDER, provideLazyProvider, AXP_FEATURE_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/core';
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
- this.isShowAgain = true;
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
- this.safeData = this.sanitize.bypassSecurityTrustHtml(this.data.changeLog);
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.withEntity(RootConfig.module.name, RootConfig.entities.appVersion.name).data();
236
+ this.appVersionService = this.entityService
237
+ .withEntity(RootConfig.module.name, RootConfig.entities.appVersion.name)
238
+ .data();
221
239
  this.formatService = inject(AXFormatService);
222
- this.sanitize = inject(DomSanitizer);
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
- const result = await this.appVersionService.query({
228
- take: 1000,
229
- skip: 0,
230
- });
231
- const mappedItems = result.items.map((item) => ({
232
- id: item.id,
233
- //TODO to translate
234
- title: `Version ${item.versionNumber} Published at ${this.formatService.format(item.publishDate, 'datetime', {
235
- format: 'date',
236
- })}`,
237
- content: this.sanitize.bypassSecurityTrustHtml(item.changeLog) ?? '',
238
- }));
239
- this.versions.set(mappedItems);
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=\"px-12 min-h-96\">\n <ax-time-line>\n @for (version of versions(); track version.id) {\n <ax-time-line-item [text]=\"version.title\" [isCollapsed]=\"$index == 0 ? false : true\">\n <ax-icon class=\"fa-solid fa-flag-checkered\"></ax-icon>\n <ax-content class=\"px-8 py-2 text-base/6\" [innerHtml]=\"version.content\"></ax-content>\n </ax-time-line-item>\n }\n </ax-time-line>\n</div>\n<ax-footer class=\"flex justify-end!\"\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\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 }); }
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=\"px-12 min-h-96\">\n <ax-time-line>\n @for (version of versions(); track version.id) {\n <ax-time-line-item [text]=\"version.title\" [isCollapsed]=\"$index == 0 ? false : true\">\n <ax-icon class=\"fa-solid fa-flag-checkered\"></ax-icon>\n <ax-content class=\"px-8 py-2 text-base/6\" [innerHtml]=\"version.content\"></ax-content>\n </ax-time-line-item>\n }\n </ax-time-line>\n</div>\n<ax-footer class=\"flex justify-end!\"\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\n" }]
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 <axp-page-content id=\"contentDiv\" axOutlineContainer target=\"h2\" [scrollableElementId]=\"'axp-page-layout'\"\n [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\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 }); }
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 <axp-page-content id=\"contentDiv\" axOutlineContainer target=\"h2\" [scrollableElementId]=\"'axp-page-layout'\"\n [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\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-B9YJsZFp.mjs').then((c) => c.AXPModuleFeatureEditorWidgetEditComponent),
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-cU7MY74u.mjs').then((c) => c.AXMAssignFeaturesCommand),
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-cU7MY74u.mjs').then((c) => c.AXMAssignFeaturesCommand),
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)),