@acorex-platform/framework-client 0.0.30 → 0.0.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/{acorex-platform-framework-client-common-common-settings.provider-CLm2BVk-.mjs → acorex-platform-framework-client-common-common-settings.provider-CzBr0cRi.mjs} +23 -2
- package/fesm2022/acorex-platform-framework-client-common-common-settings.provider-CzBr0cRi.mjs.map +1 -0
- package/fesm2022/acorex-platform-framework-client-common.mjs +673 -110
- package/fesm2022/acorex-platform-framework-client-common.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-core.mjs +76 -7
- package/fesm2022/acorex-platform-framework-client-core.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-layout-builder.mjs +3 -6
- package/fesm2022/acorex-platform-framework-client-layout-builder.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-layout-components.mjs +505 -111
- package/fesm2022/acorex-platform-framework-client-layout-components.mjs.map +1 -1
- package/fesm2022/{acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-CJemNxCu.mjs → acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-D1prdDvf.mjs} +3404 -2157
- package/fesm2022/acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-D1prdDvf.mjs.map +1 -0
- package/fesm2022/{acorex-platform-framework-client-layout-entity-attachments-page.component-DQXGk8nF.mjs → acorex-platform-framework-client-layout-entity-attachments-page.component-CeVGNzup.mjs} +2 -2
- package/fesm2022/{acorex-platform-framework-client-layout-entity-attachments-page.component-DQXGk8nF.mjs.map → acorex-platform-framework-client-layout-entity-attachments-page.component-CeVGNzup.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-framework-client-layout-entity-bulk-entity.command-DSLUUXfQ.mjs → acorex-platform-framework-client-layout-entity-bulk-entity.command-CFScb-L4.mjs} +43 -15
- package/fesm2022/acorex-platform-framework-client-layout-entity-bulk-entity.command-CFScb-L4.mjs.map +1 -0
- package/fesm2022/{acorex-platform-framework-client-layout-entity-file-list-popup.component-p0hxDb0W.mjs → acorex-platform-framework-client-layout-entity-file-list-popup.component-B3__csKW.mjs} +3 -3
- package/fesm2022/{acorex-platform-framework-client-layout-entity-file-list-popup.component-p0hxDb0W.mjs.map → acorex-platform-framework-client-layout-entity-file-list-popup.component-B3__csKW.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-framework-client-layout-entity-gallery-page.component-uf51NO5m.mjs → acorex-platform-framework-client-layout-entity-gallery-page.component-B17l6mbm.mjs} +2 -2
- package/fesm2022/{acorex-platform-framework-client-layout-entity-gallery-page.component-uf51NO5m.mjs.map → acorex-platform-framework-client-layout-entity-gallery-page.component-B17l6mbm.mjs.map} +1 -1
- package/fesm2022/acorex-platform-framework-client-layout-entity.mjs +1 -1
- package/fesm2022/acorex-platform-framework-client-layout-views.mjs +37 -6
- package/fesm2022/acorex-platform-framework-client-layout-views.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-layout-widget-core.mjs +148 -130
- package/fesm2022/acorex-platform-framework-client-layout-widget-core.mjs.map +1 -1
- package/fesm2022/{acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-3CO4xJB3.mjs → acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-4mX8aYzA.mjs} +3 -3
- package/fesm2022/{acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-3CO4xJB3.mjs.map → acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-4mX8aYzA.mjs.map} +1 -1
- package/fesm2022/acorex-platform-framework-client-layout-widgets.mjs +1214 -860
- package/fesm2022/acorex-platform-framework-client-layout-widgets.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-realtime.mjs +70 -5
- package/fesm2022/acorex-platform-framework-client-realtime.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-runtime.mjs +121 -6
- package/fesm2022/acorex-platform-framework-client-runtime.mjs.map +1 -1
- package/fesm2022/{acorex-platform-framework-client-themes-default-entity-master-single-view.component-C2Abf7Lb.mjs → acorex-platform-framework-client-themes-default-entity-master-single-view.component-DCpl6AXq.mjs} +51 -12
- package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-single-view.component-DCpl6AXq.mjs.map +1 -0
- package/fesm2022/acorex-platform-framework-client-themes-default.mjs +770 -679
- package/fesm2022/acorex-platform-framework-client-themes-default.mjs.map +1 -1
- package/fesm2022/{acorex-platform-framework-client-themes-shared-settings.provider-D2XPkc71.mjs → acorex-platform-framework-client-themes-shared-settings.provider-CpsAIsxj.mjs} +76 -1
- package/fesm2022/acorex-platform-framework-client-themes-shared-settings.provider-CpsAIsxj.mjs.map +1 -0
- package/fesm2022/acorex-platform-framework-client-themes-shared.mjs +345 -54
- package/fesm2022/acorex-platform-framework-client-themes-shared.mjs.map +1 -1
- package/package.json +7 -7
- package/types/acorex-platform-framework-client-common.d.ts +137 -9
- package/types/acorex-platform-framework-client-core.d.ts +4 -1
- package/types/acorex-platform-framework-client-layout-components.d.ts +141 -22
- package/types/acorex-platform-framework-client-layout-entity.d.ts +532 -255
- package/types/acorex-platform-framework-client-layout-views.d.ts +48 -0
- package/types/acorex-platform-framework-client-layout-widget-core.d.ts +2 -2
- package/types/acorex-platform-framework-client-layout-widgets.d.ts +143 -92
- package/types/acorex-platform-framework-client-realtime.d.ts +39 -2
- package/types/acorex-platform-framework-client-runtime.d.ts +56 -5
- package/types/acorex-platform-framework-client-themes-default.d.ts +144 -14
- package/types/acorex-platform-framework-client-themes-shared.d.ts +36 -3
- package/fesm2022/acorex-platform-framework-client-common-common-settings.provider-CLm2BVk-.mjs.map +0 -1
- package/fesm2022/acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-CJemNxCu.mjs.map +0 -1
- package/fesm2022/acorex-platform-framework-client-layout-entity-bulk-entity.command-DSLUUXfQ.mjs.map +0 -1
- package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-single-view.component-C2Abf7Lb.mjs.map +0 -1
- package/fesm2022/acorex-platform-framework-client-themes-shared-settings.provider-D2XPkc71.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-framework-client-common.mjs","sources":["../../../../../libs/framework/client/common/src/lib/ai/output-contract-transcript-segment.types.ts","../../../../../libs/framework/client/common/src/lib/ai/output-contract-transcript-segment.provider.ts","../../../../../libs/framework/client/common/src/lib/ai/output-contract-transcript-segment.service.ts","../../../../../libs/framework/client/common/src/lib/app/app-version.provider.ts","../../../../../libs/framework/client/common/src/lib/app/operators.ts","../../../../../libs/framework/client/common/src/lib/app/date-filter-presets.ts","../../../../../libs/framework/client/common/src/lib/home-page/home-page.types.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-scope.util.ts","../../../../../libs/framework/client/common/src/lib/configs/common-settings.key.ts","../../../../../libs/framework/client/common/src/lib/settings/setting.builder.ts","../../../../../libs/framework/client/common/src/lib/settings/setting-definition.service.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-coercion.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-sync-keys.token.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-bulk-sync.service.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-cache-sync.token.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-sync.config.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-trace.constants.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-sync.trace.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-indexed-db.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-local-cache.util.ts","../../../../../libs/framework/client/common/src/lib/settings/indexed-db-setting-value.provider.ts","../../../../../libs/framework/client/common/src/lib/settings/settings.provider.ts","../../../../../libs/framework/client/common/src/lib/settings/settings.service.ts","../../../../../libs/framework/client/common/src/lib/settings/default-multi-language-config.service.ts","../../../../../libs/framework/client/common/src/lib/settings/default-multi-language.helpers.ts","../../../../../libs/framework/client/common/src/lib/settings/platform-settings-load-state.service.ts","../../../../../libs/framework/client/common/src/lib/network/network-connectivity.service.ts","../../../../../libs/framework/client/common/src/lib/settings/platform-settings-offline-bootstrap.service.ts","../../../../../libs/framework/client/common/src/lib/settings/platform-settings-available.guard.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-evaluator-scope.provider.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-sync.types.ts","../../../../../libs/framework/client/common/src/lib/settings/regional-calendar.service.ts","../../../../../libs/framework/client/common/src/lib/settings/unsaved-changes-confirm.service.ts","../../../../../libs/framework/client/common/src/lib/settings/unsaved-changes-popstate.service.ts","../../../../../libs/framework/client/common/src/lib/tab-navigation/tab-route-cache.registry.ts","../../../../../libs/framework/client/common/src/lib/settings/unsaved-changes-can-deactivate.guard.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-popup.types.ts","../../../../../libs/framework/client/common/src/lib/home-page/home-page-settings.key.ts","../../../../../libs/framework/client/common/src/lib/home-page/home-page.service.ts","../../../../../libs/framework/client/common/src/lib/home-page/home-page.routes.ts","../../../../../libs/framework/client/common/src/lib/settings/experience-settings.constants.ts","../../../../../libs/framework/client/common/src/lib/home-page/home-page-settings.provider.ts","../../../../../libs/framework/client/common/src/lib/home-page/home-page.module.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation.notification.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation-notification.service.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation.util.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation-completion.service.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation.types.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation.const.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation.entity.storage.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation.entity.mapper.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation.store.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation.entity-store.service.ts","../../../../../libs/framework/client/common/src/lib/background-operation/entities/background-operation/background-operation.types.ts","../../../../../libs/framework/client/common/src/lib/background-operation/entities/background-operation/background-operation.entity.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation.handler.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation.provider.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation.service.ts","../../../../../libs/framework/client/common/src/lib/background-operation/components/background-operation-item.component.ts","../../../../../libs/framework/client/common/src/lib/background-operation/components/background-operation-item.component.html","../../../../../libs/framework/client/common/src/lib/background-operation/components/background-operation-panel.component.ts","../../../../../libs/framework/client/common/src/lib/background-operation/components/background-operation-panel.component.html","../../../../../libs/framework/client/common/src/lib/background-operation/components/background-operation-slot.component.ts","../../../../../libs/framework/client/common/src/lib/background-operation/components/background-operation-slot.component.html","../../../../../libs/framework/client/common/src/lib/configs/app.config.ts","../../../../../libs/framework/client/common/src/lib/platform-branding/platform-branding.constants.ts","../../../../../libs/framework/client/common/src/lib/platform-branding/platform-branding.service.ts","../../../../../libs/framework/client/common/src/lib/utils/app-path-navigation.util.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/menu-route-matcher.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/menu.context.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/menu.middleware.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/menu-middleware.registry.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/menu.provider.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/menu-visibility.service.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/menu-keyboard-shortcuts.service.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/menu.service.ts","../../../../../libs/framework/client/common/src/lib/tab-navigation/tab-key.util.ts","../../../../../libs/framework/client/common/src/lib/tab-navigation/tab-navigation.types.ts","../../../../../libs/framework/client/common/src/lib/tab-navigation/tab-route-resolver.ts","../../../../../libs/framework/client/common/src/lib/tab-navigation/tab-title.util.ts","../../../../../libs/framework/client/common/src/lib/tab-navigation/tab-preview.service.ts","../../../../../libs/framework/client/common/src/lib/tab-navigation/tab-route-policy.ts","../../../../../libs/framework/client/common/src/lib/tab-navigation/tab-navigation.service.ts","../../../../../libs/framework/client/common/src/lib/browser-title/browser-title.service.ts","../../../../../libs/framework/client/common/src/lib/data/data-provider.types.ts","../../../../../libs/framework/client/common/src/lib/data/operators.service.ts","../../../../../libs/framework/client/common/src/lib/data/filter-middleware.service.ts","../../../../../libs/framework/client/common/src/lib/errors/error-handler-registry.service.ts","../../../../../libs/framework/client/common/src/lib/errors/request-error.util.ts","../../../../../libs/framework/client/common/src/lib/errors/format-request-error.util.ts","../../../../../libs/framework/client/common/src/lib/errors/global-error-handler.ts","../../../../../libs/framework/client/common/src/lib/errors/not-found.error.ts","../../../../../libs/framework/client/common/src/lib/errors/not-found.routes.ts","../../../../../libs/framework/client/common/src/lib/errors/unauthorized.routes.ts","../../../../../libs/framework/client/common/src/lib/formatters/translate.formatter.ts","../../../../../libs/framework/client/common/src/lib/file-storage/file-storage.service.ts","../../../../../libs/framework/client/common/src/lib/file-storage/file-storage-evaluator-scope.provider.ts","../../../../../libs/framework/client/common/src/lib/file-storage/resolve-stored-image-url.ts","../../../../../libs/framework/client/common/src/lib/file-storage/logo-image-src-resolver.service.ts","../../../../../libs/framework/client/common/src/lib/file-storage/normalize-document-file-list-item.util.ts","../../../../../libs/framework/client/common/src/lib/file-storage/resolve-media-viewer-type.util.ts","../../../../../libs/framework/client/common/src/lib/keyboard-shortcuts/keyboard-shortcuts-help.component.ts","../../../../../libs/framework/client/common/src/lib/keyboard-shortcuts/keyboard-shortcuts-help.service.ts","../../../../../libs/framework/client/common/src/lib/layout/sticky.directive.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/provide-menu-middleware.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/menu-route-access.service.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/menu-route.guard.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/protected-route.guards.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/search-definition.provider.ts","../../../../../libs/framework/client/common/src/lib/search/search-definition-lazy-resolver.token.ts","../../../../../libs/framework/client/common/src/lib/search/search-definition.builder.ts","../../../../../libs/framework/client/common/src/lib/search/search-definition.provider.ts","../../../../../libs/framework/client/common/src/lib/search/search-display-string.util.ts","../../../../../libs/framework/client/common/src/lib/search/search.provider.ts","../../../../../libs/framework/client/common/src/lib/search/entity-search-display-title.util.ts","../../../../../libs/framework/client/common/src/lib/search/search.service.ts","../../../../../libs/framework/client/common/src/lib/search/entity-row-display-title.util.ts","../../../../../libs/framework/client/common/src/lib/search/search-entity-command.util.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/search.provider.ts","../../../../../libs/framework/client/common/src/lib/layout/theme/components/slots/footer-text-slot.component.ts","../../../../../libs/framework/client/common/src/lib/layout/theme/components/slots/navbar-slot.component.ts","../../../../../libs/framework/client/common/src/lib/tokens/token-definition.provider.ts","../../../../../libs/framework/client/common/src/lib/tokens/token-definition.service.ts","../../../../../libs/framework/client/common/src/lib/tokens/token-evaluator-scope.provider.ts","../../../../../libs/framework/client/common/src/lib/utils/query-params-evaluator-scope.provider.ts","../../../../../libs/framework/client/common/src/lib/utils/query-evaluator-scope.provider.ts","../../../../../libs/framework/client/common/src/lib/common.module.ts","../../../../../libs/framework/client/common/src/lib/configs/entity-create-list-behavior.util.ts","../../../../../libs/framework/client/common/src/lib/configs/config.types.ts","../../../../../libs/framework/client/common/src/lib/file-actions/choose-system-files.util.ts","../../../../../libs/framework/client/common/src/lib/file-actions/file-actions.provider.ts","../../../../../libs/framework/client/common/src/lib/file-actions/file-actions.service.ts","../../../../../libs/framework/client/common/src/lib/file-actions/file-actions.types.ts","../../../../../libs/framework/client/common/src/lib/file-actions/upload-from-computer.action-provider.ts","../../../../../libs/framework/client/common/src/lib/file-type/file-type.provider.ts","../../../../../libs/framework/client/common/src/lib/file-type/file-type-purpose.util.ts","../../../../../libs/framework/client/common/src/lib/file-type/file-type-display.util.ts","../../../../../libs/framework/client/common/src/lib/file-type/file-type-open.util.ts","../../../../../libs/framework/client/common/src/lib/file-type/acorex-file-type.bridge.ts","../../../../../libs/framework/client/common/src/lib/file-type/acorex-file-type.module.ts","../../../../../libs/framework/client/common/src/lib/integration/integration.provider.ts","../../../../../libs/framework/client/common/src/lib/integration/integration-domain.provider.ts","../../../../../libs/framework/client/common/src/lib/integration/integration-domain-provider.context.ts","../../../../../libs/framework/client/common/src/lib/integration/integration-provider.context.ts","../../../../../libs/framework/client/common/src/lib/integration/integration-domain.registry.service.ts","../../../../../libs/framework/client/common/src/lib/integration/integration-provider.registry.service.ts","../../../../../libs/framework/client/common/src/lib/integration/integration-secret-store.token.ts","../../../../../libs/framework/client/common/src/lib/integration/integration-connection-established.token.ts","../../../../../libs/framework/client/common/src/lib/integration/integration-connection-lifecycle.token.ts","../../../../../libs/framework/client/common/src/lib/integration/index.ts","../../../../../libs/framework/client/common/src/lib/local-data/local-entity.types.ts","../../../../../libs/framework/client/common/src/lib/local-data/local-entity-indexed-db.ts","../../../../../libs/framework/client/common/src/lib/local-data/local-entity-query.util.ts","../../../../../libs/framework/client/common/src/lib/local-data/local-entity.engine.ts","../../../../../libs/framework/client/common/src/lib/local-data/local-entity-realtime.bridge.ts","../../../../../libs/framework/client/common/src/lib/lock-system/lock.service.ts","../../../../../libs/framework/client/common/src/lib/status-definition/status-definition-provider.service.ts","../../../../../libs/framework/client/common/src/lib/tab-navigation/tab-preview.types.ts","../../../../../libs/framework/client/common/src/lib/utils/entity-list-return-url.util.ts","../../../../../libs/framework/client/common/src/lib/utils/clipboard-service.ts","../../../../../libs/framework/client/common/src/lib/utils/dom-graphic.util.ts","../../../../../libs/framework/client/common/src/lib/utils/export-popup.ts","../../../../../libs/framework/client/common/src/lib/utils/export.service.ts","../../../../../libs/framework/client/common/src/lib/utils/filter-cleaner.ts","../../../../../libs/framework/client/common/src/lib/utils/locale-code.util.ts","../../../../../libs/framework/client/common/src/lib/utils/locale-management-port.ts","../../../../../libs/framework/client/common/src/lib/utils/locale-settings.util.ts","../../../../../libs/framework/client/common/src/lib/versioning/types.ts","../../../../../libs/framework/client/common/src/lib/commands/navigate.command.ts","../../../../../libs/framework/client/common/src/lib/commands/navigate.command.definition.ts","../../../../../libs/framework/client/common/src/acorex-platform-framework-client-common.ts"],"sourcesContent":["//#region ---- Output kind & segment ----\n\nimport type { AXPAgentOutputKind, AXPOutputTranscriptSegmentId } from '@acorex-platform/framework-shared/core';\n\n//#endregion\n\n//#region ---- JSON Schema (minimal subset) ----\n\n/**\n * Minimal JSON-Schema-like object for native provider hints and local validation.\n */\nexport interface AXPJsonSchemaLike {\n type?: 'object' | 'array' | 'string' | 'number' | 'integer' | 'boolean' | 'null';\n properties?: Record<string, AXPJsonSchemaLike>;\n items?: AXPJsonSchemaLike | AXPJsonSchemaLike[];\n required?: string[];\n enum?: unknown[];\n additionalProperties?: boolean | AXPJsonSchemaLike;\n description?: string;\n [key: string]: unknown;\n}\n\n//#endregion\n\n//#region ---- Provider response format ----\n\n/** Provider-native structured output hint (OpenAI `response_format`, Gemini `responseMimeType`). */\nexport type AXPAgentResponseFormat =\n | { type: 'text' }\n | { type: 'json_object' }\n | {\n type: 'json_schema';\n schema: AXPJsonSchemaLike;\n name?: string;\n strict?: boolean;\n };\n\n//#endregion\n\n//#region ---- Output contract ----\n\n/**\n * Catalog row contract for specialist final output (separate from domain `systemPrompt`).\n * Field paths align with agent/assist entity `outputContract` JSON.\n */\nexport interface AXPAgentOutputContract {\n kind: AXPAgentOutputKind;\n /**\n * When `kind` is `object`: `text` = generic JSON object as text; `node` = inner widget node in chat;\n * `followUp` = `{\"type\":\"followUp\",\"content\":[...]}` envelope.\n */\n transcriptSegment?: AXPOutputTranscriptSegmentId;\n instruction?: string;\n schemaSummary?: string;\n schema?: AXPJsonSchemaLike;\n schemaName?: string;\n schemaStrict?: boolean;\n validationCommandName?: string;\n structuredRetries?: number;\n providerResponseFormat?: AXPAgentResponseFormat;\n}\n\n/** Default structured retry count when `structuredRetries` is omitted on structured kinds. */\nexport const AXP_AGENT_OUTPUT_CONTRACT_DEFAULT_STRUCTURED_RETRIES = 2;\n\n//#endregion\n\n//#region ---- Transcript segment definition ----\n\n/**\n * Registered preset for an output-contract transcript segment.\n * Modules register via {@link AXP_OUTPUT_CONTRACT_TRANSCRIPT_SEGMENT_PROVIDER}.\n */\nexport interface AXPOutputContractTranscriptSegmentDefinition {\n /** Segment id (`text`, `node`, `followUp`). */\n name: AXPOutputTranscriptSegmentId;\n /** i18n key or display title for admin UI selects. */\n title: string;\n description?: string;\n /** Contract kinds this segment applies to (defaults to `object` only). */\n applicableKinds?: AXPAgentOutputKind[];\n /** Default `outputContract` field values when this segment is chosen. */\n contract: AXPAgentOutputContract;\n}\n\n//#endregion\n","import { InjectionToken } from '@angular/core';\nimport type { AXPOutputContractTranscriptSegmentDefinition } from './output-contract-transcript-segment.types';\n\n//#region ---- Provider token ----\n\nexport type AXPOutputContractTranscriptSegmentProviderToken =\n | AXPOutputContractTranscriptSegmentProvider\n | Promise<AXPOutputContractTranscriptSegmentProvider>;\n\n/**\n * Registers one or more transcript-segment presets for agent/assist `outputContract`.\n * Use with `multi: true` in module providers.\n */\nexport interface AXPOutputContractTranscriptSegmentProvider {\n provide():\n | AXPOutputContractTranscriptSegmentDefinition[]\n | Promise<AXPOutputContractTranscriptSegmentDefinition[]>;\n}\n\nexport const AXP_OUTPUT_CONTRACT_TRANSCRIPT_SEGMENT_PROVIDER = new InjectionToken<\n AXPOutputContractTranscriptSegmentProviderToken[]\n>('AXP_OUTPUT_CONTRACT_TRANSCRIPT_SEGMENT_PROVIDER', {\n factory: () => [],\n});\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { inject, Injectable } from '@angular/core';\nimport type { AXPOutputTranscriptSegmentId } from '@acorex-platform/framework-shared/core';\nimport { AXP_OUTPUT_CONTRACT_TRANSCRIPT_SEGMENT_PROVIDER } from './output-contract-transcript-segment.provider';\nimport type {\n AXPAgentOutputContract,\n AXPOutputContractTranscriptSegmentDefinition,\n} from './output-contract-transcript-segment.types';\n\n//#endregion\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPOutputContractTranscriptSegmentService {\n //#region ---- Dependencies & cache ----\n\n private readonly segmentProviders =\n inject(AXP_OUTPUT_CONTRACT_TRANSCRIPT_SEGMENT_PROVIDER, { optional: true }) ?? [];\n\n private definitionsByName = new Map<string, AXPOutputContractTranscriptSegmentDefinition>();\n private loadPromise: Promise<void> | null = null;\n\n //#endregion\n\n //#region ---- Public API ----\n\n /** All registered transcript segment definitions (deduped by `name`). */\n async getAll(): Promise<AXPOutputContractTranscriptSegmentDefinition[]> {\n await this.ensureLoaded();\n return [...this.definitionsByName.values()];\n }\n\n /** Lookup by segment id (`text`, `node`, `followUp`). */\n async get(\n name: AXPOutputTranscriptSegmentId,\n ): Promise<AXPOutputContractTranscriptSegmentDefinition | undefined> {\n await this.ensureLoaded();\n return this.definitionsByName.get(name);\n }\n\n /** Default `outputContract` for a segment, or `undefined` when not registered. */\n async getContractPreset(name: AXPOutputTranscriptSegmentId): Promise<AXPAgentOutputContract | undefined> {\n const definition = await this.get(name);\n return definition?.contract;\n }\n\n /** Clears the in-memory registry (e.g. after hot reload in dev). */\n clearCache(): void {\n this.definitionsByName.clear();\n this.loadPromise = null;\n }\n\n //#endregion\n\n //#region ---- Load ----\n\n private async ensureLoaded(): Promise<void> {\n if (this.loadPromise) {\n return this.loadPromise;\n }\n this.loadPromise = this.loadDefinitions();\n return this.loadPromise;\n }\n\n private async loadDefinitions(): Promise<void> {\n const resolvedProviders = await Promise.all(this.segmentProviders);\n\n for (const provider of resolvedProviders) {\n if (!provider) {\n continue;\n }\n const definitions = await Promise.resolve(provider.provide());\n for (const definition of definitions) {\n if (!definition?.name) {\n continue;\n }\n if (this.definitionsByName.has(definition.name)) {\n console.warn(\n `[AXPOutputContractTranscriptSegmentService] Segment \"${definition.name}\" already registered; overwriting.`,\n );\n }\n this.definitionsByName.set(definition.name, definition);\n }\n }\n }\n\n //#endregion\n}\n","import { inject, Injectable, InjectionToken } from '@angular/core';\n\nexport interface AXPAppVersion {\n version: string;\n build: number;\n date: Date;\n}\n\nexport interface AXPAppVersionProvider {\n provider(): Promise<AXPAppVersion>;\n}\n\nexport const AXP_APP_VERSION_PROVIDER = new InjectionToken<AXPAppVersionProvider>('AXP_APP_VERSION_PROVIDER', {\n providedIn: 'root',\n factory: () => {\n return new AXPAppVersionDefaultProvider();\n },\n});\n\nclass AXPAppVersionDefaultProvider implements AXPAppVersionProvider {\n async provider(): Promise<AXPAppVersion> {\n return {\n version: '1.0.0',\n build: 1,\n date: new Date(),\n };\n }\n}\n\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPAppVersionService {\n private provider = inject(AXP_APP_VERSION_PROVIDER);\n\n async getAppVersion(): Promise<AXPAppVersion> {\n return this.provider.provider();\n }\n}\n","export interface AXPFilterOperator {\n name: string;\n title: string;\n hasValue: boolean;\n}\n\nexport const EQ_OPER: AXPFilterOperator = { name: 'equal', title: '@general:terms.operators.equal', hasValue: true };\nexport const NOT_EQ_OPER: AXPFilterOperator = { name: 'notEqual', title: '@general:terms.operators.not-equal', hasValue: true };\nexport const GT_OPER: AXPFilterOperator = { name: 'greaterThan', title: '@general:terms.operators.greater-than', hasValue: true };\nexport const LT_OPER: AXPFilterOperator = { name: 'lessThan', title: '@general:terms.operators.less-than', hasValue: true };\nexport const GTE_OPER: AXPFilterOperator = {\n name: 'greaterThanOrEqual',\n title: '@general:terms.operators.greater-than-or-equal',\n hasValue: true,\n};\nexport const LTE_OPER: AXPFilterOperator = { name: 'lessThanOrEqual', title: '@general:terms.operators.less-than-or-equal', hasValue: true };\nexport const CONTAINS_OPER: AXPFilterOperator = { name: 'contains', title: '@general:terms.operators.contains', hasValue: true };\nexport const NOT_CONTAINS_OPER: AXPFilterOperator = { name: 'notContains', title: '@general:terms.operators.not-contains', hasValue: true };\nexport const IN_OPER: AXPFilterOperator = { name: 'in', title: '@general:terms.operators.in', hasValue: true };\nexport const STARTS_WITH_OPER: AXPFilterOperator = { name: 'startsWith', title: '@general:terms.operators.starts-with', hasValue: true };\nexport const ENDS_WITH_OPER: AXPFilterOperator = { name: 'endsWith', title: '@general:terms.operators.ends-with', hasValue: true };\nexport const IS_EMPTY_OPER: AXPFilterOperator = { name: 'isEmpty', title: '@general:terms.operators.is-empty', hasValue: false };\nexport const IS_NOT_EMPTY_OPER: AXPFilterOperator = { name: 'isNotEmpty', title: '@general:terms.operators.is-not-empty', hasValue: false };\nexport const BETWEEN_OPER: AXPFilterOperator = { name: 'between', title: '@general:terms.operators.between', hasValue: true };\n\nexport const STRING_OPERATORS = [\n EQ_OPER,\n NOT_EQ_OPER,\n CONTAINS_OPER,\n NOT_CONTAINS_OPER,\n STARTS_WITH_OPER,\n ENDS_WITH_OPER,\n IS_EMPTY_OPER,\n IS_NOT_EMPTY_OPER,\n IN_OPER\n];\n\nexport const NUMBER_OPERATORS = [\n EQ_OPER,\n NOT_EQ_OPER,\n BETWEEN_OPER,\n GT_OPER,\n GTE_OPER,\n LT_OPER,\n LTE_OPER,\n IS_EMPTY_OPER,\n IS_NOT_EMPTY_OPER,\n];\n\nexport const BOOLEAN_OPERATORS = [EQ_OPER];\n\nexport const DATE_OPERATORS = [\n EQ_OPER,\n NOT_EQ_OPER,\n BETWEEN_OPER,\n GT_OPER,\n GTE_OPER,\n LT_OPER,\n LTE_OPER,\n IS_EMPTY_OPER,\n IS_NOT_EMPTY_OPER,\n];\n\nexport const ALL_DEFAULT_OPERATORS = [\n EQ_OPER,\n NOT_EQ_OPER,\n GT_OPER,\n LT_OPER,\n GTE_OPER,\n LTE_OPER,\n CONTAINS_OPER,\n IN_OPER,\n NOT_CONTAINS_OPER,\n STARTS_WITH_OPER,\n ENDS_WITH_OPER,\n IS_EMPTY_OPER,\n IS_NOT_EMPTY_OPER,\n BETWEEN_OPER,\n];\n","import type { AXCalendarService } from '@acorex/core/date-time';\n\nimport { BETWEEN_OPER } from './operators';\n\nexport type AXPDateTimeFilterPresetKind = 'computed' | 'manual';\n\nexport interface AXPDateTimeFilterPreset {\n id: string;\n title: string;\n kind: AXPDateTimeFilterPresetKind;\n operationType?: string;\n}\n\nexport const DEFAULT_DATE_FILTER_PRESETS: AXPDateTimeFilterPreset[] = [\n { id: 'today', title: '@general:terms.date-presets.today', kind: 'computed' },\n { id: 'this-week', title: '@general:terms.date-presets.this-week', kind: 'computed' },\n { id: 'this-month', title: '@general:terms.date-presets.this-month', kind: 'computed' },\n { id: 'yesterday', title: '@general:terms.date-presets.yesterday', kind: 'computed' },\n { id: 'last-week', title: '@general:terms.date-presets.last-week', kind: 'computed' },\n { id: 'last-month', title: '@general:terms.date-presets.last-month', kind: 'computed' },\n { id: 'tomorrow', title: '@general:terms.date-presets.tomorrow', kind: 'computed' },\n { id: 'next-week', title: '@general:terms.date-presets.next-week', kind: 'computed' },\n { id: 'next-month', title: '@general:terms.date-presets.next-month', kind: 'computed' },\n { id: 'between', title: BETWEEN_OPER.title, kind: 'manual', operationType: 'between' },\n { id: 'greater-than', title: '@general:terms.operators.greater-than', kind: 'manual', operationType: 'greaterThan' },\n { id: 'less-than', title: '@general:terms.operators.less-than', kind: 'manual', operationType: 'lessThan' },\n];\n\nexport interface AXPDateTimeFilterValue {\n operation?: { type: string };\n value?: string | { from?: string; to?: string };\n}\n\nexport function resolveDateFilterPresets(\n customPresets?: AXPDateTimeFilterPreset[],\n presetIds?: string[],\n): AXPDateTimeFilterPreset[] {\n let presets = customPresets?.length ? customPresets : DEFAULT_DATE_FILTER_PRESETS;\n if (presetIds?.length) {\n presets = presets.filter((p) => presetIds.includes(p.id));\n }\n return presets;\n}\n\nexport function applyDateFilterPreset(\n presetId: string,\n calendarService: AXCalendarService,\n): AXPDateTimeFilterValue | undefined {\n const currentDate = calendarService.now().date;\n const calendar = calendarService.calendar;\n\n switch (presetId) {\n case 'today':\n return {\n operation: { type: 'between' },\n value: {\n from: calendar.startOf(currentDate, 'day').date.toISOString(),\n to: calendar.endOf(currentDate, 'day').date.toISOString(),\n },\n };\n case 'this-week':\n return {\n operation: { type: 'between' },\n value: {\n from: calendar.startOf(currentDate, 'week').date.toISOString(),\n to: calendar.endOf(currentDate, 'week').date.toISOString(),\n },\n };\n case 'this-month':\n return {\n operation: { type: 'between' },\n value: {\n from: calendar.startOf(currentDate, 'month').date.toISOString(),\n to: calendar.endOf(currentDate, 'month').date.toISOString(),\n },\n };\n case 'yesterday': {\n const yesterday = calendar.add(currentDate, 'day', -1);\n return {\n operation: { type: 'between' },\n value: {\n from: yesterday.startOf('day').date.toISOString(),\n to: yesterday.endOf('day').date.toISOString(),\n },\n };\n }\n case 'last-week': {\n const lastWeek = calendar.add(currentDate, 'week', -1);\n return {\n operation: { type: 'between' },\n value: {\n from: lastWeek.startOf('week').date.toISOString(),\n to: lastWeek.endOf('week').date.toISOString(),\n },\n };\n }\n case 'last-month': {\n const lastMonth = calendar.add(currentDate, 'month', -1);\n return {\n operation: { type: 'between' },\n value: {\n from: lastMonth.startOf('month').date.toISOString(),\n to: lastMonth.endOf('month').date.toISOString(),\n },\n };\n }\n case 'tomorrow': {\n const tomorrow = calendar.add(currentDate, 'day', 1);\n return {\n operation: { type: 'between' },\n value: {\n from: tomorrow.startOf('day').date.toISOString(),\n to: tomorrow.endOf('day').date.toISOString(),\n },\n };\n }\n case 'next-week': {\n const nextWeek = calendar.add(currentDate, 'week', 1);\n return {\n operation: { type: 'between' },\n value: {\n from: nextWeek.startOf('week').date.toISOString(),\n to: nextWeek.endOf('week').date.toISOString(),\n },\n };\n }\n case 'next-month': {\n const nextMonth = calendar.add(currentDate, 'month', 1);\n return {\n operation: { type: 'between' },\n value: {\n from: nextMonth.startOf('month').date.toISOString(),\n to: nextMonth.endOf('month').date.toISOString(),\n },\n };\n }\n case 'between':\n return undefined;\n case 'greater-than':\n return { operation: { type: 'greaterThan' } };\n case 'less-than':\n return { operation: { type: 'lessThan' } };\n default:\n return {\n operation: { type: 'between' },\n value: { from: '', to: '' },\n };\n }\n}\n\nexport function findManualPresetIdByOperation(\n operationType: string | undefined,\n presets: AXPDateTimeFilterPreset[],\n): string | undefined {\n if (!operationType) {\n return undefined;\n }\n return presets.find((p) => p.kind === 'manual' && p.operationType === operationType)?.id;\n}\n","import { InjectionToken } from '@angular/core';\nimport { Route } from '@angular/router';\n\nexport interface AXPHomePageDefinition {\n key: string,\n title: string,\n route: Route\n}\n\n\nexport const AXP_HOME_PAGES = new InjectionToken<AXPHomePageDefinition[]>('AXP_HOME_PAGES');\nexport const AXP_HOME_PAGE_DEFAULT_KEY = new InjectionToken<string>('AXP_HOME_PAGE_DEFAULT_KEY', {\n factory: () => 'home'\n});\n\n","import { AXPPlatformScopeKey } from '@acorex-platform/framework-shared/core';\n\nimport type { AXPSettingDefinition } from './settings.types';\n\n/** Strict descendants allowed to override a setting owned at `scope`. */\nexport const AXP_SETTING_SCOPE_DESCENDANTS: Record<AXPPlatformScopeKey, readonly AXPPlatformScopeKey[]> = {\n P: ['T', 'U'],\n T: ['U'],\n U: [],\n};\n\nexport function normalizeOverridableAt(\n ownerScope: AXPPlatformScopeKey,\n overridableAt: AXPPlatformScopeKey[] | undefined,\n): AXPPlatformScopeKey[] {\n const scopes = overridableAt ?? [];\n const allowed = AXP_SETTING_SCOPE_DESCENDANTS[ownerScope];\n for (const scope of scopes) {\n if (!allowed.includes(scope)) {\n throw new Error(\n `Setting at scope \"${ownerScope}\" cannot be overridable at \"${scope}\". Allowed: [${allowed.join(', ')}].`,\n );\n }\n }\n return scopes;\n}\n\nexport function isSettingVisibleOnScope(\n setting: Pick<AXPSettingDefinition, 'scope' | 'overridableAt'>,\n pageScope: AXPPlatformScopeKey,\n): boolean {\n if (setting.scope === pageScope) {\n return true;\n }\n return (setting.overridableAt ?? []).includes(pageScope);\n}\n","export enum AXPCommonSettings {\n EnableOperationToasts = 'Common:Setting:Notifications.EnableOperationToasts',\n RuntimeQueryCacheEnabled = 'Common:Setting:Performance.RuntimeQueryCacheEnabled',\n RuntimeQueryCacheTtlMs = 'Common:Setting:Performance.RuntimeQueryCacheTtlMs',\n EntityFilterApplyMode = 'Common:Setting:Entity.FilterApplyMode',\n ShowCategoryColumnsByDefault = 'Common:Setting:Entity.ShowCategoryColumnsByDefault',\n ApplyLayoutOrdering = 'Common:Setting:Entity.ApplyLayoutOrdering',\n RedirectToDetailsAfterCreate = 'Common:Setting:Entity.RedirectToDetailsAfterCreate',\n HighlightAfterCreateInList = 'Common:Setting:Entity.HighlightAfterCreateInList',\n ShowPageBadge = 'Common:Setting:Entity.ShowPageBadge',\n ConfirmUnsavedChanges = 'Common:Setting:Entity.ConfirmUnsavedChanges',\n DebugMode = 'PlatformDevTools:Setting:Developer.DebugMode',\n /**\n * Platform (P): when true and the API/network is unavailable, offer to continue from the\n * IndexedDB platform-settings cache. When false, bootstrap redirects to /auth/unavailable.\n */\n AllowWorkingOffline = 'Common:Setting:Offline.AllowWorkingOffline',\n ShowRowIndexColumn = 'Common:Setting:Entity.ShowRowIndexColumn',\n EntityListPersistenceMode = 'Common:Setting:Entity.ListPersistenceMode',\n NavigationMode = 'Common:Setting:Navigation.Mode',\n MaxOpenTabs = 'Common:Setting:Navigation.MaxOpenTabs',\n /** When true with entity list quick-search input, filters emit {@link AXP_QUERY_QUICK_SEARCH_FIELD} instead of inline OR. */\n QuickSearchEnabled = 'Common:Setting:Entity.QuickSearchEnabled',\n}\n\n/**\n * File-chooser keys live here so `common` can register Experience settings\n * without importing `layout/components` (ng-packagr secondary-entry cycle).\n * `layout/components` re-exports this const for existing file-chooser callers.\n */\nexport const AXPFileChooserSettings = {\n CompressImages: 'Common:Setting:FileChooser.CompressImages',\n PromptZipOnMultiple: 'Common:Setting:FileChooser.PromptZipOnMultiple',\n} as const;\n\n/** Defaults used before platform settings finish loading and by the setting definitions. */\nexport const AXP_RUNTIME_QUERY_CACHE_DEFAULTS = {\n enabled: true,\n ttlMs: 2_000,\n} as const;\n","\nimport { AXPWidgetTypesMap } from '@acorex-platform/framework-shared/widget-core';\nimport {AXPValueTransformerFunctions} from '@acorex-platform/framework-client/core';\n\nimport {AXPOptionsData, AXPPlatformScopeKey, AXPValidationRules, AXPWidgetTriggers} from '@acorex-platform/framework-shared/core';\n\nimport { merge } from 'lodash-es';\nimport { isSettingVisibleOnScope, normalizeOverridableAt } from './settings-scope.util';\nimport {\n AXPSettingDefinition,\n AXPSettingDefinitionGroup,\n AXPSettingDefinitionSection,\n AXPSettingLayoutOptions,\n AXPSettingSectionAction,\n} from './index';\n\nexport class AXPSettingDefinitionProviderContext {\n private rootGroups: AXPSettingDefinitionGroup[] = [];\n private groupMap: Map<string, AXPSettingDefinitionGroup> = new Map();\n\n addGroup(\n name: string,\n title: string,\n description?: string,\n icon?: string,\n pageTitle?: string,\n priority?: number,\n ): AXPSettingDefinitionGroupBuilder {\n const newGroup: AXPSettingDefinitionGroup = {\n name,\n title,\n pageTitle,\n description,\n icon,\n priority,\n groups: [],\n sections: [],\n };\n\n this.rootGroups.push(newGroup);\n this.groupMap.set(name, newGroup); // Index by name\n return new AXPSettingDefinitionGroupBuilder(this, newGroup);\n }\n\n group(name: string): AXPSettingDefinitionGroupBuilder | null {\n const foundGroup = this.groupMap.get(name);\n if (!foundGroup) {\n console.error(`Group with name \"${name}\" not found.`);\n return null;\n }\n return new AXPSettingDefinitionGroupBuilder(this, foundGroup);\n }\n\n getGroups(): AXPSettingDefinitionGroup[] {\n return this.rootGroups;\n }\n\n // Expose groupMap for controlled access\n hasGroup(name: string): boolean {\n return this.groupMap.has(name);\n }\n\n getGroup(name: string): AXPSettingDefinitionGroup | undefined {\n return this.groupMap.get(name);\n }\n}\n\nexport class AXPSettingDefinitionGroupBuilder {\n private context: AXPSettingDefinitionProviderContext;\n private group: AXPSettingDefinitionGroup;\n\n constructor(context: AXPSettingDefinitionProviderContext, group: AXPSettingDefinitionGroup) {\n this.context = context;\n this.group = group;\n }\n\n addSection(name: string, title: string, description?: string): AXPSettingDefinitionSectionBuilder {\n const newSection: AXPSettingDefinitionSection = {\n name,\n title,\n description: description,\n settings: [],\n };\n this.group.sections.push(newSection);\n return new AXPSettingDefinitionSectionBuilder(this, newSection);\n }\n\n section(name: string): AXPSettingDefinitionSectionBuilder | null {\n const foundSection = this.group.sections.find((section) => section.name === name);\n if (!foundSection) {\n throw new Error(`Section with name \"${name}\" not found in group \"${this.group.name}\".`);\n }\n return new AXPSettingDefinitionSectionBuilder(this, foundSection);\n }\n\n addGroup(\n name: string,\n title: string,\n description?: string,\n icon?: string,\n pageTitle?: string,\n priority?: number,\n ): AXPSettingDefinitionGroupBuilder {\n const newGroup: AXPSettingDefinitionGroup = {\n name,\n title,\n pageTitle,\n description: description,\n icon,\n priority,\n groups: [],\n sections: [],\n };\n this.group.groups.push(newGroup);\n if (this.context.hasGroup(name)) {\n throw new Error(`Group with name \"${name}\" already exists.`);\n }\n this.context['groupMap'].set(name, newGroup);\n return new AXPSettingDefinitionGroupBuilder(this.context, newGroup);\n }\n\n endGroup(): AXPSettingDefinitionProviderContext {\n return this.context;\n }\n}\n\nexport class AXPSettingDefinitionSectionBuilder {\n private groupBuilder: AXPSettingDefinitionGroupBuilder;\n private section: AXPSettingDefinitionSection;\n\n constructor(groupBuilder: AXPSettingDefinitionGroupBuilder, section: AXPSettingDefinitionSection) {\n this.groupBuilder = groupBuilder;\n this.section = section;\n }\n\n addSetting(setting: {\n key: string;\n title: string;\n scope: AXPPlatformScopeKey;\n widget: {\n type: AXPWidgetTypesMap[keyof AXPWidgetTypesMap] | string;\n options?: AXPOptionsData;\n triggers?: AXPWidgetTriggers;\n layout?: AXPSettingLayoutOptions;\n };\n description?: string;\n searchTagKeys?: string[];\n isRequired?: boolean;\n isInherited?: boolean;\n overridableAt?: AXPPlatformScopeKey[];\n /**\n * When false, never persist this key to IndexedDB. Default true.\n * Forced false when `isEncrypted` is true.\n */\n cacheable?: boolean;\n /**\n * Server stores this value encrypted at rest. Implies `cacheable: false`\n * (no client IndexedDB cache).\n */\n isEncrypted?: boolean;\n requiresPageRefresh?: boolean;\n defaultValue?: unknown;\n valueTransforms?: AXPValueTransformerFunctions;\n validationRules?: AXPValidationRules;\n }): this {\n const scope = setting.scope ?? 'P';\n const isEncrypted = setting.isEncrypted ?? false;\n const newSetting: AXPSettingDefinition = {\n name: setting.key,\n title: setting.title,\n description: setting.description,\n searchTagKeys: setting.searchTagKeys,\n isRequired: setting.isRequired ?? false,\n isInherited: setting.isInherited ?? false,\n overridableAt: normalizeOverridableAt(scope, setting.overridableAt),\n isEncrypted,\n cacheable: isEncrypted ? false : (setting.cacheable ?? true),\n requiresPageRefresh: setting.requiresPageRefresh ?? false,\n defaultValue: setting.defaultValue,\n scope,\n layout: setting.widget.layout,\n widget: {\n type: setting.widget.type,\n name: setting.key,\n path: setting.key,\n defaultValue: setting.defaultValue,\n options: merge(setting.widget.options ?? {},\n {\n label: Object.keys(setting.widget.options ?? {}).includes('label') ? setting.widget.options?.['label'] : setting.title,\n validationRules: setting.validationRules ?? [],\n }),\n valueTransforms: setting.valueTransforms,\n triggers: setting.widget.triggers,\n },\n } as AXPSettingDefinition;\n this.section.settings.push(newSetting);\n return this;\n }\n\n addAction(action: AXPSettingSectionAction): this {\n if (!this.section.actions) {\n this.section.actions = [];\n }\n this.section.actions.push(action);\n return this;\n }\n\n endSection(): AXPSettingDefinitionGroupBuilder {\n return this.groupBuilder;\n }\n}\n","import { AXPPlatformScope, AXPPlatformScopeKey } from '@acorex-platform/framework-shared/core';\nimport { Injectable, InjectionToken, inject } from '@angular/core';\nimport { sortBy } from 'lodash-es';\nimport { isSettingVisibleOnScope } from './settings-scope.util';\nimport { AXPSettingDefinitionProviderContext } from './setting.builder';\nimport {\n AXPGroupSearchResult,\n AXPSettingDefaultValuesProvider,\n AXPSettingDefinition,\n AXPSettingDefinitionGroup,\n AXPSettingDefinitionSection,\n} from './settings.types';\n\nexport interface AXPSettingSectionLookupResult {\n group: AXPSettingDefinitionGroup;\n section: AXPSettingDefinitionSection;\n}\n// Interface for setting providers\nexport interface AXPSettingDefinitionProvider {\n provide(context: AXPSettingDefinitionProviderContext): Promise<void>;\n}\n\n// Injection token for setting providers\nexport const AXP_SETTING_DEFINITION_PROVIDER = new InjectionToken<AXPSettingDefinitionProvider[]>(\n 'AXP_SETTING_DEFINITION_PROVIDER',\n);\n\n@Injectable({ providedIn: 'root' })\nexport class AXPSettingDefinitionProviderService {\n private providers = inject(AXP_SETTING_DEFINITION_PROVIDER, { optional: true });\n private cache: AXPSettingDefinitionGroup[] | null = null;\n private loadPromise: Promise<void> | null = null;\n\n private async load(): Promise<void> {\n if (this.cache) {\n return;\n }\n if (!this.loadPromise) {\n this.loadPromise = this.loadDefinitions().finally(() => {\n this.loadPromise = null;\n });\n }\n await this.loadPromise;\n }\n\n private async loadDefinitions(): Promise<void> {\n if (this.cache) {\n return;\n }\n const context = new AXPSettingDefinitionProviderContext();\n\n // Load providers from DI tokens — isolate failures so one provider cannot block bootstrap.\n const providerList = this.normalizeProviders(this.providers);\n for (const provider of providerList) {\n try {\n if (provider instanceof Promise) {\n const resolvedProvider = await provider;\n await resolvedProvider.provide(context);\n } else {\n await provider.provide(context);\n }\n } catch (error) {\n console.warn('Setting definition provider failed; continuing with remaining providers', error);\n }\n }\n\n this.cache = context.getGroups();\n }\n\n private normalizeProviders(\n providers: AXPSettingDefinitionProvider | AXPSettingDefinitionProvider[] | null | undefined,\n ): AXPSettingDefinitionProvider[] {\n if (!providers) {\n return [];\n }\n return Array.isArray(providers) ? providers : [providers];\n }\n\n public async reload(): Promise<void> {\n this.cache = null;\n await this.load();\n }\n\n public async getListAsync(scope: AXPPlatformScopeKey): Promise<AXPSettingDefinitionGroup[]> {\n await this.load();\n return this.getList(scope);\n }\n\n public getList(scope: AXPPlatformScopeKey): AXPSettingDefinitionGroup[] {\n if (!this.cache) {\n return [];\n }\n\n const filterByScope = (\n groups: AXPSettingDefinitionGroup[],\n currentScope: AXPPlatformScopeKey,\n ): AXPSettingDefinitionGroup[] => {\n return groups\n .map((group) => ({\n ...group,\n sections: group.sections\n .map((section) => ({\n ...section,\n settings: section.settings.filter((setting) => isSettingVisibleOnScope(setting, currentScope)),\n }))\n .filter((section) => section.settings.length > 0), // Keep only sections with settings\n groups: filterByScope(group.groups, currentScope), // Recursively filter nested groups\n }))\n .filter((group) => group.sections.length > 0 || group.groups.length > 0); // Keep groups with valid sections or nested groups\n };\n\n return sortBy(filterByScope(this.cache, scope), [(group) => group.priority ?? 1000, 'title']);\n }\n\n async defaultValues(): Promise<Record<string, unknown>> {\n const defaults: Record<string, unknown> = {};\n\n const collectDefaults = (groups: AXPSettingDefinitionGroup[]) => {\n groups.forEach((group) => {\n group.sections.forEach((section) => {\n section.settings.forEach((setting) => {\n const value = setting.defaultValue;\n // Never surface blank strings as defaults — they become persisted overrides.\n if (value === undefined || value === null) {\n return;\n }\n if (typeof value === 'string' && value.trim() === '') {\n return;\n }\n defaults[setting.name] = value;\n });\n });\n collectDefaults(group.groups);\n });\n };\n\n if (!this.cache) {\n await this.load();\n }\n collectDefaults(this.cache!);\n\n return defaults;\n }\n\n async settingScopeByKey(): Promise<Record<string, AXPPlatformScope>> {\n const scopes: Record<string, AXPPlatformScope> = {};\n\n const collect = (groups: AXPSettingDefinitionGroup[]) => {\n groups.forEach((group) => {\n group.sections.forEach((section) => {\n section.settings.forEach((setting) => {\n scopes[setting.name] = setting.scope as AXPPlatformScope;\n });\n });\n collect(group.groups);\n });\n };\n\n if (!this.cache) {\n await this.load();\n }\n collect(this.cache!);\n\n return scopes;\n }\n\n async settingInheritedByKey(): Promise<Record<string, boolean>> {\n const inheritedByKey: Record<string, boolean> = {};\n\n const collect = (groups: AXPSettingDefinitionGroup[]) => {\n groups.forEach((group) => {\n group.sections.forEach((section) => {\n section.settings.forEach((setting) => {\n if (setting.isInherited) {\n inheritedByKey[setting.name] = true;\n }\n });\n });\n collect(group.groups);\n });\n };\n\n if (!this.cache) {\n await this.load();\n }\n collect(this.cache!);\n\n return inheritedByKey;\n }\n\n /** Per-key IndexedDB eligibility; missing keys default to cacheable (`true`). `isEncrypted` forces false. */\n async settingCacheableByKey(): Promise<Record<string, boolean>> {\n const cacheableByKey: Record<string, boolean> = {};\n\n const collect = (groups: AXPSettingDefinitionGroup[]) => {\n groups.forEach((group) => {\n group.sections.forEach((section) => {\n section.settings.forEach((setting) => {\n cacheableByKey[setting.name] = setting.isEncrypted ? false : setting.cacheable !== false;\n });\n });\n collect(group.groups);\n });\n };\n\n if (!this.cache) {\n await this.load();\n }\n collect(this.cache!);\n\n return cacheableByKey;\n }\n\n /** Per-key client-cache encryption marker; missing keys default to not encrypted. */\n async settingEncryptedByKey(): Promise<Record<string, boolean>> {\n const encryptedByKey: Record<string, boolean> = {};\n\n const collect = (groups: AXPSettingDefinitionGroup[]) => {\n groups.forEach((group) => {\n group.sections.forEach((section) => {\n section.settings.forEach((setting) => {\n if (setting.isEncrypted) {\n encryptedByKey[setting.name] = true;\n }\n });\n });\n collect(group.groups);\n });\n };\n\n if (!this.cache) {\n await this.load();\n }\n collect(this.cache!);\n\n return encryptedByKey;\n }\n\n async requiresPageRefreshByKey(): Promise<Record<string, boolean>> {\n const refreshByKey: Record<string, boolean> = {};\n\n const collect = (groups: AXPSettingDefinitionGroup[]) => {\n groups.forEach((group) => {\n group.sections.forEach((section) => {\n section.settings.forEach((setting) => {\n if (setting.requiresPageRefresh) {\n refreshByKey[setting.name] = true;\n }\n });\n });\n collect(group.groups);\n });\n };\n\n if (!this.cache) {\n await this.load();\n }\n collect(this.cache!);\n\n return refreshByKey;\n }\n\n public findGroup(scope: AXPPlatformScopeKey, groupName: string): AXPGroupSearchResult {\n return this.searchRecursive(this.getList(scope), groupName, []); // Initialize with an empty breadcrumb\n }\n\n async findSection(\n scope: AXPPlatformScopeKey,\n sectionName: string,\n groupName?: string,\n ): Promise<AXPSettingSectionLookupResult | null> {\n await this.load();\n return this.searchSectionRecursive(this.getList(scope), sectionName, groupName);\n }\n\n async collectSettingsByKeys(scope: AXPPlatformScopeKey, keys: string[]): Promise<AXPSettingDefinition[]> {\n if (!keys.length) {\n return [];\n }\n\n await this.load();\n const keySet = new Set(keys);\n const found = new Map<string, AXPSettingDefinition>();\n const walk = (groups: AXPSettingDefinitionGroup[]) => {\n for (const group of groups) {\n for (const section of group.sections) {\n for (const setting of section.settings) {\n if (keySet.has(setting.name) && !found.has(setting.name)) {\n found.set(setting.name, setting);\n }\n }\n }\n walk(group.groups);\n }\n };\n walk(this.getList(scope));\n return keys.map((key) => found.get(key)).filter((setting): setting is AXPSettingDefinition => !!setting);\n }\n\n private searchSectionRecursive(\n groups: AXPSettingDefinitionGroup[],\n sectionName: string,\n groupName?: string,\n ): AXPSettingSectionLookupResult | null {\n for (const group of groups) {\n if (groupName && group.name !== groupName) {\n const nested = this.searchSectionRecursive(group.groups, sectionName, groupName);\n if (nested) {\n return nested;\n }\n continue;\n }\n\n for (const section of group.sections) {\n if (section.name === sectionName) {\n return { group, section };\n }\n }\n\n const nested = this.searchSectionRecursive(group.groups, sectionName, groupName);\n if (nested) {\n return nested;\n }\n }\n\n return null;\n }\n\n private searchRecursive(\n groups: AXPSettingDefinitionGroup[],\n groupName: string,\n breadcrumb: { name: string; title: string }[],\n ): AXPGroupSearchResult {\n for (const group of groups) {\n const currentBreadcrumb = [\n ...breadcrumb,\n { name: group.name, title: group.title, description: group.description },\n ];\n\n // If the group name matches, return its details\n if (group.name === groupName) {\n return {\n breadcrumb: currentBreadcrumb,\n sections: group.sections.length > 0 ? group.sections : null,\n groups: group.groups.length > 0 ? group.groups : null,\n };\n }\n\n // Recursively search in nested groups\n const nestedResult = this.searchRecursive(group.groups, groupName, currentBreadcrumb);\n if (nestedResult.breadcrumb.length > 0) {\n return nestedResult;\n }\n }\n\n // If no matching group is found\n return {\n breadcrumb: [],\n groups: [],\n sections: [],\n };\n }\n}\n\n/**\n * Higher-layer default values (demo/app overrides).\n * Provide either:\n * - `{ provide: AXP_SETTING_DEFAULT_VALUES_PROVIDERS, useValue: [provider] }`, or\n * - multiple `{ provide: AXP_SETTING_DEFAULT_VALUES_PROVIDERS, useValue: provider, multi: true }`.\n */\nexport const AXP_SETTING_DEFAULT_VALUES_PROVIDERS = new InjectionToken<\n AXPSettingDefaultValuesProvider | AXPSettingDefaultValuesProvider[]\n>('AXP_SETTING_DEFAULT_VALUES_PROVIDERS');\n\nexport interface AXPSettingMergedDefaults {\n defaults: Record<string, unknown>;\n /** Per-key scope override for seeding (from providers that set `scope`). */\n seedScopeByKey: Record<string, AXPPlatformScope>;\n}\n\n// Aggregator service that merges definition defaults with higher-layer providers (by priority)\n@Injectable({ providedIn: 'root' })\nexport class AXPSettingDefaultValuesAggregatorService {\n private readonly definitionService = inject(AXPSettingDefinitionProviderService);\n private readonly injectedProviders = inject(AXP_SETTING_DEFAULT_VALUES_PROVIDERS, { optional: true });\n\n private resolveProviders(): AXPSettingDefaultValuesProvider[] {\n const raw = this.injectedProviders;\n if (!raw) {\n return [];\n }\n return Array.isArray(raw) ? raw : [raw];\n }\n\n async getMerged(): Promise<AXPSettingMergedDefaults> {\n const baseDefaults = await this.definitionService.defaultValues();\n const ordered = [...this.resolveProviders()].sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n const merged: Record<string, unknown> = { ...baseDefaults };\n const seedScopeByKey: Record<string, AXPPlatformScope> = {};\n for (const provider of ordered) {\n try {\n const overrideMap = await provider.provide();\n for (const [key, value] of Object.entries(overrideMap)) {\n if (value === undefined || value === null) {\n continue;\n }\n if (typeof value === 'string' && value.trim() === '') {\n continue;\n }\n merged[key] = value;\n if (provider.scope) {\n seedScopeByKey[key] = provider.scope;\n }\n }\n } catch (err) {\n console.error('AXPSettingDefaultValuesProvider failed:', err);\n }\n }\n return { defaults: merged, seedScopeByKey };\n }\n\n async getDefaults(): Promise<Record<string, unknown>> {\n const { defaults } = await this.getMerged();\n return defaults;\n }\n}\n","//#region ---- Imports ----\n\nimport {\n coerceUnknownToBoolean,\n coerceUnknownToDate,\n coerceUnknownToFiniteNumber,\n coerceUnknownToTrimmedString,\n isLocaleStringMap,\n unwrapValueProperty,\n} from '@acorex-platform/framework-shared/core';\n\n//#endregion\n\n//#region ---- Types ----\n\n/**\n * Supported primitive coercions for persisted setting values (including `{ value: ... }` wrappers).\n */\nexport type AXPSettingCoercionKind = 'string' | 'boolean' | 'number' | 'date';\n\n//#endregion\n\n//#region ---- Kind inference ----\n\n/**\n * If the payload uses the common `{ value: T }` shape from setting widgets, returns the inner value; otherwise returns `raw`.\n */\nexport function peelSettingValueKey(raw: unknown): unknown {\n return unwrapValueProperty(raw);\n}\n\nfunction coercionKindFromScalarSample(v: unknown): AXPSettingCoercionKind | null {\n if (v === null || v === undefined) {\n return null;\n }\n if (typeof v === 'boolean') {\n return 'boolean';\n }\n if (typeof v === 'number' && Number.isFinite(v)) {\n return 'number';\n }\n if (v instanceof Date) {\n return 'date';\n }\n if (typeof v === 'string') {\n if (v === 'true' || v === 'false') {\n return 'boolean';\n }\n return 'string';\n }\n return null;\n}\n\n/**\n * Picks a primitive coercion kind from the setting definition default and/or the effective stored value.\n * Type argument `T` on the settings service `get` method is compile-time only; runtime behavior follows this inference.\n *\n * Locale maps (`{ 'en-US': '...', 'fa-IR': '...' }`) are never string-coerced — even when the\n * definition default is a plain string (common for newly multi-language settings).\n */\nexport function inferSettingCoercionKind(defaultSample: unknown, effective: unknown): AXPSettingCoercionKind | null {\n const unwrapped = unwrapValueProperty(effective);\n if (isLocaleStringMap(unwrapped)) {\n return null;\n }\n const fromDefault = coercionKindFromScalarSample(defaultSample);\n if (fromDefault) {\n return fromDefault;\n }\n return coercionKindFromScalarSample(unwrapped);\n}\n\n//#endregion\n\n//#region ---- Value coercion ----\n\nexport function coerceAXPSettingRawValueByKind(raw: unknown, kind: AXPSettingCoercionKind): string | boolean | number | Date {\n switch (kind) {\n case 'string':\n return coerceUnknownToTrimmedString(raw);\n case 'boolean':\n return coerceUnknownToBoolean(raw);\n case 'number':\n return coerceUnknownToFiniteNumber(raw);\n case 'date':\n return coerceUnknownToDate(raw);\n default: {\n const _exhaustive: never = kind;\n return _exhaustive;\n }\n }\n}\n\nexport function coerceAXPSettingRawValue(raw: unknown, kind: 'string'): string;\nexport function coerceAXPSettingRawValue(raw: unknown, kind: 'boolean'): boolean;\nexport function coerceAXPSettingRawValue(raw: unknown, kind: 'number'): number;\nexport function coerceAXPSettingRawValue(raw: unknown, kind: 'date'): Date;\nexport function coerceAXPSettingRawValue(raw: unknown, kind: AXPSettingCoercionKind): string | boolean | number | Date {\n return coerceAXPSettingRawValueByKind(raw, kind);\n}\n\n//#endregion\n","import { InjectionToken } from '@angular/core';\n\nimport type { AXPSettingsSyncKeys } from '@acorex-platform/framework-shared/core';\n\nexport type { AXPSettingsSyncKeys };\n\nexport const AXP_SETTINGS_SYNC_KEYS = new InjectionToken<AXPSettingsSyncKeys>('AXP_SETTINGS_SYNC_KEYS');\n","import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport {\n AXPPlatformScope,\n runtimeCommandPayloadData,\n runtimeQueryPayloadData,\n} from '@acorex-platform/framework-shared/core';\nimport { AXPCommandService, AXPQueryService } from '@acorex-platform/framework-client/runtime';\nimport { inject, Injectable } from '@angular/core';\nimport { isString, toString } from 'lodash-es';\n\nimport { AXP_SETTINGS_SYNC_KEYS } from './settings-sync-keys.token';\nimport {\n AXPSettingsBulkFetchResult,\n AXPSettingsBulkPatchResult,\n AXPSettingsScopedFetchInput,\n AXPSettingsScopedPatchInput,\n} from './settings-sync.types';\n\n//#region ---- Settings bulk sync (query + command) ----\n\nconst EMPTY_FETCH_RESULT: AXPSettingsBulkFetchResult = {\n changed: false,\n updatedAt: null,\n values: {},\n};\n\n@Injectable({ providedIn: 'root' })\nexport class AXPSettingsBulkSyncService {\n private readonly queryService = inject(AXPQueryService);\n private readonly commandService = inject(AXPCommandService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly syncKeys = inject(AXP_SETTINGS_SYNC_KEYS);\n private readonly fetchInFlight = new Map<string, Promise<AXPSettingsBulkFetchResult>>();\n\n /** Clears deduped fetch promises so sign-out does not await stale tenant/user sync. */\n cancelInFlightFetches(): void {\n this.fetchInFlight.clear();\n }\n\n async fetch(scope: AXPPlatformScope, since: string | null): Promise<AXPSettingsBulkFetchResult> {\n if (scope !== AXPPlatformScope.Platform && !this.sessionService.isAuthenticated) {\n return EMPTY_FETCH_RESULT;\n }\n if (scope === AXPPlatformScope.User && !this.sessionService.isReadyForAppScopedApi) {\n return EMPTY_FETCH_RESULT;\n }\n\n const cacheKey = `${scope}:${since ?? ''}`;\n const inFlight = this.fetchInFlight.get(cacheKey);\n if (inFlight) {\n return inFlight;\n }\n\n const request = this.queryService\n .fetch<AXPSettingsScopedFetchInput, AXPSettingsBulkFetchResult>(\n this.syncKeys.scopedFetchQueryKey,\n { scope, since },\n )\n .then((result) => {\n if (!result) {\n throw new Error(`Settings fetch query '${this.syncKeys.scopedFetchQueryKey}' is not registered`);\n }\n const data = runtimeQueryPayloadData(result);\n if (!data) {\n const message = result.message?.text;\n const text = isString(message) ? message : toString(message);\n throw new Error(text || `Settings fetch query '${this.syncKeys.scopedFetchQueryKey}' failed`);\n }\n return data;\n })\n .finally(() => {\n this.fetchInFlight.delete(cacheKey);\n });\n\n this.fetchInFlight.set(cacheKey, request);\n return request;\n }\n\n async patch(scope: AXPPlatformScope, values: Record<string, unknown>): Promise<AXPSettingsBulkPatchResult> {\n if (scope !== AXPPlatformScope.Platform && !this.sessionService.isAuthenticated) {\n throw new Error('Cannot patch tenant/user scoped settings without an authenticated session');\n }\n if (scope === AXPPlatformScope.User && !this.sessionService.isReadyForAppScopedApi) {\n throw new Error('Cannot patch user scoped settings before the session is fully authorized');\n }\n\n const input: AXPSettingsScopedPatchInput = { scope, values };\n const result = await this.commandService.execute<AXPSettingsScopedPatchInput, AXPSettingsBulkPatchResult>(\n this.syncKeys.scopedPatchCommandKey,\n input,\n );\n const data = runtimeCommandPayloadData(result);\n if (!data) {\n const message = result?.message?.text;\n const text = isString(message) ? message : toString(message);\n throw new Error(text || `Settings patch command '${this.syncKeys.scopedPatchCommandKey}' failed`);\n }\n return data;\n }\n}\n\n//#endregion\n","import { AXPPlatformScope } from '@acorex-platform/framework-shared/core';\nimport { InjectionToken } from '@angular/core';\n\n//#region ---- Settings cache sync (avoids circular imports) ----\n\nexport interface AXPSettingsCacheSync {\n syncScopeCache(scope: AXPPlatformScope, values: Record<string, unknown>): void;\n}\n\nexport const AXP_SETTINGS_CACHE_SYNC = new InjectionToken<AXPSettingsCacheSync>('AXP_SETTINGS_CACHE_SYNC');\n\n//#endregion\n","import { AXPPlatformScope } from '@acorex-platform/framework-shared/core';\n\n//#region ---- Revalidation TTL (per scope) ----\n\n/** How long a local snapshot is considered fresh before background revalidation. */\nexport const AXP_SETTINGS_SYNC_TTL_MS: Record<AXPPlatformScope, number> = {\n [AXPPlatformScope.User]: 5 * 60_000, // 5 Minutes\n [AXPPlatformScope.Tenant]: 60_000, // 1 Minutes\n [AXPPlatformScope.Platform]: 60_000, // 1 Minutes\n};\n\n//#endregion\n\n//#region ---- Persist debounce & retry ----\n\n/** Trailing debounce before bulk PATCH for incremental UI saves (theme resize, etc.). */\nexport const AXP_SETTINGS_SYNC_DEBOUNCE_MS = 5 * 1_000; // 5 Seconds\n\n/** Silent retry backoff steps (ms); last value repeats. */\nexport const AXP_SETTINGS_SYNC_RETRY_BACKOFF_MS = [2_000, 5_000, 15_000, 60_000] as const;\n\n//#endregion\n","/** Debug namespace for all settings diagnostics. Filter console with `[AXP:Settings]`. */\nexport const SETTINGS_TRACE_NS = 'Settings';\n\n//#region ---- Trace area titles (console `[AXP:Settings] <title> — …`) ----\n\nexport const SETTINGS_TRACE_TITLE = {\n /** AXPSettingsService in-memory cache (load, reload, ensureLoaded). */\n Cache: 'Cache',\n /** IndexedDB scoped snapshot provider (hydrate, debounce, flush). */\n LocalSnapshot: 'LocalSnapshot',\n /** Query/command bulk sync — counts as a server request. */\n ServerSync: 'ServerSync',\n /** AXPAppStartUpService settings task on app boot. */\n Startup: 'Startup',\n /** Settings page route + view model. */\n Page: 'Page',\n /** Dev-only client storage tools (export / import / reset). */\n ClientTools: 'ClientTools',\n} as const;\n\n//#endregion\n","import { AXPPlatformScope } from '@acorex-platform/framework-shared/core';\nimport { AXPDebugService } from '@acorex-platform/framework-client/core';\n\nimport { SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE } from './settings-trace.constants';\n\n//#region ---- Local snapshot (IndexedDB) ----\n\n/** Emitted immediately after values are written to the scoped IndexedDB snapshot. */\nexport function traceSettingsLocalPersist(\n scope: AXPPlatformScope,\n payload: {\n snapshotId: string;\n keys: string[];\n dirtyKeyCount: number;\n flush: boolean;\n },\n): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.LocalSnapshot, 'Persisted locally', () => ({\n scope,\n snapshotId: payload.snapshotId,\n keys: payload.keys,\n dirtyKeyCount: payload.dirtyKeyCount,\n flush: payload.flush,\n note:\n scope === AXPPlatformScope.Platform\n ? payload.flush\n ? 'Platform IndexedDB cache updated — explicit ServerSync flush (admin save)'\n : 'Platform IndexedDB one-way cache updated — no server Patch from local dirty'\n : scope === AXPPlatformScope.User\n ? payload.flush\n ? 'IndexedDB updated — ServerSync flush runs immediately (flush: true)'\n : 'IndexedDB updated — dirty keys queued; ServerSync runs after debounce'\n : payload.flush\n ? 'In-memory snapshot updated — ServerSync flush runs immediately (flush: true)'\n : 'In-memory snapshot updated — dirty keys queued; ServerSync runs after debounce',\n }));\n}\n\n//#endregion\n\n//#region ---- Server sync ----\n\n/** Emitted once per bulk query/command call. Count these for server request frequency. */\nexport function traceSettingsServerApiCall(\n method: 'GET' | 'PATCH',\n scope: AXPPlatformScope,\n payload: Record<string, unknown>,\n): void {\n const message = method === 'GET' ? 'Server fetch' : 'Server patch';\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.ServerSync, message, () => ({\n scope,\n method,\n ...payload,\n note:\n method === 'GET'\n ? 'Background revalidate via SettingsManagement:ScopedSettings:Fetch'\n : 'Persist dirty keys via SettingsManagement:ScopedSettings:Patch',\n }));\n}\n\nexport function traceSettingsFlush(\n scope: AXPPlatformScope,\n payload: { snapshotId: string; keys: string[] },\n): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.LocalSnapshot, 'Server flush started', () => ({\n scope,\n ...payload,\n note: 'Debounce elapsed — sending dirty keys to server',\n }));\n}\n\nexport function traceSettingsSyncFailed(\n scope: AXPPlatformScope,\n payload: { snapshotId: string; keys: string[]; attempt: number },\n): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.LocalSnapshot, 'Sync failed', () => ({\n scope,\n ...payload,\n note: 'ServerSync PATCH failed — dirty keys kept; silent retry scheduled',\n }));\n}\n\nexport function traceSettingsRetryScheduled(\n scope: AXPPlatformScope,\n payload: { snapshotId: string; attempt: number; backoffMs: number; nextRetryAt: string },\n): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.LocalSnapshot, 'Retry scheduled', () => ({\n scope,\n ...payload,\n note: 'Backoff timer set — will retry ServerSync PATCH when due',\n }));\n}\n\nexport function traceSettingsRevalidateFailed(\n scope: AXPPlatformScope,\n payload: { snapshotId: string; since: string | null },\n): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.LocalSnapshot, 'Refresh failed', () => ({\n scope,\n ...payload,\n note: 'ServerSync GET failed — local snapshot remains authoritative until next attempt',\n }));\n}\n\n//#endregion\n\n//#region ---- Cache (AXPSettingsService) ----\n\nexport function traceSettingsAppStartupLoadStarted(): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.Startup, 'Task started', () => ({\n note: 'AXPAppStartUpService — calls AXPSettingsService.load() for all scopes',\n }));\n}\n\nexport function traceSettingsAppStartupLoadComplete(payload: {\n totalKeys: number;\n keysByScope: Record<string, number>;\n durationMs: number;\n}): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.Startup, 'Task finished', () => ({\n ...payload,\n note: 'App boot settings preload complete',\n }));\n}\n\nexport function traceSettingsServiceLoadStarted(reason: string): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.Cache, 'Load started', () => ({\n reason,\n note: 'Loading all scope providers into in-memory cache',\n }));\n}\n\nexport function traceSettingsServiceLoadComplete(payload: {\n totalKeys: number;\n keysByScope: Record<string, number>;\n durationMs: number;\n}): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.Cache, 'Load finished', () => ({\n ...payload,\n note: 'In-memory cache ready for get() / settings page',\n }));\n}\n\nexport function traceSettingsServiceReload(scope: AXPPlatformScope | 'all', reason: string): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.Cache, 'Reload', () => ({\n scope,\n reason,\n note: scope === 'all' ? 'Full cache refresh' : 'Single scope refresh',\n }));\n}\n\nexport function traceSettingsServiceLoadFailed(error: unknown): void {\n AXPDebugService.instance?.error(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.Cache, 'Load failed', () => ({\n note: 'Provider load or default seeding threw — in-memory cache may be incomplete',\n error: error instanceof Error ? error.message : String(error),\n }));\n}\n\n//#endregion\n\n//#region ---- Settings page ----\n\nexport function traceSettingsPageLoadStarted(scope: string, reason: string): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.Page, 'View load started', () => ({\n scope,\n reason,\n note: 'Loading definition groups and scope values into the page view model',\n }));\n}\n\nexport function traceSettingsPageLoadComplete(payload: {\n scope: string;\n groupCount: number;\n valueKeyCount: number;\n durationMs: number;\n}): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.Page, 'View load finished', () => ({\n ...payload,\n note: 'Settings page ready to render',\n }));\n}\n\nexport function traceSettingsPageRouteLoad(scope: string, reason: string): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.Page, 'Route → load', () => ({\n scope,\n reason,\n note: 'Scope changed or page not loaded yet — triggering view model load',\n }));\n}\n\n//#endregion\n\n//#region ---- Client tools (mock dev commands) ----\n\nexport function traceSettingsClientTool(\n command: 'export' | 'import' | 'reset',\n message: string,\n payload: Record<string, unknown> = {},\n): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.ClientTools, message, () => ({\n command,\n ...payload,\n note:\n command === 'export'\n ? 'Downloads localStorage and IndexedDB snapshot as JSON'\n : command === 'import'\n ? 'Restores localStorage and IndexedDB from a JSON file'\n : 'Clears browser storage — does not call ServerSync',\n }));\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPPlatformScope } from '@acorex-platform/framework-shared/core';\nimport Dexie, { Table } from 'dexie';\nimport { isPlainObject } from 'lodash-es';\n\nimport { AXPScopedSettingsSnapshot } from './settings-sync.types';\n\n//#endregion\n\n//#region ---- Dexie DB ----\n\nexport class AXPSettingsIndexedDb extends Dexie {\n scoped_snapshots!: Table<AXPScopedSettingsSnapshot, string>;\n\n constructor() {\n super('ACoreXSettings');\n this.version(1).stores({\n scoped_snapshots: 'id, scope',\n });\n // v2 briefly added device_keys for client-side encrypt; kept for upgrade path, unused.\n this.version(2).stores({\n scoped_snapshots: 'id, scope',\n device_keys: 'id',\n });\n }\n}\n\nexport const axpSettingsIndexedDb = new AXPSettingsIndexedDb();\n\n//#endregion\n\n//#region ---- Snapshot helpers ----\n\nexport function buildScopedSettingsSnapshotId(scope: AXPPlatformScope, contextKey: string): string {\n return contextKey ? `${scope}:${contextKey}` : scope;\n}\n\nexport function createEmptyScopedSettingsSnapshot(\n id: string,\n scope: AXPPlatformScope,\n): AXPScopedSettingsSnapshot {\n return {\n id,\n scope,\n values: {},\n serverUpdatedAt: null,\n lastRevalidatedAt: null,\n dirty: {},\n syncStatus: 'idle',\n nextRetryAt: null,\n retryAttempt: 0,\n };\n}\n\n/**\n * User: bidirectional local cache.\n * Platform: one-way cache (server → IndexedDB) for fast boot — never flushed back from dirty state.\n * Tenant: memory-only.\n */\nexport function shouldPersistSettingsInIndexedDb(scope: AXPPlatformScope): boolean {\n return scope === AXPPlatformScope.User || scope === AXPPlatformScope.Platform;\n}\n\n/**\n * Platform IndexedDB rows are a read-through cache only.\n * Local dirty must not be Patch'd back to the server from that cache.\n */\nexport function isOneWaySettingsIndexedDbCache(scope: AXPPlatformScope): boolean {\n return scope === AXPPlatformScope.Platform;\n}\n\n/** Removes legacy tenant rows (tenant settings are memory-only). Platform cache is kept. */\nexport async function purgeLegacyTenantScopedSettingsSnapshots(): Promise<void> {\n await axpSettingsIndexedDb.scoped_snapshots.where('scope').equals(AXPPlatformScope.Tenant).delete();\n}\n\n/**\n * Drops accidental nested parent objects created when dotted setting keys were written via\n * path-based `setSmart` (e.g. `Common:Setting:Offline: { AllowWorkingOffline }`).\n * Flat keys like `Common:Setting:Offline.AllowWorkingOffline` are kept.\n */\nexport function stripAccidentalNestedSettingParents(\n values: Record<string, unknown>,\n): Record<string, unknown> {\n const keys = Object.keys(values);\n const cleaned: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(values)) {\n if (isPlainObject(value) && keys.some((other) => other.startsWith(`${key}.`))) {\n continue;\n }\n cleaned[key] = value;\n }\n return cleaned;\n}\n\n//#endregion\n","//#region ----- Types -----\n\nexport interface AXPSettingsLocalCachePolicy {\n /** Missing keys default to cacheable. */\n cacheableByKey: Record<string, boolean>;\n}\n\n//#endregion\n\n//#region ----- Policy helpers -----\n\nexport function isSettingKeyCacheable(key: string, policy: AXPSettingsLocalCachePolicy): boolean {\n return policy.cacheableByKey[key] !== false;\n}\n\n//#endregion\n\n//#region ----- Disk projection / hydrate -----\n\n/**\n * Builds the IndexedDB projection from the in-memory map.\n * Drops keys with `cacheable: false` (including secrets marked `isEncrypted`).\n */\nexport function projectSettingsValuesForIndexedDb(\n values: Record<string, unknown>,\n policy: AXPSettingsLocalCachePolicy,\n): Record<string, unknown> {\n const projected: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(values)) {\n if (!isSettingKeyCacheable(key, policy)) {\n continue;\n }\n projected[key] = value;\n }\n return projected;\n}\n\n/**\n * Converts an IndexedDB values map into in-memory values.\n * Non-cacheable keys left on disk from legacy snapshots are dropped and trigger a rewrite.\n */\nexport function hydrateSettingsValuesFromIndexedDb(\n values: Record<string, unknown>,\n policy: AXPSettingsLocalCachePolicy,\n): { memoryValues: Record<string, unknown>; diskNeedsRewrite: boolean } {\n const memoryValues: Record<string, unknown> = {};\n let diskNeedsRewrite = false;\n\n for (const [key, value] of Object.entries(values)) {\n if (!isSettingKeyCacheable(key, policy)) {\n diskNeedsRewrite = true;\n continue;\n }\n memoryValues[key] = value;\n }\n\n return { memoryValues, diskNeedsRewrite };\n}\n\n//#endregion\n","import { AXPSessionService, AXPSessionStatus } from '@acorex-platform/framework-client/auth';\nimport { AXPPlatformScope } from '@acorex-platform/framework-shared/core';\nimport { Injector } from '@angular/core';\nimport { defaultTo, isEmpty, merge } from 'lodash-es';\nimport { combineLatest, distinctUntilChanged, map } from 'rxjs';\n\nimport { AXPSettingDefinitionProviderService } from './setting-definition.service';\nimport { AXPSettingsBulkSyncService } from './settings-bulk-sync.service';\nimport { AXP_SETTINGS_CACHE_SYNC } from './settings-cache-sync.token';\nimport {\n AXP_SETTINGS_SYNC_DEBOUNCE_MS,\n AXP_SETTINGS_SYNC_RETRY_BACKOFF_MS,\n AXP_SETTINGS_SYNC_TTL_MS,\n} from './settings-sync.config';\nimport {\n traceSettingsFlush,\n traceSettingsLocalPersist,\n traceSettingsRevalidateFailed,\n traceSettingsRetryScheduled,\n traceSettingsServerApiCall,\n traceSettingsSyncFailed,\n} from './settings-sync.trace';\nimport {\n axpSettingsIndexedDb,\n buildScopedSettingsSnapshotId,\n createEmptyScopedSettingsSnapshot,\n isOneWaySettingsIndexedDbCache,\n shouldPersistSettingsInIndexedDb,\n stripAccidentalNestedSettingParents,\n} from './settings-indexed-db';\nimport {\n hydrateSettingsValuesFromIndexedDb,\n projectSettingsValuesForIndexedDb,\n type AXPSettingsLocalCachePolicy,\n} from './settings-local-cache.util';\nimport { AXPScopedSettingsSnapshot } from './settings-sync.types';\nimport {\n AXPSettingReloadOptions,\n AXPSettingSetOptions,\n AXPSettingValue,\n AXPSettingValueProvider,\n} from './settings.types';\n\n//#region ---- Scoped settings provider (User bidirectional; Platform one-way cache) ----\n\nexport class AXPIndexedDbSettingValueProvider implements AXPSettingValueProvider {\n private readonly sessionService = this.injector.get(AXPSessionService);\n private readonly bulkSync = this.injector.get(AXPSettingsBulkSyncService);\n\n private contextKey: string | null = null;\n private snapshotId: string | null = null;\n private snapshot: AXPScopedSettingsSnapshot | null = null;\n private hydrated = false;\n private hydratePromise: Promise<void> | null = null;\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private retryTimer: ReturnType<typeof setTimeout> | null = null;\n private flushInFlight: Promise<void> | null = null;\n private revalidateInFlight: Promise<void> | null = null;\n private syncGeneration = 0;\n /**\n * Depth counter for require-server reloads. A concurrent soft reload must not clear\n * an in-flight startup requireServer Fetch.\n */\n private requireServerSyncDepth = 0;\n\n constructor(\n private readonly _scope: AXPPlatformScope,\n private readonly injector: Injector,\n ) {\n if (this._scope === AXPPlatformScope.Platform) {\n this.contextKey = '';\n this.snapshotId = buildScopedSettingsSnapshotId(this._scope, this.contextKey);\n return;\n }\n\n this.bindSessionContextChanges();\n }\n\n private bindSessionContextChanges(): void {\n this.sessionService.status$.subscribe((status) => {\n if (\n status === AXPSessionStatus.SignedOut ||\n status === AXPSessionStatus.Unauthenticated ||\n status === AXPSessionStatus.Unauthorized ||\n status === AXPSessionStatus.Expired\n ) {\n this.unbindSessionContext();\n return;\n }\n if (status === AXPSessionStatus.Authorized || status === AXPSessionStatus.Authenticated) {\n if (this.canSyncScopeWithServer()) {\n this.tryBindSessionContext();\n }\n }\n });\n\n if (this._scope === AXPPlatformScope.User) {\n combineLatest([this.sessionService.user$, this.sessionService.tenant$])\n .pipe(\n map(([user, tenant]) => (user?.id && tenant?.id ? `${tenant.id}:${user.id}` : null)),\n distinctUntilChanged(),\n )\n .subscribe((contextKey) => {\n if (!contextKey) {\n this.unbindSessionContext();\n return;\n }\n this.tryBindSessionContext();\n });\n return;\n }\n\n if (this._scope === AXPPlatformScope.Tenant) {\n this.sessionService.tenant$\n .pipe(\n map((tenant) => tenant?.id ?? null),\n distinctUntilChanged(),\n )\n .subscribe((tenantId) => {\n if (!tenantId) {\n this.unbindSessionContext();\n return;\n }\n this.tryBindSessionContext();\n });\n }\n }\n\n public get scope(): AXPPlatformScope {\n return this._scope;\n }\n\n async load(): Promise<AXPSettingValue[]> {\n this.tryBindSessionContext();\n if (!this.snapshotId) {\n return [];\n }\n if (this.hydrated && this.snapshot?.id === this.snapshotId) {\n return this.toSettingValues(this.snapshot.values);\n }\n if (!this.hydratePromise) {\n this.hydratePromise = this.hydrateSnapshot().finally(() => {\n this.hydratePromise = null;\n });\n }\n await this.hydratePromise;\n if (!this.snapshot || this.snapshot.id !== this.snapshotId) {\n return [];\n }\n return this.toSettingValues(defaultTo(this.snapshot.values, {}));\n }\n\n async set(key: string, value: unknown, options?: AXPSettingSetOptions): Promise<void>;\n async set(values: Record<string, unknown>, options?: AXPSettingSetOptions): Promise<void>;\n async set(\n keyOrValues: string | Record<string, unknown>,\n valueOrOptions?: unknown | AXPSettingSetOptions,\n options?: AXPSettingSetOptions,\n ): Promise<void> {\n this.tryBindSessionContext();\n if (!this.snapshotId) {\n return;\n }\n\n await this.load();\n\n let patch: Record<string, unknown>;\n let setOptions: AXPSettingSetOptions | undefined;\n\n if (typeof keyOrValues === 'string') {\n patch = { [keyOrValues]: valueOrOptions };\n setOptions = options;\n } else {\n patch = keyOrValues;\n setOptions = valueOrOptions as AXPSettingSetOptions | undefined;\n }\n\n // Platform is a one-way IndexedDB cache (server → client). Local edits update the cache only\n // unless the caller explicitly requests flush (e.g. platform settings admin save).\n if (isOneWaySettingsIndexedDbCache(this._scope) && !setOptions?.flush) {\n this.applyLocalValuesOnly(patch);\n await this.persistSnapshot();\n traceSettingsLocalPersist(this._scope, {\n snapshotId: this.snapshotId,\n keys: Object.keys(patch),\n dirtyKeyCount: 0,\n flush: false,\n });\n return;\n }\n\n this.applyLocalPatch(patch);\n await this.persistSnapshot();\n\n traceSettingsLocalPersist(this._scope, {\n snapshotId: this.snapshotId,\n keys: Object.keys(patch),\n dirtyKeyCount: Object.keys(defaultTo(this.snapshot?.dirty, {})).length,\n flush: !!setOptions?.flush,\n });\n\n if (setOptions?.flush) {\n await this.flushNow();\n return;\n }\n\n this.scheduleDebouncedFlush();\n }\n\n async reload(options?: AXPSettingReloadOptions): Promise<void> {\n const requireServer = !!options?.requireServer;\n if (requireServer) {\n this.requireServerSyncDepth++;\n }\n this.resetHydration();\n try {\n await this.load();\n } finally {\n if (requireServer) {\n this.requireServerSyncDepth = Math.max(0, this.requireServerSyncDepth - 1);\n }\n }\n }\n\n private get requireServerSync(): boolean {\n return this.requireServerSyncDepth > 0;\n }\n\n async revalidateIfNeeded(): Promise<void> {\n if (!this.snapshotId || !this.canSyncScopeWithServer()) {\n return;\n }\n if (!this.snapshot) {\n await this.load();\n }\n if (!this.snapshot) {\n return;\n }\n if (!isEmpty(this.snapshot.dirty)) {\n if (isOneWaySettingsIndexedDbCache(this._scope)) {\n this.clearLocalDirty(this.snapshot);\n await this.persistSnapshotRecord(this.snapshot);\n } else {\n await this.flushNow();\n return;\n }\n }\n if (!this.shouldRevalidate(this.snapshot)) {\n return;\n }\n await this.revalidateNow();\n }\n\n cancelInFlightSync(): void {\n this.syncGeneration++;\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n this.retryTimer = null;\n }\n this.revalidateInFlight = null;\n this.flushInFlight = null;\n this.hydratePromise = null;\n if (this._scope !== AXPPlatformScope.Platform) {\n this.resetHydration();\n }\n }\n\n //#region ---- Hydration ----\n\n private async hydrateSnapshot(): Promise<void> {\n const expectedSnapshotId = this.snapshotId;\n if (!expectedSnapshotId) {\n return;\n }\n\n const existing = shouldPersistSettingsInIndexedDb(this._scope)\n ? await axpSettingsIndexedDb.scoped_snapshots.get(expectedSnapshotId)\n : undefined;\n if (this.snapshotId !== expectedSnapshotId) {\n return;\n }\n\n this.snapshot = existing ?? createEmptyScopedSettingsSnapshot(expectedSnapshotId, this._scope);\n const rawValues = stripAccidentalNestedSettingParents(defaultTo(this.snapshot.values, {}));\n const policy = await this.resolveLocalCachePolicy();\n const hydrated = hydrateSettingsValuesFromIndexedDb(rawValues, policy);\n this.snapshot.values = hydrated.memoryValues;\n let diskNeedsRewrite = hydrated.diskNeedsRewrite;\n\n const rawDirty = defaultTo(this.snapshot.dirty, {});\n if (!isEmpty(rawDirty)) {\n const dirtyHydrate = hydrateSettingsValuesFromIndexedDb(\n stripAccidentalNestedSettingParents(rawDirty),\n policy,\n );\n this.snapshot.dirty = dirtyHydrate.memoryValues;\n diskNeedsRewrite = diskNeedsRewrite || dirtyHydrate.diskNeedsRewrite;\n }\n\n // Platform cache is one-way: never Patch server from IndexedDB dirty leftovers.\n if (isOneWaySettingsIndexedDbCache(this._scope) && !isEmpty(this.snapshot.dirty)) {\n this.clearLocalDirty(this.snapshot);\n await this.persistSnapshotRecord(this.snapshot);\n } else if (diskNeedsRewrite) {\n // Drop legacy plaintext secrets / non-cacheable keys from disk.\n await this.persistSnapshotRecord(this.snapshot);\n }\n\n const needsInitialSync = isEmpty(this.snapshot.values);\n if (\n this.canSyncScopeWithServer() &&\n (needsInitialSync || this.shouldRevalidate(this.snapshot) || this.requireServerSync)\n ) {\n await this.revalidateNow();\n }\n\n this.hydrated = true;\n\n if (isOneWaySettingsIndexedDbCache(this._scope)) {\n return;\n }\n\n void this.scheduleRetryIfDue();\n if (!isEmpty(this.snapshot.dirty)) {\n this.scheduleDebouncedFlush();\n }\n }\n\n private resetHydration(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n this.retryTimer = null;\n }\n this.hydrated = false;\n this.snapshot = null;\n this.hydratePromise = null;\n }\n\n private resolveContextKey(): string {\n if (this._scope === AXPPlatformScope.User) {\n return `${this.sessionService.tenant!.id}:${this.sessionService.user!.id}`;\n }\n if (this._scope === AXPPlatformScope.Tenant) {\n return this.sessionService.tenant!.id;\n }\n return '';\n }\n\n private unbindSessionContext(): void {\n if (this._scope === AXPPlatformScope.Platform) {\n return;\n }\n this.contextKey = null;\n this.snapshotId = null;\n this.resetHydration();\n }\n\n /**\n * Binds snapshot id from restored session data. Only resets hydration when the scoped context changes\n * (e.g. user switch), not when auth status re-emits for the same tenant/user.\n */\n private tryBindSessionContext(): void {\n if (this._scope === AXPPlatformScope.Platform) {\n return;\n }\n if (!this.canSyncScopeWithServer()) {\n return;\n }\n if (this._scope === AXPPlatformScope.User && (!this.sessionService.user?.id || !this.sessionService.tenant?.id)) {\n return;\n }\n if (this._scope === AXPPlatformScope.Tenant && !this.sessionService.tenant?.id) {\n return;\n }\n\n const nextContextKey = this.resolveContextKey();\n const nextSnapshotId = buildScopedSettingsSnapshotId(this._scope, nextContextKey);\n if (nextSnapshotId === this.snapshotId) {\n return;\n }\n\n this.contextKey = nextContextKey;\n this.snapshotId = nextSnapshotId;\n this.resetHydration();\n }\n\n //#endregion\n\n //#region ---- Local patch ----\n\n private applyLocalPatch(patch: Record<string, unknown>): void {\n if (!this.snapshot) {\n return;\n }\n this.snapshot.values = merge({}, this.snapshot.values, patch);\n this.snapshot.dirty = merge({}, this.snapshot.dirty, patch);\n this.snapshot.syncStatus = isEmpty(this.snapshot.dirty) ? 'idle' : 'pending_retry';\n }\n\n /** Updates cached values without queuing a server Patch (platform one-way cache). */\n private applyLocalValuesOnly(patch: Record<string, unknown>): void {\n if (!this.snapshot) {\n return;\n }\n this.snapshot.values = merge({}, this.snapshot.values, patch);\n }\n\n private clearLocalDirty(snapshot: AXPScopedSettingsSnapshot): void {\n snapshot.dirty = {};\n snapshot.syncStatus = 'idle';\n snapshot.retryAttempt = 0;\n snapshot.nextRetryAt = null;\n }\n\n private async persistSnapshot(): Promise<void> {\n if (!this.snapshot) {\n return;\n }\n await this.persistSnapshotRecord(this.snapshot);\n }\n\n private async resolveLocalCachePolicy(): Promise<AXPSettingsLocalCachePolicy> {\n try {\n const definitionService = this.injector.get(AXPSettingDefinitionProviderService);\n const cacheableByKey = await definitionService.settingCacheableByKey();\n return { cacheableByKey };\n } catch {\n return { cacheableByKey: {} };\n }\n }\n\n /**\n * Writes a disk projection (cacheable keys only) without mutating\n * the in-memory snapshot used by the settings service.\n */\n private async persistSnapshotRecord(snapshot: AXPScopedSettingsSnapshot): Promise<void> {\n if (!shouldPersistSettingsInIndexedDb(snapshot.scope)) {\n return;\n }\n const policy = await this.resolveLocalCachePolicy();\n await axpSettingsIndexedDb.scoped_snapshots.put({\n ...snapshot,\n values: projectSettingsValuesForIndexedDb(defaultTo(snapshot.values, {}), policy),\n dirty: projectSettingsValuesForIndexedDb(defaultTo(snapshot.dirty, {}), policy),\n });\n }\n\n private toSettingValues(values: Record<string, unknown>): AXPSettingValue[] {\n return Object.entries(values).map(([key, value]) => ({ key, value }));\n }\n\n //#endregion\n\n //#region ---- Server sync eligibility ----\n\n /** Platform settings are public; tenant bulk sync requires auth; user requires full authorization. */\n private canSyncScopeWithServer(): boolean {\n if (this._scope === AXPPlatformScope.Platform) {\n return true;\n }\n if (!this.sessionService.isAuthenticated) {\n return false;\n }\n if (this._scope === AXPPlatformScope.User) {\n return this.sessionService.isReadyForAppScopedApi;\n }\n return this.sessionService.hasSessionCredentials();\n }\n\n //#endregion\n\n //#region ---- Revalidation ----\n\n private shouldRevalidate(record: AXPScopedSettingsSnapshot): boolean {\n const ttl = AXP_SETTINGS_SYNC_TTL_MS[this._scope];\n if (!record.lastRevalidatedAt) {\n return true;\n }\n return Date.now() - Date.parse(record.lastRevalidatedAt) >= ttl;\n }\n\n private async revalidateNow(): Promise<void> {\n if (!this.snapshotId || !this.snapshot) {\n return;\n }\n if (this.revalidateInFlight) {\n await this.revalidateInFlight;\n return;\n }\n\n this.revalidateInFlight = this.doRevalidate().finally(() => {\n this.revalidateInFlight = null;\n });\n await this.revalidateInFlight;\n }\n\n private resolveFetchSince(snapshot: AXPScopedSettingsSnapshot): string | null {\n // requireServer must always pull the full partition — IndexedDB may omit non-cacheable\n // keys (SMTP / secrets), and a conditional `since` fetch would never fill them in.\n if (this.requireServerSync) {\n return null;\n }\n if (isEmpty(snapshot.values) && isEmpty(snapshot.dirty)) {\n return null;\n }\n return snapshot.serverUpdatedAt;\n }\n\n private async doRevalidate(): Promise<void> {\n const snapshot = this.snapshot;\n const generation = this.syncGeneration;\n if (!snapshot || !this.canSyncScopeWithServer()) {\n return;\n }\n\n try {\n let since = this.resolveFetchSince(snapshot);\n traceSettingsServerApiCall('GET', this._scope, {\n snapshotId: this.snapshotId,\n since,\n reason: this.requireServerSync ? 'require-server-revalidate' : 'background-revalidate',\n });\n let result = await this.bulkSync.fetch(this._scope, since);\n if (generation !== this.syncGeneration || this.snapshot !== snapshot) {\n return;\n }\n if (!result.changed && isEmpty(result.values) && since) {\n since = null;\n result = await this.bulkSync.fetch(this._scope, null);\n }\n if (generation !== this.syncGeneration || this.snapshot !== snapshot) {\n return;\n }\n const now = new Date().toISOString();\n snapshot.lastRevalidatedAt = now;\n\n if (result.changed && !isEmpty(result.values)) {\n const servicePatch: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(result.values)) {\n if (key in snapshot.dirty) {\n continue;\n }\n servicePatch[key] = value;\n }\n // Full server payloads replace local values (dirty wins for bidirectional User scope).\n snapshot.values = stripAccidentalNestedSettingParents(\n this.requireServerSync\n ? merge({}, result.values, isOneWaySettingsIndexedDbCache(this._scope) ? {} : snapshot.dirty)\n : merge({}, result.values, snapshot.dirty),\n );\n if (result.updatedAt) {\n snapshot.serverUpdatedAt = result.updatedAt;\n }\n if (!isEmpty(servicePatch)) {\n this.injector.get(AXP_SETTINGS_CACHE_SYNC).syncScopeCache(this._scope, servicePatch);\n }\n } else if (result.updatedAt) {\n snapshot.serverUpdatedAt = result.updatedAt;\n }\n\n await this.persistSnapshotRecord(snapshot);\n } catch (error) {\n traceSettingsRevalidateFailed(this._scope, {\n snapshotId: this.snapshotId!,\n since: snapshot.serverUpdatedAt,\n });\n // Background revalidate may fail quietly when a warm cache exists.\n // Initial sync / startup requireServer must surface the error for retry / offline handling.\n if (isEmpty(snapshot.values) || this.requireServerSync) {\n throw error;\n }\n }\n }\n\n //#endregion\n\n //#region ---- Flush & retry ----\n\n private scheduleDebouncedFlush(): void {\n if (isOneWaySettingsIndexedDbCache(this._scope)) {\n return;\n }\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n this.debounceTimer = setTimeout(() => {\n this.debounceTimer = null;\n void this.flushNow();\n }, AXP_SETTINGS_SYNC_DEBOUNCE_MS);\n }\n\n async flushNow(): Promise<void> {\n if (!this.snapshotId) {\n return;\n }\n if (!this.snapshot) {\n await this.load();\n }\n if (!this.snapshot || isEmpty(this.snapshot.dirty)) {\n return;\n }\n if (this.flushInFlight) {\n await this.flushInFlight;\n return;\n }\n\n this.flushInFlight = this.doFlush().finally(() => {\n this.flushInFlight = null;\n });\n await this.flushInFlight;\n }\n\n private async doFlush(): Promise<void> {\n const snapshot = this.snapshot;\n const generation = this.syncGeneration;\n if (!snapshot || isEmpty(snapshot.dirty) || !this.canSyncScopeWithServer()) {\n return;\n }\n\n const payload = { ...snapshot.dirty };\n traceSettingsFlush(this._scope, {\n snapshotId: this.snapshotId!,\n keys: Object.keys(payload),\n });\n traceSettingsServerApiCall('PATCH', this._scope, {\n snapshotId: this.snapshotId,\n keys: Object.keys(payload),\n reason: 'flush-dirty',\n });\n snapshot.syncStatus = 'syncing';\n await this.persistSnapshotRecord(snapshot);\n\n try {\n const result = await this.bulkSync.patch(this._scope, payload);\n if (generation !== this.syncGeneration || this.snapshot !== snapshot) {\n return;\n }\n for (const key of Object.keys(payload)) {\n delete snapshot.dirty[key];\n }\n snapshot.serverUpdatedAt = result.updatedAt;\n snapshot.lastRevalidatedAt = new Date().toISOString();\n snapshot.syncStatus = 'idle';\n snapshot.retryAttempt = 0;\n snapshot.nextRetryAt = null;\n await this.persistSnapshotRecord(snapshot);\n } catch {\n if (generation !== this.syncGeneration || this.snapshot !== snapshot) {\n return;\n }\n traceSettingsSyncFailed(this._scope, {\n snapshotId: this.snapshotId!,\n keys: Object.keys(payload),\n attempt: snapshot.retryAttempt,\n });\n snapshot.syncStatus = 'pending_retry';\n this.scheduleSilentRetry(snapshot);\n await this.persistSnapshotRecord(snapshot);\n }\n }\n\n private scheduleSilentRetry(snapshot: AXPScopedSettingsSnapshot): void {\n const attempt = snapshot.retryAttempt;\n const backoff =\n AXP_SETTINGS_SYNC_RETRY_BACKOFF_MS[Math.min(attempt, AXP_SETTINGS_SYNC_RETRY_BACKOFF_MS.length - 1)];\n snapshot.retryAttempt = attempt + 1;\n snapshot.nextRetryAt = new Date(Date.now() + backoff).toISOString();\n\n traceSettingsRetryScheduled(this._scope, {\n snapshotId: this.snapshotId!,\n attempt: snapshot.retryAttempt,\n backoffMs: backoff,\n nextRetryAt: snapshot.nextRetryAt,\n });\n\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n }\n this.retryTimer = setTimeout(() => {\n this.retryTimer = null;\n void this.scheduleRetryIfDue();\n }, backoff);\n }\n\n private async scheduleRetryIfDue(): Promise<void> {\n if (isOneWaySettingsIndexedDbCache(this._scope)) {\n return;\n }\n if (!this.snapshot || isEmpty(this.snapshot.dirty)) {\n return;\n }\n if (this.snapshot.nextRetryAt && Date.parse(this.snapshot.nextRetryAt) > Date.now()) {\n return;\n }\n await this.flushNow();\n }\n\n //#endregion\n}\n\n//#endregion\n","import { AXPSessionService, AXPSessionStatus } from '@acorex-platform/framework-client/auth';\nimport { AXPPlatformScope } from '@acorex-platform/framework-shared/core';\nimport { inject, InjectionToken, Injector } from '@angular/core';\n\nimport { AXPIndexedDbSettingValueProvider } from './indexed-db-setting-value.provider';\nimport { purgeLegacyTenantScopedSettingsSnapshots } from './settings-indexed-db';\nimport { AXPSettingSetOptions, AXPSettingValue, AXPSettingValueProvider } from './settings.types';\n\n//#region ---- Provider factories ----\n\nexport function createIndexedDbSettingValueProviders(injector: Injector): AXPSettingValueProvider[] {\n void purgeLegacyTenantScopedSettingsSnapshots();\n return [\n new AXPIndexedDbSettingValueProvider(AXPPlatformScope.Platform, injector),\n new AXPIndexedDbSettingValueProvider(AXPPlatformScope.Tenant, injector),\n new AXPIndexedDbSettingValueProvider(AXPPlatformScope.User, injector),\n ];\n}\n\n//#endregion\n\nexport const AXP_SETTING_VALUE_PROVIDER = new InjectionToken<AXPSettingValueProvider[]>('AXP_SETTING_VALUE_PROVIDER');\n\nexport function createDefaultSettingValueProviders(injector: Injector): AXPSettingValueProvider[] {\n return [\n new AXPSettingValueProviderDefault(AXPPlatformScope.Platform, injector),\n new AXPSettingValueProviderDefault(AXPPlatformScope.Tenant, injector),\n new AXPSettingValueProviderDefault(AXPPlatformScope.User, injector),\n ];\n}\n\nclass AXPSettingValueProviderDefault implements AXPSettingValueProvider {\n private readonly cache: Map<string, any> = new Map();\n private localStorageKey: string | null = null;\n private sessionService = this.injector.get(AXPSessionService);\n\n constructor(\n private _scope: AXPPlatformScope,\n private injector: Injector,\n ) {\n if (this.scope === AXPPlatformScope.Platform) {\n this.localStorageKey = `AXP_SETTINGS_SCOPE(P)`;\n } else {\n this.sessionService.status$.subscribe((status) => {\n if (status === AXPSessionStatus.Authorized || status === AXPSessionStatus.Authenticated) {\n if (this.scope === AXPPlatformScope.User) {\n this.localStorageKey = `AXP_SETTINGS_SCOPE(${this.sessionService.user?.id ?? 'U'})`;\n } else if (this.scope === AXPPlatformScope.Tenant) {\n this.localStorageKey = `AXP_SETTINGS_SCOPE(${this.sessionService.tenant?.id ?? 'T'})`;\n }\n }\n });\n }\n }\n\n public get scope(): AXPPlatformScope {\n return this._scope;\n }\n\n async load(): Promise<AXPSettingValue[]> {\n if (!this.localStorageKey) {\n return Promise.resolve([]);\n }\n const storedSettings = localStorage.getItem(this.localStorageKey);\n if (storedSettings) {\n const parsedSettings: Record<string, any> = JSON.parse(storedSettings);\n Object.entries(parsedSettings).forEach(([key, value]) => {\n this.cache.set(key, value);\n });\n return Promise.resolve(Array.from(this.cache.entries()).map((c) => ({ key: c[0], value: c[1] })));\n }\n return Promise.resolve([]);\n }\n\n async set(key: string, value: any, _options?: AXPSettingSetOptions): Promise<void>;\n async set(values: Record<string, any>, _options?: AXPSettingSetOptions): Promise<void>;\n async set(keyOrValues: string | Record<string, any>, value?: any): Promise<void> {\n if (typeof keyOrValues === 'string') {\n this.cache.set(keyOrValues, value);\n } else {\n for (const [key, val] of Object.entries(keyOrValues)) {\n this.cache.set(key, val);\n }\n }\n await this.saveToLocalStorage();\n }\n\n private async saveToLocalStorage(): Promise<void> {\n if (!this.localStorageKey) {\n return;\n }\n const settingsObject: Record<string, any> = {};\n this.cache.forEach((value, key) => {\n settingsObject[key] = value;\n });\n localStorage.setItem(this.localStorageKey, JSON.stringify(settingsObject));\n }\n}\n","import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXP_SETTINGS_DEFINITION_DIALOG_OPENER } from '@acorex-platform/framework-client/core';\nimport { AXPPlatformScope } from '@acorex-platform/framework-shared/core';\nimport { AXPBroadcastEventService, AXPDebugService } from '@acorex-platform/framework-client/core';\nimport { inject, Injectable, Injector } from '@angular/core';\nimport { cloneDeep, get } from 'lodash-es';\nimport { combineLatest, distinctUntilChanged, filter, firstValueFrom, map, ReplaySubject, Subject, take } from 'rxjs';\nimport { AXPCommonSettings } from '../configs/common-settings.key';\nimport {\n AXPSettingDefaultValuesAggregatorService,\n AXPSettingDefinitionProviderService,\n} from './setting-definition.service';\nimport { coerceAXPSettingRawValueByKind, inferSettingCoercionKind } from './settings-coercion';\nimport { AXP_SETTING_VALUE_PROVIDER } from './settings.provider';\nimport { AXPSettingsBulkSyncService } from './settings-bulk-sync.service';\nimport {\n axpSettingsIndexedDb,\n buildScopedSettingsSnapshotId,\n} from './settings-indexed-db';\nimport { hydrateSettingsValuesFromIndexedDb } from './settings-local-cache.util';\nimport {\n AXPSettingChangedEvent,\n AXPSettingSetOptions,\n AXPSettingValue,\n AXPSettingValueProvider,\n} from './settings.types';\nimport type {\n AXPSettingsKeysPopupOptions,\n AXPSettingsSectionPopupOptions,\n} from './settings-popup.types';\nimport {\n traceSettingsServiceLoadComplete,\n traceSettingsServiceLoadFailed,\n traceSettingsServiceLoadStarted,\n traceSettingsServiceReload,\n} from './settings-sync.trace';\n\nexport interface AXPSettingsServiceInterface {\n load(): Promise<AXPSettingValue[]>;\n /** Loads platform settings from the server without waiting for tenant/user session context. */\n ensurePlatformSettingsLoaded(): Promise<void>;\n /** Soft-loads platform settings from IndexedDB cache after a failed server bootstrap. */\n adoptCachedPlatformSettings(): Promise<boolean>;\n get<T = any>(key: string): Promise<T>;\n peekCached(key: string): unknown | undefined;\n /**\n * Platform-scope value from in-memory cache, then IndexedDB snapshot.\n * Safe when server bootstrap failed (no requireServer / no adopt).\n */\n peekPlatformCached(key: string): Promise<unknown | undefined>;\n defaultValues(scope: AXPPlatformScope): Promise<Record<string, unknown>>;\n scope(scope: AXPPlatformScope): ScopedSettingService;\n reload(scope?: AXPPlatformScope, reason?: string): Promise<void>;\n ensureLoaded(): Promise<void>;\n ensureScopeLoaded(scope: AXPPlatformScope): Promise<void>;\n showSectionPopup(options: AXPSettingsSectionPopupOptions): Promise<boolean>;\n showSettingsPopup(options: AXPSettingsKeysPopupOptions): Promise<boolean>;\n}\n\nconst STATIC_SCOPES = [AXPPlatformScope.Platform, AXPPlatformScope.Tenant, AXPPlatformScope.User];\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPSettingsService implements AXPSettingsServiceInterface {\n private readonly providers: AXPSettingValueProvider[] = inject<AXPSettingValueProvider[]>(AXP_SETTING_VALUE_PROVIDER);\n private readonly injector = inject(Injector);\n private readonly eventService = inject(AXPBroadcastEventService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly bulkSyncService = inject(AXPSettingsBulkSyncService);\n private readonly debugService = inject(AXPDebugService);\n private readonly scopedSettingsCache: Map<string, Map<string, any>> = new Map();\n private readonly scopeLoaded = new Map<AXPPlatformScope, boolean>();\n private loadInFlight: Promise<AXPSettingValue[]> | null = null;\n private platformScopeLoadInFlight: Promise<{ settings: AXPSettingValue[]; keyCount: number }> | null = null;\n /** Serializes per-scope reload so session-auth + tenant$ cannot wipe a good cache with an empty abort. */\n private readonly scopeReloadInFlight = new Map<AXPPlatformScope, Promise<void>>();\n private lastUserContextKey: string | null = null;\n private lastTenantId: string | null = null;\n private hadAuthenticatedSession = false;\n public readonly onChanged = new Subject<AXPSettingChangedEvent>();\n public readonly onLoaded = new ReplaySubject<void>(1);\n\n constructor() {\n STATIC_SCOPES.forEach((scope) => {\n if (!this.scopedSettingsCache.has(scope)) {\n this.scopedSettingsCache.set(scope, new Map());\n }\n this.scopeLoaded.set(scope, false);\n });\n\n this.eventService.listen<AXPSettingChangedEvent>('AXPSettingChangedEvent').subscribe((event) => {\n const data = event.data;\n data.keys.forEach((key) => {\n this.scopedSettingsCache.get(data.scope)?.set(key, data.values[key]);\n });\n this.onChanged.next(data);\n void this.applyDebugModeFromEvent(data);\n });\n\n this.sessionService.isAuthenticated$.pipe(distinctUntilChanged()).subscribe(async (isAuthenticated) => {\n if (isAuthenticated) {\n this.hadAuthenticatedSession = true;\n await this.reloadAuthenticatedScopes('session-authenticated');\n return;\n }\n this.cancelInFlightLoads();\n this.clearScopedCache(AXPPlatformScope.User);\n this.clearScopedCache(AXPPlatformScope.Tenant);\n this.lastUserContextKey = null;\n this.lastTenantId = null;\n if (this.hadAuthenticatedSession) {\n this.hadAuthenticatedSession = false;\n await this.restorePlatformSettingsAfterLogout();\n }\n });\n\n this.sessionService.isAuthorized$.pipe(distinctUntilChanged()).subscribe(async (isAuthorized) => {\n if (!isAuthorized) {\n this.clearScopedCache(AXPPlatformScope.User);\n this.lastUserContextKey = null;\n return;\n }\n const user = this.sessionService.user;\n const tenant = this.sessionService.tenant;\n const contextKey = user?.id && tenant?.id ? `${tenant.id}:${user.id}` : null;\n if (!contextKey || contextKey === this.lastUserContextKey) {\n return;\n }\n this.lastUserContextKey = contextKey;\n if (!this.shouldLoadProvider(AXPPlatformScope.User)) {\n return;\n }\n await this.reload(AXPPlatformScope.User, 'session-authorized');\n });\n\n this.sessionService.tenant$\n .pipe(\n map((tenant) => tenant?.id ?? null),\n distinctUntilChanged(),\n )\n .subscribe(async (tenantId) => {\n if (tenantId === this.lastTenantId) {\n return;\n }\n this.lastTenantId = tenantId;\n if (!tenantId) {\n this.clearScopedCache(AXPPlatformScope.Tenant);\n return;\n }\n if (!this.shouldLoadProvider(AXPPlatformScope.Tenant)) {\n return;\n }\n await this.reload(AXPPlatformScope.Tenant, 'session-tenant-changed');\n });\n\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState !== 'visible') {\n return;\n }\n for (const provider of this.providers) {\n void provider.revalidateIfNeeded?.();\n }\n });\n }\n }\n\n async ensurePlatformSettingsLoaded(): Promise<void> {\n // Always force a server-required platform bootstrap. Do not short-circuit on in-memory\n // readiness — session restore may have warm-loaded P from IndexedDB without verifying API.\n if (this.loadInFlight) {\n await this.loadInFlight;\n }\n await this.loadScope(AXPPlatformScope.Platform, 'app-startup-platform', true);\n this.onLoaded.next();\n await this.applyDebugModeFromSettings();\n }\n\n async reload(scope?: AXPPlatformScope, reason = scope ? 'explicit-scope-reload' : 'full-reload'): Promise<void> {\n traceSettingsServiceReload(scope ?? 'all', reason);\n if (this.loadInFlight) {\n await this.loadInFlight;\n }\n if (scope) {\n const existing = this.scopeReloadInFlight.get(scope);\n if (existing) {\n await existing;\n // Non-force reasons can reuse the completed in-flight. Force-remote reasons\n // (e.g. settings page) must continue — IndexedDB may have marked the scope ready\n // while omitting non-cacheable keys (SMTP, secrets).\n if (!this.shouldForceProviderReload(reason)) {\n return;\n }\n }\n const reloadPromise = this.reloadScope(scope, reason).finally(() => {\n if (this.scopeReloadInFlight.get(scope) === reloadPromise) {\n this.scopeReloadInFlight.delete(scope);\n }\n });\n this.scopeReloadInFlight.set(scope, reloadPromise);\n await reloadPromise;\n return;\n }\n\n this.scopeLoaded.forEach((_, key) => this.scopeLoaded.set(key, false));\n await this.load(reason);\n }\n\n private async reloadScope(scope: AXPPlatformScope, reason: string): Promise<void> {\n if (!this.shouldLoadProvider(scope)) {\n this.clearScopedCache(scope);\n return;\n }\n const provider = this.providers.find((p) => p.scope === scope);\n if (!provider) {\n return;\n }\n if (provider.reload && this.shouldForceProviderReload(reason)) {\n await provider.reload(this.shouldRequireServerReload(scope, reason) ? { requireServer: true } : undefined);\n } else if (this.shouldForceProviderReload(reason)) {\n this.scopeLoaded.set(scope, false);\n }\n const providerSettings = await provider.load();\n this.replaceScopeCache(scope, providerSettings);\n this.onLoaded.next();\n await this.applyDebugModeFromSettings();\n }\n\n /**\n * Replaces the in-memory scope cache from a provider load.\n * Ignores empty results when the cache already has values — concurrent provider.reload()\n * can abort hydration via syncGeneration and return [] after a good fetch completed.\n */\n private replaceScopeCache(scope: AXPPlatformScope, providerSettings: AXPSettingValue[]): void {\n const scopeCache = this.scopedSettingsCache.get(scope)!;\n if (providerSettings.length === 0 && scopeCache.size > 0 && this.shouldLoadProvider(scope)) {\n this.scopeLoaded.set(scope, true);\n return;\n }\n scopeCache.clear();\n providerSettings.forEach((setting) => {\n scopeCache.set(setting.key, setting.value);\n });\n this.scopeLoaded.set(scope, true);\n }\n\n async ensureLoaded(): Promise<void> {\n if (this.isFullyLoaded()) {\n return;\n }\n await this.load();\n }\n\n /**\n * Ensures a single scope is loaded. Prefer this over {@link ensureLoaded} when only one\n * scope is needed (e.g. platform settings page) so a tenant/user sync failure cannot block UI.\n */\n async ensureScopeLoaded(scope: AXPPlatformScope): Promise<void> {\n if (this.isScopeReady(scope)) {\n return;\n }\n if (scope === AXPPlatformScope.Platform) {\n await this.ensurePlatformSettingsLoaded();\n return;\n }\n await this.ensureLoaded();\n }\n\n async load(reason = 'explicit-load'): Promise<AXPSettingValue[]> {\n if (this.loadInFlight) {\n return this.loadInFlight;\n }\n\n traceSettingsServiceLoadStarted(reason);\n\n this.loadInFlight = this.doLoad(reason).finally(() => {\n this.loadInFlight = null;\n });\n return this.loadInFlight;\n }\n\n private async awaitSessionReady(): Promise<void> {\n // Never block splash forever if session restore/signin leaves isLoading stuck.\n await Promise.race([\n firstValueFrom(\n this.sessionService.isLoading$.pipe(\n filter((loading) => !loading),\n take(1),\n ),\n ),\n new Promise<void>((resolve) => setTimeout(resolve, 15_000)),\n ]);\n }\n\n private async doLoad(reason: string): Promise<AXPSettingValue[]> {\n const startedAt = Date.now();\n try {\n const forceRemote = this.shouldForceRemote(reason);\n const platformLoadPromise = this.isScopeReady(AXPPlatformScope.Platform)\n ? Promise.resolve(this.readCachedScopeSettings(AXPPlatformScope.Platform))\n : this.loadScope(AXPPlatformScope.Platform, reason, forceRemote);\n\n await this.awaitSessionReady();\n const platformResult = await platformLoadPromise;\n\n const settingsList: AXPSettingValue[] = [...platformResult.settings];\n const keysByScope: Record<string, number> = {\n [AXPPlatformScope.Platform]: platformResult.keyCount,\n };\n\n for (const provider of this.providers) {\n if (provider.scope === AXPPlatformScope.Platform) {\n continue;\n }\n if (!this.shouldLoadProvider(provider.scope)) {\n this.scopeLoaded.set(provider.scope, false);\n this.scopedSettingsCache.get(provider.scope)?.clear();\n continue;\n }\n const scopeCache = this.scopedSettingsCache.get(provider.scope) ?? new Map();\n if (forceRemote && provider.reload) {\n await provider.reload();\n }\n const providerSettings = await provider.load();\n providerSettings.forEach((setting) => {\n scopeCache.set(setting.key, setting.value);\n });\n this.scopedSettingsCache.set(provider.scope, scopeCache);\n this.scopeLoaded.set(provider.scope, true);\n settingsList.push(...providerSettings);\n keysByScope[provider.scope] = providerSettings.length;\n }\n await this.seedMissingDefaults();\n this.onLoaded.next();\n await this.applyDebugModeFromSettings();\n traceSettingsServiceLoadComplete({\n totalKeys: settingsList.length,\n keysByScope,\n durationMs: Date.now() - startedAt,\n });\n return settingsList;\n } catch (error) {\n traceSettingsServiceLoadFailed(error);\n throw error;\n }\n }\n\n private shouldForceRemote(reason: string): boolean {\n return (\n reason === 'full-reload' ||\n reason === 'session-authenticated' ||\n reason === 'session-authorized' ||\n reason === 'session-logout' ||\n reason === 'app-startup-platform' ||\n reason === 'settings-page-open'\n );\n }\n\n private shouldForceProviderReload(reason: string): boolean {\n return this.shouldForceRemote(reason);\n }\n\n /** Platform admin/settings UI and startup must not trust a partial IndexedDB snapshot. */\n private shouldRequireServerReload(scope: AXPPlatformScope, reason: string): boolean {\n return (\n scope === AXPPlatformScope.Platform &&\n (reason === 'app-startup-platform' || reason === 'settings-page-open')\n );\n }\n\n private cancelInFlightLoads(): void {\n this.loadInFlight = null;\n this.platformScopeLoadInFlight = null;\n this.scopeReloadInFlight.clear();\n for (const provider of this.providers) {\n provider.cancelInFlightSync?.();\n }\n this.bulkSyncService.cancelInFlightFetches();\n }\n\n private async restorePlatformSettingsAfterLogout(): Promise<void> {\n const platformCache = this.scopedSettingsCache.get(AXPPlatformScope.Platform);\n const hasWarmPlatformCache =\n this.scopeLoaded.get(AXPPlatformScope.Platform) === true && (platformCache?.size ?? 0) > 0;\n const reason = hasWarmPlatformCache ? 'session-logout-cache' : 'session-logout';\n await this.reload(AXPPlatformScope.Platform, reason);\n }\n\n /** Loads tenant settings after sign-in / tenant selection (pre-app-chooser). */\n private async reloadAuthenticatedScopes(reason: string): Promise<void> {\n if (this.loadInFlight) {\n await this.loadInFlight;\n }\n // Platform is bootstrapped by the app-startup `platform-settings` task (requireServer).\n // Reloading P here races that path and can mark it ready from IndexedDB alone.\n if (this.shouldLoadProvider(AXPPlatformScope.Tenant)) {\n await this.reload(AXPPlatformScope.Tenant, reason);\n }\n }\n\n private async loadScope(\n scope: AXPPlatformScope,\n reason: string,\n forceRemote: boolean,\n ): Promise<{ settings: AXPSettingValue[]; keyCount: number }> {\n if (scope === AXPPlatformScope.Platform && this.platformScopeLoadInFlight) {\n return this.platformScopeLoadInFlight;\n }\n\n const loadPromise = this.doLoadScope(scope, reason, forceRemote);\n if (scope === AXPPlatformScope.Platform) {\n this.platformScopeLoadInFlight = loadPromise.finally(() => {\n this.platformScopeLoadInFlight = null;\n });\n return this.platformScopeLoadInFlight;\n }\n\n return loadPromise;\n }\n\n private async doLoadScope(\n scope: AXPPlatformScope,\n reason: string,\n forceRemote: boolean,\n ): Promise<{ settings: AXPSettingValue[]; keyCount: number }> {\n if (!this.shouldLoadProvider(scope)) {\n this.scopeLoaded.set(scope, false);\n this.scopedSettingsCache.get(scope)?.clear();\n return { settings: [], keyCount: 0 };\n }\n\n const provider = this.providers.find((p) => p.scope === scope);\n if (!provider) {\n return { settings: [], keyCount: 0 };\n }\n\n if (forceRemote && provider.reload) {\n await provider.reload(this.shouldRequireServerReload(scope, reason) ? { requireServer: true } : undefined);\n } else if (forceRemote) {\n this.scopeLoaded.set(scope, false);\n }\n\n const providerSettings = await provider.load();\n if (forceRemote) {\n this.replaceScopeCache(scope, providerSettings);\n } else {\n const scopeCache = this.scopedSettingsCache.get(scope) ?? new Map();\n providerSettings.forEach((setting) => {\n scopeCache.set(setting.key, setting.value);\n });\n this.scopedSettingsCache.set(scope, scopeCache);\n this.scopeLoaded.set(scope, true);\n }\n return { settings: providerSettings, keyCount: providerSettings.length };\n }\n\n /**\n * Soft-loads platform settings from the one-way IndexedDB cache (no requireServer).\n * Used when startup Fetch failed and the user may continue offline.\n */\n async adoptCachedPlatformSettings(): Promise<boolean> {\n const provider = this.providers.find((p) => p.scope === AXPPlatformScope.Platform);\n if (!provider) {\n return false;\n }\n\n if (provider.reload) {\n await provider.reload();\n }\n const providerSettings = await provider.load();\n const scopeCache = this.scopedSettingsCache.get(AXPPlatformScope.Platform) ?? new Map();\n scopeCache.clear();\n providerSettings.forEach((setting) => {\n scopeCache.set(setting.key, setting.value);\n });\n this.scopedSettingsCache.set(AXPPlatformScope.Platform, scopeCache);\n this.scopeLoaded.set(AXPPlatformScope.Platform, true);\n this.onLoaded.next();\n await this.applyDebugModeFromSettings();\n return scopeCache.size > 0;\n }\n\n private readCachedScopeSettings(scope: AXPPlatformScope): { settings: AXPSettingValue[]; keyCount: number } {\n const scopeCache = this.scopedSettingsCache.get(scope) ?? new Map();\n const settings = Array.from(scopeCache.entries()).map(([key, value]) => ({ key, value }));\n return { settings, keyCount: settings.length };\n }\n\n /** Platform always; tenant when authenticated; user only when fully authorized. */\n private shouldLoadProvider(scope: AXPPlatformScope): boolean {\n if (scope === AXPPlatformScope.Platform) {\n return true;\n }\n if (!this.sessionService.isAuthenticated || !this.sessionService.hasSessionCredentials()) {\n return false;\n }\n if (scope === AXPPlatformScope.Tenant) {\n return !!this.sessionService.tenant?.id;\n }\n if (scope === AXPPlatformScope.User) {\n return (\n this.sessionService.isReadyForAppScopedApi &&\n !!this.sessionService.user?.id &&\n !!this.sessionService.tenant?.id\n );\n }\n return false;\n }\n\n private requiredScopes(): AXPPlatformScope[] {\n return STATIC_SCOPES.filter((scope) => this.shouldLoadProvider(scope));\n }\n\n private isScopeReady(scope: AXPPlatformScope): boolean {\n if (!this.shouldLoadProvider(scope)) {\n return true;\n }\n return this.scopeLoaded.get(scope) === true;\n }\n\n private isFullyLoaded(): boolean {\n return this.requiredScopes().every((scope) => this.isScopeReady(scope));\n }\n\n private clearScopedCache(scope: AXPPlatformScope): void {\n this.scopedSettingsCache.get(scope)?.clear();\n this.scopeLoaded.set(scope, false);\n }\n\n /**\n * Returns the effective setting value. Primitive coercion (string, boolean, number, date) is inferred from the\n * definition default and/or the stored shape (including `{ value: ... }`). Type argument `T` is compile-time only;\n * it is not read at runtime—use it to document the expected result (e.g. `get<boolean>(key)`).\n */\n async get<T = any>(key: string): Promise<T> {\n const { effective, defaultSample } = await this.resolveEffectiveAndDefault(key);\n const kind = inferSettingCoercionKind(defaultSample, effective);\n if (kind !== null) {\n return coerceAXPSettingRawValueByKind(effective, kind) as T;\n }\n if (effective === undefined) {\n return effective as T;\n }\n return cloneDeep(effective) as T;\n }\n\n /**\n * Synchronous read from the in-memory scope cache (User → Tenant → Platform).\n * Returns `undefined` when the key is not cached yet (e.g. before {@link load} completes).\n */\n peekCached(key: string): unknown | undefined {\n const scopeOrder = [AXPPlatformScope.User, AXPPlatformScope.Tenant, AXPPlatformScope.Platform];\n for (const scope of scopeOrder) {\n const scopeCache = this.scopedSettingsCache.get(scope);\n if (!scopeCache?.has(key)) {\n continue;\n }\n const value = scopeCache.get(key);\n if (value !== undefined && value !== null) {\n return value;\n }\n }\n return undefined;\n }\n\n /**\n * Platform-scope value from in-memory cache, then the IndexedDB platform snapshot.\n * Does not hit the server — use when bootstrap Fetch failed and callers must not adopt cache yet.\n */\n async peekPlatformCached(key: string): Promise<unknown | undefined> {\n const scopeCache = this.scopedSettingsCache.get(AXPPlatformScope.Platform);\n if (scopeCache?.has(key)) {\n const memoryValue = scopeCache.get(key);\n if (memoryValue !== undefined && memoryValue !== null) {\n return memoryValue;\n }\n }\n\n try {\n const snapshotId = buildScopedSettingsSnapshotId(AXPPlatformScope.Platform, '');\n const snapshot = await axpSettingsIndexedDb.scoped_snapshots.get(snapshotId);\n if (!snapshot?.values || !Object.prototype.hasOwnProperty.call(snapshot.values, key)) {\n return undefined;\n }\n const definitionService = this.injector.get(AXPSettingDefinitionProviderService);\n const cacheableByKey = await definitionService.settingCacheableByKey();\n const { memoryValues } = hydrateSettingsValuesFromIndexedDb(\n { [key]: snapshot.values[key] },\n { cacheableByKey },\n );\n return memoryValues[key];\n } catch {\n return undefined;\n }\n }\n\n /**\n * Inherited settings at tenant/user scope may match the definition default while still being an explicit\n * override of a different parent value (e.g. tenant enables lock while platform default is disabled).\n */\n private isInheritedPlaceholder(scope: AXPPlatformScope, value: unknown, key: string): boolean {\n if (scope === AXPPlatformScope.Platform) {\n return false;\n }\n\n const parentScope = scope === AXPPlatformScope.User ? AXPPlatformScope.Tenant : AXPPlatformScope.Platform;\n if (!this.shouldLoadProvider(parentScope)) {\n return false;\n }\n\n const parentCache = this.scopedSettingsCache.get(parentScope);\n if (!parentCache?.has(key)) {\n return false;\n }\n\n const parentValue = parentCache.get(key);\n if (parentValue === undefined || parentValue === null) {\n return false;\n }\n\n return value === parentValue;\n }\n\n private async resolveEffectiveAndDefault(key: string): Promise<{ effective: unknown; defaultSample: unknown }> {\n if (!this.isFullyLoaded()) {\n await this.ensureLoaded();\n }\n const definitionService = this.injector.get(AXPSettingDefinitionProviderService);\n const [defaults, inheritedByKey] = await Promise.all([\n this.injector.get(AXPSettingDefaultValuesAggregatorService).getDefaults(),\n definitionService.settingInheritedByKey(),\n ]);\n const defaultSample = get(defaults, key);\n const scopeOrder = [AXPPlatformScope.User, AXPPlatformScope.Tenant, AXPPlatformScope.Platform];\n for (const scope of scopeOrder) {\n if (!this.shouldLoadProvider(scope)) {\n continue;\n }\n const scopeCache = this.scopedSettingsCache.get(scope);\n if (scopeCache && scopeCache.has(key)) {\n const value = scopeCache.get(key);\n if (value !== undefined && value !== null) {\n if (inheritedByKey[key] && this.isInheritedPlaceholder(scope, value, key)) {\n continue;\n }\n return { effective: value, defaultSample };\n }\n }\n }\n return { effective: defaultSample, defaultSample };\n }\n\n async defaultValues(scope: AXPPlatformScope): Promise<Record<string, unknown>> {\n let scopeOrder = [AXPPlatformScope.Platform, AXPPlatformScope.Tenant, AXPPlatformScope.User].reverse();\n const scopeIndex = scopeOrder.indexOf(scope);\n\n if (scopeIndex === -1) {\n throw new Error(`Invalid scope: ${scope}`);\n }\n const parentScopes = scopeOrder.slice(scopeIndex + 1).reverse();\n const accumulatedDefaults: Record<string, unknown> = {};\n for (const currentScope of parentScopes) {\n if (!this.shouldLoadProvider(currentScope)) {\n continue;\n }\n const scopeCache = this.scopedSettingsCache.get(currentScope);\n\n if (scopeCache) {\n scopeCache.forEach((value, key) => {\n accumulatedDefaults[key] = value;\n });\n }\n }\n\n const globalDefaults = await this.injector.get(AXPSettingDefaultValuesAggregatorService).getDefaults();\n return { ...globalDefaults, ...accumulatedDefaults };\n }\n\n scope(scope: AXPPlatformScope): ScopedSettingService {\n const provider = this.providers.find((p) => p.scope === scope);\n if (!provider) {\n throw new Error(`No provider found for scope: ${scope}`);\n }\n return new ScopedSettingService(\n this,\n provider,\n this.scopedSettingsCache.get(scope)!,\n (s) => this.shouldLoadProvider(s),\n );\n }\n\n /**\n * Opens a dialog to quick-edit a settings definition section using canonical widgets.\n */\n async showSectionPopup(options: AXPSettingsSectionPopupOptions): Promise<boolean> {\n const definitionService = this.injector.get(AXPSettingDefinitionProviderService);\n const lookup = await definitionService.findSection(options.scope, options.section, options.group);\n if (!lookup) {\n return false;\n }\n\n const opener = this.injector.get(AXP_SETTINGS_DEFINITION_DIALOG_OPENER);\n const { openSettingsDefinitionDialog } = await import('./settings-dialog.helper');\n return openSettingsDefinitionDialog(this, opener, {\n scope: options.scope as AXPPlatformScope,\n sections: [lookup.section],\n title: options.title ?? lookup.section.title,\n description: options.description ?? lookup.section.description,\n size: options.size,\n });\n }\n\n /**\n * Opens a dialog to quick-edit one or more settings by key using their canonical widget definitions.\n */\n async showSettingsPopup(options: AXPSettingsKeysPopupOptions): Promise<boolean> {\n const definitionService = this.injector.get(AXPSettingDefinitionProviderService);\n const settings = await definitionService.collectSettingsByKeys(options.scope, options.keys);\n if (!settings.length) {\n return false;\n }\n\n const opener = this.injector.get(AXP_SETTINGS_DEFINITION_DIALOG_OPENER);\n const { openSettingsDefinitionDialog } = await import('./settings-dialog.helper');\n return openSettingsDefinitionDialog(this, opener, {\n scope: options.scope as AXPPlatformScope,\n sections: [\n {\n name: 'quick-edit',\n title: options.title ?? '@settings-management:module.menus.root.title',\n description: options.description,\n settings,\n },\n ],\n title: options.title ?? '@settings-management:module.menus.root.title',\n description: options.description,\n size: options.size,\n });\n }\n\n /** Applies remote values into the in-memory scope cache and notifies listeners. */\n syncScopeCache(scope: AXPPlatformScope, values: Record<string, unknown>): void {\n const scopeCache = this.scopedSettingsCache.get(scope);\n if (!scopeCache) {\n return;\n }\n const keys = Object.keys(values);\n if (keys.length === 0) {\n return;\n }\n keys.forEach((key) => {\n scopeCache.set(key, values[key]);\n });\n this.invokeChangeEvent({\n scope,\n keys,\n values,\n entries: keys.map((key) => ({ key, value: values[key] })),\n });\n }\n\n invokeChangeEvent(event: AXPSettingChangedEvent) {\n this.onChanged.next(event);\n this.applyDebugModeFromEvent(event);\n this.eventService.publish<AXPSettingChangedEvent>('AXPSettingChangedEvent', event);\n }\n\n private async applyDebugModeFromSettings(): Promise<void> {\n try {\n const debugMode = await this.get<boolean>(AXPCommonSettings.DebugMode);\n this.debugService.setDebugMode(!!debugMode);\n } catch {\n this.debugService.setDebugMode(false);\n }\n }\n\n private applyDebugModeFromEvent(event: AXPSettingChangedEvent): void {\n if (!event.keys.includes(AXPCommonSettings.DebugMode)) {\n return;\n }\n\n this.debugService.setDebugMode(!!event.values[AXPCommonSettings.DebugMode]);\n }\n\n private isCachedInScopeOrAncestors(key: string, scope: AXPPlatformScope): boolean {\n const scopesToCheck =\n scope === AXPPlatformScope.User\n ? [AXPPlatformScope.User, AXPPlatformScope.Tenant, AXPPlatformScope.Platform]\n : scope === AXPPlatformScope.Tenant\n ? [AXPPlatformScope.Tenant, AXPPlatformScope.Platform]\n : [AXPPlatformScope.Platform];\n\n for (const candidateScope of scopesToCheck) {\n if (!this.shouldLoadProvider(candidateScope)) {\n continue;\n }\n const scopeCache = this.scopedSettingsCache.get(candidateScope);\n if (!scopeCache?.has(key)) {\n continue;\n }\n const value = scopeCache.get(key);\n if (value !== undefined && value !== null) {\n return true;\n }\n }\n return false;\n }\n\n private async seedMissingDefaults(): Promise<void> {\n const definitionService = this.injector.get(AXPSettingDefinitionProviderService);\n const aggregator = this.injector.get(AXPSettingDefaultValuesAggregatorService);\n const [{ defaults, seedScopeByKey }, scopeByKey, inheritedByKey] = await Promise.all([\n aggregator.getMerged(),\n definitionService.settingScopeByKey(),\n definitionService.settingInheritedByKey(),\n ]);\n const toPersist: Partial<Record<AXPPlatformScope, Record<string, unknown>>> = {};\n\n for (const [key, value] of Object.entries(defaults)) {\n const scope = seedScopeByKey[key] ?? scopeByKey[key];\n if (\n !scope ||\n !this.shouldLoadProvider(scope) ||\n value === undefined ||\n value === null ||\n (typeof value === 'string' && value.trim() === '') ||\n this.isCachedInScopeOrAncestors(key, scope) ||\n (scope !== AXPPlatformScope.Platform && inheritedByKey[key])\n ) {\n continue;\n }\n toPersist[scope] ??= {};\n toPersist[scope]![key] = value;\n }\n\n for (const [scope, values] of Object.entries(toPersist) as [AXPPlatformScope, Record<string, unknown>][]) {\n // Platform settings are server-owned (one-way client cache). Never seed/Patch scope P from the client.\n if (scope === AXPPlatformScope.Platform || Object.keys(values).length === 0) {\n continue;\n }\n await this.scope(scope).set(values, { flush: true });\n }\n }\n}\n\nclass ScopedSettingService {\n constructor(\n private parent: AXPSettingsService,\n private provider: AXPSettingValueProvider,\n private scopeCache: Map<string, any>,\n private isScopeActive: (scope: AXPPlatformScope) => boolean,\n ) {}\n\n async get<T = any>(key: string): Promise<T> {\n await this.parent.ensureScopeLoaded(this.provider.scope);\n const effective = this.scopeCache.has(key) ? this.scopeCache.get(key) : undefined;\n const defaults = await this.parent.defaultValues(this.provider.scope);\n const defaultSample = get(defaults, key);\n const kind = inferSettingCoercionKind(defaultSample, effective);\n if (kind !== null) {\n return coerceAXPSettingRawValueByKind(effective, kind) as T;\n }\n if (effective === undefined) {\n return effective as T;\n }\n return cloneDeep(effective) as T;\n }\n\n async all(): Promise<any> {\n await this.parent.ensureScopeLoaded(this.provider.scope);\n return Object.fromEntries(Array.from(this.scopeCache.entries()).map(([key, value]) => [key, cloneDeep(value)]));\n }\n\n async defaultValues(): Promise<Record<string, unknown>> {\n return this.parent.defaultValues(this.provider.scope);\n }\n\n async set<T = any>(key: string, value: T, options?: AXPSettingSetOptions): Promise<void>;\n async set<T = any>(values: Record<string, T>, options?: AXPSettingSetOptions): Promise<void>;\n async set<T = any>(\n keyOrValues: string | Record<string, T>,\n valueOrOptions?: T | AXPSettingSetOptions,\n options?: AXPSettingSetOptions,\n ): Promise<void> {\n if (!this.isScopeActive(this.provider.scope)) {\n return;\n }\n if (typeof keyOrValues === 'string') {\n const value = valueOrOptions as T;\n await this.provider.set(keyOrValues, value, options);\n this.scopeCache.set(keyOrValues, value);\n this.parent.invokeChangeEvent({\n scope: this.provider.scope,\n keys: [keyOrValues],\n values: { [keyOrValues]: value },\n entries: [{ key: keyOrValues, value }],\n });\n } else {\n const setOptions = valueOrOptions as AXPSettingSetOptions | undefined;\n await this.provider.set(keyOrValues, setOptions);\n Object.entries(keyOrValues).forEach(([key, val]) => this.scopeCache.set(key, val));\n const entries = Object.entries(keyOrValues).map(([key, val]) => ({ key, value: val }));\n this.parent.invokeChangeEvent({\n scope: this.provider.scope,\n keys: Object.keys(keyOrValues),\n values: keyOrValues,\n entries,\n });\n }\n }\n\n async update<T = any>(key: string, updateFn: (currentValue: T) => T): Promise<void> {\n const currentValue = await this.get<T>(key);\n const newValue = updateFn(currentValue);\n await this.set(key, newValue);\n }\n}\n","import { inject, Injectable, signal } from '@angular/core';\n\nimport { AXPRegionalSetting } from '@acorex-platform/framework-shared/core';\nimport { AXPSettingsService } from './settings.service';\n\nconst DEFAULT_APPLY_DEFAULT_MULTILANGUAGE = true;\n\n/**\n * Synchronous access to default multi-language behavior for named entity fields and widget\n * property bindings. Mirrors {@link AXPLayoutOrderingConfigService}: avoids async in entity\n * modifiers and startup deadlocks.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPDefaultMultiLanguageConfigService {\n private readonly settingsService = inject(AXPSettingsService);\n\n private readonly _applyDefault = signal<boolean>(DEFAULT_APPLY_DEFAULT_MULTILANGUAGE);\n private syncScheduled = false;\n\n constructor() {\n this.settingsService.onLoaded.subscribe(() => this.syncFromSettings());\n this.settingsService.onChanged.subscribe(() => this.syncFromSettings());\n }\n\n getApplyDefaultMultiLanguage(): boolean {\n if (!this.syncScheduled) {\n this.syncScheduled = true;\n this.settingsService\n .get<boolean>(AXPRegionalSetting.MultiLanguageSupport)\n .then((value) => this._applyDefault.set(value ?? DEFAULT_APPLY_DEFAULT_MULTILANGUAGE))\n .catch(() => this._applyDefault.set(DEFAULT_APPLY_DEFAULT_MULTILANGUAGE));\n }\n return this._applyDefault();\n }\n\n private async syncFromSettings(): Promise<void> {\n try {\n const value = await this.settingsService.get<boolean>(AXPRegionalSetting.MultiLanguageSupport);\n this._applyDefault.set(value ?? DEFAULT_APPLY_DEFAULT_MULTILANGUAGE);\n } catch {\n this._applyDefault.set(DEFAULT_APPLY_DEFAULT_MULTILANGUAGE);\n }\n }\n}\n","/**\n * Shared multi-language defaults for entity properties and widget property bindings.\n *\n * **Circular dependencies:** use only `import type` for `AXPWidgetProperty` and\n * `AXPEntityProperty` so this module has no runtime imports from widget-core or application\n * types — `@acorex-platform/framework-client/layout/widget-core` does not import `@acorex-platform/framework-client/common`.\n */\nimport type { AXPWidgetProperty } from '@acorex-platform/framework-shared/widget-core';\nimport type { AXPWidgetNode } from '@acorex-platform/framework-shared/core';\n\nimport type { AXPEntityProperty } from '@acorex-platform/framework-shared/entity';\n\n//#region ---- Constants ----\n\n/**\n * Widget types that support the multiLanguage option (text / rich text editors).\n */\nexport const MULTILANGUAGE_CAPABLE_WIDGET_TYPES = new Set<string>([\n 'text-editor',\n 'large-text-editor',\n 'rich-text-editor',\n 'template-content-editor',\n]);\n\n/**\n * Common property names / binding path segments that are usually translatable when the feature is\n * enabled in settings. Explicit `multiLanguage` on the property still wins.\n */\nexport const DEFAULT_MULTILANGUAGE_FIELD_NAMES = new Set<string>([\n 'title',\n 'description',\n 'note',\n 'content',\n /** e.g. `post.summaryContent` — last path segment */\n 'summaryContent',\n 'question',\n 'summary',\n 'body',\n 'caption',\n 'remarks',\n 'subtitle',\n 'label',\n 'placeholder',\n 'message',\n 'subject',\n]);\n\n//#endregion\n\n//#region ---- Helpers ----\n\nfunction interfacePathLastSegment(path: string | undefined): string | null {\n if (path == null || typeof path !== 'string' || !path.length) {\n return null;\n }\n const seg = path.includes('.') ? path.split('.').pop() : path;\n return seg && seg.length ? seg : null;\n}\n\nexport function shouldApplyDefaultMultiLanguageToEntityProperty(prop: AXPEntityProperty): boolean {\n if (prop.schema.dataType !== 'string') {\n return false;\n }\n if (!DEFAULT_MULTILANGUAGE_FIELD_NAMES.has(prop.name)) {\n return false;\n }\n const widgetType = prop.schema.interface?.type;\n if (typeof widgetType !== 'string' || !MULTILANGUAGE_CAPABLE_WIDGET_TYPES.has(widgetType)) {\n return false;\n }\n const opts = prop.schema.interface?.options as Record<string, unknown> | undefined;\n if (opts && 'multiLanguage' in opts) {\n return false;\n }\n return true;\n}\n\nexport function shouldApplyDefaultMultiLanguageToWidgetProperty(prop: AXPWidgetProperty): boolean {\n if (prop.schema.dataType !== 'string') {\n return false;\n }\n const key = interfacePathLastSegment(prop.schema.interface.path);\n if (!key || !DEFAULT_MULTILANGUAGE_FIELD_NAMES.has(key)) {\n return false;\n }\n const widgetType = prop.schema.interface.type;\n if (typeof widgetType !== 'string' || !MULTILANGUAGE_CAPABLE_WIDGET_TYPES.has(widgetType)) {\n return false;\n }\n const opts = prop.schema.interface.options as Record<string, unknown> | undefined;\n if (opts && 'multiLanguage' in opts) {\n return false;\n }\n return true;\n}\n\n/**\n * Leaf widget nodes in entity `schema.interface` trees (e.g. GridLayout → RichText under `pre` /\n * `post`) — same path/type rules as {@link shouldApplyDefaultMultiLanguageToWidgetProperty}, without\n * `schema.dataType` (nodes do not carry entity schema).\n */\nexport function shouldApplyDefaultMultiLanguageToWidgetNode(node: AXPWidgetNode): boolean {\n const widgetType = node.type;\n if (typeof widgetType !== 'string' || !MULTILANGUAGE_CAPABLE_WIDGET_TYPES.has(widgetType)) {\n return false;\n }\n const key = interfacePathLastSegment(node.path);\n if (!key || !DEFAULT_MULTILANGUAGE_FIELD_NAMES.has(key)) {\n return false;\n }\n const opts = node.options as Record<string, unknown> | undefined;\n if (opts && 'multiLanguage' in opts) {\n return false;\n }\n return true;\n}\n\n/**\n * When {@link AXPDefaultMultiLanguageConfigService#getApplyDefaultMultiLanguage} is true, sets\n * `options.multiLanguage` on eligible editor leaves inside an entity property's widget tree\n * (including nested layouts). Used by entity middleware so object fields (e.g. `pre`, `post`) are\n * covered, not only top-level string properties.\n */\nexport function withDefaultMultiLanguageOnWidgetNodeTree(\n root: AXPWidgetNode | undefined | null,\n applyDefault: boolean,\n): AXPWidgetNode | undefined | null {\n if (root == null || !applyDefault) {\n return root ?? undefined;\n }\n return visitWidgetNodeForDefaultMultiLanguage(root);\n}\n\nfunction visitWidgetNodeForDefaultMultiLanguage(node: AXPWidgetNode): AXPWidgetNode {\n let next = node;\n if (node.children?.length) {\n const newChildren = node.children.map((child) => visitWidgetNodeForDefaultMultiLanguage(child));\n if (newChildren.some((c, i) => c !== node.children![i])) {\n next = { ...node, children: newChildren };\n }\n }\n if (shouldApplyDefaultMultiLanguageToWidgetNode(next)) {\n return {\n ...next,\n options: {\n ...((next.options ?? {}) as Record<string, unknown>),\n multiLanguage: true,\n },\n };\n }\n return next;\n}\n\n/**\n * When {@link AXPDefaultMultiLanguageConfigService#getApplyDefaultMultiLanguage} is true, sets\n * `schema.interface.options.multiLanguage` for eligible string widget properties (same rules as\n * entity middleware), unless the property already specifies `multiLanguage`.\n */\nexport function withDefaultMultiLanguageOnWidgetProperty(\n prop: AXPWidgetProperty,\n applyDefault: boolean,\n): AXPWidgetProperty {\n if (!applyDefault || !shouldApplyDefaultMultiLanguageToWidgetProperty(prop)) {\n return prop;\n }\n const iface = prop.schema.interface;\n const existingOpts = (iface.options ?? {}) as Record<string, unknown>;\n return {\n ...prop,\n schema: {\n ...prop.schema,\n interface: {\n ...iface,\n options: {\n ...existingOpts,\n multiLanguage: true,\n },\n },\n },\n };\n}\n\n//#endregion\n","import { Injectable, signal } from '@angular/core';\n\n//#region ----- Platform settings load state -----\n\n/**\n * Tracks fatal failure / offline-continue of the public platform (P) settings bootstrap.\n * Dialogs must not run during APP_INITIALIZER — use {@link setPendingOfflineContinue} instead\n * and resolve the prompt once the root view can host overlays.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPPlatformSettingsLoadState {\n private readonly errorMessage = signal<string | null>(null);\n private readonly offlineMode = signal(false);\n private readonly pendingOfflineContinue = signal(false);\n private pendingBootstrapError: unknown = null;\n\n setFailure(error: unknown): void {\n const message =\n error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : 'Platform settings could not be loaded.';\n this.errorMessage.set(message);\n this.offlineMode.set(false);\n this.pendingOfflineContinue.set(false);\n this.pendingBootstrapError = null;\n }\n\n /**\n * Bootstrap Fetch failed, but cached Allow Working Offline is enabled.\n * Confirm dialog must run after the app is stable (overlay host ready).\n */\n setPendingOfflineContinue(error: unknown): void {\n this.pendingBootstrapError = error;\n this.pendingOfflineContinue.set(true);\n this.errorMessage.set(null);\n this.offlineMode.set(false);\n }\n\n clear(): void {\n this.errorMessage.set(null);\n this.pendingOfflineContinue.set(false);\n this.pendingBootstrapError = null;\n }\n\n hasFailure(): boolean {\n return this.errorMessage() != null;\n }\n\n hasPendingOfflineContinue(): boolean {\n return this.pendingOfflineContinue();\n }\n\n consumePendingBootstrapError(): unknown {\n const error = this.pendingBootstrapError;\n this.pendingBootstrapError = null;\n return error;\n }\n\n message(): string | null {\n return this.errorMessage();\n }\n\n setOfflineMode(enabled: boolean): void {\n this.offlineMode.set(enabled);\n if (enabled) {\n this.errorMessage.set(null);\n this.pendingOfflineContinue.set(false);\n this.pendingBootstrapError = null;\n }\n }\n\n isOfflineMode(): boolean {\n return this.offlineMode();\n }\n}\n\n//#endregion\n","import { Injectable, signal } from '@angular/core';\n\n//#region ----- Network connectivity -----\n\n/**\n * Thin wrapper around the browser online/offline signals.\n * There is no richer connectivity probe in the platform today — use {@link online}\n * for device link state; API reachability is detected via failed HTTP/runtime calls.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPNetworkConnectivityService {\n private readonly onlineSignal = signal(this.readNavigatorOnline());\n\n constructor() {\n if (typeof window === 'undefined') {\n return;\n }\n window.addEventListener('online', () => this.onlineSignal.set(true));\n window.addEventListener('offline', () => this.onlineSignal.set(false));\n }\n\n /** Reactive device connectivity (browser `navigator.onLine`). */\n readonly isOnline = this.onlineSignal.asReadonly();\n\n /** Synchronous device connectivity check. */\n get online(): boolean {\n return this.readNavigatorOnline();\n }\n\n private readNavigatorOnline(): boolean {\n if (typeof navigator === 'undefined') {\n return true;\n }\n return navigator.onLine;\n }\n}\n\n//#endregion\n","import { AXDialogService } from '@acorex/components/dialog';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { ApplicationRef, inject, Injectable } from '@angular/core';\nimport { filter, firstValueFrom, take, timeout, timer } from 'rxjs';\n\nimport { AXPCommonSettings } from '../configs/common-settings.key';\nimport { AXPNetworkConnectivityService } from '../network/network-connectivity.service';\nimport { AXPPlatformSettingsLoadState } from './platform-settings-load-state.service';\nimport { AXPSettingsService } from './settings.service';\n\n//#region ----- Platform settings offline bootstrap -----\n\n// TODO: work more on offline mode (resume startup tasks after continue, sync when back online, UX polish).\n\n/**\n * After platform settings Fetch fails (or the device is offline), decides whether to\n * offer continuing from the IndexedDB cache based on {@link AXPCommonSettings.AllowWorkingOffline}.\n *\n * Important: never open dialogs during APP_INITIALIZER — root ViewContainerRef is null\n * (`createComponent` on null). Use {@link canOfferOfflineContinue} at startup, then\n * {@link confirmAndContinueOffline} once the root component exists.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPPlatformSettingsOfflineBootstrapService {\n //#region ----- Services & Dependencies -----\n\n private readonly settingsService = inject(AXPSettingsService);\n private readonly loadState = inject(AXPPlatformSettingsLoadState);\n private readonly connectivity = inject(AXPNetworkConnectivityService);\n private readonly dialogService = inject(AXDialogService);\n private readonly translationService = inject(AXTranslationService);\n private readonly appRef = inject(ApplicationRef);\n\n //#endregion\n\n //#region ----- Public API -----\n\n /** Device reports no network (browser `navigator.onLine`). */\n isDeviceOffline(): boolean {\n return !this.connectivity.online;\n }\n\n /** Cached-settings check — safe to call during APP_INITIALIZER (no dialogs). */\n async canOfferOfflineContinue(): Promise<boolean> {\n return this.hasCachedAllowWorkingOffline();\n }\n\n /**\n * Shows the offline confirm dialog as soon as the root view can host overlays,\n * then adopts the IndexedDB cache on accept.\n * @returns true when the user accepted offline continue and cache was adopted.\n */\n async confirmAndContinueOffline(): Promise<boolean> {\n if (!(await this.hasCachedAllowWorkingOffline())) {\n return false;\n }\n\n await this.whenRootViewReady();\n\n const title = await this.translationService.translateAsync('@general:messages.offline-continue.title');\n const message = await this.translationService.translateAsync('@general:messages.offline-continue.message');\n const dialogResult = await this.dialogService.confirm(\n title,\n message,\n 'warning',\n 'horizontal',\n false,\n 'cancel',\n );\n\n if (dialogResult.result !== true) {\n return false;\n }\n\n const adopted = await this.settingsService.adoptCachedPlatformSettings();\n if (!adopted) {\n return false;\n }\n\n this.loadState.setOfflineMode(true);\n return true;\n }\n\n //#endregion\n\n //#region ----- Private -----\n\n /**\n * Overlay dialogs need the bootstrapped root ViewContainerRef — not full zone stability.\n * Waiting on {@link ApplicationRef.isStable} delays the confirm while timers/HTTP keep the zone busy.\n */\n private async whenRootViewReady(): Promise<void> {\n if (this.appRef.components.length > 0) {\n return;\n }\n try {\n await firstValueFrom(\n timer(0, 16).pipe(\n filter(() => this.appRef.components.length > 0),\n take(1),\n timeout({ first: 5_000 }),\n ),\n );\n } catch {\n // Proceed even if the root never attached — confirm will fail loudly if overlay is still unavailable.\n }\n }\n\n private async hasCachedAllowWorkingOffline(): Promise<boolean> {\n return (await this.settingsService.peekPlatformCached(AXPCommonSettings.AllowWorkingOffline)) === true;\n }\n\n //#endregion\n}\n\n//#endregion\n","import { inject } from '@angular/core';\nimport { CanActivateFn, Router } from '@angular/router';\n\nimport { AXPPlatformSettingsLoadState } from './platform-settings-load-state.service';\n\n//#region ----- Platform settings available guard -----\n\n/**\n * Blocks authenticated app routes when platform settings bootstrap failed.\n * Sends the user to `/auth/unavailable` instead of the normal destination.\n */\nexport const axpPlatformSettingsAvailableGuard: CanActivateFn = () => {\n const loadState = inject(AXPPlatformSettingsLoadState);\n const router = inject(Router);\n\n if (!loadState.hasFailure()) {\n return true;\n }\n\n return router.createUrlTree(['/auth/unavailable']);\n};\n\n//#endregion\n","import { AXPExpressionEvaluatorScopeProvider, AXPExpressionEvaluatorScopeProviderContext } from '@acorex-platform/framework-shared/core';\nimport { inject } from '@angular/core';\n\nimport { AXPSettingsService } from './settings.service';\n\n//#region ---- Settings expression scope ----\n\n/**\n * Exposes platform settings in expression strings, e.g.\n * `{{ settings.get('Common:Setting:Entity.ShowPageBadge') }}`.\n */\nexport class AXPSettingsEvaluatorScopeProvider implements AXPExpressionEvaluatorScopeProvider {\n private readonly settingsService = inject(AXPSettingsService);\n\n async provide(context: AXPExpressionEvaluatorScopeProviderContext): Promise<void> {\n context.addScope('settings', {\n get: async (key: string) => {\n return await this.settingsService.get(key);\n },\n });\n }\n}\n\n//#endregion\n","import { AXPPlatformScope } from '@acorex-platform/framework-shared/core';\n\n//#region ---- Local snapshot (IndexedDB) ----\n\nexport type AXPSettingsSyncStatus = 'idle' | 'syncing' | 'pending_retry';\n\nexport interface AXPScopedSettingsSnapshot {\n id: string;\n scope: AXPPlatformScope;\n values: Record<string, unknown>;\n serverUpdatedAt: string | null;\n lastRevalidatedAt: string | null;\n dirty: Record<string, unknown>;\n syncStatus: AXPSettingsSyncStatus;\n nextRetryAt: string | null;\n retryAttempt: number;\n}\n\n//#endregion\n\n//#region ---- Scoped sync inputs ----\n\nexport interface AXPSettingsScopedFetchInput {\n scope: AXPPlatformScope;\n since: string | null;\n}\n\nexport interface AXPSettingsScopedPatchInput {\n scope: AXPPlatformScope;\n values: Record<string, unknown>;\n}\n\n//#endregion\n\n//#region ---- Bulk sync payloads ----\n\nexport interface AXPSettingsBulkFetchResult {\n changed: boolean;\n updatedAt: string | null;\n values: Record<string, unknown>;\n}\n\nexport interface AXPSettingsBulkPatchResult {\n updatedAt: string;\n}\n\n//#endregion\n","import { AXCalendarService } from '@acorex/core/date-time';\nimport { Injectable } from '@angular/core';\n\n/**\n * Platform-provided {@link AXCalendarService} that applies locale profile week layout\n * (first day of week, weekends) through the core calendar service lifecycle.\n *\n * Temporary bridge until @acorex/components reads week layout from AXLocaleService.\n */\n@Injectable()\nexport class AXPRegionalCalendarService extends AXCalendarService {}\n","import { AXDialogService } from '@acorex/components/dialog';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport { inject, Injectable } from '@angular/core';\nimport { AXPCommonSettings } from '../configs/common-settings.key';\nimport { AXPSettingsService } from './settings.service';\n\n//#region ---- Types ----\n\nexport interface AXPUnsavedChangesConfirmOptions {\n /** When false, skips confirm even if the global setting is enabled (e.g. dialog `confirmCloseWhenDirty`). */\n enabled?: boolean;\n title?: AXPMultiLanguageString;\n message?: AXPMultiLanguageString;\n /**\n * When true (default), confirming sets leave approval for the next route deactivation.\n * Set false for in-place actions such as discarding edits without navigating away.\n */\n approveLeaveOnConfirm?: boolean;\n}\n\nexport interface AXPUnsavedChangesCanDeactivate {\n canDeactivate(): boolean | Promise<boolean>;\n}\n\n//#endregion\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPUnsavedChangesConfirmService {\n //#region ---- Services & Dependencies ----\n\n private readonly settingsService = inject(AXPSettingsService);\n private readonly dialogService = inject(AXDialogService);\n private readonly translateService = inject(AXTranslationService);\n\n //#endregion\n\n //#region ---- State ----\n\n /** Ensures concurrent leave paths share a single unsaved-changes confirm dialog. */\n private confirmPromise?: Promise<boolean>;\n\n /** Set after the user confirms leaving; cleared on {@link NavigationEnd} by popstate handler. */\n private leaveConfirmed = false;\n\n //#endregion\n\n //#region ---- Public API ----\n\n /**\n * Whether the global \"confirm unsaved changes\" setting is enabled.\n */\n async isGloballyEnabled(): Promise<boolean> {\n const value = await this.settingsService.get<boolean>(AXPCommonSettings.ConfirmUnsavedChanges);\n return value !== false;\n }\n\n /**\n * Marks the next route deactivation as already approved (avoids a second prompt after in-app navigation).\n */\n markLeaveConfirmed(): void {\n this.leaveConfirmed = true;\n }\n\n /** True while an unsaved-changes confirm dialog is open or being resolved. */\n isConfirmPending(): boolean {\n return this.confirmPromise != null;\n }\n\n /** Whether the user already approved leaving during the current navigation. */\n hasLeaveConfirmed(): boolean {\n return this.leaveConfirmed;\n }\n\n /** Clears leave approval after navigation settles. */\n clearLeaveConfirmed(): void {\n this.leaveConfirmed = false;\n }\n\n consumeLeaveConfirmed(): boolean {\n if (!this.leaveConfirmed) {\n return false;\n }\n this.leaveConfirmed = false;\n return true;\n }\n\n /**\n * Prompts when `isDirty` and the global setting (and optional per-instance `enabled`) allow it.\n * Returns true when navigation/dismiss may proceed.\n */\n async confirmIfDirty(isDirty: boolean, options?: AXPUnsavedChangesConfirmOptions): Promise<boolean> {\n if (this.confirmPromise) {\n return this.confirmPromise;\n }\n\n if (options?.enabled === false || !isDirty) {\n return true;\n }\n\n // Reserve before any await so concurrent close/navigation paths share one dialog.\n this.confirmPromise = this.resolveConfirmIfDirty(options);\n try {\n return await this.confirmPromise;\n } finally {\n this.confirmPromise = undefined;\n }\n }\n\n //#endregion\n\n //#region ---- Private Methods ----\n\n private async resolveConfirmIfDirty(options?: AXPUnsavedChangesConfirmOptions): Promise<boolean> {\n if (!(await this.isGloballyEnabled())) {\n return true;\n }\n\n const confirmed = await this.prompt(options);\n if (confirmed && options?.approveLeaveOnConfirm !== false) {\n this.leaveConfirmed = true;\n }\n return confirmed;\n }\n\n private async prompt(options?: AXPUnsavedChangesConfirmOptions): Promise<boolean> {\n const [title, message, yesText, noText] = await Promise.all([\n this.translateService.translateAsync(options?.title ?? '@general:messages.unsaved-changes.title'),\n this.translateService.translateAsync(options?.message ?? '@general:messages.unsaved-changes.message'),\n this.translateService.translateAsync('@general:terms.common.yes-no.yes'),\n this.translateService.translateAsync('@general:terms.common.yes-no.no'),\n ]);\n\n return new Promise((resolve) => {\n const popup = this.dialogService.open({\n title,\n content: message,\n type: 'warning',\n orientation: 'horizontal',\n draggable: false,\n buttons: [\n {\n name: 'yes',\n text: yesText,\n color: 'warning',\n autofocus: false,\n onClick: () => {\n popup.close();\n resolve(true);\n },\n },\n {\n name: 'no',\n text: noText,\n color: 'default',\n autofocus: true,\n onClick: () => {\n popup.close();\n resolve(false);\n },\n hotkey: {\n Escape: () => {\n popup.close();\n resolve(false);\n },\n },\n },\n ],\n });\n });\n }\n\n //#endregion\n}\n","import { Location } from '@angular/common';\nimport { DestroyRef, inject, Injectable } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, NavigationStart, Router } from '@angular/router';\nimport { filter } from 'rxjs/operators';\nimport { AXPUnsavedChangesConfirmService } from './unsaved-changes-confirm.service';\n\n//#region ---- Types ----\n\nexport interface AXPUnsavedChangesPopstateSource {\n id: string;\n isDirty: () => boolean;\n}\n\n//#endregion\n\n/**\n * Intercepts browser back/forward (`popstate`) when a registered page is dirty.\n * Captures dirty state synchronously on {@link NavigationStart}, restores the current URL\n * before route activation, prompts once, then re-triggers `history.back()` only if confirmed.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPUnsavedChangesPopstateService {\n //#region ---- Services & Dependencies ----\n\n private readonly router = inject(Router);\n private readonly location = inject(Location);\n private readonly confirm = inject(AXPUnsavedChangesConfirmService);\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ---- State ----\n\n private sources: AXPUnsavedChangesPopstateSource[] = [];\n private committedUrl = '';\n private handling = false;\n\n //#endregion\n\n //#region ---- Lifecycle ----\n\n constructor() {\n this.committedUrl = this.router.url;\n\n this.router.events.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event) => {\n if (event instanceof NavigationEnd) {\n this.committedUrl = event.urlAfterRedirects;\n this.confirm.clearLeaveConfirmed();\n return;\n }\n\n if (event instanceof NavigationStart && event.navigationTrigger === 'popstate') {\n void this.handlePopstateNavigation(event);\n }\n });\n }\n\n //#endregion\n\n //#region ---- Registry ----\n\n registerSource(source: AXPUnsavedChangesPopstateSource): void {\n this.sources = this.sources.filter((entry) => entry.id !== source.id);\n this.sources.push(source);\n }\n\n unregisterSource(id: string): void {\n this.sources = this.sources.filter((entry) => entry.id !== id);\n }\n\n //#endregion\n\n //#region ---- Popstate Handler ----\n\n /** True while a popstate back/forward is being intercepted or confirmed. */\n isHandlingPopstate(): boolean {\n return this.handling;\n }\n\n private async handlePopstateNavigation(start: NavigationStart): Promise<void> {\n if (this.handling) {\n return;\n }\n\n if (this.confirm.hasLeaveConfirmed()) {\n return;\n }\n\n const dirty = this.isDirty();\n if (!dirty) {\n return;\n }\n\n const stayUrl = this.committedUrl;\n const targetUrl = start.url;\n if (!stayUrl || stayUrl === targetUrl) {\n return;\n }\n\n this.handling = true;\n try {\n this.location.go(stayUrl);\n\n const allowed = await this.confirm.confirmIfDirty(true);\n if (!allowed) {\n await this.router.navigateByUrl(stayUrl, { replaceUrl: true });\n return;\n }\n\n window.history.back();\n } finally {\n this.handling = false;\n }\n }\n\n //#endregion\n\n //#region ---- Utility Methods ----\n\n private isDirty(): boolean {\n return this.sources.some((source) => source.isDirty());\n }\n\n //#endregion\n}\n","import { Injectable } from '@angular/core';\nimport type { DetachedRouteHandle } from '@angular/router';\n\n//#region ---- Types ----\n\ninterface DestroyableRouteHandle {\n componentRef?: { destroy: () => void; instance?: unknown };\n}\n\n//#endregion\n\n/**\n * Holds detached Angular route component instances keyed by tab key so tabular navigation can\n * preserve a page's full state (data-table selection, scroll, unsaved form values, etc.) while it\n * is in the background, then reattach it without re-rendering.\n *\n * The registry has no `Router` dependency on purpose: it is consumed by the {@link RouteReuseStrategy}\n * implementation, so depending on `Router` here would create a construction-time cycle.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPTabRouteCacheRegistry {\n //#region ---- State ----\n\n private readonly handles = new Map<string, DetachedRouteHandle>();\n private openKeys = new Set<string>();\n private enabled = false;\n private deactivateGuardSuspended = false;\n\n //#endregion\n\n //#region ---- Deactivate Guard Suspension ----\n\n /**\n * Runs `action` while unsaved-changes `canDeactivate` guards are suspended, so switching between\n * tabs preserves a dirty page without prompting. Closing a tab does not use this path, so the\n * prompt still appears there.\n */\n async runWithSuspendedDeactivateGuards<T>(action: () => Promise<T>): Promise<T> {\n const previous = this.deactivateGuardSuspended;\n this.deactivateGuardSuspended = true;\n try {\n return await action();\n } finally {\n this.deactivateGuardSuspended = previous;\n }\n }\n\n isDeactivateGuardSuspended(): boolean {\n return this.deactivateGuardSuspended;\n }\n\n //#endregion\n\n //#region ---- Mode ----\n\n /** Enables caching (tabular mode). Disabling clears and destroys every cached component. */\n setEnabled(enabled: boolean): void {\n if (this.enabled === enabled) {\n return;\n }\n this.enabled = enabled;\n if (!enabled) {\n this.clear();\n }\n }\n\n isEnabled(): boolean {\n return this.enabled;\n }\n\n //#endregion\n\n //#region ---- Open Keys Sync ----\n\n /**\n * Reconciles open scoped tab keys and active tab URLs. Cached handles whose key is not an open\n * scoped tab key, an active tab URL, or a child path under an open scoped tab are destroyed.\n */\n syncOpenKeys(scopedKeys: string[], activeTabUrls: string[] = []): void {\n const scopedSet = new Set(scopedKeys);\n const activePathSet = new Set(\n activeTabUrls.map((url) => url.split('?')[0].split('#')[0].replace(/\\/+$/, '') || '/'),\n );\n\n for (const cacheKey of [...this.handles.keys()]) {\n const normalizedCacheKey = cacheKey.replace(/\\/+$/, '') || '/';\n const keepsScopedKey = scopedSet.has(normalizedCacheKey);\n const keepsActiveUrl = activePathSet.has(normalizedCacheKey);\n const keepsUnderScopedTab = [...scopedSet].some(\n (scopedKey) =>\n normalizedCacheKey === scopedKey || normalizedCacheKey.startsWith(`${scopedKey}/`),\n );\n\n if (!keepsScopedKey && !keepsActiveUrl && !keepsUnderScopedTab) {\n this.destroyHandle(this.handles.get(cacheKey));\n this.handles.delete(cacheKey);\n }\n }\n\n this.openKeys = scopedSet;\n }\n\n isOpen(key: string): boolean {\n return this.openKeys.has(key);\n }\n\n /**\n * Returns the live component instance for a cached background tab, when available.\n * Matches the tab key directly or any cached handle under a scoped tab prefix.\n */\n getComponentInstance<T>(key: string): T | null {\n const normalizedKey = key.replace(/\\/+$/, '') || '/';\n const direct = this.handles.get(normalizedKey) ?? this.handles.get(key);\n if (direct) {\n return this.readComponentInstance<T>(direct);\n }\n\n for (const [cacheKey, handle] of this.handles) {\n const normalizedCacheKey = cacheKey.replace(/\\/+$/, '') || '/';\n if (normalizedCacheKey === normalizedKey || normalizedCacheKey.startsWith(`${normalizedKey}/`)) {\n return this.readComponentInstance<T>(handle);\n }\n }\n\n return null;\n }\n\n //#endregion\n\n //#region ---- Handle Store ----\n\n /**\n * Caches a detached background handle. Overwrites without destroying the previous handle: on a\n * repeat visit Angular hands back a new handle object wrapping the same live `componentRef`, so\n * destroying the old one would destroy the live component and corrupt the view (NG0922).\n */\n store(key: string, handle: DetachedRouteHandle): void {\n this.handles.set(key, handle);\n }\n\n /**\n * Returns the cached handle without mutating the map. Angular reads a handle twice per\n * navigation (once while building the future state, once while attaching), so `retrieve` must be\n * idempotent; the handle is released afterwards via {@link release} when Angular calls\n * `store(snapshot, null)`.\n */\n retrieve(key: string): DetachedRouteHandle | null {\n return this.handles.get(key) ?? null;\n }\n\n /**\n * Drops a handle that the router has just reattached (it is now a live foreground view, so it\n * must not be destroyed). The map keeps only truly backgrounded handles.\n */\n release(key: string): void {\n this.handles.delete(key);\n }\n\n has(key: string): boolean {\n return this.handles.has(key);\n }\n\n /** Destroys and removes a single cached handle (used when a tab closes). */\n evict(key: string): void {\n this.destroyHandle(this.handles.get(key));\n this.handles.delete(key);\n }\n\n /** Destroys and removes every cached handle. */\n clear(): void {\n for (const handle of this.handles.values()) {\n this.destroyHandle(handle);\n }\n this.handles.clear();\n this.openKeys.clear();\n }\n\n //#endregion\n\n //#region ---- Utility Methods ----\n\n private readComponentInstance<T>(handle: DetachedRouteHandle): T | null {\n const componentRef = (handle as unknown as DestroyableRouteHandle).componentRef;\n return (componentRef?.instance as T) ?? null;\n }\n\n private destroyHandle(handle: DetachedRouteHandle | undefined): void {\n if (!handle) {\n return;\n }\n const componentRef = (handle as unknown as DestroyableRouteHandle).componentRef;\n componentRef?.destroy?.();\n }\n\n //#endregion\n}\n","import { inject } from '@angular/core';\nimport { CanDeactivateFn } from '@angular/router';\nimport { AXPTabRouteCacheRegistry } from '../tab-navigation/tab-route-cache.registry';\nimport { AXPUnsavedChangesCanDeactivate } from './unsaved-changes-confirm.service';\n\n//#region ---- Unsaved Changes Can Deactivate Guard Factory ----\n\nexport function createUnsavedChangesCanDeactivateGuard<T extends AXPUnsavedChangesCanDeactivate>(): CanDeactivateFn<T> {\n return (component) => {\n // Tab switches keep the page alive in the background, so skip the prompt; closing a tab does not\n // suspend guards and still prompts.\n const tabCache = inject(AXPTabRouteCacheRegistry, { optional: true });\n if (tabCache?.isDeactivateGuardSuspended()) {\n return true;\n }\n return component.canDeactivate();\n };\n}\n\n//#endregion\n","import type { AXPopupSizeType } from '@acorex/components/popup';\nimport type { AXPPlatformScopeKey } from '@acorex-platform/framework-shared/core';\n\n//#region ---- Settings popup options ----\n\nexport interface AXPSettingsSectionPopupOptions {\n scope: AXPPlatformScopeKey;\n /** Settings definition section name (e.g. `smtp-settings`). */\n section: string;\n /** Optional parent group when section names are not unique. */\n group?: string;\n /** Overrides the section title in the popup header. */\n title?: string;\n /** Overrides the section description shown under the title. */\n description?: string;\n size?: AXPopupSizeType;\n}\n\nexport interface AXPSettingsKeysPopupOptions {\n scope: AXPPlatformScopeKey;\n /** Setting keys to render using their canonical widget definitions. */\n keys: string[];\n title?: string;\n description?: string;\n size?: AXPopupSizeType;\n}\n\nexport interface AXPSettingsPopupResult {\n saved: boolean;\n}\n\n//#endregion\n","export enum AXPHomePageSettings {\n UserHomePath = 'Common:Setting:Startup.HomePage',\n}","import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { inject, Injectable, Injector } from '@angular/core';\nimport { Route, Router, Routes, UrlTree } from '@angular/router';\nimport { combineLatest, distinctUntilChanged, filter, firstValueFrom, take } from 'rxjs';\nimport { AXPSettingsService } from '../settings';\nimport { AXPHomePageSettings } from './home-page-settings.key';\nimport { AXP_HOME_PAGE_DEFAULT_KEY, AXP_HOME_PAGES, AXPHomePageDefinition } from './home-page.types';\n\n//#region ----- Home page service -----\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPHomePageService {\n //#region ----- Services & Dependencies -----\n\n private readonly defaultHomePageKey = inject<string>(AXP_HOME_PAGE_DEFAULT_KEY, { optional: true }) ?? 'home';\n private readonly candidates = inject<AXPHomePageDefinition[]>(AXP_HOME_PAGES, { optional: true }) ?? [];\n private readonly settingsService = inject(AXPSettingsService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly injector = inject(Injector);\n\n //#endregion\n\n //#region ----- State -----\n\n private userHomePageKey: string | null = null;\n private originalConfig: Routes | null = null;\n private readonly loginPath = 'auth/login';\n\n //#endregion\n\n //#region ----- Computed -----\n\n private get flatCandidates() {\n return this.candidates.flatMap((c) => c);\n }\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n constructor() {\n // Defer init to avoid circular DI with settings/router.\n setTimeout(() => {\n void this.init();\n });\n }\n\n private async init() {\n await this.load();\n // Capture the full router config once before we start merging home routes.\n this.ensureOriginalConfig();\n this.refreshRoutes();\n\n const keys = [AXPHomePageSettings.UserHomePath];\n this.settingsService.onChanged.subscribe(async (c) => {\n if (keys.some((key) => c.keys.includes(key))) {\n await this.load();\n this.refreshRoutes();\n }\n });\n\n combineLatest([\n this.sessionService.isAuthorized$,\n this.sessionService.application$,\n this.sessionService.tenant$,\n ])\n .pipe(\n distinctUntilChanged(\n ([authorized, application, tenant], [previousAuthorized, previousApplication, previousTenant]) =>\n authorized === previousAuthorized &&\n application?.id === previousApplication?.id &&\n tenant?.id === previousTenant?.id,\n ),\n filter(([authorized]) => authorized),\n )\n .subscribe(async () => {\n await this.load();\n this.refreshRoutes();\n });\n }\n\n //#endregion\n\n //#region ----- Public API -----\n\n async load() {\n this.userHomePageKey = await this.settingsService.get(AXPHomePageSettings.UserHomePath);\n }\n\n getRegisteredList(): AXPHomePageDefinition[] {\n return this.flatCandidates.filter((c) => c.route);\n }\n\n /**\n * Home shell (`:app` + dashboard children) is always registered when a home definition exists.\n * App-specific redirects are added only after an application is selected.\n * This prevents refresh/deep-link 404s while session restore is still in progress.\n */\n getRegisteredRoutes(): Routes {\n const home = this.resolveHomeDefinition();\n if (!home?.route) {\n return [{ path: '', redirectTo: this.loginPath, pathMatch: 'full' }];\n }\n\n const appName = this.sessionService.application?.name;\n const homeRoute: Route = {\n ...home.route,\n data: {\n ...home.route.data,\n key: home.key,\n title: home.title,\n ...(appName ? { path: this.findPath(home.route) } : {}),\n },\n };\n\n if (appName) {\n const fullPath = this.findPath(home.route);\n return [\n { path: '', redirectTo: fullPath, pathMatch: 'full' },\n { path: ':app', redirectTo: fullPath, pathMatch: 'full' },\n homeRoute,\n ];\n }\n\n return [{ path: '', redirectTo: this.loginPath, pathMatch: 'full' }, homeRoute];\n }\n\n getCurrent(): { path: string; title: string } {\n const home = this.resolveHomeDefinition();\n const appName = this.sessionService.application?.name;\n if (home?.route && appName) {\n return {\n path: this.findPath(home.route),\n title: home.title ?? '',\n };\n }\n\n return {\n path: this.loginPath,\n title: '',\n };\n }\n\n /**\n * Resolves the current user's home page as a router URL tree.\n */\n resolveHomeUrlTree(): UrlTree {\n const router = this.injector.get(Router);\n const current = this.getCurrent();\n const path = current.path.startsWith('/') ? current.path : `/${current.path}`;\n return router.parseUrl(path);\n }\n\n /**\n * Waits for an authorized app session, merges home routes, and returns the home UrlTree.\n * Prefer returning this from route guards instead of calling {@link navigateTo} (nested\n * `router.navigate` inside `canActivate` can deadlock and leave the UI on /auth/login).\n */\n async resolveAuthorizedHomeUrlTree(): Promise<UrlTree> {\n if (!(this.sessionService.isAuthorized && this.sessionService.application?.name)) {\n await firstValueFrom(\n combineLatest([this.sessionService.isAuthorized$, this.sessionService.application$]).pipe(\n filter(([authorized, application]) => authorized && !!application?.name),\n take(1),\n ),\n );\n }\n\n await this.load();\n this.ensureOriginalConfig();\n this.refreshRoutes();\n return this.resolveHomeUrlTree();\n }\n\n /**\n * Navigates to the home page after the session has an application and home routes are merged.\n * Safe outside guards (e.g. password login, app-chooser list). Do not await this from canActivate.\n */\n async navigateTo(): Promise<void> {\n const target = await this.resolveAuthorizedHomeUrlTree();\n const router = this.injector.get(Router);\n await router.navigateByUrl(target, { onSameUrlNavigation: 'reload' });\n }\n\n //#endregion\n\n //#region ----- Private helpers -----\n\n private resolveHomeDefinition(): AXPHomePageDefinition | undefined {\n const defaultHomePage = this.flatCandidates.find((c) => c.key === this.defaultHomePageKey);\n return (\n this.flatCandidates.find((c) => this.userHomePageKey && c.key === this.userHomePageKey) ?? defaultHomePage\n );\n }\n\n private findPath(target: Route): string {\n const rawPath = this.buildFullPaths(target).join('/');\n const appName = this.sessionService.application?.name;\n if (appName) {\n return rawPath.replace(':app', appName);\n }\n return rawPath;\n }\n\n private buildFullPaths(route: Route, parentPath: string[] = []): string[] {\n const segments = [...parentPath];\n if (route.path) {\n segments.push(route.path);\n }\n\n if (route.children?.length) {\n return this.buildFullPaths(route.children[0], segments);\n }\n\n return segments;\n }\n\n private ensureOriginalConfig(): void {\n if (this.originalConfig) {\n return;\n }\n this.originalConfig = this.injector.get(Router).config;\n }\n\n private refreshRoutes() {\n const router = this.injector.get(Router);\n this.ensureOriginalConfig();\n this.applyMergedConfig(router);\n }\n\n private applyMergedConfig(router: Router) {\n const newHomeRoutes = this.getRegisteredRoutes();\n\n // Drop previous home placeholders (`''`, bare `:app`, keyed home route) from the snapshot.\n const otherRoutes = (this.originalConfig ?? []).filter(\n (r) => r.path !== '' && r.path !== ':app' && !(r.data && typeof r.data['key'] === 'string'),\n );\n\n router.resetConfig([...newHomeRoutes, ...otherRoutes]);\n }\n\n //#endregion\n}\n\n//#endregion\n","import { EnvironmentProviders, inject, makeEnvironmentProviders } from \"@angular/core\";\nimport { Routes, ROUTES } from \"@angular/router\";\nimport { AXPHomePageService } from \"./home-page.service\";\n\nfunction dynamicRoutesFactory(): Routes {\n const service = inject(AXPHomePageService);\n return service.getRegisteredRoutes();\n}\n\nexport function provideDynamicHomePage(): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: ROUTES,\n useFactory: dynamicRoutesFactory,\n multi: true\n }\n ]);\n}","//#region ---- Experience settings group ----\n\n/** Root Settings nav group for startup, widgets, notifications, and entity UX preferences. */\nexport const AXP_EXPERIENCE_SETTINGS_GROUP = 'experience';\n\nexport const AXP_EXPERIENCE_SETTINGS_SECTIONS = {\n Startup: 'startup',\n Widgets: 'widgets',\n Notifications: 'notifications',\n Performance: 'performance',\n Entity: 'entity',\n Offline: 'offline',\n FileChooser: 'file-chooser',\n} as const;\n\n//#endregion\n","\nimport { AXPPlatformScope, AXPWidgetsCatalog } from '@acorex-platform/framework-shared/core';\nimport { objectKeyValueTransforms } from '@acorex-platform/framework-client/core';\n\nimport { Injectable, Injector, inject } from '@angular/core';\nimport {\n AXP_EXPERIENCE_SETTINGS_GROUP,\n AXP_EXPERIENCE_SETTINGS_SECTIONS,\n} from '../settings/experience-settings.constants';\nimport { AXPSettingDefinitionProvider, AXPSettingDefinitionProviderContext } from '../settings';\nimport { AXPHomePageSettings } from './home-page-settings.key';\nimport { AXPHomePageService } from './home-page.service';\nimport { AXP_HOME_PAGE_DEFAULT_KEY } from './home-page.types';\n\nconst I18N = '@general:settings';\n\n@Injectable()\nexport class AXPHomePageSettingProvider implements AXPSettingDefinitionProvider {\n private readonly homePageService = this.injector.get(AXPHomePageService);\n private defaultHomePageKey = inject<string>(AXP_HOME_PAGE_DEFAULT_KEY, { optional: true }) ?? 'home';\n\n constructor(private injector: Injector) {}\n\n async provide(context: AXPSettingDefinitionProviderContext): Promise<void> {\n const list = this.homePageService.getRegisteredList().map((c) => ({ id: c.key, title: c.title }));\n if (list.length === 0) {\n return;\n }\n\n context\n .addGroup(\n AXP_EXPERIENCE_SETTINGS_GROUP,\n `${I18N}.experience.nav-title`,\n `${I18N}.experience.description`,\n 'fa-light fa-wand-magic-sparkles',\n `${I18N}.experience.title`,\n 1,\n )\n .addSection(\n AXP_EXPERIENCE_SETTINGS_SECTIONS.Startup,\n `${I18N}.experience.startup.title`,\n `${I18N}.experience.startup.description`,\n )\n .addSetting({\n key: AXPHomePageSettings.UserHomePath,\n title: `${I18N}.experience.startup.home-page.title`,\n scope: AXPPlatformScope.User,\n overridableAt: [],\n isInherited: true,\n defaultValue: this.defaultHomePageKey || list[0].id,\n valueTransforms: objectKeyValueTransforms('id'),\n widget: {\n type: AXPWidgetsCatalog.select,\n options: {\n valueField: 'id',\n textField: 'title',\n dataSource: list,\n },\n },\n description: `${I18N}.experience.startup.home-page.description`,\n })\n .endSection()\n .addSection(\n AXP_EXPERIENCE_SETTINGS_SECTIONS.Widgets,\n `${I18N}.experience.widgets.title`,\n `${I18N}.experience.widgets.description`,\n )\n .endSection()\n .endGroup();\n }\n}\n","import { NgModule } from '@angular/core';\nimport { AXP_SETTING_DEFINITION_PROVIDER } from '../settings';\nimport { AXPHomePageSettingProvider } from './home-page-settings.provider';\n\n@NgModule({\n imports: [],\n providers: [\n {\n provide: AXP_SETTING_DEFINITION_PROVIDER,\n useClass: AXPHomePageSettingProvider,\n multi: true,\n },\n ],\n})\nexport class AXPHomePageModule {}\n","//#region ---- Imports ----\n\nimport { InjectionToken } from '@angular/core';\nimport type { AXPUserReference } from '@acorex-platform/framework-shared/core';\n//#endregion\n\n//#region ---- In-app notification port ----\n\nexport type AXPInAppNotificationPriority = 'Notice' | 'Danger' | 'Warning';\n\nexport interface AXPInAppNotificationCreateRequest {\n id: string;\n name: string;\n title: string;\n body: string;\n icon: string;\n priority: AXPInAppNotificationPriority;\n receiver: AXPUserReference;\n data?: Record<string, unknown>;\n}\n\n/**\n * Persists in-app notifications. Communication-management registers the primary\n * implementation via {@link CommunicationSendInput} (channel `in-app`).\n */\nexport interface AXPInAppNotificationService {\n create(request: AXPInAppNotificationCreateRequest): Promise<void>;\n}\n\nexport const AXP_IN_APP_NOTIFICATION_SERVICE = new InjectionToken<AXPInAppNotificationService>(\n 'AXP_IN_APP_NOTIFICATION_SERVICE',\n);\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { inject, Injectable } from '@angular/core';\nimport { get } from 'lodash-es';\nimport {\n AXP_IN_APP_NOTIFICATION_SERVICE,\n type AXPInAppNotificationCreateRequest,\n type AXPInAppNotificationPriority,\n} from './background-operation.notification';\nimport type { AXPBackgroundOperation } from './background-operation.types';\n\n//#endregion\n\n//#region ---- Service ----\n\n/**\n * Sends in-app notifications when a background operation finishes or fails.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPBackgroundOperationNotificationService {\n private readonly inAppNotificationService = inject(AXP_IN_APP_NOTIFICATION_SERVICE, { optional: true });\n\n private readonly sessionService = inject(AXPSessionService);\n\n async notify(operation: AXPBackgroundOperation): Promise<void> {\n if (!this.inAppNotificationService || !this.shouldNotify(operation)) {\n return;\n }\n\n const userId = this.sessionService.user?.id;\n if (!userId) {\n return;\n }\n\n const body = this.resolveBody(operation);\n const { icon, priority } = this.resolveTemplate(operation);\n\n const request: AXPInAppNotificationCreateRequest = {\n id: `notif-bg-op-${operation.id}-${operation.status}`,\n name: operation.title,\n title: operation.title,\n body,\n icon,\n priority,\n receiver: {\n id: userId,\n type: 'user',\n fullName: get(this.sessionService.user, 'title') as string | undefined,\n username: get(this.sessionService.user, 'name') as string | undefined,\n },\n data: {\n backgroundOperationId: operation.id,\n providerKey: operation.providerKey,\n status: operation.status,\n ...(operation.data ?? {}),\n },\n };\n\n await this.inAppNotificationService.create(request);\n }\n\n //#region ---- Helpers ----\n\n private shouldNotify(operation: AXPBackgroundOperation): boolean {\n const { capabilities } = operation;\n\n if (operation.status === 'failed') {\n return capabilities.notifyOnFailed !== false;\n }\n\n if (operation.status === 'completed' || operation.status === 'cancelled') {\n return capabilities.notifyOnComplete !== false;\n }\n\n return false;\n }\n\n private resolveBody(operation: AXPBackgroundOperation): string {\n if (operation.status === 'failed') {\n return operation.error?.message ?? operation.statusText ?? 'Background task failed';\n }\n\n const statusText = operation.statusText?.trim();\n return statusText || operation.title;\n }\n\n private resolveTemplate(operation: AXPBackgroundOperation): {\n icon: string;\n priority: AXPInAppNotificationPriority;\n } {\n switch (operation.status) {\n case 'completed':\n return { icon: 'fa-light fa-circle-check', priority: 'Notice' };\n case 'failed':\n return { icon: 'fa-light fa-circle-exclamation', priority: 'Danger' };\n case 'cancelled':\n return { icon: 'fa-light fa-ban', priority: 'Warning' };\n default:\n return { icon: 'fa-light fa-list-check', priority: 'Notice' };\n }\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport {AXPDataGenerator} from '@acorex-platform/framework-client/core';\nimport { isNumber } from 'lodash-es';\nimport type {\n AXPBackgroundOperation,\n AXPBackgroundOperationCapabilities,\n AXPBackgroundOperationCreateRequest,\n AXPBackgroundOperationFailurePolicy,\n AXPBackgroundOperationStatus,\n} from './background-operation.types';\n\n//#endregion\n\n//#region ---- Factories ----\n\nexport function axpCreateBackgroundOperationId(): string {\n return `bg-op-${AXPDataGenerator.uuid()}`;\n}\n\nexport function axpBuildBackgroundOperation(\n providerKey: string,\n request: AXPBackgroundOperationCreateRequest,\n overrides?: Partial<AXPBackgroundOperation>,\n): AXPBackgroundOperation {\n const now = new Date();\n const operation: AXPBackgroundOperation = {\n id: axpCreateBackgroundOperationId(),\n providerKey,\n title: request.title,\n status: 'queued',\n progress: request.progress,\n estimatedDurationMs: request.estimatedDurationMs,\n statusText: request.statusText,\n currentStep: request.currentStep,\n createdAt: now,\n capabilities: request.capabilities,\n failurePolicy: request.failurePolicy,\n ...overrides,\n };\n const hasStarted = operation.status === 'running' || operation.status === 'paused';\n\n return {\n ...operation,\n createdAt: operation.createdAt ?? now,\n startedAt: operation.startedAt ?? (hasStarted ? now : undefined),\n };\n}\n\nexport function axpCoerceBackgroundOperationDate(value: Date | string | undefined): Date | null {\n if (!value) {\n return null;\n }\n const date = value instanceof Date ? value : new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\nexport function axpBackgroundOperationDisplayTime(operation: AXPBackgroundOperation): Date | null {\n return (\n axpCoerceBackgroundOperationDate(operation.startedAt) ??\n axpCoerceBackgroundOperationDate(operation.createdAt)\n );\n}\n\n/**\n * Remaining duration in milliseconds for ETA display.\n */\nexport function axpBackgroundOperationRemainingMs(operation: AXPBackgroundOperation): number | null {\n if (!operation.capabilities.supportsEstimate || !isNumber(operation.estimatedDurationMs)) {\n return null;\n }\n\n const { estimatedDurationMs, progress, startedAt, status } = operation;\n if (status !== 'running' && status !== 'paused' && status !== 'queued') {\n return null;\n }\n\n if (isNumber(progress) && progress >= 100) {\n return 0;\n }\n\n if (isNumber(progress) && progress > 0) {\n return Math.max(0, Math.round((estimatedDurationMs * (100 - progress)) / 100));\n }\n\n const started = axpCoerceBackgroundOperationDate(startedAt);\n if (started) {\n const elapsed = Date.now() - started.getTime();\n return Math.max(0, estimatedDurationMs - elapsed);\n }\n\n return estimatedDurationMs;\n}\n\n/**\n * Estimated completion instant for relative-time formatting (e.g. timeleft pipe).\n */\nexport function axpBackgroundOperationEstimateEndDate(operation: AXPBackgroundOperation): Date | null {\n const remainingMs = axpBackgroundOperationRemainingMs(operation);\n if (remainingMs === null) {\n return null;\n }\n return new Date(Date.now() + remainingMs);\n}\n\nexport function axpBackgroundOperationCapabilities(\n partial: Partial<AXPBackgroundOperationCapabilities> = {},\n): AXPBackgroundOperationCapabilities {\n return {\n cancellable: partial.cancellable ?? false,\n pausable: partial.pausable ?? false,\n resumable: partial.resumable ?? false,\n retryable: partial.retryable ?? false,\n supportsProgress: partial.supportsProgress ?? false,\n supportsEstimate: partial.supportsEstimate ?? false,\n clickable: partial.clickable ?? false,\n notifyOnComplete: partial.notifyOnComplete ?? true,\n notifyOnFailed: partial.notifyOnFailed ?? true,\n };\n}\n\nexport function axpBackgroundOperationFailurePolicy(\n partial: Partial<AXPBackgroundOperationFailurePolicy> = {},\n): AXPBackgroundOperationFailurePolicy {\n return {\n mode: partial.mode ?? 'abort',\n currentStepId: partial.currentStepId,\n maxRetries: partial.maxRetries,\n retryCount: partial.retryCount ?? 0,\n };\n}\n\nexport function axpIsActiveBackgroundOperationStatus(status: AXPBackgroundOperationStatus): boolean {\n return status === 'queued' || status === 'running' || status === 'paused';\n}\n\nexport function axpIsCompletedBackgroundOperationStatus(status: AXPBackgroundOperationStatus): boolean {\n return status === 'completed' || status === 'cancelled';\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { inject, Injectable } from '@angular/core';\nimport { AXPBackgroundOperationNotificationService } from './background-operation-notification.service';\nimport type { AXPBackgroundOperation } from './background-operation.types';\nimport { axpIsCompletedBackgroundOperationStatus } from './background-operation.util';\n\n//#endregion\n\n//#region ---- Service ----\n\n/**\n * Sends notifications and removes tray rows when a background operation reaches a terminal state.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPBackgroundOperationCompletionService {\n private readonly notificationService = inject(AXPBackgroundOperationNotificationService);\n\n /** Whether the operation just reached a finished state (completed or cancelled). */\n shouldAutoFinish(previousStatus: string | undefined, operation: AXPBackgroundOperation): boolean {\n return (\n previousStatus !== operation.status && axpIsCompletedBackgroundOperationStatus(operation.status)\n );\n }\n\n /** Whether the operation just transitioned to failed. */\n shouldNotifyFailure(previousStatus: string | undefined, operation: AXPBackgroundOperation): boolean {\n return previousStatus !== operation.status && operation.status === 'failed';\n }\n\n /** Notifies the user and invokes {@link remove} to drop the operation from the tray. */\n async notifyAndRemove(operation: AXPBackgroundOperation, remove: () => void): Promise<void> {\n await this.notify(operation);\n remove();\n }\n\n /** Notifies the user while keeping the failed operation in the tray for retry. */\n async notifyFailure(operation: AXPBackgroundOperation): Promise<void> {\n await this.notify(operation);\n }\n\n //#region ---- Notification ----\n\n private async notify(operation: AXPBackgroundOperation): Promise<void> {\n try {\n await this.notificationService.notify(operation);\n } catch (error: unknown) {\n console.warn('Failed to send background-operation notification', operation.id, error);\n }\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Status & capabilities ----\n\nexport type AXPBackgroundOperationStatus =\n | 'queued'\n | 'running'\n | 'paused'\n | 'completed'\n | 'failed'\n | 'cancelled';\n\nexport interface AXPBackgroundOperationCapabilities {\n cancellable: boolean;\n pausable: boolean;\n resumable: boolean;\n retryable: boolean;\n /** When true, UI shows a progress bar only while {@link AXPBackgroundOperation.progress} is set. */\n supportsProgress: boolean;\n /** When true, UI may show ETA while {@link AXPBackgroundOperation.estimatedDurationMs} is set. */\n supportsEstimate: boolean;\n /** When true, the tray item is clickable and delegates to a registered handler. */\n clickable: boolean;\n /** When false, skip in-app notification on completed/cancelled. Default: true. */\n notifyOnComplete?: boolean;\n /** When false, skip in-app notification on failed. Default: true. */\n notifyOnFailed?: boolean;\n}\n\nexport type AXPBackgroundOperationFailureMode = 'retry' | 'continue' | 'abort';\n\nexport interface AXPBackgroundOperationFailurePolicy {\n mode: AXPBackgroundOperationFailureMode;\n currentStepId?: string;\n maxRetries?: number;\n retryCount?: number;\n}\n\nexport interface AXPBackgroundOperationError {\n code?: string;\n message: string;\n detail?: string;\n}\n\n//#endregion\n\n//#region ---- Operation model ----\n\nexport interface AXPBackgroundOperation {\n id: string;\n providerKey: string;\n title: string;\n status: AXPBackgroundOperationStatus;\n progress?: number;\n estimatedDurationMs?: number;\n statusText?: string;\n currentStep?: string;\n createdAt: Date;\n startedAt?: Date;\n completedAt?: Date;\n capabilities: AXPBackgroundOperationCapabilities;\n failurePolicy: AXPBackgroundOperationFailurePolicy;\n error?: AXPBackgroundOperationError;\n /** Handler-specific payload (e.g. conversationId for chat navigation). */\n data?: Record<string, unknown>;\n}\n\nexport interface AXPBackgroundOperationCreateRequest {\n title: string;\n progress?: number;\n estimatedDurationMs?: number;\n statusText?: string;\n currentStep?: string;\n capabilities: AXPBackgroundOperationCapabilities;\n failurePolicy: AXPBackgroundOperationFailurePolicy;\n}\n\nexport type AXPBackgroundOperationActionKey = 'cancel' | 'pause' | 'resume' | 'retry' | 'dismiss';\n\n//#endregion\n","//#region ---- Root config ----\n\nexport const AXPBackgroundOperationRootConfig = {\n module: {\n name: 'Common',\n title: '@general:module.common.title',\n icon: 'fa-light fa-layer-group',\n },\n entities: {\n backgroundOperation: {\n name: 'BackgroundOperations',\n title: '@general:background-operation.entity.title',\n titlePlural: '@general:background-operation.entity.plural',\n icon: 'fa-light fa-spinner',\n },\n },\n} as const;\n\n/** Full entity key used with {@link AXPEntityStorageService} (e.g. `Common.BackgroundOperations`). */\nexport function axpBackgroundOperationEntityName(): string {\n return `${AXPBackgroundOperationRootConfig.module.name}.${AXPBackgroundOperationRootConfig.entities.backgroundOperation.name}`;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { InjectionToken } from '@angular/core';\nimport type { AXPBackgroundOperationEntityModel } from './entities/background-operation/background-operation.types';\n\n//#endregion\n\n//#region ---- Storage adapter ----\n\n/**\n * Optional persistence adapter for background-operation entity rows.\n * Mock connectivity registers an implementation backed by {@link AXPEntityStorageService}.\n */\nexport interface AXPBackgroundOperationEntityStorageAdapter {\n getAll(entityName: string): Promise<AXPBackgroundOperationEntityModel[]>;\n upsertOne(entityName: string, row: AXPBackgroundOperationEntityModel): Promise<void>;\n deleteOne(entityName: string, id: string): Promise<void>;\n}\n\nexport const AXP_BACKGROUND_OPERATION_ENTITY_STORAGE = new InjectionToken<AXPBackgroundOperationEntityStorageAdapter>(\n 'AXP_BACKGROUND_OPERATION_ENTITY_STORAGE',\n);\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXPBackgroundOperation } from './background-operation.types';\nimport type { AXPBackgroundOperationEntityModel } from './entities/background-operation/background-operation.types';\nimport { axpCoerceBackgroundOperationDate } from './background-operation.util';\n\n//#endregion\n\n//#region ---- Mappers ----\n\nexport function axpBackgroundOperationToEntityModel(\n operation: AXPBackgroundOperation,\n): AXPBackgroundOperationEntityModel {\n return {\n id: operation.id,\n providerKey: operation.providerKey,\n title: operation.title,\n status: operation.status,\n progress: operation.progress,\n estimatedDurationMs: operation.estimatedDurationMs,\n statusText: operation.statusText,\n currentStep: operation.currentStep,\n createdAt: operation.createdAt.toISOString(),\n startedAt: operation.startedAt?.toISOString(),\n completedAt: operation.completedAt?.toISOString(),\n capabilities: operation.capabilities,\n failurePolicy: operation.failurePolicy,\n error: operation.error,\n data: operation.data,\n };\n}\n\nexport function axpBackgroundOperationFromEntityModel(\n model: AXPBackgroundOperationEntityModel,\n): AXPBackgroundOperation {\n const createdAt = axpCoerceBackgroundOperationDate(model.createdAt) ?? new Date();\n\n return {\n id: model.id,\n providerKey: model.providerKey,\n title: model.title,\n status: model.status,\n progress: model.progress,\n estimatedDurationMs: model.estimatedDurationMs,\n statusText: model.statusText,\n currentStep: model.currentStep,\n createdAt,\n startedAt: axpCoerceBackgroundOperationDate(model.startedAt) ?? undefined,\n completedAt: axpCoerceBackgroundOperationDate(model.completedAt) ?? undefined,\n capabilities: model.capabilities,\n failurePolicy: model.failurePolicy,\n error: model.error,\n data: model.data,\n };\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { signal, type Signal } from '@angular/core';\nimport type { AXPBackgroundOperation } from './background-operation.types';\n\n//#endregion\n\n//#region ---- Store factory ----\n\n/**\n * Lightweight in-memory store for a single background-operation provider.\n */\nexport function createBackgroundOperationStore(): {\n readonly operations: Signal<readonly AXPBackgroundOperation[]>;\n upsert(operation: AXPBackgroundOperation): void;\n patch(id: string, patch: Partial<AXPBackgroundOperation>): void;\n find(id: string): AXPBackgroundOperation | undefined;\n remove(id: string): void;\n} {\n const operationsState = signal<AXPBackgroundOperation[]>([]);\n\n return {\n operations: operationsState.asReadonly(),\n\n upsert(operation: AXPBackgroundOperation): void {\n operationsState.update((list) => {\n const index = list.findIndex((item) => item.id === operation.id);\n if (index < 0) {\n return [operation, ...list];\n }\n const next = [...list];\n next[index] = operation;\n return next;\n });\n },\n\n patch(id: string, patch: Partial<AXPBackgroundOperation>): void {\n operationsState.update((list) =>\n list.map((item) => (item.id === id ? { ...item, ...patch } : item)),\n );\n },\n\n find(id: string): AXPBackgroundOperation | undefined {\n return operationsState().find((item) => item.id === id);\n },\n\n remove(id: string): void {\n operationsState.update((list) => list.filter((item) => item.id !== id));\n },\n };\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { computed, inject, Injectable, type Signal } from '@angular/core';\nimport { axpBackgroundOperationEntityName } from './background-operation.const';\nimport {\n axpBackgroundOperationFromEntityModel,\n axpBackgroundOperationToEntityModel,\n} from './background-operation.entity.mapper';\nimport { AXP_BACKGROUND_OPERATION_ENTITY_STORAGE } from './background-operation.entity.storage';\nimport { AXPBackgroundOperationCompletionService } from './background-operation-completion.service';\nimport type { AXPBackgroundOperation } from './background-operation.types';\nimport { axpIsCompletedBackgroundOperationStatus } from './background-operation.util';\nimport { createBackgroundOperationStore } from './background-operation.store';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface AXPBackgroundOperationProviderStore {\n readonly operations: Signal<readonly AXPBackgroundOperation[]>;\n upsert(operation: AXPBackgroundOperation): void;\n patch(operationId: string, patch: Partial<AXPBackgroundOperation>): void;\n find(operationId: string): AXPBackgroundOperation | undefined;\n remove(id: string): void;\n}\n\n//#endregion\n\n//#region ---- Service ----\n\n/**\n * Entity-backed store for background operations (`Common.BackgroundOperations`).\n * Uses in-memory signals for UI reactivity and optionally persists via {@link AXP_BACKGROUND_OPERATION_ENTITY_STORAGE}.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPBackgroundOperationEntityStoreService {\n private readonly entityStorage = inject(AXP_BACKGROUND_OPERATION_ENTITY_STORAGE, { optional: true });\n\n private readonly completionService = inject(AXPBackgroundOperationCompletionService);\n\n private readonly entityName = axpBackgroundOperationEntityName();\n\n private hydrated = false;\n\n private hydratePromise?: Promise<void>;\n\n private readonly innerStores = new Map<string, ReturnType<typeof createBackgroundOperationStore>>();\n\n //#region ---- Hydration ----\n\n async ensureHydrated(): Promise<void> {\n if (this.hydrated || !this.entityStorage) {\n this.hydrated = true;\n return;\n }\n\n if (!this.hydratePromise) {\n this.hydratePromise = this.hydrateFromEntityStorage();\n }\n\n await this.hydratePromise;\n }\n\n async hasAnyOperationForProviders(providerKeys: readonly string[]): Promise<boolean> {\n await this.ensureHydrated();\n\n if (providerKeys.length === 0) {\n return false;\n }\n\n if (this.entityStorage) {\n const rows = await this.entityStorage.getAll(this.entityName);\n return rows.some((row) => providerKeys.includes(row.providerKey));\n }\n\n return [...this.innerStores.values()].some((store) =>\n store.operations().some((operation) => providerKeys.includes(operation.providerKey)),\n );\n }\n\n //#endregion\n\n //#region ---- Provider stores ----\n\n createProviderStore(providerKey: string): AXPBackgroundOperationProviderStore {\n const inner = this.getOrCreateInnerStore(providerKey);\n\n return {\n operations: computed(() => inner.operations().filter((operation) => operation.providerKey === providerKey)),\n\n upsert: (operation: AXPBackgroundOperation): void => {\n inner.upsert(operation);\n void this.persistOperation(operation);\n },\n\n patch: (operationId: string, patch: Partial<AXPBackgroundOperation>): void => {\n const previous = inner.find(operationId);\n inner.patch(operationId, patch);\n const operation = inner.find(operationId);\n if (!operation) {\n return;\n }\n\n if (this.completionService.shouldAutoFinish(previous?.status, operation)) {\n void this.completionService.notifyAndRemove(operation, () => {\n inner.remove(operationId);\n void this.deleteOperation(operationId);\n });\n return;\n }\n\n if (this.completionService.shouldNotifyFailure(previous?.status, operation)) {\n void this.completionService.notifyFailure(operation);\n }\n\n void this.persistOperation(operation);\n },\n\n find: (operationId: string): AXPBackgroundOperation | undefined => inner.find(operationId),\n\n remove: (operationId: string): void => {\n inner.remove(operationId);\n void this.deleteOperation(operationId);\n },\n };\n }\n\n /** All operations across providers (post-hydration). */\n readonly allOperations = computed(() =>\n [...this.innerStores.values()].flatMap((store) => store.operations()),\n );\n\n //#endregion\n\n //#region ---- Entity persistence ----\n\n private async hydrateFromEntityStorage(): Promise<void> {\n if (!this.entityStorage) {\n this.hydrated = true;\n return;\n }\n\n const rows = await this.entityStorage.getAll(this.entityName);\n\n for (const row of rows) {\n const operation = axpBackgroundOperationFromEntityModel(row);\n\n if (axpIsCompletedBackgroundOperationStatus(operation.status)) {\n void this.deleteOperation(operation.id);\n continue;\n }\n\n this.getOrCreateInnerStore(operation.providerKey).upsert(operation);\n }\n\n this.hydrated = true;\n }\n\n private async persistOperation(operation: AXPBackgroundOperation): Promise<void> {\n if (!this.entityStorage) {\n return;\n }\n\n try {\n await this.entityStorage.upsertOne(this.entityName, axpBackgroundOperationToEntityModel(operation));\n } catch (error: unknown) {\n console.warn('Failed to persist background operation entity', operation.id, error);\n }\n }\n\n private async deleteOperation(operationId: string): Promise<void> {\n if (!this.entityStorage) {\n return;\n }\n\n try {\n await this.entityStorage.deleteOne(this.entityName, operationId);\n } catch (error: unknown) {\n console.warn('Failed to delete background operation entity', operationId, error);\n }\n }\n\n private getOrCreateInnerStore(providerKey: string): ReturnType<typeof createBackgroundOperationStore> {\n let store = this.innerStores.get(providerKey);\n if (!store) {\n store = createBackgroundOperationStore();\n this.innerStores.set(providerKey, store);\n }\n return store;\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type {\n AXPBackgroundOperationCapabilities,\n AXPBackgroundOperationError,\n AXPBackgroundOperationFailurePolicy,\n AXPBackgroundOperationStatus,\n} from '../../background-operation.types';\n\n//#endregion\n\n//#region ---- Entity model ----\n\n/** Persisted row shape for {@link axpBackgroundOperationEntityName}. */\nexport interface AXPBackgroundOperationEntityModel {\n id: string;\n providerKey: string;\n title: string;\n status: AXPBackgroundOperationStatus;\n progress?: number;\n estimatedDurationMs?: number;\n statusText?: string;\n currentStep?: string;\n createdAt: string;\n startedAt?: string;\n completedAt?: string;\n capabilities: AXPBackgroundOperationCapabilities;\n failurePolicy: AXPBackgroundOperationFailurePolicy;\n error?: AXPBackgroundOperationError;\n data?: Record<string, unknown>;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXPEntity } from '@acorex-platform/framework-shared/entity';\nimport { AXPBackgroundOperationRootConfig } from '../../background-operation.const';\n\n//#endregion\n\n//#region ---- Entity factory ----\n\n/**\n * Storage-only entity for background-operation tray rows (`Common.BackgroundOperations`).\n * No master UI — persisted through {@link AXPEntityStorageService}.\n */\nexport async function backgroundOperationEntityFactory(): Promise<AXPEntity | null> {\n const { module, entities } = AXPBackgroundOperationRootConfig;\n\n return {\n module: module.name,\n name: entities.backgroundOperation.name,\n title: entities.backgroundOperation.title,\n icon: entities.backgroundOperation.icon,\n formats: {\n individual: entities.backgroundOperation.title,\n plural: entities.backgroundOperation.titlePlural,\n },\n properties: [\n {\n name: 'id',\n title: 'ID',\n schema: { dataType: 'string' },\n },\n {\n name: 'providerKey',\n title: 'Provider key',\n schema: { dataType: 'string' },\n },\n {\n name: 'title',\n title: '@general:terms.common.title',\n schema: { dataType: 'string' },\n },\n {\n name: 'status',\n title: '@general:terms.common.status',\n schema: { dataType: 'string' },\n },\n {\n name: 'progress',\n title: 'Progress',\n schema: { dataType: 'number' },\n },\n {\n name: 'estimatedDurationMs',\n title: 'Estimated duration (ms)',\n schema: { dataType: 'number' },\n },\n {\n name: 'statusText',\n title: 'Status text',\n schema: { dataType: 'string' },\n },\n {\n name: 'currentStep',\n title: 'Current step',\n schema: { dataType: 'string' },\n },\n {\n name: 'createdAt',\n title: '@general:terms.common.created-at',\n schema: { dataType: 'dateTime' },\n },\n {\n name: 'startedAt',\n title: 'Started at',\n schema: { dataType: 'dateTime' },\n },\n {\n name: 'completedAt',\n title: 'Completed at',\n schema: { dataType: 'dateTime' },\n },\n {\n name: 'capabilities',\n title: 'Capabilities',\n schema: { dataType: 'object' },\n },\n {\n name: 'failurePolicy',\n title: 'Failure policy',\n schema: { dataType: 'object' },\n },\n {\n name: 'error',\n title: 'Error',\n schema: { dataType: 'object' },\n },\n {\n name: 'data',\n title: 'Payload',\n schema: { dataType: 'object' },\n },\n ],\n };\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { InjectionToken } from '@angular/core';\nimport type { AXPExecuteCommand } from '@acorex-platform/framework-shared/core';\nimport type { AXPBackgroundOperation } from './background-operation.types';\n\n//#endregion\n\n//#region ---- Token ----\n\nexport const AXP_BACKGROUND_OPERATION_HANDLERS = new InjectionToken<AXPBackgroundOperationHandler[]>(\n 'AXP_BACKGROUND_OPERATION_HANDLERS',\n);\n\n//#endregion\n\n//#region ---- Handler contract ----\n\n/**\n * Handles user interactions for background operations (e.g. navigate on click).\n * Register one handler per {@link AXPBackgroundOperation.providerKey}.\n */\nexport abstract class AXPBackgroundOperationHandler {\n abstract readonly providerKey: string;\n\n abstract execute(command: AXPExecuteCommand, operation: AXPBackgroundOperation): Promise<void>;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { InjectionToken, Signal } from '@angular/core';\nimport type {\n AXPBackgroundOperation,\n AXPBackgroundOperationCreateRequest,\n} from './background-operation.types';\n\n//#endregion\n\n//#region ---- Token ----\n\nexport const AXP_BACKGROUND_OPERATION_PROVIDERS = new InjectionToken<AXPBackgroundOperationProvider[]>(\n 'AXP_BACKGROUND_OPERATION_PROVIDERS',\n);\n\n//#endregion\n\n//#region ---- Provider contract ----\n\n/**\n * Registers a source of background operations (multi-provider).\n * Each feature module or mock can contribute one provider per domain key.\n */\nexport abstract class AXPBackgroundOperationProvider {\n abstract readonly key: string;\n abstract readonly operations: Signal<readonly AXPBackgroundOperation[]>;\n\n abstract create(request: AXPBackgroundOperationCreateRequest): Promise<AXPBackgroundOperation>;\n abstract cancel(operationId: string): Promise<void>;\n\n /** Optional — only when {@link AXPBackgroundOperationCapabilities.pausable} is true. */\n pause?(operationId: string): Promise<void>;\n /** Optional — only when {@link AXPBackgroundOperationCapabilities.resumable} is true. */\n resume?(operationId: string): Promise<void>;\n /** Optional — only when {@link AXPBackgroundOperationCapabilities.retryable} is true. */\n retry?(operationId: string): Promise<void>;\n /** Optional — removes completed/failed operations from the tray. */\n dismiss?(operationId: string): Promise<void>;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { computed, inject, Injectable, signal } from '@angular/core';\nimport type {\n AXPBackgroundOperation,\n AXPBackgroundOperationActionKey,\n AXPBackgroundOperationCreateRequest,\n} from './background-operation.types';\nimport {\n AXP_BACKGROUND_OPERATION_HANDLERS,\n AXPBackgroundOperationHandler,\n} from './background-operation.handler';\nimport {\n AXP_BACKGROUND_OPERATION_PROVIDERS,\n AXPBackgroundOperationProvider,\n} from './background-operation.provider';\nimport type { AXPExecuteCommand } from '@acorex-platform/framework-shared/core';\nimport {\n axpIsActiveBackgroundOperationStatus,\n} from './background-operation.util';\n\n//#endregion\n\n//#region ---- Service ----\n\n@Injectable({ providedIn: 'root' })\nexport class AXPBackgroundOperationService {\n //#region ---- Dependencies ----\n\n private readonly providers = inject(AXP_BACKGROUND_OPERATION_PROVIDERS, { optional: true }) ?? [];\n\n private readonly handlers = inject(AXP_BACKGROUND_OPERATION_HANDLERS, { optional: true }) ?? [];\n\n //#endregion\n\n //#region ---- State ----\n\n private readonly busy = signal(false);\n\n readonly loading = this.busy.asReadonly();\n\n readonly operations = computed<readonly AXPBackgroundOperation[]>(() =>\n this.providers.flatMap((provider) => provider.operations()),\n );\n\n readonly activeCount = computed(\n () => this.operations().filter((operation) => axpIsActiveBackgroundOperationStatus(operation.status)).length,\n );\n\n readonly failedCount = computed(\n () => this.operations().filter((operation) => operation.status === 'failed').length,\n );\n\n //#endregion\n\n //#region ---- Queries ----\n\n getAvailableActions(operation: AXPBackgroundOperation): AXPBackgroundOperationActionKey[] {\n const actions: AXPBackgroundOperationActionKey[] = [];\n const { capabilities, status } = operation;\n\n if (capabilities.cancellable && (status === 'queued' || status === 'running' || status === 'paused')) {\n actions.push('cancel');\n }\n if (capabilities.pausable && status === 'running') {\n actions.push('pause');\n }\n if (capabilities.resumable && status === 'paused') {\n actions.push('resume');\n }\n if (capabilities.retryable && status === 'failed') {\n actions.push('retry');\n }\n\n return actions;\n }\n\n //#endregion\n\n //#region ---- Commands ----\n\n async create(providerKey: string, request: AXPBackgroundOperationCreateRequest): Promise<AXPBackgroundOperation> {\n const provider = this.resolveProvider(providerKey);\n return this.run(() => provider.create(request));\n }\n\n async cancel(operationId: string): Promise<void> {\n const { provider, operation } = this.resolveOperation(operationId);\n if (!operation.capabilities.cancellable) {\n throw new Error(`Operation ${operationId} cannot be cancelled`);\n }\n await this.run(() => provider.cancel(operationId));\n }\n\n async pause(operationId: string): Promise<void> {\n const { provider, operation } = this.resolveOperation(operationId);\n if (!operation.capabilities.pausable || !provider.pause) {\n throw new Error(`Operation ${operationId} cannot be paused`);\n }\n await this.run(() => provider.pause!(operationId));\n }\n\n async resume(operationId: string): Promise<void> {\n const { provider, operation } = this.resolveOperation(operationId);\n if (!operation.capabilities.resumable || !provider.resume) {\n throw new Error(`Operation ${operationId} cannot be resumed`);\n }\n await this.run(() => provider.resume!(operationId));\n }\n\n async retry(operationId: string): Promise<void> {\n const { provider, operation } = this.resolveOperation(operationId);\n if (!operation.capabilities.retryable || !provider.retry) {\n throw new Error(`Operation ${operationId} cannot be retried`);\n }\n await this.run(() => provider.retry!(operationId));\n }\n\n async dismiss(operationId: string): Promise<void> {\n const { provider } = this.resolveOperation(operationId);\n if (provider.dismiss) {\n await this.run(() => provider.dismiss!(operationId));\n return;\n }\n await this.run(() => provider.cancel(operationId));\n }\n\n hasClickHandler(operation: AXPBackgroundOperation): boolean {\n return (\n operation.capabilities.clickable &&\n this.handlers.some((handler) => handler.providerKey === operation.providerKey)\n );\n }\n\n async executeCommand(operationId: string, command: AXPExecuteCommand): Promise<void> {\n const { operation } = this.resolveOperation(operationId);\n const handler = this.resolveHandler(operation.providerKey);\n if (!handler) {\n return;\n }\n await this.run(() => handler.execute(command, operation));\n }\n\n async executeClick(operationId: string): Promise<void> {\n await this.executeCommand(operationId, { name: 'click' });\n }\n\n async runAction(operationId: string, action: AXPBackgroundOperationActionKey): Promise<void> {\n switch (action) {\n case 'cancel':\n await this.cancel(operationId);\n break;\n case 'pause':\n await this.pause(operationId);\n break;\n case 'resume':\n await this.resume(operationId);\n break;\n case 'retry':\n await this.retry(operationId);\n break;\n case 'dismiss':\n await this.dismiss(operationId);\n break;\n default:\n break;\n }\n }\n\n //#endregion\n\n //#region ---- Resolution ----\n\n private resolveHandler(providerKey: string): AXPBackgroundOperationHandler | undefined {\n return this.handlers.find((handler) => handler.providerKey === providerKey);\n }\n\n private resolveProvider(providerKey: string): AXPBackgroundOperationProvider {\n const provider = this.providers.find((item) => item.key === providerKey);\n if (!provider) {\n throw new Error(`Background operation provider \"${providerKey}\" is not registered`);\n }\n return provider;\n }\n\n private resolveOperation(operationId: string): {\n provider: AXPBackgroundOperationProvider;\n operation: AXPBackgroundOperation;\n } {\n for (const provider of this.providers) {\n const operation = provider.operations().find((item) => item.id === operationId);\n if (operation) {\n return { provider, operation };\n }\n }\n throw new Error(`Background operation \"${operationId}\" was not found`);\n }\n\n private async run<T>(fn: () => Promise<T>): Promise<T> {\n this.busy.set(true);\n try {\n return await fn();\n } finally {\n this.busy.set(false);\n }\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXProgressBarModule } from '@acorex/components/progress-bar';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n output,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { isNumber } from 'lodash-es';\nimport { AXPBackgroundOperationService } from '../background-operation.service';\nimport { axpIsActiveBackgroundOperationStatus } from '../background-operation.util';\nimport type {\n AXPBackgroundOperation,\n AXPBackgroundOperationActionKey,\n} from '../background-operation.types';\nimport { AXStyleLookType } from '@acorex/cdk/common';\n\n//#endregion\n\n//#region ---- Component ----\n\n@Component({\n selector: 'axp-background-operation-item',\n templateUrl: './background-operation-item.component.html',\n styleUrls: ['./background-operation-item.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [CommonModule, AXButtonModule, AXDecoratorModule, AXProgressBarModule, AXTranslationModule],\n})\nexport class AXPBackgroundOperationItemComponent {\n //#region ---- Services & Dependencies ----\n\n private readonly operationService = inject(AXPBackgroundOperationService);\n\n //#endregion\n\n //#region ---- Inputs & Outputs ----\n\n data = input.required<AXPBackgroundOperation>();\n\n actionCompleted = output<void>();\n\n itemClicked = output<void>();\n\n //#endregion\n\n //#region ---- State ----\n\n protected readonly pendingAction = signal<AXPBackgroundOperationActionKey | null>(null);\n\n //#endregion\n\n //#region ---- Computed ----\n\n protected readonly statusClass = computed(() => `--${this.data().status}`);\n\n protected readonly statusIcon = computed(() => {\n switch (this.data().status) {\n case 'queued':\n return 'fa-light fa-clock';\n case 'running':\n return 'fa-light fa-spinner fa-spin';\n case 'paused':\n return 'fa-light fa-pause';\n case 'completed':\n return 'fa-light fa-circle-check';\n case 'failed':\n return 'fa-light fa-circle-exclamation';\n case 'cancelled':\n return 'fa-light fa-ban';\n default:\n return 'fa-light fa-list-check';\n }\n });\n\n protected readonly progressColor = computed(() => {\n switch (this.data().status) {\n case 'failed':\n return 'danger';\n case 'paused':\n return 'warning';\n case 'completed':\n return 'success';\n default:\n return 'primary';\n }\n });\n\n protected readonly showProgressBar = computed(() => {\n const operation = this.data();\n return axpIsActiveBackgroundOperationStatus(operation.status);\n });\n\n protected readonly isIndeterminateProgress = computed(() => {\n const operation = this.data();\n return !isNumber(operation.progress) && !operation.currentStep;\n });\n\n protected readonly progressMode = computed(() =>\n this.isIndeterminateProgress() ? 'indeterminate' : 'determinate',\n );\n\n protected readonly progressValue = computed(() => {\n const progress = this.data().progress;\n if (isNumber(progress)) {\n return Math.min(Math.max(progress, 0), 100);\n }\n return 0;\n });\n\n protected readonly isClickable = computed(() => this.operationService.hasClickHandler(this.data()));\n\n protected readonly showError = computed(() => this.data().status === 'failed' && !!this.data().error?.message);\n\n protected readonly actions = computed(() => this.operationService.getAvailableActions(this.data()));\n\n protected readonly showMetaRow = computed(() => {\n const operation = this.data();\n return (\n !!operation.statusText ||\n !!operation.currentStep ||\n this.actions().length > 0\n );\n });\n\n //#endregion\n\n //#region ---- Action presentation ----\n\n protected actionLabelKey(action: AXPBackgroundOperationActionKey): string {\n return `@general:background-operation.actions.${action}`;\n }\n\n protected actionButtonLook(action: AXPBackgroundOperationActionKey): AXStyleLookType {\n if (action === 'dismiss') {\n return 'blank';\n }\n return 'twotone';\n }\n\n protected actionButtonColor(action: AXPBackgroundOperationActionKey): string {\n switch (action) {\n case 'cancel':\n return 'danger';\n case 'resume':\n case 'retry':\n return 'primary';\n default:\n return 'default';\n }\n }\n\n //#endregion\n\n //#region ---- Event Handlers ----\n\n protected async onItemClick(): Promise<void> {\n if (!this.isClickable()) {\n return;\n }\n try {\n await this.operationService.executeClick(this.data().id);\n this.itemClicked.emit();\n } catch (error) {\n console.error('Background operation click failed:', error);\n }\n }\n\n protected async onAction(action: AXPBackgroundOperationActionKey): Promise<void> {\n if (this.pendingAction()) {\n return;\n }\n this.pendingAction.set(action);\n try {\n await this.operationService.runAction(this.data().id, action);\n this.actionCompleted.emit();\n } catch (error) {\n console.error('Background operation action failed:', error);\n } finally {\n this.pendingAction.set(null);\n }\n }\n\n protected isActionDisabled(action: AXPBackgroundOperationActionKey): boolean {\n const pending = this.pendingAction();\n return pending !== null && pending !== action;\n }\n\n protected isActionLoading(action: AXPBackgroundOperationActionKey): boolean {\n return this.pendingAction() === action;\n }\n\n //#endregion\n}\n\n//#endregion\n","<article\n class=\"operation-item\"\n [class]=\"statusClass()\"\n [class.--clickable]=\"isClickable()\"\n (click)=\"onItemClick()\"\n>\n <div class=\"operation-item__body\">\n <div class=\"operation-item__header\">\n <ax-icon class=\"operation-item__status-icon\" [class]=\"statusClass()\">\n <i [class]=\"statusIcon()\"></i>\n </ax-icon>\n\n <div class=\"operation-item__summary\">\n <h3 class=\"operation-item__title\">{{ data().title }}</h3>\n\n @if (showMetaRow()) {\n <div class=\"operation-item__meta\">\n <div class=\"operation-item__meta-content\">\n @if (data().statusText) {\n <p class=\"operation-item__status-text\">\n {{ data().statusText }}\n </p>\n }\n\n @if (data().currentStep) {\n <span class=\"operation-item__step\">\n {{\n '@general:background-operation.step' | translate | async\n }}\n {{ data().currentStep }}\n </span>\n }\n </div>\n\n @if (actions().length > 0) {\n <footer\n class=\"operation-item__actions\"\n (click)=\"$event.stopPropagation()\"\n >\n @for (action of actions(); track action) {\n <ax-button\n class=\"ax-sm\"\n [look]=\"actionButtonLook(action)\"\n [color]=\"actionButtonColor(action)\"\n [text]=\"(actionLabelKey(action) | translate | async) ?? ''\"\n [disabled]=\"\n isActionDisabled(action) || isActionLoading(action)\n \"\n (onClick)=\"onAction(action)\"\n ></ax-button>\n }\n </footer>\n }\n </div>\n }\n\n @if (showProgressBar()) {\n <ax-progress-bar\n [progress]=\"progressValue()\"\n [mode]=\"progressMode()\"\n [color]=\"progressColor()\"\n [style.height.px]=\"4\"\n ></ax-progress-bar>\n }\n\n @if (showError()) {\n <p class=\"operation-item__error\" role=\"alert\">\n {{ data().error!.message }}\n </p>\n }\n </div>\n </div>\n </div>\n</article>\n","//#region ---- Imports ----\n\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n output,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AXPBackgroundOperationService } from '../background-operation.service';\nimport type { AXPBackgroundOperationStatus } from '../background-operation.types';\nimport { axpIsActiveBackgroundOperationStatus } from '../background-operation.util';\nimport { AXPBackgroundOperationItemComponent } from './background-operation-item.component';\n\n//#endregion\n\n//#region ---- Sort priority ----\n\nconst STATUS_SORT_PRIORITY: Record<AXPBackgroundOperationStatus, number> = {\n running: 0,\n queued: 1,\n paused: 2,\n failed: 3,\n completed: 4,\n cancelled: 5,\n};\n\n//#endregion\n\n//#region ---- Component ----\n\n@Component({\n selector: 'axp-background-operation-panel',\n templateUrl: './background-operation-panel.component.html',\n styleUrls: ['./background-operation-panel.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [CommonModule, AXTranslationModule, AXPBackgroundOperationItemComponent],\n})\nexport class AXPBackgroundOperationPanelComponent {\n //#region ---- Outputs ----\n\n onActiveCountChange = output<number>();\n\n onClosePopover = output<void>();\n\n //#endregion\n\n //#region ---- Services & Dependencies ----\n\n protected readonly operationService = inject(AXPBackgroundOperationService);\n\n //#endregion\n\n //#region ---- Computed ----\n\n protected readonly visibleOperations = computed(() =>\n [...this.operationService.operations()]\n .filter(\n (operation) =>\n axpIsActiveBackgroundOperationStatus(operation.status) || operation.status === 'failed',\n )\n .sort((left, right) => {\n const priorityDiff = STATUS_SORT_PRIORITY[left.status] - STATUS_SORT_PRIORITY[right.status];\n if (priorityDiff !== 0) {\n return priorityDiff;\n }\n return right.createdAt.getTime() - left.createdAt.getTime();\n }),\n );\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"operation-panel\">\n <header class=\"operation-panel__header\">\n <h2 class=\"operation-panel__title\">{{ '@general:background-operation.panel.title' | translate | async }}</h2>\n </header>\n\n <div class=\"operation-panel__list\">\n @if (visibleOperations().length === 0) {\n <div class=\"operation-panel__empty\">\n <i class=\"fa-regular fa-list-check\"></i>\n <span class=\"text-sm\">{{ '@general:background-operation.empty.all' | translate | async }}</span>\n </div>\n } @else {\n @for (operation of visibleOperations(); track operation.id) {\n <axp-background-operation-item\n [data]=\"operation\"\n (actionCompleted)=\"onActiveCountChange.emit(operationService.activeCount())\"\n (itemClicked)=\"onClosePopover.emit()\"\n ></axp-background-operation-item>\n }\n }\n </div>\n</div>\n","//#region ---- Imports ----\n\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXPopoverComponent, AXPopoverModule } from '@acorex/components/popover';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AXPBackgroundOperationService } from '../background-operation.service';\nimport { AXPBackgroundOperationPanelComponent } from './background-operation-panel.component';\n\n//#endregion\n\n//#region ---- Component ----\n\n@Component({\n selector: 'axp-background-operation-slot',\n templateUrl: './background-operation-slot.component.html',\n styleUrls: ['./background-operation-slot.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [CommonModule, AXDecoratorModule, AXTranslationModule, AXPopoverModule, AXPBackgroundOperationPanelComponent],\n})\nexport class AXPBackgroundOperationSlotComponent {\n //#region ---- Services & Dependencies ----\n\n private readonly operationService = inject(AXPBackgroundOperationService);\n\n //#endregion\n\n //#region ---- View Queries ----\n\n private readonly popover = viewChild(AXPopoverComponent);\n\n //#endregion\n\n //#region ---- Computed ----\n\n protected readonly activeCount = this.operationService.activeCount;\n\n protected readonly failedCount = this.operationService.failedCount;\n\n protected readonly showSlot = computed(\n () => this.activeCount() > 0 || this.failedCount() > 0,\n );\n\n protected readonly slotShowsFailureOnly = computed(\n () => this.activeCount() === 0 && this.failedCount() > 0,\n );\n\n protected readonly slotLabelKey = computed(() => {\n if (this.slotShowsFailureOnly()) {\n return this.failedCount() === 1\n ? '@general:background-operation.slot.failed-single'\n : '@general:background-operation.slot.failed-multiple';\n }\n\n return this.activeCount() === 1\n ? '@general:background-operation.slot.single'\n : '@general:background-operation.slot.multiple';\n });\n\n protected readonly slotLabelParams = computed(() => ({\n count: this.slotShowsFailureOnly() ? this.failedCount() : this.activeCount(),\n }));\n\n //#endregion\n\n //#region ---- Event Handlers ----\n\n protected closePopover(): void {\n this.popover()?.close();\n }\n\n //#endregion\n}\n\n//#endregion\n","@if (showSlot()) {\n <button type=\"button\" class=\"operation-slot__trigger\" #operationTrigger>\n <ax-icon class=\"operation-slot__icon\">\n @if (slotShowsFailureOnly()) {\n <i class=\"fa-light fa-circle-exclamation\"></i>\n } @else {\n <i class=\"fa-light fa-spinner fa-spin\"></i>\n }\n </ax-icon>\n <span class=\"operation-slot__text\">\n {{ slotLabelKey() | translate: { params: slotLabelParams() } | async }}\n </span>\n </button>\n\n <ax-popover [target]=\"operationTrigger\" [openOn]=\"'toggle'\" [closeOn]=\"'clickOut'\" [adaptivityEnabled]=\"true\">\n <div class=\"bg-lightest rounded-md w-full\">\n <axp-background-operation-panel (onClosePopover)=\"closePopover()\"></axp-background-operation-panel>\n </div>\n </ax-popover>\n}\n","import { InjectionToken } from '@angular/core';\nimport { merge } from 'lodash-es';\n\nexport const ENVIRONMENT = new InjectionToken<any>('ENVIRONMENT');\n\nexport const AXP_PLATFORM_CONFIG_TOKEN = new InjectionToken<AXPPlatformConfigs>('AXP_PLATFORM_CONFIG_TOKEN', {\n providedIn: 'root',\n factory: () => {\n return AXPPlatformDefaultConfigs;\n },\n});\n\nexport interface AXPPlatformConfigs {\n title?: string;\n copyright?: string;\n network?: {\n timeOut?: number;\n };\n}\n\nexport const AXPPlatformDefaultConfigs: AXPPlatformConfigs = {\n copyright: 'ACoreX @ 2026',\n title: 'ACoreX Platform',\n\n network: {\n timeOut: 5000,\n },\n};\n\nexport function configPlatform(config: Partial<AXPPlatformConfigs> = AXPPlatformDefaultConfigs): AXPPlatformConfigs {\n return merge(AXPPlatformDefaultConfigs, config);\n}\n","//#region ----- Platform branding setting keys (organization-management, tenant + platform inherit) -----\n\n/** Tenant-scope keys that inherit platform (P) values — resolved via {@link AXPSettingsService.get}. */\nexport const AXP_PLATFORM_BRANDING_SETTING_KEYS = {\n copyrightText: 'OrganizationManagement:Setting:Organization.CopyrightText',\n} as const;\n\n//#endregion\n","import { AXTranslationService } from '@acorex/core/translation';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport {\n AXPPlatformScope,\n coerceUnknownToMultiLanguageString,\n resolveMultiLanguageString,\n} from '@acorex-platform/framework-shared/core';\nimport { Injectable, inject } from '@angular/core';\nimport { AXPPlatformDefaultConfigs, AXP_PLATFORM_CONFIG_TOKEN } from '../configs/app.config';\nimport { AXPSettingsService } from '../settings/settings.service';\nimport { AXP_PLATFORM_BRANDING_SETTING_KEYS } from './platform-branding.constants';\n\n//#region ----- Platform branding (tenant settings → platform inherit → deploy fallback) -----\n\n/**\n * Resolves platform title and copyright from tenant settings (inherited from platform),\n * then falls back to {@link AXP_PLATFORM_CONFIG_TOKEN} when unset or unavailable.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPPlatformBrandingService {\n //#region ----- Services & Dependencies -----\n\n private readonly settingsService = inject(AXPSettingsService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly translateService = inject(AXTranslationService);\n private readonly platformConfig = inject(AXP_PLATFORM_CONFIG_TOKEN);\n\n //#endregion\n\n //#region ----- Public API -----\n\n /**\n * Footer / shell copyright: tenant scope (same path as Company Information settings) →\n * effective inherit → `platformConfig.copyright`.\n */\n async resolveCopyright(): Promise<string> {\n const key = AXP_PLATFORM_BRANDING_SETTING_KEYS.copyrightText;\n\n // Read tenant partition explicitly — matches the settings page (`scope(Tenant).all()`).\n try {\n const tenantTrimmed = await this.readTenantCopyright(key);\n if (tenantTrimmed) {\n return (await this.localize(tenantTrimmed)) ?? tenantTrimmed;\n }\n } catch {\n // Tenant scope unavailable (pre-auth); fall through to effective / deploy.\n }\n\n const fromSettings = await this.readInheritedString(key);\n if (fromSettings) {\n return fromSettings;\n }\n\n return this.resolveDeployCopyright();\n }\n\n /**\n * Browser tab / shell title when an application session exists:\n * session application title → deploy title.\n */\n async resolveApplicationTitle(): Promise<string> {\n const application = this.sessionService.application;\n const locale = this.translateService.getActiveLang();\n const sessionTitle =\n resolveMultiLanguageString(application?.title, locale).trim() ||\n application?.name?.trim() ||\n '';\n if (sessionTitle) {\n return (await this.localize(sessionTitle)) ?? sessionTitle;\n }\n\n return this.resolvePlatformTitle();\n }\n\n /** Auth and pre-application UI: deploy title from platform config. */\n async resolvePlatformTitle(): Promise<string> {\n return this.resolveDeployTitle();\n }\n\n //#endregion\n\n //#region ----- Private Helpers -----\n\n /**\n * Loads tenant-scoped copyright. If the in-memory tenant cache was marked ready while empty\n * (concurrent session reload race), force one remote reload before giving up.\n */\n private async readTenantCopyright(key: string): Promise<string> {\n await this.settingsService.ensureScopeLoaded(AXPPlatformScope.Tenant);\n const first = await this.settingsService.scope(AXPPlatformScope.Tenant).get(key);\n const firstTrimmed = this.asDisplayString(first);\n if (firstTrimmed) {\n return firstTrimmed;\n }\n\n await this.settingsService.reload(AXPPlatformScope.Tenant, 'full-reload');\n const second = await this.settingsService.scope(AXPPlatformScope.Tenant).get(key);\n return this.asDisplayString(second);\n }\n\n private async readInheritedString(key: string): Promise<string | null> {\n try {\n const value = await this.settingsService.get(key);\n const trimmed = this.asDisplayString(value);\n if (!trimmed) {\n return null;\n }\n return (await this.localize(trimmed)) ?? trimmed;\n } catch {\n return null;\n }\n }\n\n private asDisplayString(value: unknown): string {\n return resolveMultiLanguageString(\n coerceUnknownToMultiLanguageString(value),\n this.translateService.getActiveLang(),\n ).trim();\n }\n\n private resolveDeployCopyright(): string {\n return this.platformConfig.copyright?.trim() || AXPPlatformDefaultConfigs.copyright || '';\n }\n\n private async resolveDeployTitle(): Promise<string> {\n const fallback = this.platformConfig.title?.trim() || AXPPlatformDefaultConfigs.title || '';\n if (!fallback) {\n return '';\n }\n return (await this.localize(fallback)) ?? fallback;\n }\n\n private async localize(value: string): Promise<string | null> {\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n if (trimmed.startsWith('@')) {\n return (await this.translateService.translateAsync(trimmed)) || trimmed;\n }\n\n return trimmed;\n }\n\n //#endregion\n}\n\n//#endregion\n","import { NavigationExtras, Router } from '@angular/router';\n\n//#region ---- Types ----\n\nexport interface AXPAppPathParts {\n segments: string[];\n queryParams?: Record<string, string>;\n fragment?: string;\n}\n\n//#endregion\n\n//#region ---- App Path Navigation ----\n\n/**\n * Splits an absolute app path (`/app/m/module/e/Entity/id/view`) into router command segments.\n * Prefer this over `navigate([fullPath])` or ambiguous single-segment navigation so browser history stays correct.\n */\nexport function axpParseAppPath(path: string): AXPAppPathParts {\n const trimmed = path.trim();\n const withoutLeadingSlash = trimmed.startsWith('/') ? trimmed.slice(1) : trimmed;\n const [pathAndFragment, queryString] = withoutLeadingSlash.split('?');\n const [pathPart, fragment] = pathAndFragment.split('#');\n const segments = pathPart.split('/').filter(Boolean);\n\n const queryParams = queryString\n ? queryString.split('&').reduce<Record<string, string>>((params, pair) => {\n const [key, value = ''] = pair.split('=');\n if (key) {\n params[decodeURIComponent(key)] = decodeURIComponent(value);\n }\n return params;\n }, {})\n : undefined;\n\n return {\n segments,\n queryParams,\n fragment: fragment || undefined,\n };\n}\n\n/** Navigates using explicit path segments (same pattern as entity preload filters). */\nexport function axpNavigateAppPath(router: Router, path: string, extras?: NavigationExtras): Promise<boolean> {\n const { segments, queryParams, fragment } = axpParseAppPath(path);\n return router.navigate(segments, {\n ...extras,\n queryParams,\n fragment,\n });\n}\n\n/** True when a URL path is an entity master list route (`.../e/{Entity}/list`). */\nexport function axpIsEntityListPath(url: string): boolean {\n const path = url.split('?')[0].split('#')[0];\n return /\\/e\\/[^/]+\\/list$/.test(path);\n}\n\n/** True when the current browser URL is an entity master list route (`.../e/{Entity}/list`). */\nexport function axpIsEntityListRoute(router: Router): boolean {\n return axpIsEntityListPath(router.url);\n}\n\n/** True when a URL path is an entity details view route (`.../e/{Entity}/{id}/view`). */\nexport function axpIsEntityDetailsPath(url: string): boolean {\n const path = url.split('?')[0].split('#')[0];\n return /\\/e\\/[^/]+\\/[^/]+\\/view$/.test(path);\n}\n\n/** True when the current browser URL is an entity details view route (`.../e/{Entity}/{id}/view`). */\nexport function axpIsEntityDetailsViewRoute(router: Router): boolean {\n return axpIsEntityDetailsPath(router.url);\n}\n\n/**\n * Merges query params on the current entity list route without pushing history.\n * Uses absolute path segments so a stale `relativeTo` cannot rewrite the active URL after navigating away.\n */\nexport function axpReplaceEntityListRouteQueryParams(\n router: Router,\n queryParams: Record<string, string | null | undefined>,\n): void {\n const url = router.url;\n if (!axpIsEntityListPath(url)) {\n return;\n }\n\n const parsed = router.parseUrl(url);\n const pathOnly = url.split('?')[0].split('#')[0];\n const { segments } = axpParseAppPath(pathOnly);\n const mergedQueryParams = { ...parsed.queryParams, ...queryParams };\n\n void router.navigate(segments, {\n queryParams: mergedQueryParams,\n replaceUrl: true,\n });\n}\n\n//#endregion\n","import { axpIsEntityDetailsPath, axpIsEntityListPath } from '../../utils/app-path-navigation.util';\nimport { AXPMenuItem } from './menu.types';\n\nexport interface AXPMenuRouteMatchResult {\n item: AXPMenuItem;\n /** Parent menu items from root down to the direct parent of the matched item. */\n ancestors: AXPMenuItem[];\n isPartialMatch: boolean;\n}\n\nconst DEFAULT_TRAILING_SEGMENTS = ['list', 'view', 'edit', 'create'];\n\n/**\n * Query params that represent page UI state (not navigation identity).\n * Ignored when deciding whether a menu item matches the current route, so items stay\n * highlighted while the page mutates view/layout (e.g. task board, entity list view).\n */\nconst MENU_UI_QUERY_KEYS = new Set(['view', 'layout']);\n\ninterface EntityRouteKey {\n app: string;\n module: string;\n entity: string;\n /** Segment index after the entity name (first segment that is not part of the entity key). */\n entityEndIndex: number;\n}\n\n//#region ---- Entity Route Helpers ----\n\n/**\n * Parses `/{app}/m/{module}/e/{entity}/...` routes into a stable entity key.\n */\nfunction axpParseEntityRouteKey(segments: string[]): EntityRouteKey | null {\n const mIndex = segments.indexOf('m');\n const eIndex = segments.indexOf('e');\n\n if (mIndex < 1 || eIndex <= mIndex + 1 || eIndex + 1 >= segments.length) {\n return null;\n }\n\n return {\n app: segments[mIndex - 1],\n module: segments[mIndex + 1],\n entity: segments[eIndex + 1],\n entityEndIndex: eIndex + 2,\n };\n}\n\nfunction axpEntityRouteKeysEqual(left: EntityRouteKey, right: EntityRouteKey): boolean {\n return left.app === right.app && left.module === right.module && left.entity === right.entity;\n}\n\nfunction axpParseQueryString(queryString: string): URLSearchParams {\n return new URLSearchParams(queryString);\n}\n\nfunction axpMenuDeclaredNavigationParams(queryString: string): URLSearchParams {\n const params = axpParseQueryString(queryString);\n const navigationParams = new URLSearchParams();\n\n params.forEach((value, key) => {\n if (!MENU_UI_QUERY_KEYS.has(key)) {\n navigationParams.append(key, value);\n }\n });\n\n return navigationParams;\n}\n\nfunction axpMenuHasDeclaredNavigationParams(itemQueryString: string): boolean {\n return axpMenuDeclaredNavigationParams(itemQueryString).toString().length > 0;\n}\n\n/**\n * True when every navigation query param declared on the menu path equals the current URL.\n */\nfunction axpMenuDeclaredQueryParamsMatch(itemQueryString: string, currentQueryString: string): boolean {\n const itemParams = axpMenuDeclaredNavigationParams(itemQueryString);\n const declaredPairs: Array<[string, string]> = [];\n itemParams.forEach((value, key) => {\n declaredPairs.push([key, value]);\n });\n\n if (declaredPairs.length === 0) {\n return axpGenericEntityListMenuQueryParamsMatch(currentQueryString);\n }\n\n const currentParams = axpParseQueryString(currentQueryString);\n return declaredPairs.every(([key, value]) => currentParams.get(key) === value);\n}\n\n/**\n * Generic entity list menu items (no declared query params) match only when the URL has no\n * navigation query params beyond UI-managed keys such as `view`.\n */\nfunction axpGenericEntityListMenuQueryParamsMatch(currentQueryString: string): boolean {\n const currentParams = axpParseQueryString(currentQueryString);\n let hasNavigationParam = false;\n\n currentParams.forEach((_value, key) => {\n if (!MENU_UI_QUERY_KEYS.has(key)) {\n hasNavigationParam = true;\n }\n });\n\n return !hasNavigationParam;\n}\n\n/**\n * Counts declared menu query params that match the current URL (for best-match selection).\n */\nfunction axpMenuQueryParamSpecificity(itemPath: string, currentPath: string): number {\n const itemQueryString = itemPath.split('#')[0].split('?')[1] ?? '';\n const currentQueryString = currentPath.split('#')[0].split('?')[1] ?? '';\n const itemParams = axpMenuDeclaredNavigationParams(itemQueryString);\n const currentParams = axpParseQueryString(currentQueryString);\n let specificity = 0;\n\n itemParams.forEach((value, key) => {\n if (currentParams.get(key) === value) {\n specificity++;\n }\n });\n\n return specificity;\n}\n\n/**\n * Matches entity list menu entries against list/detail/create/edit routes for the same entity.\n */\nfunction axpTryMatchEntityMenuRoute(\n itemSegments: string[],\n pathSegments: string[],\n currentBase: string,\n itemQueryString: string,\n currentQueryString: string,\n): { isMatch: boolean; isPartial: boolean } | null {\n const menuEntity = axpParseEntityRouteKey(itemSegments);\n const currentEntity = axpParseEntityRouteKey(pathSegments);\n\n if (!menuEntity || !currentEntity || !axpEntityRouteKeysEqual(menuEntity, currentEntity)) {\n return null;\n }\n\n const itemHasDeclaredParams = axpMenuHasDeclaredNavigationParams(itemQueryString);\n\n if (itemHasDeclaredParams) {\n if (!axpIsEntityListPath(currentBase)) {\n return { isMatch: false, isPartial: false };\n }\n\n if (!axpMenuDeclaredQueryParamsMatch(itemQueryString, currentQueryString)) {\n return { isMatch: false, isPartial: false };\n }\n\n return { isMatch: true, isPartial: false };\n }\n\n if (axpIsEntityListPath(currentBase) && !axpGenericEntityListMenuQueryParamsMatch(currentQueryString)) {\n return { isMatch: false, isPartial: false };\n }\n\n const isPartial =\n pathSegments.length > menuEntity.entityEndIndex ||\n axpIsEntityDetailsPath(currentBase) ||\n !axpIsEntityListPath(currentBase);\n\n return { isMatch: true, isPartial };\n}\n\n//#endregion\n\n/**\n * Compares a menu item path with the current browser path.\n * Mirrors the matching rules used when selecting the active menu item.\n */\nexport function axpMenuPathsMatch(\n itemPath: string,\n currentPath: string,\n trailingSegmentsToIgnore: string[] = DEFAULT_TRAILING_SEGMENTS,\n): { isMatch: boolean; isPartial: boolean } {\n const itemNoHash = itemPath.split('#')[0];\n const currentNoHash = currentPath.split('#')[0];\n\n const [itemBase, itemQueryString = ''] = itemNoHash.split('?');\n const [currentBase, currentQueryString = ''] = currentNoHash.split('?');\n\n const itemSegments = itemBase.split('/').filter((segment) => segment.length > 0);\n const pathSegments = currentBase.split('/').filter((segment) => segment.length > 0);\n\n const entityMatch = axpTryMatchEntityMenuRoute(\n itemSegments,\n pathSegments,\n `/${currentBase}`,\n itemQueryString,\n currentQueryString,\n );\n if (entityMatch) {\n return entityMatch;\n }\n\n const menuLength = itemSegments.length;\n const pathLength = pathSegments.length;\n\n let effectiveMenuLength = menuLength;\n if (menuLength > 0 && trailingSegmentsToIgnore.includes(itemSegments[menuLength - 1])) {\n effectiveMenuLength--;\n }\n\n if (pathLength < effectiveMenuLength) {\n return { isMatch: false, isPartial: false };\n }\n\n let isPrefix = true;\n for (let i = 0; i < effectiveMenuLength; i++) {\n if (itemSegments[i] !== pathSegments[i]) {\n isPrefix = false;\n break;\n }\n }\n\n if (!isPrefix) {\n return { isMatch: false, isPartial: false };\n }\n\n const isPartialMatch = effectiveMenuLength < pathLength;\n const isExactMatch = effectiveMenuLength === pathLength;\n\n // Only non-UI query params on the menu path must match the current URL.\n // UI-only params (`view`, `layout`) are ignored so pages can mutate them freely.\n // Extra current-URL params (filters, etc.) do not break the match.\n const itemNavigationParams = axpMenuDeclaredNavigationParams(itemQueryString);\n const declaredPairs: Array<[string, string]> = [];\n itemNavigationParams.forEach((value, key) => {\n declaredPairs.push([key, value]);\n });\n\n let queryMatches = true;\n if (declaredPairs.length > 0) {\n const currentParams = axpParseQueryString(currentQueryString);\n queryMatches = declaredPairs.every(([key, value]) => currentParams.get(key) === value);\n }\n\n return {\n isMatch: (isExactMatch || isPartialMatch) && queryMatches,\n isPartial: isPartialMatch && !isExactMatch,\n };\n}\n\n/**\n * Finds the most specific menu item that matches the given route path.\n */\nexport function axpFindMenuItemByRoute(\n items: AXPMenuItem[],\n currentPath: string,\n trailingSegmentsToIgnore: string[] = DEFAULT_TRAILING_SEGMENTS,\n): AXPMenuRouteMatchResult | null {\n let bestMatch: AXPMenuRouteMatchResult | null = null;\n let bestEffectiveLength = -1;\n let bestQuerySpecificity = -1;\n\n const visit = (menuItems: AXPMenuItem[], ancestors: AXPMenuItem[]): void => {\n for (const item of menuItems) {\n if (item.children?.length) {\n visit(item.children, [...ancestors, item]);\n }\n\n if (!item.path) {\n continue;\n }\n\n const matchResult = axpMenuPathsMatch(item.path, currentPath, trailingSegmentsToIgnore);\n if (!matchResult.isMatch) {\n continue;\n }\n\n const itemNoHash = item.path.split('#')[0];\n const [itemBase] = itemNoHash.split('?');\n const itemSegments = itemBase.split('/').filter((segment) => segment.length > 0);\n\n let effectiveMenuLength = itemSegments.length;\n if (\n itemSegments.length > 0 &&\n trailingSegmentsToIgnore.includes(itemSegments[itemSegments.length - 1])\n ) {\n effectiveMenuLength--;\n }\n\n const menuEntity = axpParseEntityRouteKey(itemSegments);\n if (menuEntity) {\n effectiveMenuLength = menuEntity.entityEndIndex;\n }\n\n const querySpecificity = axpMenuQueryParamSpecificity(item.path, currentPath);\n\n if (\n effectiveMenuLength > bestEffectiveLength ||\n (effectiveMenuLength === bestEffectiveLength && querySpecificity > bestQuerySpecificity)\n ) {\n bestEffectiveLength = effectiveMenuLength;\n bestQuerySpecificity = querySpecificity;\n bestMatch = { item, ancestors, isPartialMatch: matchResult.isPartial };\n }\n }\n };\n\n visit(items, []);\n return bestMatch;\n}\n","import { AXPMenuItem } from './menu.types';\nimport { AXPMenuItemFinder, AXPMenuMiddlewareContext } from './menu.middleware';\n\n//#region ---- Menu Context Builder ----\n\n/**\n * Creates a rich context for menu manipulation\n * Similar to entity modifier context pattern\n */\nexport function createMenuContext(items: AXPMenuItem[]): AXPMenuMiddlewareContext {\n const context: AXPMenuMiddlewareContext = {\n get items() {\n return items;\n },\n\n find(nameOrPattern: string | RegExp): AXPMenuItemFinder {\n if (typeof nameOrPattern === 'string') {\n return context.findByName(nameOrPattern);\n }\n const found = context.findByPattern(nameOrPattern);\n return found.length > 0 ? found[0] : createEmptyFinder();\n },\n\n findByName(name: string): AXPMenuItemFinder {\n return createMenuItemFinder(items, name);\n },\n\n findByPattern(pattern: string | RegExp): AXPMenuItemFinder[] {\n const regex = typeof pattern === 'string' ? wildcardToRegex(pattern) : pattern;\n const results: AXPMenuItemFinder[] = [];\n\n const searchRecursive = (itemList: AXPMenuItem[]) => {\n for (const item of itemList) {\n if (item.name && regex.test(item.name)) {\n results.push(createMenuItemFinder(items, item.name));\n }\n if (item.children) {\n searchRecursive(item.children);\n }\n }\n };\n\n searchRecursive(items);\n return results;\n },\n\n add(...newItems: AXPMenuItem[]): AXPMenuMiddlewareContext {\n items.push(...newItems);\n return context;\n },\n\n remove(predicate: (item: AXPMenuItem) => boolean): AXPMenuMiddlewareContext {\n removeRecursive(items, predicate);\n return context;\n },\n\n sort(): AXPMenuMiddlewareContext {\n sortItemsRecursively(items);\n return context;\n },\n\n toArray(): AXPMenuItem[] {\n return items;\n },\n };\n\n return context;\n}\n\n//#endregion\n\n//#region ---- Menu Item Finder Implementation ----\n\n/**\n * Creates a finder for a specific menu item\n */\nfunction createMenuItemFinder(rootItems: AXPMenuItem[], targetName: string): AXPMenuItemFinder {\n const findItemWithParent = (\n items: AXPMenuItem[],\n name: string,\n parent: { items: AXPMenuItem[] } = { items: rootItems }\n ): { item: AXPMenuItem | undefined; parent: { items: AXPMenuItem[] } } => {\n for (const item of items) {\n if (item.name === name) {\n return { item, parent };\n }\n if (item.children) {\n const result = findItemWithParent(item.children, name, { items: item.children });\n if (result.item) {\n return result;\n }\n }\n }\n return { item: undefined, parent };\n };\n\n const finder: AXPMenuItemFinder = {\n get(): AXPMenuItem | undefined {\n return findItemWithParent(rootItems, targetName).item;\n },\n\n exists(): boolean {\n return finder.get() !== undefined;\n },\n\n update(updater: Partial<AXPMenuItem> | ((item: AXPMenuItem) => Partial<AXPMenuItem>)): AXPMenuItemFinder {\n const { item } = findItemWithParent(rootItems, targetName);\n if (item) {\n const updates = typeof updater === 'function' ? updater(item) : updater;\n Object.assign(item, updates);\n }\n return finder;\n },\n\n remove(): AXPMenuItemFinder {\n const { item, parent } = findItemWithParent(rootItems, targetName);\n if (item) {\n const index = parent.items.indexOf(item);\n if (index !== -1) {\n parent.items.splice(index, 1);\n }\n }\n return finder;\n },\n\n hide(): AXPMenuItemFinder {\n // Hide by removing the item from menu\n return finder.remove();\n },\n\n show(): AXPMenuItemFinder {\n // Show is a no-op since items are visible by default\n // To truly implement show, we'd need to track removed items and re-add them\n console.warn('show() is not fully implemented - items are visible by default');\n return finder;\n },\n\n setPriority(priority: number): AXPMenuItemFinder {\n return finder.update({ priority });\n },\n\n addChildren(...children: AXPMenuItem[]): AXPMenuItemFinder {\n const { item } = findItemWithParent(rootItems, targetName);\n if (item) {\n item.children = item.children || [];\n item.children.push(...children);\n }\n return finder;\n },\n\n removeChildren(predicate: (child: AXPMenuItem) => boolean): AXPMenuItemFinder {\n const { item } = findItemWithParent(rootItems, targetName);\n if (item && item.children) {\n item.children = item.children.filter((c) => !predicate(c));\n }\n return finder;\n },\n\n moveTo(parentName: string | null | undefined): AXPMenuItemFinder {\n const { item, parent: oldParent } = findItemWithParent(rootItems, targetName);\n if (!item) {\n return finder;\n }\n\n // Remove from old parent\n const oldIndex = oldParent.items.indexOf(item);\n if (oldIndex !== -1) {\n oldParent.items.splice(oldIndex, 1);\n }\n\n // Add to new parent\n if (!parentName || parentName === '') {\n // Move to root (handles null, undefined, and empty string)\n rootItems.push(item);\n } else {\n const { item: newParentItem } = findItemWithParent(rootItems, parentName);\n if (newParentItem) {\n newParentItem.children = newParentItem.children || [];\n newParentItem.children.push(item);\n }\n }\n\n return finder;\n },\n\n insertBefore(...items: AXPMenuItem[]): AXPMenuItemFinder {\n const { item, parent } = findItemWithParent(rootItems, targetName);\n if (item) {\n const index = parent.items.indexOf(item);\n if (index !== -1) {\n parent.items.splice(index, 0, ...items);\n }\n }\n return finder;\n },\n\n insertAfter(...items: AXPMenuItem[]): AXPMenuItemFinder {\n const { item, parent } = findItemWithParent(rootItems, targetName);\n if (item) {\n const index = parent.items.indexOf(item);\n if (index !== -1) {\n parent.items.splice(index + 1, 0, ...items);\n }\n }\n return finder;\n },\n };\n\n return finder;\n}\n\n/**\n * Creates an empty finder for items not found\n */\nfunction createEmptyFinder(): AXPMenuItemFinder {\n return {\n get: () => undefined,\n exists: () => false,\n update: () => createEmptyFinder(),\n remove: () => createEmptyFinder(),\n hide: () => createEmptyFinder(),\n show: () => createEmptyFinder(),\n setPriority: () => createEmptyFinder(),\n addChildren: () => createEmptyFinder(),\n removeChildren: () => createEmptyFinder(),\n moveTo: () => createEmptyFinder(),\n insertBefore: () => createEmptyFinder(),\n insertAfter: () => createEmptyFinder(),\n };\n}\n\n//#endregion\n\n//#region ---- Helper Functions ----\n\n/**\n * Converts wildcard pattern to regex\n */\nfunction wildcardToRegex(pattern: string): RegExp {\n const escaped = pattern.replace(/[.+?^${}()|\\[\\]\\\\]/g, '\\\\$&');\n const regexStr = `^${escaped.replace(/\\*/g, '.*')}$`;\n return new RegExp(regexStr);\n}\n\n/**\n * Recursively removes items matching predicate\n */\nfunction removeRecursive(items: AXPMenuItem[], predicate: (item: AXPMenuItem) => boolean): void {\n for (let i = items.length - 1; i >= 0; i--) {\n const item = items[i];\n if (predicate(item)) {\n items.splice(i, 1);\n } else if (item.children) {\n removeRecursive(item.children, predicate);\n }\n }\n}\n\n/**\n * Recursively sorts items by priority\n */\nfunction sortItemsRecursively(items: AXPMenuItem[]): void {\n items.sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n items.forEach((item) => {\n if (item.children && item.children.length > 0) {\n sortItemsRecursively(item.children);\n }\n });\n}\n\n//#endregion\n\n","import { InjectionToken } from '@angular/core';\nimport { AXPMenuItem } from './menu.types';\n\n//#region ---- Menu Middleware Context ----\n\n/**\n * Rich context API for manipulating menu items within middleware\n * Provides helper methods to find, update, remove, and add menu items easily\n */\nexport interface AXPMenuMiddlewareContext {\n /**\n * Get all menu items\n */\n readonly items: AXPMenuItem[];\n\n /**\n * Find menu item(s) by name or pattern\n */\n find(nameOrPattern: string | RegExp): AXPMenuItemFinder;\n\n /**\n * Find menu item by name (exact match)\n */\n findByName(name: string): AXPMenuItemFinder;\n\n /**\n * Find menu items by pattern (regex or wildcard)\n */\n findByPattern(pattern: string | RegExp): AXPMenuItemFinder[];\n\n /**\n * Add new menu items to root level\n */\n add(...items: AXPMenuItem[]): AXPMenuMiddlewareContext;\n\n /**\n * Remove menu items by predicate\n */\n remove(predicate: (item: AXPMenuItem) => boolean): AXPMenuMiddlewareContext;\n\n /**\n * Sort all menu items recursively by priority\n */\n sort(): AXPMenuMiddlewareContext;\n\n /**\n * Get the final menu items array\n */\n toArray(): AXPMenuItem[];\n}\n\n/**\n * Helper for finding and manipulating a specific menu item\n */\nexport interface AXPMenuItemFinder {\n /**\n * Get the found menu item (or undefined)\n */\n get(): AXPMenuItem | undefined;\n\n /**\n * Check if menu item exists\n */\n exists(): boolean;\n\n /**\n * Update menu item properties\n */\n update(updater: Partial<AXPMenuItem> | ((item: AXPMenuItem) => Partial<AXPMenuItem>)): AXPMenuItemFinder;\n\n /**\n * Remove the menu item\n */\n remove(): AXPMenuItemFinder;\n\n /**\n * Hide the menu item (removes it from the menu)\n */\n hide(): AXPMenuItemFinder;\n\n /**\n * Show the menu item (currently a no-op as items are visible by default)\n * Note: To truly implement show, we'd need to track removed items\n */\n show(): AXPMenuItemFinder;\n\n /**\n * Set priority\n */\n setPriority(priority: number): AXPMenuItemFinder;\n\n /**\n * Add children to this menu item\n */\n addChildren(...children: AXPMenuItem[]): AXPMenuItemFinder;\n\n /**\n * Remove children by predicate\n */\n removeChildren(predicate: (child: AXPMenuItem) => boolean): AXPMenuItemFinder;\n\n /**\n * Move menu item to a different parent\n */\n moveTo(parentName: string | null | undefined): AXPMenuItemFinder;\n\n /**\n * Insert menu items before this item\n */\n insertBefore(...items: AXPMenuItem[]): AXPMenuItemFinder;\n\n /**\n * Insert menu items after this item\n */\n insertAfter(...items: AXPMenuItem[]): AXPMenuItemFinder;\n}\n\n//#endregion\n\n//#region ---- Menu Middleware ----\n\n/**\n * Middleware that processes menu items after all providers have executed\n * Middlewares are executed in order based on their priority (higher priority = earlier execution)\n */\nexport interface AXPMenuMiddleware {\n /**\n * Optional priority for execution order (higher = earlier)\n * Default: 0\n */\n readonly priority?: number;\n\n /**\n * Optional name for debugging and identification\n */\n readonly name?: string;\n\n /**\n * Process menu items using the rich context API\n * @param context - The menu middleware context with helper methods\n * @returns Processed context or void (context is mutable)\n */\n process(context: AXPMenuMiddlewareContext): Promise<void | AXPMenuMiddlewareContext>;\n}\n\n/**\n * Provider definition for registering middleware via multi-provider\n */\nexport interface AXPMenuMiddlewareProvider {\n /**\n * The middleware instance\n */\n middleware: AXPMenuMiddleware;\n\n /**\n * Optional priority override\n */\n priority?: number;\n}\n\n/**\n * Injection token for menu middlewares (multi-provider)\n */\nexport const AXP_MENU_MIDDLEWARE = new InjectionToken<AXPMenuMiddleware[]>('AXP_MENU_MIDDLEWARE');\n\n//#endregion\n\n","import { inject, Injectable } from '@angular/core';\nimport { AXP_MENU_MIDDLEWARE, AXPMenuMiddleware } from './menu.middleware';\n\n//#region ---- Menu Middleware Registry ----\n\n/**\n * Central service for managing menu middlewares with priority-based ordering\n * Similar to token registry pattern used in identifier-management\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPMenuMiddlewareRegistry {\n\n //#region ---- Fields ----\n\n /**\n * Manually registered middlewares\n */\n private readonly manualMiddlewares = new Map<string, AXPMenuMiddleware>();\n\n /**\n * Provider-based middlewares (multi-provider injection)\n */\n private readonly providerMiddlewares = inject(AXP_MENU_MIDDLEWARE, { optional: true }) ?? [];\n\n //#endregion\n\n //#region ---- Registration Methods ----\n\n /**\n * Manually register a middleware\n * @param middleware - The middleware to register\n */\n register(middleware: AXPMenuMiddleware): void {\n const name = middleware.name || `middleware_${Date.now()}_${Math.random()}`;\n\n const existing = this.manualMiddlewares.get(name);\n if (!existing || (middleware.priority ?? 0) > (existing.priority ?? 0)) {\n this.manualMiddlewares.set(name, middleware);\n }\n }\n\n /**\n * Unregister a middleware by name\n * @param name - The name of the middleware to remove\n */\n unregister(name: string): void {\n this.manualMiddlewares.delete(name);\n }\n\n /**\n * Get a specific middleware by name\n * @param name - The middleware name\n */\n get(name: string): AXPMenuMiddleware | undefined {\n // Provider-provided middlewares take precedence\n const fromProvider = this.providerMiddlewares\n .filter((m) => m.name === name)\n .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))[0];\n\n if (fromProvider) {\n return fromProvider;\n }\n\n return this.manualMiddlewares.get(name);\n }\n\n /**\n * Get all middlewares sorted by priority (highest first)\n * Combines provider-based and manually registered middlewares\n */\n list(): AXPMenuMiddleware[] {\n const map = new Map<string, AXPMenuMiddleware>();\n\n // Helper to add middleware, respecting priority\n const addMiddleware = (m: AXPMenuMiddleware) => {\n const name = m.name || `anonymous_${Date.now()}`;\n const existing = map.get(name);\n if (!existing || (m.priority ?? 0) > (existing.priority ?? 0)) {\n map.set(name, m);\n }\n };\n\n // Add provider middlewares first (higher precedence)\n this.providerMiddlewares.forEach(addMiddleware);\n\n // Add manual middlewares\n Array.from(this.manualMiddlewares.values()).forEach(addMiddleware);\n\n // Return sorted by priority (highest first)\n return Array.from(map.values()).sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n }\n\n /**\n * Check if a middleware exists\n * @param name - The middleware name\n */\n exists(name: string): boolean {\n return this.get(name) !== undefined;\n }\n\n /**\n * Clear all manually registered middlewares\n * Provider-based middlewares are not affected\n */\n clear(): void {\n this.manualMiddlewares.clear();\n }\n\n //#endregion\n}\n\n//#endregion\n\n","import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { inject, Injectable, InjectionToken } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { AXPMenuFinderResult, AXPMenuInsertion, AXPMenuItem, AXPMenuProviderContext } from './menu.types';\nimport { createMenuContext } from './menu.context';\nimport { AXPMenuMiddlewareRegistry } from './menu-middleware.registry';\n\nexport interface AXPMenuProvider {\n provide(context: AXPMenuProviderContext): Promise<void>;\n}\n\nexport const AXP_MENU_PROVIDER = new InjectionToken<AXPMenuProvider[]>('AXP_MENU_PROVIDER');\n\n//TODO: check performance of this service\n@Injectable({ providedIn: 'root' })\nexport class AXPMenuProviderService {\n\n //#region ---- Dependencies ----\n\n private providers = inject(AXP_MENU_PROVIDER, { optional: true });\n private middlewareRegistry = inject(AXPMenuMiddlewareRegistry);\n private sessionService = inject(AXPSessionService);\n\n //#endregion\n\n //#region ---- State ----\n\n private cache: AXPMenuItem[] | null = null;\n private pendingInserts: Array<{ target: string; newItems: AXPMenuItem[]; position: AXPMenuInsertion }> = [];\n private pendingRemovals: string[] = [];\n private pendingUpdates: Array<{ target: string; updatedItem: Partial<AXPMenuItem> }> = [];\n private pendingAdditions: Array<{ target: string; newItems: AXPMenuItem[] }> = [];\n private pendingMoves: Array<{ source: string; destination: string; position: AXPMenuInsertion }> = [];\n\n /**\n * Observable for menu reload events\n * Emits when menu cache is cleared and consumers should reload\n */\n private menuReloadSubject = new Subject<void>();\n public readonly menuReload$ = this.menuReloadSubject.asObservable();\n\n /** Serializes menu builds so pending queues are not corrupted by concurrent items() calls. */\n private itemsBuildLock: Promise<void> = Promise.resolve();\n\n /** Bumped on clearCache so an in-flight build cannot repopulate a stale cache. */\n private buildGeneration = 0;\n\n //#endregion\n\n //#region ---- Public API ----\n\n /**\n * Get menu items with middlewares applied (for end-user display)\n */\n async items(): Promise<AXPMenuItem[]> {\n if (this.cache) {\n return this.cache;\n }\n\n let releaseLock!: () => void;\n const previousBuild = this.itemsBuildLock;\n this.itemsBuildLock = new Promise<void>((resolve) => {\n releaseLock = resolve;\n });\n await previousBuild;\n\n try {\n if (this.cache) {\n return this.cache;\n }\n\n return await this.buildItems();\n } finally {\n releaseLock();\n }\n }\n\n private async buildItems(): Promise<AXPMenuItem[]> {\n const generation = this.buildGeneration;\n this.resetPendingOperations();\n\n // Common shells (Configuration / Administration / …) only register when Authorized.\n // Building earlier caches a broken tree and floods \"Target … not found\" warnings.\n if (!this.sessionService.isAuthorized) {\n return [];\n }\n\n const items: AXPMenuItem[] = [];\n const context = this.createMenuProviderContext(items);\n\n // Load providers from DI tokens\n if (Array.isArray(this.providers)) {\n for (const provider of this.providers) {\n if (provider instanceof Promise) {\n const resolvedProvider = await provider;\n await resolvedProvider.provide(context);\n } else {\n await provider.provide(context);\n }\n // Apply pending ops after each provider so later providers can find new parents.\n // Keep unresolved child additions for later providers / a final flush.\n this.applyPendingOperations(items, { dropUnresolvedAdditions: false });\n }\n }\n\n // Final pass: attach any additions whose parents were created by a later provider.\n this.applyPendingOperations(items, { dropUnresolvedAdditions: true });\n\n // Sort items by priority\n items.sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n\n // Apply middlewares using registry (sorted by priority)\n await this.applyMiddlewares(items);\n\n // ADD level property to items\n setMenuItemMeta(items);\n\n // clearCache during this build — discard result so it cannot stick as the cache.\n if (generation !== this.buildGeneration) {\n return items;\n }\n\n // Cache the computed items\n this.cache = items;\n return items;\n }\n\n /**\n * Get raw menu items WITHOUT middleware applied (for management/editing)\n * Used by menu management pages to show original items before customization\n */\n async rawItems(): Promise<AXPMenuItem[]> {\n this.resetPendingOperations();\n\n if (!this.sessionService.isAuthorized) {\n return [];\n }\n\n const items: AXPMenuItem[] = [];\n const context = this.createMenuProviderContext(items);\n\n // Load providers from DI tokens\n if (Array.isArray(this.providers)) {\n for (const provider of this.providers) {\n if (provider instanceof Promise) {\n // If provider is a promise, resolve it\n const resolvedProvider = await provider;\n await resolvedProvider.provide(context);\n } else {\n // If provider is a direct instance, use it directly\n await provider.provide(context);\n }\n // Apply pending operations after each provider\n this.applyPendingOperations(items, { dropUnresolvedAdditions: false });\n }\n }\n\n this.applyPendingOperations(items, { dropUnresolvedAdditions: true });\n\n // Sort items by priority\n items.sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n\n // ADD level property to items (but NO middleware)\n setMenuItemMeta(items);\n\n return items;\n }\n\n /**\n * Clear the cache to force reload of menu items\n * Notifies all subscribers to reload their menu data\n */\n clearCache(): void {\n this.buildGeneration++;\n this.cache = null;\n this.resetPendingOperations();\n\n // Notify subscribers that menu should be reloaded\n this.menuReloadSubject.next();\n }\n\n /**\n * Drop cached items without emitting reload (logout / session clear).\n * Avoids racing an async rebuild while status is not Authorized.\n */\n invalidateCacheQuietly(): void {\n this.buildGeneration++;\n this.cache = null;\n this.resetPendingOperations();\n }\n\n //#endregion\n\n //#region ---- Private Methods ----\n\n private resetPendingOperations(): void {\n this.pendingInserts = [];\n this.pendingRemovals = [];\n this.pendingUpdates = [];\n this.pendingAdditions = [];\n this.pendingMoves = [];\n }\n\n /**\n * Apply middlewares in priority order using the enhanced context API\n */\n private async applyMiddlewares(items: AXPMenuItem[]): Promise<void> {\n const middlewares = this.middlewareRegistry.list();\n\n for (const middleware of middlewares) {\n try {\n const context = createMenuContext(items);\n await middleware.process(context);\n\n // The context mutates the items array, so no need to reassign\n } catch (error) {\n console.error(\n `Error in menu middleware ${middleware.name || 'anonymous'}:`,\n error\n );\n }\n }\n }\n\n /**\n * Create provider context for menu providers\n */\n private createMenuProviderContext(items: AXPMenuItem[]): AXPMenuProviderContext {\n return {\n addItems: (newItems: AXPMenuItem[]) => {\n for (const newItem of newItems) {\n if (newItem.name) {\n const existingItem = this.findItemByName(items, newItem.name);\n if (existingItem) {\n // Update existing item, merging properties\n this.mergeMenuItem(existingItem, newItem);\n } else {\n // Add new item if it doesn't exist\n items.push(newItem);\n }\n } else {\n // Add item without name (no way to check for duplicates)\n items.push(newItem);\n }\n }\n },\n find: (target: string): AXPMenuFinderResult => {\n const foundItemInfo = this.findItemWithParent(items, target);\n const exists = foundItemInfo.foundItem !== null;\n\n return {\n exists,\n insert: (newItems: AXPMenuItem[], position: AXPMenuInsertion) => {\n this.pendingInserts.push({ target, newItems, position });\n },\n remove: () => {\n this.pendingRemovals.push(target);\n },\n update: (updatedItem: Partial<AXPMenuItem>) => {\n this.pendingUpdates.push({ target, updatedItem });\n },\n addItems: (newItems: AXPMenuItem[]) => {\n this.pendingAdditions.push({ target, newItems });\n },\n moveTo: (destination: string, position: AXPMenuInsertion = 'inside') => {\n this.pendingMoves.push({\n source: target,\n destination,\n position: position ?? 'inside',\n });\n },\n };\n }\n };\n }\n\n private applyPendingOperations(\n items: AXPMenuItem[],\n options: { dropUnresolvedAdditions?: boolean } = {},\n ): void {\n const dropUnresolvedAdditions = options.dropUnresolvedAdditions ?? true;\n\n for (const { target, newItems, position } of this.pendingInserts) {\n const foundItemInfo = this.findItemWithParent(items, target);\n const { foundItem, parentItems } = foundItemInfo;\n if (!foundItem) {\n console.warn(`Target \"${target}\" not found, appending items.`);\n items.push(...newItems);\n } else {\n if (position === 'inside') {\n if (!foundItem.children) {\n foundItem.children = [];\n }\n\n // Check for duplicates by name and merge or add\n for (const newItem of newItems) {\n if (newItem.name) {\n const existingChild = this.findItemByName(foundItem.children, newItem.name);\n if (existingChild) {\n this.mergeMenuItem(existingChild, newItem);\n } else {\n foundItem.children.push(newItem);\n }\n } else {\n foundItem.children.push(newItem);\n }\n }\n } else {\n // For 'before' and 'after', check for duplicates in parent items\n const itemsToInsert: AXPMenuItem[] = [];\n for (const newItem of newItems) {\n if (newItem.name) {\n const existingItem = this.findItemByName(parentItems, newItem.name);\n if (existingItem) {\n this.mergeMenuItem(existingItem, newItem);\n } else {\n itemsToInsert.push(newItem);\n }\n } else {\n itemsToInsert.push(newItem);\n }\n }\n\n if (itemsToInsert.length > 0) {\n const index = parentItems.indexOf(foundItem);\n const insertPosition = position === 'before' ? index : index + 1;\n parentItems.splice(insertPosition, 0, ...itemsToInsert);\n }\n }\n }\n }\n\n for (const target of this.pendingRemovals) {\n const foundItemInfo = this.findItemWithParent(items, target);\n const { foundItem, parentItems } = foundItemInfo;\n if (!foundItem) {\n console.warn(`Target \"${target}\" not found, nothing to remove.`);\n } else {\n const index = parentItems.indexOf(foundItem);\n parentItems.splice(index, 1);\n }\n }\n\n for (const { target, updatedItem } of this.pendingUpdates) {\n const foundItemInfo = this.findItemWithParent(items, target);\n const { foundItem } = foundItemInfo;\n if (!foundItem) {\n console.warn(`Target \"${target}\" not found, nothing to update.`);\n } else {\n Object.assign(foundItem, updatedItem);\n }\n }\n\n this.applyPendingAdditions(items, { dropUnresolved: dropUnresolvedAdditions });\n\n for (const move of this.pendingMoves) {\n this.applyPendingMove(items, move.source, move.destination, move.position);\n }\n\n // Keep unresolved additions across providers; clear only queues that were fully handled.\n this.pendingInserts = [];\n this.pendingRemovals = [];\n this.pendingUpdates = [];\n this.pendingMoves = [];\n if (dropUnresolvedAdditions) {\n this.pendingAdditions = [];\n }\n }\n\n /**\n * Applies queued child additions in multiple passes so a provider can create a parent shell\n * and attach children in the same provide() call (parent is created in an earlier pass).\n * When `dropUnresolved` is false, unresolved targets stay queued for a later provider.\n */\n private applyPendingAdditions(\n items: AXPMenuItem[],\n options: { dropUnresolved?: boolean } = {},\n ): void {\n const dropUnresolved = options.dropUnresolved ?? true;\n const maxPasses = 32;\n\n for (let pass = 0; pass < maxPasses && this.pendingAdditions.length > 0; pass++) {\n const remaining: Array<{ target: string; newItems: AXPMenuItem[] }> = [];\n\n for (const { target, newItems } of this.pendingAdditions) {\n const foundItem = this.findItemWithParent(items, target).foundItem;\n if (!foundItem) {\n remaining.push({ target, newItems });\n continue;\n }\n\n if (!foundItem.children) {\n foundItem.children = [];\n }\n\n for (const newItem of newItems) {\n if (newItem.name) {\n const existingChild = this.findItemByName(foundItem.children, newItem.name);\n if (existingChild) {\n this.mergeMenuItem(existingChild, newItem);\n } else {\n foundItem.children.push(newItem);\n }\n } else {\n foundItem.children.push(newItem);\n }\n }\n }\n\n if (remaining.length === this.pendingAdditions.length) {\n if (dropUnresolved) {\n for (const { target } of remaining) {\n console.warn(`Target \"${target}\" not found, nothing to add items to.`);\n }\n this.pendingAdditions = [];\n } else {\n this.pendingAdditions = remaining;\n }\n break;\n }\n\n this.pendingAdditions = remaining;\n }\n }\n\n private findItemWithParent(items: AXPMenuItem[], target: string, parentItems: AXPMenuItem[] = items): { foundItem: AXPMenuItem | null, parentItems: AXPMenuItem[] } {\n for (const item of items) {\n if (item.name === target) {\n return { foundItem: item, parentItems };\n }\n\n if (item.children) {\n const result = this.findItemWithParent(item.children, target, item.children);\n if (result.foundItem) {\n return result;\n }\n }\n }\n return { foundItem: null, parentItems: items };\n }\n\n /**\n * Find menu item by name in the items tree (recursive search)\n */\n private findItemByName(items: AXPMenuItem[], name: string): AXPMenuItem | null {\n for (const item of items) {\n if (item.name === name) {\n return item;\n }\n\n if (item.children) {\n const found = this.findItemByName(item.children, name);\n if (found) {\n return found;\n }\n }\n }\n return null;\n }\n\n private applyPendingMove(\n items: AXPMenuItem[],\n sourceName: string,\n destName: string,\n position: AXPMenuInsertion\n ): void {\n if (sourceName === destName) {\n console.warn(`moveTo: source and destination are the same (\"${sourceName}\"), ignored.`);\n return;\n }\n\n const sourceInfo = this.findItemWithParent(items, sourceName);\n const { foundItem: sourceItem, parentItems: sourceParent } = sourceInfo;\n if (!sourceItem) {\n console.warn(`moveTo: source \"${sourceName}\" not found.`);\n return;\n }\n\n const destInfo = this.findItemWithParent(items, destName);\n const { foundItem: destItem, parentItems: destParent } = destInfo;\n if (!destItem) {\n console.warn(`moveTo: destination \"${destName}\" not found.`);\n return;\n }\n\n if (this.itemIsInSubtreeOf(sourceItem, destItem)) {\n console.warn(\n `moveTo: cannot move \"${sourceName}\" because \"${destName}\" is inside the source subtree.`\n );\n return;\n }\n\n const sourceIndex = sourceParent.indexOf(sourceItem);\n if (sourceIndex === -1) {\n console.warn(`moveTo: source \"${sourceName}\" not in parent list (inconsistent).`);\n return;\n }\n sourceParent.splice(sourceIndex, 1);\n\n if (position === 'inside') {\n if (!destItem.children) {\n destItem.children = [];\n }\n destItem.children.push(sourceItem);\n return;\n }\n\n const destIndexInParent = destParent.indexOf(destItem);\n if (destIndexInParent === -1) {\n console.warn(\n `moveTo: destination \"${destName}\" not in parent list, reverting source removal.`\n );\n sourceParent.splice(sourceIndex, 0, sourceItem);\n return;\n }\n const insertIndex = position === 'before' ? destIndexInParent : destIndexInParent + 1;\n destParent.splice(insertIndex, 0, sourceItem);\n }\n\n private itemIsInSubtreeOf(root: AXPMenuItem, candidate: AXPMenuItem): boolean {\n if (root === candidate) {\n return true;\n }\n if (!root.children?.length) {\n return false;\n }\n for (const child of root.children) {\n if (child === candidate) {\n return true;\n }\n if (this.itemIsInSubtreeOf(child, candidate)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Merge new item properties into existing item, handling children merge\n */\n private mergeMenuItem(existingItem: AXPMenuItem, newItem: AXPMenuItem): void {\n // Merge top-level properties (newItem properties override existing only if defined)\n if (newItem.text !== undefined) existingItem.text = newItem.text;\n if (newItem.description !== undefined) existingItem.description = newItem.description;\n if (newItem.icon !== undefined) existingItem.icon = newItem.icon;\n if (newItem.path !== undefined) existingItem.path = newItem.path;\n if (newItem.priority !== undefined) existingItem.priority = newItem.priority;\n if (newItem.type !== undefined) existingItem.type = newItem.type;\n if (newItem.command !== undefined) existingItem.command = newItem.command;\n if (newItem.badgeKey !== undefined) existingItem.badgeKey = newItem.badgeKey;\n if (newItem.data !== undefined) existingItem.data = newItem.data;\n if (newItem.policy !== undefined) existingItem.policy = newItem.policy;\n\n // Merge children if both have children\n if (newItem.children && newItem.children.length > 0) {\n if (!existingItem.children) {\n existingItem.children = [];\n }\n\n // For each child in newItem, check if it exists by name and merge or add\n for (const newChild of newItem.children) {\n if (newChild.name) {\n const existingChild = this.findItemByName(existingItem.children, newChild.name);\n if (existingChild) {\n this.mergeMenuItem(existingChild, newChild);\n } else {\n existingItem.children.push(newChild);\n }\n } else {\n existingItem.children.push(newChild);\n }\n }\n }\n }\n\n //#endregion\n}\n\nfunction setMenuItemMeta(items: any[], parentIndex: string = '', depth: number = 0) {\n items.forEach((item, index) => {\n const currentIndex = parentIndex ? `${parentIndex}-${index}` : `${index}`;\n const hasChildren = !!(item.children && Array.isArray(item.children) && item.children.length > 0);\n\n item.meta = {\n index: currentIndex,\n isRoot: depth === 0,\n hasChildren,\n depth\n }\n\n if (hasChildren) {\n setMenuItemMeta(item.children, currentIndex, depth + 1);\n }\n });\n}\n","import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPMenuItem } from './menu.types';\nimport { inject, Injectable } from '@angular/core';\n\n/**\n * Service for checking menu item visibility based on permissions, features, and children.\n * This service helps filter out empty menu items that have no visible children.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPMenuVisibilityService {\n private sessionService = inject(AXPSessionService);\n\n /**\n * Checks visibility for a menu branch, including ancestor policies.\n * Parent module features and permissions must pass before child routes are accessible.\n */\n isMenuBranchVisible(item: AXPMenuItem, ancestors: AXPMenuItem[] = []): boolean {\n for (const menuItem of [...ancestors, item]) {\n if (!this.isItemVisible(menuItem)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Checks if a menu item should be visible based on permissions and features.\n */\n isItemVisible(item: AXPMenuItem): boolean {\n const policy = item.policy;\n if (!policy) {\n return true; // No policy means visible\n }\n\n // Check features\n if (policy.features && policy.features.length > 0) {\n const featureKeys = Array.isArray(policy.features) ? policy.features : [policy.features];\n if (!this.sessionService.isFeatureEnabled(...featureKeys)) {\n return false;\n }\n }\n\n // Check permissions\n if (policy.permissions && policy.permissions.length > 0) {\n const permissionKeys = Array.isArray(policy.permissions) ? policy.permissions : [policy.permissions];\n if (!this.sessionService.authorize(...permissionKeys)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Recursively checks if a menu item has any visible children.\n * @param item The menu item to check\n * @param getRouterLink Optional function to check if an item has a router link\n */\n hasVisibleChildren(item: AXPMenuItem, getRouterLink?: (item: AXPMenuItem) => unknown): boolean {\n if (!item.children || item.children.length === 0) {\n return false;\n }\n\n return item.children.some((child) => {\n // Check if child itself is visible\n if (!this.isItemVisible(child)) {\n return false;\n }\n\n // If child has a routerLink, it's visible\n if (getRouterLink && getRouterLink(child)) {\n return true;\n }\n\n // If child has visible children, it's visible\n if (this.hasVisibleChildren(child, getRouterLink)) {\n return true;\n }\n\n // For items without routerLink, check if they have a command (non-empty menu items)\n if (child.command) {\n return true;\n }\n\n return false;\n });\n }\n\n /**\n * Determines if a menu item should be rendered.\n * A menu item should be rendered if:\n * 1. It has a routerLink, OR\n * 2. It has visible children, OR\n * 3. It has a command (for non-router navigation)\n *\n * @param item The menu item to check\n * @param getRouterLink Optional function to check if an item has a router link\n */\n shouldRenderMenuItem(item: AXPMenuItem, getRouterLink?: (item: AXPMenuItem) => unknown): boolean {\n // Check if item itself is visible (permissions/features)\n if (!this.isItemVisible(item)) {\n return false;\n }\n\n // If it has a routerLink, render it\n if (getRouterLink && getRouterLink(item)) {\n return true;\n }\n\n // If it has visible children, render it\n if (this.hasVisibleChildren(item, getRouterLink)) {\n return true;\n }\n\n // If it has a command (for non-router navigation), render it\n if (item.command) {\n return true;\n }\n\n // Otherwise, don't render empty menu items\n return false;\n }\n}\n\n","//#region ---- Imports ----\n\nimport { AXPKeyboardShortcutBinding, AXPKeyboardShortcutPriority } from '@acorex-platform/framework-shared/core';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPKeyboardShortcutRegistry, normalizeKeyboardShortcuts } from '@acorex-platform/framework-client/core';\nimport { DestroyRef, inject, Injectable, Injector } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { AXPMenuService } from './menu.service';\nimport { AXPMenuVisibilityService } from './menu-visibility.service';\nimport { AXPMenuItem } from './menu.types';\n\n//#endregion\n\n//#region ---- Types ----\n\ninterface AXPMenuShortcutEntry {\n item: AXPMenuItem;\n ancestors: AXPMenuItem[];\n}\n\n//#endregion\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPMenuKeyboardShortcutService {\n //#region ---- Services & Dependencies ----\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly injector = inject(Injector);\n private readonly shortcutRegistry = inject(AXPKeyboardShortcutRegistry);\n private readonly visibilityService = inject(AXPMenuVisibilityService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly isAuthenticated = toSignal(this.sessionService.isAuthenticated$, { initialValue: false });\n\n //#endregion\n\n //#region ---- Public Methods ----\n\n /**\n * Registers global keyboard shortcuts declared on menu items (`shortcuts` property).\n * Replaces the previous registration when the menu tree is reloaded.\n */\n sync(items: AXPMenuItem[]): void {\n const shortcuts = this.buildShortcutBindings(items);\n\n this.shortcutRegistry.register({\n owner: this.destroyRef,\n id: 'menu-items-shortcuts',\n priority: AXPKeyboardShortcutPriority.Global,\n group: '@general:keyboard-shortcuts.groups.global',\n when: () => this.isAuthenticated() === true,\n shortcuts,\n });\n }\n\n //#endregion\n\n //#region ---- Private Methods ----\n\n private buildShortcutBindings(items: AXPMenuItem[]): AXPKeyboardShortcutBinding[] {\n const shortcuts: AXPKeyboardShortcutBinding[] = [];\n\n for (const entry of this.collectShortcutEntries(items)) {\n if (!entry.item.path && !entry.item.command) {\n continue;\n }\n\n for (const shortcut of normalizeKeyboardShortcuts(entry.item.shortcuts)) {\n for (const chord of shortcut.keys) {\n shortcuts.push({\n keys: [chord],\n title: entry.item.text,\n group: '@general:keyboard-shortcuts.groups.global',\n allowInEditableFields: shortcut.allowInEditableFields,\n directionBehavior: shortcut.directionBehavior,\n when: () => this.isShortcutActive(entry) && (shortcut.when?.() ?? true),\n handler: () => {\n this.injector.get(AXPMenuService).executeCommand(entry.item);\n },\n });\n }\n }\n }\n\n return shortcuts;\n }\n\n private collectShortcutEntries(\n items: AXPMenuItem[],\n ancestors: AXPMenuItem[] = [],\n ): AXPMenuShortcutEntry[] {\n const result: AXPMenuShortcutEntry[] = [];\n\n for (const item of items) {\n const parents = ancestors;\n if (item.shortcuts?.length) {\n result.push({ item, ancestors: parents });\n }\n\n if (item.children?.length) {\n result.push(...this.collectShortcutEntries(item.children, [...parents, item]));\n }\n }\n\n return result;\n }\n\n private isShortcutActive(entry: AXPMenuShortcutEntry): boolean {\n if (this.isAuthenticated() !== true) {\n return false;\n }\n\n return this.visibilityService.isMenuBranchVisible(entry.item, entry.ancestors);\n }\n\n //#endregion\n}\n","import { AXPSessionService, AXPSessionStatus } from '@acorex-platform/framework-client/auth';\nimport { AXPExecuteCommand } from '@acorex-platform/framework-shared/core';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { patchState, signalStore, withHooks, withMethods, withState } from '@ngrx/signals';\nimport {\n distinctUntilChanged,\n filter,\n firstValueFrom,\n from,\n map,\n combineLatest,\n Subscription,\n switchMap,\n} from 'rxjs';\nimport { AXPMenuProviderService } from './menu.provider';\nimport { AXPMenuKeyboardShortcutService } from './menu-keyboard-shortcuts.service';\nimport { axpFindMenuItemByRoute } from './menu-route-matcher';\nimport { AXPMenuItem } from './menu.types';\n\n//#region ----- Helpers -----\n\nfunction axpMenuItemNeedsUpdate(item: AXPMenuItem, updates: Partial<AXPMenuItem>): boolean {\n return (Object.keys(updates) as Array<keyof AXPMenuItem>).some((key) => item[key] !== updates[key]);\n}\n\n/** Immutably patches the first menu item with the given name. */\nfunction axpUpdateMenuItemByName(\n items: AXPMenuItem[],\n name: string,\n updates: Partial<AXPMenuItem>,\n): { items: AXPMenuItem[]; changed: boolean } {\n let changed = false;\n\n const walk = (list: AXPMenuItem[]): AXPMenuItem[] => {\n let listChanged = false;\n const next = list.map((item) => {\n if (item.name === name) {\n if (!axpMenuItemNeedsUpdate(item, updates)) {\n return item;\n }\n changed = true;\n listChanged = true;\n return { ...item, ...updates };\n }\n\n if (item.children?.length) {\n const children = walk(item.children);\n if (children !== item.children) {\n listChanged = true;\n return { ...item, children };\n }\n }\n\n return item;\n });\n\n return listChanged ? next : list;\n };\n\n return { items: walk(items), changed };\n}\n\n//#endregion\n\nexport const AXPMenuService = signalStore(\n { providedIn: 'root' },\n\n // Initial State\n withState((router = inject(Router)) => {\n return {\n items: [] as AXPMenuItem[],\n selectedMenuItem: {\n item: null as AXPMenuItem | null,\n isFullMatch: false,\n },\n };\n }),\n\n // Methods for State Management\n withMethods(\n (\n store,\n router = inject(Router),\n commandService = inject(AXPCommandService),\n ) => {\n return {\n setMenuItems(items: AXPMenuItem[]): void {\n patchState(store, { items: items });\n },\n\n /**\n * Patches a single menu item by `name` without rebuilding the full menu tree.\n * Returns true when an item was found and its data changed.\n */\n updateItem(name: string, updates: Partial<AXPMenuItem>): boolean {\n if (!name) {\n return false;\n }\n\n const { items, changed } = axpUpdateMenuItemByName(store.items(), name, updates);\n if (!changed) {\n return false;\n }\n\n patchState(store, { items });\n return true;\n },\n\n selectMenuItemByRoute(path: string): void {\n const match = axpFindMenuItemByRoute(store.items(), path, ['list', 'view', 'edit', 'create']);\n patchState(store, {\n selectedMenuItem: {\n item: match?.item ?? null,\n isFullMatch: match ? !match.isPartialMatch : false,\n },\n });\n },\n\n executeCommand(item: AXPMenuItem): void {\n if (item.path) {\n void commandService.execute('navigate', { path: item.path });\n patchState(store, { selectedMenuItem: { item, isFullMatch: true } });\n }\n if (item.command) {\n const command = item.command as AXPExecuteCommand;\n if (commandService.exists(command?.name)) {\n void commandService.execute(command.name, command.options ?? {});\n }\n }\n },\n\n isItemOpen(item: AXPMenuItem): boolean {\n const selectedItem = store.selectedMenuItem().item;\n if (!selectedItem) {\n return false;\n }\n\n if (item === selectedItem || (item.name && item.name === selectedItem.name)) {\n return true;\n }\n\n const findParent = (currentItem: AXPMenuItem, targetItem: AXPMenuItem): boolean => {\n if (\n currentItem.children?.some(\n (child) => child === targetItem || (child.name && child.name === targetItem.name),\n )\n ) {\n return true;\n }\n return currentItem.children?.some((child) => findParent(child, targetItem)) ?? false;\n };\n\n return findParent(item, selectedItem);\n },\n };\n },\n ),\n withHooks((\n store,\n menuProviderService = inject(AXPMenuProviderService),\n menuKeyboardShortcuts = inject(AXPMenuKeyboardShortcutService),\n router = inject(Router),\n sessionService = inject(AXPSessionService),\n ) => {\n let reloadSubscription: ReturnType<typeof menuProviderService.menuReload$.subscribe> | undefined;\n let accessPolicySubscription: Subscription | undefined;\n let sessionStatusSubscription: Subscription | undefined;\n let reloadGeneration = 0;\n\n const applyMenuItems = (items: AXPMenuItem[]): void => {\n patchState(store, { items });\n menuKeyboardShortcuts.sync(items);\n store.selectMenuItemByRoute(router.url);\n };\n\n const rebuildMenu = async (generation: number): Promise<void> => {\n const authorized = await firstValueFrom(sessionService.isAuthorized$);\n if (!authorized || !sessionService.application?.id) {\n if (generation === reloadGeneration) {\n applyMenuItems([]);\n }\n return;\n }\n\n const userId = sessionService.user?.id;\n const applicationId = sessionService.application?.id;\n const items = await menuProviderService.items();\n if (generation !== reloadGeneration) {\n return;\n }\n // Drop stale rebuilds if user/app changed while providers were resolving.\n if (\n !sessionService.isAuthorized ||\n sessionService.user?.id !== userId ||\n sessionService.application?.id !== applicationId\n ) {\n return;\n }\n applyMenuItems(items);\n };\n\n return {\n onInit() {\n // Subscribe to menu reload events.\n reloadSubscription = menuProviderService.menuReload$.subscribe(() => {\n const generation = ++reloadGeneration;\n void rebuildMenu(generation);\n });\n\n // Drop menus on logout / session clear (quiet — do not trigger a rebuild race).\n sessionStatusSubscription = sessionService.status$\n .pipe(\n filter(\n (status) =>\n status === AXPSessionStatus.Unauthenticated ||\n status === AXPSessionStatus.SignedOut ||\n status === AXPSessionStatus.Expired,\n ),\n )\n .subscribe(() => {\n reloadGeneration++;\n menuProviderService.invalidateCacheQuietly();\n applyMenuItems([]);\n });\n\n // Rebuild when Authorized + application + policy identity are ready.\n // Emit null while not Authorized so re-Authorize with the same key still rebuilds\n // (updateToken demotes to Authenticated and previously stuck empty menus).\n accessPolicySubscription = combineLatest([\n sessionService.isAuthorized$,\n sessionService.user$,\n sessionService.application$,\n sessionService.permissions$,\n sessionService.features$,\n ])\n .pipe(\n map(([isAuthorized, user, application, permissions, features]) => {\n if (!isAuthorized || !application?.id) {\n return null;\n }\n return `${user?.id ?? ''}:${application.id}:${permissions.length}:${features.length}`;\n }),\n distinctUntilChanged(),\n filter((key): key is string => key != null),\n switchMap((key) => {\n const generation = ++reloadGeneration;\n menuProviderService.invalidateCacheQuietly();\n return from(\n (async () => {\n await rebuildMenu(generation);\n return key;\n })(),\n );\n }),\n )\n .subscribe();\n\n // Initial load: wait until the session is Authorized (not a one-shot false on login).\n void (async () => {\n await firstValueFrom(\n sessionService.isAuthorized$.pipe(filter((authorized) => authorized)),\n );\n menuProviderService.clearCache();\n })();\n },\n onDestroy() {\n reloadSubscription?.unsubscribe();\n accessPolicySubscription?.unsubscribe();\n sessionStatusSubscription?.unsubscribe();\n },\n };\n }),\n);\n","import { defaultTo } from 'lodash-es';\n\n//#region ---- Tab Key ----\n\n/** Query params ignored when building a tab dedupe key. */\nconst IGNORED_QUERY_KEYS = new Set(['_ts']);\n\n/**\n * Builds a stable tab key from a router URL.\n * Path segments define identity; query params are excluded so the same entity record\n * or list reuses one tab even when filters or refresh tokens change.\n */\nexport function axpBuildTabKey(url: string): string {\n const normalized = normalizeRouterUrl(url);\n const pathOnly = normalized.split('?')[0].split('#')[0];\n return pathOnly;\n}\n\n/** Normalizes a router URL for storage and navigation. */\nexport function normalizeRouterUrl(url: string): string {\n const trimmed = url.trim();\n if (!trimmed.length) {\n return '/';\n }\n\n const withLeadingSlash = trimmed.startsWith('/') ? trimmed : `/${trimmed}`;\n const [pathAndFragment, queryString = ''] = withLeadingSlash.split('?');\n const [pathPart, fragment = ''] = pathAndFragment.split('#');\n\n const normalizedPath = pathPart.replace(/\\/+$/, '') || '/';\n const filteredQuery = filterQueryString(queryString);\n\n let result = normalizedPath;\n if (filteredQuery) {\n result += `?${filteredQuery}`;\n }\n if (fragment) {\n result += `#${fragment}`;\n }\n return result;\n}\n\nfunction filterQueryString(queryString: string): string {\n if (!queryString) {\n return '';\n }\n\n const params = new URLSearchParams(queryString);\n const kept: string[] = [];\n params.forEach((value, key) => {\n if (!IGNORED_QUERY_KEYS.has(key)) {\n kept.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n }\n });\n kept.sort();\n return kept.join('&');\n}\n\n/** Human-readable fallback title from the URL path. */\nexport function axpFallbackTabTitle(url: string): string {\n const pathOnly = url.split('?')[0].split('#')[0];\n const segments = pathOnly.split('/').filter(Boolean);\n const last = defaultTo(segments[segments.length - 1], 'Page');\n return decodeURIComponent(last);\n}\n\n//#endregion\n","//#region ---- Types ----\n\nexport type AXPNavigationMode = 'simple' | 'tabular';\n\nexport const AXP_HOME_TAB_KEY = 'axp:home';\n\n/** Route `data` key for tab-navigation behavior (`data.tab`). */\nexport const AXP_TAB_ROUTE_DATA_KEY = 'tab';\n\n/**\n * Set `data.tab = true` on the route that should act as the tab boundary.\n * Child navigations under this route update the same tab rather than opening a new one.\n */\nexport type AXPTabRouteData = true;\n\nexport interface AXPTabDescriptor {\n /** Stable dedupe key derived from the route (path-based, query excluded). */\n key: string;\n /** Full router URL including query string and fragment. */\n url: string;\n title: string;\n /** Resolved breadcrumb segments used for tab chrome (leaf/prefix); avoids parsing joined titles. */\n titleSegments?: string[];\n icon?: string;\n pinned: boolean;\n closable: boolean;\n /** Timestamp used for LRU eviction when max tabs is reached. */\n openedAt: number;\n /** Updated whenever the tab becomes active. */\n lastActivatedAt: number;\n}\n\nexport interface AXPTabSessionState {\n tabs: AXPTabDescriptor[];\n activeTabKey: string | null;\n}\n\n/** Optional hook for confirming closure of a cached background tab (no router navigation). */\nexport interface AXPTabCloseConfirm {\n onBeforeTabClose(): boolean | Promise<boolean>;\n}\n\n//#endregion\n","import { ActivatedRouteSnapshot, Router, Routes } from '@angular/router';\nimport { normalizeRouterUrl } from './tab-key.util';\nimport { AXP_TAB_ROUTE_DATA_KEY } from './tab-navigation.types';\n\n//#region ---- Route Data ----\n\n/** True when the route declares itself as a scoped tab root (`data.tab = true`). */\nexport function axpHasTabScope(data: Record<string, unknown> | undefined): boolean {\n return data?.[AXP_TAB_ROUTE_DATA_KEY] === true;\n}\n\n//#endregion\n\n//#region ---- Snapshot Resolution ----\n\n/** Resolved URL path for a snapshot (no query or fragment). */\nexport function axpPathFromSnapshot(snapshot: ActivatedRouteSnapshot): string {\n const segments = snapshot.pathFromRoot\n .flatMap((entry) => entry.url.map((segment) => segment.path))\n .filter(Boolean);\n return segments.length ? `/${segments.join('/')}` : '/';\n}\n\n/** Returns the leaf snapshot under the router state root. */\nexport function axpGetLeafRouteSnapshot(root: ActivatedRouteSnapshot): ActivatedRouteSnapshot {\n let route = root;\n while (route.firstChild) {\n route = route.firstChild;\n }\n return route;\n}\n\n/**\n * Resolves the tab dedupe key from an activated route tree.\n * Uses the nearest ancestor with `data.tab = true`; otherwise the leaf path.\n */\nexport function axpResolveTabKeyFromSnapshot(leaf: ActivatedRouteSnapshot): string {\n const chain = leaf.pathFromRoot;\n\n for (let index = chain.length - 1; index >= 0; index--) {\n const snapshot = chain[index];\n if (axpHasTabScope(snapshot.data)) {\n return axpPathFromSnapshot(snapshot);\n }\n }\n\n return axpPathFromSnapshot(leaf);\n}\n\n//#endregion\n\n//#region ---- Router / URL Resolution ----\n\n/**\n * Resolves a tab key for the given URL (or the current router URL).\n * Prefers the live route snapshot when it matches the target URL; otherwise matches route config.\n */\nexport function axpResolveTabKey(router: Router, url?: string): string {\n const normalized = normalizeRouterUrl(url ?? router.url);\n const pathOnly = normalized.split('?')[0].split('#')[0];\n\n const currentPath = normalizeRouterUrl(router.url).split('?')[0].split('#')[0];\n if (!url || pathOnly === currentPath) {\n const leaf = axpGetLeafRouteSnapshot(router.routerState.snapshot.root);\n return axpResolveTabKeyFromSnapshot(leaf);\n }\n\n const fromConfig = axpResolveTabKeyFromRouteConfig(router.config, pathOnly);\n if (fromConfig) {\n return fromConfig;\n }\n\n return pathOnly.startsWith('/') ? pathOnly : `/${pathOnly}`;\n}\n\n//#endregion\n\n//#region ---- Route Config Matching ----\n\ninterface MatchedRouteLevel {\n mergedData: Record<string, unknown>;\n path: string;\n}\n\n/**\n * Matches a URL path against registered routes and resolves the tab key from `data.tab`.\n */\nexport function axpResolveTabKeyFromRouteConfig(routes: Routes, pathOnly: string): string | null {\n const normalized = pathOnly.startsWith('/') ? pathOnly.replace(/\\/+$/, '') || '/' : `/${pathOnly}`.replace(/\\/+$/, '') || '/';\n const segments = normalized === '/' ? [] : normalized.split('/').filter(Boolean);\n const chain = matchRouteConfigChain(routes, segments, 0, {}, []);\n\n if (!chain?.length) {\n return null;\n }\n\n for (let index = chain.length - 1; index >= 0; index--) {\n const level = chain[index];\n if (axpHasTabScope(level.mergedData)) {\n return level.path;\n }\n }\n\n return chain[chain.length - 1]?.path ?? null;\n}\n\nfunction matchRouteConfigChain(\n routes: Routes,\n segments: string[],\n startIndex: number,\n inheritedData: Record<string, unknown>,\n chain: MatchedRouteLevel[],\n): MatchedRouteLevel[] | null {\n let bestMatch: MatchedRouteLevel[] | null = null;\n\n for (const route of routes) {\n if (route.redirectTo) {\n continue;\n }\n\n const segmentMatch = matchRoutePath(route.path ?? '', segments, startIndex);\n if (!segmentMatch) {\n continue;\n }\n\n const pathSegments = [...segments.slice(0, startIndex), ...segments.slice(startIndex, startIndex + segmentMatch.consumed)];\n const path = pathSegments.length ? `/${pathSegments.join('/')}` : '/';\n const mergedData: Record<string, unknown> = { ...inheritedData, ...(route.data ?? {}) };\n const level: MatchedRouteLevel = { mergedData, path };\n const nextChain = [...chain, level];\n const nextIndex = startIndex + segmentMatch.consumed;\n\n if (route.children?.length) {\n const childMatch = matchRouteConfigChain(route.children, segments, nextIndex, mergedData, nextChain);\n if (childMatch && (!bestMatch || childMatch.length > bestMatch.length)) {\n bestMatch = childMatch;\n }\n }\n\n if (nextIndex === segments.length) {\n if (!bestMatch || nextChain.length > bestMatch.length) {\n bestMatch = nextChain;\n }\n }\n }\n\n return bestMatch;\n}\n\nfunction matchRoutePath(\n routePath: string,\n segments: string[],\n startIndex: number,\n): { consumed: number } | null {\n if (routePath === '**') {\n return { consumed: Math.max(0, segments.length - startIndex) };\n }\n\n const parts = routePath.split('/').filter(Boolean);\n if (!parts.length) {\n return { consumed: 0 };\n }\n\n let consumed = 0;\n for (const part of parts) {\n const segment = segments[startIndex + consumed];\n if (segment === undefined) {\n return null;\n }\n\n if (part.startsWith(':') || part === segment) {\n consumed++;\n continue;\n }\n\n return null;\n }\n\n return { consumed };\n}\n\n//#endregion\n","//#region ---- Tab Title ----\n\nexport const AXP_TAB_BREADCRUMB_JOIN_SEPARATOR = ' - ';\n\nexport interface AXPTabTitleParts {\n prefix: string | null;\n leaf: string;\n}\n\n/** Joins breadcrumb segments for the stored tab title and tooltip full label. */\nexport function axpJoinTabTitleSegments(segments: string[]): string {\n return segments.join(AXP_TAB_BREADCRUMB_JOIN_SEPARATOR);\n}\n\n/** Derives compact tab label parts from structured breadcrumb segments. */\nexport function axpResolveTabTitleParts(\n tab: { titleSegments?: string[] },\n fallbackTitle: string,\n): AXPTabTitleParts {\n const segments = tab.titleSegments;\n if (!segments?.length) {\n return { prefix: null, leaf: fallbackTitle };\n }\n\n if (segments.length === 1) {\n return { prefix: null, leaf: segments[0] };\n }\n\n return {\n prefix: axpJoinTabTitleSegments(segments.slice(0, -1)),\n leaf: segments[segments.length - 1],\n };\n}\n\n//#endregion\n","import { Injectable, signal } from '@angular/core';\nimport type { AXPTabStructuredPreview } from './tab-preview.types';\n\n//#region ---- Tab Preview Service ----\n\n/**\n * In-memory structured previews for tab hover cards and dirty indicators.\n * Populated by active/cached pages via {@link AXPPageLayoutBaseComponent}.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPTabPreviewService {\n //#region ---- State ----\n\n private readonly previewMap = signal<Readonly<Record<string, AXPTabStructuredPreview>>>({});\n\n readonly previews = this.previewMap.asReadonly();\n\n //#endregion\n\n //#region ---- Public API ----\n\n setPreview(key: string, preview: AXPTabStructuredPreview): void {\n this.previewMap.update((current) => ({\n ...current,\n [key]: preview,\n }));\n }\n\n patchPreview(key: string, patch: Partial<AXPTabStructuredPreview>): void {\n this.previewMap.update((current) => {\n const existing = current[key];\n if (!existing) {\n if (!patch.url) {\n return current;\n }\n\n return {\n ...current,\n [key]: {\n title: patch.title ?? '',\n url: patch.url,\n icon: patch.icon,\n subtitle: patch.subtitle,\n isDirty: patch.isDirty ?? false,\n breadcrumbTrail: patch.breadcrumbTrail ?? [],\n },\n };\n }\n\n return {\n ...current,\n [key]: {\n ...existing,\n ...patch,\n },\n };\n });\n }\n\n getPreview(key: string): AXPTabStructuredPreview | undefined {\n return this.previewMap()[key];\n }\n\n isTabDirty(key: string): boolean {\n return !!this.previewMap()[key]?.isDirty;\n }\n\n clearPreview(key: string): void {\n this.previewMap.update((current) => {\n if (!(key in current)) {\n return current;\n }\n\n const next = { ...current };\n delete next[key];\n return next;\n });\n }\n\n clearPreviews(keys: Iterable<string>): void {\n const keySet = new Set(keys);\n if (!keySet.size) {\n return;\n }\n\n this.previewMap.update((current) => {\n const next: Record<string, AXPTabStructuredPreview> = { ...current };\n let changed = false;\n\n for (const key of keySet) {\n if (key in next) {\n delete next[key];\n changed = true;\n }\n }\n\n return changed ? next : current;\n });\n }\n\n clearAll(): void {\n this.previewMap.set({});\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Tab Route Policy ----\n\nconst EXCLUDED_PATH_PREFIXES = ['/auth', '/error'] as const;\n\nconst EXCLUDED_PATH_PATTERNS: RegExp[] = [\n /^\\/assessment\\/fill\\//i,\n /^\\/forms\\//i,\n];\n\n/**\n * Returns true when the URL represents an in-app page that may appear in the tab bar.\n */\nexport function axpIsTabEligibleUrl(url: string): boolean {\n const pathOnly = url.split('?')[0].split('#')[0].trim();\n if (!pathOnly || pathOnly === '/') {\n return false;\n }\n\n const normalized = pathOnly.startsWith('/') ? pathOnly : `/${pathOnly}`;\n\n if (EXCLUDED_PATH_PREFIXES.some((prefix) => normalized.startsWith(prefix))) {\n return false;\n }\n\n if (EXCLUDED_PATH_PATTERNS.some((pattern) => pattern.test(normalized))) {\n return false;\n }\n\n return true;\n}\n\n//#endregion\n","import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPDeviceService } from '@acorex-platform/framework-client/core';\nimport { computed, DestroyRef, effect, inject, Injectable, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, NavigationExtras, Router } from '@angular/router';\nimport { cloneDeep, defaultTo } from 'lodash-es';\nimport { filter } from 'rxjs/operators';\nimport { AXPCommonSettings } from '../configs/common-settings.key';\nimport { AXPHomePageService } from '../home-page/home-page.service';\nimport { axpFindMenuItemByRoute } from '../layout/menu/menu-route-matcher';\nimport { AXPMenuService } from '../layout/menu/menu.service';\nimport { AXPSettingsService } from '../settings/settings.service';\nimport { AXPUnsavedChangesConfirmService } from '../settings/unsaved-changes-confirm.service';\nimport { axpNavigateAppPath } from '../utils/app-path-navigation.util';\nimport { axpFallbackTabTitle, normalizeRouterUrl } from './tab-key.util';\nimport { axpJoinTabTitleSegments } from './tab-title.util';\nimport {\n AXP_HOME_TAB_KEY,\n type AXPNavigationMode,\n type AXPTabCloseConfirm,\n type AXPTabDescriptor,\n type AXPTabSessionState,\n} from './tab-navigation.types';\nimport { AXPTabPreviewService } from './tab-preview.service';\nimport { AXPTabRouteCacheRegistry } from './tab-route-cache.registry';\nimport { axpIsTabEligibleUrl } from './tab-route-policy';\nimport { axpResolveTabKey } from './tab-route-resolver';\n\n//#region ---- Constants ----\n\nconst SESSION_STORAGE_PREFIX = 'AXP_TAB_NAV';\n\n//#endregion\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPTabNavigationService {\n //#region ---- Services & Dependencies ----\n\n private readonly router = inject(Router);\n private readonly settingsService = inject(AXPSettingsService);\n private readonly deviceService = inject(AXPDeviceService);\n private readonly menuService = inject(AXPMenuService);\n private readonly homePageService = inject(AXPHomePageService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly routeCacheRegistry = inject(AXPTabRouteCacheRegistry);\n private readonly tabPreviewService = inject(AXPTabPreviewService);\n private readonly unsavedChangesConfirm = inject(AXPUnsavedChangesConfirmService);\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ---- State ----\n\n private readonly navigationMode = signal<AXPNavigationMode>('simple');\n private readonly maxOpenTabs = signal(5);\n private readonly tabs = signal<AXPTabDescriptor[]>([]);\n private readonly activeTabKey = signal<string | null>(null);\n private suppressNavigationSync = false;\n\n //#endregion\n\n //#region ---- Computed ----\n\n /** Effective mode: mobile always uses simple navigation. */\n readonly effectiveMode = computed<AXPNavigationMode>(() => {\n if (this.deviceService.isSmall()) {\n return 'simple';\n }\n return this.navigationMode();\n });\n\n readonly isTabBarVisible = computed(() => this.effectiveMode() === 'tabular' && this.tabs().length > 0);\n\n readonly tabList = this.tabs.asReadonly();\n readonly activeKey = this.activeTabKey.asReadonly();\n\n //#endregion\n\n //#region ---- Lifecycle ----\n\n constructor() {\n void this.loadSettings();\n this.bindRouterEvents();\n this.bindSettingsChanges();\n this.bindSessionChanges();\n this.bindRouteCacheSync();\n }\n\n //#endregion\n\n //#region ---- Public API ----\n\n /** Navigates to a path, opening or activating a tab when tabular mode is active. */\n async navigate(path: string, extras?: NavigationExtras): Promise<boolean> {\n const normalizedPath = normalizeRouterUrl(path);\n\n if (this.effectiveMode() === 'simple' || !axpIsTabEligibleUrl(normalizedPath)) {\n return axpNavigateAppPath(this.router, normalizedPath, extras);\n }\n\n await this.openOrActivateTab(normalizedPath);\n return true;\n }\n\n /** Opens a tab or activates an existing tab with the same key. */\n async openOrActivateTab(url: string, title?: string): Promise<void> {\n if (this.effectiveMode() === 'simple') {\n await axpNavigateAppPath(this.router, url);\n return;\n }\n\n const normalizedUrl = normalizeRouterUrl(url);\n if (!axpIsTabEligibleUrl(normalizedUrl)) {\n await axpNavigateAppPath(this.router, normalizedUrl);\n return;\n }\n\n await this.ensureHomeTab();\n\n if (this.isHomePageUrl(normalizedUrl)) {\n await this.activateTabKey(AXP_HOME_TAB_KEY, normalizedUrl);\n return;\n }\n\n const resolvedKey = axpResolveTabKey(this.router, normalizedUrl);\n const existing = this.findTabForUrl(normalizedUrl);\n\n if (existing) {\n if (existing.key !== resolvedKey) {\n this.migrateTabKey(existing.key, resolvedKey);\n }\n this.updateTabUrl(resolvedKey, normalizedUrl);\n await this.activateTabKey(resolvedKey, normalizedUrl);\n return;\n }\n\n // Navigate first so scoped tab keys (`data.tab`) resolve from the live route snapshot.\n this.suppressNavigationSync = true;\n try {\n await axpNavigateAppPath(this.router, normalizedUrl);\n const key = axpResolveTabKey(this.router);\n const postNavExisting = this.findTabForUrl(normalizedUrl);\n\n if (postNavExisting) {\n if (postNavExisting.key !== key) {\n this.migrateTabKey(postNavExisting.key, key);\n }\n this.updateTabUrl(key, normalizedUrl);\n this.touchTab(key);\n this.activeTabKey.set(key);\n this.persistSession();\n return;\n }\n\n this.insertTab(this.createTabDescriptor(normalizedUrl, title, key));\n this.activeTabKey.set(key);\n this.persistSession();\n } finally {\n this.suppressNavigationSync = false;\n }\n }\n\n /**\n * Activates a tab and navigates to its URL. The previously active page is detached and cached by\n * the reuse strategy, so its state is preserved; this tab's cached instance is reattached when\n * available instead of being re-rendered.\n *\n * @param suspendDeactivateGuard When true (default for tab switches), unsaved-changes prompts are\n * skipped so switching tabs keeps a dirty page alive. Closing a tab passes false to keep the prompt.\n */\n async activateTabKey(key: string, urlOverride?: string, suspendDeactivateGuard = true): Promise<void> {\n const tab = this.tabs().find((item) => item.key === key);\n if (!tab) {\n return;\n }\n\n const targetUrl = urlOverride ?? tab.url;\n this.touchTab(key);\n this.activeTabKey.set(key);\n this.persistSession();\n\n const navigate = async (): Promise<void> => {\n this.suppressNavigationSync = true;\n try {\n await this.router.navigateByUrl(targetUrl);\n } finally {\n this.suppressNavigationSync = false;\n }\n };\n\n if (suspendDeactivateGuard) {\n await this.routeCacheRegistry.runWithSuspendedDeactivateGuards(navigate);\n return;\n }\n\n await navigate();\n }\n\n /** Closes a tab and navigates to a neighbor when the active tab is closed. */\n async closeTab(key: string): Promise<void> {\n await this.closeTabs([key]);\n }\n\n /** Closes every closable tab except the given key (pinned tabs are kept). */\n async closeOtherTabs(keepKey: string): Promise<void> {\n const keys = this.tabs()\n .filter((tab) => tab.closable && !tab.pinned && tab.key !== keepKey)\n .map((tab) => tab.key);\n await this.closeTabs(keys);\n }\n\n /** Closes all closable tabs (pinned tabs are kept). */\n async closeAllTabs(): Promise<void> {\n const keys = this.tabs()\n .filter((tab) => tab.closable && !tab.pinned)\n .map((tab) => tab.key);\n await this.closeTabs(keys);\n }\n\n /** Toggles whether a tab stays pinned in the strip (home tab is always pinned). */\n toggleTabPinned(key: string): void {\n if (key === AXP_HOME_TAB_KEY) {\n return;\n }\n\n this.tabs.update((items) => {\n const updated = items.map((tab) => {\n if (tab.key !== key) {\n return tab;\n }\n\n const pinned = !tab.pinned;\n return {\n ...tab,\n pinned,\n closable: !pinned,\n };\n });\n\n return this.normalizeTabOrder(updated);\n });\n this.persistSession();\n }\n\n /**\n * Reorders tabs after drag-and-drop. Home stays first; pinned and unpinned tabs cannot cross groups.\n */\n reorderTabs(previousIndex: number, currentIndex: number): void {\n if (previousIndex === currentIndex) {\n return;\n }\n\n const items = this.tabs();\n if (previousIndex < 0 || currentIndex < 0 || previousIndex >= items.length || currentIndex >= items.length) {\n return;\n }\n\n const moving = items[previousIndex];\n if (moving.key === AXP_HOME_TAB_KEY) {\n return;\n }\n\n const lastPinnedIndex = this.getLastPinnedTabIndex(items);\n let targetIndex = currentIndex;\n\n if (moving.pinned) {\n if (targetIndex === 0) {\n return;\n }\n targetIndex = Math.max(1, Math.min(targetIndex, lastPinnedIndex));\n } else {\n const firstUnpinnedIndex = lastPinnedIndex + 1;\n if (firstUnpinnedIndex >= items.length) {\n return;\n }\n targetIndex = Math.max(firstUnpinnedIndex, Math.min(targetIndex, items.length - 1));\n }\n\n if (previousIndex === targetIndex) {\n return;\n }\n\n const next = [...items];\n const [removed] = next.splice(previousIndex, 1);\n next.splice(targetIndex, 0, removed);\n this.tabs.set(next);\n this.persistSession();\n }\n\n /** Updates a tab title from the current page chrome (e.g. breadcrumb trail). */\n syncTabTitle(key: string, titleOrSegments: string | string[]): void {\n if (this.effectiveMode() === 'simple') {\n return;\n }\n\n if (!this.tabs().some((tab) => tab.key === key)) {\n return;\n }\n\n const segments = Array.isArray(titleOrSegments) ? titleOrSegments : undefined;\n const title = (Array.isArray(titleOrSegments) ? axpJoinTabTitleSegments(titleOrSegments) : titleOrSegments).trim();\n if (!title || this.isGenericHomeTitle(title)) {\n return;\n }\n\n this.updateTabTitle(key, title, segments);\n }\n\n /** Updates a tab icon from the current page chrome or menu metadata. */\n syncTabIcon(key: string, icon: string): void {\n if (this.effectiveMode() === 'simple') {\n return;\n }\n\n if (!this.tabs().some((tab) => tab.key === key)) {\n return;\n }\n\n const normalized = icon.trim();\n if (!normalized) {\n return;\n }\n\n this.updateTabIcon(key, normalized);\n }\n\n //#endregion\n\n //#region ---- Bulk Tab Close ----\n\n /** Closes multiple tabs in one update; navigates once when the active tab is closed. */\n private async closeTabs(keys: string[]): Promise<void> {\n const uniqueKeys = [...new Set(keys)];\n if (!uniqueKeys.length) {\n return;\n }\n\n const closableKeySet = new Set(\n uniqueKeys.filter((key) => {\n const tab = this.tabs().find((item) => item.key === key);\n return !!tab?.closable && !tab.pinned;\n }),\n );\n\n if (!closableKeySet.size) {\n return;\n }\n\n const activeKey = this.activeTabKey();\n const backgroundKeys = [...closableKeySet].filter((key) => key !== activeKey);\n\n for (const key of backgroundKeys) {\n if (!(await this.confirmBackgroundTabClose(key))) {\n closableKeySet.delete(key);\n }\n }\n\n if (!closableKeySet.size) {\n return;\n }\n\n const currentTabs = this.tabs();\n const wasActiveClosed = !!activeKey && closableKeySet.has(activeKey);\n const closedActiveIndex = wasActiveClosed ? currentTabs.findIndex((item) => item.key === activeKey) : -1;\n const nextTabs = currentTabs.filter((item) => !closableKeySet.has(item.key));\n\n if (wasActiveClosed) {\n const navigated = await this.navigateAwayBeforeClosingActiveTab(closedActiveIndex, nextTabs);\n if (!navigated) {\n return;\n }\n }\n\n this.tabs.set(nextTabs);\n this.tabPreviewService.clearPreviews(closableKeySet);\n this.persistSession();\n }\n\n //#endregion\n\n //#region ---- Tab Close Helpers ----\n\n /**\n * Prompts before closing a cached background tab. Uses the page's {@link AXPTabCloseConfirm}\n * hook when available, otherwise falls back to the tab preview dirty flag.\n */\n private async confirmBackgroundTabClose(key: string): Promise<boolean> {\n const instance = this.routeCacheRegistry.getComponentInstance<AXPTabCloseConfirm>(key);\n if (instance && typeof instance.onBeforeTabClose === 'function') {\n return instance.onBeforeTabClose();\n }\n\n return this.unsavedChangesConfirm.confirmIfDirty(this.tabPreviewService.isTabDirty(key), {\n approveLeaveOnConfirm: false,\n });\n }\n\n //#endregion\n\n //#region ---- Tab Close Navigation ----\n\n /**\n * Navigates away from the active tab before it is removed so canDeactivate runs while the tab is still visible.\n * Returns false when navigation was cancelled (e.g. unsaved-changes confirmation declined).\n */\n private async navigateAwayBeforeClosingActiveTab(\n closedActiveIndex: number,\n remainingTabs: AXPTabDescriptor[],\n ): Promise<boolean> {\n const fallbackIndex = this.resolveFallbackTabIndex(closedActiveIndex, remainingTabs);\n const fallback = fallbackIndex >= 0 ? remainingTabs[fallbackIndex] : undefined;\n\n let targetKey: string;\n let targetUrl: string;\n\n if (fallback) {\n targetKey = fallback.key;\n targetUrl = fallback.url;\n } else {\n await this.ensureHomeTab();\n const home = this.tabs().find((item) => item.key === AXP_HOME_TAB_KEY);\n if (!home) {\n return false;\n }\n targetKey = home.key;\n targetUrl = home.url;\n }\n\n this.suppressNavigationSync = true;\n try {\n const navigated = await this.router.navigateByUrl(targetUrl);\n if (!navigated) {\n return false;\n }\n } finally {\n this.suppressNavigationSync = false;\n }\n\n this.activeTabKey.set(targetKey);\n this.touchTab(targetKey);\n return true;\n }\n\n /** Prefers the tab to the right after removal, then the tab to the left (browser-like). */\n private resolveFallbackTabIndex(closedIndex: number, remainingTabs: AXPTabDescriptor[]): number {\n if (!remainingTabs.length) {\n return -1;\n }\n\n if (closedIndex < remainingTabs.length) {\n return closedIndex;\n }\n\n return closedIndex - 1;\n }\n\n //#endregion\n\n //#region ---- Route Cache Sync ----\n\n /**\n * Keeps the route cache registry aligned with the current navigation mode and the set of open\n * tabs. Cached page instances for closed/evicted tabs are destroyed by the registry.\n */\n private bindRouteCacheSync(): void {\n effect(() => {\n this.routeCacheRegistry.setEnabled(this.effectiveMode() === 'tabular');\n this.routeCacheRegistry.syncOpenKeys(\n this.tabs().map((tab) => tab.key),\n this.tabs().map((tab) => tab.url),\n );\n });\n }\n\n //#endregion\n\n //#region ---- Router Sync ----\n\n private bindRouterEvents(): void {\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((event: NavigationEnd) => {\n void this.handleNavigationEnd(event.urlAfterRedirects);\n });\n }\n\n private async handleNavigationEnd(url: string): Promise<void> {\n if (this.suppressNavigationSync) {\n return;\n }\n\n if (this.effectiveMode() === 'simple') {\n return;\n }\n\n const normalizedUrl = normalizeRouterUrl(url);\n if (!axpIsTabEligibleUrl(normalizedUrl)) {\n return;\n }\n\n await this.ensureHomeTab();\n\n if (this.isHomePageUrl(normalizedUrl)) {\n this.activateHomeTabForUrl(normalizedUrl);\n return;\n }\n\n const key = axpResolveTabKey(this.router, normalizedUrl);\n const existing = this.findTabForUrl(normalizedUrl);\n\n if (existing) {\n if (existing.key !== key) {\n this.migrateTabKey(existing.key, key);\n }\n this.updateTabUrl(key, normalizedUrl);\n this.touchTab(key);\n this.activeTabKey.set(key);\n this.persistSession();\n return;\n }\n\n this.insertTab(this.createTabDescriptor(normalizedUrl, undefined, key));\n this.activeTabKey.set(key);\n this.persistSession();\n }\n\n //#endregion\n\n //#region ---- Settings ----\n\n private async loadSettings(): Promise<void> {\n const [mode, maxTabs] = await Promise.all([\n this.settingsService.get<AXPNavigationMode>(AXPCommonSettings.NavigationMode),\n this.settingsService.get<number>(AXPCommonSettings.MaxOpenTabs),\n ]);\n\n this.navigationMode.set(mode === 'tabular' ? 'tabular' : 'simple');\n this.maxOpenTabs.set(this.normalizeMaxTabs(maxTabs));\n await this.restoreSessionIfNeeded();\n }\n\n private bindSettingsChanges(): void {\n this.settingsService.onChanged.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event) => {\n if (event.keys.includes(AXPCommonSettings.NavigationMode)) {\n const raw = event.values[AXPCommonSettings.NavigationMode] as AXPNavigationMode;\n const newMode: AXPNavigationMode = raw === 'tabular' ? 'tabular' : 'simple';\n if (newMode !== this.navigationMode()) {\n this.navigationMode.set(newMode);\n if (this.effectiveMode() === 'simple') {\n this.clearSession();\n } else {\n void this.ensureHomeTab().then(() => this.syncCurrentRouteAsTab());\n }\n }\n }\n\n if (event.keys.includes(AXPCommonSettings.MaxOpenTabs)) {\n this.maxOpenTabs.set(this.normalizeMaxTabs(event.values[AXPCommonSettings.MaxOpenTabs] as number));\n this.enforceMaxTabs();\n this.persistSession();\n }\n });\n }\n\n private bindSessionChanges(): void {\n this.sessionService.user$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n void this.restoreSessionIfNeeded();\n });\n }\n\n //#endregion\n\n //#region ---- Tab Management ----\n\n private async ensureHomeTab(): Promise<void> {\n const homePath = this.resolveHomePath();\n if (!homePath) {\n return;\n }\n\n const homeUrl = normalizeRouterUrl(homePath);\n const homeKey = AXP_HOME_TAB_KEY;\n const existing = this.tabs().find((tab) => tab.key === homeKey);\n\n if (existing) {\n this.tabs.update((items) =>\n items.map((tab) =>\n tab.key === homeKey\n ? {\n ...tab,\n url: homeUrl,\n title: this.isGenericHomeTitle(tab.title) ? this.resolveHomeTitle() : tab.title,\n icon: this.resolveTabIcon(homeUrl, 'fa-light fa-house'),\n }\n : tab,\n ),\n );\n return;\n }\n\n const now = Date.now();\n const homeTab: AXPTabDescriptor = {\n key: homeKey,\n url: homeUrl,\n title: this.resolveHomeTitle(),\n icon: this.resolveTabIcon(homeUrl, 'fa-light fa-house'),\n pinned: true,\n closable: false,\n openedAt: now,\n lastActivatedAt: now,\n };\n\n this.tabs.update((items) => this.normalizeTabOrder([homeTab, ...items.filter((tab) => tab.key !== homeKey)]));\n }\n\n private insertTab(tab: AXPTabDescriptor): void {\n if (this.isHomePageUrl(tab.url)) {\n this.activateHomeTabForUrl(tab.url);\n return;\n }\n\n this.tabs.update((items) => {\n const withoutDuplicate = items.filter((item) => {\n if (item.key === tab.key) {\n return false;\n }\n\n return axpResolveTabKey(this.router, item.url) !== tab.key;\n });\n return this.normalizeTabOrder([...withoutDuplicate, tab]);\n });\n this.enforceMaxTabs();\n }\n\n /** Home first; preserves session order for the remaining tabs. */\n private ensureHomeTabFirst(items: AXPTabDescriptor[]): AXPTabDescriptor[] {\n const home = items.find((tab) => tab.key === AXP_HOME_TAB_KEY);\n const others = items.filter((tab) => tab.key !== AXP_HOME_TAB_KEY);\n return home ? [home, ...others] : items;\n }\n\n private getLastPinnedTabIndex(items: ReadonlyArray<AXPTabDescriptor>): number {\n for (let index = items.length - 1; index >= 0; index -= 1) {\n if (items[index]?.pinned) {\n return index;\n }\n }\n\n return 0;\n }\n\n /** Home first, then other pinned tabs, then unpinned tabs (stable by openedAt within each group). */\n private normalizeTabOrder(items: AXPTabDescriptor[]): AXPTabDescriptor[] {\n const home = items.find((tab) => tab.key === AXP_HOME_TAB_KEY);\n const pinned = items.filter((tab) => tab.key !== AXP_HOME_TAB_KEY && tab.pinned);\n const unpinned = items.filter((tab) => tab.key !== AXP_HOME_TAB_KEY && !tab.pinned);\n const byOpenedAt = (a: AXPTabDescriptor, b: AXPTabDescriptor) => a.openedAt - b.openedAt;\n\n return [...(home ? [home] : []), ...pinned.sort(byOpenedAt), ...unpinned.sort(byOpenedAt)];\n }\n\n private enforceMaxTabs(): void {\n const limit = this.maxOpenTabs();\n let current = this.tabs();\n\n while (current.length > limit) {\n const evictionCandidate = [...current]\n .filter((tab) => tab.closable && !tab.pinned && tab.key !== this.activeTabKey())\n .filter((tab) => !this.tabPreviewService.isTabDirty(tab.key))\n .sort((a, b) => a.lastActivatedAt - b.lastActivatedAt)[0];\n\n if (!evictionCandidate) {\n break;\n }\n\n current = current.filter((tab) => tab.key !== evictionCandidate.key);\n }\n\n this.tabs.set(current);\n }\n\n private createTabDescriptor(url: string, title?: string, keyOverride?: string): AXPTabDescriptor {\n const now = Date.now();\n const key = keyOverride ?? axpResolveTabKey(this.router, url);\n return {\n key,\n url,\n title: title ?? this.resolveTabTitle(url),\n icon: this.resolveTabIcon(url),\n pinned: false,\n closable: true,\n openedAt: now,\n lastActivatedAt: now,\n };\n }\n\n /** Finds a tab by scoped key or legacy full-path key for the same URL. */\n private findTabForUrl(url: string): AXPTabDescriptor | undefined {\n if (this.isHomePageUrl(url)) {\n return this.tabs().find((tab) => tab.key === AXP_HOME_TAB_KEY);\n }\n\n const resolvedKey = axpResolveTabKey(this.router, url);\n return this.tabs().find(\n (tab) =>\n tab.key !== AXP_HOME_TAB_KEY &&\n (tab.key === resolvedKey || axpResolveTabKey(this.router, tab.url) === resolvedKey),\n );\n }\n\n /** True when the URL is the configured application home page (e.g. dashboard). */\n private isHomePageUrl(url: string): boolean {\n const homeUrl = this.resolveHomeUrl();\n if (!homeUrl) {\n return false;\n }\n\n return normalizeRouterUrl(url) === homeUrl;\n }\n\n private resolveHomeUrl(): string | null {\n const homePath = this.resolveHomePath();\n if (!homePath) {\n return null;\n }\n\n return normalizeRouterUrl(homePath);\n }\n\n /** Activates the pinned home tab for a home-page URL instead of opening a duplicate tab. */\n private activateHomeTabForUrl(url: string): void {\n this.updateTabUrl(AXP_HOME_TAB_KEY, normalizeRouterUrl(url));\n this.touchTab(AXP_HOME_TAB_KEY);\n this.activeTabKey.set(AXP_HOME_TAB_KEY);\n this.persistSession();\n }\n\n /** Drops non-home tabs that duplicate the home page URL after session restore. */\n private removeDuplicateHomeUrlTabs(tabs: AXPTabDescriptor[]): AXPTabDescriptor[] {\n const homeUrl = this.resolveHomeUrl();\n if (!homeUrl) {\n return tabs;\n }\n\n return tabs.filter((tab) => tab.key === AXP_HOME_TAB_KEY || normalizeRouterUrl(tab.url) !== homeUrl);\n }\n\n /** Rewrites a tab key when route-scope resolution changes (e.g. profile sub-routes). */\n private migrateTabKey(fromKey: string, toKey: string): void {\n if (fromKey === toKey) {\n return;\n }\n\n if (this.activeTabKey() === fromKey) {\n this.activeTabKey.set(toKey);\n }\n\n this.tabs.update((items) => {\n const tab = items.find((item) => item.key === fromKey);\n if (!tab) {\n return items;\n }\n\n const without = items.filter((item) => item.key !== fromKey && item.key !== toKey);\n return this.normalizeTabOrder([...without, { ...tab, key: toKey }]);\n });\n }\n\n /** Collapses restored tabs that share the same scoped route key. */\n private normalizeRestoredTabKeys(tabs: AXPTabDescriptor[]): AXPTabDescriptor[] {\n const byResolvedKey = new Map<string, AXPTabDescriptor>();\n\n for (const tab of tabs) {\n if (tab.key === AXP_HOME_TAB_KEY) {\n byResolvedKey.set(AXP_HOME_TAB_KEY, tab);\n continue;\n }\n\n const resolvedKey = axpResolveTabKey(this.router, tab.url);\n const normalized = { ...tab, key: resolvedKey };\n const existing = byResolvedKey.get(resolvedKey);\n\n if (!existing || normalized.lastActivatedAt > existing.lastActivatedAt) {\n byResolvedKey.set(resolvedKey, normalized);\n }\n }\n\n return [...byResolvedKey.values()];\n }\n\n private updateTabUrl(key: string, url: string): void {\n this.tabs.update((items) => items.map((tab) => (tab.key === key ? { ...tab, url } : tab)));\n }\n\n private updateTabTitle(key: string, title: string, titleSegments?: string[]): void {\n this.tabs.update((items) =>\n items.map((tab) => {\n if (tab.key !== key) {\n return tab;\n }\n\n const segmentsUnchanged =\n tab.titleSegments === titleSegments ||\n (tab.titleSegments?.length === titleSegments?.length &&\n tab.titleSegments?.every((segment, index) => segment === titleSegments?.[index]));\n\n if (tab.title === title && segmentsUnchanged) {\n return tab;\n }\n\n return { ...tab, title, titleSegments };\n }),\n );\n this.persistSession();\n }\n\n private updateTabIcon(key: string, icon: string): void {\n this.tabs.update((items) => items.map((tab) => (tab.key === key && tab.icon !== icon ? { ...tab, icon } : tab)));\n this.persistSession();\n }\n\n private touchTab(key: string): void {\n const now = Date.now();\n this.tabs.update((items) => items.map((tab) => (tab.key === key ? { ...tab, lastActivatedAt: now } : tab)));\n }\n\n private resolveTabTitle(url: string, fallback?: string): string {\n const match = axpFindMenuItemByRoute(this.menuService.items(), url);\n if (match?.item.text) {\n return match.item.text;\n }\n return fallback ?? axpFallbackTabTitle(url);\n }\n\n private resolveTabIcon(url: string, fallback = 'fa-light fa-window'): string {\n const match = axpFindMenuItemByRoute(this.menuService.items(), url);\n if (match?.item.icon?.trim()) {\n return match.item.icon.trim();\n }\n return fallback;\n }\n\n private resolveHomePath(): string {\n const current = this.homePageService.getCurrent();\n return current.path ? normalizeRouterUrl(current.path) : '';\n }\n\n private resolveHomeTitle(): string {\n const current = this.homePageService.getCurrent();\n return current.title || 'Home';\n }\n\n private isGenericHomeTitle(title: string): boolean {\n if (title === '@general:terms.interface.navigation.home') {\n return true;\n }\n\n const homeTitle = this.resolveHomeTitle().trim();\n return title === homeTitle;\n }\n\n private async syncCurrentRouteAsTab(): Promise<void> {\n if (this.effectiveMode() === 'simple') {\n return;\n }\n\n await this.ensureHomeTab();\n await this.handleNavigationEnd(this.router.url);\n }\n\n private normalizeMaxTabs(value: unknown): number {\n const parsed = Number(value);\n if (!Number.isFinite(parsed)) {\n return 5;\n }\n return Math.min(20, Math.max(2, Math.round(parsed)));\n }\n\n //#endregion\n\n //#region ---- Session Persistence ----\n\n private sessionStorageKey(): string | null {\n const userId = this.sessionService.user?.id;\n if (!userId) {\n return null;\n }\n return `${SESSION_STORAGE_PREFIX}(${userId})`;\n }\n\n private persistSession(): void {\n const key = this.sessionStorageKey();\n if (!key || this.effectiveMode() === 'simple') {\n return;\n }\n\n const payload: AXPTabSessionState = {\n tabs: cloneDeep(this.tabs()),\n activeTabKey: this.activeTabKey(),\n };\n sessionStorage.setItem(key, JSON.stringify(payload));\n }\n\n private clearSession(): void {\n const key = this.sessionStorageKey();\n if (key) {\n sessionStorage.removeItem(key);\n }\n this.tabs.set([]);\n this.activeTabKey.set(null);\n this.tabPreviewService.clearAll();\n }\n\n private async restoreSessionIfNeeded(): Promise<void> {\n if (this.effectiveMode() === 'simple') {\n return;\n }\n\n const storageKey = this.sessionStorageKey();\n if (!storageKey) {\n await this.ensureHomeTab();\n await this.syncCurrentRouteAsTab();\n return;\n }\n\n const raw = sessionStorage.getItem(storageKey);\n if (!raw) {\n await this.ensureHomeTab();\n await this.syncCurrentRouteAsTab();\n return;\n }\n\n try {\n const parsed = JSON.parse(raw) as AXPTabSessionState;\n const restoredTabs = this.removeDuplicateHomeUrlTabs(\n this.normalizeRestoredTabKeys(defaultTo(parsed.tabs, []).filter((tab) => tab?.key && tab?.url)),\n );\n this.tabs.set(this.ensureHomeTabFirst(restoredTabs));\n await this.ensureHomeTab();\n\n const activeKey = parsed.activeTabKey ?? this.tabs()[this.tabs().length - 1]?.key ?? AXP_HOME_TAB_KEY;\n this.activeTabKey.set(activeKey);\n\n const activeTab = this.tabs().find((tab) => tab.key === activeKey);\n if (activeTab && normalizeRouterUrl(this.router.url) !== normalizeRouterUrl(activeTab.url)) {\n this.suppressNavigationSync = true;\n try {\n await this.router.navigateByUrl(activeTab.url);\n } finally {\n this.suppressNavigationSync = false;\n }\n }\n } catch {\n await this.ensureHomeTab();\n await this.syncCurrentRouteAsTab();\n }\n }\n\n //#endregion\n}\n","import { DOCUMENT } from '@angular/common';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { DestroyRef, Injectable, effect, inject, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { filter } from 'rxjs/operators';\nimport { AXPPlatformBrandingService } from '../platform-branding/platform-branding.service';\nimport { axpFindMenuItemByRoute } from '../layout/menu/menu-route-matcher';\nimport { AXPMenuService } from '../layout/menu/menu.service';\nimport { axpResolveTabKey } from '../tab-navigation/tab-route-resolver';\nimport { AXPTabNavigationService } from '../tab-navigation/tab-navigation.service';\nimport type { AXPNavigationMode } from '../tab-navigation/tab-navigation.types';\n\ninterface AXPSimpleModePageTitleState {\n routeKey: string;\n title: string;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPBrowserTitleService {\n //#region ---- Services & Dependencies ----\n\n private readonly document = inject(DOCUMENT);\n private readonly translateService = inject(AXTranslationService);\n private readonly tabNavigation = inject(AXPTabNavigationService);\n private readonly menuService = inject(AXPMenuService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly platformBranding = inject(AXPPlatformBrandingService);\n private readonly router = inject(Router);\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ---- State ----\n\n private readonly simpleModePageTitle = signal<AXPSimpleModePageTitleState | null>(null);\n private readonly localeRevision = signal(0);\n private readonly sessionRevision = signal(0);\n private readonly routeRevision = signal(0);\n\n //#endregion\n\n //#region ---- Lifecycle ----\n\n constructor() {\n this.translateService.langChanges$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n this.localeRevision.update((value) => value + 1);\n });\n\n this.sessionService.application$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n this.sessionRevision.update((value) => value + 1);\n });\n\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(() => {\n this.routeRevision.update((value) => value + 1);\n });\n\n effect(() => {\n this.localeRevision();\n this.sessionRevision();\n this.routeRevision();\n const mode = this.tabNavigation.effectiveMode();\n const simpleModePageTitle = this.simpleModePageTitle();\n\n if (mode === 'tabular') {\n const activeKey = this.tabNavigation.activeKey();\n const tabs = this.tabNavigation.tabList();\n untracked(() => {\n void this.syncDocumentTitle(mode, activeKey, tabs, simpleModePageTitle);\n });\n return;\n }\n\n untracked(() => {\n void this.syncDocumentTitle(mode, null, [], simpleModePageTitle);\n });\n });\n }\n\n //#endregion\n\n //#region ---- Public API ----\n\n /** Publishes the resolved page title for the given route key (ignored in tabular mode). */\n setSimpleModePageTitle(title: string | null, routeKey: string): void {\n if (!routeKey.trim()) {\n return;\n }\n\n if (!title?.trim()) {\n const current = this.simpleModePageTitle();\n if (current?.routeKey === routeKey) {\n this.simpleModePageTitle.set(null);\n }\n return;\n }\n\n this.simpleModePageTitle.set({\n routeKey: routeKey.trim(),\n title: title.trim(),\n });\n }\n\n //#endregion\n\n //#region ---- Title Sync ----\n\n private async syncDocumentTitle(\n mode: AXPNavigationMode,\n activeTabKey: string | null,\n tabs: ReturnType<AXPTabNavigationService['tabList']>,\n simpleModePageTitle: AXPSimpleModePageTitleState | null,\n ): Promise<void> {\n const routeTitle =\n mode === 'tabular'\n ? await this.resolveTabularRouteTitle(activeTabKey, tabs)\n : await this.resolveSimpleRouteTitle(simpleModePageTitle);\n\n const appTitle = await this.resolveApplicationTitle();\n const nextTitle = this.buildDocumentTitle(routeTitle, appTitle);\n\n if (this.document?.title !== nextTitle) {\n this.document.title = nextTitle;\n }\n }\n\n private async resolveTabularRouteTitle(\n activeTabKey: string | null,\n tabs: ReturnType<AXPTabNavigationService['tabList']>,\n ): Promise<string | null> {\n if (!activeTabKey) {\n return null;\n }\n\n const tab = tabs.find((item) => item.key === activeTabKey);\n if (!tab?.title?.trim()) {\n return null;\n }\n\n return this.resolveLocalizedText(tab.title);\n }\n\n private async resolveSimpleRouteTitle(\n simpleModePageTitle: AXPSimpleModePageTitleState | null,\n ): Promise<string | null> {\n const currentRouteKey = axpResolveTabKey(this.router);\n if (simpleModePageTitle?.routeKey === currentRouteKey && simpleModePageTitle.title) {\n return simpleModePageTitle.title;\n }\n\n return this.resolveMenuRouteTitle(this.router.url);\n }\n\n private async resolveMenuRouteTitle(url: string): Promise<string | null> {\n const match = axpFindMenuItemByRoute(this.menuService.items(), url);\n if (!match?.item.text?.trim()) {\n return null;\n }\n\n return this.resolveLocalizedText(match.item.text);\n }\n\n private async resolveApplicationTitle(): Promise<string> {\n return this.platformBranding.resolveApplicationTitle();\n }\n\n private async resolveLocalizedText(value: string): Promise<string | null> {\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n if (trimmed.startsWith('@')) {\n return (await this.translateService.translateAsync(trimmed)) || trimmed;\n }\n\n return trimmed;\n }\n\n private buildDocumentTitle(routeTitle: string | null, appTitle: string): string {\n const route = routeTitle?.trim();\n const app = appTitle.trim();\n\n if (route && app) {\n return `${route} | ${app}`;\n }\n\n return route || app;\n }\n\n //#endregion\n}\n","export abstract class AXPDataProvider {\n abstract insertOne(entity: any, entityItem: any): Promise<any>;\n abstract insertMany(entity: any, entityList: any): Promise<any>;\n abstract getOne(entity: any, id: string): Promise<any>;\n abstract getMany(entity: any, params?: any): Promise<any>;\n abstract updateOne(entity: any, id?: string, data?: { [key: string]: any }): Promise<any>;\n abstract deleteOne(entity: any, id: string): Promise<any>;\n abstract getFirst(entity: any): Promise<any>;\n abstract uploadFile(file: File, title: string, customUrl?: string): Promise<string>;\n abstract updateFile(id:string,file: File, title: string, customUrl?: string): Promise<string>;\n abstract uploadMultipleFiles(files: File[], title: string): Promise<string[]>;\n abstract viewFile(id: string, name: string): Promise<Blob>;\n abstract downloadFile(id: string, name: string): Promise<Blob>;\n}\n","import { AXDataSourceOperator } from '@acorex/cdk/common';\nimport { Injectable } from '@angular/core';\n\nexport abstract class AXPCustomOperatorService {\n abstract getCustomOperators(): { [key: string]: AXDataSourceOperator };\n}\n\n@Injectable()\nexport class AXPCustomOperatorServiceImpl extends AXPCustomOperatorService {\n getCustomOperators(): { [key: string]: AXDataSourceOperator } {\n return {};\n }\n}\n","import { AXDataSourceFilterOption, AXDataSourceOperator } from '@acorex/cdk/common';\nimport { inject, Injectable } from '@angular/core';\nimport { ALL_DEFAULT_OPERATORS } from '../app';\nimport { AXPCustomOperatorService } from './operators.service';\n\nexport abstract class AXPFilterOperatorMiddlewareService {\n /**\n * Middleware to transform selected filters into corresponding operators.\n * @param filters Array of selected filters (e.g., user input).\n * @param customOperators Optional custom operators map to override default operators.\n * @returns Transformed filters based on custom or default operators.\n */\n abstract transformFilters(filters: AXDataSourceFilterOption[]): AXDataSourceFilterOption[];\n\n /**\n * Helper method to transform a single filter. This handles recursion for nested filters.\n * @param filter A single filter object.\n * @returns Transformed filter.\n */\n abstract transformFilter(filters: AXDataSourceFilterOption): AXDataSourceFilterOption;\n\n abstract getOperator(key: string): AXDataSourceOperator;\n}\n\n@Injectable()\nexport class AXPFilterOperatorMiddlewareServiceImpl extends AXPFilterOperatorMiddlewareService {\n private customOperatorService = inject(AXPCustomOperatorService);\n\n private operators: { [key: string]: AXDataSourceOperator } = {\n ...this.getDefaultOperators(),\n ...this.customOperatorService.getCustomOperators(),\n };\n\n transformFilters(filters: AXDataSourceFilterOption[]): AXDataSourceFilterOption[] {\n return filters.map((filter) => this.transformFilter(filter));\n }\n\n transformFilter(filter: AXDataSourceFilterOption): AXDataSourceFilterOption {\n const { operator, value, filters, field } = filter;\n // Find the operator (either default or custom)\n const filterOperator = this.operators[operator?.type ?? ''] || null;\n\n // Start by transforming the filter itself\n const transformedFilter: AXDataSourceFilterOption = {\n ...filter, // Keep the original filter structure\n operator: filterOperator ? filterOperator : operator, // Add operator name\n };\n\n // If the filter contains nested filters, recursively transform them\n if (filters && filters.length > 0) {\n transformedFilter.filters = this.transformFilters(filters); // Recursively transform nested filters\n }\n\n return transformedFilter;\n }\n\n getOperator(key: string) {\n return this.operators[key];\n }\n\n // Helper function to return the default operators\n private getDefaultOperators(): { [key: string]: AXDataSourceOperator } {\n return ALL_DEFAULT_OPERATORS.reduce(\n (acc, operator) => {\n acc[operator.name] = {\n type: operator.name as any,\n };\n return acc;\n },\n {} as { [key: string]: AXDataSourceOperator },\n );\n }\n}\n","import { Injectable, Injector } from \"@angular/core\";\nimport { AXPErrorHandler } from \"./error-handler.types\";\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AXPErrorHandlerRegistryService {\n private errorHandlers: AXPErrorHandler[] = [];\n\n constructor(private injector: Injector) {\n }\n\n register(...plugins: (new () => AXPErrorHandler)[]) {\n plugins.forEach(t => {\n const childInjector = Injector.create({ providers: [{ provide: t, useClass: t, deps: [] }], parent: this.injector });\n const handler = childInjector.get(t);\n if (handler) {\n this.errorHandlers.push(handler);\n }\n })\n }\n\n\n public get handlers(): AXPErrorHandler[] {\n return this.errorHandlers;\n }\n}","import { HttpErrorResponse } from '@angular/common/http';\nimport {\n AXP_PLATFORM_ERROR_CODES,\n AXPRequestError,\n mapUnknownToAXPErrorBody,\n type AXPRuntimeCommandResult,\n type AXPRequestErrorInfo,\n} from '@acorex-platform/framework-shared/core';\n\n//#region ---- Payload readers ----\n\nfunction readBodyRecord(body: unknown): Record<string, unknown> | null {\n if (body == null || typeof body !== 'object' || Array.isArray(body)) {\n return null;\n }\n return body as Record<string, unknown>;\n}\n\nfunction readPayload(body: unknown): Record<string, unknown> | null {\n const record = readBodyRecord(body);\n if (!record) {\n return null;\n }\n\n const nestedError = readBodyRecord(record['error']);\n if (nestedError && (nestedError['code'] != null || nestedError['message'] != null)) {\n return {\n ...record,\n ...nestedError,\n };\n }\n\n const nestedMessage = readBodyRecord(record['message']);\n if (nestedMessage && (nestedMessage['code'] != null || nestedMessage['message'] != null)) {\n return {\n ...record,\n ...nestedMessage,\n };\n }\n\n return record;\n}\n\nfunction readStringParam(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value : undefined;\n}\n\nfunction flattenDetailsParams(details: unknown): Record<string, string> {\n const record = readBodyRecord(details);\n if (!record) {\n return {};\n }\n const params: Record<string, string> = {};\n for (const key of ['jobId', 'status', 'scheduleId', 'field', 'name', 'entityName'] as const) {\n const value = readStringParam(record[key]);\n if (value) {\n params[key] = value;\n }\n }\n return params;\n}\n\nfunction isPayloadTooLargeHint(status?: number, code?: string, errorName?: string, message?: string): boolean {\n if (status === 413 || code === AXP_PLATFORM_ERROR_CODES.PAYLOAD_TOO_LARGE) {\n return true;\n }\n if (errorName && /payload.?too.?large/i.test(errorName)) {\n return true;\n }\n return /payload.?too.?large|request entity too large|file is too large|uploaded file is too large/i.test(\n message ?? '',\n );\n}\n\n//#endregion\n\n//#region ---- Extractors ----\n\nfunction extractFromHttpErrorResponse(error: HttpErrorResponse): AXPRequestErrorInfo | null {\n const payload = readPayload(error.error);\n if (!payload) {\n const fallbackMessage = error.message?.trim();\n if (!fallbackMessage && error.status !== 413) {\n return null;\n }\n const code = isPayloadTooLargeHint(error.status, undefined, undefined, fallbackMessage)\n ? AXP_PLATFORM_ERROR_CODES.PAYLOAD_TOO_LARGE\n : undefined;\n return {\n message: fallbackMessage || 'Payload Too Large',\n status: error.status,\n ...(code ? { code } : {}),\n };\n }\n\n let code = readStringParam(payload['code']);\n const errorName = typeof payload['error'] === 'string' ? payload['error'] : undefined;\n const messageFromBody = (() => {\n const message = payload['message'];\n if (typeof message === 'string') {\n return message;\n }\n if (Array.isArray(message)) {\n return message.map(String).join(', ');\n }\n return '';\n })();\n\n if (!code && isPayloadTooLargeHint(error.status, code, errorName, messageFromBody || error.message)) {\n code = AXP_PLATFORM_ERROR_CODES.PAYLOAD_TOO_LARGE;\n }\n\n const params = flattenDetailsParams(payload['details']);\n for (const key of ['jobId', 'status', 'scheduleId'] as const) {\n const value = readStringParam(payload[key]);\n if (value) {\n params[key] = value;\n }\n }\n\n if (!code && !messageFromBody) {\n return null;\n }\n\n return {\n message: messageFromBody || error.message,\n status: error.status,\n details: payload['details'],\n ...(code ? { code } : {}),\n ...(Object.keys(params).length > 0 ? { params } : {}),\n };\n}\n\nfunction extractFromCommandResult(result: AXPRuntimeCommandResult): AXPRequestErrorInfo | null {\n if (result.success) {\n return null;\n }\n const message = result.message;\n const text =\n typeof message?.text === 'string'\n ? message.text\n : message?.code || '';\n if (!message?.code && !text) {\n return null;\n }\n return {\n message: text,\n code: message?.code,\n details: message?.details,\n params: flattenDetailsParams(message?.details),\n };\n}\n\n/**\n * Transport-agnostic error extraction.\n * Accepts `HttpErrorResponse`, `AXPRequestError`, soft command results, and plain Errors.\n */\nexport function extractRequestErrorInfo(error: unknown): AXPRequestErrorInfo | null {\n if (error instanceof HttpErrorResponse) {\n return extractFromHttpErrorResponse(error);\n }\n\n if (AXPRequestError.is(error)) {\n return {\n message: error.message,\n code: error.code,\n status: error.status,\n details: error.details,\n params: flattenDetailsParams(error.details),\n };\n }\n\n if (\n error &&\n typeof error === 'object' &&\n 'success' in error &&\n (error as AXPRuntimeCommandResult).success === false\n ) {\n return extractFromCommandResult(error as AXPRuntimeCommandResult);\n }\n\n if (error instanceof Error && (error as Error & { code?: string }).code) {\n const coded = error as Error & { code?: string; status?: number; details?: unknown };\n return {\n message: coded.message,\n code: coded.code,\n status: coded.status,\n details: coded.details,\n params: flattenDetailsParams(coded.details),\n };\n }\n\n const body = mapUnknownToAXPErrorBody(error);\n if (!body.code && !body.message) {\n return null;\n }\n return {\n message: body.message || body.code || '',\n code: body.code,\n status: body.status,\n details: body.details,\n params: flattenDetailsParams(body.details),\n };\n}\n\n/** @deprecated Prefer {@link extractRequestErrorInfo}. */\nexport function extractHttpRequestErrorInfo(error: unknown): AXPRequestErrorInfo | null {\n return extractRequestErrorInfo(error);\n}\n\n/**\n * Log/dev fallback string only — do not show in product UI when a `code` exists.\n */\nexport function formatRequestError(error: unknown, fallback: string): string {\n const info = extractRequestErrorInfo(error);\n if (info) {\n return info.message || fallback;\n }\n return error instanceof Error ? error.message : fallback;\n}\n\n/** i18n key for a known platform error code, if any. */\nexport function platformErrorI18nKey(code: string | undefined): string | null {\n if (!code) {\n return null;\n }\n const known = Object.values(AXP_PLATFORM_ERROR_CODES) as string[];\n if (!known.includes(code)) {\n return null;\n }\n return `@general:errors.codes.${code}`;\n}\n\n/** Normalize any failure into {@link AXPRequestError} (connectivity + features). */\nexport function toAXPRequestError(error: unknown): AXPRequestError {\n if (AXPRequestError.is(error)) {\n return error;\n }\n const info = extractRequestErrorInfo(error);\n if (info) {\n return new AXPRequestError(info.message || info.code || 'Request failed', {\n code: info.code,\n status: info.status,\n details: info.details,\n });\n }\n return AXPRequestError.fromBody(mapUnknownToAXPErrorBody(error));\n}\n\n/**\n * Soft runtime failures return HTTP 200 + `{ success: false }`.\n * Throw so callers that only `await` the promise still fail closed.\n */\nexport function throwIfCommandFailed(result: unknown): void {\n if (\n result != null &&\n typeof result === 'object' &&\n 'success' in result &&\n (result as AXPRuntimeCommandResult).success === false\n ) {\n throw AXPRequestError.fromCommandResult(result as AXPRuntimeCommandResult);\n }\n}\n\n/** Map any thrown/soft failure into a soft command result for feature commands. */\nexport function toExecuteCommandFailureResult(\n error: unknown,\n fallbackText: string,\n): AXPRuntimeCommandResult {\n const info = extractRequestErrorInfo(error);\n const text =\n platformErrorI18nKey(info?.code) ??\n (typeof info?.message === 'string' && info.message.startsWith('@')\n ? info.message\n : undefined) ??\n fallbackText;\n return {\n success: false,\n message: {\n type: 'error',\n code: info?.code,\n text,\n details: info?.details,\n },\n };\n}\n\n//#endregion\n","/**\n * @deprecated Import from `./request-error.util` instead.\n * Kept as a stable path for existing imports.\n */\nexport {\n extractHttpRequestErrorInfo,\n extractRequestErrorInfo,\n formatRequestError,\n platformErrorI18nKey,\n} from './request-error.util';\n\nexport type { AXPRequestErrorInfo as HttpRequestErrorInfo } from '@acorex-platform/framework-shared/core';\n","import { ErrorHandler, Injectable, Injector } from \"@angular/core\";\nimport { AXPErrorHandlerRegistryService } from \"./error-handler-registry.service\";\n\n@Injectable({ providedIn: 'root' })\nexport class AXPGlobalErrorHandler extends ErrorHandler {\n\n\n\n constructor(private injector: Injector, private registry: AXPErrorHandlerRegistryService) {\n super()\n }\n\n override handleError(error: Error) {\n const handleErrorRecursively = (index: number, error: any) => {\n const errorHandlers = this.registry.handlers;\n if (index < errorHandlers.length) {\n errorHandlers[index].handleError(error, (err) => {\n handleErrorRecursively(index + 1, err);\n });\n } else {\n super.handleError(error); // Fallback to default handler\n }\n };\n if (error.message?.startsWith('NG0100')) {\n //ignore it\n return\n }\n handleErrorRecursively(0, error);\n }\n}\n","/** Thrown when a requested platform resource cannot be resolved. */\nexport class AXPNotFoundError extends Error {\n constructor(message = 'Resource not found') {\n super(message);\n this.name = 'AXPNotFoundError';\n }\n}\n","import { EnvironmentProviders, inject, makeEnvironmentProviders } from '@angular/core';\nimport { RedirectCommand, Route, Router, ROUTES } from '@angular/router';\n\n/** Canonical route path for the platform 404 page. */\nexport const AXP_NOT_FOUND_ROUTE = '/error/404';\n\n/**\n * Catch-all route that redirects unknown URLs to the platform 404 page.\n * Register this as the **last** route source in the application (after all app and module routes).\n */\nexport const AXP_NOT_FOUND_CATCH_ALL_ROUTE: Route = {\n path: '**',\n redirectTo: AXP_NOT_FOUND_ROUTE,\n};\n\n/**\n * Registers the platform catch-all 404 route.\n * Must be the last `ROUTES` provider in `app.config` so custom app routes are matched first.\n */\nexport function AXPNotFoundCatchAllRoute(): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: ROUTES,\n multi: true,\n useValue: [AXP_NOT_FOUND_CATCH_ALL_ROUTE],\n },\n ]);\n}\n\n/**\n * Returns true when an entity byKey query did not resolve a record.\n */\nexport function axpIsEntityRecordNotFound(data: unknown): boolean {\n return data == null;\n}\n\n/**\n * Creates an Angular redirect command to the platform 404 page.\n */\nexport function axpRedirectToNotFound(router: Router = inject(Router)): RedirectCommand {\n return new RedirectCommand(router.parseUrl(AXP_NOT_FOUND_ROUTE));\n}\n","import { inject } from '@angular/core';\nimport { RedirectCommand, Router } from '@angular/router';\n\n/** Canonical route path for the platform 401 page. */\nexport const AXP_UNAUTHORIZED_ROUTE = '/error/401';\n\n/**\n * Creates an Angular redirect command to the platform 401 page.\n */\nexport function axpRedirectToUnauthorized(router: Router = inject(Router)): RedirectCommand {\n return new RedirectCommand(router.parseUrl(AXP_UNAUTHORIZED_ROUTE));\n}\n","//#region ---- Imports ----\n\nimport { AXFormatOptions, AXFormatter } from '@acorex/core/format';\nimport { AXTranslationService, translateSync } from '@acorex/core/translation';\nimport { inject, Injectable } from '@angular/core';\nimport { isNil, isObject, isString } from 'lodash-es';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface AXPTranslateFormatterOptions extends AXFormatOptions {\n scope?: string;\n lang?: string;\n params?: Record<string, unknown>;\n}\n\n//#endregion\n\n/**\n * Platform formatter for display text: resolves ML objects, i18n keys (`@scope:key`), and primitives.\n * Register via {@link AXPCommonModule} (auto) or `AXFormatModule.forRoot({ formatters: [AXPTranslateFormatter] })`.\n */\n@Injectable()\nexport class AXPTranslateFormatter implements AXFormatter {\n //#region ---- Services & Dependencies ----\n\n private readonly translationService = inject(AXTranslationService);\n\n //#endregion\n\n //#region ---- AXFormatter ----\n\n get name(): string {\n return 'translate';\n }\n\n format(value: unknown, options?: AXPTranslateFormatterOptions | string): string {\n if (isNil(value) || value === '') {\n return '';\n }\n\n if (isObject(value) && !Array.isArray(value) && !(value instanceof Date)) {\n const resolved = this.translationService.resolve(value as never);\n return resolved?.trim() ?? '';\n }\n\n if (isString(value)) {\n const text = value.trim();\n if (!text) {\n return '';\n }\n if (text.startsWith('@')) {\n const translateOptions = typeof options === 'object' ? options : undefined;\n const translated = translateSync(text, translateOptions);\n return translated?.trim() ?? text;\n }\n return text;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n return String(value).trim();\n }\n\n //#endregion\n}\n","import { Injectable } from \"@angular/core\";\nimport { AXPFileManyStorageInfo, AXPFileStorageCreateRequest, AXPFileStorageFindRequest, AXPFileStorageInfo, AXPFileStorageUpdateRequest } from '@acorex-platform/framework-shared/core';\n\n@Injectable()\nexport abstract class AXPFileStorageService {\n\n abstract save(request: AXPFileStorageCreateRequest): Promise<AXPFileStorageInfo>;\n\n abstract update(request: AXPFileStorageUpdateRequest): Promise<AXPFileStorageInfo>;\n\n abstract find(request: AXPFileStorageFindRequest): Promise<AXPFileStorageInfo[]>;\n\n abstract findMany(ids : string[]): Promise<AXPFileManyStorageInfo[]>;\n\n abstract getInfo(fileId: string): Promise<AXPFileStorageInfo>;\n\n /**\n * Authenticated binary download URL for use in `<img src>` / media tags.\n * Same-origin + access cookie (or fetch with credentials) is required.\n */\n abstract getDownloadUrl(fileId: string): string;\n\n /** Download file bytes via the storage connector (includes auth when using API). */\n abstract download(fileId: string): Promise<Blob>;\n\n abstract remove(fileId: string): Promise<void>;\n\n abstract commit(fileId: string): Promise<void>;\n\n abstract markForDeletion(fileId: string): Promise<void>;\n}\n","import { AXPExpressionEvaluatorScopeProvider, AXPExpressionEvaluatorScopeProviderContext } from '@acorex-platform/framework-shared/core';\nimport { inject } from '@angular/core';\nimport { AXPFileStorageService } from './file-storage.service';\n\nexport class AXPFileStorageEvaluatorScopeProvider implements AXPExpressionEvaluatorScopeProvider {\n private readonly fileStorageService = inject(AXPFileStorageService);\n\n async provide(context: AXPExpressionEvaluatorScopeProviderContext): Promise<void> {\n context.addScope('fileStorage', {\n getFiles: async (entityType: string, entityId: string) => {\n const filesFromService = await this.fileStorageService.find({\n category: '',\n refId: entityId,\n refType: entityType,\n });\n const mappedFiles = filesFromService?.map((file) => ({\n id: file.id ?? '',\n name: file.name,\n size: file.size,\n status: 'remote',\n source: {\n kind: 'fileId',\n value: file.fileId,\n },\n }));\n\n return mappedFiles;\n },\n });\n }\n}\n","//#region ---- Stored image URL resolver ----\n\nconst FILE_STORAGE_ID_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nconst FILE_STORAGE_PREFIX = 'file:';\n\n/** Strips the file-cast prefix and whitespace from a stored image reference. */\nexport function normalizeStoredImageRef(value: string | null | undefined): string | null {\n if (!value) {\n return null;\n }\n const trimmed = value.trim();\n if (!trimmed || trimmed === 'null') {\n return null;\n }\n return trimmed.startsWith(FILE_STORAGE_PREFIX) ? trimmed.slice(FILE_STORAGE_PREFIX.length) : trimmed;\n}\n\nexport function isStoredImageFileId(value: string | null | undefined): boolean {\n const normalized = normalizeStoredImageRef(value);\n if (!normalized) {\n return false;\n }\n return FILE_STORAGE_ID_PATTERN.test(normalized);\n}\n\n/**\n * Builds the authenticated binary download URL for a file-storage id.\n * `baseUrl` is the API root (e.g. `/api` or `https://host/api`).\n */\nexport function buildFileStorageDownloadUrl(baseUrl: string, fileId: string): string {\n const base = baseUrl.replace(/\\/$/, '');\n return `${base}/v1/file-storage/download/${encodeURIComponent(fileId)}`;\n}\n\n/**\n * Resolves a stored image ref to a browser-displayable URL.\n * File-storage ids become authenticated binary download URLs (cookie/session auth).\n */\nexport function resolveStoredImageDisplayUrl(\n value: string,\n getDownloadUrl: (fileId: string) => string,\n): string {\n const normalized = normalizeStoredImageRef(value);\n if (!normalized) {\n return '';\n }\n if (\n normalized.startsWith('http://') ||\n normalized.startsWith('https://') ||\n normalized.startsWith('data:image/') ||\n normalized.startsWith('blob:')\n ) {\n return normalized;\n }\n if (isStoredImageFileId(normalized)) {\n return getDownloadUrl(normalized);\n }\n return normalized;\n}\n\n//#endregion\n","import { AXPLogoImageSrcResolver } from '@acorex-platform/framework-client/core';\nimport { Injectable } from '@angular/core';\n\nimport { AXPFileStorageService } from './file-storage.service';\nimport { isStoredImageFileId, resolveStoredImageDisplayUrl } from './resolve-stored-image-url';\n\n//#region ---- Logo image src resolver (file storage) ----\n\n@Injectable({ providedIn: 'root' })\nexport class AXPLogoImageSrcResolverService implements AXPLogoImageSrcResolver {\n constructor(private readonly fileStorage: AXPFileStorageService) {}\n\n async resolve(src: string): Promise<string | undefined> {\n const trimmed = src?.trim();\n if (!trimmed) {\n return undefined;\n }\n\n if (!isStoredImageFileId(trimmed)) {\n return trimmed;\n }\n\n try {\n const displayUrl = resolveStoredImageDisplayUrl(trimmed, (fileId) =>\n this.fileStorage.getDownloadUrl(fileId),\n );\n return displayUrl || undefined;\n } catch {\n return undefined;\n }\n }\n}\n\n//#endregion\n","import type { AXPFileListItem } from '@acorex-platform/framework-shared/core';\n\nimport { normalizeStoredImageRef } from './resolve-stored-image-url';\n\n//#region ---- Document → file list item ----\n\nfunction normalizeFileIdSource(value: string): { kind: 'fileId'; value: string } {\n return {\n kind: 'fileId',\n value: normalizeStoredImageRef(value) ?? value,\n };\n}\n\nfunction resolveSourceFromRaw(raw: unknown): AXPFileListItem['source'] | undefined {\n if (raw == null) {\n return undefined;\n }\n\n if (typeof raw === 'string') {\n return normalizeFileIdSource(raw);\n }\n\n if (typeof raw !== 'object') {\n return undefined;\n }\n\n const item = raw as AXPFileListItem;\n if (item.source?.kind === 'fileId' && typeof item.source.value === 'string') {\n return normalizeFileIdSource(item.source.value);\n }\n if (item.source?.kind === 'blob' || item.source?.kind === 'url') {\n return item.source;\n }\n if (typeof item.source?.value === 'string') {\n const value = item.source.value;\n if (value.startsWith('blob:') || value.startsWith('data:') || value.startsWith('http')) {\n return { kind: 'url', value };\n }\n return normalizeFileIdSource(value);\n }\n if (typeof item.id === 'string' && item.id) {\n return normalizeFileIdSource(item.id);\n }\n\n return undefined;\n}\n\n/**\n * Normalizes a drive document or explorer node into an {@link AXPFileListItem}\n * with a resolvable `source` for the gallery / media viewer.\n */\nexport function normalizeDocumentToFileListItem(doc: {\n id?: string;\n name: string;\n fileInfo?: unknown;\n fileId?: unknown;\n size?: number;\n}): AXPFileListItem {\n const raw = doc.fileInfo ?? doc.fileId;\n const source = resolveSourceFromRaw(raw);\n const rawItem = typeof raw === 'object' && raw != null ? (raw as AXPFileListItem) : undefined;\n const rawItemId = typeof rawItem?.id === 'string' ? rawItem.id : undefined;\n const sourceFileId =\n source?.kind === 'fileId' && typeof source.value === 'string' ? source.value : undefined;\n\n return {\n id: doc.id ?? rawItemId ?? sourceFileId ?? '',\n name: doc.name,\n size: rawItem?.size ?? doc.size ?? 0,\n status: rawItem?.status ?? 'attached',\n source,\n title: rawItem?.title,\n description: rawItem?.description,\n readOnly: rawItem?.readOnly,\n meta: rawItem?.meta,\n };\n}\n\n//#endregion\n","//#region ---- Media viewer type resolution ----\n\n/** Extensions supported by {@link AXMediaViewerData} (`image` | `audio` | `pdf` | `video`). */\nexport const GALLERY_MEDIA_EXTENSIONS = [\n 'jpg',\n 'jpeg',\n 'png',\n 'gif',\n 'bmp',\n 'webp',\n 'svg',\n 'pdf',\n 'mp4',\n 'webm',\n 'mov',\n 'm4v',\n 'avi',\n 'mkv',\n 'wmv',\n 'mp3',\n 'wav',\n 'ogg',\n 'oga',\n 'm4a',\n 'flac',\n 'aac',\n 'wma',\n 'weba',\n] as const;\n\nexport type AXMediaViewerResolvableType = 'image' | 'audio' | 'pdf' | 'video';\n\nconst IMAGE_EXTENSIONS = new Set(['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg']);\nconst PDF_EXTENSIONS = new Set(['pdf']);\nconst VIDEO_EXTENSIONS = new Set(['mp4', 'webm', 'mov', 'm4v', 'avi', 'mkv', 'wmv']);\nconst AUDIO_EXTENSIONS = new Set(['mp3', 'wav', 'ogg', 'oga', 'm4a', 'flac', 'aac', 'wma', 'weba']);\nconst GALLERY_EXTENSION_SET = new Set<string>(GALLERY_MEDIA_EXTENSIONS);\n\n/** Returns the lowercase extension from a file name, or `undefined` when missing. */\nexport function extractFileExtension(fileName: string | null | undefined): string | undefined {\n if (!fileName) {\n return undefined;\n }\n const ext = fileName.split('.').pop()?.toLowerCase();\n return ext && ext !== fileName.toLowerCase() ? ext : undefined;\n}\n\n/** Maps a file name extension to the media-viewer `type` discriminator. */\nexport function resolveMediaViewerType(fileName: string | null | undefined): AXMediaViewerResolvableType {\n const ext = extractFileExtension(fileName);\n if (!ext) {\n return 'image';\n }\n if (PDF_EXTENSIONS.has(ext)) {\n return 'pdf';\n }\n if (VIDEO_EXTENSIONS.has(ext)) {\n return 'video';\n }\n if (AUDIO_EXTENSIONS.has(ext)) {\n return 'audio';\n }\n if (IMAGE_EXTENSIONS.has(ext)) {\n return 'image';\n }\n return 'image';\n}\n\n/** Whether the extension can be rendered in the gallery / media viewer. */\nexport function isGalleryMediaExtension(extension: string | null | undefined): boolean {\n if (!extension) {\n return false;\n }\n return GALLERY_EXTENSION_SET.has(extension.toLowerCase());\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPKeyboardShortcutHelpEntry } from '@acorex-platform/framework-shared/core';\nimport { AXKBDComponent, AXKBDItemComponent } from '@acorex/components/kbd';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPKeyboardShortcutRegistry, chordToKbdItemKeys } from '@acorex-platform/framework-client/core';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, ViewEncapsulation } from '@angular/core';\n\n//#endregion\n\ninterface AXPKeyboardShortcutHelpGroup {\n label: string;\n items: AXPKeyboardShortcutHelpEntry[];\n}\n\n@Component({\n selector: 'axp-keyboard-shortcuts-help',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [AsyncPipe, AXKBDComponent, AXKBDItemComponent, AXTranslationModule],\n styleUrls: ['./keyboard-shortcuts-help.component.css'],\n template: `\n <div class=\"axp-keyboard-shortcuts-help\">\n <div class=\"__body\">\n @if (groups().length === 0) {\n <p class=\"__empty\">\n {{ '@general:keyboard-shortcuts.no-shortcuts' | translate | async }}\n </p>\n } @else {\n @for (group of groups(); track group.label) {\n <section class=\"__section\">\n <h3 class=\"__heading\">\n {{ group.label | translate | async }}\n </h3>\n <div class=\"__list\">\n @for (item of group.items; track item.registrationId + item.bindingTitle) {\n <div class=\"__row\">\n <span class=\"__action\">\n {{ item.bindingTitle | translate | async }}\n </span>\n <div class=\"__keys\">\n @for (chord of item.displayChords; track chord; let last = $last) {\n <ax-kbd look=\"solid\">\n <ax-kbd-item [keys]=\"chordToKbdKeys(chord)\" join=\"split\" look=\"solid\"></ax-kbd-item>\n </ax-kbd>\n @if (!last) {\n <span class=\"__or\">\n {{ '@general:keyboard-shortcuts.or' | translate | async }}\n </span>\n }\n }\n </div>\n </div>\n }\n </div>\n </section>\n }\n }\n </div>\n </div>\n `,\n})\nexport class AXPKeyboardShortcutsHelpComponent {\n //#region ---- Services & Dependencies ----\n\n private readonly shortcutRegistry = inject(AXPKeyboardShortcutRegistry);\n\n //#endregion\n\n //#region ---- Computed Properties ----\n\n protected readonly groups = computed((): AXPKeyboardShortcutHelpGroup[] => {\n const grouped = new Map<string, AXPKeyboardShortcutHelpEntry[]>();\n\n for (const entry of this.shortcutRegistry.helpEntries()) {\n const label = entry.group ?? entry.scope ?? '@general:keyboard-shortcuts.groups.general';\n const bucket = grouped.get(label) ?? [];\n bucket.push(entry);\n grouped.set(label, bucket);\n }\n\n return [...grouped.entries()].map(([label, items]) => ({ label, items }));\n });\n\n //#endregion\n\n //#region ---- Utility Methods ----\n\n protected chordToKbdKeys(chord: string): string[] {\n return chordToKbdItemKeys(chord, { skipDirectionResolve: true });\n }\n\n //#endregion\n}\n","//#region ---- Imports ----\n\nimport { DOCUMENT } from '@angular/common';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPKeyboardShortcutRegistry, hasForegroundOverlayLayer } from '@acorex-platform/framework-client/core';\nimport { Injectable, inject } from '@angular/core';\n\n//#endregion\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPKeyboardShortcutsHelpService {\n //#region ---- Services & Dependencies ----\n\n private readonly popupService = inject(AXPopupService);\n private readonly translationService = inject(AXTranslationService);\n private readonly shortcutRegistry = inject(AXPKeyboardShortcutRegistry);\n private readonly document = inject(DOCUMENT);\n\n //#endregion\n\n //#region ---- State ----\n\n /** In-flight help popup session (open until the popup closes). */\n private activeShow: Promise<void> | null = null;\n\n //#endregion\n\n //#region ---- Lifecycle ----\n\n constructor() {\n this.shortcutRegistry.setHelpDialogHandler(() => this.show());\n }\n\n //#endregion\n\n //#region ---- Public Methods ----\n\n /**\n * Opens the keyboard shortcuts help popup, or no-ops when it is already open.\n */\n show(): Promise<void> {\n if (this.activeShow) {\n return this.activeShow;\n }\n\n if (typeof this.document !== 'undefined' && hasForegroundOverlayLayer(this.document)) {\n return Promise.resolve();\n }\n\n this.activeShow = this.openHelpPopup().finally(() => {\n this.activeShow = null;\n });\n\n return this.activeShow;\n }\n\n //#endregion\n\n //#region ---- Private Methods ----\n\n private async openHelpPopup(): Promise<void> {\n const title = await this.translationService.translateAsync('@general:keyboard-shortcuts.help-title');\n const component = await import('./keyboard-shortcuts-help.component').then(\n (module) => module.AXPKeyboardShortcutsHelpComponent,\n );\n\n await this.popupService.open(component, {\n title,\n size: 'sm',\n closeButton: true,\n closeOnBackdropClick: true,\n draggable: false,\n });\n }\n\n //#endregion\n}\n","import {\n ChangeDetectorRef,\n Directive,\n ElementRef,\n EventEmitter,\n Input,\n NgZone,\n Output,\n Renderer2,\n} from '@angular/core';\n\n@Directive({\n selector: '[axpSticky]',\n exportAs: 'axpSticky',\n standalone: true,\n})\nexport class AXPStickyDirective {\n @Input('axpSticky') stickyClass!: string;\n @Input('stickyOffset') stickyOffset: number = 100;\n\n @Output() isStickyChange: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n private _isSticky: boolean = false;\n public get isSticky(): boolean {\n return this._isSticky;\n }\n public set isSticky(value: boolean) {\n if (this._isSticky !== value) {\n this._isSticky = value;\n this.isStickyChange.emit(value);\n }\n }\n\n private parentElement!: HTMLElement | Window;\n private targetElement!: HTMLElement;\n private mutationObserver!: MutationObserver;\n\n private readonly onWindowResize = (): void => {\n this.applyStickyStateFromScrollPosition();\n };\n\n @Input() stickyParent!: string | HTMLElement;\n @Input() stickyTarget!: string;\n\n constructor(\n private element: ElementRef<HTMLDivElement>,\n private renderer: Renderer2,\n private zone: NgZone,\n private cdr: ChangeDetectorRef,\n ) {}\n\n ngAfterViewInit() {\n this.initSticky();\n\n // Add mutation observer for dynamic content\n this.mutationObserver = new MutationObserver(() => {\n this.applyStickyStateFromScrollPosition();\n });\n\n this.mutationObserver.observe(this.element.nativeElement, {\n childList: true,\n subtree: true,\n });\n\n window.addEventListener('resize', this.onWindowResize);\n }\n\n private initSticky() {\n if (this.stickyParent instanceof HTMLElement) {\n this.parentElement = this.stickyParent;\n } else {\n this.parentElement = (document.querySelector(this.stickyParent) as HTMLElement) || window;\n }\n\n this.targetElement = (document.querySelector(this.stickyTarget) as HTMLElement) || this.element.nativeElement;\n\n this.parentElement.addEventListener('scroll', this.onParentScroll);\n this.applyStickyStateFromScrollPosition();\n }\n\n private getScrollTop(): number {\n return this.parentElement === window ? window.scrollY : (this.parentElement as HTMLElement).scrollTop;\n }\n\n /**\n * Toggle stuck styling only while this element is visually pinned (matches `position: sticky; top: 0`).\n * Scroll-offset thresholds would stay true for every section already passed, so multiple stacked stickies\n * would all keep `--stuck`; geometry fixes that.\n */\n private computeShouldStick(): boolean {\n if (this.getScrollTop() <= 0) {\n return false;\n }\n const tRect = this.targetElement.getBoundingClientRect();\n const epsilon = 3;\n let limitY: number;\n if (this.parentElement === window) {\n limitY = this.stickyOffset;\n } else {\n limitY = (this.parentElement as HTMLElement).getBoundingClientRect().top;\n }\n return tRect.top <= limitY + epsilon && tRect.top >= limitY - epsilon;\n }\n\n private applyStickyStateFromScrollPosition(): void {\n this.zone.runOutsideAngular(() => {\n const shouldStick = this.computeShouldStick();\n\n if (shouldStick !== this.isSticky) {\n this.zone.run(() => {\n this.isSticky = shouldStick;\n this.toggleStickyClasses(shouldStick);\n this.cdr.markForCheck();\n });\n }\n });\n }\n\n private onParentScroll = (): void => {\n this.applyStickyStateFromScrollPosition();\n };\n\n private toggleStickyClasses(isSticky: boolean): void {\n const classes = this.stickyClass.split(' ').filter(Boolean);\n classes.forEach((className) => {\n if (isSticky) {\n this.renderer.addClass(this.targetElement, className);\n } else {\n this.renderer.removeClass(this.targetElement, className);\n }\n });\n }\n\n ngOnDestroy() {\n this.parentElement.removeEventListener('scroll', this.onParentScroll);\n window.removeEventListener('resize', this.onWindowResize);\n\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n }\n }\n}\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { AXP_MENU_MIDDLEWARE, AXPMenuMiddleware } from './menu.middleware';\n\n//#region ---- Menu Middleware Provider Helper ----\n\n/**\n * Helper function to provide menu middlewares with proper DI setup\n * Similar to provideCommandMiddleware pattern\n * \n * @example\n * ```typescript\n * // In app.config.ts or module providers\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideMenuMiddleware([\n * customizationMiddleware,\n * securityMiddleware,\n * loggingMiddleware\n * ])\n * ]\n * };\n * ```\n */\nexport function provideMenuMiddleware(\n middlewares: AXPMenuMiddleware[]\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n ...middlewares.map((middleware) => ({\n provide: AXP_MENU_MIDDLEWARE,\n useValue: middleware,\n multi: true,\n })),\n ]);\n}\n\n/**\n * Helper to create a class-based middleware with priority\n * \n * @example\n * ```typescript\n * const myMiddleware = createMenuMiddleware({\n * name: 'my-middleware',\n * priority: 100,\n * process: async (context) => {\n * context.find('dashboard').setPriority(1);\n * }\n * });\n * ```\n */\nexport function createMenuMiddleware(config: {\n name: string;\n priority?: number;\n process: (context: import('./menu.middleware').AXPMenuMiddlewareContext) => Promise<void>;\n}): AXPMenuMiddleware {\n return {\n name: config.name,\n priority: config.priority ?? 0,\n process: config.process,\n };\n}\n\n//#endregion\n\n","import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { inject, Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot } from '@angular/router';\nimport { axpFindMenuItemByRoute } from './menu-route-matcher';\nimport { AXPMenuProviderService } from './menu.provider';\nimport { AXPMenuVisibilityService } from './menu-visibility.service';\n\nconst SKIP_ROUTE_PREFIXES = ['/auth', '/error'];\nconst SKIP_ROUTE_PATHS = new Set(['/404', '/401', '/error/404', '/error/401']);\n\n//#region ---- Menu Route Access Service ----\n\n/**\n * Resolves route access using menu policy, route metadata, permissions, and features.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPMenuRouteAccessService {\n //#region ---- Services & Dependencies ----\n\n private readonly menuProvider = inject(AXPMenuProviderService);\n private readonly menuVisibility = inject(AXPMenuVisibilityService);\n private readonly sessionService = inject(AXPSessionService);\n\n //#endregion\n\n //#region ---- Public Methods ----\n\n /**\n * Checks whether navigation to the target URL is allowed for the current user.\n */\n async canAccess(route: ActivatedRouteSnapshot, url: string): Promise<boolean> {\n if (this.shouldSkip(route, url)) {\n return true;\n }\n\n if (this.hasDeclaredRoutePolicy(route)) {\n return this.evaluateDeclaredRoutePolicy(route);\n }\n\n // Avoid building/caching a shell-less menu tree before session is Authorized.\n if (!this.sessionService.isAuthorized) {\n return true;\n }\n\n const menuItems = await this.menuProvider.items();\n const menuMatch = axpFindMenuItemByRoute(menuItems, url);\n\n if (!menuMatch) {\n return true;\n }\n\n if (this.menuVisibility.isMenuBranchVisible(menuMatch.item, menuMatch.ancestors)) {\n return true;\n }\n\n return false;\n }\n\n //#endregion\n\n //#region ---- Utility Methods ----\n\n private shouldSkip(route: ActivatedRouteSnapshot, url: string): boolean {\n if (this.hasRouteFlag(route, 'skipMenuRouteGuard')) {\n return true;\n }\n\n const normalizedUrl = this.normalizeUrl(url);\n\n if (SKIP_ROUTE_PATHS.has(normalizedUrl)) {\n return true;\n }\n\n return SKIP_ROUTE_PREFIXES.some((prefix) => normalizedUrl.startsWith(prefix));\n }\n\n private hasRouteFlag(route: ActivatedRouteSnapshot, key: string): boolean {\n let current: ActivatedRouteSnapshot | null = route;\n\n while (current) {\n if (current.data?.[key] === true) {\n return true;\n }\n current = current.parent;\n }\n\n return false;\n }\n\n /** Routes that declare requiredPermission / requiredFeature (deep links, bookmarks). */\n private hasDeclaredRoutePolicy(route: ActivatedRouteSnapshot): boolean {\n const permissionKeys = this.normalizeKeys(\n this.getInheritedRouteData<string | string[] | null>(route, 'requiredPermission'),\n );\n const featureKeys = this.normalizeKeys(\n this.getInheritedRouteData<string | string[] | null>(route, 'requiredFeature'),\n );\n return permissionKeys.length > 0 || featureKeys.length > 0;\n }\n\n private evaluateDeclaredRoutePolicy(route: ActivatedRouteSnapshot): boolean {\n const permissionKeys = this.normalizeKeys(\n this.getInheritedRouteData<string | string[] | null>(route, 'requiredPermission'),\n );\n if (permissionKeys.length > 0 && !this.sessionService.authorize(...permissionKeys)) {\n return false;\n }\n\n const featureKeys = this.normalizeKeys(\n this.getInheritedRouteData<string | string[] | null>(route, 'requiredFeature'),\n );\n if (featureKeys.length > 0 && !this.sessionService.isFeatureEnabled(...featureKeys)) {\n return false;\n }\n\n return true;\n }\n\n private getInheritedRouteData<T>(route: ActivatedRouteSnapshot, key: string): T | null {\n let current: ActivatedRouteSnapshot | null = route;\n\n while (current) {\n const value = current.data?.[key] as T | undefined;\n if (value != null) {\n return value;\n }\n current = current.parent;\n }\n\n return null;\n }\n\n private normalizeKeys(keys: string | string[] | null | undefined): string[] {\n if (!keys) {\n return [];\n }\n\n return Array.isArray(keys) ? keys : [keys];\n }\n\n private normalizeUrl(url: string): string {\n const path = url.split('?')[0]?.split('#')[0] ?? url;\n return path.startsWith('/') ? path : `/${path}`;\n }\n\n //#endregion\n}\n\n//#endregion\n","import { AXP_UNAUTHORIZED_ROUTE } from '../../errors/unauthorized.routes';\n\nimport { AXPUnauthenticatedError, AXPSessionService } from '@acorex-platform/framework-client/auth';\n\nimport { inject } from '@angular/core';\n\nimport { ActivatedRouteSnapshot, CanActivateFn, Router, RouterStateSnapshot, UrlTree } from '@angular/router';\n\nimport { filter, first, from, map, of, switchMap, take } from 'rxjs';\n\nimport { AXPMenuRouteAccessService } from './menu-route-access.service';\n\n\n\nconst APP_CHOOSER_ROUTE = '/auth/account/app-chooser';\n\n\n\n/**\n\n * Blocks navigation when the target route is not accessible for the current user.\n\n * Evaluates menu policy, permissions, and features.\n\n */\n\nexport const AXPMenuRouteGuard: CanActivateFn = (\n\n route: ActivatedRouteSnapshot,\n\n state: RouterStateSnapshot,\n\n) => {\n\n const sessionService = inject(AXPSessionService);\n\n const menuRouteAccessService = inject(AXPMenuRouteAccessService);\n\n const router = inject(Router);\n\n\n\n return sessionService.isLoading$.pipe(\n\n filter((loading) => !loading),\n\n take(1),\n\n switchMap(() => sessionService.isAuthorized$),\n\n take(1),\n\n switchMap((authorized) => {\n\n if (!authorized) {\n\n if (sessionService.isAuthenticated) {\n\n return of(router.parseUrl(APP_CHOOSER_ROUTE));\n\n }\n\n\n\n throw new AXPUnauthenticatedError(\n\n `Access denied. You are not currently logged in. Please log in to access this page. If you continue to see this message after logging in, please contact support.`,\n\n { redirectUrl: state.url },\n\n );\n\n }\n\n\n\n return from(menuRouteAccessService.canAccess(route, state.url));\n\n }),\n\n map((isAllowed): boolean | UrlTree => {\n\n if (isAllowed === true) {\n\n return true;\n\n }\n\n\n\n if (isAllowed instanceof UrlTree) {\n\n return isAllowed;\n\n }\n\n\n\n return router.parseUrl(AXP_UNAUTHORIZED_ROUTE);\n\n }),\n\n );\n\n};\n\n\n\n","import { AXPAuthGuard } from '@acorex-platform/framework-client/auth';\nimport { axpPlatformSettingsAvailableGuard } from '../../settings/platform-settings-available.guard';\nimport { AXPMenuRouteGuard } from './menu-route.guard';\n\n/** Standard guards for authenticated routes with menu-based access enforcement. */\nexport const AXP_PROTECTED_ROUTE_GUARDS = [\n axpPlatformSettingsAvailableGuard,\n AXPAuthGuard,\n AXPMenuRouteGuard,\n] as const;\n","import { AXPSearchDefinitionProvider, AXPSearchDefinitionProviderContext } from '../../search';\nimport { AXPSystemActionType } from '@acorex-platform/framework-shared/core';\n\nexport class AXPMenuSearchDefinitionProvider implements AXPSearchDefinitionProvider {\n async provide(context: AXPSearchDefinitionProviderContext): Promise<void> {\n context.addDefinition('menu', 'Menu', 'menu', 'fa-thin fa-bars', 2, {\n format: {\n id: '{{data.name}}',\n },\n actions: [\n {\n name: 'navigate',\n type: AXPSystemActionType.View,\n priority: 'primary',\n },\n ],\n });\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport { AXPSearchDefinition } from './search.types';\n\n/**\n * Optional hook to resolve entity search definitions on demand (e.g. Module.X.Entity).\n */\nexport interface AXPSearchDefinitionLazyResolver {\n resolve(definitionName: string): Promise<AXPSearchDefinition | null>;\n}\n\nexport const AXP_SEARCH_DEFINITION_LAZY_RESOLVER = new InjectionToken<AXPSearchDefinitionLazyResolver>(\n 'AXP_SEARCH_DEFINITION_LAZY_RESOLVER',\n);\n","import { AXPSearchAction, AXPSearchDefinition, AXPSearchDefinitionDisplayFormat } from './search.types';\nimport { AXPSystemActionType } from '@acorex-platform/framework-shared/core';\n\nexport class AXPSearchDefinitionProviderContext {\n private definitions: AXPSearchDefinition[] = [];\n private definitionMap: Map<string, AXPSearchDefinition> = new Map();\n\n addDefinition(\n name: string,\n title: string,\n group: string,\n icon: string,\n order: number,\n options?: {\n format?: AXPSearchDefinitionDisplayFormat;\n actions?: AXPSearchAction[];\n }\n ): AXPSearchDefinitionBuilder {\n const definitionSearch: AXPSearchDefinition = {\n name,\n title,\n group,\n icon,\n order,\n format: {\n title: options?.format?.title ?? '{{ title }}',\n description: options?.format?.description ?? undefined,\n icon: options?.format?.icon ?? undefined,\n id: options?.format?.id ?? '{{ id }}',\n },\n actions: options?.actions ?? [],\n };\n\n this.definitions.push(definitionSearch);\n this.definitionMap.set(name, definitionSearch); // Index by name\n return new AXPSearchDefinitionBuilder(this, definitionSearch);\n }\n\n getDefinitions(): AXPSearchDefinition[] {\n return this.definitions;\n }\n\n // Expose groupMap for controlled access\n hasEntity(name: string): boolean {\n return this.definitionMap.has(name);\n }\n\n getDefinition(name: string): AXPSearchDefinition | undefined {\n return this.definitionMap.get(name);\n }\n}\n\nexport class AXPSearchDefinitionBuilder {\n private context: AXPSearchDefinitionProviderContext;\n private definition: AXPSearchDefinition;\n\n constructor(context: AXPSearchDefinitionProviderContext, definition: AXPSearchDefinition) {\n this.context = context;\n this.definition = definition;\n }\n\n addAction(name: string): AXPSearchDefinitionActionBuilder {\n const newAction: AXPSearchAction = {\n name,\n type: AXPSystemActionType.View,\n priority: 'primary',\n };\n this.definition.actions.push(newAction);\n return new AXPSearchDefinitionActionBuilder(this);\n }\n\n action(name: string): AXPSearchDefinitionActionBuilder | null {\n const foundAction = this.definition.actions.find((action) => action.name === name);\n if (!foundAction) {\n throw new Error(`action with name \"${name}\" not found in entity \"${this.definition.name}\".`);\n }\n return new AXPSearchDefinitionActionBuilder(this);\n }\n\n endEntity(): AXPSearchDefinitionProviderContext {\n return this.context;\n }\n}\n\nexport class AXPSearchDefinitionActionBuilder {\n private entityBuilder: AXPSearchDefinitionBuilder;\n\n constructor(entityBuilder: AXPSearchDefinitionBuilder) {\n this.entityBuilder = entityBuilder;\n }\n\n endAction(): AXPSearchDefinitionBuilder {\n return this.entityBuilder;\n }\n}\n","import { Injectable, InjectionToken, inject } from '@angular/core';\nimport { AXPSearchDefinitionProviderContext } from './search-definition.builder';\nimport {\n AXP_SEARCH_DEFINITION_LAZY_RESOLVER,\n type AXPSearchDefinitionLazyResolver,\n} from './search-definition-lazy-resolver.token';\nimport { AXPSearchDefinition } from './search.types';\n\n// Interface for setting providers\nexport interface AXPSearchDefinitionProvider {\n provide(context: AXPSearchDefinitionProviderContext): Promise<void>;\n}\n\n// Injection token for setting providers\nexport const AXP_SEARCH_DEFINITION_PROVIDER = new InjectionToken<AXPSearchDefinitionProvider[]>(\n 'AXP_SEARCH_DEFINITION_PROVIDER'\n);\n\n@Injectable({ providedIn: 'root' })\nexport class AXPSearchDefinitionProviderService {\n private providers = inject(AXP_SEARCH_DEFINITION_PROVIDER, { optional: true });\n private lazyResolver = inject(AXP_SEARCH_DEFINITION_LAZY_RESOLVER, { optional: true });\n private cache: AXPSearchDefinition[] | null = null;\n\n private async load(): Promise<void> {\n if (this.cache) {\n return;\n }\n const context = new AXPSearchDefinitionProviderContext();\n \n // Load providers from DI tokens (backward compatibility)\n if (Array.isArray(this.providers)) {\n for (const provider of this.providers) {\n await provider.provide(context);\n }\n }\n\n // Note: Search definition providers are different from search command providers\n // Search command providers are handled separately in search.service.ts\n \n this.cache = context.getDefinitions();\n }\n\n public async getListAsync(): Promise<AXPSearchDefinition[]> {\n await this.load();\n return this.getList();\n }\n\n public getList(): AXPSearchDefinition[] {\n if (!this.cache) {\n return [];\n } else {\n return this.cache;\n }\n }\n\n public findDefinition(definitionName: string): AXPSearchDefinition {\n const definition = this.getList().find((item) => item.name === definitionName);\n if (!definition) {\n throw new Error(`Definition with name ${definitionName} not found`);\n }\n return definition;\n }\n\n public async findDefinitionAsync(definitionName: string): Promise<AXPSearchDefinition | null> {\n await this.load();\n\n const existing = this.getList().find((item) => item.name === definitionName);\n if (existing) {\n return existing;\n }\n\n const lazy = this.lazyResolver as AXPSearchDefinitionLazyResolver | null;\n if (!lazy) {\n return null;\n }\n\n const resolved = await lazy.resolve(definitionName);\n if (!resolved) {\n return null;\n }\n\n this.cache = [...(this.cache ?? []), resolved];\n return resolved;\n }\n\n public findDefinitionByGroup(definitionGroup: string): AXPSearchDefinition {\n const definition = this.getList().find((definition) => definition.group === definitionGroup);\n if (!definition) {\n throw new Error(`Definition with group ${definitionGroup} not found`);\n }\n return definition;\n }\n}\n","//#region ---- Imports ----\n\nimport { AXPMultiLanguageString, isLocaleStringMap } from '@acorex-platform/framework-shared/core';\nimport { AXFormatService } from '@acorex/core/format';\nimport { AXTranslationService, resolveMultiLanguageString } from '@acorex/core/translation';\n\nimport { AXPContextEvalFactory, AXPExpressionEvaluatorService } from '@acorex-platform/framework-client/core';\nimport { AXPExpressionEvaluatorScope } from '@acorex-platform/framework-shared/core';\nimport { isPlainObject, isString } from 'lodash-es';\nimport { normalizeEntityDisplayTemplate, sanitizeResolvedEntityDisplayTitle } from '@acorex-platform/framework-shared/entity';\n\n//#endregion\n\n//#region ---- Searchable text resolution ----\n\n/**\n * Resolves a value to plain text for global-search matching (i18n keys, locale maps, scalars).\n */\nexport function resolveSearchableText(\n value: unknown,\n locale: string,\n translationService: AXTranslationService,\n): string {\n if (value == null || value === false) {\n return '';\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) {\n return '';\n }\n if (trimmed.startsWith('@')) {\n return translationService.translateSync(trimmed) || trimmed;\n }\n return trimmed;\n }\n\n if (isLocaleStringMap(value) || translationService.isValidMultiLanguageObject(value)) {\n return resolveMultiLanguageString(value as AXPMultiLanguageString, locale).trim();\n }\n\n return '';\n}\n\n/**\n * Case-insensitive match against i18n keys, locale maps, and plain strings.\n */\nexport function searchInSearchableValue(\n value: unknown,\n query: string,\n locale: string,\n translationService: AXTranslationService,\n): boolean {\n const q = query.trim().toLocaleLowerCase(locale);\n if (!q) {\n return true;\n }\n\n if (isLocaleStringMap(value)) {\n return Object.values(value)\n .filter((entry): entry is string => typeof entry === 'string' && entry.trim() !== '')\n .some((entry) => entry.toLocaleLowerCase(locale).includes(q));\n }\n\n const text = resolveSearchableText(value, locale, translationService).toLocaleLowerCase(locale);\n return text.includes(q);\n}\n\n/**\n * Shallow + nested search over entity/command payloads (skips id / entityName keys).\n */\nexport function searchInRecordValues(\n value: unknown,\n query: string,\n locale: string,\n translationService: AXTranslationService,\n depth = 0,\n): boolean {\n const maxDepth = 4;\n if (depth > maxDepth || value == null) {\n return false;\n }\n\n if (searchInSearchableValue(value, query, locale, translationService)) {\n return true;\n }\n\n if (Array.isArray(value)) {\n return value.some((item) => searchInRecordValues(item, query, locale, translationService, depth + 1));\n }\n\n if (isPlainObject(value) && !isLocaleStringMap(value)) {\n return Object.entries(value as Record<string, unknown>).some(([key, entry]) => {\n if (key === 'id' || key === 'entityName') {\n return false;\n }\n return searchInRecordValues(entry, query, locale, translationService, depth + 1);\n });\n }\n\n return false;\n}\n\n//#endregion\n\n//#region ---- Display template resolution ----\n\nfunction countMustacheExpressions(template: string): number {\n return (template.match(/\\{\\{/g) ?? []).length;\n}\n\n/** Standard display-tier row scope for entity title/search templates. */\nexport function createEntityRowExpressionScope(\n data: unknown,\n contextEvalFactory: AXPContextEvalFactory,\n): AXPExpressionEvaluatorScope {\n return {\n context: contextEvalFactory.createScope((data ?? {}) as Record<string, unknown>),\n };\n}\n\n/**\n * Coerces an evaluated display segment to plain text.\n * Piped eval returns strings; unpiped MLS still resolves via compat fallback.\n */\nfunction formatDisplaySegment(\n segment: unknown,\n locale: string,\n translationService: AXTranslationService,\n): string {\n if (segment === false || segment == null) {\n return '';\n }\n if (isString(segment)) {\n return segment.trim();\n }\n return resolveSearchableText(segment, locale, translationService);\n}\n\n/**\n * Evaluates a normalized entity display template via {@link AXPExpressionEvaluatorService}.\n */\nexport async function evaluateEntityDisplayTemplate(\n template: string,\n data: unknown,\n expressionEvaluator: AXPExpressionEvaluatorService,\n locale: string,\n translationService: AXTranslationService,\n contextEvalFactory: AXPContextEvalFactory,\n): Promise<unknown> {\n const normalized = normalizeEntityDisplayTemplate(template);\n const scope = createEntityRowExpressionScope(data, contextEvalFactory);\n\n if (!normalized.includes('{{')) {\n return normalized;\n }\n\n if (\n countMustacheExpressions(normalized) === 1 &&\n expressionEvaluator.isExpression(normalized)\n ) {\n return expressionEvaluator.evaluate(normalized, scope);\n }\n\n const regex = /\\{\\{\\s*([\\s\\S]*?)\\s*\\}\\}/g;\n let result = '';\n let lastIndex = 0;\n\n for (const match of normalized.matchAll(regex)) {\n result += normalized.slice(lastIndex, match.index);\n const segment = await expressionEvaluator.evaluate(`{{ ${match[1].trim()} }}`, scope);\n result += formatDisplaySegment(segment, locale, translationService);\n lastIndex = (match.index ?? 0) + match[0].length;\n }\n\n result += normalized.slice(lastIndex);\n return result;\n}\n\n/**\n * Best display string from row values that contain the active search query (deep-match fallback).\n */\nexport function resolveQueryMatchingDisplayText(\n value: unknown,\n query: string,\n locale: string,\n translationService: AXTranslationService,\n depth = 0,\n): string {\n const q = query.trim().toLocaleLowerCase(locale);\n if (!q || depth > 4 || value == null) {\n return '';\n }\n\n let best = '';\n const consider = (candidate: unknown) => {\n const text = resolveSearchableText(candidate, locale, translationService).trim();\n if (text && text.toLocaleLowerCase(locale).includes(q) && text.length > best.length) {\n best = text;\n }\n };\n\n consider(value);\n\n if (Array.isArray(value)) {\n for (const item of value) {\n const nested = resolveQueryMatchingDisplayText(item, query, locale, translationService, depth + 1);\n if (nested.length > best.length) {\n best = nested;\n }\n }\n return best;\n }\n\n if (isPlainObject(value) && !isLocaleStringMap(value)) {\n for (const [key, entry] of Object.entries(value as Record<string, unknown>)) {\n if (key === 'id' || key === 'entityName') {\n continue;\n }\n const nested = resolveQueryMatchingDisplayText(entry, query, locale, translationService, depth + 1);\n if (nested.length > best.length) {\n best = nested;\n }\n }\n }\n\n return best;\n}\n\n/**\n * Resolves entity search display templates; coerces multi-language field values to readable text.\n */\nexport async function resolveSearchDisplayTemplate(\n template: string | undefined,\n data: unknown,\n locale: string,\n translationService: AXTranslationService,\n formatService: AXFormatService,\n expressionEvaluator: AXPExpressionEvaluatorService,\n contextEvalFactory: AXPContextEvalFactory,\n): Promise<AXPMultiLanguageString> {\n if (!template) {\n return '';\n }\n\n if (!template.includes('{{') && !template.includes('{')) {\n if (template.trim().startsWith('@')) {\n return resolveSearchableText(template, locale, translationService);\n }\n\n const formatted = formatService.format(template, 'string', data);\n return sanitizeResolvedEntityDisplayTitle(\n typeof formatted === 'string' ? formatted : String(formatted ?? ''),\n );\n }\n\n const evaluated = await evaluateEntityDisplayTemplate(\n template,\n data,\n expressionEvaluator,\n locale,\n translationService,\n contextEvalFactory,\n );\n return sanitizeResolvedEntityDisplayTitle(\n resolveSearchableText(evaluated, locale, translationService),\n );\n}\n\n//#endregion\n","import { AXTranslationService } from '@acorex/core/translation';\nimport { inject } from '@angular/core';\nimport { searchInSearchableValue } from './search-display-string.util';\nimport { AXPSearchResult } from './search.types';\n\n// Interface for setting providers\nexport interface AXPSearchProvider {\n search(text: string): Promise<AXPSearchResult[]>;\n}\n\nexport abstract class AXPSearchCommandProvider {\n private readonly translationService = inject(AXTranslationService);\n abstract commands: AXPSearchResult[];\n\n async search(text: string): Promise<AXPSearchResult[]> {\n const locale = this.translationService.getActiveLang() ?? 'en-US';\n return this.commands.filter(\n (command) =>\n searchInSearchableValue(command.title, text, locale, this.translationService) ||\n searchInSearchableValue(command.description, text, locale, this.translationService),\n );\n }\n}\n","//#region ---- Imports ----\n\nimport { type AXPEntity, buildEntitySearchTitleContext, isMeaningfulEntityDisplayTitle, isUnresolvedEntityDisplayTemplate, normalizeEntityDisplayTemplate, resolveEntityModifyRecordTitleTemplate, resolveEntityRowTitleTemplate, sanitizeResolvedEntityDisplayTitle } from '@acorex-platform/framework-shared/entity';\nimport { AXFormatService } from '@acorex/core/format';\nimport { AXTranslationService } from '@acorex/core/translation';\n\nimport { AXPContextEvalFactory, AXPExpressionEvaluatorService } from '@acorex-platform/framework-client/core';\nimport { get } from 'lodash-es';\n\nimport { resolveSearchDisplayTemplate, resolveSearchableText } from './search-display-string.util';\nimport { AXPSearchDefinitionDisplayFormat } from './search.types';\n\n//#endregion\n\n//#region ---- Runtime resolution ----\n\n/**\n * Modify/edit popup chrome: `{action} {individual} ({update.title ?? single.title})` when a record template exists.\n */\nexport async function resolveEntityModifyPopupTitle(\n entity: AXPEntity,\n recordData: unknown,\n translationService: AXTranslationService,\n formatService: AXFormatService,\n expressionEvaluator: AXPExpressionEvaluatorService,\n contextEvalFactory: AXPContextEvalFactory,\n actionTitleKey = '@general:actions.modify.title',\n): Promise<string> {\n const actionPrefix = translationService.translateSync(actionTitleKey);\n const entityLabel = translationService.translateSync(entity.formats.individual);\n const baseTitle = `${actionPrefix} ${entityLabel}`.trim();\n\n const recordTemplate = resolveEntityModifyRecordTitleTemplate(entity);\n if (!recordTemplate) {\n return baseTitle;\n }\n\n const locale = translationService.getActiveLang();\n const resolved = await resolveSearchDisplayTemplate(\n recordTemplate,\n recordData,\n locale,\n translationService,\n formatService,\n expressionEvaluator,\n contextEvalFactory,\n );\n const recordTitle = sanitizeResolvedEntityDisplayTitle(\n typeof resolved === 'string'\n ? resolved\n : resolveSearchableText(resolved, locale, translationService),\n );\n\n if (!isMeaningfulEntityDisplayTitle(recordTitle)) {\n return baseTitle;\n }\n\n return `${baseTitle} (${recordTitle})`;\n}\n\n/**\n * Resolves an entity row title using entity-driven fallback templates and property paths.\n */\nexport async function resolveEntitySearchTitleFallback(\n format: Pick<AXPSearchDefinitionDisplayFormat, 'titleFallbackTemplates' | 'titleFallbackFields'>,\n data: unknown,\n locale: string,\n translationService: AXTranslationService,\n formatService: AXFormatService,\n expressionEvaluator: AXPExpressionEvaluatorService,\n contextEvalFactory: AXPContextEvalFactory,\n): Promise<string> {\n if (data == null) {\n return '';\n }\n\n for (const template of format.titleFallbackTemplates ?? []) {\n const resolved = await resolveSearchDisplayTemplate(\n template,\n data,\n locale,\n translationService,\n formatService,\n expressionEvaluator,\n contextEvalFactory,\n );\n const text = sanitizeResolvedEntityDisplayTitle(\n typeof resolved === 'string'\n ? resolved\n : resolveSearchableText(resolved, locale, translationService),\n );\n if (isMeaningfulEntityDisplayTitle(text)) {\n return text;\n }\n }\n\n for (const path of format.titleFallbackFields ?? []) {\n const text = resolveSearchableText(get(data, path), locale, translationService).trim();\n if (text) {\n return text;\n }\n }\n\n return '';\n}\n\n//#endregion\n","import { isMeaningfulEntityDisplayTitle, sanitizeResolvedEntityDisplayTitle } from '@acorex-platform/framework-shared/entity';\nimport { AXFormatService } from '@acorex/core/format';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPContextEvalFactory, AXPExpressionEvaluatorService } from '@acorex-platform/framework-client/core';\nimport { inject, Injectable, InjectionToken } from '@angular/core';\nimport { omit } from 'lodash-es';\nimport { AXPSearchDefinitionProviderService } from './search-definition.provider';\nimport { resolveEntitySearchTitleFallback } from './entity-search-display-title.util';\nimport {\n resolveSearchDisplayTemplate,\n resolveSearchableText,\n searchInRecordValues,\n searchInSearchableValue,\n} from './search-display-string.util';\nimport { AXPSearchProvider } from './search.provider';\nimport { AXPSearchDisplayGroupResult, AXPSearchDisplayResult } from './search.types';\n\n// Injection token for setting providers\nexport const AXP_SEARCH_PROVIDER = new InjectionToken<AXPSearchProvider[]>('AXP_SEARCH_PROVIDER');\n\n@Injectable({ providedIn: 'root' })\nexport class AXPSearchService {\n private providers = inject(AXP_SEARCH_PROVIDER, { optional: true });\n private definitionService = inject(AXPSearchDefinitionProviderService);\n private formatService = inject(AXFormatService);\n private translationService = inject(AXTranslationService);\n private expressionEvaluator = inject(AXPExpressionEvaluatorService);\n private contextEvalFactory = inject(AXPContextEvalFactory);\n\n async search(text: string): Promise<AXPSearchDisplayGroupResult[]> {\n //TODO better handle this\n if (this.definitionService.getList().length == 0) {\n await this.definitionService.getListAsync();\n }\n\n // Collect providers from DI tokens\n const allProviders: AXPSearchProvider[] = [];\n\n // Load from DI tokens\n if (Array.isArray(this.providers)) {\n allProviders.push(...this.providers);\n } else if (this.providers) {\n allProviders.push(this.providers);\n }\n\n if (allProviders.length === 0) {\n throw new Error('No search providers available');\n }\n\n const providersWithSearch = allProviders.filter(\n (provider): provider is AXPSearchProvider => provider != null && typeof provider.search === 'function',\n );\n\n if (providersWithSearch.length === 0) {\n throw new Error('No search providers with a valid search method available');\n }\n\n const locale = this.translationService.getActiveLang() ?? 'en-US';\n const mergeData: AXPSearchDisplayResult[] = [];\n const promises = providersWithSearch.map((provider) => provider.search(text));\n const results = await Promise.all(promises);\n for (const resultArray of results) {\n for (const result of resultArray) {\n try {\n const definition = await this.definitionService.findDefinitionAsync(result.group);\n if (!definition) {\n continue;\n }\n\n const resolvedTitle =\n result.title ??\n (definition.format.title\n ? await resolveSearchDisplayTemplate(\n definition.format.title,\n result.data,\n locale,\n this.translationService,\n this.formatService,\n this.expressionEvaluator,\n this.contextEvalFactory,\n )\n : '');\n const resolvedDescription =\n result.description ??\n (definition.format.description\n ? await resolveSearchDisplayTemplate(\n definition.format.description,\n result.data,\n locale,\n this.translationService,\n this.formatService,\n this.expressionEvaluator,\n this.contextEvalFactory,\n )\n : undefined);\n\n let titleText = sanitizeResolvedEntityDisplayTitle(\n typeof resolvedTitle === 'string'\n ? resolvedTitle\n : resolveSearchableText(resolvedTitle, locale, this.translationService),\n );\n\n if (!isMeaningfulEntityDisplayTitle(titleText)) {\n titleText = await resolveEntitySearchTitleFallback(\n definition.format,\n result.data,\n locale,\n this.translationService,\n this.formatService,\n this.expressionEvaluator,\n this.contextEvalFactory,\n );\n }\n\n if (!isMeaningfulEntityDisplayTitle(titleText)) {\n continue;\n }\n\n mergeData.push({\n definitionName: definition.group,\n definitionTitle: definition.title,\n name: result.group,\n id: `${definition.name}:${this.formatService.format(definition.format.id, 'string', result.data ?? result)}`,\n title: titleText,\n description: resolvedDescription,\n icon: result.icon ?? definition.icon,\n data: result.data,\n command: result.command,\n actions: definition.actions,\n parent: result.parent,\n order: definition.order,\n });\n } catch (e) {\n console.error(e);\n }\n }\n }\n\n const normalizedQuery = text.trim();\n const visibleData =\n normalizedQuery.length === 0\n ? mergeData\n : mergeData.filter(\n (item) =>\n searchInSearchableValue(item.title, normalizedQuery, locale, this.translationService) ||\n searchInSearchableValue(item.description, normalizedQuery, locale, this.translationService) ||\n searchInRecordValues(item.data, normalizedQuery, locale, this.translationService),\n );\n\n // Group data\n const groupedData: AXPSearchDisplayGroupResult[] = [];\n const groupMap: { [key: string]: AXPSearchDisplayGroupResult } = {};\n\n // Create groups\n for (const item of visibleData) {\n const groupName = item.definitionName!; // Change this to the property you want to group by\n if (!groupMap[groupName]) {\n groupMap[groupName] = {\n name: groupName,\n title: item.definitionTitle!, // You can adjust the title logic if needed\n order: item.order, // Add order to the group\n children: [],\n };\n groupedData.push(groupMap[groupName]);\n }\n groupMap[groupName].children.push(omit(item, ['definitionName', 'definitionTitle', 'order']));\n }\n\n // Sort groups by order\n groupedData.sort((a, b) => a.order - b.order);\n\n return groupedData;\n }\n}\n","//#region ---- Imports ----\n\nimport { type AXPEntity, buildEntitySearchTitleContext, ENTITY_LAYOUT_SINGLE_TITLE_PATH, ENTITY_ROW_POPUP_TITLE_OPTION, ENTITY_ROW_TITLE_TEMPLATE_OPTION, isUnresolvedEntityDisplayTemplate, normalizeEntityDisplayTemplate, resolveEntityRowTitleTemplate } from '@acorex-platform/framework-shared/entity';\nimport { AXFormatService } from '@acorex/core/format';\nimport { resolveMultiLanguageString } from '@acorex/core/translation';\n\nimport { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\n\nimport { get } from 'lodash-es';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface AXPResolveEntityRowDisplayTitleOptions {\n /** Row or form context data used to evaluate title templates. */\n data: Record<string, unknown> | undefined;\n activeLang: string;\n formatService: AXFormatService;\n /** Entity definition when available (forms, columns with entity resolver). */\n entity?: AXPEntity | null;\n /** Widget/interface options — may contain `popupTitle` or `titleTemplate`. */\n widgetOptions?: Record<string, unknown> | undefined;\n}\n\n//#endregion\n\n//#region ---- Constants ----\n\nconst INVALID_DISPLAY_TEXT = '[object Object]';\n\nconst DEFAULT_ROW_TITLE_FALLBACK_PATHS = ['title', 'name', 'code'] as const;\n\n//#endregion\n\n//#region ---- Value normalization ----\n\n/** Resolves a row field or format result to a plain display string for the active locale. */\nexport function resolveEntityRowDisplayText(value: unknown, activeLang: string): string {\n if (value == null || value === '') {\n return '';\n }\n\n if (typeof value === 'string') {\n const text = value.trim();\n if (!text || text === INVALID_DISPLAY_TEXT || isUnresolvedEntityDisplayTemplate(text)) {\n return '';\n }\n return text;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n\n if (typeof value === 'object' && !Array.isArray(value)) {\n const text = resolveMultiLanguageString(value as AXPMultiLanguageString, activeLang).trim();\n if (!text || text === INVALID_DISPLAY_TEXT || isUnresolvedEntityDisplayTemplate(text)) {\n return '';\n }\n return text;\n }\n\n return '';\n}\n\n//#endregion\n\n//#region ---- Row title resolution ----\n\nfunction readTitleTemplateFromWidgetOptions(\n widgetOptions: Record<string, unknown> | undefined,\n): unknown {\n if (!widgetOptions) {\n return undefined;\n }\n\n return widgetOptions[ENTITY_ROW_POPUP_TITLE_OPTION] ?? widgetOptions[ENTITY_ROW_TITLE_TEMPLATE_OPTION];\n}\n\nfunction resolveEntityRowDisplayTitleFromContext(\n data: Record<string, unknown>,\n widgetOptions: Record<string, unknown> | undefined,\n formatService: AXFormatService,\n activeLang: string,\n): string {\n const titleTemplate = readTitleTemplateFromWidgetOptions(widgetOptions);\n const fromTemplateValue = resolveEntityRowDisplayText(titleTemplate, activeLang);\n if (fromTemplateValue) {\n return fromTemplateValue;\n }\n\n const fromEntityLayout = resolveEntityRowDisplayText(get(data, ENTITY_LAYOUT_SINGLE_TITLE_PATH), activeLang);\n if (fromEntityLayout) {\n return fromEntityLayout;\n }\n\n if (typeof titleTemplate === 'string' && titleTemplate.trim()) {\n const formatted = formatService.format(normalizeEntityDisplayTemplate(titleTemplate), 'string', data);\n const fromFormattedTemplate = resolveEntityRowDisplayText(formatted, activeLang);\n if (fromFormattedTemplate) {\n return fromFormattedTemplate;\n }\n }\n\n for (const path of DEFAULT_ROW_TITLE_FALLBACK_PATHS) {\n const fromField = resolveEntityRowDisplayText(get(data, path), activeLang);\n if (fromField) {\n return fromField;\n }\n }\n\n return '';\n}\n\n/**\n * Resolves an entity row title for list columns, view widgets, and edit widgets.\n * Uses entity metadata when provided, otherwise widget title templates and common field paths.\n */\nexport function resolveEntityRowDisplayTitle(options: AXPResolveEntityRowDisplayTitleOptions): string {\n const { data, activeLang, formatService, entity, widgetOptions } = options;\n if (!data) {\n return '';\n }\n\n if (entity) {\n const fromEntity = formatEntityRowDisplayTitle(entity, data, formatService, activeLang);\n if (fromEntity) {\n return fromEntity;\n }\n }\n\n return resolveEntityRowDisplayTitleFromContext(data, widgetOptions, formatService, activeLang);\n}\n\n/**\n * @deprecated Use {@link resolveEntityRowDisplayTitle} instead.\n */\nexport function resolveEntityRowDisplayTitleFromColumnContext(\n rowData: Record<string, unknown> | undefined,\n columnOptions: Record<string, unknown> | undefined,\n formatService: AXFormatService,\n activeLang: string,\n): string {\n return resolveEntityRowDisplayTitle({\n data: rowData,\n widgetOptions: columnOptions,\n formatService,\n activeLang,\n });\n}\n\n/**\n * Formats the entity row title for display using entity-driven templates and property paths.\n */\nexport function formatEntityRowDisplayTitle(\n entity: AXPEntity | null | undefined,\n rowData: Record<string, unknown> | undefined,\n formatService: AXFormatService,\n activeLang: string,\n): string {\n if (!rowData) {\n return '';\n }\n\n const titleContext = buildEntitySearchTitleContext(entity ?? ({} as AXPEntity));\n\n for (const path of titleContext.fallbackFields) {\n const fromField = resolveEntityRowDisplayText(get(rowData, path), activeLang);\n if (fromField) {\n return fromField;\n }\n }\n\n const templates = [\n resolveEntityRowTitleTemplate(entity),\n ...titleContext.fallbackTemplates,\n ].filter((template): template is string => !!template?.trim());\n\n for (const template of templates) {\n const formatted = formatService.format(normalizeEntityDisplayTemplate(template), 'string', rowData);\n const fromTemplate = resolveEntityRowDisplayText(formatted, activeLang);\n if (fromTemplate) {\n return fromTemplate;\n }\n }\n\n return '';\n}\n\n//#endregion\n","import type { AXPSearchResult } from './search.types';\n\n/**\n * Shared utility for creating Entity:Create command options used in search command providers.\n * Use with command: { name: 'Entity:Create', options: createEntityCommandOptions(...) }\n */\nexport function createEntityCommandOptions(\n entityKey: string,\n entityInfo: { name: string; module: string; title: string }\n): Record<string, unknown> {\n return {\n entity: entityKey,\n entityInfo: {\n name: entityInfo.name,\n module: entityInfo.module,\n title: entityInfo.title,\n parentKey: undefined,\n source: entityKey,\n },\n data: {},\n options: {},\n \n };\n}\n\n/**\n * Creates a search command for \"Create {Entity}\" with consistent i18n pattern.\n * Use titleKey/descriptionKey from module (e.g. @module:entity.permissions.create.title).\n * Standard: \"Create {Entity}\" for title, \"Create new {entities}\" for description.\n */\nexport function createEntitySearchCommand(config: {\n id: string;\n entityKey: string;\n entityInfo: { name: string; module: string; title: string };\n titleKey: string;\n descriptionKey?: string;\n icon: string;\n}): AXPSearchResult {\n return {\n id: config.id,\n group: 'command',\n title: config.titleKey,\n description: config.descriptionKey ?? config.titleKey,\n icon: config.icon,\n command: {\n name: 'Entity:Create',\n options: createEntityCommandOptions(config.entityKey, config.entityInfo),\n },\n };\n}\n","import { AXTranslationService } from '@acorex/core/translation';\nimport { AXPExecuteCommand } from '@acorex-platform/framework-shared/core';\nimport { inject } from '@angular/core';\nimport { omit, sortBy } from 'lodash-es';\nimport { AXPSearchProvider, AXPSearchResult, searchInSearchableValue } from '../../search';\nimport { AXPMenuProviderService } from './menu.provider';\nimport { AXPMenuItem } from './menu.types';\n\nexport interface AXPMenuItemWithParent extends AXPMenuItem {\n parent?: AXPMenuItem;\n}\n\nexport class AXPMenuSearchProvider implements AXPSearchProvider {\n menuService = inject(AXPMenuProviderService);\n translateService = inject(AXTranslationService);\n\n async search(text: string): Promise<AXPSearchResult[]> {\n const menuItems = this.searchMenuItems(await this.menuService.items(), text);\n return sortBy<AXPSearchResult>(\n menuItems.map<AXPSearchResult>((item) => ({\n group: 'menu', // Use `name` or empty string if undefined\n title: item.text, // Use `text` for the `title`\n icon: item.icon, // Include the `icon` if present\n data: omit(item, ['parent', 'children']), // Include all data except `parent` and `children`\n command: item.path\n ? ({\n name: 'navigate',\n options: {\n type: 'router',\n options: {\n path: item.path,\n },\n },\n } as AXPExecuteCommand)\n : (item.command as AXPExecuteCommand),\n parent: item.parent\n ? {\n title: item.parent.text,\n }\n : undefined,\n })),\n [(o) => this.translateService.translateSync(String(o.title ?? ''))],\n );\n }\n\n /**\n * Recursively searches AXPMenuItem and its children for a matching text.\n *\n * @param menuItems - The array of AXPMenuItem to search in.\n * @param searchText - The text to search for (case-insensitive).\n * @returns An array of AXPMenuItem that match the search text.\n */\n private searchMenuItems(menuItems: AXPMenuItem[], searchText: string): AXPMenuItemWithParent[] {\n const result: AXPMenuItemWithParent[] = [];\n const locale = this.translateService.getActiveLang() ?? 'en-US';\n\n for (const item of menuItems) {\n // Check if the current item's text matches the search text\n if (\n item.type != 'group' &&\n (item.children?.length ?? 0) == 0 &&\n searchInSearchableValue(item.text, searchText, locale, this.translateService)\n ) {\n result.push(item as AXPMenuItemWithParent);\n }\n\n // Recursively search in children if they exist\n if (item.children && item.children.length > 0) {\n const childResults = this.searchMenuItems(item.children, searchText);\n result.push(...childResults.map((x) => ({ ...x, parent: item }) as AXPMenuItemWithParent));\n }\n }\n\n return result;\n }\n}\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\n\n@Component({\n template: `\n <small class=\"text-sm\" [innerHTML]=\"text\"></small>\n `,\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXPFooterTextSlotComponent {\n @Input()\n public text!: string;\n}","\nimport { Component, Input, ViewEncapsulation, inject, ChangeDetectionStrategy } from '@angular/core';\nimport { AXPMenuItem, AXPMenuItemCommand } from '../../../menu';\n\n@Component({\n template: `\n <div class=\"flex items-center justify-between gap-5\">\n @for (link of items; track link) {\n <a (click)=\"handleCommand(link.command)\" >{{ link.text }}</a>\n }\n </div>\n `,\n imports: [],\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.None\n})\nexport class AXPNavBarSlotComponent {\n @Input()\n public items!: AXPMenuItem[];\n\n\n protected handleCommand(action?: AXPMenuItemCommand) {\n // if (action)\n // this.store.dispatch(action)\n }\n}","import { InjectionToken } from '@angular/core';\n\nexport type AXPTokenDefinitionProviderToken =\n | AXPTokenDefinitionProvider\n | Promise<AXPTokenDefinitionProvider>;\n\nexport const AXP_TOKEN_DEFINITION_PROVIDER = new InjectionToken<AXPTokenDefinitionProviderToken[]>(\n 'AXP_TOKEN_DEFINITION_PROVIDER',\n {\n factory: () => [],\n },\n);\n\nexport interface AXPTokenDefinitionProvider<T = any> {\n name: string;\n title: string;\n description?: string;\n\n execute(): Promise<T> | T;\n}\n","//#region ---- Imports ----\n\nimport { inject, Injectable, Injector } from '@angular/core';\nimport { AXP_TOKEN_DEFINITION_PROVIDER, type AXPTokenDefinitionProviderToken } from './token-definition.provider';\nimport { AXPTokenDefinition } from './token.types';\n\n//#endregion\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPTokenDefinitionService {\n //#region ---- Providers & Caches ----\n\n private readonly injector = inject(Injector);\n\n /** Cache for definitions by name. */\n private definitionsByName: Map<string, AXPTokenDefinition> = new Map();\n\n\n\n //#endregion\n\n //#region ---- Public API ----\n\n /**\n * Returns a token definition by its name.\n * First checks the cache, then queries all providers if not found.\n * @param name The token name.\n * @returns The token definition if found, undefined otherwise.\n */\n async getDefinition(name: string): Promise<AXPTokenDefinition | undefined> {\n // Check cache first\n if (this.definitionsByName.has(name)) {\n return this.definitionsByName.get(name);\n }\n // Not in cache, query providers\n // Resolve all providers (some may be promises, some may be arrays)\n const resolvedProviders = await Promise.all(this.resolveDefinitionProviders());\n\n // Flatten the array - some providers may be arrays of providers (e.g., dynamic token providers)\n const flattenedProviders: AXPTokenDefinition[] = [];\n for (const provider of resolvedProviders) {\n if (Array.isArray(provider)) {\n // If provider is an array, add all items\n flattenedProviders.push(...provider);\n } else if (provider) {\n // If provider is a single provider, add it\n flattenedProviders.push(provider);\n }\n }\n\n const match = flattenedProviders.find(def => def?.name === name);\n if (match) {\n this.definitionsByName.set(name, match);\n return match;\n }\n return undefined;\n }\n\n /**\n * Gets the resolved value of a token by its name.\n * @param name The token name.\n * @returns The resolved token value, or undefined if the token is not found.\n */\n async getValue(name: string): Promise<any> {\n const definition = await this.getDefinition(name);\n if (definition) {\n return await definition.execute();\n }\n return undefined;\n }\n\n //#endregion\n\n //#region ---- Cache Management ----\n\n /** Clears the definitions by name cache. */\n clearDefinitionsCache(): void {\n this.definitionsByName.clear();\n }\n\n /**\n * Resolves token providers on demand so dynamic backend loading does not run\n * during unrelated DI (e.g. expression scope registration before login).\n */\n private resolveDefinitionProviders(): AXPTokenDefinitionProviderToken[] {\n return this.injector.get(AXP_TOKEN_DEFINITION_PROVIDER, { optional: true }) || [];\n }\n\n //#endregion\n}\n","\nimport { AXPExpressionEvaluatorScopeProvider, AXPExpressionEvaluatorScopeProviderContext } from \"@acorex-platform/framework-shared/core\";\nimport { inject } from \"@angular/core\";\nimport { AXPTokenDefinitionService } from \"./token-definition.service\";\n\nexport class AXPTokenEvaluatorScopeProvider implements AXPExpressionEvaluatorScopeProvider {\n\n protected tokenService = inject(AXPTokenDefinitionService);\n\n async provide(context: AXPExpressionEvaluatorScopeProviderContext): Promise<void> {\n context.addScope('tokens', {\n get: async (name: string) => {\n return await this.tokenService.getValue(name);\n }\n })\n }\n}\n","import { AXPExpressionEvaluatorScopeProvider, AXPExpressionEvaluatorScopeProviderContext } from '@acorex-platform/framework-shared/core';\nimport { inject } from '@angular/core';\nimport { Router } from '@angular/router';\n\n//#region ---- Query params expression scope ----\n\n/**\n * Exposes URL query parameters in expression strings, e.g.\n * `{{ queryParams.get('view') }}`.\n */\nexport class AXPQueryParamsEvaluatorScopeProvider implements AXPExpressionEvaluatorScopeProvider {\n private readonly router = inject(Router);\n\n async provide(context: AXPExpressionEvaluatorScopeProviderContext): Promise<void> {\n context.addScope('queryParams', {\n get: (key: string) => {\n const value = this.router.parseUrl(this.router.url).queryParamMap.get(key);\n return value ?? undefined;\n },\n });\n }\n}\n\n//#endregion\n","import { AXPQueryService } from '@acorex-platform/framework-client/runtime';\nimport {\n AXPExpressionEvaluatorScopeProvider,\n AXPExpressionEvaluatorScopeProviderContext,\n runtimeQueryCollectionData,\n} from '@acorex-platform/framework-shared/core';\nimport { inject } from '@angular/core';\n\n//#region ----- Query expression scope -----\n\n/**\n * Exposes registered queries in expression strings, e.g.\n * `{{ await query.toArray('Module:ListSomething') }}`.\n */\nexport class AXPQueryEvaluatorScopeProvider implements AXPExpressionEvaluatorScopeProvider {\n private readonly queryService = inject(AXPQueryService);\n\n async provide(context: AXPExpressionEvaluatorScopeProviderContext): Promise<void> {\n context.addScope('query', {\n /**\n * Load all items from a registered query as an array.\n * @param queryKey - Runtime query key\n * @returns Array of items from the query collection result\n */\n toArray: async (queryKey: string) => {\n if (!queryKey) {\n return [];\n }\n\n try {\n const result = await this.queryService.fetch(queryKey, {\n skip: 0,\n take: 10_000,\n });\n const page = runtimeQueryCollectionData(result);\n return page?.items ?? [];\n } catch (error) {\n console.error(`Error loading query \"${queryKey}\":`, error);\n return [];\n }\n },\n });\n }\n}\n\n//#endregion\n","import { AXPopupModule } from '@acorex/components/popup';\nimport { AXToastModule } from '@acorex/components/toast';\nimport { AXFormatterRegistryService } from '@acorex/core/format';\nimport { AXDateTimeModule } from '@acorex/core/date-time';\nimport {\n AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,\n AXPComponentSlotModule,\n AXPModuleManifestModule,\n AXP_LOGO_IMAGE_SRC_RESOLVER,\n} from '@acorex-platform/framework-client/core';\n\nimport { provideCommandSetups } from '@acorex-platform/framework-client/runtime';\nimport { ErrorHandler, inject, Inject, Injector, ModuleWithProviders, NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\n\nimport { AXPBackgroundOperationSlotComponent } from './background-operation';\nimport { AXPBrowserTitleService } from './browser-title';\nimport {\n AXPCustomOperatorService,\n AXPCustomOperatorServiceImpl,\n AXPFilterOperatorMiddlewareService,\n AXPFilterOperatorMiddlewareServiceImpl,\n} from './data';\nimport { AXPErrorHandler, AXPErrorHandlerRegistryService, AXPGlobalErrorHandler } from './errors';\nimport { AXPTranslateFormatter } from './formatters';\nimport { AXPFileStorageEvaluatorScopeProvider } from './file-storage';\nimport { AXPLogoImageSrcResolverService } from './file-storage/logo-image-src-resolver.service';\nimport { AXPKeyboardShortcutsHelpService } from './keyboard-shortcuts';\nimport { AXPMenuSearchDefinitionProvider } from './layout';\nimport { AXPMenuSearchProvider } from './layout/menu/search.provider';\nimport { AXP_SEARCH_DEFINITION_PROVIDER, AXP_SEARCH_PROVIDER } from './search';\nimport { AXP_SETTING_DEFINITION_PROVIDER, AXPSettingsEvaluatorScopeProvider } from './settings';\nimport {\n AXP_SETTING_VALUE_PROVIDER,\n createIndexedDbSettingValueProviders,\n} from './settings/settings.provider';\nimport { AXPSettingsService } from './settings/settings.service';\nimport { AXP_SETTINGS_CACHE_SYNC } from './settings/settings-cache-sync.token';\nimport { AXPTokenEvaluatorScopeProvider } from './tokens';\nimport { AXPQueryParamsEvaluatorScopeProvider } from './utils/query-params-evaluator-scope.provider';\nimport { AXPQueryEvaluatorScopeProvider } from './utils/query-evaluator-scope.provider';\n\nexport interface AXPCommonModuleConfigs {\n errorHandlers: (new () => AXPErrorHandler)[];\n}\n\n@NgModule({\n imports: [\n AXPComponentSlotModule.forChild({\n 'root-footer-end': [\n {\n name: 'background-operation',\n component: AXPBackgroundOperationSlotComponent,\n },\n ],\n }),\n AXPopupModule,\n AXDateTimeModule,\n AXToastModule,\n AXPModuleManifestModule,\n RouterModule.forChild([]),\n ],\n exports: [RouterModule],\n providers: [\n {\n provide: ErrorHandler,\n useClass: AXPGlobalErrorHandler,\n },\n {\n provide: AXPCustomOperatorService,\n useClass: AXPCustomOperatorServiceImpl,\n },\n {\n provide: AXPFilterOperatorMiddlewareService,\n useClass: AXPFilterOperatorMiddlewareServiceImpl,\n },\n\n {\n provide: AXP_SEARCH_PROVIDER,\n useClass: AXPMenuSearchProvider,\n multi: true,\n },\n {\n provide: AXP_SEARCH_DEFINITION_PROVIDER,\n useClass: AXPMenuSearchDefinitionProvider,\n multi: true,\n },\n {\n provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,\n useClass: AXPTokenEvaluatorScopeProvider,\n multi: true,\n },\n {\n provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,\n useClass: AXPSettingsEvaluatorScopeProvider,\n multi: true,\n },\n {\n provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,\n useClass: AXPFileStorageEvaluatorScopeProvider,\n multi: true,\n },\n {\n provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,\n useClass: AXPQueryParamsEvaluatorScopeProvider,\n multi: true,\n },\n {\n provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,\n useClass: AXPQueryEvaluatorScopeProvider,\n multi: true,\n },\n {\n provide: AXP_SETTINGS_CACHE_SYNC,\n useExisting: AXPSettingsService,\n },\n {\n provide: AXP_LOGO_IMAGE_SRC_RESOLVER,\n useExisting: AXPLogoImageSrcResolverService,\n },\n {\n provide: AXP_SETTING_VALUE_PROVIDER,\n useFactory: createIndexedDbSettingValueProviders,\n deps: [Injector],\n },\n {\n provide: AXP_SETTING_DEFINITION_PROVIDER,\n useFactory: async () => {\n const injector = inject(Injector);\n const provider = (await import('./configs/common-settings.provider')).AXPCommonSettingProvider;\n return new provider(injector);\n },\n multi: true,\n },\n provideCommandSetups([\n {\n key: 'navigate',\n command: () => import('./commands/navigate.command').then((c) => c.AXPNavigateCommand),\n },\n ]),\n ],\n})\nexport class AXPCommonModule {\n static forRoot(configs?: AXPCommonModuleConfigs): ModuleWithProviders<AXPCommonModule> {\n return {\n ngModule: AXPCommonModule,\n providers: [\n ...(configs?.errorHandlers || []),\n {\n provide: 'AXPCommonModuleFactory',\n useFactory: (registry: AXPErrorHandlerRegistryService) => () => {\n registry.register(...(configs?.errorHandlers || []));\n },\n deps: [AXPErrorHandlerRegistryService],\n multi: true,\n },\n ],\n };\n }\n\n static forChild(configs?: AXPCommonModuleConfigs): ModuleWithProviders<AXPCommonModule> {\n return {\n ngModule: AXPCommonModule,\n providers: [\n ...(configs?.errorHandlers || []),\n {\n provide: 'AXPCommonModuleFactory',\n useFactory: (registry: AXPErrorHandlerRegistryService) => () => {\n registry.register(...(configs?.errorHandlers || []));\n },\n deps: [AXPErrorHandlerRegistryService],\n multi: true,\n },\n ],\n };\n }\n\n /**\n * @ignore\n */\n constructor(\n @Inject('AXPCommonModuleFactory') instances: any[],\n _keyboardShortcutsHelp: AXPKeyboardShortcutsHelpService,\n formatterRegistry: AXFormatterRegistryService,\n ) {\n formatterRegistry.register(AXPTranslateFormatter);\n instances.forEach((f) => {\n f();\n });\n }\n}\n","import { AXPCommonSettings } from './common-settings.key';\nimport type { AXPSettingsService } from '../settings/settings.service';\n\nexport interface AXPEntityCreateListBehaviorOptions {\n redirect?: boolean;\n}\n\nexport interface AXPEntityCreateListBehavior {\n shouldRedirect: boolean;\n shouldHighlight: boolean;\n}\n\n/**\n * Resolves post-create list behavior from user settings and optional action overrides.\n */\nexport async function resolveEntityCreateListBehavior(\n settingsService: AXPSettingsService,\n options?: AXPEntityCreateListBehaviorOptions,\n): Promise<AXPEntityCreateListBehavior> {\n const [redirectSetting, highlightSetting] = await Promise.all([\n settingsService.get<boolean>(AXPCommonSettings.RedirectToDetailsAfterCreate),\n settingsService.get<boolean>(AXPCommonSettings.HighlightAfterCreateInList),\n ]);\n\n const shouldRedirect =\n options?.redirect !== undefined ? options.redirect : redirectSetting !== false;\n const shouldHighlight = highlightSetting === true;\n\n return { shouldRedirect, shouldHighlight };\n}\n","import { InjectionToken } from \"@angular/core\";\n\nexport const AXP_ROOT_CONFIG_TOKEN = new InjectionToken<AXPRootConfigs>('AXP_ROOT_CONFIG_TOKEN');\n\nexport interface AXPRootConfigs {\n baseUrl: string;\n}","import { DOCUMENT } from '@angular/common';\nimport { inject } from '@angular/core';\n\n//#region ---- System file picker ----\n\nexport interface ChooseSystemFilesOptions {\n accept?: string;\n multiple?: boolean;\n}\n\n/**\n * Opens the native file picker and always settles — including when the user cancels.\n * `AXFileService.choose()` can hang on cancel because no `change` event fires.\n */\nexport function chooseSystemFiles(options: ChooseSystemFilesOptions = {}): Promise<File[]> {\n const document = inject(DOCUMENT);\n const accept = options.accept ?? '';\n const multiple = options.multiple ?? false;\n\n return new Promise((resolve) => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = accept;\n input.multiple = multiple;\n input.style.display = 'none';\n document.body.appendChild(input);\n\n let settled = false;\n\n const settle = (files: File[]) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve(files);\n };\n\n const cleanup = () => {\n input.removeEventListener('change', onChange);\n window.removeEventListener('focus', onWindowFocus);\n input.remove();\n };\n\n const onChange = () => {\n settle(Array.from(input.files ?? []));\n };\n\n const onWindowFocus = () => {\n // Allow `change` to fire first when the user confirms a selection.\n window.setTimeout(() => settle([]), 300);\n };\n\n input.addEventListener('change', onChange);\n window.addEventListener('focus', onWindowFocus, { once: true });\n input.click();\n });\n}\n\n//#endregion\n","import { InjectionToken } from '@angular/core';\nimport { AXCFileUploaderActionsPayload } from './file-actions.types';\n\n//#region ---- Provider Interface ----\n\n/**\n * Type for file action provider token (supports both direct and async providers).\n */\nexport type AXPFileActionProviderToken =\n | AXPFileActionProvider\n | Promise<AXPFileActionProvider>;\n\n/**\n * File action provider interface.\n * Providers can add actions to the file uploader widget.\n */\nexport interface AXPFileActionProvider {\n /**\n * Unique key identifying this provider.\n * Should match the webhook key for backward compatibility: 'file-uploader.actions'\n */\n key: string;\n\n /**\n * Execute the provider to add actions.\n * @param payload The payload containing capabilities and current actions.\n * @returns The modified payload with new actions added.\n */\n execute(payload: AXCFileUploaderActionsPayload): Promise<AXCFileUploaderActionsPayload> | AXCFileUploaderActionsPayload;\n\n /**\n * Priority for execution order (lower numbers execute first).\n * Defaults to 0 if not specified.\n */\n priority?: number;\n}\n\n//#endregion\n\n//#region ---- Injection Token ----\n\n/**\n * Multi-provider injection token for file action providers.\n * Modules can provide multiple implementations using this token.\n */\nexport const AXP_FILE_ACTION_PROVIDER = new InjectionToken<AXPFileActionProviderToken[]>(\n 'AXP_FILE_ACTION_PROVIDER',\n);\n\n//#endregion\n","import { inject, Injectable, Injector, runInInjectionContext } from '@angular/core';\nimport { AXPHookService } from '@acorex-platform/framework-client/core';\nimport { AXP_FILE_ACTION_PROVIDER, AXPFileActionProvider } from './file-actions.provider';\nimport { AXCFileUploaderAction, AXCFileUploaderActionsPayload } from './file-actions.types';\n\n//#region ---- Service ----\n\n/**\n * Service for managing file uploader actions.\n * Aggregates actions from multiple providers and filters them based on plugin configuration.\n * Wraps the hook system for backward compatibility.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPFileActionsService {\n //#region ---- Dependencies ----\n\n private readonly actionProviders = inject(AXP_FILE_ACTION_PROVIDER, { optional: true }) || [];\n private readonly hookService = inject(AXPHookService);\n private readonly injector = inject(Injector);\n\n //#endregion\n\n //#region ---- Public API ----\n\n /**\n * Get all actions from providers, filtered based on plugin configuration.\n * Wraps the hook system for backward compatibility.\n * @param payload Initial payload with capabilities and plugin configuration.\n * @returns Filtered list of actions.\n */\n async getActions(payload: AXCFileUploaderActionsPayload): Promise<AXCFileUploaderAction[]> {\n // First, run hook system for backward compatibility\n // Note: Hook system may still use old format with 'host', but we pass capabilities\n // Hook providers that need host will need to be migrated to use capabilities\n let hookPayload: any;\n try {\n hookPayload = await this.hookService.runAsync('file-uploader.actions', {\n ...payload,\n // For backward compatibility, hooks might expect 'host' but we're using capabilities\n // Old hook providers will need to be migrated\n });\n } catch (err) {\n // If hook fails, continue with new system\n console.warn('[AXPFileActionsService] Hook system failed, continuing with providers only', err);\n }\n\n // Merge hook actions into payload (if any)\n const mergedPayload: AXCFileUploaderActionsPayload = {\n ...payload,\n actions: hookPayload?.actions ?? payload.actions ?? [],\n };\n\n // Resolve all providers (handle both direct and Promise<provider>)\n const providers = await this.resolveProviders();\n\n // Filter providers by key\n const matchingProviders = providers\n .filter((p) => p.key === 'file-uploader.actions')\n .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n\n // Execute providers sequentially (waterfall pattern)\n let currentPayload = { ...mergedPayload, actions: [...mergedPayload.actions] };\n for (const provider of matchingProviders) {\n try {\n currentPayload = await Promise.resolve(\n runInInjectionContext(this.injector, () => provider.execute(currentPayload)),\n );\n } catch (err) {\n console.error(`[AXPFileActionsService] Provider '${provider.key}' failed`, err);\n }\n }\n\n // Filter actions based on plugin configuration\n return this.filterActions(currentPayload.actions, payload.plugins, payload.excludePlugins);\n }\n\n //#endregion\n\n //#region ---- Private Methods ----\n\n /**\n * Resolve all providers (handle both direct providers and Promise<provider>).\n */\n private async resolveProviders(): Promise<AXPFileActionProvider[]> {\n return Promise.all(\n this.actionProviders.map((p) => (p instanceof Promise ? p : Promise.resolve(p))),\n );\n }\n\n /**\n * Filter actions based on enabled plugins and exclude list.\n */\n private filterActions(\n actions: AXCFileUploaderAction[],\n enabledPlugins: { name: string; options?: unknown }[],\n excludePlugins: string[],\n ): AXCFileUploaderAction[] {\n const enabledPluginNames = enabledPlugins?.map((p) => p.name) ?? [];\n const excludedPluginNames = excludePlugins ?? [];\n\n return actions.filter((action) => {\n // Exclude if in exclude list\n if (excludedPluginNames.includes(action.plugin)) {\n return false;\n }\n\n // Include if global\n if (action.global === true) {\n return true;\n }\n\n // Include if plugin is explicitly enabled\n if (enabledPluginNames.length > 0 && enabledPluginNames.includes(action.plugin)) {\n return true;\n }\n\n // If no plugins are enabled, only show global actions\n if (enabledPluginNames.length === 0) {\n return !!action.global;\n }\n\n return false;\n });\n }\n\n //#endregion\n}\n\n//#endregion\n","import { AXPFileListItem } from '@acorex-platform/framework-shared/core';\n\n//#region ---- File Uploader Capabilities ----\n\n/**\n * Capabilities API provided to file action providers.\n * These methods allow actions to interact with the file uploader widget.\n */\nexport interface AXCFileUploaderCapabilities {\n /**\n * Get all current files in the uploader.\n */\n getFiles: () => AXPFileListItem[];\n\n /**\n * Replace all files in the uploader.\n */\n setFiles: (files: AXPFileListItem[]) => void;\n\n /**\n * Add new files to the uploader.\n */\n addFiles: (files: AXPFileListItem[]) => void;\n\n /**\n * Update files matching a predicate.\n */\n updateFile: (\n predicate: (f: AXPFileListItem) => boolean,\n updater: (f: AXPFileListItem) => AXPFileListItem,\n ) => void;\n\n /**\n * Remove a file from the uploader.\n */\n removeFile: (file: AXPFileListItem) => void;\n\n /**\n * Clear all files from the uploader.\n */\n clear: () => void;\n\n /**\n * Get a file by its ID.\n */\n getFileById: (id: string) => AXPFileListItem | undefined;\n\n /**\n * Update a file by its ID.\n */\n updateFileById: (id: string, next: Partial<AXPFileListItem>) => void;\n}\n\n//#endregion\n\n//#region ---- File Uploader Action ----\n\n/**\n * A file uploader action that can be added by providers.\n */\nexport interface AXCFileUploaderAction {\n /**\n * Unique identifier for the action/plugin.\n */\n plugin: string;\n\n /**\n * Whether this action is global (available even if plugin is not explicitly enabled).\n */\n global?: boolean;\n\n /**\n * Display text for the action (optional if textKey is provided).\n */\n text?: string;\n\n /**\n * Translation key for the action text (optional if text is provided).\n */\n textKey?: string;\n\n /**\n * Icon class for the action (e.g., 'fa-light fa-file-arrow-up').\n */\n icon?: string;\n\n /**\n * Action execution handler.\n * Receives capabilities to interact with the file uploader.\n * @param capabilities The capabilities API for file operations.\n */\n run: (capabilities: AXCFileUploaderCapabilities) => void | Promise<void>;\n}\n\n//#endregion\n\n//#region ---- File Uploader Actions Payload ----\n\n/**\n * Payload passed to file action providers.\n */\nexport interface AXCFileUploaderActionsPayload {\n /**\n * Enabled plugins configuration.\n */\n plugins: { name: string; options?: unknown }[];\n\n /**\n * List of plugin names to exclude.\n */\n excludePlugins: string[];\n\n /**\n * Capabilities API for interacting with the file uploader.\n */\n capabilities: AXCFileUploaderCapabilities;\n\n /**\n * Current list of actions (providers can add to this array).\n */\n actions: AXCFileUploaderAction[];\n\n /**\n * Widget options (optional, for accessing widget-specific settings).\n */\n options?: {\n /**\n * Whether multiple files are allowed.\n */\n multiple?: boolean;\n\n /**\n * Accepted file types (e.g., '.jpg,.png' or 'image/*').\n */\n accept?: string;\n };\n}\n\n//#endregion\n","import { AXPDataGenerator } from '@acorex-platform/framework-client/core';\nimport { AXPFileListItem } from '@acorex-platform/framework-shared/core';\n\nimport { chooseSystemFiles } from './choose-system-files.util';\nimport { AXPFileActionProvider } from './file-actions.provider';\nimport { AXCFileUploaderActionsPayload, AXCFileUploaderCapabilities } from './file-actions.types';\n\nexport const UploadFromComputerActionProvider: AXPFileActionProvider = {\n key: 'file-uploader.actions',\n priority: 1, // Higher priority than upload-from-drive to show first\n execute: (payload: AXCFileUploaderActionsPayload): AXCFileUploaderActionsPayload => {\n // Capture widget options for use in the action\n const widgetOptions = payload.options;\n\n payload.actions = [\n ...payload.actions,\n {\n plugin: 'upload-from-computer',\n global: true,\n textKey: '@document-management:actions.upload-from-device',\n icon: 'fa-light fa-file-arrow-up',\n run: async (capabilities: AXCFileUploaderCapabilities) => {\n // Open file picker with widget options\n const files = await chooseSystemFiles({\n multiple: widgetOptions?.multiple ?? true,\n accept: widgetOptions?.accept,\n });\n\n // If no files are selected, return\n if (files.length === 0) {\n return;\n }\n\n // Create file list items from selected files\n const fileItems = files.map(\n (file) =>\n ({\n id: AXPDataGenerator.uuid(),\n name: file.name,\n size: file.size,\n status: 'attached',\n source: {\n kind: 'blob',\n value: file,\n },\n }) as AXPFileListItem,\n );\n\n // Add files using capabilities\n capabilities.addFiles(fileItems);\n },\n },\n ];\n\n return payload;\n },\n};\n","import { inject, Injectable, InjectionToken } from '@angular/core';\nimport { AXPFileType } from './file-type.types';\n\nexport interface AXPFileTypeInfoProvider {\n items(purpose?: string | string[]): Promise<AXPFileType[]>;\n}\n\nexport const AXP_FILE_TYPE_INFO_PROVIDER = new InjectionToken<AXPFileTypeInfoProvider[]>('AXP_FILE_TYPE_INFO_PROVIDER');\n\n@Injectable({ providedIn: 'root' })\nexport class AXPFileTypeProviderService implements AXPFileTypeInfoProvider {\n private providers = inject(AXP_FILE_TYPE_INFO_PROVIDER, { optional: true });\n\n async items(purpose?: string | string[]): Promise<AXPFileType[]> {\n const items: AXPFileType[] = [];\n\n if (Array.isArray(this.providers)) {\n for (const provider of this.providers) {\n items.push(...(await provider.items(purpose)));\n }\n }\n return items;\n }\n\n async get(name: string, purpose?: string | string[]): Promise<AXPFileType | undefined> {\n return (await this.items(purpose)).find((c) => c.name == name);\n }\n}\n","/** Default catalog purposes for document-management (excludes conversation). */\nexport const AXP_DOCUMENT_FILE_TYPE_PURPOSES = ['system', 'document'] as const;\n\nexport function normalizeDocumentFileTypePurposes(purpose?: string | string[]): string[] {\n if (!purpose) {\n return [...AXP_DOCUMENT_FILE_TYPE_PURPOSES];\n }\n return Array.isArray(purpose) ? purpose : [purpose];\n}\n\nexport {\n AX_FILE_TYPE_METADATA_PURPOSE,\n filterFileTypesByPurpose,\n getFileTypePurposes,\n} from '@acorex/core/file';\n","import { getFileExtension } from '@acorex/core/file';\nimport type { AXPFileListItem } from '@acorex-platform/framework-shared/core';\n\nimport { AXPFileType } from './file-type.types';\n\n//#region ---- File type display (catalog-backed icons) ----\n\nexport interface AXPFileTypeDisplayInfo {\n /** Font Awesome classes from the catalog (extension or parent file type). */\n icon: string;\n /** Logical catalog type name (e.g. `video`, `audio`, `file`, `document`). */\n typeName: string;\n /** Lowercase extension without a leading dot; empty when unknown. */\n extension: string;\n}\n\nconst DEFAULT_ICON = 'fa-solid fa-file';\nconst DEFAULT_TYPE_NAME = 'file';\n\n/**\n * Picks the best file name for extension-based icon lookup in the explorer.\n * Document display names may omit the extension while `fileId.name` retains it.\n */\nexport function resolveExplorerFileDisplayName(\n nodeName: string,\n fileId?: AXPFileListItem | string,\n): string {\n if (nodeName.includes('.')) {\n return nodeName;\n }\n\n if (fileId != null && typeof fileId === 'object' && fileId.name?.includes('.')) {\n return fileId.name;\n }\n\n return nodeName;\n}\n\n/**\n * Resolves explorer / list icon and logical file type from the ACoreX file-type catalog.\n * Matches the file name extension against each catalog entry's `extensions`, then falls back\n * to the parent type icon (`video`, `audio`, `file`, …).\n */\nexport function resolveFileTypeDisplay(fileName: string, catalog: AXPFileType[]): AXPFileTypeDisplayInfo {\n const extension = (getFileExtension(fileName) ?? '').toLowerCase();\n\n if (!extension || catalog.length === 0) {\n return { icon: DEFAULT_ICON, typeName: DEFAULT_TYPE_NAME, extension };\n }\n\n for (const type of catalog) {\n const match = (type.extensions ?? []).find((ext) => ext.name?.toLowerCase() === extension);\n if (match) {\n return {\n icon: match.icon || type.icon || DEFAULT_ICON,\n typeName: type.name,\n extension,\n };\n }\n }\n\n return { icon: DEFAULT_ICON, typeName: DEFAULT_TYPE_NAME, extension };\n}\n\n//#endregion\n","import { AXFileService, getFileExtension, resolveFileTypeExtension, resolveFileTypeOpen, runFileTypeOpen, type AXFileTypeExtensionHint, type AXFileTypeOpenContext } from '@acorex/core/file';\nimport { Injector } from '@angular/core';\n\nimport { resolveFileTypeDisplay } from './file-type-display.util';\nimport { AXPFileType } from './file-type.types';\n\nexport const AX_FILE_TYPE_METADATA_SUPPORT_BY_FILE_VIEWER = 'showInViewer';\n\n/**\n * Whether a catalog file type should appear in the file viewer.\n * Missing metadata defaults to `true` (shown).\n */\nexport function isFileTypeShownInViewer(\n fileType: Pick<AXPFileType, 'metadata'> | null | undefined,\n): boolean {\n return fileType?.metadata?.[AX_FILE_TYPE_METADATA_SUPPORT_BY_FILE_VIEWER] !== false;\n}\n\n/**\n * Resolves the catalog type for `fileName` and returns whether it should appear in the file viewer.\n * Unmatched / unknown types default to shown (`true`).\n */\nexport function isFileNameShownInViewer(fileName: string, catalog: AXPFileType[]): boolean {\n const { typeName } = resolveFileTypeDisplay(fileName, catalog);\n const fileType = catalog.find((type) => type.name === typeName);\n return isFileTypeShownInViewer(fileType);\n}\n\n//#region ---- File type open (catalog → AX registry) ----\n\nexport function createFileTypeOpenContext(injector: Injector, platformId: object): AXFileTypeOpenContext {\n return {\n injector,\n platformId,\n readAsDataUrl: (file) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = () => reject(reader.error);\n reader.readAsDataURL(file);\n }),\n };\n}\n\nfunction buildFileTypeExtensionHint(fileName: string, payload?: unknown): AXFileTypeExtensionHint {\n if (payload instanceof File) {\n return {\n file: payload,\n extensionName: getFileExtension(payload.name) || getFileExtension(fileName) || undefined,\n };\n }\n\n const extensionName = getFileExtension(fileName) || undefined;\n if (!payload || typeof payload !== 'object') {\n return { extensionName };\n }\n\n const record = payload as Record<string, unknown>;\n const itemName = typeof record['name'] === 'string' ? record['name'] : fileName;\n const resolvedExtension = getFileExtension(itemName) || extensionName;\n\n const source = record['source'] as { kind?: string; value?: unknown } | undefined;\n if (source?.kind === 'blob' && source.value instanceof Blob) {\n return {\n extensionName: resolvedExtension,\n mimeType: source.value.type || undefined,\n };\n }\n\n return { extensionName: resolvedExtension };\n}\n\n/**\n * Returns whether the catalog-resolved file type has an `open` handler on the matched\n * extension or its parent type (extension-first, per {@link resolveFileTypeOpen}).\n */\nexport async function hasFileTypeOpenHandler(options: { fileName: string; catalog: AXPFileType[]; fileService: AXFileService; payload?: unknown }): Promise<boolean> {\n const display = resolveFileTypeDisplay(options.fileName, options.catalog);\n const fileType = await options.fileService.getFileType(display.typeName);\n if (!fileType) {\n return false;\n }\n\n const extension = resolveFileTypeExtension(fileType, buildFileTypeExtensionHint(options.fileName, options.payload));\n\n return typeof resolveFileTypeOpen(fileType, extension) === 'function';\n}\n\n/**\n * Resolves extension → parent `open` and runs it when present.\n * Returns `true` when a handler ran; `false` when none exists (caller should download).\n */\nexport async function tryOpenFileByCatalogType(options: { fileName: string; catalog: AXPFileType[]; fileService: AXFileService; openContext: AXFileTypeOpenContext; payload: unknown }): Promise<boolean> {\n const display = resolveFileTypeDisplay(options.fileName, options.catalog);\n const fileType = await options.fileService.getFileType(display.typeName);\n if (!fileType) {\n return false;\n }\n\n const extension = resolveFileTypeExtension(fileType, buildFileTypeExtensionHint(options.fileName, options.payload));\n\n if (!resolveFileTypeOpen(fileType, extension)) {\n return false;\n }\n\n const result = await runFileTypeOpen(fileType, options.openContext, options.payload, extension);\n return result !== false;\n}\n\n//#endregion\n","import { inject, Injectable } from '@angular/core';\nimport {\n AX_FILE_TYPE_METADATA_PURPOSE,\n AXFileTypeRegistryService,\n getFileTypePurposes,\n type AXFileType,\n} from '@acorex/core/file';\n\nimport { normalizeDocumentFileTypePurposes } from './file-type-purpose.util';\nimport { AXPFileExtension, AXPFileType } from './file-type.types';\nimport { AXPFileTypeInfoProvider } from './file-type.provider';\n\n//#region ---- ACoreX file type bridge ----\n\nfunction mapExtension(ext: NonNullable<AXFileType['extensions']>[number]): AXPFileExtension {\n return {\n name: ext.name,\n title: ext.title ?? ext.name,\n icon: ext.icon,\n };\n}\n\nfunction mapFileType(type: AXFileType): AXPFileType {\n return {\n name: type.name,\n title: type.title ?? type.name,\n icon: type.icon,\n metadata: type.metadata ?? { [AX_FILE_TYPE_METADATA_PURPOSE]: getFileTypePurposes(type) },\n extensions: (type.extensions ?? []).map(mapExtension),\n };\n}\n\n/**\n * Bridges {@link AXFileTypeRegistryService} into the platform {@link AXPFileTypeInfoProvider} token.\n * Excludes conversation-purpose types by default.\n */\n@Injectable()\nexport class AXPAcorexFileTypeBridgeProvider implements AXPFileTypeInfoProvider {\n private readonly registry = inject(AXFileTypeRegistryService);\n\n async items(purpose?: string | string[]): Promise<AXPFileType[]> {\n const types = await this.registry.getTypes({\n purpose: normalizeDocumentFileTypePurposes(purpose),\n });\n return types.map(mapFileType);\n }\n}\n\n//#endregion\n","import { AXFileModule } from '@acorex/core/file';\nimport { NgModule } from '@angular/core';\n\nimport { AXP_FILE_TYPE_INFO_PROVIDER } from './file-type.provider';\nimport { AXPAcorexFileTypeBridgeProvider } from './acorex-file-type.bridge';\n\n//#region ---- ACoreX file type module ----\n\n/**\n * Registers ACoreX built-in file types (image, video, audio, file, document) and exposes them\n * through the platform {@link AXP_FILE_TYPE_INFO_PROVIDER} token.\n */\n@NgModule({\n imports: [AXFileModule.forRoot()],\n providers: [\n {\n provide: AXP_FILE_TYPE_INFO_PROVIDER,\n useClass: AXPAcorexFileTypeBridgeProvider,\n multi: true,\n },\n ],\n})\nexport class AXPAcorexFileTypeModule {}\n\n//#endregion\n","import { InjectionToken } from '@angular/core';\nimport type { AXPIntegrationProviderContext } from './integration-provider.context';\n\n//#region ---- Integration provider interface ----\n\nexport interface AXPIntegrationProvider {\n provide(context: AXPIntegrationProviderContext): Promise<void>;\n}\n\nexport const AXP_INTEGRATION_PROVIDER = new InjectionToken<AXPIntegrationProvider[]>(\n 'AXP_INTEGRATION_PROVIDER',\n {\n providedIn: 'root',\n factory: () => [],\n },\n);\n\n//#endregion\n\n//#region ---- Integration runtime provider (lazy hooks) ----\n\nexport interface AXPIntegrationRuntimeProvider {\n readonly providerId: string;\n getHooks(): Promise<import('@acorex-platform/framework-shared/core').AXPIntegrationProviderRuntimeHooks>;\n}\n\nexport const AXP_INTEGRATION_RUNTIME_PROVIDER = new InjectionToken<AXPIntegrationRuntimeProvider[]>(\n 'AXP_INTEGRATION_RUNTIME_PROVIDER',\n {\n providedIn: 'root',\n factory: () => [],\n },\n);\n\n//#endregion\n","import { InjectionToken } from '@angular/core';\nimport type { AXPIntegrationDomainProviderContext } from './integration-domain-provider.context';\n\n//#region ---- Integration domain provider interface ----\n\nexport interface AXPIntegrationDomainProvider {\n provide(context: AXPIntegrationDomainProviderContext): Promise<void>;\n}\n\nexport const AXP_INTEGRATION_DOMAIN_PROVIDER = new InjectionToken<AXPIntegrationDomainProvider[]>(\n 'AXP_INTEGRATION_DOMAIN_PROVIDER',\n {\n providedIn: 'root',\n factory: () => [],\n },\n);\n\n//#endregion\n","import type { AXPIntegrationDomainDefinition } from '@acorex-platform/framework-shared/core';\n\n//#region ---- Integration domain context ----\n\nexport class AXPIntegrationDomainProviderContext {\n private readonly definitions = new Map<string, AXPIntegrationDomainDefinition>();\n\n register(definition: AXPIntegrationDomainDefinition): void {\n // Idempotent: multiple extensions (e.g. Telegram + WhatsApp) may register the same domain.\n if (this.definitions.has(definition.id)) {\n return;\n }\n this.definitions.set(definition.id, definition);\n }\n\n getDefinitions(): ReadonlyMap<string, AXPIntegrationDomainDefinition> {\n return this.definitions;\n }\n}\n\n//#endregion\n","import type { AXPIntegrationProviderDefinition } from '@acorex-platform/framework-shared/core';\n\n//#region ---- Integration provider context ----\n\nexport class AXPIntegrationProviderContext {\n //#region ---- State ----\n\n private readonly definitions = new Map<string, AXPIntegrationProviderDefinition>();\n\n //#endregion\n\n //#region ---- Builder API ----\n\n /**\n * Registers a provider definition. Throws when duplicate ids are registered.\n */\n register(definition: AXPIntegrationProviderDefinition): void {\n if (this.definitions.has(definition.id)) {\n throw new Error(\n `[AXPIntegrationProviderContext] Duplicate integration provider id '${definition.id}'.`,\n );\n }\n this.definitions.set(definition.id, definition);\n }\n\n //#endregion\n\n //#region ---- Accessors ----\n\n getDefinitions(): ReadonlyMap<string, AXPIntegrationProviderDefinition> {\n return this.definitions;\n }\n\n //#endregion\n}\n\n//#endregion\n","import type {\n AXPIntegrationCapability,\n AXPIntegrationDomainDefinition,\n AXPIntegrationProviderDefinition,\n AXPIntegrationProviderDefinitionResolved,\n} from '@acorex-platform/framework-shared/core';\nimport { inject, Injectable } from '@angular/core';\nimport { defaultTo, uniq } from 'lodash-es';\n\nimport { AXPIntegrationDomainProviderContext } from './integration-domain-provider.context';\nimport {\n AXP_INTEGRATION_DOMAIN_PROVIDER,\n type AXPIntegrationDomainProvider,\n} from './integration-domain.provider';\nimport { AXPIntegrationProviderContext } from './integration-provider.context';\nimport { AXP_INTEGRATION_PROVIDER, type AXPIntegrationProvider } from './integration.provider';\n\n//#region ---- Integration domain registry ----\n\n@Injectable({ providedIn: 'root' })\nexport class AXPIntegrationDomainRegistryService {\n private readonly domainProviders = inject(AXP_INTEGRATION_DOMAIN_PROVIDER, { optional: true });\n private readonly integrationProviders = inject(AXP_INTEGRATION_PROVIDER, { optional: true });\n\n private domainCache: Map<string, AXPIntegrationDomainDefinition> | null = null;\n private providerCache: Map<string, AXPIntegrationProviderDefinitionResolved> | null = null;\n\n async listDomains(): Promise<AXPIntegrationDomainDefinition[]> {\n const map = await this.loadDomains();\n return Array.from(map.values()).sort(\n (a, b) => defaultTo(a.sortOrder, 100) - defaultTo(b.sortOrder, 100),\n );\n }\n\n async getDomain(id: string): Promise<AXPIntegrationDomainDefinition | null> {\n const map = await this.loadDomains();\n return map.get(id) ?? null;\n }\n\n async getDomainOrThrow(id: string): Promise<AXPIntegrationDomainDefinition> {\n const domain = await this.getDomain(id);\n if (!domain) {\n throw new Error(`[AXPIntegrationDomainRegistry] Unknown integration domain '${id}'.`);\n }\n return domain;\n }\n\n async listProviders(): Promise<AXPIntegrationProviderDefinitionResolved[]> {\n const map = await this.loadProviders();\n return Array.from(map.values());\n }\n\n async listProvidersByDomain(domainId: string): Promise<AXPIntegrationProviderDefinitionResolved[]> {\n const providers = await this.listProviders();\n return providers.filter((provider) => provider.domainId === domainId);\n }\n\n async getProvider(id: string): Promise<AXPIntegrationProviderDefinitionResolved | null> {\n const map = await this.loadProviders();\n return map.get(id) ?? null;\n }\n\n async getProviderOrThrow(id: string): Promise<AXPIntegrationProviderDefinitionResolved> {\n const provider = await this.getProvider(id);\n if (!provider) {\n throw new Error(`[AXPIntegrationDomainRegistry] Unknown integration provider '${id}'.`);\n }\n return provider;\n }\n\n clearCache(): void {\n this.domainCache = null;\n this.providerCache = null;\n }\n\n private normalizeProviders<T>(providers: T | T[] | null | undefined): T[] {\n if (!providers) {\n return [];\n }\n return Array.isArray(providers) ? providers : [providers];\n }\n\n private async loadDomains(): Promise<Map<string, AXPIntegrationDomainDefinition>> {\n if (this.domainCache) {\n return this.domainCache;\n }\n\n const context = new AXPIntegrationDomainProviderContext();\n for (const provider of this.normalizeProviders(this.domainProviders)) {\n const resolved: AXPIntegrationDomainProvider =\n provider instanceof Promise ? await provider : provider;\n await resolved.provide(context);\n }\n\n this.domainCache = new Map(context.getDefinitions());\n return this.domainCache;\n }\n\n private async loadProviders(): Promise<Map<string, AXPIntegrationProviderDefinitionResolved>> {\n if (this.providerCache) {\n return this.providerCache;\n }\n\n const domains = await this.loadDomains();\n const context = new AXPIntegrationProviderContext();\n\n for (const provider of this.normalizeProviders(this.integrationProviders)) {\n const resolved: AXPIntegrationProvider =\n provider instanceof Promise ? await provider : provider;\n await resolved.provide(context);\n }\n\n const resolvedProviders = new Map<string, AXPIntegrationProviderDefinitionResolved>();\n for (const definition of context.getDefinitions().values()) {\n resolvedProviders.set(definition.id, this.resolveProviderDefinition(definition, domains));\n }\n\n this.providerCache = resolvedProviders;\n return this.providerCache;\n }\n\n private resolveProviderDefinition(\n definition: AXPIntegrationProviderDefinition,\n domains: Map<string, AXPIntegrationDomainDefinition>,\n ): AXPIntegrationProviderDefinitionResolved {\n const domain = domains.get(definition.domainId);\n if (!domain) {\n throw new Error(\n `[AXPIntegrationDomainRegistry] Provider '${definition.id}' references unknown domain '${definition.domainId}'.`,\n );\n }\n\n const domainCapabilities = defaultTo(domain.capabilities, []);\n const providerCapabilities = defaultTo(definition.capabilities, []);\n\n return {\n ...definition,\n category: domain.category,\n capabilities: uniq([...domainCapabilities, ...providerCapabilities]) as AXPIntegrationCapability[],\n };\n }\n}\n\n//#endregion\n","import type {\n AXPIntegrationDomainDefinition,\n AXPIntegrationProviderDefinitionResolved,\n} from '@acorex-platform/framework-shared/core';\nimport { inject, Injectable } from '@angular/core';\n\nimport { AXPIntegrationDomainRegistryService } from './integration-domain.registry.service';\n\n//#region ---- Integration provider registry ----\n\n/** @deprecated Use {@link AXPIntegrationDomainRegistryService} for domain-aware provider access. */\n@Injectable({ providedIn: 'root' })\nexport class AXPIntegrationProviderRegistryService {\n private readonly domainRegistry = inject(AXPIntegrationDomainRegistryService);\n\n async list(): Promise<AXPIntegrationProviderDefinitionResolved[]> {\n return this.domainRegistry.listProviders();\n }\n\n async get(id: string): Promise<AXPIntegrationProviderDefinitionResolved | null> {\n return this.domainRegistry.getProvider(id);\n }\n\n async getOrThrow(id: string): Promise<AXPIntegrationProviderDefinitionResolved> {\n return this.domainRegistry.getProviderOrThrow(id);\n }\n\n clearCache(): void {\n this.domainRegistry.clearCache();\n }\n}\n\n/** Convenience alias for domain listing. */\n@Injectable({ providedIn: 'root' })\nexport class AXPIntegrationDomainRegistryFacade {\n private readonly domainRegistry = inject(AXPIntegrationDomainRegistryService);\n\n listDomains(): Promise<AXPIntegrationDomainDefinition[]> {\n return this.domainRegistry.listDomains();\n }\n\n listProvidersByDomain(domainId: string): Promise<AXPIntegrationProviderDefinitionResolved[]> {\n return this.domainRegistry.listProvidersByDomain(domainId);\n }\n}\n\n//#endregion\n","import type { AXPIntegrationAuthContext, AXPIntegrationProviderDefinition, AXPIntegrationResolvedCredentials, AXPIntegrationRuntimeContext, AXPIntegrationSecretPayload } from '@acorex-platform/framework-shared/core';\nimport { InjectionToken } from '@angular/core';\n\n//#region ---- Secret store token ----\n\nexport interface AXPIntegrationSecretRefInput {\n providerId: string;\n connectionId: string;\n tenantId: string;\n userId: string;\n authMethodType: string;\n}\n\nexport interface AXPIntegrationSecretStore {\n store(ref: AXPIntegrationSecretRefInput, payload: AXPIntegrationSecretPayload): Promise<string>;\n rotate(\n secretRef: string,\n context: AXPIntegrationAuthContext,\n payload: Partial<AXPIntegrationSecretPayload>,\n ): Promise<void>;\n resolve(secretRef: string, context: AXPIntegrationAuthContext): Promise<AXPIntegrationResolvedCredentials>;\n revoke(secretRef: string, context: AXPIntegrationAuthContext): Promise<void>;\n delete(secretRef: string, context: AXPIntegrationAuthContext): Promise<void>;\n}\n\nexport const AXP_INTEGRATION_SECRET_STORE = new InjectionToken<AXPIntegrationSecretStore>(\n 'AXP_INTEGRATION_SECRET_STORE',\n);\n\n//#endregion\n\n//#region ---- Runtime service token ----\n\nexport interface AXPIntegrationWithClientOptions {\n providerId: string;\n connectionScope?: 'user' | 'tenant';\n connectionKey?: string;\n requiredCapabilities?: string[];\n requiredScopes?: string[];\n}\n\nexport abstract class AXPIntegrationRuntimeService {\n abstract getProvider(id: string): Promise<AXPIntegrationProviderDefinition>;\n abstract listProviders(): Promise<AXPIntegrationProviderDefinition[]>;\n abstract getConnection(\n options: AXPIntegrationWithClientOptions,\n ): Promise<import('@acorex-platform/framework-shared/core').AXPSafeIntegrationConnectionDto>;\n abstract withClient<T>(\n options: AXPIntegrationWithClientOptions,\n fn: (client: unknown, ctx: AXPIntegrationRuntimeContext) => Promise<T>,\n ): Promise<T>;\n abstract buildRuntimeContext(\n connection: import('@acorex-platform/framework-shared/core').AXPSafeIntegrationConnectionDto & { secretRef: string },\n ): Promise<AXPIntegrationRuntimeContext>;\n}\n\nexport interface AXPIntegrationOAuthStartInput {\n providerId: string;\n connectionScope: 'user' | 'tenant';\n connectionKey: string;\n displayName: string;\n redirectUri: string;\n tenantId: string;\n userId: string;\n scopes?: string[];\n}\n\nexport interface AXPIntegrationOAuthCompleteInput {\n providerId: string;\n state: string;\n code: string;\n}\n\nexport abstract class AXPIntegrationOAuthService {\n abstract startAuthorization(\n input: AXPIntegrationOAuthStartInput,\n ): Promise<{ redirectUrl: string; state: string }>;\n abstract completeCallback(input: AXPIntegrationOAuthCompleteInput): Promise<{ connectionId: string }>;\n}\n\nexport const AXP_INTEGRATION_OAUTH_SERVICE = new InjectionToken<AXPIntegrationOAuthService>(\n 'AXP_INTEGRATION_OAUTH_SERVICE',\n);\n\n//#endregion\n","import type { AXPSafeIntegrationConnectionDto } from '@acorex-platform/framework-shared/core';\nimport { InjectionToken } from '@angular/core';\n\n//#region ---- Connection established handler ----\n\n/**\n * Optional hook invoked after a connection is successfully established (OAuth callback or credentials connect).\n * Use to link provider-specific records (e.g. Jira/GitLab instance ↔ integration connection).\n */\nexport interface AXPIntegrationConnectionEstablishedHandler {\n readonly providerId: string;\n onEstablished(connection: AXPSafeIntegrationConnectionDto): Promise<void>;\n}\n\nexport const AXP_INTEGRATION_CONNECTION_ESTABLISHED = new InjectionToken<\n AXPIntegrationConnectionEstablishedHandler[]\n>('AXP_INTEGRATION_CONNECTION_ESTABLISHED', {\n providedIn: 'root',\n factory: () => [],\n});\n\n//#endregion\n","import type { AXPSafeIntegrationConnectionDto } from '@acorex-platform/framework-shared/core';\nimport { InjectionToken } from '@angular/core';\n\n//#region ---- Connection lifecycle handler ----\n\n/**\n * Optional hooks for connection disconnect / delete / enable toggles.\n * Providers (e.g. Simpro) use these to manage schedules and background jobs.\n */\nexport interface AXPIntegrationConnectionLifecycleHandler {\n readonly providerId: string;\n onDisconnected?(connection: AXPSafeIntegrationConnectionDto): Promise<void>;\n onDeleted?(connection: AXPSafeIntegrationConnectionDto): Promise<void>;\n onEnabledChanged?(connection: AXPSafeIntegrationConnectionDto, enabled: boolean): Promise<void>;\n}\n\nexport const AXP_INTEGRATION_CONNECTION_LIFECYCLE = new InjectionToken<\n AXPIntegrationConnectionLifecycleHandler[]\n>('AXP_INTEGRATION_CONNECTION_LIFECYCLE', {\n providedIn: 'root',\n factory: () => [],\n});\n\n//#endregion\n","//#region ---- Integration barrel ----\n\nexport * from './integration.provider';\nexport * from './integration-domain.provider';\nexport * from './integration-domain-provider.context';\nexport * from './integration-domain.registry.service';\nexport * from './integration-provider.context';\nexport * from './integration-provider.registry.service';\nexport * from './integration-secret-store.token';\nexport * from './integration-connection-established.token';\nexport * from './integration-connection-lifecycle.token';\n\n//#endregion\n","//#region ----- Types -----\n\n/** Online local strategies (offline modes are out of scope for this phase). */\nexport type AXPLocalEntityMode = 'cache' | 'local-first';\n\n/** How this entity participates in the local-data graph. */\nexport type AXPLocalEntityRole = 'entity' | 'catalog' | 'lookup-target';\n\n/** How a host entity prefetches a related / lookup target into local stores. */\nexport type AXPLocalRelatedStrategy = 'referenced-ids' | 'catalog';\n\nexport interface AXPLocalEntityRelatedOption {\n /** Host field holding the FK (e.g. `assigneeId`). */\n field: string;\n /** Target entity key (`Module.Entity`). */\n entity: string;\n strategy: AXPLocalRelatedStrategy;\n}\n\n/**\n * Policy for one entity's local store.\n * Declared via `plugins: [{ name: 'client-local', options }]`.\n */\nexport interface AXPLocalEntityPolicy {\n mode: AXPLocalEntityMode;\n /** Cap for the hot subset kept in IndexedDB. */\n maxItems: number;\n role?: AXPLocalEntityRole;\n /**\n * Field used for recency prune / default hot-list sort.\n * Falls back to `updatedAt`, then `createdAt`, then stable id.\n */\n sortField?: string;\n /** Optional related prefetch graph (depth 1). Prefetch wiring is incremental. */\n related?: AXPLocalEntityRelatedOption[];\n}\n\n/** Runtime registration key: `Module.Entity`. */\nexport type AXPLocalEntityKey = string;\n\nexport interface AXPLocalEntityStoreMeta {\n id: string;\n entityKey: string;\n userKey: string;\n lastSyncedAt: string | null;\n}\n\n/** Row persisted in IndexedDB (payload is JSON-serializable entity data). */\nexport interface AXPLocalEntityStoredItem {\n /** `${entityKey}|${userKey}|${id}` */\n storageId: string;\n entityKey: string;\n userKey: string;\n id: string;\n /** Epoch ms used for prune / sort. */\n sortAt: number;\n payload: Record<string, unknown>;\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport Dexie, { type Table } from 'dexie';\nimport type { AXPLocalEntityStoreMeta, AXPLocalEntityStoredItem } from './local-entity.types';\n\n//#endregion\n\n//#region ----- Constants -----\n\nexport const AXP_LOCAL_ENTITY_DEFAULT_MAX_ITEMS = 100;\nexport const AXP_LOCAL_ENTITY_BROADCAST_CHANNEL = 'axp-local-entity';\n\n//#endregion\n\n//#region ----- Dexie DB -----\n\nexport class AXPLocalEntityIndexedDb extends Dexie {\n items!: Table<AXPLocalEntityStoredItem, string>;\n meta!: Table<AXPLocalEntityStoreMeta, string>;\n\n constructor() {\n super('ACoreXLocalEntity');\n this.version(1).stores({\n items: 'storageId, entityKey, userKey, [entityKey+userKey], sortAt',\n meta: 'id, entityKey, userKey, [entityKey+userKey]',\n });\n }\n}\n\nexport const axpLocalEntityIndexedDb = new AXPLocalEntityIndexedDb();\n\nexport function buildLocalEntityStorageId(entityKey: string, userKey: string, id: string): string {\n return `${entityKey}|${userKey}|${id}`;\n}\n\nexport function buildLocalEntityMetaId(entityKey: string, userKey: string): string {\n return `${entityKey}|${userKey}`;\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport type { AXPQueryRequest } from '@acorex-platform/framework-shared/core';\nimport type { AXPLocalEntityPolicy } from './local-entity.types';\n\n//#endregion\n\n//#region ----- Record helpers -----\n\nexport function axpLocalEntityRecordId(record: unknown): string | null {\n if (record == null || typeof record !== 'object') {\n return null;\n }\n const id = (record as { id?: unknown }).id;\n if (id == null || id === '') {\n return null;\n }\n return String(id);\n}\n\nexport function axpLocalEntitySortAt(record: unknown, sortField?: string): number {\n if (record == null || typeof record !== 'object') {\n return 0;\n }\n const row = record as Record<string, unknown>;\n const candidates = [sortField, 'updatedAt', 'createdAt'].filter(Boolean) as string[];\n for (const field of candidates) {\n const value = row[field];\n const ms = toEpochMs(value);\n if (ms != null) {\n return ms;\n }\n }\n return 0;\n}\n\nfunction toEpochMs(value: unknown): number | null {\n if (value == null || value === '') {\n return null;\n }\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (value instanceof Date) {\n const ms = value.getTime();\n return Number.isFinite(ms) ? ms : null;\n }\n if (typeof value === 'string') {\n const ms = Date.parse(value);\n return Number.isFinite(ms) ? ms : null;\n }\n return null;\n}\n\nexport function axpLocalEntityToPayload(record: unknown): Record<string, unknown> {\n if (record != null && typeof record === 'object' && !Array.isArray(record)) {\n return { ...(record as Record<string, unknown>) };\n }\n return {};\n}\n\n//#endregion\n\n//#region ----- Query helpers -----\n\n/** True when the request can be answered from the capped hot subset. */\nexport function axpLocalEntityCanServeListLocally(\n request: AXPQueryRequest | undefined,\n policy: AXPLocalEntityPolicy,\n): boolean {\n const skip = request?.skip ?? 0;\n const take = request?.take ?? 10;\n if (skip < 0 || take < 0) {\n return false;\n }\n if (skip + take > policy.maxItems) {\n return false;\n }\n if (!isEmptyQueryFilter(request?.filter)) {\n return false;\n }\n return true;\n}\n\nexport function axpLocalEntityHotListRequest(policy: AXPLocalEntityPolicy): AXPQueryRequest {\n const request: AXPQueryRequest = {\n skip: 0,\n take: policy.maxItems,\n };\n if (policy.sortField) {\n request.sort = [{ field: policy.sortField, dir: 'desc' }];\n }\n return request;\n}\n\nfunction isEmptyQueryFilter(filter: AXPQueryRequest['filter']): boolean {\n if (filter == null) {\n return true;\n }\n if (Array.isArray(filter)) {\n return filter.length === 0;\n }\n if (typeof filter === 'object') {\n return Object.keys(filter as object).length === 0;\n }\n return false;\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport type { AXPPagedListResult, AXPQueryRequest } from '@acorex-platform/framework-shared/core';\nimport { computed, DestroyRef, inject, Injectable, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { combineLatest, distinctUntilChanged, map } from 'rxjs';\nimport {\n AXP_LOCAL_ENTITY_BROADCAST_CHANNEL,\n AXP_LOCAL_ENTITY_DEFAULT_MAX_ITEMS,\n axpLocalEntityIndexedDb,\n buildLocalEntityMetaId,\n buildLocalEntityStorageId,\n} from './local-entity-indexed-db';\nimport {\n axpLocalEntityCanServeListLocally,\n axpLocalEntityHotListRequest,\n axpLocalEntityRecordId,\n axpLocalEntitySortAt,\n axpLocalEntityToPayload,\n} from './local-entity-query.util';\nimport type {\n AXPLocalEntityKey,\n AXPLocalEntityPolicy,\n AXPLocalEntityStoredItem,\n} from './local-entity.types';\n\n//#endregion\n\n//#region ----- Types -----\n\ntype AXPLocalEntityBroadcastMessage =\n | { type: 'store-changed'; entityKey: string; userKey: string; originId: string }\n | { type: 'store-cleared'; entityKey: string; userKey: string; originId: string };\n\ninterface AXPLocalEntityBucket {\n policy: AXPLocalEntityPolicy;\n items: ReturnType<typeof signal<Record<string, unknown>[]>>;\n hydrated: ReturnType<typeof signal<boolean>>;\n hydratePromise: Promise<void> | null;\n bootstrapPromise: Promise<void> | null;\n syncInFlight: Promise<void> | null;\n}\n\n//#endregion\n\n//#region ----- Local entity engine -----\n\n/**\n * Shared IndexedDB-backed hot-subset store for entity client-local caching.\n * Online only for this phase (cache / local-first). Offline modes come later.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPLocalEntityEngine {\n private readonly sessionService = inject(AXPSessionService);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly originId =\n typeof crypto !== 'undefined' && 'randomUUID' in crypto\n ? crypto.randomUUID()\n : `local-entity-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n private readonly buckets = new Map<AXPLocalEntityKey, AXPLocalEntityBucket>();\n private readonly userKeySignal = signal<string | null>(null);\n private broadcast: BroadcastChannel | null = null;\n\n constructor() {\n this.bindBroadcastChannel();\n this.bindSessionContext();\n this.destroyRef.onDestroy(() => {\n this.broadcast?.close();\n this.broadcast = null;\n });\n }\n\n //#region ----- Policy & session -----\n\n registerPolicy(entityKey: AXPLocalEntityKey, policy: Partial<AXPLocalEntityPolicy> | undefined): AXPLocalEntityPolicy {\n const normalized = normalizePolicy(policy);\n const existing = this.buckets.get(entityKey);\n if (existing) {\n existing.policy = normalized;\n return normalized;\n }\n this.buckets.set(entityKey, {\n policy: normalized,\n items: signal<Record<string, unknown>[]>([]),\n hydrated: signal(false),\n hydratePromise: null,\n bootstrapPromise: null,\n syncInFlight: null,\n });\n return normalized;\n }\n\n getPolicy(entityKey: AXPLocalEntityKey): AXPLocalEntityPolicy | null {\n return this.buckets.get(entityKey)?.policy ?? null;\n }\n\n resolveUserKey(): string | null {\n const tenantId = this.sessionService.tenant?.id?.trim();\n const userId = this.sessionService.user?.id?.trim();\n if (!tenantId || !userId) {\n return null;\n }\n return `${tenantId}:${userId}`;\n }\n\n //#endregion\n\n //#region ----- Read API -----\n\n isHydrated(entityKey: AXPLocalEntityKey): boolean {\n return this.buckets.get(entityKey)?.hydrated() ?? false;\n }\n\n items(entityKey: AXPLocalEntityKey): Record<string, unknown>[] {\n return this.buckets.get(entityKey)?.items() ?? [];\n }\n\n itemsSignal(entityKey: AXPLocalEntityKey) {\n const bucket = this.ensureBucket(entityKey);\n return computed(() => bucket.items());\n }\n\n getById(entityKey: AXPLocalEntityKey, id: string): Record<string, unknown> | undefined {\n return this.items(entityKey).find((item) => axpLocalEntityRecordId(item) === id);\n }\n\n canServeListLocally(entityKey: AXPLocalEntityKey, request?: AXPQueryRequest): boolean {\n const policy = this.getPolicy(entityKey);\n if (!policy || !this.isHydrated(entityKey)) {\n return false;\n }\n return axpLocalEntityCanServeListLocally(request, policy);\n }\n\n queryPage(entityKey: AXPLocalEntityKey, request?: AXPQueryRequest): AXPPagedListResult<Record<string, unknown>> {\n const items = this.items(entityKey);\n const skip = request?.skip ?? 0;\n const take = request?.take ?? 10;\n return {\n items: items.slice(skip, skip + take),\n total: items.length,\n };\n }\n\n hotListRequest(entityKey: AXPLocalEntityKey): AXPQueryRequest {\n const policy = this.ensureBucket(entityKey).policy;\n return axpLocalEntityHotListRequest(policy);\n }\n\n //#endregion\n\n //#region ----- Lifecycle / sync -----\n\n /**\n * Hydrate from IndexedDB then sync the hot subset once (idempotent per session user).\n */\n ensureReady(\n entityKey: AXPLocalEntityKey,\n fetchHot: () => Promise<AXPPagedListResult<unknown>>,\n ): Promise<void> {\n const bucket = this.ensureBucket(entityKey);\n if (!bucket.bootstrapPromise) {\n bucket.bootstrapPromise = this.bootstrap(entityKey, fetchHot).finally(() => {\n // Allow re-bootstrap after user switch (session handler clears promises).\n });\n }\n return bucket.bootstrapPromise;\n }\n\n async hydrate(entityKey: AXPLocalEntityKey): Promise<void> {\n const bucket = this.ensureBucket(entityKey);\n if (bucket.hydratePromise) {\n return bucket.hydratePromise;\n }\n bucket.hydratePromise = this.hydrateInternal(entityKey).finally(() => {\n bucket.hydratePromise = null;\n });\n return bucket.hydratePromise;\n }\n\n async syncHot(\n entityKey: AXPLocalEntityKey,\n fetchHot: () => Promise<AXPPagedListResult<unknown>>,\n ): Promise<void> {\n const bucket = this.ensureBucket(entityKey);\n if (bucket.syncInFlight) {\n return bucket.syncInFlight;\n }\n bucket.syncInFlight = (async () => {\n const result = await fetchHot();\n await this.replaceAll(entityKey, result.items ?? []);\n })().finally(() => {\n bucket.syncInFlight = null;\n });\n return bucket.syncInFlight;\n }\n\n //#endregion\n\n //#region ----- Mutations -----\n\n async replaceAll(entityKey: AXPLocalEntityKey, items: unknown[]): Promise<void> {\n const bucket = this.ensureBucket(entityKey);\n const userKey = this.resolveUserKey();\n if (!userKey) {\n bucket.items.set([]);\n bucket.hydrated.set(true);\n return;\n }\n\n const normalized = this.prune(entityKey, items);\n await this.persistUserItems(entityKey, userKey, normalized);\n this.publish({ type: 'store-changed', entityKey, userKey, originId: this.originId });\n }\n\n async upsertMany(entityKey: AXPLocalEntityKey, items: unknown[]): Promise<void> {\n if (!items.length) {\n return;\n }\n const userKey = this.resolveUserKey();\n if (!userKey) {\n return;\n }\n\n const byId = new Map(this.items(entityKey).map((item) => [axpLocalEntityRecordId(item)!, item]));\n for (const item of items) {\n const id = axpLocalEntityRecordId(item);\n if (!id) {\n continue;\n }\n byId.set(id, axpLocalEntityToPayload(item));\n }\n\n const next = this.prune(entityKey, [...byId.values()]);\n await this.persistUserItems(entityKey, userKey, next);\n this.publish({ type: 'store-changed', entityKey, userKey, originId: this.originId });\n }\n\n async patchMany(\n entityKey: AXPLocalEntityKey,\n ids: string[],\n patch: (item: Record<string, unknown>) => Record<string, unknown> | unknown,\n ): Promise<void> {\n if (!ids.length) {\n return;\n }\n const idSet = new Set(ids.map(String));\n const next = this.items(entityKey).map((item) => {\n const id = axpLocalEntityRecordId(item);\n if (!id || !idSet.has(id)) {\n return item;\n }\n return axpLocalEntityToPayload(patch(item));\n });\n await this.writeItems(entityKey, next);\n }\n\n async patchAll(\n entityKey: AXPLocalEntityKey,\n patch: (item: Record<string, unknown>) => Record<string, unknown> | unknown,\n ): Promise<void> {\n const next = this.items(entityKey).map((item) => axpLocalEntityToPayload(patch(item)));\n await this.writeItems(entityKey, next);\n }\n\n async removeMany(entityKey: AXPLocalEntityKey, ids: string[]): Promise<void> {\n if (!ids.length) {\n return;\n }\n const userKey = this.resolveUserKey();\n const idSet = new Set(ids.map(String));\n const next = this.items(entityKey).filter((item) => !idSet.has(axpLocalEntityRecordId(item) ?? ''));\n const bucket = this.ensureBucket(entityKey);\n\n if (!userKey) {\n bucket.items.set(next);\n bucket.hydrated.set(true);\n return;\n }\n\n const storageIds = ids.map((id) => buildLocalEntityStorageId(entityKey, userKey, String(id)));\n await axpLocalEntityIndexedDb.transaction('rw', axpLocalEntityIndexedDb.items, async () => {\n await axpLocalEntityIndexedDb.items.bulkDelete(storageIds);\n });\n\n bucket.items.set(next);\n bucket.hydrated.set(true);\n this.publish({ type: 'store-changed', entityKey, userKey, originId: this.originId });\n }\n\n async clear(entityKey: AXPLocalEntityKey): Promise<void> {\n const bucket = this.ensureBucket(entityKey);\n const userKey = this.resolveUserKey();\n bucket.items.set([]);\n bucket.hydrated.set(true);\n if (!userKey) {\n return;\n }\n\n const metaId = buildLocalEntityMetaId(entityKey, userKey);\n await axpLocalEntityIndexedDb.transaction('rw', axpLocalEntityIndexedDb.items, axpLocalEntityIndexedDb.meta, async () => {\n await axpLocalEntityIndexedDb.items.where('[entityKey+userKey]').equals([entityKey, userKey]).delete();\n await axpLocalEntityIndexedDb.meta.delete(metaId);\n });\n\n this.publish({ type: 'store-cleared', entityKey, userKey, originId: this.originId });\n }\n\n //#endregion\n\n //#region ----- Private helpers -----\n\n private ensureBucket(entityKey: AXPLocalEntityKey): AXPLocalEntityBucket {\n let bucket = this.buckets.get(entityKey);\n if (!bucket) {\n this.registerPolicy(entityKey, undefined);\n bucket = this.buckets.get(entityKey)!;\n }\n return bucket;\n }\n\n private async bootstrap(\n entityKey: AXPLocalEntityKey,\n fetchHot: () => Promise<AXPPagedListResult<unknown>>,\n ): Promise<void> {\n await this.hydrate(entityKey);\n try {\n await this.syncHot(entityKey, fetchHot);\n } catch {\n // Keep hydrated local snapshot when sync fails (online cache resilience).\n }\n }\n\n private async writeItems(entityKey: AXPLocalEntityKey, items: Record<string, unknown>[]): Promise<void> {\n const bucket = this.ensureBucket(entityKey);\n const userKey = this.resolveUserKey();\n const next = this.prune(entityKey, items);\n if (!userKey) {\n bucket.items.set(next);\n bucket.hydrated.set(true);\n return;\n }\n await this.persistUserItems(entityKey, userKey, next);\n this.publish({ type: 'store-changed', entityKey, userKey, originId: this.originId });\n }\n\n private async hydrateInternal(entityKey: AXPLocalEntityKey): Promise<void> {\n const bucket = this.ensureBucket(entityKey);\n const userKey = this.resolveUserKey();\n if (!userKey) {\n bucket.items.set([]);\n bucket.hydrated.set(true);\n return;\n }\n\n const stored = await axpLocalEntityIndexedDb.items\n .where('[entityKey+userKey]')\n .equals([entityKey, userKey])\n .toArray();\n\n const items = this.prune(\n entityKey,\n stored.map((row) => row.payload),\n );\n this.userKeySignal.set(userKey);\n bucket.items.set(items);\n bucket.hydrated.set(true);\n }\n\n private async persistUserItems(\n entityKey: AXPLocalEntityKey,\n userKey: string,\n items: Record<string, unknown>[],\n ): Promise<void> {\n const bucket = this.ensureBucket(entityKey);\n const policy = bucket.policy;\n const stored: AXPLocalEntityStoredItem[] = items.map((item) => {\n const id = axpLocalEntityRecordId(item)!;\n return {\n storageId: buildLocalEntityStorageId(entityKey, userKey, id),\n entityKey,\n userKey,\n id,\n sortAt: axpLocalEntitySortAt(item, policy.sortField),\n payload: item,\n };\n });\n const keepIds = new Set(stored.map((row) => row.storageId));\n const metaId = buildLocalEntityMetaId(entityKey, userKey);\n\n await axpLocalEntityIndexedDb.transaction('rw', axpLocalEntityIndexedDb.items, axpLocalEntityIndexedDb.meta, async () => {\n const existing = await axpLocalEntityIndexedDb.items\n .where('[entityKey+userKey]')\n .equals([entityKey, userKey])\n .primaryKeys();\n const staleIds = existing.filter((id) => !keepIds.has(String(id)));\n if (staleIds.length > 0) {\n await axpLocalEntityIndexedDb.items.bulkDelete(staleIds);\n }\n if (stored.length > 0) {\n await axpLocalEntityIndexedDb.items.bulkPut(stored);\n }\n await axpLocalEntityIndexedDb.meta.put({\n id: metaId,\n entityKey,\n userKey,\n lastSyncedAt: new Date().toISOString(),\n });\n });\n\n this.userKeySignal.set(userKey);\n bucket.items.set(items);\n bucket.hydrated.set(true);\n }\n\n private prune(entityKey: AXPLocalEntityKey, items: unknown[]): Record<string, unknown>[] {\n const policy = this.ensureBucket(entityKey).policy;\n const mapped = items\n .map((item) => axpLocalEntityToPayload(item))\n .filter((item) => axpLocalEntityRecordId(item) != null);\n\n const byRecency = [...mapped].sort(\n (left, right) =>\n axpLocalEntitySortAt(right, policy.sortField) - axpLocalEntitySortAt(left, policy.sortField),\n );\n return byRecency.slice(0, policy.maxItems);\n }\n\n private bindSessionContext(): void {\n combineLatest([this.sessionService.user$, this.sessionService.tenant$])\n .pipe(\n map(([user, tenant]) => (user?.id && tenant?.id ? `${tenant.id}:${user.id}` : null)),\n distinctUntilChanged(),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((userKey) => {\n if (userKey === this.userKeySignal()) {\n return;\n }\n this.userKeySignal.set(userKey);\n for (const [entityKey, bucket] of this.buckets) {\n bucket.bootstrapPromise = null;\n bucket.hydratePromise = null;\n bucket.syncInFlight = null;\n void this.hydrateInternal(entityKey);\n }\n });\n }\n\n private bindBroadcastChannel(): void {\n if (typeof BroadcastChannel === 'undefined') {\n return;\n }\n\n this.broadcast = new BroadcastChannel(AXP_LOCAL_ENTITY_BROADCAST_CHANNEL);\n this.broadcast.onmessage = (event: MessageEvent<AXPLocalEntityBroadcastMessage>) => {\n const message = event.data;\n if (!message || message.originId === this.originId) {\n return;\n }\n const userKey = this.resolveUserKey();\n if (!userKey || message.userKey !== userKey) {\n return;\n }\n if (!this.buckets.has(message.entityKey)) {\n return;\n }\n void this.hydrateInternal(message.entityKey);\n };\n }\n\n private publish(message: AXPLocalEntityBroadcastMessage): void {\n try {\n this.broadcast?.postMessage(message);\n } catch {\n // BroadcastChannel can fail in restricted contexts; local tab still works.\n }\n }\n\n //#endregion\n}\n\n//#endregion\n\n//#region ----- Policy normalize -----\n\nfunction normalizePolicy(policy: Partial<AXPLocalEntityPolicy> | undefined): AXPLocalEntityPolicy {\n const maxItems =\n typeof policy?.maxItems === 'number' && policy.maxItems > 0\n ? Math.floor(policy.maxItems)\n : AXP_LOCAL_ENTITY_DEFAULT_MAX_ITEMS;\n\n return {\n mode: policy?.mode === 'cache' ? 'cache' : 'local-first',\n maxItems,\n role: policy?.role,\n sortField: typeof policy?.sortField === 'string' && policy.sortField.trim() ? policy.sortField.trim() : undefined,\n related: Array.isArray(policy?.related) ? policy.related : undefined,\n };\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport type { AXPPagedListResult } from '@acorex-platform/framework-shared/core';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { inject, Injectable } from '@angular/core';\nimport { AXPLocalEntityEngine } from './local-entity.engine';\nimport { axpLocalEntityRecordId } from './local-entity-query.util';\nimport type { AXPLocalEntityKey } from './local-entity.types';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport type AXPLocalEntityRealtimeChangeType = 'upsert' | 'remove' | 'invalidate';\n\nexport interface AXPLocalEntityRealtimeChange {\n entityKey: AXPLocalEntityKey;\n type: AXPLocalEntityRealtimeChangeType;\n /** Target ids for upsert/remove. */\n ids?: string[];\n /** Optional full records for upsert (skips fetchByIds). */\n items?: unknown[];\n}\n\nexport interface AXPLocalEntityRealtimeSyncHandlers {\n /** Load records by id for delta upsert (missing ids are removed locally). */\n fetchByIds?: (ids: string[]) => Promise<unknown[]>;\n /** Reload the hot subset for full invalidate. */\n fetchHot?: () => Promise<AXPPagedListResult<unknown>>;\n}\n\n//#endregion\n\n//#region ----- Realtime → local engine bridge -----\n\n/**\n * Applies realtime / reconnect deltas to {@link AXPLocalEntityEngine}.\n * Features register sync handlers per entityKey (inbox, client-local plugin, …).\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPLocalEntityRealtimeBridge {\n private readonly engine = inject(AXPLocalEntityEngine);\n private readonly sessionService = inject(AXPSessionService);\n private readonly handlers = new Map<AXPLocalEntityKey, AXPLocalEntityRealtimeSyncHandlers>();\n\n register(entityKey: AXPLocalEntityKey, handlers: AXPLocalEntityRealtimeSyncHandlers): void {\n this.handlers.set(entityKey, handlers);\n }\n\n unregister(entityKey: AXPLocalEntityKey): void {\n this.handlers.delete(entityKey);\n }\n\n /** True when the engine has a policy or sync handlers for this key. */\n isManaged(entityKey: AXPLocalEntityKey): boolean {\n return this.handlers.has(entityKey) || this.engine.getPolicy(entityKey) != null;\n }\n\n async apply(change: AXPLocalEntityRealtimeChange): Promise<void> {\n const entityKey = change.entityKey?.trim();\n if (!entityKey || !this.isManaged(entityKey) || !this.sessionService.isReadyForAppScopedApi) {\n return;\n }\n\n if (change.type === 'remove') {\n const ids = normalizeIds(change.ids);\n if (ids.length > 0) {\n await this.engine.removeMany(entityKey, ids);\n }\n return;\n }\n\n if (change.type === 'upsert') {\n if (change.items?.length) {\n await this.engine.upsertMany(entityKey, change.items);\n return;\n }\n\n const ids = normalizeIds(change.ids);\n const fetchByIds = this.handlers.get(entityKey)?.fetchByIds;\n if (ids.length > 0 && fetchByIds) {\n try {\n const loaded = await fetchByIds(ids);\n const foundIds = new Set(\n loaded.map((item) => axpLocalEntityRecordId(item)).filter((id): id is string => id != null),\n );\n const missingIds = ids.filter((id) => !foundIds.has(id));\n if (loaded.length > 0) {\n await this.engine.upsertMany(entityKey, loaded);\n }\n if (missingIds.length > 0) {\n await this.engine.removeMany(entityKey, missingIds);\n }\n return;\n } catch {\n // Fall through to hot invalidate.\n }\n } else if (ids.length === 0 && !change.items?.length) {\n // No delta payload — treat as invalidate below.\n } else if (ids.length > 0 && !fetchByIds) {\n // Ids without a fetcher — invalidate if possible.\n } else {\n return;\n }\n }\n\n await this.invalidate(entityKey);\n }\n\n async invalidate(entityKey: AXPLocalEntityKey): Promise<void> {\n if (!this.sessionService.isReadyForAppScopedApi) {\n return;\n }\n\n const fetchHot = this.handlers.get(entityKey)?.fetchHot;\n if (!fetchHot) {\n return;\n }\n await this.engine.hydrate(entityKey);\n await this.engine.syncHot(entityKey, fetchHot);\n }\n}\n\n//#endregion\n\n//#region ----- Helpers -----\n\nfunction normalizeIds(ids: string[] | undefined): string[] {\n if (!ids?.length) {\n return [];\n }\n return [...new Set(ids.map((id) => id?.trim()).filter((id): id is string => Boolean(id)))];\n}\n\n//#endregion\n","import { Injectable } from \"@angular/core\";\nimport {AXPLockGetInfoRequest, AXPLockInfo, AXPLockRequest, AXPUnLockRequest } from \"./lock.types\";\n\n@Injectable()\nexport abstract class AXPLockService {\n\n abstract lock(request: AXPLockRequest): Promise<AXPLockInfo>;\n\n abstract unlock(request: AXPUnLockRequest): Promise<void>;\n\n abstract check(request: AXPLockGetInfoRequest): Promise<boolean>;\n\n abstract getInfo(request: AXPLockGetInfoRequest): Promise<AXPLockInfo>;\n}\n","import { AXPStatusProvider, AXPStatusTransition } from '@acorex-platform/framework-shared/core';\nimport { Injectable, InjectionToken, inject } from '@angular/core';\n\nimport { commandMessageTextForError } from '../errors/command-message-text.util';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\n\n//#region ---- Injection Token ----\n\n/**\n * Injection token for status providers\n * Use with multi: true to register multiple providers\n */\nexport const AXP_STATUS_PROVIDERS = new InjectionToken<AXPStatusProvider[]>('AXP_STATUS_PROVIDERS');\n\n//#endregion\n\n//#region ---- Provider Service ----\n\n/**\n * Service for managing status definitions from multiple providers\n * Similar to AXPTaskBadgeService pattern - no cache, direct access\n * \n * @example\n * ```typescript\n * // In a module providers array:\n * {\n * provide: AXP_STATUS_PROVIDERS,\n * useClass: TaskStatusProvider,\n * multi: true,\n * }\n * \n * // Example provider implementation:\n * export class TaskStatusProvider extends AXPStatusProvider {\n * readonly key = 'task-management.status';\n * readonly statuses = [\n * { name: 'todo', title: 'To Do', color: '#6b7280', icon: 'fa-light fa-circle', isInitial: true },\n * { name: 'in-progress', title: 'In Progress', color: '#3b82f6', icon: 'fa-light fa-play' },\n * { name: 'done', title: 'Done', color: '#10b981', icon: 'fa-light fa-check-circle', isFinal: true },\n * ];\n * readonly transitions = [\n * { from: 'todo', to: 'in-progress', title: 'Start', condition: '{{user.canEdit}}' },\n * { from: 'in-progress', to: 'done', title: 'Complete' },\n * ];\n * readonly defaultStatus = 'todo';\n * }\n * \n * // Later, get the status:\n * const status = await statusService.getStatus('task-management.status');\n * if (status) {\n * console.log('Statuses:', status.statuses);\n * console.log('Transitions:', status.transitions);\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPStatusDefinitionProviderService {\n //#region ---- Dependencies ----\n\n private providers: AXPStatusProvider[] = inject(AXP_STATUS_PROVIDERS, { optional: true }) ?? [];\n private commandService = inject(AXPCommandService);\n\n //#endregion\n\n //#region ---- State ----\n\n private statusMap = new Map<string, AXPStatusProvider>();\n private initializationPromise: Promise<void> | null = null;\n private isInitialized = false;\n\n //#endregion\n\n //#region ---- Initialization ----\n\n /**\n * Initialize providers (resolve promises if needed)\n * Called lazily on first access\n */\n private async initialize(): Promise<void> {\n if (this.isInitialized) {\n return;\n }\n\n if (this.initializationPromise) {\n return this.initializationPromise;\n }\n\n this.initializationPromise = this._doInitialize();\n await this.initializationPromise;\n }\n\n private async _doInitialize(): Promise<void> {\n // Register all providers, resolving promises if needed\n for (const provider of this.providers) {\n let resolvedProvider: AXPStatusProvider;\n\n if (provider instanceof Promise) {\n // If provider is a promise, resolve it\n resolvedProvider = await provider;\n } else {\n // If provider is a direct instance, use it directly\n resolvedProvider = provider;\n }\n\n if (this.statusMap.has(resolvedProvider.key)) {\n console.warn(`Status with key \"${resolvedProvider.key}\" already exists. Overwriting with new status.`);\n }\n\n this.statusMap.set(resolvedProvider.key, resolvedProvider);\n }\n\n this.isInitialized = true;\n }\n\n //#endregion\n\n //#region ---- Public API ----\n\n /**\n * Get a status provider by key\n * Ensures initialization is complete before accessing the status map.\n * \n * @param key - Status key (e.g., 'task-management.status')\n * @returns Promise that resolves to status provider with all statuses and transitions, or undefined if not found\n * \n * @example\n * ```typescript\n * const status = await statusService.getStatus('task-management.status');\n * if (status) {\n * console.log('Statuses:', status.statuses);\n * console.log('Transitions:', status.transitions);\n * }\n * ```\n */\n public async getStatus(key: string): Promise<AXPStatusProvider | undefined> {\n await this.initialize();\n return this.statusMap.get(key);\n }\n\n /**\n * Execute a status transition workflow action\n * Uses transition.command if provided, otherwise defaults to Entity:UpdateStatus\n * Validates the transition is allowed before executing\n * \n * @param definitionKey - Status definition key\n * @param transition - The transition to execute\n * @param context - Context data for the command (must include entity name and id/ids)\n * @returns Promise that resolves when the command execution completes\n * \n * @example\n * ```typescript\n * await statusService.executeTransition(\n * 'task-management.status',\n * { from: 'todo', to: 'in-progress' },\n * { entity: 'TaskManagement.Task', id: '123', ...entityData }\n * );\n * ```\n */\n public async executeTransition(\n definitionKey: string,\n transition: AXPStatusTransition,\n context: Record<string, any>\n ): Promise<void> {\n await this.initialize();\n const provider = this.statusMap.get(definitionKey);\n if (!provider) {\n throw new Error(`Status provider with key \"${definitionKey}\" not found.`);\n }\n\n // Validate transition is allowed\n if (!this.isValidTransition(provider, transition.from, transition.to)) {\n throw new Error(`Invalid transition from \"${transition.from}\" to \"${transition.to}\"`);\n }\n\n // Determine which command to use\n let commandName: string;\n let commandOptions: Record<string, unknown>;\n\n if (transition.command) {\n // Use transition's explicit command\n commandName = transition.command.name;\n commandOptions = {\n ...(transition.command.options ?? {}),\n ...context,\n };\n } else {\n // Use default Entity:UpdateStatus command\n const entity =\n context['entity'] ?? context['entityName'] ?? context['__meta__']?.config?.name;\n if (!entity) {\n throw new Error('Entity name is required in context when using default status update command');\n }\n\n const id = context['id'];\n const ids = context['ids'];\n\n if (!id && !ids) {\n throw new Error('Either id or ids must be provided in context');\n }\n\n commandName = 'Entity:UpdateStatus';\n commandOptions = {\n entity,\n status: transition.to,\n statusField: context['statusField'] ?? context['fieldName'] ?? 'statusId',\n ...(id ? { id } : {}),\n ...(ids ? { ids } : {}),\n };\n }\n\n // Execute the command\n const result = await this.commandService.execute(commandName, commandOptions);\n\n if (!result?.success) {\n const text = commandMessageTextForError(result?.message?.text);\n throw new Error(text || 'Failed to execute status transition command');\n }\n }\n\n /**\n * Validate if a transition is allowed\n * Checks if the transition exists in the provider's transitions list\n */\n private isValidTransition(\n provider: AXPStatusProvider,\n from: string,\n to: string\n ): boolean {\n return provider.transitions.some(\n (transition) => transition.from === from && transition.to === to\n );\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Types ----\n\n/** Structured hover-card payload for a tab (kept in memory; not session-persisted). */\nexport interface AXPTabStructuredPreview {\n /** Primary label (usually page title or breadcrumb trail). */\n title: string;\n /** Optional page description or secondary line. */\n subtitle?: string;\n /** Full router URL for the tab. */\n url: string;\n icon?: string;\n /** Whether the cached page reports unsaved user edits. */\n isDirty: boolean;\n /** Breadcrumb segments excluding home (for the hover card). */\n breadcrumbTrail: string[];\n}\n\n//#endregion\n","import { normalizeRouterUrl } from '../tab-navigation/tab-key.util';\nimport { axpIsEntityListPath } from './app-path-navigation.util';\n\n//#region ---- Types ----\n\nexport interface AXPEntityListRouteParts {\n module: string;\n entity: string;\n}\n\nexport interface AXPEntityDetailsRouteParts extends AXPEntityListRouteParts {\n id: string;\n}\n\n//#endregion\n\n//#region ---- Constants ----\n\nconst SESSION_KEY_PREFIX = 'axp-entity-list-return:';\n\n//#endregion\n\n//#region ---- Route Parsing ----\n\n/** Parses an entity master list route (`.../m/{module}/e/{entity}/list`). */\nexport function axpParseEntityListRoute(url: string): AXPEntityListRouteParts | null {\n const path = url.split('?')[0].split('#')[0];\n const match = path.match(/\\/m\\/([^/]+)\\/e\\/([^/]+)\\/list$/);\n if (!match) {\n return null;\n }\n\n return {\n module: decodeURIComponent(match[1]),\n entity: decodeURIComponent(match[2]),\n };\n}\n\n/** Parses an entity details route (`.../m/{module}/e/{entity}/{id}/view`). */\nexport function axpParseEntityDetailsRoute(url: string): AXPEntityDetailsRouteParts | null {\n const path = url.split('?')[0].split('#')[0];\n const match = path.match(/\\/m\\/([^/]+)\\/e\\/([^/]+)\\/([^/]+)\\/view$/);\n if (!match) {\n return null;\n }\n\n return {\n module: decodeURIComponent(match[1]),\n entity: decodeURIComponent(match[2]),\n id: decodeURIComponent(match[3]),\n };\n}\n\n//#endregion\n\n//#region ---- Session Storage ----\n\nfunction buildStorageKey(module: string, entity: string): string {\n return `${SESSION_KEY_PREFIX}${module}.${entity}`;\n}\n\n/** Persists the last list URL (including query params) used before opening entity details. */\nexport function axpSaveEntityListReturnUrl(module: string, entity: string, url: string): void {\n if (!axpIsEntityListPath(url)) {\n return;\n }\n\n const parsed = axpParseEntityListRoute(url);\n if (!parsed || parsed.module !== module || parsed.entity !== entity) {\n return;\n }\n\n try {\n sessionStorage.setItem(buildStorageKey(module, entity), normalizeRouterUrl(url));\n } catch {\n // sessionStorage may be unavailable\n }\n}\n\n/** Returns the stored list URL for the entity, or the provided fallback path. */\nexport function axpGetEntityListReturnUrl(module: string, entity: string, fallbackPath: string): string {\n try {\n const stored = sessionStorage.getItem(buildStorageKey(module, entity));\n if (!stored || !axpIsEntityListPath(stored)) {\n return fallbackPath;\n }\n\n const parsed = axpParseEntityListRoute(stored);\n if (parsed?.module === module && parsed.entity === entity) {\n return stored;\n }\n } catch {\n // sessionStorage may be unavailable\n }\n\n return fallbackPath;\n}\n\n//#endregion\n","import { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { Injectable, inject } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPClipBoardService {\n //#region ---- Services & Dependencies ----\n\n private readonly toast = inject(AXToastService);\n private readonly translationService = inject(AXTranslationService);\n\n //#endregion\n\n //#region ---- Public Methods ----\n\n public async copy(title: string, value: string): Promise<void> {\n const copyText = document.createElement('input');\n copyText.type = 'text';\n copyText.select();\n copyText.setSelectionRange(0, 99999); // For mobile devices\n copyText.remove();\n await navigator.clipboard.writeText(value);\n\n const message = await this.translationService.translateAsync('@general:messages.clipboard.copied', {\n params: { title },\n });\n this.toast.success(message);\n }\n\n //#endregion\n}\n","//#region ---- Types ----\n\nexport type AXPGraphicDownloadFormat = 'svg' | 'png' | 'jpeg';\n\nexport interface AXPGraphicPrintContent {\n bodyMarkup: string;\n styleRule: string;\n}\n\nexport interface AXPPrintGraphicOptions {\n /** Used when the rendered element has no measurable size. */\n fallbackSize?: number;\n title?: string;\n imageAlt?: string;\n}\n\nexport interface AXPGraphicDownloadOptions {\n format: AXPGraphicDownloadFormat;\n filename: string;\n /** Used when rasterizing SVG or sizing canvas output. */\n fallbackSize?: number;\n}\n\n//#endregion\n\n//#region ---- Option normalization ----\n\n/**\n * Normalizes widget option values to a positive finite number\n * (plain number, numeric string, or editor object with `value` / `id`).\n */\nexport function normalizePositiveNumberOption(value: unknown, fallback: number): number {\n if (typeof value === 'number' && Number.isFinite(value) && value > 0) {\n return value;\n }\n\n if (typeof value === 'string') {\n const parsed = Number(value);\n if (Number.isFinite(parsed) && parsed > 0) {\n return parsed;\n }\n }\n\n if (value != null && typeof value === 'object') {\n const record = value as Record<string, unknown>;\n if ('value' in record) {\n return normalizePositiveNumberOption(record['value'], fallback);\n }\n if ('id' in record) {\n return normalizePositiveNumberOption(record['id'], fallback);\n }\n }\n\n return fallback;\n}\n\n//#endregion\n\n//#region ---- DOM measurement ----\n\n/**\n * Resolves the rendered graphic size from a container (canvas or SVG).\n */\nexport function resolveGraphicElementSize(container: HTMLElement, fallback: number): number {\n const canvas = container.querySelector('canvas');\n if (canvas instanceof HTMLCanvasElement && canvas.width > 0) {\n return canvas.width;\n }\n\n const svg = container.querySelector('svg');\n if (svg instanceof SVGSVGElement) {\n const svgWidth = svg.width?.baseVal?.value;\n if (svgWidth > 0) {\n return svgWidth;\n }\n\n const widthAttr = svg.getAttribute('width');\n if (widthAttr) {\n const parsed = Number.parseFloat(widthAttr);\n if (Number.isFinite(parsed) && parsed > 0) {\n return parsed;\n }\n }\n }\n\n return normalizePositiveNumberOption(fallback, fallback);\n}\n\n//#endregion\n\n//#region ---- SVG helpers ----\n\n/**\n * Serializes an SVG element to a string, optionally prefixing the XML declaration.\n */\nexport function serializeSvgElement(svg: SVGSVGElement, includeXmlDeclaration = true): string {\n const serializer = new XMLSerializer();\n let source = serializer.serializeToString(svg);\n\n if (includeXmlDeclaration && !source.match(/^<\\?xml/)) {\n source = `<?xml version=\"1.0\" standalone=\"no\"?>\\r\\n${source}`;\n }\n\n return source;\n}\n\n//#endregion\n\n//#region ---- Graphic content resolution ----\n\n/**\n * Builds printable HTML body markup and CSS for an SVG or canvas inside a container.\n */\nexport function resolveGraphicPrintContent(\n container: HTMLElement,\n size: number,\n imageAlt = 'Graphic',\n): AXPGraphicPrintContent | undefined {\n const svg = container.querySelector('svg');\n if (svg instanceof SVGSVGElement) {\n return {\n bodyMarkup: svg.outerHTML,\n styleRule: `svg { width: ${size}px !important; height: ${size}px !important; }`,\n };\n }\n\n const canvas = container.querySelector('canvas');\n if (canvas instanceof HTMLCanvasElement) {\n try {\n const dataUrl = canvas.toDataURL('image/png');\n if (!dataUrl.startsWith('data:image/png')) {\n return undefined;\n }\n\n return {\n bodyMarkup: `<img src=\"${dataUrl}\" width=\"${size}\" height=\"${size}\" alt=\"${imageAlt}\" />`,\n styleRule: `img { width: ${size}px !important; height: ${size}px !important; }`,\n };\n } catch {\n return undefined;\n }\n }\n\n return undefined;\n}\n\n//#endregion\n\n//#region ---- Browser download ----\n\n/**\n * Triggers a file download for the given blob via a temporary anchor element.\n */\nexport function triggerBrowserDownload(blob: Blob, filename: string): void {\n const link = document.createElement('a');\n const url = URL.createObjectURL(blob);\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\n//#endregion\n\n//#region ---- Print ----\n\n/**\n * Opens the system print dialog for an SVG or canvas graphic inside the given container.\n */\nexport function printGraphicFromElement(container: HTMLElement, options: AXPPrintGraphicOptions = {}): void {\n const fallbackSize = options.fallbackSize ?? 200;\n const size = resolveGraphicElementSize(container, fallbackSize);\n const printContent = resolveGraphicPrintContent(container, size, options.imageAlt ?? 'Graphic');\n if (!printContent) {\n return;\n }\n\n const iframe = document.createElement('iframe');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.style.cssText = `position:fixed;left:0;top:0;width:${size}px;height:${size}px;border:0;visibility:hidden;`;\n document.body.appendChild(iframe);\n\n const printWindow = iframe.contentWindow;\n const doc = printWindow?.document;\n if (!printWindow || !doc) {\n iframe.remove();\n return;\n }\n\n const title = options.title ?? 'Print';\n\n doc.open();\n doc.write(`<!DOCTYPE html>\n<html>\n <head>\n <title>${title}</title>\n <style>\n body {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n margin: 0;\n }\n @media print {\n body {\n min-height: auto;\n }\n }\n ${printContent.styleRule}\n </style>\n </head>\n <body>${printContent.bodyMarkup}</body>\n</html>`);\n doc.close();\n\n const cleanup = (): void => {\n iframe.remove();\n };\n\n const triggerPrint = (): void => {\n printWindow.focus();\n printWindow.print();\n\n printWindow.addEventListener('afterprint', cleanup, { once: true });\n window.setTimeout(cleanup, 1000);\n };\n\n const image = doc.querySelector('img');\n if (image && !image.complete) {\n image.addEventListener('load', triggerPrint, { once: true });\n image.addEventListener('error', cleanup, { once: true });\n return;\n }\n\n requestAnimationFrame(triggerPrint);\n}\n\n//#endregion\n\n//#region ---- Download ----\n\n/**\n * Downloads an SVG or canvas graphic from a container as SVG, PNG, or JPEG.\n */\nexport function downloadGraphicFromElement(container: HTMLElement, options: AXPGraphicDownloadOptions): void {\n const size = resolveGraphicElementSize(container, options.fallbackSize ?? 200);\n\n if (options.format === 'svg') {\n downloadSvgGraphic(container, options.filename);\n return;\n }\n\n const mime = options.format === 'png' ? 'image/png' : 'image/jpeg';\n downloadRasterGraphic(container, mime, options.filename, size);\n}\n\nfunction downloadSvgGraphic(container: HTMLElement, filename: string): void {\n const svg = container.querySelector('svg');\n if (!(svg instanceof SVGSVGElement)) {\n return;\n }\n\n const source = serializeSvgElement(svg);\n triggerBrowserDownload(new Blob([source], { type: 'image/svg+xml;charset=utf-8' }), filename);\n}\n\nfunction downloadRasterGraphic(\n container: HTMLElement,\n mime: 'image/png' | 'image/jpeg',\n filename: string,\n size: number,\n): void {\n const canvas = container.querySelector('canvas');\n if (canvas instanceof HTMLCanvasElement) {\n const dataUrl = rasterizeCanvasToDataUrl(canvas, mime, size);\n if (dataUrl) {\n triggerBrowserDownload(dataUrlToBlob(dataUrl), filename);\n }\n return;\n }\n\n const svg = container.querySelector('svg');\n if (svg instanceof SVGSVGElement) {\n rasterizeSvgToDataUrl(svg, mime, size, (dataUrl) => {\n triggerBrowserDownload(dataUrlToBlob(dataUrl), filename);\n });\n }\n}\n\nfunction rasterizeCanvasToDataUrl(\n canvas: HTMLCanvasElement,\n mime: 'image/png' | 'image/jpeg',\n size: number,\n): string | undefined {\n if (mime === 'image/png') {\n try {\n return canvas.toDataURL('image/png');\n } catch {\n return undefined;\n }\n }\n\n const outputCanvas = document.createElement('canvas');\n outputCanvas.width = size;\n outputCanvas.height = size;\n const ctx = outputCanvas.getContext('2d');\n if (!ctx) {\n return undefined;\n }\n\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(0, 0, size, size);\n ctx.drawImage(canvas, 0, 0, size, size);\n\n try {\n return outputCanvas.toDataURL('image/jpeg');\n } catch {\n return undefined;\n }\n}\n\nfunction rasterizeSvgToDataUrl(\n svg: SVGSVGElement,\n mime: 'image/png' | 'image/jpeg',\n size: number,\n onReady: (dataUrl: string) => void,\n): void {\n const source = serializeSvgElement(svg);\n const svgUrl = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(source)}`;\n const img = new Image();\n const canvas = document.createElement('canvas');\n canvas.width = size;\n canvas.height = size;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n return;\n }\n\n if (mime === 'image/jpeg') {\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(0, 0, size, size);\n }\n\n img.onload = () => {\n ctx.drawImage(img, 0, 0, size, size);\n onReady(canvas.toDataURL(mime));\n };\n img.src = svgUrl;\n}\n\nfunction dataUrlToBlob(dataUrl: string): Blob {\n const [header, data] = dataUrl.split(',');\n const mime = header.match(/:(.*?);/)?.[1] ?? 'application/octet-stream';\n const binary = atob(data);\n const bytes = new Uint8Array(binary.length);\n\n for (let index = 0; index < binary.length; index++) {\n bytes[index] = binary.charCodeAt(index);\n }\n\n return new Blob([bytes], { type: mime });\n}\n\n//#endregion\n","import { AXButtonModule } from '@acorex/components/button';\nimport { AXCheckBoxModule } from '@acorex/components/check-box';\nimport { AXColorBoxModule } from '@acorex/components/color-box';\nimport { AXValueChangedEvent } from '@acorex/cdk/common';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXLabelModule } from '@acorex/components/label';\nimport { AXNumberBoxModule } from '@acorex/components/number-box';\nimport { AXBasePageComponent } from '@acorex/components/page';\nimport { AXTextBoxModule } from '@acorex/components/text-box';\nimport { afterNextRender, Component, linkedSignal, model, signal, ChangeDetectionStrategy } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AXPDomToImageOptions } from './export.service';\n\n@Component({\n template: ` <div class=\"grid grid-cols-[auto_18rem] gap-4 justify-center p-4 items-center\">\n <ax-label>Resolution (px)</ax-label>\n <div class=\"flex gap-2 items-center\">\n <ax-number-box\n [changeOnScroll]=\"true\"\n [decimals]=\"4\"\n [value]=\"width()\"\n (onValueChanged)=\"calculateRatio($event, 'width')\"\n name=\"Width\"\n >\n </ax-number-box>\n <ax-button [toggleable]=\"true\" [(selected)]=\"ratio\"\n ><ax-icon><i class=\"fa-solid fa-vector-square\"></i></ax-icon\n ></ax-button>\n <ax-number-box\n [changeOnScroll]=\"true\"\n [decimals]=\"4\"\n [value]=\"height()\"\n (onValueChanged)=\"calculateRatio($event, 'height')\"\n name=\"Height\"\n >\n </ax-number-box>\n </div>\n\n <ax-label>Background color</ax-label>\n <ax-color-box [(ngModel)]=\"bgcolor\"></ax-color-box>\n\n <ax-label>Quality of image (50-100%)</ax-label>\n <ax-number-box\n [changeOnScroll]=\"true\"\n [minValue]=\"50\"\n [maxValue]=\"100\"\n [(ngModel)]=\"qualityComputed\"\n name=\"Quality\"\n >\n </ax-number-box>\n\n <ax-label>Scale</ax-label>\n <ax-number-box [changeOnScroll]=\"true\" [minValue]=\"1\" [(ngModel)]=\"scale\" name=\"scale\"> </ax-number-box>\n </div>\n\n <ax-footer>\n <ax-prefix> </ax-prefix>\n <ax-suffix>\n <ax-button text=\"Cancel\" look=\"solid\" (onClick)=\"handleClose(true)\"> </ax-button>\n <ax-button text=\"Print\" look=\"solid\" color=\"primary\" (onClick)=\"handleClose()\">\n <ax-icon class=\"fa-solid fa-print\"> </ax-icon>\n </ax-button>\n </ax-suffix>\n </ax-footer>`,\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [\n FormsModule,\n AXCheckBoxModule,\n AXNumberBoxModule,\n AXTextBoxModule,\n AXLabelModule,\n AXDecoratorModule,\n AXButtonModule,\n AXColorBoxModule,\n ],\n})\nexport class AXMOrgChartPrintPage extends AXBasePageComponent {\n private data: AXPDomToImageOptions;\n\n protected ratio = signal(false);\n protected baseWidth = signal<number | undefined>(undefined);\n protected baseHeight = signal<number | undefined>(undefined);\n\n protected bgcolor = model<string>();\n protected width = model<number>();\n protected height = model<number>();\n protected quality = model<number>();\n protected qualityComputed = linkedSignal(() => (this.data.quality ?? 1) * 100);\n protected scale = model<number>();\n\n #init = afterNextRender(() => {\n this.bgcolor.set(this.data.bgcolor);\n\n this.width.set(this.data.width);\n this.baseWidth.set(this.data.width);\n\n this.height.set(this.data.height);\n this.baseHeight.set(this.data.height);\n\n this.quality.set(this.data.quality);\n this.scale.set(this.data.scale);\n });\n\n protected calculateRatio(event: AXValueChangedEvent, type: 'width' | 'height'): void {\n if (!this.ratio() || !event.isUserInteraction) return;\n const value = event.value;\n if (type === 'width') {\n const newHeight = Math.round((value / this.baseWidth()!) * this.baseHeight()! * 100) / 100;\n this.height.set(newHeight);\n this.width.set(value);\n } else {\n const newWidth = Math.round((value / this.baseHeight()!) * this.baseWidth()! * 100) / 100;\n this.width.set(newWidth);\n this.height.set(value);\n }\n }\n\n protected async handleClose(isCanceled = false) {\n this.close({\n bgcolor: this.bgcolor(),\n width: this.width(),\n height: this.height(),\n quality: this.qualityComputed() / 100,\n scale: this.scale(),\n isCanceled,\n });\n }\n}\n","// AXPPdfService\nimport { AXPopupService } from '@acorex/components/popup';\nimport { Injectable, inject } from '@angular/core';\nimport { AXMOrgChartPrintPage } from './export-popup';\nimport { triggerBrowserDownload } from './dom-graphic.util';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPExportService {\n popupService = inject(AXPopupService);\n async generateBlobFromElement(element: HTMLElement, blobOptions?: AXPDomToImageOptions): Promise<Blob> {\n const domtoimage = (await import('dom-to-image')).default;\n\n const originalWidth = element.scrollWidth;\n const originalHeight = element.scrollHeight;\n\n let popup: boolean | undefined,\n options: AXPDomToImageOptions = {},\n newOptions: AXPDomToImageOptions = {};\n\n if (blobOptions) {\n ({ popup, ...options } = blobOptions);\n }\n\n if (popup) {\n const result = await this.popupService.open(AXMOrgChartPrintPage, {\n header: true,\n size: 'fit',\n draggable: true,\n hasBackdrop: true,\n title: 'Export Options',\n data: { data: options },\n });\n if (result.data.isCanceled) {\n throw new Error('Process is Canceled by User!');\n } else {\n newOptions = { ...options, ...result.data };\n }\n }\n\n return domtoimage.toBlob(element, {\n ...newOptions,\n width: (newOptions.width ?? originalWidth) * (newOptions?.scale ?? 1),\n height: (newOptions.height ?? originalHeight) * (newOptions?.scale ?? 1),\n style: {\n transform: `scale(${newOptions?.scale ?? 1})`,\n transformOrigin: 'top left',\n },\n });\n }\n\n download(blob: Blob, filename: string): void {\n triggerBrowserDownload(blob, filename);\n }\n}\n\nexport interface AXPDomToImageOptions {\n popup?: true;\n filter?: (node: Node) => boolean;\n bgcolor?: string;\n width?: number;\n height?: number;\n style?: {};\n quality?: number;\n imagePlaceholder?: string;\n cacheBust?: boolean;\n scale?: number;\n}\n","import { AXDataSourceFilterOption } from '@acorex/cdk/common';\n\nexport function AXPCleanNestedFilters(filters: AXDataSourceFilterOption[]): AXDataSourceFilterOption[] {\n return filters\n .map((filter) => {\n if (!filter) return undefined;\n if (filter.filters?.length) {\n const cleanedNestedFilters = AXPCleanNestedFilters(filter.filters);\n if (!filter.field && !filter.operator && cleanedNestedFilters.length === 0) {\n return undefined;\n }\n return {\n ...filter,\n filters: cleanedNestedFilters.filter(Boolean),\n };\n }\n if ((!filter.value && filter.value != false) || filter.value === 'unknown') {\n return undefined;\n }\n return filter;\n })\n .filter(Boolean) as AXDataSourceFilterOption[];\n}\n","//#region ----- Locale codes -----\r\r\n/** Normalizes AvailableLanguages values (string codes or `{ code }` rows) to BCP-47 locale strings. */\r\r\nexport function normalizeAvailableLanguageCodes(raw: unknown): string[] {\r\r\n if (!Array.isArray(raw)) {\r\r\n return [];\r\r\n }\r\r\n\r\r\n const codes: string[] = [];\r\r\n for (const entry of raw) {\r\r\n if (typeof entry === 'string') {\r\r\n const trimmed = entry.trim();\r\r\n if (trimmed) {\r\r\n codes.push(trimmed);\r\r\n }\r\r\n continue;\r\r\n }\r\r\n\r\r\n if (entry && typeof entry === 'object' && 'code' in entry) {\r\r\n const code = (entry as { code: unknown }).code;\r\r\n if (typeof code === 'string' && code.trim()) {\r\r\n codes.push(code.trim());\r\r\n }\r\r\n }\r\r\n }\r\r\n\r\r\n return codes;\r\r\n}\r\r\n\r\r\nexport function primaryLanguageSubtag(localeCode: string): string {\r\r\n return localeCode.trim().toLowerCase().split(/[-_]/u)[0] ?? '';\r\r\n}\r\r\n//#endregion\r\r\n","import { InjectionToken } from '@angular/core';\nimport { AXPLanguage, AXPLocaleProfile } from './regional.types';\n\n/**\n * Narrow API for reading app locale profiles and active languages.\n * Implemented by locale-management; consumed by platform layout without importing the module (avoids circular deps).\n */\nexport interface AXPLocaleManagementPort {\n /**\n * Built-in locale profiles for the Available Languages picker.\n * May be narrowed by `configureLocaleProfileCatalogCodes` (deploy/app boot).\n */\n getLocaleProfiles(): Promise<AXPLocaleProfile[]>;\n /**\n * Locale profiles allowed for the current tenant (Platform AvailableLanguages,\n * overridden by Tenant when set), intersected with {@link getLocaleProfiles}.\n */\n getAvailableLocaleProfiles(): Promise<AXPLocaleProfile[]>;\n getLanguages(): Promise<AXPLanguage[]>;\n}\n\nexport const AXP_LOCALE_MANAGEMENT_PORT = new InjectionToken<AXPLocaleManagementPort>('AXP_LOCALE_MANAGEMENT_PORT');\n","//#region ----- Imports -----\nimport { AXPPlatformScope, AXPRegionalSetting } from '@acorex-platform/framework-shared/core';\nimport type { AXPSettingsServiceInterface } from '../settings/settings.service';\nimport { normalizeAvailableLanguageCodes } from './locale-code.util';\n//#endregion\n\n//#region ----- Available languages -----\n/**\n * Resolves tenant AvailableLanguages when the tenant scope has an explicit override;\n * otherwise falls back to the effective merged value (tenant → platform).\n */\nexport async function resolveEffectiveAvailableLanguageCodes(\n settingsService: AXPSettingsServiceInterface,\n): Promise<string[]> {\n const key = AXPRegionalSetting.AvailableLanguages;\n\n await settingsService.ensureScopeLoaded(AXPPlatformScope.Tenant);\n await settingsService.ensureScopeLoaded(AXPPlatformScope.Platform);\n\n try {\n const tenantValues = await settingsService.scope(AXPPlatformScope.Tenant).all();\n if (Object.prototype.hasOwnProperty.call(tenantValues, key)) {\n return normalizeAvailableLanguageCodes(tenantValues[key]);\n }\n } catch {\n // fall through to effective merged value\n }\n\n return normalizeAvailableLanguageCodes(await settingsService.get<unknown>(key));\n}\n//#endregion\n","//#region ---- Versioning Types ----\n\nexport interface AXPVersionStream {\n id: string;\n entityType: string;\n entityId: string;\n createdAt: string;\n}\n\nexport enum AXVChangeType {\n Create = 'Create',\n Update = 'Update',\n Delete = 'Delete',\n}\n\nexport type CanonicalChangeOp = 'add' | 'remove' | 'replace' | 'rename' | 'metadata';\n\nexport interface CanonicalChange {\n path: string;\n op: CanonicalChangeOp;\n oldValue?: unknown;\n newValue?: unknown;\n meta?: Record<string, unknown>;\n}\n\n/** Ready-to-render history sub-row stamped at write time (MLS maps or resolved strings). */\nexport interface AXPVersionChangeLine {\n path: string;\n field: string | Record<string, string>;\n text: string | Record<string, string>;\n}\n\nexport interface AXPVersionEntry {\n id: string;\n streamId: string;\n versionNumber: number;\n changeType: AXVChangeType;\n changedBy: string;\n /**\n * Display name for {@link changedBy}, stamped at write time when available.\n * When omitted, UI falls back to id / \"System\".\n */\n changedByName?: string;\n changedAt: string;\n snapshotJson: unknown;\n patchFromPrevJson: CanonicalChange[];\n /** Human-readable summary (plain string or multi-language map). */\n summary?: string | Record<string, string>;\n /**\n * Prebuilt field/text lines for the timeline. When present, UI renders these\n * without client-side lookup/file/title resolution.\n */\n changeLines?: AXPVersionChangeLine[];\n metadataJson?: unknown;\n}\n\nexport interface AXPVersionChange {\n id?: number;\n versionEntryId: string;\n path: string;\n op: CanonicalChangeOp;\n oldValue?: unknown;\n newValue?: unknown;\n}\n\nexport interface VersionedFileInfo {\n id: string;\n name: string;\n size: number;\n mime: string;\n hash: string;\n url?: string;\n thumbUrl?: string;\n}\n\n//#endregion\n\n//#region ---- Service Contract ----\n\nexport abstract class AXPVersioningService {\n abstract getStreamIdIfExists(entityType: string, entityId: string): Promise<string | null>;\n abstract listEntries(streamId: string, options?: { limit?: number; offset?: number }): Promise<AXPVersionEntry[]>;\n abstract getUiFriendlyDiff(streamId: string, v1: number, v2: number): Promise<Array<{ badge: string; path: string; summary: string; oldValue?: unknown; newValue?: unknown }>>;\n}\n\n//#endregion\n\n\n","import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport { Injectable, inject } from '@angular/core';\nimport { NavigationExtras } from '@angular/router';\n\nimport { AXPTabNavigationService } from '../tab-navigation/tab-navigation.service';\n\n//#region ----- Types -----\n\nexport interface AXPNavigateCommandInput {\n type?: 'router' | 'modal';\n path?: string;\n options?: {\n path?: string;\n extras?: NavigationExtras & { target?: string };\n };\n}\n\n//#endregion\n\n//#region ----- Helpers -----\n\nexport function axpResolveNavigatePath(input?: AXPNavigateCommandInput | null): string | undefined {\n if (!input) {\n return undefined;\n }\n\n if (typeof input.options?.path === 'string') {\n return input.options.path;\n }\n\n if (typeof input.path === 'string') {\n return input.path;\n }\n\n return undefined;\n}\n\n/**\n * Replaces `{app}` / `{{app}}` with the current session application name.\n * Example: `{app}/drive/user` → `safetyminder/drive/user`\n */\nexport function axpInterpolateNavigatePath(path: string, appName?: string | null): string {\n if (!appName) {\n return path;\n }\n\n return path.replaceAll('{{app}}', appName).replaceAll('{app}', appName);\n}\n\nfunction axpResolveNavigateExtras(\n input?: AXPNavigateCommandInput | null,\n): (NavigationExtras & { target?: string }) | undefined {\n return input?.options?.extras;\n}\n\n//#endregion\n\n//#region ----- Navigate Command -----\n\n@Injectable({ providedIn: 'root' })\nexport class AXPNavigateCommand implements AXPCommand<AXPNavigateCommandInput> {\n private readonly tabNavigation = inject(AXPTabNavigationService);\n private readonly sessionService = inject(AXPSessionService);\n\n async execute(input: AXPNavigateCommandInput = {}): AXPCommandExecuteResultPromise {\n const rawPath = axpResolveNavigatePath(input);\n if (!rawPath) {\n console.error('Path is required for navigate command');\n return {\n success: false,\n message: {\n text: 'Path is required for navigate command',\n },\n };\n }\n\n const path = axpInterpolateNavigatePath(rawPath, this.sessionService.application?.name);\n const extras = axpResolveNavigateExtras(input);\n\n if (path.toLowerCase().startsWith('http') || extras?.target === 'blank') {\n window.open(path, '_blank');\n } else {\n await this.tabNavigation.navigate(path, extras);\n }\n\n return { success: true, kind: 'object', data: undefined };\n }\n}\n\n//#endregion\n","/**\n * Build-time only. Do not import from Angular modules.\n */\n\nimport { AXP_COMMAND_DEFINITION_CATEGORY_PLATFORM, defineCommand } from '@acorex-platform/framework-shared/runtime';\n\nexport const axpNavigateCommandDefinition = defineCommand({\n key: 'navigate',\n title: 'Navigate',\n description:\n 'AXPNavigateCommand resolves a router path from input.path or input.options.path, opens external URLs in a new tab, otherwise navigates via AXPTabNavigationService.',\n executionMode: 'frontend',\n inputs: [\n {\n name: 'path',\n title: 'Path',\n description: 'Router path or absolute URL (AXPNavigateCommandInput.path or input.options.path).',\n interface: { name: 'text-editor' },\n validations: [{ rule: 'required' }],\n },\n ],\n outcomes: {\n mode: 'static',\n values: ['success', 'failure'],\n },\n ai: {\n tags: ['navigation', 'router'],\n },\n categories: [AXP_COMMAND_DEFINITION_CATEGORY_PLATFORM],\n});\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2","i4","i1","i3","filter","i1.AXPErrorHandlerRegistryService","i1.AXPFileStorageService","resolveMultiLanguageString","i1.AXPKeyboardShortcutsHelpService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acorex-platform-framework-client-common.mjs","sources":["../../../../../libs/framework/client/common/src/lib/ai/output-contract-transcript-segment.types.ts","../../../../../libs/framework/client/common/src/lib/ai/output-contract-transcript-segment.provider.ts","../../../../../libs/framework/client/common/src/lib/ai/output-contract-transcript-segment.service.ts","../../../../../libs/framework/client/common/src/lib/app/app-version.provider.ts","../../../../../libs/framework/client/common/src/lib/app/operators.ts","../../../../../libs/framework/client/common/src/lib/app/date-filter-presets.ts","../../../../../libs/framework/client/common/src/lib/home-page/home-page.types.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-scope.util.ts","../../../../../libs/framework/client/common/src/lib/configs/common-settings.key.ts","../../../../../libs/framework/client/common/src/lib/settings/setting.builder.ts","../../../../../libs/framework/client/common/src/lib/settings/setting-definition.service.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-coercion.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-sync-keys.token.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-bulk-sync.service.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-cache-sync.token.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-sync.config.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-trace.constants.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-sync.trace.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-indexed-db.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-local-cache.util.ts","../../../../../libs/framework/client/common/src/lib/settings/indexed-db-setting-value.provider.ts","../../../../../libs/framework/client/common/src/lib/settings/settings.provider.ts","../../../../../libs/framework/client/common/src/lib/settings/settings.service.ts","../../../../../libs/framework/client/common/src/lib/settings/default-multi-language-config.service.ts","../../../../../libs/framework/client/common/src/lib/settings/default-multi-language.helpers.ts","../../../../../libs/framework/client/common/src/lib/settings/platform-settings-load-state.service.ts","../../../../../libs/framework/client/common/src/lib/network/network-connectivity.service.ts","../../../../../libs/framework/client/common/src/lib/settings/platform-settings-offline-bootstrap.service.ts","../../../../../libs/framework/client/common/src/lib/settings/platform-settings-available.guard.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-evaluator-scope.provider.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-sync.types.ts","../../../../../libs/framework/client/common/src/lib/settings/regional-calendar.service.ts","../../../../../libs/framework/client/common/src/lib/settings/unsaved-changes-confirm.service.ts","../../../../../libs/framework/client/common/src/lib/settings/unsaved-changes-popstate.service.ts","../../../../../libs/framework/client/common/src/lib/tab-navigation/tab-route-cache.registry.ts","../../../../../libs/framework/client/common/src/lib/settings/unsaved-changes-can-deactivate.guard.ts","../../../../../libs/framework/client/common/src/lib/settings/settings-popup.types.ts","../../../../../libs/framework/client/common/src/lib/home-page/home-page-settings.key.ts","../../../../../libs/framework/client/common/src/lib/home-page/home-page.service.ts","../../../../../libs/framework/client/common/src/lib/home-page/home-page.routes.ts","../../../../../libs/framework/client/common/src/lib/settings/experience-settings.constants.ts","../../../../../libs/framework/client/common/src/lib/home-page/home-page-settings.provider.ts","../../../../../libs/framework/client/common/src/lib/home-page/home-page.module.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation.notification.ts","../../../../../libs/framework/client/common/src/lib/user-notification/user-notification.port.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation-notification.service.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation.util.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation-completion.service.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation.types.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation.const.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation.entity.storage.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation.entity.mapper.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation.store.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation.entity-store.service.ts","../../../../../libs/framework/client/common/src/lib/background-operation/entities/background-operation/background-operation.types.ts","../../../../../libs/framework/client/common/src/lib/background-operation/entities/background-operation/background-operation.entity.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation.handler.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation.provider.ts","../../../../../libs/framework/client/common/src/lib/background-operation/background-operation.service.ts","../../../../../libs/framework/client/common/src/lib/state-message/state-message.component.ts","../../../../../libs/framework/client/common/src/lib/state-message/state-message.component.html","../../../../../libs/framework/client/common/src/lib/background-operation/components/background-operation-item.component.ts","../../../../../libs/framework/client/common/src/lib/background-operation/components/background-operation-item.component.html","../../../../../libs/framework/client/common/src/lib/background-operation/components/background-operation-panel.component.ts","../../../../../libs/framework/client/common/src/lib/background-operation/components/background-operation-panel.component.html","../../../../../libs/framework/client/common/src/lib/background-operation/components/background-operation-slot.component.ts","../../../../../libs/framework/client/common/src/lib/background-operation/components/background-operation-slot.component.html","../../../../../libs/framework/client/common/src/lib/user-notification/user-notification.service.ts","../../../../../libs/framework/client/common/src/lib/user-notification/index.ts","../../../../../libs/framework/client/common/src/lib/configs/app.config.ts","../../../../../libs/framework/client/common/src/lib/platform-branding/platform-branding.constants.ts","../../../../../libs/framework/client/common/src/lib/platform-branding/platform-branding.service.ts","../../../../../libs/framework/client/common/src/lib/utils/app-path-navigation.util.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/menu-route-matcher.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/menu.context.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/menu.middleware.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/menu-middleware.registry.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/menu.provider.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/menu-visibility.service.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/menu-keyboard-shortcuts.service.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/menu.service.ts","../../../../../libs/framework/client/common/src/lib/tab-navigation/tab-key.util.ts","../../../../../libs/framework/client/common/src/lib/tab-navigation/tab-navigation.types.ts","../../../../../libs/framework/client/common/src/lib/tab-navigation/tab-route-resolver.ts","../../../../../libs/framework/client/common/src/lib/tab-navigation/tab-title.util.ts","../../../../../libs/framework/client/common/src/lib/tab-navigation/tab-preview.service.ts","../../../../../libs/framework/client/common/src/lib/tab-navigation/tab-route-policy.ts","../../../../../libs/framework/client/common/src/lib/tab-navigation/tab-navigation.service.ts","../../../../../libs/framework/client/common/src/lib/browser-title/browser-title.service.ts","../../../../../libs/framework/client/common/src/lib/data/data-provider.types.ts","../../../../../libs/framework/client/common/src/lib/data/operators.service.ts","../../../../../libs/framework/client/common/src/lib/data/filter-middleware.service.ts","../../../../../libs/framework/client/common/src/lib/errors/error-handler-registry.service.ts","../../../../../libs/framework/client/common/src/lib/errors/request-error.util.ts","../../../../../libs/framework/client/common/src/lib/errors/format-request-error.util.ts","../../../../../libs/framework/client/common/src/lib/errors/global-error-handler.ts","../../../../../libs/framework/client/common/src/lib/errors/not-found.error.ts","../../../../../libs/framework/client/common/src/lib/errors/not-found.routes.ts","../../../../../libs/framework/client/common/src/lib/errors/unauthorized.routes.ts","../../../../../libs/framework/client/common/src/lib/formatters/translate.formatter.ts","../../../../../libs/framework/client/common/src/lib/file-storage/file-storage.service.ts","../../../../../libs/framework/client/common/src/lib/file-storage/file-storage-evaluator-scope.provider.ts","../../../../../libs/framework/client/common/src/lib/file-storage/resolve-stored-image-url.ts","../../../../../libs/framework/client/common/src/lib/file-storage/logo-image-src-resolver.service.ts","../../../../../libs/framework/client/common/src/lib/file-storage/normalize-document-file-list-item.util.ts","../../../../../libs/framework/client/common/src/lib/file-storage/resolve-media-viewer-type.util.ts","../../../../../libs/framework/client/common/src/lib/keyboard-shortcuts/keyboard-shortcuts-help.component.ts","../../../../../libs/framework/client/common/src/lib/keyboard-shortcuts/keyboard-shortcuts-help.service.ts","../../../../../libs/framework/client/common/src/lib/layout/sticky.directive.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/provide-menu-middleware.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/menu-route-access.service.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/menu-route.guard.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/protected-route.guards.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/search-definition.provider.ts","../../../../../libs/framework/client/common/src/lib/search/search-definition-lazy-resolver.token.ts","../../../../../libs/framework/client/common/src/lib/search/search-definition.builder.ts","../../../../../libs/framework/client/common/src/lib/search/search-definition.provider.ts","../../../../../libs/framework/client/common/src/lib/search/search-display-string.util.ts","../../../../../libs/framework/client/common/src/lib/search/search.provider.ts","../../../../../libs/framework/client/common/src/lib/search/entity-search-display-title.util.ts","../../../../../libs/framework/client/common/src/lib/search/search.service.ts","../../../../../libs/framework/client/common/src/lib/search/entity-row-display-title.util.ts","../../../../../libs/framework/client/common/src/lib/search/search-entity-command.util.ts","../../../../../libs/framework/client/common/src/lib/layout/menu/search.provider.ts","../../../../../libs/framework/client/common/src/lib/layout/theme/components/slots/footer-text-slot.component.ts","../../../../../libs/framework/client/common/src/lib/layout/theme/components/slots/navbar-slot.component.ts","../../../../../libs/framework/client/common/src/lib/tokens/token-definition.provider.ts","../../../../../libs/framework/client/common/src/lib/tokens/token-definition.service.ts","../../../../../libs/framework/client/common/src/lib/tokens/token-evaluator-scope.provider.ts","../../../../../libs/framework/client/common/src/lib/utils/query-params-evaluator-scope.provider.ts","../../../../../libs/framework/client/common/src/lib/utils/query-evaluator-scope.provider.ts","../../../../../libs/framework/client/common/src/lib/common.module.ts","../../../../../libs/framework/client/common/src/lib/configs/entity-create-list-behavior.util.ts","../../../../../libs/framework/client/common/src/lib/configs/config.types.ts","../../../../../libs/framework/client/common/src/lib/file-actions/choose-system-files.util.ts","../../../../../libs/framework/client/common/src/lib/file-actions/file-actions.provider.ts","../../../../../libs/framework/client/common/src/lib/file-actions/file-actions.service.ts","../../../../../libs/framework/client/common/src/lib/file-actions/file-actions.types.ts","../../../../../libs/framework/client/common/src/lib/file-actions/upload-from-computer.action-provider.ts","../../../../../libs/framework/client/common/src/lib/file-type/file-type.provider.ts","../../../../../libs/framework/client/common/src/lib/file-type/file-type-purpose.util.ts","../../../../../libs/framework/client/common/src/lib/file-type/file-type-display.util.ts","../../../../../libs/framework/client/common/src/lib/file-type/file-type-open.util.ts","../../../../../libs/framework/client/common/src/lib/file-type/acorex-file-type.bridge.ts","../../../../../libs/framework/client/common/src/lib/file-type/acorex-file-type.module.ts","../../../../../libs/framework/client/common/src/lib/integration/integration.provider.ts","../../../../../libs/framework/client/common/src/lib/integration/integration-domain.provider.ts","../../../../../libs/framework/client/common/src/lib/integration/integration-domain-provider.context.ts","../../../../../libs/framework/client/common/src/lib/integration/integration-provider.context.ts","../../../../../libs/framework/client/common/src/lib/integration/integration-domain.registry.service.ts","../../../../../libs/framework/client/common/src/lib/integration/integration-provider.registry.service.ts","../../../../../libs/framework/client/common/src/lib/integration/integration-secret-store.token.ts","../../../../../libs/framework/client/common/src/lib/integration/integration-connection-established.token.ts","../../../../../libs/framework/client/common/src/lib/integration/integration-connection-lifecycle.token.ts","../../../../../libs/framework/client/common/src/lib/integration/index.ts","../../../../../libs/framework/client/common/src/lib/local-data/local-entity.types.ts","../../../../../libs/framework/client/common/src/lib/local-data/local-entity-indexed-db.ts","../../../../../libs/framework/client/common/src/lib/local-data/local-entity-query.util.ts","../../../../../libs/framework/client/common/src/lib/local-data/local-entity.engine.ts","../../../../../libs/framework/client/common/src/lib/local-data/local-entity-realtime.bridge.ts","../../../../../libs/framework/client/common/src/lib/lock-system/lock.service.ts","../../../../../libs/framework/client/common/src/lib/status-definition/status-definition-provider.service.ts","../../../../../libs/framework/client/common/src/lib/tab-navigation/tab-preview.types.ts","../../../../../libs/framework/client/common/src/lib/utils/entity-list-return-url.util.ts","../../../../../libs/framework/client/common/src/lib/utils/clipboard-service.ts","../../../../../libs/framework/client/common/src/lib/utils/dom-graphic.util.ts","../../../../../libs/framework/client/common/src/lib/utils/export-popup.ts","../../../../../libs/framework/client/common/src/lib/utils/export.service.ts","../../../../../libs/framework/client/common/src/lib/utils/filter-cleaner.ts","../../../../../libs/framework/client/common/src/lib/utils/locale-code.util.ts","../../../../../libs/framework/client/common/src/lib/utils/locale-management-port.ts","../../../../../libs/framework/client/common/src/lib/utils/locale-settings.util.ts","../../../../../libs/framework/client/common/src/lib/versioning/types.ts","../../../../../libs/framework/client/common/src/lib/commands/navigate.command.ts","../../../../../libs/framework/client/common/src/lib/commands/navigate.command.definition.ts","../../../../../libs/framework/client/common/src/acorex-platform-framework-client-common.ts"],"sourcesContent":["//#region ---- Output kind & segment ----\n\nimport type { AXPAgentOutputKind, AXPOutputTranscriptSegmentId } from '@acorex-platform/framework-shared/core';\n\n//#endregion\n\n//#region ---- JSON Schema (minimal subset) ----\n\n/**\n * Minimal JSON-Schema-like object for native provider hints and local validation.\n */\nexport interface AXPJsonSchemaLike {\n type?: 'object' | 'array' | 'string' | 'number' | 'integer' | 'boolean' | 'null';\n properties?: Record<string, AXPJsonSchemaLike>;\n items?: AXPJsonSchemaLike | AXPJsonSchemaLike[];\n required?: string[];\n enum?: unknown[];\n additionalProperties?: boolean | AXPJsonSchemaLike;\n description?: string;\n [key: string]: unknown;\n}\n\n//#endregion\n\n//#region ---- Provider response format ----\n\n/** Provider-native structured output hint (OpenAI `response_format`, Gemini `responseMimeType`). */\nexport type AXPAgentResponseFormat =\n | { type: 'text' }\n | { type: 'json_object' }\n | {\n type: 'json_schema';\n schema: AXPJsonSchemaLike;\n name?: string;\n strict?: boolean;\n };\n\n//#endregion\n\n//#region ---- Output contract ----\n\n/**\n * Catalog row contract for specialist final output (separate from domain `systemPrompt`).\n * Field paths align with agent/assist entity `outputContract` JSON.\n */\nexport interface AXPAgentOutputContract {\n kind: AXPAgentOutputKind;\n /**\n * When `kind` is `object`: `text` = generic JSON object as text; `node` = inner widget node in chat;\n * `followUp` = `{\"type\":\"followUp\",\"content\":[...]}` envelope.\n */\n transcriptSegment?: AXPOutputTranscriptSegmentId;\n instruction?: string;\n schemaSummary?: string;\n schema?: AXPJsonSchemaLike;\n schemaName?: string;\n schemaStrict?: boolean;\n validationCommandName?: string;\n structuredRetries?: number;\n providerResponseFormat?: AXPAgentResponseFormat;\n}\n\n/** Default structured retry count when `structuredRetries` is omitted on structured kinds. */\nexport const AXP_AGENT_OUTPUT_CONTRACT_DEFAULT_STRUCTURED_RETRIES = 2;\n\n//#endregion\n\n//#region ---- Transcript segment definition ----\n\n/**\n * Registered preset for an output-contract transcript segment.\n * Modules register via {@link AXP_OUTPUT_CONTRACT_TRANSCRIPT_SEGMENT_PROVIDER}.\n */\nexport interface AXPOutputContractTranscriptSegmentDefinition {\n /** Segment id (`text`, `node`, `followUp`). */\n name: AXPOutputTranscriptSegmentId;\n /** i18n key or display title for admin UI selects. */\n title: string;\n description?: string;\n /** Contract kinds this segment applies to (defaults to `object` only). */\n applicableKinds?: AXPAgentOutputKind[];\n /** Default `outputContract` field values when this segment is chosen. */\n contract: AXPAgentOutputContract;\n}\n\n//#endregion\n","import { InjectionToken } from '@angular/core';\nimport type { AXPOutputContractTranscriptSegmentDefinition } from './output-contract-transcript-segment.types';\n\n//#region ---- Provider token ----\n\nexport type AXPOutputContractTranscriptSegmentProviderToken =\n | AXPOutputContractTranscriptSegmentProvider\n | Promise<AXPOutputContractTranscriptSegmentProvider>;\n\n/**\n * Registers one or more transcript-segment presets for agent/assist `outputContract`.\n * Use with `multi: true` in module providers.\n */\nexport interface AXPOutputContractTranscriptSegmentProvider {\n provide():\n | AXPOutputContractTranscriptSegmentDefinition[]\n | Promise<AXPOutputContractTranscriptSegmentDefinition[]>;\n}\n\nexport const AXP_OUTPUT_CONTRACT_TRANSCRIPT_SEGMENT_PROVIDER = new InjectionToken<\n AXPOutputContractTranscriptSegmentProviderToken[]\n>('AXP_OUTPUT_CONTRACT_TRANSCRIPT_SEGMENT_PROVIDER', {\n factory: () => [],\n});\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { inject, Injectable } from '@angular/core';\nimport type { AXPOutputTranscriptSegmentId } from '@acorex-platform/framework-shared/core';\nimport { AXP_OUTPUT_CONTRACT_TRANSCRIPT_SEGMENT_PROVIDER } from './output-contract-transcript-segment.provider';\nimport type {\n AXPAgentOutputContract,\n AXPOutputContractTranscriptSegmentDefinition,\n} from './output-contract-transcript-segment.types';\n\n//#endregion\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPOutputContractTranscriptSegmentService {\n //#region ---- Dependencies & cache ----\n\n private readonly segmentProviders =\n inject(AXP_OUTPUT_CONTRACT_TRANSCRIPT_SEGMENT_PROVIDER, { optional: true }) ?? [];\n\n private definitionsByName = new Map<string, AXPOutputContractTranscriptSegmentDefinition>();\n private loadPromise: Promise<void> | null = null;\n\n //#endregion\n\n //#region ---- Public API ----\n\n /** All registered transcript segment definitions (deduped by `name`). */\n async getAll(): Promise<AXPOutputContractTranscriptSegmentDefinition[]> {\n await this.ensureLoaded();\n return [...this.definitionsByName.values()];\n }\n\n /** Lookup by segment id (`text`, `node`, `followUp`). */\n async get(\n name: AXPOutputTranscriptSegmentId,\n ): Promise<AXPOutputContractTranscriptSegmentDefinition | undefined> {\n await this.ensureLoaded();\n return this.definitionsByName.get(name);\n }\n\n /** Default `outputContract` for a segment, or `undefined` when not registered. */\n async getContractPreset(name: AXPOutputTranscriptSegmentId): Promise<AXPAgentOutputContract | undefined> {\n const definition = await this.get(name);\n return definition?.contract;\n }\n\n /** Clears the in-memory registry (e.g. after hot reload in dev). */\n clearCache(): void {\n this.definitionsByName.clear();\n this.loadPromise = null;\n }\n\n //#endregion\n\n //#region ---- Load ----\n\n private async ensureLoaded(): Promise<void> {\n if (this.loadPromise) {\n return this.loadPromise;\n }\n this.loadPromise = this.loadDefinitions();\n return this.loadPromise;\n }\n\n private async loadDefinitions(): Promise<void> {\n const resolvedProviders = await Promise.all(this.segmentProviders);\n\n for (const provider of resolvedProviders) {\n if (!provider) {\n continue;\n }\n const definitions = await Promise.resolve(provider.provide());\n for (const definition of definitions) {\n if (!definition?.name) {\n continue;\n }\n if (this.definitionsByName.has(definition.name)) {\n console.warn(\n `[AXPOutputContractTranscriptSegmentService] Segment \"${definition.name}\" already registered; overwriting.`,\n );\n }\n this.definitionsByName.set(definition.name, definition);\n }\n }\n }\n\n //#endregion\n}\n","import { inject, Injectable, InjectionToken } from '@angular/core';\n\nexport interface AXPAppVersion {\n version: string;\n build: number;\n date: Date;\n}\n\nexport interface AXPAppVersionProvider {\n provider(): Promise<AXPAppVersion>;\n}\n\nexport const AXP_APP_VERSION_PROVIDER = new InjectionToken<AXPAppVersionProvider>('AXP_APP_VERSION_PROVIDER', {\n providedIn: 'root',\n factory: () => {\n return new AXPAppVersionDefaultProvider();\n },\n});\n\nclass AXPAppVersionDefaultProvider implements AXPAppVersionProvider {\n async provider(): Promise<AXPAppVersion> {\n return {\n version: '1.0.0',\n build: 1,\n date: new Date(),\n };\n }\n}\n\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPAppVersionService {\n private provider = inject(AXP_APP_VERSION_PROVIDER);\n\n async getAppVersion(): Promise<AXPAppVersion> {\n return this.provider.provider();\n }\n}\n","export interface AXPFilterOperator {\n name: string;\n title: string;\n hasValue: boolean;\n}\n\nexport const EQ_OPER: AXPFilterOperator = { name: 'equal', title: '@general:terms.operators.equal', hasValue: true };\nexport const NOT_EQ_OPER: AXPFilterOperator = { name: 'notEqual', title: '@general:terms.operators.not-equal', hasValue: true };\nexport const GT_OPER: AXPFilterOperator = { name: 'greaterThan', title: '@general:terms.operators.greater-than', hasValue: true };\nexport const LT_OPER: AXPFilterOperator = { name: 'lessThan', title: '@general:terms.operators.less-than', hasValue: true };\nexport const GTE_OPER: AXPFilterOperator = {\n name: 'greaterThanOrEqual',\n title: '@general:terms.operators.greater-than-or-equal',\n hasValue: true,\n};\nexport const LTE_OPER: AXPFilterOperator = { name: 'lessThanOrEqual', title: '@general:terms.operators.less-than-or-equal', hasValue: true };\nexport const CONTAINS_OPER: AXPFilterOperator = { name: 'contains', title: '@general:terms.operators.contains', hasValue: true };\nexport const NOT_CONTAINS_OPER: AXPFilterOperator = { name: 'notContains', title: '@general:terms.operators.not-contains', hasValue: true };\nexport const IN_OPER: AXPFilterOperator = { name: 'in', title: '@general:terms.operators.in', hasValue: true };\nexport const STARTS_WITH_OPER: AXPFilterOperator = { name: 'startsWith', title: '@general:terms.operators.starts-with', hasValue: true };\nexport const ENDS_WITH_OPER: AXPFilterOperator = { name: 'endsWith', title: '@general:terms.operators.ends-with', hasValue: true };\nexport const IS_EMPTY_OPER: AXPFilterOperator = { name: 'isEmpty', title: '@general:terms.operators.is-empty', hasValue: false };\nexport const IS_NOT_EMPTY_OPER: AXPFilterOperator = { name: 'isNotEmpty', title: '@general:terms.operators.is-not-empty', hasValue: false };\nexport const BETWEEN_OPER: AXPFilterOperator = { name: 'between', title: '@general:terms.operators.between', hasValue: true };\n\nexport const STRING_OPERATORS = [\n EQ_OPER,\n NOT_EQ_OPER,\n CONTAINS_OPER,\n NOT_CONTAINS_OPER,\n STARTS_WITH_OPER,\n ENDS_WITH_OPER,\n IS_EMPTY_OPER,\n IS_NOT_EMPTY_OPER,\n IN_OPER\n];\n\nexport const NUMBER_OPERATORS = [\n EQ_OPER,\n NOT_EQ_OPER,\n BETWEEN_OPER,\n GT_OPER,\n GTE_OPER,\n LT_OPER,\n LTE_OPER,\n IS_EMPTY_OPER,\n IS_NOT_EMPTY_OPER,\n];\n\nexport const BOOLEAN_OPERATORS = [EQ_OPER];\n\nexport const DATE_OPERATORS = [\n EQ_OPER,\n NOT_EQ_OPER,\n BETWEEN_OPER,\n GT_OPER,\n GTE_OPER,\n LT_OPER,\n LTE_OPER,\n IS_EMPTY_OPER,\n IS_NOT_EMPTY_OPER,\n];\n\nexport const ALL_DEFAULT_OPERATORS = [\n EQ_OPER,\n NOT_EQ_OPER,\n GT_OPER,\n LT_OPER,\n GTE_OPER,\n LTE_OPER,\n CONTAINS_OPER,\n IN_OPER,\n NOT_CONTAINS_OPER,\n STARTS_WITH_OPER,\n ENDS_WITH_OPER,\n IS_EMPTY_OPER,\n IS_NOT_EMPTY_OPER,\n BETWEEN_OPER,\n];\n","import type { AXCalendarService } from '@acorex/core/date-time';\n\nimport { BETWEEN_OPER } from './operators';\n\nexport type AXPDateTimeFilterPresetKind = 'computed' | 'manual';\n\nexport interface AXPDateTimeFilterPreset {\n id: string;\n title: string;\n kind: AXPDateTimeFilterPresetKind;\n operationType?: string;\n}\n\nexport const DEFAULT_DATE_FILTER_PRESETS: AXPDateTimeFilterPreset[] = [\n { id: 'today', title: '@general:terms.date-presets.today', kind: 'computed' },\n { id: 'this-week', title: '@general:terms.date-presets.this-week', kind: 'computed' },\n { id: 'this-month', title: '@general:terms.date-presets.this-month', kind: 'computed' },\n { id: 'yesterday', title: '@general:terms.date-presets.yesterday', kind: 'computed' },\n { id: 'last-week', title: '@general:terms.date-presets.last-week', kind: 'computed' },\n { id: 'last-month', title: '@general:terms.date-presets.last-month', kind: 'computed' },\n { id: 'tomorrow', title: '@general:terms.date-presets.tomorrow', kind: 'computed' },\n { id: 'next-week', title: '@general:terms.date-presets.next-week', kind: 'computed' },\n { id: 'next-month', title: '@general:terms.date-presets.next-month', kind: 'computed' },\n { id: 'between', title: BETWEEN_OPER.title, kind: 'manual', operationType: 'between' },\n { id: 'greater-than', title: '@general:terms.operators.greater-than', kind: 'manual', operationType: 'greaterThan' },\n { id: 'less-than', title: '@general:terms.operators.less-than', kind: 'manual', operationType: 'lessThan' },\n];\n\nexport interface AXPDateTimeFilterValue {\n operation?: { type: string };\n value?: string | { from?: string; to?: string };\n}\n\nexport function resolveDateFilterPresets(\n customPresets?: AXPDateTimeFilterPreset[],\n presetIds?: string[],\n): AXPDateTimeFilterPreset[] {\n let presets = customPresets?.length ? customPresets : DEFAULT_DATE_FILTER_PRESETS;\n if (presetIds?.length) {\n presets = presets.filter((p) => presetIds.includes(p.id));\n }\n return presets;\n}\n\nexport function applyDateFilterPreset(\n presetId: string,\n calendarService: AXCalendarService,\n): AXPDateTimeFilterValue | undefined {\n const currentDate = calendarService.now().date;\n const calendar = calendarService.calendar;\n\n switch (presetId) {\n case 'today':\n return {\n operation: { type: 'between' },\n value: {\n from: calendar.startOf(currentDate, 'day').date.toISOString(),\n to: calendar.endOf(currentDate, 'day').date.toISOString(),\n },\n };\n case 'this-week':\n return {\n operation: { type: 'between' },\n value: {\n from: calendar.startOf(currentDate, 'week').date.toISOString(),\n to: calendar.endOf(currentDate, 'week').date.toISOString(),\n },\n };\n case 'this-month':\n return {\n operation: { type: 'between' },\n value: {\n from: calendar.startOf(currentDate, 'month').date.toISOString(),\n to: calendar.endOf(currentDate, 'month').date.toISOString(),\n },\n };\n case 'yesterday': {\n const yesterday = calendar.add(currentDate, 'day', -1);\n return {\n operation: { type: 'between' },\n value: {\n from: yesterday.startOf('day').date.toISOString(),\n to: yesterday.endOf('day').date.toISOString(),\n },\n };\n }\n case 'last-week': {\n const lastWeek = calendar.add(currentDate, 'week', -1);\n return {\n operation: { type: 'between' },\n value: {\n from: lastWeek.startOf('week').date.toISOString(),\n to: lastWeek.endOf('week').date.toISOString(),\n },\n };\n }\n case 'last-month': {\n const lastMonth = calendar.add(currentDate, 'month', -1);\n return {\n operation: { type: 'between' },\n value: {\n from: lastMonth.startOf('month').date.toISOString(),\n to: lastMonth.endOf('month').date.toISOString(),\n },\n };\n }\n case 'tomorrow': {\n const tomorrow = calendar.add(currentDate, 'day', 1);\n return {\n operation: { type: 'between' },\n value: {\n from: tomorrow.startOf('day').date.toISOString(),\n to: tomorrow.endOf('day').date.toISOString(),\n },\n };\n }\n case 'next-week': {\n const nextWeek = calendar.add(currentDate, 'week', 1);\n return {\n operation: { type: 'between' },\n value: {\n from: nextWeek.startOf('week').date.toISOString(),\n to: nextWeek.endOf('week').date.toISOString(),\n },\n };\n }\n case 'next-month': {\n const nextMonth = calendar.add(currentDate, 'month', 1);\n return {\n operation: { type: 'between' },\n value: {\n from: nextMonth.startOf('month').date.toISOString(),\n to: nextMonth.endOf('month').date.toISOString(),\n },\n };\n }\n case 'between':\n return undefined;\n case 'greater-than':\n return { operation: { type: 'greaterThan' } };\n case 'less-than':\n return { operation: { type: 'lessThan' } };\n default:\n return {\n operation: { type: 'between' },\n value: { from: '', to: '' },\n };\n }\n}\n\nexport function findManualPresetIdByOperation(\n operationType: string | undefined,\n presets: AXPDateTimeFilterPreset[],\n): string | undefined {\n if (!operationType) {\n return undefined;\n }\n return presets.find((p) => p.kind === 'manual' && p.operationType === operationType)?.id;\n}\n","import { InjectionToken } from '@angular/core';\nimport { Route } from '@angular/router';\n\nexport interface AXPHomePageDefinition {\n key: string,\n title: string,\n route: Route\n}\n\n\nexport const AXP_HOME_PAGES = new InjectionToken<AXPHomePageDefinition[]>('AXP_HOME_PAGES');\nexport const AXP_HOME_PAGE_DEFAULT_KEY = new InjectionToken<string>('AXP_HOME_PAGE_DEFAULT_KEY', {\n factory: () => 'home'\n});\n\n","import { AXPPlatformScopeKey } from '@acorex-platform/framework-shared/core';\n\nimport type { AXPSettingDefinition } from './settings.types';\n\n/** Strict descendants allowed to override a setting owned at `scope`. */\nexport const AXP_SETTING_SCOPE_DESCENDANTS: Record<AXPPlatformScopeKey, readonly AXPPlatformScopeKey[]> = {\n P: ['T', 'U'],\n T: ['U'],\n U: [],\n};\n\nexport function normalizeOverridableAt(\n ownerScope: AXPPlatformScopeKey,\n overridableAt: AXPPlatformScopeKey[] | undefined,\n): AXPPlatformScopeKey[] {\n const scopes = overridableAt ?? [];\n const allowed = AXP_SETTING_SCOPE_DESCENDANTS[ownerScope];\n for (const scope of scopes) {\n if (!allowed.includes(scope)) {\n throw new Error(\n `Setting at scope \"${ownerScope}\" cannot be overridable at \"${scope}\". Allowed: [${allowed.join(', ')}].`,\n );\n }\n }\n return scopes;\n}\n\nexport function isSettingVisibleOnScope(\n setting: Pick<AXPSettingDefinition, 'scope' | 'overridableAt'>,\n pageScope: AXPPlatformScopeKey,\n): boolean {\n if (setting.scope === pageScope) {\n return true;\n }\n return (setting.overridableAt ?? []).includes(pageScope);\n}\n","export enum AXPCommonSettings {\n EnableOperationToasts = 'Common:Setting:Notifications.EnableOperationToasts',\n RuntimeQueryCacheEnabled = 'Common:Setting:Performance.RuntimeQueryCacheEnabled',\n RuntimeQueryCacheTtlMs = 'Common:Setting:Performance.RuntimeQueryCacheTtlMs',\n EntityFilterApplyMode = 'Common:Setting:Entity.FilterApplyMode',\n ShowCategoryColumnsByDefault = 'Common:Setting:Entity.ShowCategoryColumnsByDefault',\n ApplyLayoutOrdering = 'Common:Setting:Entity.ApplyLayoutOrdering',\n RedirectToDetailsAfterCreate = 'Common:Setting:Entity.RedirectToDetailsAfterCreate',\n HighlightAfterCreateInList = 'Common:Setting:Entity.HighlightAfterCreateInList',\n ShowPageBadge = 'Common:Setting:Entity.ShowPageBadge',\n ConfirmUnsavedChanges = 'Common:Setting:Entity.ConfirmUnsavedChanges',\n DebugMode = 'PlatformDevTools:Setting:Developer.DebugMode',\n /**\n * Platform (P): when true and the API/network is unavailable, offer to continue from the\n * IndexedDB platform-settings cache. When false, bootstrap redirects to /auth/unavailable.\n */\n AllowWorkingOffline = 'Common:Setting:Offline.AllowWorkingOffline',\n ShowRowIndexColumn = 'Common:Setting:Entity.ShowRowIndexColumn',\n EntityListPersistenceMode = 'Common:Setting:Entity.ListPersistenceMode',\n /** User default for entity master-list presentation (`table` | `card` | `row`). */\n EntityListDisplayMode = 'Common:Setting:Entity.ListDisplayMode',\n NavigationMode = 'Common:Setting:Navigation.Mode',\n MaxOpenTabs = 'Common:Setting:Navigation.MaxOpenTabs',\n /** When true with entity list quick-search input, filters emit {@link AXP_QUERY_QUICK_SEARCH_FIELD} instead of inline OR. */\n QuickSearchEnabled = 'Common:Setting:Entity.QuickSearchEnabled',\n}\n\n/**\n * File-chooser keys live here so `common` can register Experience settings\n * without importing `layout/components` (ng-packagr secondary-entry cycle).\n * `layout/components` re-exports this const for existing file-chooser callers.\n */\nexport const AXPFileChooserSettings = {\n CompressImages: 'Common:Setting:FileChooser.CompressImages',\n PromptZipOnMultiple: 'Common:Setting:FileChooser.PromptZipOnMultiple',\n} as const;\n\n/** Defaults used before platform settings finish loading and by the setting definitions. */\nexport const AXP_RUNTIME_QUERY_CACHE_DEFAULTS = {\n enabled: true,\n ttlMs: 2_000,\n} as const;\n\n/** Default entity list presentation when the user has not chosen a layout. */\nexport const AXP_ENTITY_LIST_DISPLAY_MODE_DEFAULT = 'table' as const;\n","\nimport { AXPWidgetTypesMap } from '@acorex-platform/framework-shared/widget-core';\nimport {AXPValueTransformerFunctions} from '@acorex-platform/framework-client/core';\n\nimport {AXPOptionsData, AXPPlatformScopeKey, AXPValidationRules, AXPWidgetTriggers} from '@acorex-platform/framework-shared/core';\n\nimport { merge } from 'lodash-es';\nimport { isSettingVisibleOnScope, normalizeOverridableAt } from './settings-scope.util';\nimport {\n AXPSettingDefinition,\n AXPSettingDefinitionGroup,\n AXPSettingDefinitionSection,\n AXPSettingLayoutOptions,\n AXPSettingSectionAction,\n} from './index';\n\nexport class AXPSettingDefinitionProviderContext {\n private rootGroups: AXPSettingDefinitionGroup[] = [];\n private groupMap: Map<string, AXPSettingDefinitionGroup> = new Map();\n\n addGroup(\n name: string,\n title: string,\n description?: string,\n icon?: string,\n pageTitle?: string,\n priority?: number,\n ): AXPSettingDefinitionGroupBuilder {\n const newGroup: AXPSettingDefinitionGroup = {\n name,\n title,\n pageTitle,\n description,\n icon,\n priority,\n groups: [],\n sections: [],\n };\n\n this.rootGroups.push(newGroup);\n this.groupMap.set(name, newGroup); // Index by name\n return new AXPSettingDefinitionGroupBuilder(this, newGroup);\n }\n\n group(name: string): AXPSettingDefinitionGroupBuilder | null {\n const foundGroup = this.groupMap.get(name);\n if (!foundGroup) {\n console.error(`Group with name \"${name}\" not found.`);\n return null;\n }\n return new AXPSettingDefinitionGroupBuilder(this, foundGroup);\n }\n\n getGroups(): AXPSettingDefinitionGroup[] {\n return this.rootGroups;\n }\n\n // Expose groupMap for controlled access\n hasGroup(name: string): boolean {\n return this.groupMap.has(name);\n }\n\n getGroup(name: string): AXPSettingDefinitionGroup | undefined {\n return this.groupMap.get(name);\n }\n}\n\nexport class AXPSettingDefinitionGroupBuilder {\n private context: AXPSettingDefinitionProviderContext;\n private group: AXPSettingDefinitionGroup;\n\n constructor(context: AXPSettingDefinitionProviderContext, group: AXPSettingDefinitionGroup) {\n this.context = context;\n this.group = group;\n }\n\n addSection(name: string, title: string, description?: string): AXPSettingDefinitionSectionBuilder {\n const newSection: AXPSettingDefinitionSection = {\n name,\n title,\n description: description,\n settings: [],\n };\n this.group.sections.push(newSection);\n return new AXPSettingDefinitionSectionBuilder(this, newSection);\n }\n\n section(name: string): AXPSettingDefinitionSectionBuilder | null {\n const foundSection = this.group.sections.find((section) => section.name === name);\n if (!foundSection) {\n throw new Error(`Section with name \"${name}\" not found in group \"${this.group.name}\".`);\n }\n return new AXPSettingDefinitionSectionBuilder(this, foundSection);\n }\n\n addGroup(\n name: string,\n title: string,\n description?: string,\n icon?: string,\n pageTitle?: string,\n priority?: number,\n ): AXPSettingDefinitionGroupBuilder {\n const newGroup: AXPSettingDefinitionGroup = {\n name,\n title,\n pageTitle,\n description: description,\n icon,\n priority,\n groups: [],\n sections: [],\n };\n this.group.groups.push(newGroup);\n if (this.context.hasGroup(name)) {\n throw new Error(`Group with name \"${name}\" already exists.`);\n }\n this.context['groupMap'].set(name, newGroup);\n return new AXPSettingDefinitionGroupBuilder(this.context, newGroup);\n }\n\n endGroup(): AXPSettingDefinitionProviderContext {\n return this.context;\n }\n}\n\nexport class AXPSettingDefinitionSectionBuilder {\n private groupBuilder: AXPSettingDefinitionGroupBuilder;\n private section: AXPSettingDefinitionSection;\n\n constructor(groupBuilder: AXPSettingDefinitionGroupBuilder, section: AXPSettingDefinitionSection) {\n this.groupBuilder = groupBuilder;\n this.section = section;\n }\n\n addSetting(setting: {\n key: string;\n title: string;\n scope: AXPPlatformScopeKey;\n widget: {\n type: AXPWidgetTypesMap[keyof AXPWidgetTypesMap] | string;\n options?: AXPOptionsData;\n triggers?: AXPWidgetTriggers;\n layout?: AXPSettingLayoutOptions;\n };\n description?: string;\n searchTagKeys?: string[];\n isRequired?: boolean;\n isInherited?: boolean;\n overridableAt?: AXPPlatformScopeKey[];\n /**\n * When false, never persist this key to IndexedDB. Default true.\n * Forced false when `isEncrypted` is true.\n */\n cacheable?: boolean;\n /**\n * Server stores this value encrypted at rest. Implies `cacheable: false`\n * (no client IndexedDB cache).\n */\n isEncrypted?: boolean;\n requiresPageRefresh?: boolean;\n defaultValue?: unknown;\n valueTransforms?: AXPValueTransformerFunctions;\n validationRules?: AXPValidationRules;\n }): this {\n const scope = setting.scope ?? 'P';\n const isEncrypted = setting.isEncrypted ?? false;\n const newSetting: AXPSettingDefinition = {\n name: setting.key,\n title: setting.title,\n description: setting.description,\n searchTagKeys: setting.searchTagKeys,\n isRequired: setting.isRequired ?? false,\n isInherited: setting.isInherited ?? false,\n overridableAt: normalizeOverridableAt(scope, setting.overridableAt),\n isEncrypted,\n cacheable: isEncrypted ? false : (setting.cacheable ?? true),\n requiresPageRefresh: setting.requiresPageRefresh ?? false,\n defaultValue: setting.defaultValue,\n scope,\n layout: setting.widget.layout,\n widget: {\n type: setting.widget.type,\n name: setting.key,\n path: setting.key,\n defaultValue: setting.defaultValue,\n options: merge(setting.widget.options ?? {},\n {\n label: Object.keys(setting.widget.options ?? {}).includes('label') ? setting.widget.options?.['label'] : setting.title,\n validationRules: setting.validationRules ?? [],\n }),\n valueTransforms: setting.valueTransforms,\n triggers: setting.widget.triggers,\n },\n } as AXPSettingDefinition;\n this.section.settings.push(newSetting);\n return this;\n }\n\n addAction(action: AXPSettingSectionAction): this {\n if (!this.section.actions) {\n this.section.actions = [];\n }\n this.section.actions.push(action);\n return this;\n }\n\n endSection(): AXPSettingDefinitionGroupBuilder {\n return this.groupBuilder;\n }\n}\n","import { AXPPlatformScope, AXPPlatformScopeKey } from '@acorex-platform/framework-shared/core';\nimport { Injectable, InjectionToken, inject } from '@angular/core';\nimport { sortBy } from 'lodash-es';\nimport { isSettingVisibleOnScope } from './settings-scope.util';\nimport { AXPSettingDefinitionProviderContext } from './setting.builder';\nimport {\n AXPGroupSearchResult,\n AXPSettingDefaultValuesProvider,\n AXPSettingDefinition,\n AXPSettingDefinitionGroup,\n AXPSettingDefinitionSection,\n} from './settings.types';\n\nexport interface AXPSettingSectionLookupResult {\n group: AXPSettingDefinitionGroup;\n section: AXPSettingDefinitionSection;\n}\n// Interface for setting providers\nexport interface AXPSettingDefinitionProvider {\n provide(context: AXPSettingDefinitionProviderContext): Promise<void>;\n}\n\n// Injection token for setting providers\nexport const AXP_SETTING_DEFINITION_PROVIDER = new InjectionToken<AXPSettingDefinitionProvider[]>(\n 'AXP_SETTING_DEFINITION_PROVIDER',\n);\n\n@Injectable({ providedIn: 'root' })\nexport class AXPSettingDefinitionProviderService {\n private providers = inject(AXP_SETTING_DEFINITION_PROVIDER, { optional: true });\n private cache: AXPSettingDefinitionGroup[] | null = null;\n private loadPromise: Promise<void> | null = null;\n\n private async load(): Promise<void> {\n if (this.cache) {\n return;\n }\n if (!this.loadPromise) {\n this.loadPromise = this.loadDefinitions().finally(() => {\n this.loadPromise = null;\n });\n }\n await this.loadPromise;\n }\n\n private async loadDefinitions(): Promise<void> {\n if (this.cache) {\n return;\n }\n const context = new AXPSettingDefinitionProviderContext();\n\n // Load providers from DI tokens — isolate failures so one provider cannot block bootstrap.\n const providerList = this.normalizeProviders(this.providers);\n for (const provider of providerList) {\n try {\n if (provider instanceof Promise) {\n const resolvedProvider = await provider;\n await resolvedProvider.provide(context);\n } else {\n await provider.provide(context);\n }\n } catch (error) {\n console.warn('Setting definition provider failed; continuing with remaining providers', error);\n }\n }\n\n this.cache = context.getGroups();\n }\n\n private normalizeProviders(\n providers: AXPSettingDefinitionProvider | AXPSettingDefinitionProvider[] | null | undefined,\n ): AXPSettingDefinitionProvider[] {\n if (!providers) {\n return [];\n }\n return Array.isArray(providers) ? providers : [providers];\n }\n\n public async reload(): Promise<void> {\n this.cache = null;\n await this.load();\n }\n\n public async getListAsync(scope: AXPPlatformScopeKey): Promise<AXPSettingDefinitionGroup[]> {\n await this.load();\n return this.getList(scope);\n }\n\n public getList(scope: AXPPlatformScopeKey): AXPSettingDefinitionGroup[] {\n if (!this.cache) {\n return [];\n }\n\n const filterByScope = (\n groups: AXPSettingDefinitionGroup[],\n currentScope: AXPPlatformScopeKey,\n ): AXPSettingDefinitionGroup[] => {\n return groups\n .map((group) => ({\n ...group,\n sections: group.sections\n .map((section) => ({\n ...section,\n settings: section.settings.filter((setting) => isSettingVisibleOnScope(setting, currentScope)),\n }))\n .filter((section) => section.settings.length > 0), // Keep only sections with settings\n groups: filterByScope(group.groups, currentScope), // Recursively filter nested groups\n }))\n .filter((group) => group.sections.length > 0 || group.groups.length > 0); // Keep groups with valid sections or nested groups\n };\n\n return sortBy(filterByScope(this.cache, scope), [(group) => group.priority ?? 1000, 'title']);\n }\n\n async defaultValues(): Promise<Record<string, unknown>> {\n const defaults: Record<string, unknown> = {};\n\n const collectDefaults = (groups: AXPSettingDefinitionGroup[]) => {\n groups.forEach((group) => {\n group.sections.forEach((section) => {\n section.settings.forEach((setting) => {\n const value = setting.defaultValue;\n // Never surface blank strings as defaults — they become persisted overrides.\n if (value === undefined || value === null) {\n return;\n }\n if (typeof value === 'string' && value.trim() === '') {\n return;\n }\n defaults[setting.name] = value;\n });\n });\n collectDefaults(group.groups);\n });\n };\n\n if (!this.cache) {\n await this.load();\n }\n collectDefaults(this.cache!);\n\n return defaults;\n }\n\n async settingScopeByKey(): Promise<Record<string, AXPPlatformScope>> {\n const scopes: Record<string, AXPPlatformScope> = {};\n\n const collect = (groups: AXPSettingDefinitionGroup[]) => {\n groups.forEach((group) => {\n group.sections.forEach((section) => {\n section.settings.forEach((setting) => {\n scopes[setting.name] = setting.scope as AXPPlatformScope;\n });\n });\n collect(group.groups);\n });\n };\n\n if (!this.cache) {\n await this.load();\n }\n collect(this.cache!);\n\n return scopes;\n }\n\n async settingInheritedByKey(): Promise<Record<string, boolean>> {\n const inheritedByKey: Record<string, boolean> = {};\n\n const collect = (groups: AXPSettingDefinitionGroup[]) => {\n groups.forEach((group) => {\n group.sections.forEach((section) => {\n section.settings.forEach((setting) => {\n if (setting.isInherited) {\n inheritedByKey[setting.name] = true;\n }\n });\n });\n collect(group.groups);\n });\n };\n\n if (!this.cache) {\n await this.load();\n }\n collect(this.cache!);\n\n return inheritedByKey;\n }\n\n /** Per-key IndexedDB eligibility; missing keys default to cacheable (`true`). `isEncrypted` forces false. */\n async settingCacheableByKey(): Promise<Record<string, boolean>> {\n const cacheableByKey: Record<string, boolean> = {};\n\n const collect = (groups: AXPSettingDefinitionGroup[]) => {\n groups.forEach((group) => {\n group.sections.forEach((section) => {\n section.settings.forEach((setting) => {\n cacheableByKey[setting.name] = setting.isEncrypted ? false : setting.cacheable !== false;\n });\n });\n collect(group.groups);\n });\n };\n\n if (!this.cache) {\n await this.load();\n }\n collect(this.cache!);\n\n return cacheableByKey;\n }\n\n /** Per-key client-cache encryption marker; missing keys default to not encrypted. */\n async settingEncryptedByKey(): Promise<Record<string, boolean>> {\n const encryptedByKey: Record<string, boolean> = {};\n\n const collect = (groups: AXPSettingDefinitionGroup[]) => {\n groups.forEach((group) => {\n group.sections.forEach((section) => {\n section.settings.forEach((setting) => {\n if (setting.isEncrypted) {\n encryptedByKey[setting.name] = true;\n }\n });\n });\n collect(group.groups);\n });\n };\n\n if (!this.cache) {\n await this.load();\n }\n collect(this.cache!);\n\n return encryptedByKey;\n }\n\n async requiresPageRefreshByKey(): Promise<Record<string, boolean>> {\n const refreshByKey: Record<string, boolean> = {};\n\n const collect = (groups: AXPSettingDefinitionGroup[]) => {\n groups.forEach((group) => {\n group.sections.forEach((section) => {\n section.settings.forEach((setting) => {\n if (setting.requiresPageRefresh) {\n refreshByKey[setting.name] = true;\n }\n });\n });\n collect(group.groups);\n });\n };\n\n if (!this.cache) {\n await this.load();\n }\n collect(this.cache!);\n\n return refreshByKey;\n }\n\n public findGroup(scope: AXPPlatformScopeKey, groupName: string): AXPGroupSearchResult {\n return this.searchRecursive(this.getList(scope), groupName, []); // Initialize with an empty breadcrumb\n }\n\n async findSection(\n scope: AXPPlatformScopeKey,\n sectionName: string,\n groupName?: string,\n ): Promise<AXPSettingSectionLookupResult | null> {\n await this.load();\n return this.searchSectionRecursive(this.getList(scope), sectionName, groupName);\n }\n\n async collectSettingsByKeys(scope: AXPPlatformScopeKey, keys: string[]): Promise<AXPSettingDefinition[]> {\n if (!keys.length) {\n return [];\n }\n\n await this.load();\n const keySet = new Set(keys);\n const found = new Map<string, AXPSettingDefinition>();\n const walk = (groups: AXPSettingDefinitionGroup[]) => {\n for (const group of groups) {\n for (const section of group.sections) {\n for (const setting of section.settings) {\n if (keySet.has(setting.name) && !found.has(setting.name)) {\n found.set(setting.name, setting);\n }\n }\n }\n walk(group.groups);\n }\n };\n walk(this.getList(scope));\n return keys.map((key) => found.get(key)).filter((setting): setting is AXPSettingDefinition => !!setting);\n }\n\n private searchSectionRecursive(\n groups: AXPSettingDefinitionGroup[],\n sectionName: string,\n groupName?: string,\n ): AXPSettingSectionLookupResult | null {\n for (const group of groups) {\n if (groupName && group.name !== groupName) {\n const nested = this.searchSectionRecursive(group.groups, sectionName, groupName);\n if (nested) {\n return nested;\n }\n continue;\n }\n\n for (const section of group.sections) {\n if (section.name === sectionName) {\n return { group, section };\n }\n }\n\n const nested = this.searchSectionRecursive(group.groups, sectionName, groupName);\n if (nested) {\n return nested;\n }\n }\n\n return null;\n }\n\n private searchRecursive(\n groups: AXPSettingDefinitionGroup[],\n groupName: string,\n breadcrumb: { name: string; title: string }[],\n ): AXPGroupSearchResult {\n for (const group of groups) {\n const currentBreadcrumb = [\n ...breadcrumb,\n { name: group.name, title: group.title, description: group.description },\n ];\n\n // If the group name matches, return its details\n if (group.name === groupName) {\n return {\n breadcrumb: currentBreadcrumb,\n sections: group.sections.length > 0 ? group.sections : null,\n groups: group.groups.length > 0 ? group.groups : null,\n };\n }\n\n // Recursively search in nested groups\n const nestedResult = this.searchRecursive(group.groups, groupName, currentBreadcrumb);\n if (nestedResult.breadcrumb.length > 0) {\n return nestedResult;\n }\n }\n\n // If no matching group is found\n return {\n breadcrumb: [],\n groups: [],\n sections: [],\n };\n }\n}\n\n/**\n * Higher-layer default values (demo/app overrides).\n * Provide either:\n * - `{ provide: AXP_SETTING_DEFAULT_VALUES_PROVIDERS, useValue: [provider] }`, or\n * - multiple `{ provide: AXP_SETTING_DEFAULT_VALUES_PROVIDERS, useValue: provider, multi: true }`.\n */\nexport const AXP_SETTING_DEFAULT_VALUES_PROVIDERS = new InjectionToken<\n AXPSettingDefaultValuesProvider | AXPSettingDefaultValuesProvider[]\n>('AXP_SETTING_DEFAULT_VALUES_PROVIDERS');\n\nexport interface AXPSettingMergedDefaults {\n defaults: Record<string, unknown>;\n /** Per-key scope override for seeding (from providers that set `scope`). */\n seedScopeByKey: Record<string, AXPPlatformScope>;\n}\n\n// Aggregator service that merges definition defaults with higher-layer providers (by priority)\n@Injectable({ providedIn: 'root' })\nexport class AXPSettingDefaultValuesAggregatorService {\n private readonly definitionService = inject(AXPSettingDefinitionProviderService);\n private readonly injectedProviders = inject(AXP_SETTING_DEFAULT_VALUES_PROVIDERS, { optional: true });\n\n private resolveProviders(): AXPSettingDefaultValuesProvider[] {\n const raw = this.injectedProviders;\n if (!raw) {\n return [];\n }\n return Array.isArray(raw) ? raw : [raw];\n }\n\n async getMerged(): Promise<AXPSettingMergedDefaults> {\n const baseDefaults = await this.definitionService.defaultValues();\n const ordered = [...this.resolveProviders()].sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n const merged: Record<string, unknown> = { ...baseDefaults };\n const seedScopeByKey: Record<string, AXPPlatformScope> = {};\n for (const provider of ordered) {\n try {\n const overrideMap = await provider.provide();\n for (const [key, value] of Object.entries(overrideMap)) {\n if (value === undefined || value === null) {\n continue;\n }\n if (typeof value === 'string' && value.trim() === '') {\n continue;\n }\n merged[key] = value;\n if (provider.scope) {\n seedScopeByKey[key] = provider.scope;\n }\n }\n } catch (err) {\n console.error('AXPSettingDefaultValuesProvider failed:', err);\n }\n }\n return { defaults: merged, seedScopeByKey };\n }\n\n async getDefaults(): Promise<Record<string, unknown>> {\n const { defaults } = await this.getMerged();\n return defaults;\n }\n}\n","//#region ---- Imports ----\n\nimport {\n coerceUnknownToBoolean,\n coerceUnknownToDate,\n coerceUnknownToFiniteNumber,\n coerceUnknownToTrimmedString,\n isLocaleStringMap,\n unwrapValueProperty,\n} from '@acorex-platform/framework-shared/core';\n\n//#endregion\n\n//#region ---- Types ----\n\n/**\n * Supported primitive coercions for persisted setting values (including `{ value: ... }` wrappers).\n */\nexport type AXPSettingCoercionKind = 'string' | 'boolean' | 'number' | 'date';\n\n//#endregion\n\n//#region ---- Kind inference ----\n\n/**\n * If the payload uses the common `{ value: T }` shape from setting widgets, returns the inner value; otherwise returns `raw`.\n */\nexport function peelSettingValueKey(raw: unknown): unknown {\n return unwrapValueProperty(raw);\n}\n\nfunction coercionKindFromScalarSample(v: unknown): AXPSettingCoercionKind | null {\n if (v === null || v === undefined) {\n return null;\n }\n if (typeof v === 'boolean') {\n return 'boolean';\n }\n if (typeof v === 'number' && Number.isFinite(v)) {\n return 'number';\n }\n if (v instanceof Date) {\n return 'date';\n }\n if (typeof v === 'string') {\n if (v === 'true' || v === 'false') {\n return 'boolean';\n }\n return 'string';\n }\n return null;\n}\n\n/**\n * Picks a primitive coercion kind from the setting definition default and/or the effective stored value.\n * Type argument `T` on the settings service `get` method is compile-time only; runtime behavior follows this inference.\n *\n * Locale maps (`{ 'en-US': '...', 'fa-IR': '...' }`) are never string-coerced — even when the\n * definition default is a plain string (common for newly multi-language settings).\n */\nexport function inferSettingCoercionKind(defaultSample: unknown, effective: unknown): AXPSettingCoercionKind | null {\n const unwrapped = unwrapValueProperty(effective);\n if (isLocaleStringMap(unwrapped)) {\n return null;\n }\n const fromDefault = coercionKindFromScalarSample(defaultSample);\n if (fromDefault) {\n return fromDefault;\n }\n return coercionKindFromScalarSample(unwrapped);\n}\n\n//#endregion\n\n//#region ---- Value coercion ----\n\nexport function coerceAXPSettingRawValueByKind(raw: unknown, kind: AXPSettingCoercionKind): string | boolean | number | Date {\n switch (kind) {\n case 'string':\n return coerceUnknownToTrimmedString(raw);\n case 'boolean':\n return coerceUnknownToBoolean(raw);\n case 'number':\n return coerceUnknownToFiniteNumber(raw);\n case 'date':\n return coerceUnknownToDate(raw);\n default: {\n const _exhaustive: never = kind;\n return _exhaustive;\n }\n }\n}\n\nexport function coerceAXPSettingRawValue(raw: unknown, kind: 'string'): string;\nexport function coerceAXPSettingRawValue(raw: unknown, kind: 'boolean'): boolean;\nexport function coerceAXPSettingRawValue(raw: unknown, kind: 'number'): number;\nexport function coerceAXPSettingRawValue(raw: unknown, kind: 'date'): Date;\nexport function coerceAXPSettingRawValue(raw: unknown, kind: AXPSettingCoercionKind): string | boolean | number | Date {\n return coerceAXPSettingRawValueByKind(raw, kind);\n}\n\n//#endregion\n","import { InjectionToken } from '@angular/core';\n\nimport type { AXPSettingsSyncKeys } from '@acorex-platform/framework-shared/core';\n\nexport type { AXPSettingsSyncKeys };\n\nexport const AXP_SETTINGS_SYNC_KEYS = new InjectionToken<AXPSettingsSyncKeys>('AXP_SETTINGS_SYNC_KEYS');\n","import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport {\n AXPPlatformScope,\n runtimeCommandPayloadData,\n runtimeQueryPayloadData,\n} from '@acorex-platform/framework-shared/core';\nimport { AXPCommandService, AXPQueryService } from '@acorex-platform/framework-client/runtime';\nimport { inject, Injectable } from '@angular/core';\nimport { isString, toString } from 'lodash-es';\n\nimport { AXP_SETTINGS_SYNC_KEYS } from './settings-sync-keys.token';\nimport {\n AXPSettingsBulkFetchResult,\n AXPSettingsBulkPatchResult,\n AXPSettingsScopedFetchInput,\n AXPSettingsScopedPatchInput,\n} from './settings-sync.types';\n\n//#region ---- Settings bulk sync (query + command) ----\n\nconst EMPTY_FETCH_RESULT: AXPSettingsBulkFetchResult = {\n changed: false,\n updatedAt: null,\n values: {},\n};\n\n@Injectable({ providedIn: 'root' })\nexport class AXPSettingsBulkSyncService {\n private readonly queryService = inject(AXPQueryService);\n private readonly commandService = inject(AXPCommandService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly syncKeys = inject(AXP_SETTINGS_SYNC_KEYS);\n private readonly fetchInFlight = new Map<string, Promise<AXPSettingsBulkFetchResult>>();\n\n /** Clears deduped fetch promises so sign-out does not await stale tenant/user sync. */\n cancelInFlightFetches(): void {\n this.fetchInFlight.clear();\n }\n\n async fetch(scope: AXPPlatformScope, since: string | null): Promise<AXPSettingsBulkFetchResult> {\n if (scope !== AXPPlatformScope.Platform && !this.sessionService.isAuthenticated) {\n return EMPTY_FETCH_RESULT;\n }\n if (scope === AXPPlatformScope.User && !this.sessionService.isReadyForAppScopedApi) {\n return EMPTY_FETCH_RESULT;\n }\n\n const cacheKey = `${scope}:${since ?? ''}`;\n const inFlight = this.fetchInFlight.get(cacheKey);\n if (inFlight) {\n return inFlight;\n }\n\n const request = this.queryService\n .fetch<AXPSettingsScopedFetchInput, AXPSettingsBulkFetchResult>(\n this.syncKeys.scopedFetchQueryKey,\n { scope, since },\n )\n .then((result) => {\n if (!result) {\n throw new Error(`Settings fetch query '${this.syncKeys.scopedFetchQueryKey}' is not registered`);\n }\n const data = runtimeQueryPayloadData(result);\n if (!data) {\n const message = result.message?.text;\n const text = isString(message) ? message : toString(message);\n throw new Error(text || `Settings fetch query '${this.syncKeys.scopedFetchQueryKey}' failed`);\n }\n return data;\n })\n .finally(() => {\n this.fetchInFlight.delete(cacheKey);\n });\n\n this.fetchInFlight.set(cacheKey, request);\n return request;\n }\n\n async patch(scope: AXPPlatformScope, values: Record<string, unknown>): Promise<AXPSettingsBulkPatchResult> {\n if (scope !== AXPPlatformScope.Platform && !this.sessionService.isAuthenticated) {\n throw new Error('Cannot patch tenant/user scoped settings without an authenticated session');\n }\n if (scope === AXPPlatformScope.User && !this.sessionService.isReadyForAppScopedApi) {\n throw new Error('Cannot patch user scoped settings before the session is fully authorized');\n }\n\n const input: AXPSettingsScopedPatchInput = { scope, values };\n const result = await this.commandService.execute<AXPSettingsScopedPatchInput, AXPSettingsBulkPatchResult>(\n this.syncKeys.scopedPatchCommandKey,\n input,\n );\n const data = runtimeCommandPayloadData(result);\n if (!data) {\n const message = result?.message?.text;\n const text = isString(message) ? message : toString(message);\n throw new Error(text || `Settings patch command '${this.syncKeys.scopedPatchCommandKey}' failed`);\n }\n return data;\n }\n}\n\n//#endregion\n","import { AXPPlatformScope } from '@acorex-platform/framework-shared/core';\nimport { InjectionToken } from '@angular/core';\n\n//#region ---- Settings cache sync (avoids circular imports) ----\n\nexport interface AXPSettingsCacheSync {\n syncScopeCache(scope: AXPPlatformScope, values: Record<string, unknown>): void;\n}\n\nexport const AXP_SETTINGS_CACHE_SYNC = new InjectionToken<AXPSettingsCacheSync>('AXP_SETTINGS_CACHE_SYNC');\n\n//#endregion\n","import { AXPPlatformScope } from '@acorex-platform/framework-shared/core';\n\n//#region ---- Revalidation TTL (per scope) ----\n\n/** How long a local snapshot is considered fresh before background revalidation. */\nexport const AXP_SETTINGS_SYNC_TTL_MS: Record<AXPPlatformScope, number> = {\n [AXPPlatformScope.User]: 5 * 60_000, // 5 Minutes\n [AXPPlatformScope.Tenant]: 60_000, // 1 Minutes\n [AXPPlatformScope.Platform]: 60_000, // 1 Minutes\n};\n\n//#endregion\n\n//#region ---- Persist debounce & retry ----\n\n/** Trailing debounce before bulk PATCH for incremental UI saves (theme resize, etc.). */\nexport const AXP_SETTINGS_SYNC_DEBOUNCE_MS = 5 * 1_000; // 5 Seconds\n\n/** Silent retry backoff steps (ms); last value repeats. */\nexport const AXP_SETTINGS_SYNC_RETRY_BACKOFF_MS = [2_000, 5_000, 15_000, 60_000] as const;\n\n//#endregion\n","/** Debug namespace for all settings diagnostics. Filter console with `[AXP:Settings]`. */\nexport const SETTINGS_TRACE_NS = 'Settings';\n\n//#region ---- Trace area titles (console `[AXP:Settings] <title> — …`) ----\n\nexport const SETTINGS_TRACE_TITLE = {\n /** AXPSettingsService in-memory cache (load, reload, ensureLoaded). */\n Cache: 'Cache',\n /** IndexedDB scoped snapshot provider (hydrate, debounce, flush). */\n LocalSnapshot: 'LocalSnapshot',\n /** Query/command bulk sync — counts as a server request. */\n ServerSync: 'ServerSync',\n /** AXPAppStartUpService settings task on app boot. */\n Startup: 'Startup',\n /** Settings page route + view model. */\n Page: 'Page',\n /** Dev-only client storage tools (export / import / reset). */\n ClientTools: 'ClientTools',\n} as const;\n\n//#endregion\n","import { AXPPlatformScope } from '@acorex-platform/framework-shared/core';\nimport { AXPDebugService } from '@acorex-platform/framework-client/core';\n\nimport { SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE } from './settings-trace.constants';\n\n//#region ---- Local snapshot (IndexedDB) ----\n\n/** Emitted immediately after values are written to the scoped IndexedDB snapshot. */\nexport function traceSettingsLocalPersist(\n scope: AXPPlatformScope,\n payload: {\n snapshotId: string;\n keys: string[];\n dirtyKeyCount: number;\n flush: boolean;\n },\n): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.LocalSnapshot, 'Persisted locally', () => ({\n scope,\n snapshotId: payload.snapshotId,\n keys: payload.keys,\n dirtyKeyCount: payload.dirtyKeyCount,\n flush: payload.flush,\n note:\n scope === AXPPlatformScope.Platform\n ? payload.flush\n ? 'Platform IndexedDB cache updated — explicit ServerSync flush (admin save)'\n : 'Platform IndexedDB one-way cache updated — no server Patch from local dirty'\n : scope === AXPPlatformScope.User\n ? payload.flush\n ? 'IndexedDB updated — ServerSync flush runs immediately (flush: true)'\n : 'IndexedDB updated — dirty keys queued; ServerSync runs after debounce'\n : payload.flush\n ? 'In-memory snapshot updated — ServerSync flush runs immediately (flush: true)'\n : 'In-memory snapshot updated — dirty keys queued; ServerSync runs after debounce',\n }));\n}\n\n//#endregion\n\n//#region ---- Server sync ----\n\n/** Emitted once per bulk query/command call. Count these for server request frequency. */\nexport function traceSettingsServerApiCall(\n method: 'GET' | 'PATCH',\n scope: AXPPlatformScope,\n payload: Record<string, unknown>,\n): void {\n const message = method === 'GET' ? 'Server fetch' : 'Server patch';\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.ServerSync, message, () => ({\n scope,\n method,\n ...payload,\n note:\n method === 'GET'\n ? 'Background revalidate via SettingsManagement:ScopedSettings:Fetch'\n : 'Persist dirty keys via SettingsManagement:ScopedSettings:Patch',\n }));\n}\n\nexport function traceSettingsFlush(\n scope: AXPPlatformScope,\n payload: { snapshotId: string; keys: string[] },\n): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.LocalSnapshot, 'Server flush started', () => ({\n scope,\n ...payload,\n note: 'Debounce elapsed — sending dirty keys to server',\n }));\n}\n\nexport function traceSettingsSyncFailed(\n scope: AXPPlatformScope,\n payload: { snapshotId: string; keys: string[]; attempt: number },\n): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.LocalSnapshot, 'Sync failed', () => ({\n scope,\n ...payload,\n note: 'ServerSync PATCH failed — dirty keys kept; silent retry scheduled',\n }));\n}\n\nexport function traceSettingsRetryScheduled(\n scope: AXPPlatformScope,\n payload: { snapshotId: string; attempt: number; backoffMs: number; nextRetryAt: string },\n): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.LocalSnapshot, 'Retry scheduled', () => ({\n scope,\n ...payload,\n note: 'Backoff timer set — will retry ServerSync PATCH when due',\n }));\n}\n\nexport function traceSettingsRevalidateFailed(\n scope: AXPPlatformScope,\n payload: { snapshotId: string; since: string | null },\n): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.LocalSnapshot, 'Refresh failed', () => ({\n scope,\n ...payload,\n note: 'ServerSync GET failed — local snapshot remains authoritative until next attempt',\n }));\n}\n\n//#endregion\n\n//#region ---- Cache (AXPSettingsService) ----\n\nexport function traceSettingsAppStartupLoadStarted(): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.Startup, 'Task started', () => ({\n note: 'AXPAppStartUpService — calls AXPSettingsService.load() for all scopes',\n }));\n}\n\nexport function traceSettingsAppStartupLoadComplete(payload: {\n totalKeys: number;\n keysByScope: Record<string, number>;\n durationMs: number;\n}): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.Startup, 'Task finished', () => ({\n ...payload,\n note: 'App boot settings preload complete',\n }));\n}\n\nexport function traceSettingsServiceLoadStarted(reason: string): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.Cache, 'Load started', () => ({\n reason,\n note: 'Loading all scope providers into in-memory cache',\n }));\n}\n\nexport function traceSettingsServiceLoadComplete(payload: {\n totalKeys: number;\n keysByScope: Record<string, number>;\n durationMs: number;\n}): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.Cache, 'Load finished', () => ({\n ...payload,\n note: 'In-memory cache ready for get() / settings page',\n }));\n}\n\nexport function traceSettingsServiceReload(scope: AXPPlatformScope | 'all', reason: string): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.Cache, 'Reload', () => ({\n scope,\n reason,\n note: scope === 'all' ? 'Full cache refresh' : 'Single scope refresh',\n }));\n}\n\nexport function traceSettingsServiceLoadFailed(error: unknown): void {\n AXPDebugService.instance?.error(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.Cache, 'Load failed', () => ({\n note: 'Provider load or default seeding threw — in-memory cache may be incomplete',\n error: error instanceof Error ? error.message : String(error),\n }));\n}\n\n//#endregion\n\n//#region ---- Settings page ----\n\nexport function traceSettingsPageLoadStarted(scope: string, reason: string): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.Page, 'View load started', () => ({\n scope,\n reason,\n note: 'Loading definition groups and scope values into the page view model',\n }));\n}\n\nexport function traceSettingsPageLoadComplete(payload: {\n scope: string;\n groupCount: number;\n valueKeyCount: number;\n durationMs: number;\n}): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.Page, 'View load finished', () => ({\n ...payload,\n note: 'Settings page ready to render',\n }));\n}\n\nexport function traceSettingsPageRouteLoad(scope: string, reason: string): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.Page, 'Route → load', () => ({\n scope,\n reason,\n note: 'Scope changed or page not loaded yet — triggering view model load',\n }));\n}\n\n//#endregion\n\n//#region ---- Client tools (mock dev commands) ----\n\nexport function traceSettingsClientTool(\n command: 'export' | 'import' | 'reset',\n message: string,\n payload: Record<string, unknown> = {},\n): void {\n AXPDebugService.instance?.trace(SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE.ClientTools, message, () => ({\n command,\n ...payload,\n note:\n command === 'export'\n ? 'Downloads localStorage and IndexedDB snapshot as JSON'\n : command === 'import'\n ? 'Restores localStorage and IndexedDB from a JSON file'\n : 'Clears browser storage — does not call ServerSync',\n }));\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPPlatformScope } from '@acorex-platform/framework-shared/core';\nimport Dexie, { Table } from 'dexie';\nimport { isPlainObject } from 'lodash-es';\n\nimport { AXPScopedSettingsSnapshot } from './settings-sync.types';\n\n//#endregion\n\n//#region ---- Dexie DB ----\n\nexport class AXPSettingsIndexedDb extends Dexie {\n scoped_snapshots!: Table<AXPScopedSettingsSnapshot, string>;\n\n constructor() {\n super('ACoreXSettings');\n this.version(1).stores({\n scoped_snapshots: 'id, scope',\n });\n // v2 briefly added device_keys for client-side encrypt; kept for upgrade path, unused.\n this.version(2).stores({\n scoped_snapshots: 'id, scope',\n device_keys: 'id',\n });\n }\n}\n\nexport const axpSettingsIndexedDb = new AXPSettingsIndexedDb();\n\n//#endregion\n\n//#region ---- Snapshot helpers ----\n\nexport function buildScopedSettingsSnapshotId(scope: AXPPlatformScope, contextKey: string): string {\n return contextKey ? `${scope}:${contextKey}` : scope;\n}\n\nexport function createEmptyScopedSettingsSnapshot(\n id: string,\n scope: AXPPlatformScope,\n): AXPScopedSettingsSnapshot {\n return {\n id,\n scope,\n values: {},\n serverUpdatedAt: null,\n lastRevalidatedAt: null,\n dirty: {},\n syncStatus: 'idle',\n nextRetryAt: null,\n retryAttempt: 0,\n };\n}\n\n/**\n * User: bidirectional local cache.\n * Platform: one-way cache (server → IndexedDB) for fast boot — never flushed back from dirty state.\n * Tenant: memory-only.\n */\nexport function shouldPersistSettingsInIndexedDb(scope: AXPPlatformScope): boolean {\n return scope === AXPPlatformScope.User || scope === AXPPlatformScope.Platform;\n}\n\n/**\n * Platform IndexedDB rows are a read-through cache only.\n * Local dirty must not be Patch'd back to the server from that cache.\n */\nexport function isOneWaySettingsIndexedDbCache(scope: AXPPlatformScope): boolean {\n return scope === AXPPlatformScope.Platform;\n}\n\n/** Removes legacy tenant rows (tenant settings are memory-only). Platform cache is kept. */\nexport async function purgeLegacyTenantScopedSettingsSnapshots(): Promise<void> {\n await axpSettingsIndexedDb.scoped_snapshots.where('scope').equals(AXPPlatformScope.Tenant).delete();\n}\n\n/**\n * Drops accidental nested parent objects created when dotted setting keys were written via\n * path-based `setSmart` (e.g. `Common:Setting:Offline: { AllowWorkingOffline }`).\n * Flat keys like `Common:Setting:Offline.AllowWorkingOffline` are kept.\n */\nexport function stripAccidentalNestedSettingParents(\n values: Record<string, unknown>,\n): Record<string, unknown> {\n const keys = Object.keys(values);\n const cleaned: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(values)) {\n if (isPlainObject(value) && keys.some((other) => other.startsWith(`${key}.`))) {\n continue;\n }\n cleaned[key] = value;\n }\n return cleaned;\n}\n\n//#endregion\n","//#region ----- Types -----\n\nexport interface AXPSettingsLocalCachePolicy {\n /** Missing keys default to cacheable. */\n cacheableByKey: Record<string, boolean>;\n}\n\n//#endregion\n\n//#region ----- Policy helpers -----\n\nexport function isSettingKeyCacheable(key: string, policy: AXPSettingsLocalCachePolicy): boolean {\n return policy.cacheableByKey[key] !== false;\n}\n\n//#endregion\n\n//#region ----- Disk projection / hydrate -----\n\n/**\n * Builds the IndexedDB projection from the in-memory map.\n * Drops keys with `cacheable: false` (including secrets marked `isEncrypted`).\n */\nexport function projectSettingsValuesForIndexedDb(\n values: Record<string, unknown>,\n policy: AXPSettingsLocalCachePolicy,\n): Record<string, unknown> {\n const projected: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(values)) {\n if (!isSettingKeyCacheable(key, policy)) {\n continue;\n }\n projected[key] = value;\n }\n return projected;\n}\n\n/**\n * Converts an IndexedDB values map into in-memory values.\n * Non-cacheable keys left on disk from legacy snapshots are dropped and trigger a rewrite.\n */\nexport function hydrateSettingsValuesFromIndexedDb(\n values: Record<string, unknown>,\n policy: AXPSettingsLocalCachePolicy,\n): { memoryValues: Record<string, unknown>; diskNeedsRewrite: boolean } {\n const memoryValues: Record<string, unknown> = {};\n let diskNeedsRewrite = false;\n\n for (const [key, value] of Object.entries(values)) {\n if (!isSettingKeyCacheable(key, policy)) {\n diskNeedsRewrite = true;\n continue;\n }\n memoryValues[key] = value;\n }\n\n return { memoryValues, diskNeedsRewrite };\n}\n\n//#endregion\n","import { AXPSessionService, AXPSessionStatus } from '@acorex-platform/framework-client/auth';\nimport { AXPPlatformScope } from '@acorex-platform/framework-shared/core';\nimport { Injector } from '@angular/core';\nimport { defaultTo, isEmpty, merge } from 'lodash-es';\nimport { combineLatest, distinctUntilChanged, map } from 'rxjs';\n\nimport { AXPSettingDefinitionProviderService } from './setting-definition.service';\nimport { AXPSettingsBulkSyncService } from './settings-bulk-sync.service';\nimport { AXP_SETTINGS_CACHE_SYNC } from './settings-cache-sync.token';\nimport {\n AXP_SETTINGS_SYNC_DEBOUNCE_MS,\n AXP_SETTINGS_SYNC_RETRY_BACKOFF_MS,\n AXP_SETTINGS_SYNC_TTL_MS,\n} from './settings-sync.config';\nimport {\n traceSettingsFlush,\n traceSettingsLocalPersist,\n traceSettingsRevalidateFailed,\n traceSettingsRetryScheduled,\n traceSettingsServerApiCall,\n traceSettingsSyncFailed,\n} from './settings-sync.trace';\nimport {\n axpSettingsIndexedDb,\n buildScopedSettingsSnapshotId,\n createEmptyScopedSettingsSnapshot,\n isOneWaySettingsIndexedDbCache,\n shouldPersistSettingsInIndexedDb,\n stripAccidentalNestedSettingParents,\n} from './settings-indexed-db';\nimport {\n hydrateSettingsValuesFromIndexedDb,\n projectSettingsValuesForIndexedDb,\n type AXPSettingsLocalCachePolicy,\n} from './settings-local-cache.util';\nimport { AXPScopedSettingsSnapshot } from './settings-sync.types';\nimport {\n AXPSettingReloadOptions,\n AXPSettingSetOptions,\n AXPSettingValue,\n AXPSettingValueProvider,\n} from './settings.types';\n\n//#region ---- Scoped settings provider (User bidirectional; Platform one-way cache) ----\n\nexport class AXPIndexedDbSettingValueProvider implements AXPSettingValueProvider {\n private readonly sessionService = this.injector.get(AXPSessionService);\n private readonly bulkSync = this.injector.get(AXPSettingsBulkSyncService);\n\n private contextKey: string | null = null;\n private snapshotId: string | null = null;\n private snapshot: AXPScopedSettingsSnapshot | null = null;\n private hydrated = false;\n private hydratePromise: Promise<void> | null = null;\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private retryTimer: ReturnType<typeof setTimeout> | null = null;\n private flushInFlight: Promise<void> | null = null;\n private revalidateInFlight: Promise<void> | null = null;\n private syncGeneration = 0;\n /**\n * Depth counter for require-server reloads. A concurrent soft reload must not clear\n * an in-flight startup requireServer Fetch.\n */\n private requireServerSyncDepth = 0;\n\n constructor(\n private readonly _scope: AXPPlatformScope,\n private readonly injector: Injector,\n ) {\n if (this._scope === AXPPlatformScope.Platform) {\n this.contextKey = '';\n this.snapshotId = buildScopedSettingsSnapshotId(this._scope, this.contextKey);\n return;\n }\n\n this.bindSessionContextChanges();\n }\n\n private bindSessionContextChanges(): void {\n this.sessionService.status$.subscribe((status) => {\n if (\n status === AXPSessionStatus.SignedOut ||\n status === AXPSessionStatus.Unauthenticated ||\n status === AXPSessionStatus.Unauthorized ||\n status === AXPSessionStatus.Expired\n ) {\n this.unbindSessionContext();\n return;\n }\n if (status === AXPSessionStatus.Authorized || status === AXPSessionStatus.Authenticated) {\n if (this.canSyncScopeWithServer()) {\n this.tryBindSessionContext();\n }\n }\n });\n\n if (this._scope === AXPPlatformScope.User) {\n combineLatest([this.sessionService.user$, this.sessionService.tenant$])\n .pipe(\n map(([user, tenant]) => (user?.id && tenant?.id ? `${tenant.id}:${user.id}` : null)),\n distinctUntilChanged(),\n )\n .subscribe((contextKey) => {\n if (!contextKey) {\n this.unbindSessionContext();\n return;\n }\n this.tryBindSessionContext();\n });\n return;\n }\n\n if (this._scope === AXPPlatformScope.Tenant) {\n this.sessionService.tenant$\n .pipe(\n map((tenant) => tenant?.id ?? null),\n distinctUntilChanged(),\n )\n .subscribe((tenantId) => {\n if (!tenantId) {\n this.unbindSessionContext();\n return;\n }\n this.tryBindSessionContext();\n });\n }\n }\n\n public get scope(): AXPPlatformScope {\n return this._scope;\n }\n\n async load(): Promise<AXPSettingValue[]> {\n this.tryBindSessionContext();\n if (!this.snapshotId) {\n return [];\n }\n if (this.hydrated && this.snapshot?.id === this.snapshotId) {\n return this.toSettingValues(this.snapshot.values);\n }\n if (!this.hydratePromise) {\n this.hydratePromise = this.hydrateSnapshot().finally(() => {\n this.hydratePromise = null;\n });\n }\n await this.hydratePromise;\n if (!this.snapshot || this.snapshot.id !== this.snapshotId) {\n return [];\n }\n return this.toSettingValues(defaultTo(this.snapshot.values, {}));\n }\n\n async set(key: string, value: unknown, options?: AXPSettingSetOptions): Promise<void>;\n async set(values: Record<string, unknown>, options?: AXPSettingSetOptions): Promise<void>;\n async set(\n keyOrValues: string | Record<string, unknown>,\n valueOrOptions?: unknown | AXPSettingSetOptions,\n options?: AXPSettingSetOptions,\n ): Promise<void> {\n this.tryBindSessionContext();\n if (!this.snapshotId) {\n return;\n }\n\n await this.load();\n\n let patch: Record<string, unknown>;\n let setOptions: AXPSettingSetOptions | undefined;\n\n if (typeof keyOrValues === 'string') {\n patch = { [keyOrValues]: valueOrOptions };\n setOptions = options;\n } else {\n patch = keyOrValues;\n setOptions = valueOrOptions as AXPSettingSetOptions | undefined;\n }\n\n // Platform is a one-way IndexedDB cache (server → client). Local edits update the cache only\n // unless the caller explicitly requests flush (e.g. platform settings admin save).\n if (isOneWaySettingsIndexedDbCache(this._scope) && !setOptions?.flush) {\n this.applyLocalValuesOnly(patch);\n await this.persistSnapshot();\n traceSettingsLocalPersist(this._scope, {\n snapshotId: this.snapshotId,\n keys: Object.keys(patch),\n dirtyKeyCount: 0,\n flush: false,\n });\n return;\n }\n\n this.applyLocalPatch(patch);\n await this.persistSnapshot();\n\n traceSettingsLocalPersist(this._scope, {\n snapshotId: this.snapshotId,\n keys: Object.keys(patch),\n dirtyKeyCount: Object.keys(defaultTo(this.snapshot?.dirty, {})).length,\n flush: !!setOptions?.flush,\n });\n\n if (setOptions?.flush) {\n await this.flushNow();\n return;\n }\n\n this.scheduleDebouncedFlush();\n }\n\n async reload(options?: AXPSettingReloadOptions): Promise<void> {\n const requireServer = !!options?.requireServer;\n if (requireServer) {\n this.requireServerSyncDepth++;\n }\n this.resetHydration();\n try {\n await this.load();\n } finally {\n if (requireServer) {\n this.requireServerSyncDepth = Math.max(0, this.requireServerSyncDepth - 1);\n }\n }\n }\n\n private get requireServerSync(): boolean {\n return this.requireServerSyncDepth > 0;\n }\n\n async revalidateIfNeeded(): Promise<void> {\n if (!this.snapshotId || !this.canSyncScopeWithServer()) {\n return;\n }\n if (!this.snapshot) {\n await this.load();\n }\n if (!this.snapshot) {\n return;\n }\n if (!isEmpty(this.snapshot.dirty)) {\n if (isOneWaySettingsIndexedDbCache(this._scope)) {\n this.clearLocalDirty(this.snapshot);\n await this.persistSnapshotRecord(this.snapshot);\n } else {\n await this.flushNow();\n return;\n }\n }\n if (!this.shouldRevalidate(this.snapshot)) {\n return;\n }\n await this.revalidateNow();\n }\n\n cancelInFlightSync(): void {\n this.syncGeneration++;\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n this.retryTimer = null;\n }\n this.revalidateInFlight = null;\n this.flushInFlight = null;\n this.hydratePromise = null;\n if (this._scope !== AXPPlatformScope.Platform) {\n this.resetHydration();\n }\n }\n\n //#region ---- Hydration ----\n\n private async hydrateSnapshot(): Promise<void> {\n const expectedSnapshotId = this.snapshotId;\n if (!expectedSnapshotId) {\n return;\n }\n\n const existing = shouldPersistSettingsInIndexedDb(this._scope)\n ? await axpSettingsIndexedDb.scoped_snapshots.get(expectedSnapshotId)\n : undefined;\n if (this.snapshotId !== expectedSnapshotId) {\n return;\n }\n\n this.snapshot = existing ?? createEmptyScopedSettingsSnapshot(expectedSnapshotId, this._scope);\n const rawValues = stripAccidentalNestedSettingParents(defaultTo(this.snapshot.values, {}));\n const policy = await this.resolveLocalCachePolicy();\n const hydrated = hydrateSettingsValuesFromIndexedDb(rawValues, policy);\n this.snapshot.values = hydrated.memoryValues;\n let diskNeedsRewrite = hydrated.diskNeedsRewrite;\n\n const rawDirty = defaultTo(this.snapshot.dirty, {});\n if (!isEmpty(rawDirty)) {\n const dirtyHydrate = hydrateSettingsValuesFromIndexedDb(\n stripAccidentalNestedSettingParents(rawDirty),\n policy,\n );\n this.snapshot.dirty = dirtyHydrate.memoryValues;\n diskNeedsRewrite = diskNeedsRewrite || dirtyHydrate.diskNeedsRewrite;\n }\n\n // Platform cache is one-way: never Patch server from IndexedDB dirty leftovers.\n if (isOneWaySettingsIndexedDbCache(this._scope) && !isEmpty(this.snapshot.dirty)) {\n this.clearLocalDirty(this.snapshot);\n await this.persistSnapshotRecord(this.snapshot);\n } else if (diskNeedsRewrite) {\n // Drop legacy plaintext secrets / non-cacheable keys from disk.\n await this.persistSnapshotRecord(this.snapshot);\n }\n\n const needsInitialSync = isEmpty(this.snapshot.values);\n if (\n this.canSyncScopeWithServer() &&\n (needsInitialSync || this.shouldRevalidate(this.snapshot) || this.requireServerSync)\n ) {\n await this.revalidateNow();\n }\n\n this.hydrated = true;\n\n if (isOneWaySettingsIndexedDbCache(this._scope)) {\n return;\n }\n\n void this.scheduleRetryIfDue();\n if (!isEmpty(this.snapshot.dirty)) {\n this.scheduleDebouncedFlush();\n }\n }\n\n private resetHydration(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n this.retryTimer = null;\n }\n this.hydrated = false;\n this.snapshot = null;\n this.hydratePromise = null;\n }\n\n private resolveContextKey(): string {\n if (this._scope === AXPPlatformScope.User) {\n return `${this.sessionService.tenant!.id}:${this.sessionService.user!.id}`;\n }\n if (this._scope === AXPPlatformScope.Tenant) {\n return this.sessionService.tenant!.id;\n }\n return '';\n }\n\n private unbindSessionContext(): void {\n if (this._scope === AXPPlatformScope.Platform) {\n return;\n }\n this.contextKey = null;\n this.snapshotId = null;\n this.resetHydration();\n }\n\n /**\n * Binds snapshot id from restored session data. Only resets hydration when the scoped context changes\n * (e.g. user switch), not when auth status re-emits for the same tenant/user.\n */\n private tryBindSessionContext(): void {\n if (this._scope === AXPPlatformScope.Platform) {\n return;\n }\n if (!this.canSyncScopeWithServer()) {\n return;\n }\n if (this._scope === AXPPlatformScope.User && (!this.sessionService.user?.id || !this.sessionService.tenant?.id)) {\n return;\n }\n if (this._scope === AXPPlatformScope.Tenant && !this.sessionService.tenant?.id) {\n return;\n }\n\n const nextContextKey = this.resolveContextKey();\n const nextSnapshotId = buildScopedSettingsSnapshotId(this._scope, nextContextKey);\n if (nextSnapshotId === this.snapshotId) {\n return;\n }\n\n this.contextKey = nextContextKey;\n this.snapshotId = nextSnapshotId;\n this.resetHydration();\n }\n\n //#endregion\n\n //#region ---- Local patch ----\n\n private applyLocalPatch(patch: Record<string, unknown>): void {\n if (!this.snapshot) {\n return;\n }\n this.snapshot.values = merge({}, this.snapshot.values, patch);\n this.snapshot.dirty = merge({}, this.snapshot.dirty, patch);\n this.snapshot.syncStatus = isEmpty(this.snapshot.dirty) ? 'idle' : 'pending_retry';\n }\n\n /** Updates cached values without queuing a server Patch (platform one-way cache). */\n private applyLocalValuesOnly(patch: Record<string, unknown>): void {\n if (!this.snapshot) {\n return;\n }\n this.snapshot.values = merge({}, this.snapshot.values, patch);\n }\n\n private clearLocalDirty(snapshot: AXPScopedSettingsSnapshot): void {\n snapshot.dirty = {};\n snapshot.syncStatus = 'idle';\n snapshot.retryAttempt = 0;\n snapshot.nextRetryAt = null;\n }\n\n private async persistSnapshot(): Promise<void> {\n if (!this.snapshot) {\n return;\n }\n await this.persistSnapshotRecord(this.snapshot);\n }\n\n private async resolveLocalCachePolicy(): Promise<AXPSettingsLocalCachePolicy> {\n try {\n const definitionService = this.injector.get(AXPSettingDefinitionProviderService);\n const cacheableByKey = await definitionService.settingCacheableByKey();\n return { cacheableByKey };\n } catch {\n return { cacheableByKey: {} };\n }\n }\n\n /**\n * Writes a disk projection (cacheable keys only) without mutating\n * the in-memory snapshot used by the settings service.\n */\n private async persistSnapshotRecord(snapshot: AXPScopedSettingsSnapshot): Promise<void> {\n if (!shouldPersistSettingsInIndexedDb(snapshot.scope)) {\n return;\n }\n const policy = await this.resolveLocalCachePolicy();\n await axpSettingsIndexedDb.scoped_snapshots.put({\n ...snapshot,\n values: projectSettingsValuesForIndexedDb(defaultTo(snapshot.values, {}), policy),\n dirty: projectSettingsValuesForIndexedDb(defaultTo(snapshot.dirty, {}), policy),\n });\n }\n\n private toSettingValues(values: Record<string, unknown>): AXPSettingValue[] {\n return Object.entries(values).map(([key, value]) => ({ key, value }));\n }\n\n //#endregion\n\n //#region ---- Server sync eligibility ----\n\n /** Platform settings are public; tenant bulk sync requires auth; user requires full authorization. */\n private canSyncScopeWithServer(): boolean {\n if (this._scope === AXPPlatformScope.Platform) {\n return true;\n }\n if (!this.sessionService.isAuthenticated) {\n return false;\n }\n if (this._scope === AXPPlatformScope.User) {\n return this.sessionService.isReadyForAppScopedApi;\n }\n return this.sessionService.hasSessionCredentials();\n }\n\n //#endregion\n\n //#region ---- Revalidation ----\n\n private shouldRevalidate(record: AXPScopedSettingsSnapshot): boolean {\n const ttl = AXP_SETTINGS_SYNC_TTL_MS[this._scope];\n if (!record.lastRevalidatedAt) {\n return true;\n }\n return Date.now() - Date.parse(record.lastRevalidatedAt) >= ttl;\n }\n\n private async revalidateNow(): Promise<void> {\n if (!this.snapshotId || !this.snapshot) {\n return;\n }\n if (this.revalidateInFlight) {\n await this.revalidateInFlight;\n return;\n }\n\n this.revalidateInFlight = this.doRevalidate().finally(() => {\n this.revalidateInFlight = null;\n });\n await this.revalidateInFlight;\n }\n\n private resolveFetchSince(snapshot: AXPScopedSettingsSnapshot): string | null {\n // requireServer must always pull the full partition — IndexedDB may omit non-cacheable\n // keys (SMTP / secrets), and a conditional `since` fetch would never fill them in.\n if (this.requireServerSync) {\n return null;\n }\n if (isEmpty(snapshot.values) && isEmpty(snapshot.dirty)) {\n return null;\n }\n return snapshot.serverUpdatedAt;\n }\n\n private async doRevalidate(): Promise<void> {\n const snapshot = this.snapshot;\n const generation = this.syncGeneration;\n if (!snapshot || !this.canSyncScopeWithServer()) {\n return;\n }\n\n try {\n let since = this.resolveFetchSince(snapshot);\n traceSettingsServerApiCall('GET', this._scope, {\n snapshotId: this.snapshotId,\n since,\n reason: this.requireServerSync ? 'require-server-revalidate' : 'background-revalidate',\n });\n let result = await this.bulkSync.fetch(this._scope, since);\n if (generation !== this.syncGeneration || this.snapshot !== snapshot) {\n return;\n }\n if (!result.changed && isEmpty(result.values) && since) {\n since = null;\n result = await this.bulkSync.fetch(this._scope, null);\n }\n if (generation !== this.syncGeneration || this.snapshot !== snapshot) {\n return;\n }\n const now = new Date().toISOString();\n snapshot.lastRevalidatedAt = now;\n\n if (result.changed && !isEmpty(result.values)) {\n const servicePatch: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(result.values)) {\n if (key in snapshot.dirty) {\n continue;\n }\n servicePatch[key] = value;\n }\n // Full server payloads replace local values (dirty wins for bidirectional User scope).\n snapshot.values = stripAccidentalNestedSettingParents(\n this.requireServerSync\n ? merge({}, result.values, isOneWaySettingsIndexedDbCache(this._scope) ? {} : snapshot.dirty)\n : merge({}, result.values, snapshot.dirty),\n );\n if (result.updatedAt) {\n snapshot.serverUpdatedAt = result.updatedAt;\n }\n if (!isEmpty(servicePatch)) {\n this.injector.get(AXP_SETTINGS_CACHE_SYNC).syncScopeCache(this._scope, servicePatch);\n }\n } else if (result.updatedAt) {\n snapshot.serverUpdatedAt = result.updatedAt;\n }\n\n await this.persistSnapshotRecord(snapshot);\n } catch (error) {\n traceSettingsRevalidateFailed(this._scope, {\n snapshotId: this.snapshotId!,\n since: snapshot.serverUpdatedAt,\n });\n // Background revalidate may fail quietly when a warm cache exists.\n // Initial sync / startup requireServer must surface the error for retry / offline handling.\n if (isEmpty(snapshot.values) || this.requireServerSync) {\n throw error;\n }\n }\n }\n\n //#endregion\n\n //#region ---- Flush & retry ----\n\n private scheduleDebouncedFlush(): void {\n if (isOneWaySettingsIndexedDbCache(this._scope)) {\n return;\n }\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n this.debounceTimer = setTimeout(() => {\n this.debounceTimer = null;\n void this.flushNow();\n }, AXP_SETTINGS_SYNC_DEBOUNCE_MS);\n }\n\n async flushNow(): Promise<void> {\n if (!this.snapshotId) {\n return;\n }\n if (!this.snapshot) {\n await this.load();\n }\n if (!this.snapshot || isEmpty(this.snapshot.dirty)) {\n return;\n }\n if (this.flushInFlight) {\n await this.flushInFlight;\n return;\n }\n\n this.flushInFlight = this.doFlush().finally(() => {\n this.flushInFlight = null;\n });\n await this.flushInFlight;\n }\n\n private async doFlush(): Promise<void> {\n const snapshot = this.snapshot;\n const generation = this.syncGeneration;\n if (!snapshot || isEmpty(snapshot.dirty) || !this.canSyncScopeWithServer()) {\n return;\n }\n\n const payload = { ...snapshot.dirty };\n traceSettingsFlush(this._scope, {\n snapshotId: this.snapshotId!,\n keys: Object.keys(payload),\n });\n traceSettingsServerApiCall('PATCH', this._scope, {\n snapshotId: this.snapshotId,\n keys: Object.keys(payload),\n reason: 'flush-dirty',\n });\n snapshot.syncStatus = 'syncing';\n await this.persistSnapshotRecord(snapshot);\n\n try {\n const result = await this.bulkSync.patch(this._scope, payload);\n if (generation !== this.syncGeneration || this.snapshot !== snapshot) {\n return;\n }\n for (const key of Object.keys(payload)) {\n delete snapshot.dirty[key];\n }\n snapshot.serverUpdatedAt = result.updatedAt;\n snapshot.lastRevalidatedAt = new Date().toISOString();\n snapshot.syncStatus = 'idle';\n snapshot.retryAttempt = 0;\n snapshot.nextRetryAt = null;\n await this.persistSnapshotRecord(snapshot);\n } catch {\n if (generation !== this.syncGeneration || this.snapshot !== snapshot) {\n return;\n }\n traceSettingsSyncFailed(this._scope, {\n snapshotId: this.snapshotId!,\n keys: Object.keys(payload),\n attempt: snapshot.retryAttempt,\n });\n snapshot.syncStatus = 'pending_retry';\n this.scheduleSilentRetry(snapshot);\n await this.persistSnapshotRecord(snapshot);\n }\n }\n\n private scheduleSilentRetry(snapshot: AXPScopedSettingsSnapshot): void {\n const attempt = snapshot.retryAttempt;\n const backoff =\n AXP_SETTINGS_SYNC_RETRY_BACKOFF_MS[Math.min(attempt, AXP_SETTINGS_SYNC_RETRY_BACKOFF_MS.length - 1)];\n snapshot.retryAttempt = attempt + 1;\n snapshot.nextRetryAt = new Date(Date.now() + backoff).toISOString();\n\n traceSettingsRetryScheduled(this._scope, {\n snapshotId: this.snapshotId!,\n attempt: snapshot.retryAttempt,\n backoffMs: backoff,\n nextRetryAt: snapshot.nextRetryAt,\n });\n\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n }\n this.retryTimer = setTimeout(() => {\n this.retryTimer = null;\n void this.scheduleRetryIfDue();\n }, backoff);\n }\n\n private async scheduleRetryIfDue(): Promise<void> {\n if (isOneWaySettingsIndexedDbCache(this._scope)) {\n return;\n }\n if (!this.snapshot || isEmpty(this.snapshot.dirty)) {\n return;\n }\n if (this.snapshot.nextRetryAt && Date.parse(this.snapshot.nextRetryAt) > Date.now()) {\n return;\n }\n await this.flushNow();\n }\n\n //#endregion\n}\n\n//#endregion\n","import { AXPSessionService, AXPSessionStatus } from '@acorex-platform/framework-client/auth';\nimport { AXPPlatformScope } from '@acorex-platform/framework-shared/core';\nimport { inject, InjectionToken, Injector } from '@angular/core';\n\nimport { AXPIndexedDbSettingValueProvider } from './indexed-db-setting-value.provider';\nimport { purgeLegacyTenantScopedSettingsSnapshots } from './settings-indexed-db';\nimport { AXPSettingSetOptions, AXPSettingValue, AXPSettingValueProvider } from './settings.types';\n\n//#region ---- Provider factories ----\n\nexport function createIndexedDbSettingValueProviders(injector: Injector): AXPSettingValueProvider[] {\n void purgeLegacyTenantScopedSettingsSnapshots();\n return [\n new AXPIndexedDbSettingValueProvider(AXPPlatformScope.Platform, injector),\n new AXPIndexedDbSettingValueProvider(AXPPlatformScope.Tenant, injector),\n new AXPIndexedDbSettingValueProvider(AXPPlatformScope.User, injector),\n ];\n}\n\n//#endregion\n\nexport const AXP_SETTING_VALUE_PROVIDER = new InjectionToken<AXPSettingValueProvider[]>('AXP_SETTING_VALUE_PROVIDER');\n\nexport function createDefaultSettingValueProviders(injector: Injector): AXPSettingValueProvider[] {\n return [\n new AXPSettingValueProviderDefault(AXPPlatformScope.Platform, injector),\n new AXPSettingValueProviderDefault(AXPPlatformScope.Tenant, injector),\n new AXPSettingValueProviderDefault(AXPPlatformScope.User, injector),\n ];\n}\n\nclass AXPSettingValueProviderDefault implements AXPSettingValueProvider {\n private readonly cache: Map<string, any> = new Map();\n private localStorageKey: string | null = null;\n private sessionService = this.injector.get(AXPSessionService);\n\n constructor(\n private _scope: AXPPlatformScope,\n private injector: Injector,\n ) {\n if (this.scope === AXPPlatformScope.Platform) {\n this.localStorageKey = `AXP_SETTINGS_SCOPE(P)`;\n } else {\n this.sessionService.status$.subscribe((status) => {\n if (status === AXPSessionStatus.Authorized || status === AXPSessionStatus.Authenticated) {\n if (this.scope === AXPPlatformScope.User) {\n this.localStorageKey = `AXP_SETTINGS_SCOPE(${this.sessionService.user?.id ?? 'U'})`;\n } else if (this.scope === AXPPlatformScope.Tenant) {\n this.localStorageKey = `AXP_SETTINGS_SCOPE(${this.sessionService.tenant?.id ?? 'T'})`;\n }\n }\n });\n }\n }\n\n public get scope(): AXPPlatformScope {\n return this._scope;\n }\n\n async load(): Promise<AXPSettingValue[]> {\n if (!this.localStorageKey) {\n return Promise.resolve([]);\n }\n const storedSettings = localStorage.getItem(this.localStorageKey);\n if (storedSettings) {\n const parsedSettings: Record<string, any> = JSON.parse(storedSettings);\n Object.entries(parsedSettings).forEach(([key, value]) => {\n this.cache.set(key, value);\n });\n return Promise.resolve(Array.from(this.cache.entries()).map((c) => ({ key: c[0], value: c[1] })));\n }\n return Promise.resolve([]);\n }\n\n async set(key: string, value: any, _options?: AXPSettingSetOptions): Promise<void>;\n async set(values: Record<string, any>, _options?: AXPSettingSetOptions): Promise<void>;\n async set(keyOrValues: string | Record<string, any>, value?: any): Promise<void> {\n if (typeof keyOrValues === 'string') {\n this.cache.set(keyOrValues, value);\n } else {\n for (const [key, val] of Object.entries(keyOrValues)) {\n this.cache.set(key, val);\n }\n }\n await this.saveToLocalStorage();\n }\n\n private async saveToLocalStorage(): Promise<void> {\n if (!this.localStorageKey) {\n return;\n }\n const settingsObject: Record<string, any> = {};\n this.cache.forEach((value, key) => {\n settingsObject[key] = value;\n });\n localStorage.setItem(this.localStorageKey, JSON.stringify(settingsObject));\n }\n}\n","import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXP_SETTINGS_DEFINITION_DIALOG_OPENER } from '@acorex-platform/framework-client/core';\nimport { AXPPlatformScope } from '@acorex-platform/framework-shared/core';\nimport { AXPBroadcastEventService, AXPDebugService } from '@acorex-platform/framework-client/core';\nimport { inject, Injectable, Injector } from '@angular/core';\nimport { cloneDeep, get } from 'lodash-es';\nimport { combineLatest, distinctUntilChanged, filter, firstValueFrom, map, ReplaySubject, Subject, take } from 'rxjs';\nimport { AXPCommonSettings } from '../configs/common-settings.key';\nimport {\n AXPSettingDefaultValuesAggregatorService,\n AXPSettingDefinitionProviderService,\n} from './setting-definition.service';\nimport { coerceAXPSettingRawValueByKind, inferSettingCoercionKind } from './settings-coercion';\nimport { AXP_SETTING_VALUE_PROVIDER } from './settings.provider';\nimport { AXPSettingsBulkSyncService } from './settings-bulk-sync.service';\nimport {\n axpSettingsIndexedDb,\n buildScopedSettingsSnapshotId,\n} from './settings-indexed-db';\nimport { hydrateSettingsValuesFromIndexedDb } from './settings-local-cache.util';\nimport {\n AXPSettingChangedEvent,\n AXPSettingSetOptions,\n AXPSettingValue,\n AXPSettingValueProvider,\n} from './settings.types';\nimport type {\n AXPSettingsKeysPopupOptions,\n AXPSettingsSectionPopupOptions,\n} from './settings-popup.types';\nimport {\n traceSettingsServiceLoadComplete,\n traceSettingsServiceLoadFailed,\n traceSettingsServiceLoadStarted,\n traceSettingsServiceReload,\n} from './settings-sync.trace';\n\nexport interface AXPSettingsServiceInterface {\n load(): Promise<AXPSettingValue[]>;\n /** Loads platform settings from the server without waiting for tenant/user session context. */\n ensurePlatformSettingsLoaded(): Promise<void>;\n /** Soft-loads platform settings from IndexedDB cache after a failed server bootstrap. */\n adoptCachedPlatformSettings(): Promise<boolean>;\n get<T = any>(key: string): Promise<T>;\n peekCached(key: string): unknown | undefined;\n /**\n * Platform-scope value from in-memory cache, then IndexedDB snapshot.\n * Safe when server bootstrap failed (no requireServer / no adopt).\n */\n peekPlatformCached(key: string): Promise<unknown | undefined>;\n defaultValues(scope: AXPPlatformScope): Promise<Record<string, unknown>>;\n scope(scope: AXPPlatformScope): ScopedSettingService;\n reload(scope?: AXPPlatformScope, reason?: string): Promise<void>;\n ensureLoaded(): Promise<void>;\n ensureScopeLoaded(scope: AXPPlatformScope): Promise<void>;\n showSectionPopup(options: AXPSettingsSectionPopupOptions): Promise<boolean>;\n showSettingsPopup(options: AXPSettingsKeysPopupOptions): Promise<boolean>;\n}\n\nconst STATIC_SCOPES = [AXPPlatformScope.Platform, AXPPlatformScope.Tenant, AXPPlatformScope.User];\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPSettingsService implements AXPSettingsServiceInterface {\n private readonly providers: AXPSettingValueProvider[] = inject<AXPSettingValueProvider[]>(AXP_SETTING_VALUE_PROVIDER);\n private readonly injector = inject(Injector);\n private readonly eventService = inject(AXPBroadcastEventService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly bulkSyncService = inject(AXPSettingsBulkSyncService);\n private readonly debugService = inject(AXPDebugService);\n private readonly scopedSettingsCache: Map<string, Map<string, any>> = new Map();\n private readonly scopeLoaded = new Map<AXPPlatformScope, boolean>();\n private loadInFlight: Promise<AXPSettingValue[]> | null = null;\n private platformScopeLoadInFlight: Promise<{ settings: AXPSettingValue[]; keyCount: number }> | null = null;\n /** Serializes per-scope reload so session-auth + tenant$ cannot wipe a good cache with an empty abort. */\n private readonly scopeReloadInFlight = new Map<AXPPlatformScope, Promise<void>>();\n private lastUserContextKey: string | null = null;\n private lastTenantId: string | null = null;\n private hadAuthenticatedSession = false;\n public readonly onChanged = new Subject<AXPSettingChangedEvent>();\n public readonly onLoaded = new ReplaySubject<void>(1);\n\n constructor() {\n STATIC_SCOPES.forEach((scope) => {\n if (!this.scopedSettingsCache.has(scope)) {\n this.scopedSettingsCache.set(scope, new Map());\n }\n this.scopeLoaded.set(scope, false);\n });\n\n this.eventService.listen<AXPSettingChangedEvent>('AXPSettingChangedEvent').subscribe((event) => {\n const data = event.data;\n data.keys.forEach((key) => {\n this.scopedSettingsCache.get(data.scope)?.set(key, data.values[key]);\n });\n this.onChanged.next(data);\n void this.applyDebugModeFromEvent(data);\n });\n\n this.sessionService.isAuthenticated$.pipe(distinctUntilChanged()).subscribe(async (isAuthenticated) => {\n if (isAuthenticated) {\n this.hadAuthenticatedSession = true;\n await this.reloadAuthenticatedScopes('session-authenticated');\n return;\n }\n this.cancelInFlightLoads();\n this.clearScopedCache(AXPPlatformScope.User);\n this.clearScopedCache(AXPPlatformScope.Tenant);\n this.lastUserContextKey = null;\n this.lastTenantId = null;\n if (this.hadAuthenticatedSession) {\n this.hadAuthenticatedSession = false;\n await this.restorePlatformSettingsAfterLogout();\n }\n });\n\n this.sessionService.isAuthorized$.pipe(distinctUntilChanged()).subscribe(async (isAuthorized) => {\n if (!isAuthorized) {\n this.clearScopedCache(AXPPlatformScope.User);\n this.lastUserContextKey = null;\n return;\n }\n const user = this.sessionService.user;\n const tenant = this.sessionService.tenant;\n const contextKey = user?.id && tenant?.id ? `${tenant.id}:${user.id}` : null;\n if (!contextKey || contextKey === this.lastUserContextKey) {\n return;\n }\n this.lastUserContextKey = contextKey;\n if (!this.shouldLoadProvider(AXPPlatformScope.User)) {\n return;\n }\n await this.reload(AXPPlatformScope.User, 'session-authorized');\n });\n\n this.sessionService.tenant$\n .pipe(\n map((tenant) => tenant?.id ?? null),\n distinctUntilChanged(),\n )\n .subscribe(async (tenantId) => {\n if (tenantId === this.lastTenantId) {\n return;\n }\n this.lastTenantId = tenantId;\n if (!tenantId) {\n this.clearScopedCache(AXPPlatformScope.Tenant);\n return;\n }\n if (!this.shouldLoadProvider(AXPPlatformScope.Tenant)) {\n return;\n }\n await this.reload(AXPPlatformScope.Tenant, 'session-tenant-changed');\n });\n\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState !== 'visible') {\n return;\n }\n for (const provider of this.providers) {\n void provider.revalidateIfNeeded?.();\n }\n });\n }\n }\n\n async ensurePlatformSettingsLoaded(): Promise<void> {\n // Always force a server-required platform bootstrap. Do not short-circuit on in-memory\n // readiness — session restore may have warm-loaded P from IndexedDB without verifying API.\n if (this.loadInFlight) {\n await this.loadInFlight;\n }\n await this.loadScope(AXPPlatformScope.Platform, 'app-startup-platform', true);\n this.onLoaded.next();\n await this.applyDebugModeFromSettings();\n }\n\n async reload(scope?: AXPPlatformScope, reason = scope ? 'explicit-scope-reload' : 'full-reload'): Promise<void> {\n traceSettingsServiceReload(scope ?? 'all', reason);\n if (this.loadInFlight) {\n await this.loadInFlight;\n }\n if (scope) {\n const existing = this.scopeReloadInFlight.get(scope);\n if (existing) {\n await existing;\n // Non-force reasons can reuse the completed in-flight. Force-remote reasons\n // (e.g. settings page) must continue — IndexedDB may have marked the scope ready\n // while omitting non-cacheable keys (SMTP, secrets).\n if (!this.shouldForceProviderReload(reason)) {\n return;\n }\n }\n const reloadPromise = this.reloadScope(scope, reason).finally(() => {\n if (this.scopeReloadInFlight.get(scope) === reloadPromise) {\n this.scopeReloadInFlight.delete(scope);\n }\n });\n this.scopeReloadInFlight.set(scope, reloadPromise);\n await reloadPromise;\n return;\n }\n\n this.scopeLoaded.forEach((_, key) => this.scopeLoaded.set(key, false));\n await this.load(reason);\n }\n\n private async reloadScope(scope: AXPPlatformScope, reason: string): Promise<void> {\n if (!this.shouldLoadProvider(scope)) {\n this.clearScopedCache(scope);\n return;\n }\n const provider = this.providers.find((p) => p.scope === scope);\n if (!provider) {\n return;\n }\n if (provider.reload && this.shouldForceProviderReload(reason)) {\n await provider.reload(this.shouldRequireServerReload(scope, reason) ? { requireServer: true } : undefined);\n } else if (this.shouldForceProviderReload(reason)) {\n this.scopeLoaded.set(scope, false);\n }\n const providerSettings = await provider.load();\n this.replaceScopeCache(scope, providerSettings);\n this.onLoaded.next();\n await this.applyDebugModeFromSettings();\n }\n\n /**\n * Replaces the in-memory scope cache from a provider load.\n * Ignores empty results when the cache already has values — concurrent provider.reload()\n * can abort hydration via syncGeneration and return [] after a good fetch completed.\n */\n private replaceScopeCache(scope: AXPPlatformScope, providerSettings: AXPSettingValue[]): void {\n const scopeCache = this.scopedSettingsCache.get(scope)!;\n if (providerSettings.length === 0 && scopeCache.size > 0 && this.shouldLoadProvider(scope)) {\n this.scopeLoaded.set(scope, true);\n return;\n }\n scopeCache.clear();\n providerSettings.forEach((setting) => {\n scopeCache.set(setting.key, setting.value);\n });\n this.scopeLoaded.set(scope, true);\n }\n\n async ensureLoaded(): Promise<void> {\n if (this.isFullyLoaded()) {\n return;\n }\n await this.load();\n }\n\n /**\n * Ensures a single scope is loaded. Prefer this over {@link ensureLoaded} when only one\n * scope is needed (e.g. platform settings page) so a tenant/user sync failure cannot block UI.\n */\n async ensureScopeLoaded(scope: AXPPlatformScope): Promise<void> {\n if (this.isScopeReady(scope)) {\n return;\n }\n if (scope === AXPPlatformScope.Platform) {\n await this.ensurePlatformSettingsLoaded();\n return;\n }\n await this.ensureLoaded();\n }\n\n async load(reason = 'explicit-load'): Promise<AXPSettingValue[]> {\n if (this.loadInFlight) {\n return this.loadInFlight;\n }\n\n traceSettingsServiceLoadStarted(reason);\n\n this.loadInFlight = this.doLoad(reason).finally(() => {\n this.loadInFlight = null;\n });\n return this.loadInFlight;\n }\n\n private async awaitSessionReady(): Promise<void> {\n // Never block splash forever if session restore/signin leaves isLoading stuck.\n await Promise.race([\n firstValueFrom(\n this.sessionService.isLoading$.pipe(\n filter((loading) => !loading),\n take(1),\n ),\n ),\n new Promise<void>((resolve) => setTimeout(resolve, 15_000)),\n ]);\n }\n\n private async doLoad(reason: string): Promise<AXPSettingValue[]> {\n const startedAt = Date.now();\n try {\n const forceRemote = this.shouldForceRemote(reason);\n const platformLoadPromise = this.isScopeReady(AXPPlatformScope.Platform)\n ? Promise.resolve(this.readCachedScopeSettings(AXPPlatformScope.Platform))\n : this.loadScope(AXPPlatformScope.Platform, reason, forceRemote);\n\n await this.awaitSessionReady();\n const platformResult = await platformLoadPromise;\n\n const settingsList: AXPSettingValue[] = [...platformResult.settings];\n const keysByScope: Record<string, number> = {\n [AXPPlatformScope.Platform]: platformResult.keyCount,\n };\n\n for (const provider of this.providers) {\n if (provider.scope === AXPPlatformScope.Platform) {\n continue;\n }\n if (!this.shouldLoadProvider(provider.scope)) {\n this.scopeLoaded.set(provider.scope, false);\n this.scopedSettingsCache.get(provider.scope)?.clear();\n continue;\n }\n const scopeCache = this.scopedSettingsCache.get(provider.scope) ?? new Map();\n if (forceRemote && provider.reload) {\n await provider.reload();\n }\n const providerSettings = await provider.load();\n providerSettings.forEach((setting) => {\n scopeCache.set(setting.key, setting.value);\n });\n this.scopedSettingsCache.set(provider.scope, scopeCache);\n this.scopeLoaded.set(provider.scope, true);\n settingsList.push(...providerSettings);\n keysByScope[provider.scope] = providerSettings.length;\n }\n await this.seedMissingDefaults();\n this.onLoaded.next();\n await this.applyDebugModeFromSettings();\n traceSettingsServiceLoadComplete({\n totalKeys: settingsList.length,\n keysByScope,\n durationMs: Date.now() - startedAt,\n });\n return settingsList;\n } catch (error) {\n traceSettingsServiceLoadFailed(error);\n throw error;\n }\n }\n\n private shouldForceRemote(reason: string): boolean {\n return (\n reason === 'full-reload' ||\n reason === 'session-authenticated' ||\n reason === 'session-authorized' ||\n reason === 'session-logout' ||\n reason === 'app-startup-platform' ||\n reason === 'settings-page-open'\n );\n }\n\n private shouldForceProviderReload(reason: string): boolean {\n return this.shouldForceRemote(reason);\n }\n\n /** Platform admin/settings UI and startup must not trust a partial IndexedDB snapshot. */\n private shouldRequireServerReload(scope: AXPPlatformScope, reason: string): boolean {\n return (\n scope === AXPPlatformScope.Platform &&\n (reason === 'app-startup-platform' || reason === 'settings-page-open')\n );\n }\n\n private cancelInFlightLoads(): void {\n this.loadInFlight = null;\n this.platformScopeLoadInFlight = null;\n this.scopeReloadInFlight.clear();\n for (const provider of this.providers) {\n provider.cancelInFlightSync?.();\n }\n this.bulkSyncService.cancelInFlightFetches();\n }\n\n private async restorePlatformSettingsAfterLogout(): Promise<void> {\n const platformCache = this.scopedSettingsCache.get(AXPPlatformScope.Platform);\n const hasWarmPlatformCache =\n this.scopeLoaded.get(AXPPlatformScope.Platform) === true && (platformCache?.size ?? 0) > 0;\n const reason = hasWarmPlatformCache ? 'session-logout-cache' : 'session-logout';\n await this.reload(AXPPlatformScope.Platform, reason);\n }\n\n /** Loads tenant settings after sign-in / tenant selection (pre-app-chooser). */\n private async reloadAuthenticatedScopes(reason: string): Promise<void> {\n if (this.loadInFlight) {\n await this.loadInFlight;\n }\n // Platform is bootstrapped by the app-startup `platform-settings` task (requireServer).\n // Reloading P here races that path and can mark it ready from IndexedDB alone.\n if (this.shouldLoadProvider(AXPPlatformScope.Tenant)) {\n await this.reload(AXPPlatformScope.Tenant, reason);\n }\n }\n\n private async loadScope(\n scope: AXPPlatformScope,\n reason: string,\n forceRemote: boolean,\n ): Promise<{ settings: AXPSettingValue[]; keyCount: number }> {\n if (scope === AXPPlatformScope.Platform && this.platformScopeLoadInFlight) {\n return this.platformScopeLoadInFlight;\n }\n\n const loadPromise = this.doLoadScope(scope, reason, forceRemote);\n if (scope === AXPPlatformScope.Platform) {\n this.platformScopeLoadInFlight = loadPromise.finally(() => {\n this.platformScopeLoadInFlight = null;\n });\n return this.platformScopeLoadInFlight;\n }\n\n return loadPromise;\n }\n\n private async doLoadScope(\n scope: AXPPlatformScope,\n reason: string,\n forceRemote: boolean,\n ): Promise<{ settings: AXPSettingValue[]; keyCount: number }> {\n if (!this.shouldLoadProvider(scope)) {\n this.scopeLoaded.set(scope, false);\n this.scopedSettingsCache.get(scope)?.clear();\n return { settings: [], keyCount: 0 };\n }\n\n const provider = this.providers.find((p) => p.scope === scope);\n if (!provider) {\n return { settings: [], keyCount: 0 };\n }\n\n if (forceRemote && provider.reload) {\n await provider.reload(this.shouldRequireServerReload(scope, reason) ? { requireServer: true } : undefined);\n } else if (forceRemote) {\n this.scopeLoaded.set(scope, false);\n }\n\n const providerSettings = await provider.load();\n if (forceRemote) {\n this.replaceScopeCache(scope, providerSettings);\n } else {\n const scopeCache = this.scopedSettingsCache.get(scope) ?? new Map();\n providerSettings.forEach((setting) => {\n scopeCache.set(setting.key, setting.value);\n });\n this.scopedSettingsCache.set(scope, scopeCache);\n this.scopeLoaded.set(scope, true);\n }\n return { settings: providerSettings, keyCount: providerSettings.length };\n }\n\n /**\n * Soft-loads platform settings from the one-way IndexedDB cache (no requireServer).\n * Used when startup Fetch failed and the user may continue offline.\n */\n async adoptCachedPlatformSettings(): Promise<boolean> {\n const provider = this.providers.find((p) => p.scope === AXPPlatformScope.Platform);\n if (!provider) {\n return false;\n }\n\n if (provider.reload) {\n await provider.reload();\n }\n const providerSettings = await provider.load();\n const scopeCache = this.scopedSettingsCache.get(AXPPlatformScope.Platform) ?? new Map();\n scopeCache.clear();\n providerSettings.forEach((setting) => {\n scopeCache.set(setting.key, setting.value);\n });\n this.scopedSettingsCache.set(AXPPlatformScope.Platform, scopeCache);\n this.scopeLoaded.set(AXPPlatformScope.Platform, true);\n this.onLoaded.next();\n await this.applyDebugModeFromSettings();\n return scopeCache.size > 0;\n }\n\n private readCachedScopeSettings(scope: AXPPlatformScope): { settings: AXPSettingValue[]; keyCount: number } {\n const scopeCache = this.scopedSettingsCache.get(scope) ?? new Map();\n const settings = Array.from(scopeCache.entries()).map(([key, value]) => ({ key, value }));\n return { settings, keyCount: settings.length };\n }\n\n /** Platform always; tenant when authenticated; user only when fully authorized. */\n private shouldLoadProvider(scope: AXPPlatformScope): boolean {\n if (scope === AXPPlatformScope.Platform) {\n return true;\n }\n if (!this.sessionService.isAuthenticated || !this.sessionService.hasSessionCredentials()) {\n return false;\n }\n if (scope === AXPPlatformScope.Tenant) {\n return !!this.sessionService.tenant?.id;\n }\n if (scope === AXPPlatformScope.User) {\n return (\n this.sessionService.isReadyForAppScopedApi &&\n !!this.sessionService.user?.id &&\n !!this.sessionService.tenant?.id\n );\n }\n return false;\n }\n\n private requiredScopes(): AXPPlatformScope[] {\n return STATIC_SCOPES.filter((scope) => this.shouldLoadProvider(scope));\n }\n\n private isScopeReady(scope: AXPPlatformScope): boolean {\n if (!this.shouldLoadProvider(scope)) {\n return true;\n }\n return this.scopeLoaded.get(scope) === true;\n }\n\n private isFullyLoaded(): boolean {\n return this.requiredScopes().every((scope) => this.isScopeReady(scope));\n }\n\n private clearScopedCache(scope: AXPPlatformScope): void {\n this.scopedSettingsCache.get(scope)?.clear();\n this.scopeLoaded.set(scope, false);\n }\n\n /**\n * Returns the effective setting value. Primitive coercion (string, boolean, number, date) is inferred from the\n * definition default and/or the stored shape (including `{ value: ... }`). Type argument `T` is compile-time only;\n * it is not read at runtime—use it to document the expected result (e.g. `get<boolean>(key)`).\n */\n async get<T = any>(key: string): Promise<T> {\n const { effective, defaultSample } = await this.resolveEffectiveAndDefault(key);\n const kind = inferSettingCoercionKind(defaultSample, effective);\n if (kind !== null) {\n return coerceAXPSettingRawValueByKind(effective, kind) as T;\n }\n if (effective === undefined) {\n return effective as T;\n }\n return cloneDeep(effective) as T;\n }\n\n /**\n * Synchronous read from the in-memory scope cache (User → Tenant → Platform).\n * Returns `undefined` when the key is not cached yet (e.g. before {@link load} completes).\n */\n peekCached(key: string): unknown | undefined {\n const scopeOrder = [AXPPlatformScope.User, AXPPlatformScope.Tenant, AXPPlatformScope.Platform];\n for (const scope of scopeOrder) {\n const scopeCache = this.scopedSettingsCache.get(scope);\n if (!scopeCache?.has(key)) {\n continue;\n }\n const value = scopeCache.get(key);\n if (value !== undefined && value !== null) {\n return value;\n }\n }\n return undefined;\n }\n\n /**\n * Platform-scope value from in-memory cache, then the IndexedDB platform snapshot.\n * Does not hit the server — use when bootstrap Fetch failed and callers must not adopt cache yet.\n */\n async peekPlatformCached(key: string): Promise<unknown | undefined> {\n const scopeCache = this.scopedSettingsCache.get(AXPPlatformScope.Platform);\n if (scopeCache?.has(key)) {\n const memoryValue = scopeCache.get(key);\n if (memoryValue !== undefined && memoryValue !== null) {\n return memoryValue;\n }\n }\n\n try {\n const snapshotId = buildScopedSettingsSnapshotId(AXPPlatformScope.Platform, '');\n const snapshot = await axpSettingsIndexedDb.scoped_snapshots.get(snapshotId);\n if (!snapshot?.values || !Object.prototype.hasOwnProperty.call(snapshot.values, key)) {\n return undefined;\n }\n const definitionService = this.injector.get(AXPSettingDefinitionProviderService);\n const cacheableByKey = await definitionService.settingCacheableByKey();\n const { memoryValues } = hydrateSettingsValuesFromIndexedDb(\n { [key]: snapshot.values[key] },\n { cacheableByKey },\n );\n return memoryValues[key];\n } catch {\n return undefined;\n }\n }\n\n /**\n * Inherited settings at tenant/user scope may match the definition default while still being an explicit\n * override of a different parent value (e.g. tenant enables lock while platform default is disabled).\n */\n private isInheritedPlaceholder(scope: AXPPlatformScope, value: unknown, key: string): boolean {\n if (scope === AXPPlatformScope.Platform) {\n return false;\n }\n\n const parentScope = scope === AXPPlatformScope.User ? AXPPlatformScope.Tenant : AXPPlatformScope.Platform;\n if (!this.shouldLoadProvider(parentScope)) {\n return false;\n }\n\n const parentCache = this.scopedSettingsCache.get(parentScope);\n if (!parentCache?.has(key)) {\n return false;\n }\n\n const parentValue = parentCache.get(key);\n if (parentValue === undefined || parentValue === null) {\n return false;\n }\n\n return value === parentValue;\n }\n\n private async resolveEffectiveAndDefault(key: string): Promise<{ effective: unknown; defaultSample: unknown }> {\n if (!this.isFullyLoaded()) {\n await this.ensureLoaded();\n }\n const definitionService = this.injector.get(AXPSettingDefinitionProviderService);\n const [defaults, inheritedByKey] = await Promise.all([\n this.injector.get(AXPSettingDefaultValuesAggregatorService).getDefaults(),\n definitionService.settingInheritedByKey(),\n ]);\n const defaultSample = get(defaults, key);\n const scopeOrder = [AXPPlatformScope.User, AXPPlatformScope.Tenant, AXPPlatformScope.Platform];\n for (const scope of scopeOrder) {\n if (!this.shouldLoadProvider(scope)) {\n continue;\n }\n const scopeCache = this.scopedSettingsCache.get(scope);\n if (scopeCache && scopeCache.has(key)) {\n const value = scopeCache.get(key);\n if (value !== undefined && value !== null) {\n if (inheritedByKey[key] && this.isInheritedPlaceholder(scope, value, key)) {\n continue;\n }\n return { effective: value, defaultSample };\n }\n }\n }\n return { effective: defaultSample, defaultSample };\n }\n\n async defaultValues(scope: AXPPlatformScope): Promise<Record<string, unknown>> {\n let scopeOrder = [AXPPlatformScope.Platform, AXPPlatformScope.Tenant, AXPPlatformScope.User].reverse();\n const scopeIndex = scopeOrder.indexOf(scope);\n\n if (scopeIndex === -1) {\n throw new Error(`Invalid scope: ${scope}`);\n }\n const parentScopes = scopeOrder.slice(scopeIndex + 1).reverse();\n const accumulatedDefaults: Record<string, unknown> = {};\n for (const currentScope of parentScopes) {\n if (!this.shouldLoadProvider(currentScope)) {\n continue;\n }\n const scopeCache = this.scopedSettingsCache.get(currentScope);\n\n if (scopeCache) {\n scopeCache.forEach((value, key) => {\n accumulatedDefaults[key] = value;\n });\n }\n }\n\n const globalDefaults = await this.injector.get(AXPSettingDefaultValuesAggregatorService).getDefaults();\n return { ...globalDefaults, ...accumulatedDefaults };\n }\n\n scope(scope: AXPPlatformScope): ScopedSettingService {\n const provider = this.providers.find((p) => p.scope === scope);\n if (!provider) {\n throw new Error(`No provider found for scope: ${scope}`);\n }\n return new ScopedSettingService(\n this,\n provider,\n this.scopedSettingsCache.get(scope)!,\n (s) => this.shouldLoadProvider(s),\n );\n }\n\n /**\n * Opens a dialog to quick-edit a settings definition section using canonical widgets.\n */\n async showSectionPopup(options: AXPSettingsSectionPopupOptions): Promise<boolean> {\n const definitionService = this.injector.get(AXPSettingDefinitionProviderService);\n const lookup = await definitionService.findSection(options.scope, options.section, options.group);\n if (!lookup) {\n return false;\n }\n\n const opener = this.injector.get(AXP_SETTINGS_DEFINITION_DIALOG_OPENER);\n const { openSettingsDefinitionDialog } = await import('./settings-dialog.helper');\n return openSettingsDefinitionDialog(this, opener, {\n scope: options.scope as AXPPlatformScope,\n sections: [lookup.section],\n title: options.title ?? lookup.section.title,\n description: options.description ?? lookup.section.description,\n size: options.size,\n });\n }\n\n /**\n * Opens a dialog to quick-edit one or more settings by key using their canonical widget definitions.\n */\n async showSettingsPopup(options: AXPSettingsKeysPopupOptions): Promise<boolean> {\n const definitionService = this.injector.get(AXPSettingDefinitionProviderService);\n const settings = await definitionService.collectSettingsByKeys(options.scope, options.keys);\n if (!settings.length) {\n return false;\n }\n\n const opener = this.injector.get(AXP_SETTINGS_DEFINITION_DIALOG_OPENER);\n const { openSettingsDefinitionDialog } = await import('./settings-dialog.helper');\n return openSettingsDefinitionDialog(this, opener, {\n scope: options.scope as AXPPlatformScope,\n sections: [\n {\n name: 'quick-edit',\n title: options.title ?? '@settings-management:module.menus.root.title',\n description: options.description,\n settings,\n },\n ],\n title: options.title ?? '@settings-management:module.menus.root.title',\n description: options.description,\n size: options.size,\n });\n }\n\n /** Applies remote values into the in-memory scope cache and notifies listeners. */\n syncScopeCache(scope: AXPPlatformScope, values: Record<string, unknown>): void {\n const scopeCache = this.scopedSettingsCache.get(scope);\n if (!scopeCache) {\n return;\n }\n const keys = Object.keys(values);\n if (keys.length === 0) {\n return;\n }\n keys.forEach((key) => {\n scopeCache.set(key, values[key]);\n });\n this.invokeChangeEvent({\n scope,\n keys,\n values,\n entries: keys.map((key) => ({ key, value: values[key] })),\n });\n }\n\n invokeChangeEvent(event: AXPSettingChangedEvent) {\n this.onChanged.next(event);\n this.applyDebugModeFromEvent(event);\n this.eventService.publish<AXPSettingChangedEvent>('AXPSettingChangedEvent', event);\n }\n\n private async applyDebugModeFromSettings(): Promise<void> {\n try {\n const debugMode = await this.get<boolean>(AXPCommonSettings.DebugMode);\n this.debugService.setDebugMode(!!debugMode);\n } catch {\n this.debugService.setDebugMode(false);\n }\n }\n\n private applyDebugModeFromEvent(event: AXPSettingChangedEvent): void {\n if (!event.keys.includes(AXPCommonSettings.DebugMode)) {\n return;\n }\n\n this.debugService.setDebugMode(!!event.values[AXPCommonSettings.DebugMode]);\n }\n\n private isCachedInScopeOrAncestors(key: string, scope: AXPPlatformScope): boolean {\n const scopesToCheck =\n scope === AXPPlatformScope.User\n ? [AXPPlatformScope.User, AXPPlatformScope.Tenant, AXPPlatformScope.Platform]\n : scope === AXPPlatformScope.Tenant\n ? [AXPPlatformScope.Tenant, AXPPlatformScope.Platform]\n : [AXPPlatformScope.Platform];\n\n for (const candidateScope of scopesToCheck) {\n if (!this.shouldLoadProvider(candidateScope)) {\n continue;\n }\n const scopeCache = this.scopedSettingsCache.get(candidateScope);\n if (!scopeCache?.has(key)) {\n continue;\n }\n const value = scopeCache.get(key);\n if (value !== undefined && value !== null) {\n return true;\n }\n }\n return false;\n }\n\n private async seedMissingDefaults(): Promise<void> {\n const definitionService = this.injector.get(AXPSettingDefinitionProviderService);\n const aggregator = this.injector.get(AXPSettingDefaultValuesAggregatorService);\n const [{ defaults, seedScopeByKey }, scopeByKey, inheritedByKey] = await Promise.all([\n aggregator.getMerged(),\n definitionService.settingScopeByKey(),\n definitionService.settingInheritedByKey(),\n ]);\n const toPersist: Partial<Record<AXPPlatformScope, Record<string, unknown>>> = {};\n\n for (const [key, value] of Object.entries(defaults)) {\n const scope = seedScopeByKey[key] ?? scopeByKey[key];\n if (\n !scope ||\n !this.shouldLoadProvider(scope) ||\n value === undefined ||\n value === null ||\n (typeof value === 'string' && value.trim() === '') ||\n this.isCachedInScopeOrAncestors(key, scope) ||\n (scope !== AXPPlatformScope.Platform && inheritedByKey[key])\n ) {\n continue;\n }\n toPersist[scope] ??= {};\n toPersist[scope]![key] = value;\n }\n\n for (const [scope, values] of Object.entries(toPersist) as [AXPPlatformScope, Record<string, unknown>][]) {\n // Platform settings are server-owned (one-way client cache). Never seed/Patch scope P from the client.\n if (scope === AXPPlatformScope.Platform || Object.keys(values).length === 0) {\n continue;\n }\n await this.scope(scope).set(values, { flush: true });\n }\n }\n}\n\nclass ScopedSettingService {\n constructor(\n private parent: AXPSettingsService,\n private provider: AXPSettingValueProvider,\n private scopeCache: Map<string, any>,\n private isScopeActive: (scope: AXPPlatformScope) => boolean,\n ) {}\n\n async get<T = any>(key: string): Promise<T> {\n await this.parent.ensureScopeLoaded(this.provider.scope);\n const effective = this.scopeCache.has(key) ? this.scopeCache.get(key) : undefined;\n const defaults = await this.parent.defaultValues(this.provider.scope);\n const defaultSample = get(defaults, key);\n const kind = inferSettingCoercionKind(defaultSample, effective);\n if (kind !== null) {\n return coerceAXPSettingRawValueByKind(effective, kind) as T;\n }\n if (effective === undefined) {\n return effective as T;\n }\n return cloneDeep(effective) as T;\n }\n\n async all(): Promise<any> {\n await this.parent.ensureScopeLoaded(this.provider.scope);\n return Object.fromEntries(Array.from(this.scopeCache.entries()).map(([key, value]) => [key, cloneDeep(value)]));\n }\n\n async defaultValues(): Promise<Record<string, unknown>> {\n return this.parent.defaultValues(this.provider.scope);\n }\n\n async set<T = any>(key: string, value: T, options?: AXPSettingSetOptions): Promise<void>;\n async set<T = any>(values: Record<string, T>, options?: AXPSettingSetOptions): Promise<void>;\n async set<T = any>(\n keyOrValues: string | Record<string, T>,\n valueOrOptions?: T | AXPSettingSetOptions,\n options?: AXPSettingSetOptions,\n ): Promise<void> {\n if (!this.isScopeActive(this.provider.scope)) {\n return;\n }\n if (typeof keyOrValues === 'string') {\n const value = valueOrOptions as T;\n await this.provider.set(keyOrValues, value, options);\n this.scopeCache.set(keyOrValues, value);\n this.parent.invokeChangeEvent({\n scope: this.provider.scope,\n keys: [keyOrValues],\n values: { [keyOrValues]: value },\n entries: [{ key: keyOrValues, value }],\n });\n } else {\n const setOptions = valueOrOptions as AXPSettingSetOptions | undefined;\n await this.provider.set(keyOrValues, setOptions);\n Object.entries(keyOrValues).forEach(([key, val]) => this.scopeCache.set(key, val));\n const entries = Object.entries(keyOrValues).map(([key, val]) => ({ key, value: val }));\n this.parent.invokeChangeEvent({\n scope: this.provider.scope,\n keys: Object.keys(keyOrValues),\n values: keyOrValues,\n entries,\n });\n }\n }\n\n async update<T = any>(key: string, updateFn: (currentValue: T) => T): Promise<void> {\n const currentValue = await this.get<T>(key);\n const newValue = updateFn(currentValue);\n await this.set(key, newValue);\n }\n}\n","import { inject, Injectable, signal } from '@angular/core';\n\nimport { AXPRegionalSetting } from '@acorex-platform/framework-shared/core';\nimport { AXPSettingsService } from './settings.service';\n\nconst DEFAULT_APPLY_DEFAULT_MULTILANGUAGE = true;\n\n/**\n * Synchronous access to default multi-language behavior for named entity fields and widget\n * property bindings. Mirrors {@link AXPLayoutOrderingConfigService}: avoids async in entity\n * modifiers and startup deadlocks.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPDefaultMultiLanguageConfigService {\n private readonly settingsService = inject(AXPSettingsService);\n\n private readonly _applyDefault = signal<boolean>(DEFAULT_APPLY_DEFAULT_MULTILANGUAGE);\n private syncScheduled = false;\n\n constructor() {\n this.settingsService.onLoaded.subscribe(() => this.syncFromSettings());\n this.settingsService.onChanged.subscribe(() => this.syncFromSettings());\n }\n\n getApplyDefaultMultiLanguage(): boolean {\n if (!this.syncScheduled) {\n this.syncScheduled = true;\n this.settingsService\n .get<boolean>(AXPRegionalSetting.MultiLanguageSupport)\n .then((value) => this._applyDefault.set(value ?? DEFAULT_APPLY_DEFAULT_MULTILANGUAGE))\n .catch(() => this._applyDefault.set(DEFAULT_APPLY_DEFAULT_MULTILANGUAGE));\n }\n return this._applyDefault();\n }\n\n private async syncFromSettings(): Promise<void> {\n try {\n const value = await this.settingsService.get<boolean>(AXPRegionalSetting.MultiLanguageSupport);\n this._applyDefault.set(value ?? DEFAULT_APPLY_DEFAULT_MULTILANGUAGE);\n } catch {\n this._applyDefault.set(DEFAULT_APPLY_DEFAULT_MULTILANGUAGE);\n }\n }\n}\n","/**\n * Shared multi-language defaults for entity properties and widget property bindings.\n *\n * **Circular dependencies:** use only `import type` for `AXPWidgetProperty` and\n * `AXPEntityProperty` so this module has no runtime imports from widget-core or application\n * types — `@acorex-platform/framework-client/layout/widget-core` does not import `@acorex-platform/framework-client/common`.\n */\nimport type { AXPWidgetProperty } from '@acorex-platform/framework-shared/widget-core';\nimport type { AXPWidgetNode } from '@acorex-platform/framework-shared/core';\n\nimport type { AXPEntityProperty } from '@acorex-platform/framework-shared/entity';\n\n//#region ---- Constants ----\n\n/**\n * Widget types that support the multiLanguage option (text / rich text editors).\n */\nexport const MULTILANGUAGE_CAPABLE_WIDGET_TYPES = new Set<string>([\n 'text-editor',\n 'large-text-editor',\n 'rich-text-editor',\n 'template-content-editor',\n]);\n\n/**\n * Common property names / binding path segments that are usually translatable when the feature is\n * enabled in settings. Explicit `multiLanguage` on the property still wins.\n */\nexport const DEFAULT_MULTILANGUAGE_FIELD_NAMES = new Set<string>([\n 'title',\n 'description',\n 'note',\n 'content',\n /** e.g. `post.summaryContent` — last path segment */\n 'summaryContent',\n 'question',\n 'summary',\n 'body',\n 'caption',\n 'remarks',\n 'subtitle',\n 'label',\n 'placeholder',\n 'message',\n 'subject',\n]);\n\n//#endregion\n\n//#region ---- Helpers ----\n\nfunction interfacePathLastSegment(path: string | undefined): string | null {\n if (path == null || typeof path !== 'string' || !path.length) {\n return null;\n }\n const seg = path.includes('.') ? path.split('.').pop() : path;\n return seg && seg.length ? seg : null;\n}\n\nexport function shouldApplyDefaultMultiLanguageToEntityProperty(prop: AXPEntityProperty): boolean {\n if (prop.schema.dataType !== 'string') {\n return false;\n }\n if (!DEFAULT_MULTILANGUAGE_FIELD_NAMES.has(prop.name)) {\n return false;\n }\n const widgetType = prop.schema.interface?.type;\n if (typeof widgetType !== 'string' || !MULTILANGUAGE_CAPABLE_WIDGET_TYPES.has(widgetType)) {\n return false;\n }\n const opts = prop.schema.interface?.options as Record<string, unknown> | undefined;\n if (opts && 'multiLanguage' in opts) {\n return false;\n }\n return true;\n}\n\nexport function shouldApplyDefaultMultiLanguageToWidgetProperty(prop: AXPWidgetProperty): boolean {\n if (prop.schema.dataType !== 'string') {\n return false;\n }\n const key = interfacePathLastSegment(prop.schema.interface.path);\n if (!key || !DEFAULT_MULTILANGUAGE_FIELD_NAMES.has(key)) {\n return false;\n }\n const widgetType = prop.schema.interface.type;\n if (typeof widgetType !== 'string' || !MULTILANGUAGE_CAPABLE_WIDGET_TYPES.has(widgetType)) {\n return false;\n }\n const opts = prop.schema.interface.options as Record<string, unknown> | undefined;\n if (opts && 'multiLanguage' in opts) {\n return false;\n }\n return true;\n}\n\n/**\n * Leaf widget nodes in entity `schema.interface` trees (e.g. GridLayout → RichText under `pre` /\n * `post`) — same path/type rules as {@link shouldApplyDefaultMultiLanguageToWidgetProperty}, without\n * `schema.dataType` (nodes do not carry entity schema).\n */\nexport function shouldApplyDefaultMultiLanguageToWidgetNode(node: AXPWidgetNode): boolean {\n const widgetType = node.type;\n if (typeof widgetType !== 'string' || !MULTILANGUAGE_CAPABLE_WIDGET_TYPES.has(widgetType)) {\n return false;\n }\n const key = interfacePathLastSegment(node.path);\n if (!key || !DEFAULT_MULTILANGUAGE_FIELD_NAMES.has(key)) {\n return false;\n }\n const opts = node.options as Record<string, unknown> | undefined;\n if (opts && 'multiLanguage' in opts) {\n return false;\n }\n return true;\n}\n\n/**\n * When {@link AXPDefaultMultiLanguageConfigService#getApplyDefaultMultiLanguage} is true, sets\n * `options.multiLanguage` on eligible editor leaves inside an entity property's widget tree\n * (including nested layouts). Used by entity middleware so object fields (e.g. `pre`, `post`) are\n * covered, not only top-level string properties.\n */\nexport function withDefaultMultiLanguageOnWidgetNodeTree(\n root: AXPWidgetNode | undefined | null,\n applyDefault: boolean,\n): AXPWidgetNode | undefined | null {\n if (root == null || !applyDefault) {\n return root ?? undefined;\n }\n return visitWidgetNodeForDefaultMultiLanguage(root);\n}\n\nfunction visitWidgetNodeForDefaultMultiLanguage(node: AXPWidgetNode): AXPWidgetNode {\n let next = node;\n if (node.children?.length) {\n const newChildren = node.children.map((child) => visitWidgetNodeForDefaultMultiLanguage(child));\n if (newChildren.some((c, i) => c !== node.children![i])) {\n next = { ...node, children: newChildren };\n }\n }\n if (shouldApplyDefaultMultiLanguageToWidgetNode(next)) {\n return {\n ...next,\n options: {\n ...((next.options ?? {}) as Record<string, unknown>),\n multiLanguage: true,\n },\n };\n }\n return next;\n}\n\n/**\n * When {@link AXPDefaultMultiLanguageConfigService#getApplyDefaultMultiLanguage} is true, sets\n * `schema.interface.options.multiLanguage` for eligible string widget properties (same rules as\n * entity middleware), unless the property already specifies `multiLanguage`.\n */\nexport function withDefaultMultiLanguageOnWidgetProperty(\n prop: AXPWidgetProperty,\n applyDefault: boolean,\n): AXPWidgetProperty {\n if (!applyDefault || !shouldApplyDefaultMultiLanguageToWidgetProperty(prop)) {\n return prop;\n }\n const iface = prop.schema.interface;\n const existingOpts = (iface.options ?? {}) as Record<string, unknown>;\n return {\n ...prop,\n schema: {\n ...prop.schema,\n interface: {\n ...iface,\n options: {\n ...existingOpts,\n multiLanguage: true,\n },\n },\n },\n };\n}\n\n//#endregion\n","import { Injectable, signal } from '@angular/core';\n\n//#region ----- Platform settings load state -----\n\n/**\n * Tracks fatal failure / offline-continue of the public platform (P) settings bootstrap.\n * Dialogs must not run during APP_INITIALIZER — use {@link setPendingOfflineContinue} instead\n * and resolve the prompt once the root view can host overlays.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPPlatformSettingsLoadState {\n private readonly errorMessage = signal<string | null>(null);\n private readonly offlineMode = signal(false);\n private readonly pendingOfflineContinue = signal(false);\n private pendingBootstrapError: unknown = null;\n\n setFailure(error: unknown): void {\n const message =\n error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : 'Platform settings could not be loaded.';\n this.errorMessage.set(message);\n this.offlineMode.set(false);\n this.pendingOfflineContinue.set(false);\n this.pendingBootstrapError = null;\n }\n\n /**\n * Bootstrap Fetch failed, but cached Allow Working Offline is enabled.\n * Confirm dialog must run after the app is stable (overlay host ready).\n */\n setPendingOfflineContinue(error: unknown): void {\n this.pendingBootstrapError = error;\n this.pendingOfflineContinue.set(true);\n this.errorMessage.set(null);\n this.offlineMode.set(false);\n }\n\n clear(): void {\n this.errorMessage.set(null);\n this.pendingOfflineContinue.set(false);\n this.pendingBootstrapError = null;\n }\n\n hasFailure(): boolean {\n return this.errorMessage() != null;\n }\n\n hasPendingOfflineContinue(): boolean {\n return this.pendingOfflineContinue();\n }\n\n consumePendingBootstrapError(): unknown {\n const error = this.pendingBootstrapError;\n this.pendingBootstrapError = null;\n return error;\n }\n\n message(): string | null {\n return this.errorMessage();\n }\n\n setOfflineMode(enabled: boolean): void {\n this.offlineMode.set(enabled);\n if (enabled) {\n this.errorMessage.set(null);\n this.pendingOfflineContinue.set(false);\n this.pendingBootstrapError = null;\n }\n }\n\n isOfflineMode(): boolean {\n return this.offlineMode();\n }\n}\n\n//#endregion\n","import { Injectable, signal } from '@angular/core';\n\n//#region ----- Network connectivity -----\n\n/**\n * Thin wrapper around the browser online/offline signals.\n * There is no richer connectivity probe in the platform today — use {@link online}\n * for device link state; API reachability is detected via failed HTTP/runtime calls.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPNetworkConnectivityService {\n private readonly onlineSignal = signal(this.readNavigatorOnline());\n\n constructor() {\n if (typeof window === 'undefined') {\n return;\n }\n window.addEventListener('online', () => this.onlineSignal.set(true));\n window.addEventListener('offline', () => this.onlineSignal.set(false));\n }\n\n /** Reactive device connectivity (browser `navigator.onLine`). */\n readonly isOnline = this.onlineSignal.asReadonly();\n\n /** Synchronous device connectivity check. */\n get online(): boolean {\n return this.readNavigatorOnline();\n }\n\n private readNavigatorOnline(): boolean {\n if (typeof navigator === 'undefined') {\n return true;\n }\n return navigator.onLine;\n }\n}\n\n//#endregion\n","import { AXDialogService } from '@acorex/components/dialog';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { ApplicationRef, inject, Injectable } from '@angular/core';\nimport { filter, firstValueFrom, take, timeout, timer } from 'rxjs';\n\nimport { AXPCommonSettings } from '../configs/common-settings.key';\nimport { AXPNetworkConnectivityService } from '../network/network-connectivity.service';\nimport { AXPPlatformSettingsLoadState } from './platform-settings-load-state.service';\nimport { AXPSettingsService } from './settings.service';\n\n//#region ----- Platform settings offline bootstrap -----\n\n// TODO: work more on offline mode (resume startup tasks after continue, sync when back online, UX polish).\n\n/**\n * After platform settings Fetch fails (or the device is offline), decides whether to\n * offer continuing from the IndexedDB cache based on {@link AXPCommonSettings.AllowWorkingOffline}.\n *\n * Important: never open dialogs during APP_INITIALIZER — root ViewContainerRef is null\n * (`createComponent` on null). Use {@link canOfferOfflineContinue} at startup, then\n * {@link confirmAndContinueOffline} once the root component exists.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPPlatformSettingsOfflineBootstrapService {\n //#region ----- Services & Dependencies -----\n\n private readonly settingsService = inject(AXPSettingsService);\n private readonly loadState = inject(AXPPlatformSettingsLoadState);\n private readonly connectivity = inject(AXPNetworkConnectivityService);\n private readonly dialogService = inject(AXDialogService);\n private readonly translationService = inject(AXTranslationService);\n private readonly appRef = inject(ApplicationRef);\n\n //#endregion\n\n //#region ----- Public API -----\n\n /** Device reports no network (browser `navigator.onLine`). */\n isDeviceOffline(): boolean {\n return !this.connectivity.online;\n }\n\n /** Cached-settings check — safe to call during APP_INITIALIZER (no dialogs). */\n async canOfferOfflineContinue(): Promise<boolean> {\n return this.hasCachedAllowWorkingOffline();\n }\n\n /**\n * Shows the offline confirm dialog as soon as the root view can host overlays,\n * then adopts the IndexedDB cache on accept.\n * @returns true when the user accepted offline continue and cache was adopted.\n */\n async confirmAndContinueOffline(): Promise<boolean> {\n if (!(await this.hasCachedAllowWorkingOffline())) {\n return false;\n }\n\n await this.whenRootViewReady();\n\n const title = await this.translationService.translateAsync('@general:messages.offline-continue.title');\n const message = await this.translationService.translateAsync('@general:messages.offline-continue.message');\n const dialogResult = await this.dialogService.confirm(\n title,\n message,\n 'warning',\n 'horizontal',\n false,\n 'cancel',\n );\n\n if (dialogResult.result !== true) {\n return false;\n }\n\n const adopted = await this.settingsService.adoptCachedPlatformSettings();\n if (!adopted) {\n return false;\n }\n\n this.loadState.setOfflineMode(true);\n return true;\n }\n\n //#endregion\n\n //#region ----- Private -----\n\n /**\n * Overlay dialogs need the bootstrapped root ViewContainerRef — not full zone stability.\n * Waiting on {@link ApplicationRef.isStable} delays the confirm while timers/HTTP keep the zone busy.\n */\n private async whenRootViewReady(): Promise<void> {\n if (this.appRef.components.length > 0) {\n return;\n }\n try {\n await firstValueFrom(\n timer(0, 16).pipe(\n filter(() => this.appRef.components.length > 0),\n take(1),\n timeout({ first: 5_000 }),\n ),\n );\n } catch {\n // Proceed even if the root never attached — confirm will fail loudly if overlay is still unavailable.\n }\n }\n\n private async hasCachedAllowWorkingOffline(): Promise<boolean> {\n return (await this.settingsService.peekPlatformCached(AXPCommonSettings.AllowWorkingOffline)) === true;\n }\n\n //#endregion\n}\n\n//#endregion\n","import { inject } from '@angular/core';\nimport { CanActivateFn, Router } from '@angular/router';\n\nimport { AXPPlatformSettingsLoadState } from './platform-settings-load-state.service';\n\n//#region ----- Platform settings available guard -----\n\n/**\n * Blocks authenticated app routes when platform settings bootstrap failed.\n * Sends the user to `/auth/unavailable` instead of the normal destination.\n */\nexport const axpPlatformSettingsAvailableGuard: CanActivateFn = () => {\n const loadState = inject(AXPPlatformSettingsLoadState);\n const router = inject(Router);\n\n if (!loadState.hasFailure()) {\n return true;\n }\n\n return router.createUrlTree(['/auth/unavailable']);\n};\n\n//#endregion\n","import { AXPExpressionEvaluatorScopeProvider, AXPExpressionEvaluatorScopeProviderContext } from '@acorex-platform/framework-shared/core';\nimport { inject } from '@angular/core';\n\nimport { AXPSettingsService } from './settings.service';\n\n//#region ---- Settings expression scope ----\n\n/**\n * Exposes platform settings in expression strings, e.g.\n * `{{ settings.get('Common:Setting:Entity.ShowPageBadge') }}`.\n */\nexport class AXPSettingsEvaluatorScopeProvider implements AXPExpressionEvaluatorScopeProvider {\n private readonly settingsService = inject(AXPSettingsService);\n\n async provide(context: AXPExpressionEvaluatorScopeProviderContext): Promise<void> {\n context.addScope('settings', {\n get: async (key: string) => {\n return await this.settingsService.get(key);\n },\n });\n }\n}\n\n//#endregion\n","import { AXPPlatformScope } from '@acorex-platform/framework-shared/core';\n\n//#region ---- Local snapshot (IndexedDB) ----\n\nexport type AXPSettingsSyncStatus = 'idle' | 'syncing' | 'pending_retry';\n\nexport interface AXPScopedSettingsSnapshot {\n id: string;\n scope: AXPPlatformScope;\n values: Record<string, unknown>;\n serverUpdatedAt: string | null;\n lastRevalidatedAt: string | null;\n dirty: Record<string, unknown>;\n syncStatus: AXPSettingsSyncStatus;\n nextRetryAt: string | null;\n retryAttempt: number;\n}\n\n//#endregion\n\n//#region ---- Scoped sync inputs ----\n\nexport interface AXPSettingsScopedFetchInput {\n scope: AXPPlatformScope;\n since: string | null;\n}\n\nexport interface AXPSettingsScopedPatchInput {\n scope: AXPPlatformScope;\n values: Record<string, unknown>;\n}\n\n//#endregion\n\n//#region ---- Bulk sync payloads ----\n\nexport interface AXPSettingsBulkFetchResult {\n changed: boolean;\n updatedAt: string | null;\n values: Record<string, unknown>;\n}\n\nexport interface AXPSettingsBulkPatchResult {\n updatedAt: string;\n}\n\n//#endregion\n","import { AXCalendarService } from '@acorex/core/date-time';\nimport { Injectable } from '@angular/core';\n\n/**\n * Platform-provided {@link AXCalendarService} that applies locale profile week layout\n * (first day of week, weekends) through the core calendar service lifecycle.\n *\n * Temporary bridge until @acorex/components reads week layout from AXLocaleService.\n */\n@Injectable()\nexport class AXPRegionalCalendarService extends AXCalendarService {}\n","import { AXDialogService } from '@acorex/components/dialog';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport { inject, Injectable } from '@angular/core';\nimport { AXPCommonSettings } from '../configs/common-settings.key';\nimport { AXPSettingsService } from './settings.service';\n\n//#region ---- Types ----\n\nexport interface AXPUnsavedChangesConfirmOptions {\n /** When false, skips confirm even if the global setting is enabled (e.g. dialog `confirmCloseWhenDirty`). */\n enabled?: boolean;\n title?: AXPMultiLanguageString;\n message?: AXPMultiLanguageString;\n /**\n * When true (default), confirming sets leave approval for the next route deactivation.\n * Set false for in-place actions such as discarding edits without navigating away.\n */\n approveLeaveOnConfirm?: boolean;\n}\n\nexport interface AXPUnsavedChangesCanDeactivate {\n canDeactivate(): boolean | Promise<boolean>;\n}\n\n//#endregion\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPUnsavedChangesConfirmService {\n //#region ---- Services & Dependencies ----\n\n private readonly settingsService = inject(AXPSettingsService);\n private readonly dialogService = inject(AXDialogService);\n private readonly translateService = inject(AXTranslationService);\n\n //#endregion\n\n //#region ---- State ----\n\n /** Ensures concurrent leave paths share a single unsaved-changes confirm dialog. */\n private confirmPromise?: Promise<boolean>;\n\n /** Set after the user confirms leaving; cleared on {@link NavigationEnd} by popstate handler. */\n private leaveConfirmed = false;\n\n //#endregion\n\n //#region ---- Public API ----\n\n /**\n * Whether the global \"confirm unsaved changes\" setting is enabled.\n */\n async isGloballyEnabled(): Promise<boolean> {\n const value = await this.settingsService.get<boolean>(AXPCommonSettings.ConfirmUnsavedChanges);\n return value !== false;\n }\n\n /**\n * Marks the next route deactivation as already approved (avoids a second prompt after in-app navigation).\n */\n markLeaveConfirmed(): void {\n this.leaveConfirmed = true;\n }\n\n /** True while an unsaved-changes confirm dialog is open or being resolved. */\n isConfirmPending(): boolean {\n return this.confirmPromise != null;\n }\n\n /** Whether the user already approved leaving during the current navigation. */\n hasLeaveConfirmed(): boolean {\n return this.leaveConfirmed;\n }\n\n /** Clears leave approval after navigation settles. */\n clearLeaveConfirmed(): void {\n this.leaveConfirmed = false;\n }\n\n consumeLeaveConfirmed(): boolean {\n if (!this.leaveConfirmed) {\n return false;\n }\n this.leaveConfirmed = false;\n return true;\n }\n\n /**\n * Prompts when `isDirty` and the global setting (and optional per-instance `enabled`) allow it.\n * Returns true when navigation/dismiss may proceed.\n */\n async confirmIfDirty(isDirty: boolean, options?: AXPUnsavedChangesConfirmOptions): Promise<boolean> {\n if (this.confirmPromise) {\n return this.confirmPromise;\n }\n\n if (options?.enabled === false || !isDirty) {\n return true;\n }\n\n // Reserve before any await so concurrent close/navigation paths share one dialog.\n this.confirmPromise = this.resolveConfirmIfDirty(options);\n try {\n return await this.confirmPromise;\n } finally {\n this.confirmPromise = undefined;\n }\n }\n\n //#endregion\n\n //#region ---- Private Methods ----\n\n private async resolveConfirmIfDirty(options?: AXPUnsavedChangesConfirmOptions): Promise<boolean> {\n if (!(await this.isGloballyEnabled())) {\n return true;\n }\n\n const confirmed = await this.prompt(options);\n if (confirmed && options?.approveLeaveOnConfirm !== false) {\n this.leaveConfirmed = true;\n }\n return confirmed;\n }\n\n private async prompt(options?: AXPUnsavedChangesConfirmOptions): Promise<boolean> {\n const [title, message, yesText, noText] = await Promise.all([\n this.translateService.translateAsync(options?.title ?? '@general:messages.unsaved-changes.title'),\n this.translateService.translateAsync(options?.message ?? '@general:messages.unsaved-changes.message'),\n this.translateService.translateAsync('@general:terms.common.yes-no.yes'),\n this.translateService.translateAsync('@general:terms.common.yes-no.no'),\n ]);\n\n return new Promise((resolve) => {\n const popup = this.dialogService.open({\n title,\n content: message,\n type: 'warning',\n orientation: 'horizontal',\n draggable: false,\n buttons: [\n {\n name: 'yes',\n text: yesText,\n color: 'warning',\n autofocus: false,\n onClick: () => {\n popup.close();\n resolve(true);\n },\n },\n {\n name: 'no',\n text: noText,\n color: 'default',\n autofocus: true,\n onClick: () => {\n popup.close();\n resolve(false);\n },\n hotkey: {\n Escape: () => {\n popup.close();\n resolve(false);\n },\n },\n },\n ],\n });\n });\n }\n\n //#endregion\n}\n","import { Location } from '@angular/common';\nimport { DestroyRef, inject, Injectable } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, NavigationStart, Router } from '@angular/router';\nimport { filter } from 'rxjs/operators';\nimport { AXPUnsavedChangesConfirmService } from './unsaved-changes-confirm.service';\n\n//#region ---- Types ----\n\nexport interface AXPUnsavedChangesPopstateSource {\n id: string;\n isDirty: () => boolean;\n}\n\n//#endregion\n\n/**\n * Intercepts browser back/forward (`popstate`) when a registered page is dirty.\n * Captures dirty state synchronously on {@link NavigationStart}, restores the current URL\n * before route activation, prompts once, then re-triggers `history.back()` only if confirmed.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPUnsavedChangesPopstateService {\n //#region ---- Services & Dependencies ----\n\n private readonly router = inject(Router);\n private readonly location = inject(Location);\n private readonly confirm = inject(AXPUnsavedChangesConfirmService);\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ---- State ----\n\n private sources: AXPUnsavedChangesPopstateSource[] = [];\n private committedUrl = '';\n private handling = false;\n\n //#endregion\n\n //#region ---- Lifecycle ----\n\n constructor() {\n this.committedUrl = this.router.url;\n\n this.router.events.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event) => {\n if (event instanceof NavigationEnd) {\n this.committedUrl = event.urlAfterRedirects;\n this.confirm.clearLeaveConfirmed();\n return;\n }\n\n if (event instanceof NavigationStart && event.navigationTrigger === 'popstate') {\n void this.handlePopstateNavigation(event);\n }\n });\n }\n\n //#endregion\n\n //#region ---- Registry ----\n\n registerSource(source: AXPUnsavedChangesPopstateSource): void {\n this.sources = this.sources.filter((entry) => entry.id !== source.id);\n this.sources.push(source);\n }\n\n unregisterSource(id: string): void {\n this.sources = this.sources.filter((entry) => entry.id !== id);\n }\n\n //#endregion\n\n //#region ---- Popstate Handler ----\n\n /** True while a popstate back/forward is being intercepted or confirmed. */\n isHandlingPopstate(): boolean {\n return this.handling;\n }\n\n private async handlePopstateNavigation(start: NavigationStart): Promise<void> {\n if (this.handling) {\n return;\n }\n\n if (this.confirm.hasLeaveConfirmed()) {\n return;\n }\n\n const dirty = this.isDirty();\n if (!dirty) {\n return;\n }\n\n const stayUrl = this.committedUrl;\n const targetUrl = start.url;\n if (!stayUrl || stayUrl === targetUrl) {\n return;\n }\n\n this.handling = true;\n try {\n this.location.go(stayUrl);\n\n const allowed = await this.confirm.confirmIfDirty(true);\n if (!allowed) {\n await this.router.navigateByUrl(stayUrl, { replaceUrl: true });\n return;\n }\n\n window.history.back();\n } finally {\n this.handling = false;\n }\n }\n\n //#endregion\n\n //#region ---- Utility Methods ----\n\n private isDirty(): boolean {\n return this.sources.some((source) => source.isDirty());\n }\n\n //#endregion\n}\n","import { Injectable } from '@angular/core';\nimport type { DetachedRouteHandle } from '@angular/router';\n\n//#region ---- Types ----\n\ninterface DestroyableRouteHandle {\n componentRef?: { destroy: () => void; instance?: unknown };\n}\n\n//#endregion\n\n/**\n * Holds detached Angular route component instances keyed by tab key so tabular navigation can\n * preserve a page's full state (data-table selection, scroll, unsaved form values, etc.) while it\n * is in the background, then reattach it without re-rendering.\n *\n * The registry has no `Router` dependency on purpose: it is consumed by the {@link RouteReuseStrategy}\n * implementation, so depending on `Router` here would create a construction-time cycle.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPTabRouteCacheRegistry {\n //#region ---- State ----\n\n private readonly handles = new Map<string, DetachedRouteHandle>();\n private openKeys = new Set<string>();\n private enabled = false;\n private deactivateGuardSuspended = false;\n\n //#endregion\n\n //#region ---- Deactivate Guard Suspension ----\n\n /**\n * Runs `action` while unsaved-changes `canDeactivate` guards are suspended, so switching between\n * tabs preserves a dirty page without prompting. Closing a tab does not use this path, so the\n * prompt still appears there.\n */\n async runWithSuspendedDeactivateGuards<T>(action: () => Promise<T>): Promise<T> {\n const previous = this.deactivateGuardSuspended;\n this.deactivateGuardSuspended = true;\n try {\n return await action();\n } finally {\n this.deactivateGuardSuspended = previous;\n }\n }\n\n isDeactivateGuardSuspended(): boolean {\n return this.deactivateGuardSuspended;\n }\n\n //#endregion\n\n //#region ---- Mode ----\n\n /** Enables caching (tabular mode). Disabling clears and destroys every cached component. */\n setEnabled(enabled: boolean): void {\n if (this.enabled === enabled) {\n return;\n }\n this.enabled = enabled;\n if (!enabled) {\n this.clear();\n }\n }\n\n isEnabled(): boolean {\n return this.enabled;\n }\n\n //#endregion\n\n //#region ---- Open Keys Sync ----\n\n /**\n * Reconciles open scoped tab keys and active tab URLs. Cached handles whose key is not an open\n * scoped tab key, an active tab URL, or a child path under an open scoped tab are destroyed.\n */\n syncOpenKeys(scopedKeys: string[], activeTabUrls: string[] = []): void {\n const scopedSet = new Set(scopedKeys);\n const activePathSet = new Set(\n activeTabUrls.map((url) => url.split('?')[0].split('#')[0].replace(/\\/+$/, '') || '/'),\n );\n\n for (const cacheKey of [...this.handles.keys()]) {\n const normalizedCacheKey = cacheKey.replace(/\\/+$/, '') || '/';\n const keepsScopedKey = scopedSet.has(normalizedCacheKey);\n const keepsActiveUrl = activePathSet.has(normalizedCacheKey);\n const keepsUnderScopedTab = [...scopedSet].some(\n (scopedKey) =>\n normalizedCacheKey === scopedKey || normalizedCacheKey.startsWith(`${scopedKey}/`),\n );\n\n if (!keepsScopedKey && !keepsActiveUrl && !keepsUnderScopedTab) {\n this.destroyHandle(this.handles.get(cacheKey));\n this.handles.delete(cacheKey);\n }\n }\n\n this.openKeys = scopedSet;\n }\n\n isOpen(key: string): boolean {\n return this.openKeys.has(key);\n }\n\n /**\n * Returns the live component instance for a cached background tab, when available.\n * Matches the tab key directly or any cached handle under a scoped tab prefix.\n */\n getComponentInstance<T>(key: string): T | null {\n const normalizedKey = key.replace(/\\/+$/, '') || '/';\n const direct = this.handles.get(normalizedKey) ?? this.handles.get(key);\n if (direct) {\n return this.readComponentInstance<T>(direct);\n }\n\n for (const [cacheKey, handle] of this.handles) {\n const normalizedCacheKey = cacheKey.replace(/\\/+$/, '') || '/';\n if (normalizedCacheKey === normalizedKey || normalizedCacheKey.startsWith(`${normalizedKey}/`)) {\n return this.readComponentInstance<T>(handle);\n }\n }\n\n return null;\n }\n\n //#endregion\n\n //#region ---- Handle Store ----\n\n /**\n * Caches a detached background handle. Overwrites without destroying the previous handle: on a\n * repeat visit Angular hands back a new handle object wrapping the same live `componentRef`, so\n * destroying the old one would destroy the live component and corrupt the view (NG0922).\n */\n store(key: string, handle: DetachedRouteHandle): void {\n this.handles.set(key, handle);\n }\n\n /**\n * Returns the cached handle without mutating the map. Angular reads a handle twice per\n * navigation (once while building the future state, once while attaching), so `retrieve` must be\n * idempotent; the handle is released afterwards via {@link release} when Angular calls\n * `store(snapshot, null)`.\n */\n retrieve(key: string): DetachedRouteHandle | null {\n return this.handles.get(key) ?? null;\n }\n\n /**\n * Drops a handle that the router has just reattached (it is now a live foreground view, so it\n * must not be destroyed). The map keeps only truly backgrounded handles.\n */\n release(key: string): void {\n this.handles.delete(key);\n }\n\n has(key: string): boolean {\n return this.handles.has(key);\n }\n\n /** Destroys and removes a single cached handle (used when a tab closes). */\n evict(key: string): void {\n this.destroyHandle(this.handles.get(key));\n this.handles.delete(key);\n }\n\n /** Destroys and removes every cached handle. */\n clear(): void {\n for (const handle of this.handles.values()) {\n this.destroyHandle(handle);\n }\n this.handles.clear();\n this.openKeys.clear();\n }\n\n //#endregion\n\n //#region ---- Utility Methods ----\n\n private readComponentInstance<T>(handle: DetachedRouteHandle): T | null {\n const componentRef = (handle as unknown as DestroyableRouteHandle).componentRef;\n return (componentRef?.instance as T) ?? null;\n }\n\n private destroyHandle(handle: DetachedRouteHandle | undefined): void {\n if (!handle) {\n return;\n }\n const componentRef = (handle as unknown as DestroyableRouteHandle).componentRef;\n componentRef?.destroy?.();\n }\n\n //#endregion\n}\n","import { inject } from '@angular/core';\nimport { CanDeactivateFn } from '@angular/router';\nimport { AXPTabRouteCacheRegistry } from '../tab-navigation/tab-route-cache.registry';\nimport { AXPUnsavedChangesCanDeactivate } from './unsaved-changes-confirm.service';\n\n//#region ---- Unsaved Changes Can Deactivate Guard Factory ----\n\nexport function createUnsavedChangesCanDeactivateGuard<T extends AXPUnsavedChangesCanDeactivate>(): CanDeactivateFn<T> {\n return (component) => {\n // Tab switches keep the page alive in the background, so skip the prompt; closing a tab does not\n // suspend guards and still prompts.\n const tabCache = inject(AXPTabRouteCacheRegistry, { optional: true });\n if (tabCache?.isDeactivateGuardSuspended()) {\n return true;\n }\n return component.canDeactivate();\n };\n}\n\n//#endregion\n","import type { AXPopupSizeType } from '@acorex/components/popup';\nimport type { AXPPlatformScopeKey } from '@acorex-platform/framework-shared/core';\n\n//#region ---- Settings popup options ----\n\nexport interface AXPSettingsSectionPopupOptions {\n scope: AXPPlatformScopeKey;\n /** Settings definition section name (e.g. `smtp-settings`). */\n section: string;\n /** Optional parent group when section names are not unique. */\n group?: string;\n /** Overrides the section title in the popup header. */\n title?: string;\n /** Overrides the section description shown under the title. */\n description?: string;\n size?: AXPopupSizeType;\n}\n\nexport interface AXPSettingsKeysPopupOptions {\n scope: AXPPlatformScopeKey;\n /** Setting keys to render using their canonical widget definitions. */\n keys: string[];\n title?: string;\n description?: string;\n size?: AXPopupSizeType;\n}\n\nexport interface AXPSettingsPopupResult {\n saved: boolean;\n}\n\n//#endregion\n","export enum AXPHomePageSettings {\n UserHomePath = 'Common:Setting:Startup.HomePage',\n}","import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { inject, Injectable, Injector } from '@angular/core';\nimport { Route, Router, Routes, UrlTree } from '@angular/router';\nimport { combineLatest, distinctUntilChanged, filter, firstValueFrom, take } from 'rxjs';\nimport { AXPSettingsService } from '../settings';\nimport { AXPHomePageSettings } from './home-page-settings.key';\nimport { AXP_HOME_PAGE_DEFAULT_KEY, AXP_HOME_PAGES, AXPHomePageDefinition } from './home-page.types';\n\n//#region ----- Home page service -----\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPHomePageService {\n //#region ----- Services & Dependencies -----\n\n private readonly defaultHomePageKey = inject<string>(AXP_HOME_PAGE_DEFAULT_KEY, { optional: true }) ?? 'home';\n private readonly candidates = inject<AXPHomePageDefinition[]>(AXP_HOME_PAGES, { optional: true }) ?? [];\n private readonly settingsService = inject(AXPSettingsService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly injector = inject(Injector);\n\n //#endregion\n\n //#region ----- State -----\n\n private userHomePageKey: string | null = null;\n private originalConfig: Routes | null = null;\n private readonly loginPath = 'auth/login';\n\n //#endregion\n\n //#region ----- Computed -----\n\n private get flatCandidates() {\n return this.candidates.flatMap((c) => c);\n }\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n constructor() {\n // Defer init to avoid circular DI with settings/router.\n setTimeout(() => {\n void this.init();\n });\n }\n\n private async init() {\n await this.load();\n // Capture the full router config once before we start merging home routes.\n this.ensureOriginalConfig();\n this.refreshRoutes();\n\n const keys = [AXPHomePageSettings.UserHomePath];\n this.settingsService.onChanged.subscribe(async (c) => {\n if (keys.some((key) => c.keys.includes(key))) {\n await this.load();\n this.refreshRoutes();\n }\n });\n\n combineLatest([\n this.sessionService.isAuthorized$,\n this.sessionService.application$,\n this.sessionService.tenant$,\n ])\n .pipe(\n distinctUntilChanged(\n ([authorized, application, tenant], [previousAuthorized, previousApplication, previousTenant]) =>\n authorized === previousAuthorized &&\n application?.id === previousApplication?.id &&\n tenant?.id === previousTenant?.id,\n ),\n filter(([authorized]) => authorized),\n )\n .subscribe(async () => {\n await this.load();\n this.refreshRoutes();\n });\n }\n\n //#endregion\n\n //#region ----- Public API -----\n\n async load() {\n this.userHomePageKey = await this.settingsService.get(AXPHomePageSettings.UserHomePath);\n }\n\n getRegisteredList(): AXPHomePageDefinition[] {\n return this.flatCandidates.filter((c) => c.route);\n }\n\n /**\n * Home shell (`:app` + dashboard children) is always registered when a home definition exists.\n * App-specific redirects are added only after an application is selected.\n * This prevents refresh/deep-link 404s while session restore is still in progress.\n */\n getRegisteredRoutes(): Routes {\n const home = this.resolveHomeDefinition();\n if (!home?.route) {\n return [{ path: '', redirectTo: this.loginPath, pathMatch: 'full' }];\n }\n\n const appName = this.sessionService.application?.name;\n const homeRoute: Route = {\n ...home.route,\n data: {\n ...home.route.data,\n key: home.key,\n title: home.title,\n ...(appName ? { path: this.findPath(home.route) } : {}),\n },\n };\n\n if (appName) {\n const fullPath = this.findPath(home.route);\n return [\n { path: '', redirectTo: fullPath, pathMatch: 'full' },\n { path: ':app', redirectTo: fullPath, pathMatch: 'full' },\n homeRoute,\n ];\n }\n\n return [{ path: '', redirectTo: this.loginPath, pathMatch: 'full' }, homeRoute];\n }\n\n getCurrent(): { path: string; title: string } {\n const home = this.resolveHomeDefinition();\n const appName = this.sessionService.application?.name;\n if (home?.route && appName) {\n return {\n path: this.findPath(home.route),\n title: home.title ?? '',\n };\n }\n\n return {\n path: this.loginPath,\n title: '',\n };\n }\n\n /**\n * Resolves the current user's home page as a router URL tree.\n */\n resolveHomeUrlTree(): UrlTree {\n const router = this.injector.get(Router);\n const current = this.getCurrent();\n const path = current.path.startsWith('/') ? current.path : `/${current.path}`;\n return router.parseUrl(path);\n }\n\n /**\n * Waits for an authorized app session, merges home routes, and returns the home UrlTree.\n * Prefer returning this from route guards instead of calling {@link navigateTo} (nested\n * `router.navigate` inside `canActivate` can deadlock and leave the UI on /auth/login).\n */\n async resolveAuthorizedHomeUrlTree(): Promise<UrlTree> {\n if (!(this.sessionService.isAuthorized && this.sessionService.application?.name)) {\n await firstValueFrom(\n combineLatest([this.sessionService.isAuthorized$, this.sessionService.application$]).pipe(\n filter(([authorized, application]) => authorized && !!application?.name),\n take(1),\n ),\n );\n }\n\n await this.load();\n this.ensureOriginalConfig();\n this.refreshRoutes();\n return this.resolveHomeUrlTree();\n }\n\n /**\n * Navigates to the home page after the session has an application and home routes are merged.\n * Safe outside guards (e.g. password login, app-chooser list). Do not await this from canActivate.\n */\n async navigateTo(): Promise<void> {\n const target = await this.resolveAuthorizedHomeUrlTree();\n const router = this.injector.get(Router);\n await router.navigateByUrl(target, { onSameUrlNavigation: 'reload' });\n }\n\n //#endregion\n\n //#region ----- Private helpers -----\n\n private resolveHomeDefinition(): AXPHomePageDefinition | undefined {\n const defaultHomePage = this.flatCandidates.find((c) => c.key === this.defaultHomePageKey);\n return (\n this.flatCandidates.find((c) => this.userHomePageKey && c.key === this.userHomePageKey) ?? defaultHomePage\n );\n }\n\n private findPath(target: Route): string {\n const rawPath = this.buildFullPaths(target).join('/');\n const appName = this.sessionService.application?.name;\n if (appName) {\n return rawPath.replace(':app', appName);\n }\n return rawPath;\n }\n\n private buildFullPaths(route: Route, parentPath: string[] = []): string[] {\n const segments = [...parentPath];\n if (route.path) {\n segments.push(route.path);\n }\n\n if (route.children?.length) {\n return this.buildFullPaths(route.children[0], segments);\n }\n\n return segments;\n }\n\n private ensureOriginalConfig(): void {\n if (this.originalConfig) {\n return;\n }\n this.originalConfig = this.injector.get(Router).config;\n }\n\n private refreshRoutes() {\n const router = this.injector.get(Router);\n this.ensureOriginalConfig();\n this.applyMergedConfig(router);\n }\n\n private applyMergedConfig(router: Router) {\n const newHomeRoutes = this.getRegisteredRoutes();\n\n // Drop previous home placeholders (`''`, bare `:app`, keyed home route) from the snapshot.\n const otherRoutes = (this.originalConfig ?? []).filter(\n (r) => r.path !== '' && r.path !== ':app' && !(r.data && typeof r.data['key'] === 'string'),\n );\n\n router.resetConfig([...newHomeRoutes, ...otherRoutes]);\n }\n\n //#endregion\n}\n\n//#endregion\n","import { EnvironmentProviders, inject, makeEnvironmentProviders } from \"@angular/core\";\nimport { Routes, ROUTES } from \"@angular/router\";\nimport { AXPHomePageService } from \"./home-page.service\";\n\nfunction dynamicRoutesFactory(): Routes {\n const service = inject(AXPHomePageService);\n return service.getRegisteredRoutes();\n}\n\nexport function provideDynamicHomePage(): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: ROUTES,\n useFactory: dynamicRoutesFactory,\n multi: true\n }\n ]);\n}","//#region ---- Experience settings group ----\n\n/** Root Settings nav group for startup, widgets, notifications, and entity UX preferences. */\nexport const AXP_EXPERIENCE_SETTINGS_GROUP = 'experience';\n\nexport const AXP_EXPERIENCE_SETTINGS_SECTIONS = {\n Startup: 'startup',\n Widgets: 'widgets',\n Notifications: 'notifications',\n Performance: 'performance',\n Entity: 'entity',\n Offline: 'offline',\n FileChooser: 'file-chooser',\n} as const;\n\n//#endregion\n","\nimport { AXPPlatformScope, AXPWidgetsCatalog } from '@acorex-platform/framework-shared/core';\nimport { objectKeyValueTransforms } from '@acorex-platform/framework-client/core';\n\nimport { Injectable, Injector, inject } from '@angular/core';\nimport {\n AXP_EXPERIENCE_SETTINGS_GROUP,\n AXP_EXPERIENCE_SETTINGS_SECTIONS,\n} from '../settings/experience-settings.constants';\nimport { AXPSettingDefinitionProvider, AXPSettingDefinitionProviderContext } from '../settings';\nimport { AXPHomePageSettings } from './home-page-settings.key';\nimport { AXPHomePageService } from './home-page.service';\nimport { AXP_HOME_PAGE_DEFAULT_KEY } from './home-page.types';\n\nconst I18N = '@general:settings';\n\n@Injectable()\nexport class AXPHomePageSettingProvider implements AXPSettingDefinitionProvider {\n private readonly homePageService = this.injector.get(AXPHomePageService);\n private defaultHomePageKey = inject<string>(AXP_HOME_PAGE_DEFAULT_KEY, { optional: true }) ?? 'home';\n\n constructor(private injector: Injector) {}\n\n async provide(context: AXPSettingDefinitionProviderContext): Promise<void> {\n const list = this.homePageService.getRegisteredList().map((c) => ({ id: c.key, title: c.title }));\n if (list.length === 0) {\n return;\n }\n\n context\n .addGroup(\n AXP_EXPERIENCE_SETTINGS_GROUP,\n `${I18N}.experience.nav-title`,\n `${I18N}.experience.description`,\n 'fa-light fa-wand-magic-sparkles',\n `${I18N}.experience.title`,\n 1,\n )\n .addSection(\n AXP_EXPERIENCE_SETTINGS_SECTIONS.Startup,\n `${I18N}.experience.startup.title`,\n `${I18N}.experience.startup.description`,\n )\n .addSetting({\n key: AXPHomePageSettings.UserHomePath,\n title: `${I18N}.experience.startup.home-page.title`,\n scope: AXPPlatformScope.User,\n overridableAt: [],\n isInherited: true,\n defaultValue: this.defaultHomePageKey || list[0].id,\n valueTransforms: objectKeyValueTransforms('id'),\n widget: {\n type: AXPWidgetsCatalog.select,\n options: {\n valueField: 'id',\n textField: 'title',\n dataSource: list,\n },\n },\n description: `${I18N}.experience.startup.home-page.description`,\n })\n .endSection()\n .addSection(\n AXP_EXPERIENCE_SETTINGS_SECTIONS.Widgets,\n `${I18N}.experience.widgets.title`,\n `${I18N}.experience.widgets.description`,\n )\n .endSection()\n .endGroup();\n }\n}\n","import { NgModule } from '@angular/core';\nimport { AXP_SETTING_DEFINITION_PROVIDER } from '../settings';\nimport { AXPHomePageSettingProvider } from './home-page-settings.provider';\n\n@NgModule({\n imports: [],\n providers: [\n {\n provide: AXP_SETTING_DEFINITION_PROVIDER,\n useClass: AXPHomePageSettingProvider,\n multi: true,\n },\n ],\n})\nexport class AXPHomePageModule {}\n","//#region ---- Imports ----\n\nimport { InjectionToken } from '@angular/core';\nimport type { AXPUserReference } from '@acorex-platform/framework-shared/core';\n//#endregion\n\n//#region ---- In-app notification port ----\n\nexport type AXPInAppNotificationPriority = 'Notice' | 'Danger' | 'Warning';\n\nexport interface AXPInAppNotificationCreateRequest {\n id: string;\n name: string;\n title: string;\n body: string;\n icon: string;\n priority: AXPInAppNotificationPriority;\n receiver: AXPUserReference;\n data?: Record<string, unknown>;\n}\n\n/**\n * Persists in-app notifications. Communication-management registers the primary\n * implementation via {@link CommunicationSendInput} (channel `in-app`).\n */\nexport interface AXPInAppNotificationService {\n create(request: AXPInAppNotificationCreateRequest): Promise<void>;\n}\n\nexport const AXP_IN_APP_NOTIFICATION_SERVICE = new InjectionToken<AXPInAppNotificationService>(\n 'AXP_IN_APP_NOTIFICATION_SERVICE',\n);\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { InjectionToken } from '@angular/core';\nimport type { AXPUserNotificationRequest } from '@acorex-platform/framework-shared/core';\n\n//#endregion\n\n//#region ---- Port ----\n\nexport interface AXPUserNotificationPort {\n notify(request: AXPUserNotificationRequest): Promise<void>;\n}\n\nexport const AXP_USER_NOTIFICATION_SERVICE = new InjectionToken<AXPUserNotificationPort>(\n 'AXP_USER_NOTIFICATION_SERVICE',\n);\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { inject, Injectable } from '@angular/core';\nimport { AXP_USER_NOTIFICATION_SERVICE } from '../user-notification/user-notification.port';\nimport type { AXPBackgroundOperation } from './background-operation.types';\n\n//#endregion\n\n//#region ---- Service ----\n\n/**\n * Sends in-app notifications when a background operation finishes or fails.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPBackgroundOperationNotificationService {\n private readonly userNotificationService = inject(AXP_USER_NOTIFICATION_SERVICE);\n\n private readonly sessionService = inject(AXPSessionService);\n\n async notify(operation: AXPBackgroundOperation): Promise<void> {\n if (!this.shouldNotify(operation)) {\n return;\n }\n\n const userId = this.sessionService.user?.id;\n if (!userId) {\n return;\n }\n\n const body = this.resolveBody(operation);\n const { icon, priority } = this.resolveTemplate(operation);\n\n await this.userNotificationService.notify({\n correlationId: `notif-bg-op-${operation.id}-${operation.status}`,\n idempotencyKey: `notif-bg-op-${operation.id}-${operation.status}`,\n name: operation.title,\n title: operation.title,\n body,\n icon,\n recipientUserId: userId,\n delivery: {\n inbox: {\n priority,\n },\n },\n data: {\n backgroundOperationId: operation.id,\n providerKey: operation.providerKey,\n status: operation.status,\n ...(operation.data ?? {}),\n },\n });\n }\n\n //#region ---- Helpers ----\n\n private shouldNotify(operation: AXPBackgroundOperation): boolean {\n const { capabilities } = operation;\n\n if (operation.status === 'failed') {\n return capabilities.notifyOnFailed !== false;\n }\n\n if (operation.status === 'completed' || operation.status === 'cancelled') {\n return capabilities.notifyOnComplete !== false;\n }\n\n return false;\n }\n\n private resolveBody(operation: AXPBackgroundOperation): string {\n if (operation.status === 'failed') {\n return operation.error?.message ?? operation.statusText ?? 'Background task failed';\n }\n\n const statusText = operation.statusText?.trim();\n return statusText || operation.title;\n }\n\n private resolveTemplate(operation: AXPBackgroundOperation): {\n icon: string;\n priority: 'Notice' | 'Danger' | 'Warning';\n } {\n switch (operation.status) {\n case 'completed':\n return { icon: 'fa-light fa-circle-check', priority: 'Notice' };\n case 'failed':\n return { icon: 'fa-light fa-circle-exclamation', priority: 'Danger' };\n case 'cancelled':\n return { icon: 'fa-light fa-ban', priority: 'Warning' };\n default:\n return { icon: 'fa-light fa-list-check', priority: 'Notice' };\n }\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport {AXPDataGenerator} from '@acorex-platform/framework-client/core';\nimport { isNumber } from 'lodash-es';\nimport type {\n AXPBackgroundOperation,\n AXPBackgroundOperationCapabilities,\n AXPBackgroundOperationCreateRequest,\n AXPBackgroundOperationFailurePolicy,\n AXPBackgroundOperationStatus,\n} from './background-operation.types';\n\n//#endregion\n\n//#region ---- Factories ----\n\nexport function axpCreateBackgroundOperationId(): string {\n return `bg-op-${AXPDataGenerator.uuid()}`;\n}\n\nexport function axpBuildBackgroundOperation(\n providerKey: string,\n request: AXPBackgroundOperationCreateRequest,\n overrides?: Partial<AXPBackgroundOperation>,\n): AXPBackgroundOperation {\n const now = new Date();\n const operation: AXPBackgroundOperation = {\n id: axpCreateBackgroundOperationId(),\n providerKey,\n title: request.title,\n status: 'queued',\n progress: request.progress,\n estimatedDurationMs: request.estimatedDurationMs,\n statusText: request.statusText,\n currentStep: request.currentStep,\n createdAt: now,\n capabilities: request.capabilities,\n failurePolicy: request.failurePolicy,\n ...overrides,\n };\n const hasStarted = operation.status === 'running' || operation.status === 'paused';\n\n return {\n ...operation,\n createdAt: operation.createdAt ?? now,\n startedAt: operation.startedAt ?? (hasStarted ? now : undefined),\n };\n}\n\nexport function axpCoerceBackgroundOperationDate(value: Date | string | undefined): Date | null {\n if (!value) {\n return null;\n }\n const date = value instanceof Date ? value : new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\nexport function axpBackgroundOperationDisplayTime(operation: AXPBackgroundOperation): Date | null {\n return (\n axpCoerceBackgroundOperationDate(operation.startedAt) ??\n axpCoerceBackgroundOperationDate(operation.createdAt)\n );\n}\n\n/**\n * Remaining duration in milliseconds for ETA display.\n * Prefers progress-rate extrapolation; falls back to an explicit estimate budget only.\n */\nexport function axpBackgroundOperationRemainingMs(operation: AXPBackgroundOperation): number | null {\n if (!operation.capabilities.supportsEstimate) {\n return null;\n }\n\n const { estimatedDurationMs, progress, startedAt, status } = operation;\n if (status !== 'running' && status !== 'paused' && status !== 'queued') {\n return null;\n }\n\n if (isNumber(progress) && progress >= 100) {\n return 0;\n }\n\n const started = axpCoerceBackgroundOperationDate(startedAt);\n\n if (isNumber(progress) && progress > 0 && started) {\n const elapsed = Date.now() - started.getTime();\n if (elapsed > 0) {\n return Math.max(0, Math.round((elapsed * (100 - progress)) / progress));\n }\n }\n\n if (!isNumber(estimatedDurationMs) || estimatedDurationMs <= 0) {\n return null;\n }\n\n if (started) {\n const elapsed = Date.now() - started.getTime();\n return Math.max(0, estimatedDurationMs - elapsed);\n }\n\n return estimatedDurationMs;\n}\n\n/**\n * Estimated completion instant for relative-time formatting (e.g. timeleft pipe).\n */\nexport function axpBackgroundOperationEstimateEndDate(operation: AXPBackgroundOperation): Date | null {\n const remainingMs = axpBackgroundOperationRemainingMs(operation);\n if (remainingMs === null) {\n return null;\n }\n return new Date(Date.now() + remainingMs);\n}\n\nexport function axpBackgroundOperationDurationMs(operation: AXPBackgroundOperation): number | null {\n const started =\n axpCoerceBackgroundOperationDate(operation.startedAt) ??\n axpCoerceBackgroundOperationDate(operation.createdAt);\n const completed = axpCoerceBackgroundOperationDate(operation.completedAt);\n if (!started || !completed) {\n return null;\n }\n return Math.max(0, completed.getTime() - started.getTime());\n}\n\nexport function axpBackgroundOperationStatusTextParams(\n operation: Pick<AXPBackgroundOperation, 'statusText' | 'currentStep'>,\n): Record<string, string | number> {\n const statusText = operation.statusText?.trim() ?? '';\n const step = operation.currentStep?.trim();\n if (!statusText.startsWith('@')) {\n return {};\n }\n if (statusText.includes('layout-line-multiple')) {\n const count = Number.parseInt(step ?? '', 10);\n return { count: Number.isFinite(count) ? count : 0 };\n }\n if (step && (statusText.includes('layout-line-single') || statusText.includes('progress.layout'))) {\n return { layout: step };\n }\n return {};\n}\n\nexport function axpIsBackgroundOperationI18nText(value: string | undefined): boolean {\n return !!value?.trim().startsWith('@');\n}\n\nexport function axpFormatBackgroundOperationDurationMs(ms: number): string {\n const totalSeconds = Math.max(1, Math.round(ms / 1000));\n if (totalSeconds < 60) {\n return `${totalSeconds}s`;\n }\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n if (minutes < 60) {\n return seconds > 0 ? `${minutes}m ${seconds}s` : `${minutes}m`;\n }\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return remainingMinutes > 0 ? `${hours}h ${remainingMinutes}m` : `${hours}h`;\n}\n\nexport function axpBackgroundOperationCapabilities(\n partial: Partial<AXPBackgroundOperationCapabilities> = {},\n): AXPBackgroundOperationCapabilities {\n return {\n cancellable: partial.cancellable ?? false,\n pausable: partial.pausable ?? false,\n resumable: partial.resumable ?? false,\n retryable: partial.retryable ?? false,\n supportsProgress: partial.supportsProgress ?? false,\n supportsEstimate: partial.supportsEstimate ?? false,\n clickable: partial.clickable ?? false,\n keepInTrayAfterComplete: partial.keepInTrayAfterComplete ?? false,\n notifyOnComplete: partial.notifyOnComplete ?? true,\n notifyOnFailed: partial.notifyOnFailed ?? true,\n };\n}\n\nexport function axpBackgroundOperationFailurePolicy(\n partial: Partial<AXPBackgroundOperationFailurePolicy> = {},\n): AXPBackgroundOperationFailurePolicy {\n return {\n mode: partial.mode ?? 'abort',\n currentStepId: partial.currentStepId,\n maxRetries: partial.maxRetries,\n retryCount: partial.retryCount ?? 0,\n };\n}\n\nexport function axpIsActiveBackgroundOperationStatus(status: AXPBackgroundOperationStatus): boolean {\n return status === 'queued' || status === 'running' || status === 'paused';\n}\n\nexport function axpIsCompletedBackgroundOperationStatus(status: AXPBackgroundOperationStatus): boolean {\n return status === 'completed' || status === 'cancelled';\n}\n\nexport function axpIsTrayVisibleBackgroundOperation(operation: {\n status: AXPBackgroundOperationStatus;\n capabilities: Pick<AXPBackgroundOperationCapabilities, 'keepInTrayAfterComplete'>;\n}): boolean {\n if (axpIsActiveBackgroundOperationStatus(operation.status)) {\n return true;\n }\n if (operation.status === 'failed') {\n return true;\n }\n if (\n operation.capabilities.keepInTrayAfterComplete === true &&\n axpIsCompletedBackgroundOperationStatus(operation.status)\n ) {\n return true;\n }\n return false;\n}\n\nexport type AXPBackgroundOperationPanelTabKey = 'in-progress' | 'completed';\n\nexport function axpIsInProgressPanelBackgroundOperation(operation: {\n status: AXPBackgroundOperationStatus;\n}): boolean {\n return axpIsActiveBackgroundOperationStatus(operation.status);\n}\n\nexport function axpIsCompletedPanelBackgroundOperation(operation: AXPBackgroundOperation): boolean {\n return (\n axpIsTrayVisibleBackgroundOperation(operation) &&\n !axpIsActiveBackgroundOperationStatus(operation.status)\n );\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { inject, Injectable } from '@angular/core';\nimport { AXPBackgroundOperationNotificationService } from './background-operation-notification.service';\nimport type { AXPBackgroundOperation } from './background-operation.types';\nimport { axpIsCompletedBackgroundOperationStatus } from './background-operation.util';\n\n//#endregion\n\n//#region ---- Service ----\n\n/**\n * Sends notifications and removes tray rows when a background operation reaches a terminal state.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPBackgroundOperationCompletionService {\n private readonly notificationService = inject(AXPBackgroundOperationNotificationService);\n\n /** Whether the operation just reached a finished state (completed or cancelled). */\n shouldAutoFinish(previousStatus: string | undefined, operation: AXPBackgroundOperation): boolean {\n return (\n previousStatus !== operation.status && axpIsCompletedBackgroundOperationStatus(operation.status)\n );\n }\n\n /** Whether the operation just transitioned to failed. */\n shouldNotifyFailure(previousStatus: string | undefined, operation: AXPBackgroundOperation): boolean {\n return previousStatus !== operation.status && operation.status === 'failed';\n }\n\n /** Notifies the user and invokes {@link remove} to drop the operation from the tray. */\n async notifyAndRemove(operation: AXPBackgroundOperation, remove: () => void): Promise<void> {\n await this.notify(operation);\n remove();\n }\n\n /** Notifies the user while keeping the failed operation in the tray for retry. */\n async notifyFailure(operation: AXPBackgroundOperation): Promise<void> {\n await this.notify(operation);\n }\n\n //#region ---- Notification ----\n\n private async notify(operation: AXPBackgroundOperation): Promise<void> {\n try {\n await this.notificationService.notify(operation);\n } catch (error: unknown) {\n console.warn('Failed to send background-operation notification', operation.id, error);\n }\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Status & capabilities ----\n\nexport type AXPBackgroundOperationStatus =\n | 'queued'\n | 'running'\n | 'paused'\n | 'completed'\n | 'failed'\n | 'cancelled';\n\nexport interface AXPBackgroundOperationCapabilities {\n cancellable: boolean;\n pausable: boolean;\n resumable: boolean;\n retryable: boolean;\n /** When true, UI shows a progress bar only while {@link AXPBackgroundOperation.progress} is set. */\n supportsProgress: boolean;\n /** When true, UI may show ETA while {@link AXPBackgroundOperation.estimatedDurationMs} is set. */\n supportsEstimate: boolean;\n /** When true, the tray item is clickable and delegates to a registered handler. */\n clickable: boolean;\n /** When true, keep completed/cancelled rows in the tray until dismissed. */\n keepInTrayAfterComplete?: boolean;\n /** When false, skip in-app notification on completed/cancelled. Default: true. */\n notifyOnComplete?: boolean;\n /** When false, skip in-app notification on failed. Default: true. */\n notifyOnFailed?: boolean;\n}\n\nexport type AXPBackgroundOperationFailureMode = 'retry' | 'continue' | 'abort';\n\nexport interface AXPBackgroundOperationFailurePolicy {\n mode: AXPBackgroundOperationFailureMode;\n currentStepId?: string;\n maxRetries?: number;\n retryCount?: number;\n}\n\nexport interface AXPBackgroundOperationError {\n code?: string;\n message: string;\n detail?: string;\n}\n\n//#endregion\n\n//#region ---- Operation model ----\n\nexport interface AXPBackgroundOperation {\n id: string;\n providerKey: string;\n title: string;\n status: AXPBackgroundOperationStatus;\n progress?: number;\n estimatedDurationMs?: number;\n statusText?: string;\n currentStep?: string;\n createdAt: Date;\n startedAt?: Date;\n completedAt?: Date;\n capabilities: AXPBackgroundOperationCapabilities;\n failurePolicy: AXPBackgroundOperationFailurePolicy;\n error?: AXPBackgroundOperationError;\n /** Handler-specific payload (e.g. conversationId for chat navigation). */\n data?: Record<string, unknown>;\n}\n\nexport interface AXPBackgroundOperationCreateRequest {\n title: string;\n progress?: number;\n estimatedDurationMs?: number;\n statusText?: string;\n currentStep?: string;\n capabilities: AXPBackgroundOperationCapabilities;\n failurePolicy: AXPBackgroundOperationFailurePolicy;\n}\n\nexport type AXPBackgroundOperationActionKey = 'cancel' | 'pause' | 'resume' | 'retry' | 'dismiss';\n\n/** Primary action button shown on completed-tab rows (defined per handler). */\nexport interface AXPBackgroundOperationCta {\n /** i18n key (`@scope:key`) or plain label text. */\n text: string;\n icon?: string;\n color?: string;\n look?: 'solid' | 'outline' | 'twotone' | 'blank';\n command: {\n name: AXPBackgroundOperationActionKey | 'click';\n options?: Record<string, unknown>;\n };\n}\n\n//#endregion\n","//#region ---- Root config ----\n\nexport const AXPBackgroundOperationRootConfig = {\n module: {\n name: 'Common',\n title: '@general:module.common.title',\n icon: 'fa-light fa-layer-group',\n },\n entities: {\n backgroundOperation: {\n name: 'BackgroundOperations',\n title: '@general:background-operation.entity.title',\n titlePlural: '@general:background-operation.entity.plural',\n icon: 'fa-light fa-spinner',\n },\n },\n} as const;\n\n/** Full entity key used with {@link AXPEntityStorageService} (e.g. `Common.BackgroundOperations`). */\nexport function axpBackgroundOperationEntityName(): string {\n return `${AXPBackgroundOperationRootConfig.module.name}.${AXPBackgroundOperationRootConfig.entities.backgroundOperation.name}`;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { InjectionToken } from '@angular/core';\nimport type { AXPBackgroundOperationEntityModel } from './entities/background-operation/background-operation.types';\n\n//#endregion\n\n//#region ---- Storage adapter ----\n\n/**\n * Optional persistence adapter for background-operation entity rows.\n * Mock connectivity registers an implementation backed by {@link AXPEntityStorageService}.\n */\nexport interface AXPBackgroundOperationEntityStorageAdapter {\n getAll(entityName: string): Promise<AXPBackgroundOperationEntityModel[]>;\n upsertOne(entityName: string, row: AXPBackgroundOperationEntityModel): Promise<void>;\n deleteOne(entityName: string, id: string): Promise<void>;\n}\n\nexport const AXP_BACKGROUND_OPERATION_ENTITY_STORAGE = new InjectionToken<AXPBackgroundOperationEntityStorageAdapter>(\n 'AXP_BACKGROUND_OPERATION_ENTITY_STORAGE',\n);\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXPBackgroundOperation } from './background-operation.types';\nimport type { AXPBackgroundOperationEntityModel } from './entities/background-operation/background-operation.types';\nimport { axpCoerceBackgroundOperationDate } from './background-operation.util';\n\n//#endregion\n\n//#region ---- Mappers ----\n\nexport function axpBackgroundOperationToEntityModel(\n operation: AXPBackgroundOperation,\n): AXPBackgroundOperationEntityModel {\n return {\n id: operation.id,\n providerKey: operation.providerKey,\n title: operation.title,\n status: operation.status,\n progress: operation.progress,\n estimatedDurationMs: operation.estimatedDurationMs,\n statusText: operation.statusText,\n currentStep: operation.currentStep,\n createdAt: operation.createdAt.toISOString(),\n startedAt: operation.startedAt?.toISOString(),\n completedAt: operation.completedAt?.toISOString(),\n capabilities: operation.capabilities,\n failurePolicy: operation.failurePolicy,\n error: operation.error,\n data: operation.data,\n };\n}\n\nexport function axpBackgroundOperationFromEntityModel(\n model: AXPBackgroundOperationEntityModel,\n): AXPBackgroundOperation {\n const createdAt = axpCoerceBackgroundOperationDate(model.createdAt) ?? new Date();\n\n return {\n id: model.id,\n providerKey: model.providerKey,\n title: model.title,\n status: model.status,\n progress: model.progress,\n estimatedDurationMs: model.estimatedDurationMs,\n statusText: model.statusText,\n currentStep: model.currentStep,\n createdAt,\n startedAt: axpCoerceBackgroundOperationDate(model.startedAt) ?? undefined,\n completedAt: axpCoerceBackgroundOperationDate(model.completedAt) ?? undefined,\n capabilities: model.capabilities,\n failurePolicy: model.failurePolicy,\n error: model.error,\n data: model.data,\n };\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { signal, type Signal } from '@angular/core';\nimport type { AXPBackgroundOperation } from './background-operation.types';\n\n//#endregion\n\n//#region ---- Store factory ----\n\n/**\n * Lightweight in-memory store for a single background-operation provider.\n */\nexport function createBackgroundOperationStore(): {\n readonly operations: Signal<readonly AXPBackgroundOperation[]>;\n upsert(operation: AXPBackgroundOperation): void;\n patch(id: string, patch: Partial<AXPBackgroundOperation>): void;\n find(id: string): AXPBackgroundOperation | undefined;\n remove(id: string): void;\n} {\n const operationsState = signal<AXPBackgroundOperation[]>([]);\n\n return {\n operations: operationsState.asReadonly(),\n\n upsert(operation: AXPBackgroundOperation): void {\n operationsState.update((list) => {\n const index = list.findIndex((item) => item.id === operation.id);\n if (index < 0) {\n return [operation, ...list];\n }\n const next = [...list];\n next[index] = operation;\n return next;\n });\n },\n\n patch(id: string, patch: Partial<AXPBackgroundOperation>): void {\n operationsState.update((list) =>\n list.map((item) => (item.id === id ? { ...item, ...patch } : item)),\n );\n },\n\n find(id: string): AXPBackgroundOperation | undefined {\n return operationsState().find((item) => item.id === id);\n },\n\n remove(id: string): void {\n operationsState.update((list) => list.filter((item) => item.id !== id));\n },\n };\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { computed, inject, Injectable, type Signal } from '@angular/core';\nimport { axpBackgroundOperationEntityName } from './background-operation.const';\nimport {\n axpBackgroundOperationFromEntityModel,\n axpBackgroundOperationToEntityModel,\n} from './background-operation.entity.mapper';\nimport { AXP_BACKGROUND_OPERATION_ENTITY_STORAGE } from './background-operation.entity.storage';\nimport { AXPBackgroundOperationCompletionService } from './background-operation-completion.service';\nimport type { AXPBackgroundOperation } from './background-operation.types';\nimport { axpIsCompletedBackgroundOperationStatus } from './background-operation.util';\nimport { createBackgroundOperationStore } from './background-operation.store';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface AXPBackgroundOperationProviderStore {\n readonly operations: Signal<readonly AXPBackgroundOperation[]>;\n upsert(operation: AXPBackgroundOperation): void;\n patch(operationId: string, patch: Partial<AXPBackgroundOperation>): void;\n find(operationId: string): AXPBackgroundOperation | undefined;\n remove(id: string): void;\n}\n\n//#endregion\n\n//#region ---- Service ----\n\n/**\n * Entity-backed store for background operations (`Common.BackgroundOperations`).\n * Uses in-memory signals for UI reactivity and optionally persists via {@link AXP_BACKGROUND_OPERATION_ENTITY_STORAGE}.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPBackgroundOperationEntityStoreService {\n private readonly entityStorage = inject(AXP_BACKGROUND_OPERATION_ENTITY_STORAGE, { optional: true });\n\n private readonly completionService = inject(AXPBackgroundOperationCompletionService);\n\n private readonly entityName = axpBackgroundOperationEntityName();\n\n private hydrated = false;\n\n private hydratePromise?: Promise<void>;\n\n private readonly innerStores = new Map<string, ReturnType<typeof createBackgroundOperationStore>>();\n\n //#region ---- Hydration ----\n\n async ensureHydrated(): Promise<void> {\n if (this.hydrated || !this.entityStorage) {\n this.hydrated = true;\n return;\n }\n\n if (!this.hydratePromise) {\n this.hydratePromise = this.hydrateFromEntityStorage();\n }\n\n await this.hydratePromise;\n }\n\n async hasAnyOperationForProviders(providerKeys: readonly string[]): Promise<boolean> {\n await this.ensureHydrated();\n\n if (providerKeys.length === 0) {\n return false;\n }\n\n if (this.entityStorage) {\n const rows = await this.entityStorage.getAll(this.entityName);\n return rows.some((row) => providerKeys.includes(row.providerKey));\n }\n\n return [...this.innerStores.values()].some((store) =>\n store.operations().some((operation) => providerKeys.includes(operation.providerKey)),\n );\n }\n\n //#endregion\n\n //#region ---- Provider stores ----\n\n createProviderStore(providerKey: string): AXPBackgroundOperationProviderStore {\n const inner = this.getOrCreateInnerStore(providerKey);\n\n return {\n operations: computed(() => inner.operations().filter((operation) => operation.providerKey === providerKey)),\n\n upsert: (operation: AXPBackgroundOperation): void => {\n inner.upsert(operation);\n void this.persistOperation(operation);\n },\n\n patch: (operationId: string, patch: Partial<AXPBackgroundOperation>): void => {\n const previous = inner.find(operationId);\n inner.patch(operationId, patch);\n const operation = inner.find(operationId);\n if (!operation) {\n return;\n }\n\n if (this.completionService.shouldAutoFinish(previous?.status, operation)) {\n void this.completionService.notifyAndRemove(operation, () => {\n inner.remove(operationId);\n void this.deleteOperation(operationId);\n });\n return;\n }\n\n if (this.completionService.shouldNotifyFailure(previous?.status, operation)) {\n void this.completionService.notifyFailure(operation);\n }\n\n void this.persistOperation(operation);\n },\n\n find: (operationId: string): AXPBackgroundOperation | undefined => inner.find(operationId),\n\n remove: (operationId: string): void => {\n inner.remove(operationId);\n void this.deleteOperation(operationId);\n },\n };\n }\n\n /** All operations across providers (post-hydration). */\n readonly allOperations = computed(() =>\n [...this.innerStores.values()].flatMap((store) => store.operations()),\n );\n\n //#endregion\n\n //#region ---- Entity persistence ----\n\n private async hydrateFromEntityStorage(): Promise<void> {\n if (!this.entityStorage) {\n this.hydrated = true;\n return;\n }\n\n const rows = await this.entityStorage.getAll(this.entityName);\n\n for (const row of rows) {\n const operation = axpBackgroundOperationFromEntityModel(row);\n\n if (axpIsCompletedBackgroundOperationStatus(operation.status)) {\n void this.deleteOperation(operation.id);\n continue;\n }\n\n this.getOrCreateInnerStore(operation.providerKey).upsert(operation);\n }\n\n this.hydrated = true;\n }\n\n private async persistOperation(operation: AXPBackgroundOperation): Promise<void> {\n if (!this.entityStorage) {\n return;\n }\n\n try {\n await this.entityStorage.upsertOne(this.entityName, axpBackgroundOperationToEntityModel(operation));\n } catch (error: unknown) {\n console.warn('Failed to persist background operation entity', operation.id, error);\n }\n }\n\n private async deleteOperation(operationId: string): Promise<void> {\n if (!this.entityStorage) {\n return;\n }\n\n try {\n await this.entityStorage.deleteOne(this.entityName, operationId);\n } catch (error: unknown) {\n console.warn('Failed to delete background operation entity', operationId, error);\n }\n }\n\n private getOrCreateInnerStore(providerKey: string): ReturnType<typeof createBackgroundOperationStore> {\n let store = this.innerStores.get(providerKey);\n if (!store) {\n store = createBackgroundOperationStore();\n this.innerStores.set(providerKey, store);\n }\n return store;\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type {\n AXPBackgroundOperationCapabilities,\n AXPBackgroundOperationError,\n AXPBackgroundOperationFailurePolicy,\n AXPBackgroundOperationStatus,\n} from '../../background-operation.types';\n\n//#endregion\n\n//#region ---- Entity model ----\n\n/** Persisted row shape for {@link axpBackgroundOperationEntityName}. */\nexport interface AXPBackgroundOperationEntityModel {\n id: string;\n providerKey: string;\n title: string;\n status: AXPBackgroundOperationStatus;\n progress?: number;\n estimatedDurationMs?: number;\n statusText?: string;\n currentStep?: string;\n createdAt: string;\n startedAt?: string;\n completedAt?: string;\n capabilities: AXPBackgroundOperationCapabilities;\n failurePolicy: AXPBackgroundOperationFailurePolicy;\n error?: AXPBackgroundOperationError;\n data?: Record<string, unknown>;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXPEntity } from '@acorex-platform/framework-shared/entity';\nimport { AXPBackgroundOperationRootConfig } from '../../background-operation.const';\n\n//#endregion\n\n//#region ---- Entity factory ----\n\n/**\n * Storage-only entity for background-operation tray rows (`Common.BackgroundOperations`).\n * No master UI — persisted through {@link AXPEntityStorageService}.\n */\nexport async function backgroundOperationEntityFactory(): Promise<AXPEntity | null> {\n const { module, entities } = AXPBackgroundOperationRootConfig;\n\n return {\n module: module.name,\n name: entities.backgroundOperation.name,\n title: entities.backgroundOperation.title,\n icon: entities.backgroundOperation.icon,\n formats: {\n individual: entities.backgroundOperation.title,\n plural: entities.backgroundOperation.titlePlural,\n },\n properties: [\n {\n name: 'id',\n title: 'ID',\n schema: { dataType: 'string' },\n },\n {\n name: 'providerKey',\n title: 'Provider key',\n schema: { dataType: 'string' },\n },\n {\n name: 'title',\n title: '@general:terms.common.title',\n schema: { dataType: 'string' },\n },\n {\n name: 'status',\n title: '@general:terms.common.status',\n schema: { dataType: 'string' },\n },\n {\n name: 'progress',\n title: 'Progress',\n schema: { dataType: 'number' },\n },\n {\n name: 'estimatedDurationMs',\n title: 'Estimated duration (ms)',\n schema: { dataType: 'number' },\n },\n {\n name: 'statusText',\n title: 'Status text',\n schema: { dataType: 'string' },\n },\n {\n name: 'currentStep',\n title: 'Current step',\n schema: { dataType: 'string' },\n },\n {\n name: 'createdAt',\n title: '@general:terms.common.created-at',\n schema: { dataType: 'dateTime' },\n },\n {\n name: 'startedAt',\n title: 'Started at',\n schema: { dataType: 'dateTime' },\n },\n {\n name: 'completedAt',\n title: 'Completed at',\n schema: { dataType: 'dateTime' },\n },\n {\n name: 'capabilities',\n title: 'Capabilities',\n schema: { dataType: 'object' },\n },\n {\n name: 'failurePolicy',\n title: 'Failure policy',\n schema: { dataType: 'object' },\n },\n {\n name: 'error',\n title: 'Error',\n schema: { dataType: 'object' },\n },\n {\n name: 'data',\n title: 'Payload',\n schema: { dataType: 'object' },\n },\n ],\n };\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { InjectionToken } from '@angular/core';\nimport type { AXPExecuteCommand } from '@acorex-platform/framework-shared/core';\nimport type { AXPBackgroundOperation, AXPBackgroundOperationCta } from './background-operation.types';\n\n//#endregion\n\n//#region ---- Token ----\n\nexport const AXP_BACKGROUND_OPERATION_HANDLERS = new InjectionToken<AXPBackgroundOperationHandler[]>(\n 'AXP_BACKGROUND_OPERATION_HANDLERS',\n);\n\n//#endregion\n\n//#region ---- Handler contract ----\n\n/**\n * Handles user interactions for background operations (e.g. navigate on click).\n * Register one handler per {@link AXPBackgroundOperation.providerKey}.\n */\nexport abstract class AXPBackgroundOperationHandler {\n abstract readonly providerKey: string;\n\n abstract execute(command: AXPExecuteCommand, operation: AXPBackgroundOperation): Promise<void>;\n\n /** Optional primary CTA for completed-tab rows (text, icon, color, command). */\n resolveCta?(operation: AXPBackgroundOperation): AXPBackgroundOperationCta | null;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { InjectionToken, Signal } from '@angular/core';\nimport type {\n AXPBackgroundOperation,\n AXPBackgroundOperationCreateRequest,\n} from './background-operation.types';\n\n//#endregion\n\n//#region ---- Token ----\n\nexport const AXP_BACKGROUND_OPERATION_PROVIDERS = new InjectionToken<AXPBackgroundOperationProvider[]>(\n 'AXP_BACKGROUND_OPERATION_PROVIDERS',\n);\n\n//#endregion\n\n//#region ---- Provider contract ----\n\n/**\n * Registers a source of background operations (multi-provider).\n * Each feature module or mock can contribute one provider per domain key.\n */\nexport abstract class AXPBackgroundOperationProvider {\n abstract readonly key: string;\n abstract readonly operations: Signal<readonly AXPBackgroundOperation[]>;\n\n abstract create(request: AXPBackgroundOperationCreateRequest): Promise<AXPBackgroundOperation>;\n abstract cancel(operationId: string): Promise<void>;\n\n /** Optional — only when {@link AXPBackgroundOperationCapabilities.pausable} is true. */\n pause?(operationId: string): Promise<void>;\n /** Optional — only when {@link AXPBackgroundOperationCapabilities.resumable} is true. */\n resume?(operationId: string): Promise<void>;\n /** Optional — only when {@link AXPBackgroundOperationCapabilities.retryable} is true. */\n retry?(operationId: string): Promise<void>;\n /** Optional — removes completed/failed operations from the tray. */\n dismiss?(operationId: string): Promise<void>;\n /** Optional — bulk dismiss (one server call). Falls back to per-id {@link dismiss}. */\n dismissMany?(operationIds: readonly string[]): Promise<void>;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { computed, inject, Injectable, signal } from '@angular/core';\nimport type {\n AXPBackgroundOperation,\n AXPBackgroundOperationActionKey,\n AXPBackgroundOperationCta,\n AXPBackgroundOperationCreateRequest,\n} from './background-operation.types';\nimport {\n AXP_BACKGROUND_OPERATION_HANDLERS,\n AXPBackgroundOperationHandler,\n} from './background-operation.handler';\nimport {\n AXP_BACKGROUND_OPERATION_PROVIDERS,\n AXPBackgroundOperationProvider,\n} from './background-operation.provider';\nimport type { AXPExecuteCommand } from '@acorex-platform/framework-shared/core';\nimport {\n axpIsActiveBackgroundOperationStatus,\n axpIsCompletedBackgroundOperationStatus,\n axpIsTrayVisibleBackgroundOperation,\n} from './background-operation.util';\n\n//#endregion\n\n//#region ---- Service ----\n\n@Injectable({ providedIn: 'root' })\nexport class AXPBackgroundOperationService {\n //#region ---- Dependencies ----\n\n private readonly providers = inject(AXP_BACKGROUND_OPERATION_PROVIDERS, { optional: true }) ?? [];\n\n private readonly handlers = inject(AXP_BACKGROUND_OPERATION_HANDLERS, { optional: true }) ?? [];\n\n //#endregion\n\n //#region ---- State ----\n\n private readonly busy = signal(false);\n\n readonly loading = this.busy.asReadonly();\n\n readonly operations = computed<readonly AXPBackgroundOperation[]>(() =>\n this.providers.flatMap((provider) => provider.operations()),\n );\n\n readonly activeCount = computed(\n () => this.operations().filter((operation) => axpIsActiveBackgroundOperationStatus(operation.status)).length,\n );\n\n readonly failedCount = computed(\n () => this.operations().filter((operation) => operation.status === 'failed').length,\n );\n\n readonly trayVisibleCount = computed(\n () => this.operations().filter((operation) => axpIsTrayVisibleBackgroundOperation(operation)).length,\n );\n\n readonly retainedCompletedCount = computed(\n () =>\n this.operations().filter(\n (operation) =>\n operation.capabilities.keepInTrayAfterComplete === true &&\n axpIsCompletedBackgroundOperationStatus(operation.status),\n ).length,\n );\n\n //#endregion\n\n //#region ---- Queries ----\n\n getAvailableActions(operation: AXPBackgroundOperation): AXPBackgroundOperationActionKey[] {\n const actions: AXPBackgroundOperationActionKey[] = [];\n const { capabilities, status } = operation;\n\n if (capabilities.cancellable && (status === 'queued' || status === 'running' || status === 'paused')) {\n actions.push('cancel');\n }\n if (capabilities.pausable && status === 'running') {\n actions.push('pause');\n }\n if (capabilities.resumable && status === 'paused') {\n actions.push('resume');\n }\n if (capabilities.retryable && status === 'failed') {\n actions.push('retry');\n }\n if (\n capabilities.keepInTrayAfterComplete === true &&\n (status === 'completed' || status === 'failed' || status === 'cancelled')\n ) {\n actions.push('dismiss');\n }\n\n return actions;\n }\n\n //#endregion\n\n //#region ---- Commands ----\n\n async create(providerKey: string, request: AXPBackgroundOperationCreateRequest): Promise<AXPBackgroundOperation> {\n const provider = this.resolveProvider(providerKey);\n return this.run(() => provider.create(request));\n }\n\n async cancel(operationId: string): Promise<void> {\n const { provider, operation } = this.resolveOperation(operationId);\n if (!operation.capabilities.cancellable) {\n throw new Error(`Operation ${operationId} cannot be cancelled`);\n }\n await this.run(() => provider.cancel(operationId));\n }\n\n async pause(operationId: string): Promise<void> {\n const { provider, operation } = this.resolveOperation(operationId);\n if (!operation.capabilities.pausable || !provider.pause) {\n throw new Error(`Operation ${operationId} cannot be paused`);\n }\n await this.run(() => provider.pause!(operationId));\n }\n\n async resume(operationId: string): Promise<void> {\n const { provider, operation } = this.resolveOperation(operationId);\n if (!operation.capabilities.resumable || !provider.resume) {\n throw new Error(`Operation ${operationId} cannot be resumed`);\n }\n await this.run(() => provider.resume!(operationId));\n }\n\n async retry(operationId: string): Promise<void> {\n const { provider, operation } = this.resolveOperation(operationId);\n if (!operation.capabilities.retryable || !provider.retry) {\n throw new Error(`Operation ${operationId} cannot be retried`);\n }\n await this.run(() => provider.retry!(operationId));\n }\n\n async dismiss(operationId: string): Promise<void> {\n const { provider } = this.resolveOperation(operationId);\n if (provider.dismiss) {\n await this.run(() => provider.dismiss!(operationId));\n return;\n }\n await this.run(() => provider.cancel(operationId));\n }\n\n /**\n * Dismiss many completed rows. Groups by provider and prefers {@link AXPBackgroundOperationProvider.dismissMany}.\n */\n async dismissMany(operationIds: readonly string[]): Promise<void> {\n const ids = [...new Set(operationIds.map((id) => id?.trim()).filter(Boolean))];\n if (ids.length === 0) {\n return;\n }\n\n const byProvider = new Map<string, string[]>();\n for (const operationId of ids) {\n const { provider } = this.resolveOperation(operationId);\n const group = byProvider.get(provider.key) ?? [];\n group.push(operationId);\n byProvider.set(provider.key, group);\n }\n\n for (const [providerKey, providerIds] of byProvider) {\n const provider = this.resolveProvider(providerKey);\n if (provider.dismissMany) {\n await this.run(() => provider.dismissMany!(providerIds));\n continue;\n }\n for (const operationId of providerIds) {\n await this.dismiss(operationId);\n }\n }\n }\n\n hasClickHandler(operation: AXPBackgroundOperation): boolean {\n return (\n operation.capabilities.clickable &&\n this.handlers.some((handler) => handler.providerKey === operation.providerKey)\n );\n }\n\n getCta(operation: AXPBackgroundOperation): AXPBackgroundOperationCta | null {\n const handler = this.resolveHandler(operation.providerKey);\n if (!handler?.resolveCta) {\n return null;\n }\n return handler.resolveCta(operation);\n }\n\n async executeCommand(operationId: string, command: AXPExecuteCommand): Promise<void> {\n const { operation } = this.resolveOperation(operationId);\n const handler = this.resolveHandler(operation.providerKey);\n if (!handler) {\n return;\n }\n await this.run(() => handler.execute(command, operation));\n }\n\n async executeClick(operationId: string): Promise<void> {\n await this.executeCommand(operationId, { name: 'click' });\n }\n\n async runAction(operationId: string, action: AXPBackgroundOperationActionKey): Promise<void> {\n switch (action) {\n case 'cancel':\n await this.cancel(operationId);\n break;\n case 'pause':\n await this.pause(operationId);\n break;\n case 'resume':\n await this.resume(operationId);\n break;\n case 'retry':\n await this.retry(operationId);\n break;\n case 'dismiss':\n await this.dismiss(operationId);\n break;\n default:\n break;\n }\n }\n\n //#endregion\n\n //#region ---- Resolution ----\n\n private resolveHandler(providerKey: string): AXPBackgroundOperationHandler | undefined {\n return this.handlers.find((handler) => handler.providerKey === providerKey);\n }\n\n private resolveProvider(providerKey: string): AXPBackgroundOperationProvider {\n const provider = this.providers.find((item) => item.key === providerKey);\n if (!provider) {\n throw new Error(`Background operation provider \"${providerKey}\" is not registered`);\n }\n return provider;\n }\n\n private resolveOperation(operationId: string): {\n provider: AXPBackgroundOperationProvider;\n operation: AXPBackgroundOperation;\n } {\n for (const provider of this.providers) {\n const operation = provider.operations().find((item) => item.id === operationId);\n if (operation) {\n return { provider, operation };\n }\n }\n throw new Error(`Background operation \"${operationId}\" was not found`);\n }\n\n private async run<T>(fn: () => Promise<T>): Promise<T> {\n this.busy.set(true);\n try {\n return await fn();\n } finally {\n this.busy.set(false);\n }\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\nimport { AXTranslationModule } from '@acorex/core/translation';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport type StateMode = 'empty' | 'error' | 'loading' | 'warning' | 'info' | 'success';\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axp-state-message',\n imports: [CommonModule, AXTranslationModule],\n templateUrl: './state-message.component.html',\n styleUrls: ['./state-message.component.css'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXPStateMessageComponent {\n mode = input<StateMode>('empty');\n icon = input<string>('');\n title = input<string>('');\n description = input<string>('');\n titleParams = input<Record<string, unknown>>({});\n descriptionParams = input<Record<string, unknown>>({});\n look = input<'default' | 'compact' | 'minimal'>('default');\n}\n\n//#endregion\n","<div class=\"axp-state-message\" [attr.data-mode]=\"mode()\" [attr.data-look]=\"look()\">\n @if (icon()) {\n <!-- ----- Empty / status icon ----- -->\n <div class=\"__icon\">\n <i [class]=\"icon()\"></i>\n </div>\n }\n <div class=\"__content\">\n @if (title()) {\n <!-- ----- Translated title ----- -->\n <h3 class=\"__title\">{{ title() | translate: { params: titleParams() } | async }}</h3>\n }\n @if (description()) {\n <!-- ----- Translated description ----- -->\n <p class=\"__description\">{{ description() | translate: { params: descriptionParams() } | async }}</p>\n }\n <div class=\"__actions\">\n <ng-content select=\"[slot=actions]\"></ng-content>\n </div>\n </div>\n</div>\n","//#region ----- Imports -----\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXProgressBarModule } from '@acorex/components/progress-bar';\nimport { AXFormatModule } from '@acorex/core/format';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { isNumber } from 'lodash-es';\nimport { AXPBackgroundOperationService } from '../background-operation.service';\nimport {\n axpBackgroundOperationDisplayTime,\n axpBackgroundOperationDurationMs,\n axpBackgroundOperationRemainingMs,\n axpBackgroundOperationStatusTextParams,\n axpCoerceBackgroundOperationDate,\n axpFormatBackgroundOperationDurationMs,\n axpIsActiveBackgroundOperationStatus,\n axpIsBackgroundOperationI18nText,\n axpIsInProgressPanelBackgroundOperation,\n type AXPBackgroundOperationPanelTabKey,\n} from '../background-operation.util';\nimport type {\n AXPBackgroundOperation,\n AXPBackgroundOperationActionKey,\n AXPBackgroundOperationCta,\n} from '../background-operation.types';\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axp-background-operation-item',\n templateUrl: './background-operation-item.component.html',\n styleUrls: ['./background-operation-item.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n CommonModule,\n AXButtonModule,\n AXDecoratorModule,\n AXProgressBarModule,\n AXFormatModule,\n AXTranslationModule,\n ],\n})\nexport class AXPBackgroundOperationItemComponent {\n //#region ----- Services & Dependencies -----\n\n private readonly operationService = inject(AXPBackgroundOperationService);\n private readonly translateService = inject(AXTranslationService);\n\n //#endregion\n\n //#region ----- Inputs & Outputs -----\n\n data = input.required<AXPBackgroundOperation>();\n\n tabKey = input.required<AXPBackgroundOperationPanelTabKey>();\n\n actionCompleted = output<void>();\n\n itemClicked = output<void>();\n\n //#endregion\n\n //#region ----- State -----\n\n protected readonly pendingAction = signal<AXPBackgroundOperationActionKey | 'click' | null>(null);\n protected readonly ctaDisplayText = signal('');\n\n private ctaTextRequestId = 0;\n\n //#endregion\n\n //#region ----- Computed -----\n\n protected readonly isInProgressTab = computed(() => this.tabKey() === 'in-progress');\n\n protected readonly isCompletedTab = computed(() => this.tabKey() === 'completed');\n\n protected readonly statusClass = computed(() => `--${this.data().status}`);\n\n protected readonly statusIcon = computed(() => {\n switch (this.data().status) {\n case 'queued':\n return 'fa-light fa-clock';\n case 'running':\n return 'fa-light fa-spinner fa-spin';\n case 'paused':\n return 'fa-light fa-pause';\n case 'completed':\n return 'fa-light fa-circle-check';\n case 'failed':\n return 'fa-light fa-circle-exclamation';\n case 'cancelled':\n return 'fa-light fa-ban';\n default:\n return 'fa-light fa-list-check';\n }\n });\n\n protected readonly progressColor = computed(() => {\n switch (this.data().status) {\n case 'failed':\n return 'danger';\n case 'paused':\n return 'warning';\n case 'completed':\n return 'success';\n default:\n return 'primary';\n }\n });\n\n protected readonly showProgressBar = computed(() => {\n const operation = this.data();\n return (\n this.isInProgressTab() &&\n operation.capabilities.supportsProgress === true &&\n axpIsActiveBackgroundOperationStatus(operation.status)\n );\n });\n\n protected readonly isIndeterminateProgress = computed(() => {\n const operation = this.data();\n return operation.capabilities.supportsProgress === true && !isNumber(operation.progress);\n });\n\n protected readonly progressMode = computed(() =>\n this.isIndeterminateProgress() ? 'indeterminate' : 'determinate',\n );\n\n protected readonly progressValue = computed(() => {\n const progress = this.data().progress;\n if (isNumber(progress)) {\n return Math.min(Math.max(progress, 0), 100);\n }\n return 0;\n });\n\n protected readonly showProgressPercent = computed(\n () => this.showProgressBar() && !this.isIndeterminateProgress(),\n );\n\n protected readonly showError = computed(() => this.data().status === 'failed' && !!this.data().error?.message);\n\n protected readonly actions = computed(() => this.operationService.getAvailableActions(this.data()));\n\n protected readonly cta = computed(() =>\n this.isCompletedTab() ? this.operationService.getCta(this.data()) : null,\n );\n\n protected readonly showCancelButton = computed(\n () => this.isInProgressTab() && this.data().capabilities.cancellable && this.actions().includes('cancel'),\n );\n\n protected readonly showPauseButton = computed(\n () =>\n this.isInProgressTab() &&\n !this.showCancelButton() &&\n this.data().capabilities.pausable &&\n this.actions().includes('pause'),\n );\n\n protected readonly showResumeButton = computed(\n () => this.isInProgressTab() && this.data().capabilities.resumable && this.actions().includes('resume'),\n );\n\n protected readonly showDismissButton = computed(\n () => this.isCompletedTab() && this.actions().includes('dismiss'),\n );\n\n protected readonly showActionColumn = computed(\n () => this.showCancelButton() || this.showPauseButton() || this.showResumeButton(),\n );\n\n protected readonly showCompletedActionRow = computed(\n () => this.isCompletedTab() && (this.cta() !== null || this.showDismissButton()),\n );\n\n protected readonly statusTextKey = computed(() => {\n const statusText = this.data().statusText?.trim();\n return axpIsBackgroundOperationI18nText(statusText) ? statusText! : null;\n });\n\n protected readonly statusTextParams = computed(() => axpBackgroundOperationStatusTextParams(this.data()));\n\n protected readonly plainStatusText = computed(() => {\n const statusText = this.data().statusText?.trim();\n if (!statusText || axpIsBackgroundOperationI18nText(statusText)) {\n return null;\n }\n return statusText;\n });\n\n protected readonly errorMessageKey = computed(() => {\n const message = this.data().error?.message?.trim();\n return axpIsBackgroundOperationI18nText(message) ? message! : null;\n });\n\n protected readonly plainErrorMessage = computed(() => {\n const message = this.data().error?.message?.trim();\n if (!message || axpIsBackgroundOperationI18nText(message)) {\n return null;\n }\n return message;\n });\n\n protected readonly showStepLine = computed(() => {\n const operation = this.data();\n if (!operation.currentStep?.trim()) {\n return false;\n }\n const statusText = operation.statusText?.trim() ?? '';\n return !(\n statusText.includes('layout-line-single') ||\n statusText.includes('progress.layout')\n );\n });\n\n protected readonly displayTime = computed(() => {\n const operation = this.data();\n const completedAt = axpCoerceBackgroundOperationDate(operation.completedAt);\n if (completedAt && !axpIsInProgressPanelBackgroundOperation(operation)) {\n return completedAt;\n }\n return axpBackgroundOperationDisplayTime(operation) ?? operation.createdAt;\n });\n\n protected readonly showDate = computed(() => !!this.displayTime());\n\n /** Absolute timestamp for locale-aware `format` pipe (`datetime` / `short`). */\n protected readonly timingDatetime = computed((): Date | null => {\n const operation = this.data();\n if (axpIsActiveBackgroundOperationStatus(operation.status)) {\n return (\n axpBackgroundOperationDisplayTime(operation) ??\n axpCoerceBackgroundOperationDate(operation.createdAt)\n );\n }\n return axpCoerceBackgroundOperationDate(operation.completedAt);\n });\n\n protected readonly timingDuration = computed((): string | null => {\n const operation = this.data();\n if (axpIsActiveBackgroundOperationStatus(operation.status)) {\n if (operation.capabilities.supportsEstimate !== true) {\n return null;\n }\n const remainingMs = axpBackgroundOperationRemainingMs(operation);\n return remainingMs !== null ? axpFormatBackgroundOperationDurationMs(remainingMs) : null;\n }\n const durationMs = axpBackgroundOperationDurationMs(operation);\n return durationMs !== null ? axpFormatBackgroundOperationDurationMs(durationMs) : null;\n });\n\n protected readonly showCompletedSummaryLine = computed(() => {\n if (!this.isCompletedTab()) {\n return false;\n }\n return !!this.statusTextKey() || !!this.plainStatusText() || !!this.timingDatetime();\n });\n\n protected readonly showEstimateLine = computed(\n () =>\n this.isInProgressTab() &&\n this.data().capabilities.supportsEstimate === true &&\n !!this.timingDuration(),\n );\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n constructor() {\n effect(() => {\n const cta = this.cta();\n const requestId = ++this.ctaTextRequestId;\n\n if (!cta) {\n this.ctaDisplayText.set('');\n return;\n }\n\n if (axpIsBackgroundOperationI18nText(cta.text)) {\n void this.translateService.translateAsync(cta.text).then((text) => {\n if (requestId === this.ctaTextRequestId) {\n this.ctaDisplayText.set(text);\n }\n });\n return;\n }\n\n this.ctaDisplayText.set(cta.text);\n });\n }\n\n //#endregion\n\n //#region ----- Action presentation -----\n\n protected actionLabelKey(action: AXPBackgroundOperationActionKey): string {\n return `@general:background-operation.actions.${action}`;\n }\n\n protected isCtaDisabled(cta: AXPBackgroundOperationCta): boolean {\n const pending = this.pendingAction();\n if (cta.command.name === 'click') {\n return pending !== null && pending !== 'click';\n }\n if (this.isBackgroundActionKey(cta.command.name)) {\n return this.isActionDisabled(cta.command.name) || this.isActionLoading(cta.command.name);\n }\n return pending !== null;\n }\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n protected async onCtaClick(cta: AXPBackgroundOperationCta): Promise<void> {\n if (this.pendingAction()) {\n return;\n }\n\n if (cta.command.name === 'click') {\n this.pendingAction.set('click');\n try {\n await this.operationService.executeClick(this.data().id);\n this.itemClicked.emit();\n this.actionCompleted.emit();\n } catch (error) {\n console.error('Background operation CTA failed:', error);\n } finally {\n this.pendingAction.set(null);\n }\n return;\n }\n\n if (this.isBackgroundActionKey(cta.command.name)) {\n await this.onAction(cta.command.name);\n }\n }\n\n protected async onAction(action: AXPBackgroundOperationActionKey): Promise<void> {\n if (this.pendingAction()) {\n return;\n }\n this.pendingAction.set(action);\n try {\n await this.operationService.runAction(this.data().id, action);\n this.actionCompleted.emit();\n } catch (error) {\n console.error('Background operation action failed:', error);\n } finally {\n this.pendingAction.set(null);\n }\n }\n\n protected isActionDisabled(action: AXPBackgroundOperationActionKey): boolean {\n const pending = this.pendingAction();\n return pending !== null && pending !== action;\n }\n\n protected isActionLoading(action: AXPBackgroundOperationActionKey): boolean {\n return this.pendingAction() === action;\n }\n\n //#endregion\n\n //#region ----- Helpers -----\n\n private isBackgroundActionKey(value: string): value is AXPBackgroundOperationActionKey {\n return value === 'cancel' || value === 'pause' || value === 'resume' || value === 'retry' || value === 'dismiss';\n }\n\n //#endregion\n}\n\n//#endregion\n","<article class=\"operation-item\" [class]=\"statusClass()\">\n <ax-icon class=\"operation-item__status-icon\" [class]=\"statusClass()\">\n <i [class]=\"statusIcon()\"></i>\n </ax-icon>\n\n <div class=\"operation-item__content\">\n <div class=\"operation-item__headline\">\n <h3 class=\"operation-item__title\">{{ data().title }}</h3>\n </div>\n\n @if (isCompletedTab()) {\n @if (showCompletedSummaryLine()) {\n <!-- ----- Status merged with finished time and duration ----- -->\n <p class=\"operation-item__status-text\">\n @if (statusTextKey(); as key) {\n <span>{{ key | translate: { params: statusTextParams() } | async }}</span>\n } @else if (plainStatusText()) {\n <span>{{ plainStatusText() }}</span>\n }\n @if (timingDatetime(); as finishedAt) {\n @if (statusTextKey() || plainStatusText()) {\n <span class=\"operation-item__status-separator\" aria-hidden=\"true\"> · </span>\n }\n <!--->\n <!-- ----- Locale-aware finished datetime via format pipe ----- -->\n @if ((finishedAt | format: 'datetime' : 'short' | async); as datetime) {\n <span>{{\n '@general:background-operation.timing.finished-at'\n | translate: { params: { datetime } }\n | async\n }}</span>\n }\n <!--->\n <!-- ----- Compact duration when available ----- -->\n @if (timingDuration(); as duration) {\n <span class=\"operation-item__status-separator\" aria-hidden=\"true\"> · </span>\n <span>{{\n '@general:background-operation.timing.duration'\n | translate: { params: { duration } }\n | async\n }}</span>\n }\n }\n </p>\n }\n } @else {\n @if (statusTextKey(); as key) {\n <p class=\"operation-item__status-text\">\n {{ key | translate: { params: statusTextParams() } | async }}\n </p>\n } @else if (plainStatusText()) {\n <p class=\"operation-item__status-text\">\n {{ plainStatusText() }}\n </p>\n }\n }\n\n @if (showStepLine()) {\n <span class=\"operation-item__step\">\n {{ '@general:background-operation.step' | translate | async }}\n {{ data().currentStep }}\n </span>\n }\n\n @if (timingDatetime(); as startedAt) {\n <!--->\n <!-- ----- Started time and estimate for in-progress tasks ----- -->\n @if (isInProgressTab()) {\n <div class=\"operation-item__timing\">\n <!-- ----- Locale-aware started datetime via format pipe ----- -->\n @if ((startedAt | format: 'datetime' : 'short' | async); as datetime) {\n <span>\n {{\n '@general:background-operation.timing.started-at'\n | translate: { params: { datetime } }\n | async\n }}\n </span>\n }\n <!--->\n <!-- ----- ETA when the task type supports estimates ----- -->\n @if (showEstimateLine()) {\n <span>\n {{\n '@general:background-operation.timing.estimate'\n | translate: { params: { estimate: timingDuration()! } }\n | async\n }}\n </span>\n }\n </div>\n }\n }\n\n @if (showCompletedActionRow()) {\n <div class=\"ax-xs operation-item__footer-actions\">\n @if (cta(); as primaryCta) {\n <!-- ----- Handler-defined CTA on completed tab ----- -->\n <ax-button\n class=\"operation-item__action-btn\"\n look=\"solid\"\n [color]=\"primaryCta.color ?? 'primary'\"\n [text]=\"ctaDisplayText()\"\n [disabled]=\"isCtaDisabled(primaryCta)\"\n (onClick)=\"onCtaClick(primaryCta)\"\n >\n @if (primaryCta.icon) {\n <ax-prefix>\n <ax-icon><i [class]=\"primaryCta.icon\"></i></ax-icon>\n </ax-prefix>\n }\n </ax-button>\n }\n @if (showDismissButton()) {\n <!-- ----- Close / dismiss completed rows ----- -->\n <ax-button\n class=\"operation-item__action-btn\"\n look=\"solid\"\n color=\"default\"\n [text]=\"(actionLabelKey('dismiss') | translate | async) ?? ''\"\n [disabled]=\"isActionDisabled('dismiss') || isActionLoading('dismiss')\"\n (onClick)=\"onAction('dismiss')\"\n ></ax-button>\n }\n </div>\n }\n\n @if (showProgressBar()) {\n <div class=\"operation-item__progress-row\">\n @if (showProgressPercent()) {\n <span class=\"operation-item__progress-label\">\n {{\n '@general:background-operation.progress-percent'\n | translate: { params: { percent: progressValue() } }\n | async\n }}\n </span>\n }\n <ax-progress-bar\n class=\"operation-item__progress\"\n [progress]=\"progressValue()\"\n [mode]=\"progressMode()\"\n [color]=\"progressColor()\"\n [style.height.px]=\"4\"\n ></ax-progress-bar>\n </div>\n }\n\n @if (showError()) {\n @if (errorMessageKey(); as errorKey) {\n <p class=\"operation-item__error\" role=\"alert\">\n {{ errorKey | translate | async }}\n </p>\n } @else if (plainErrorMessage()) {\n <p class=\"operation-item__error\" role=\"alert\">\n {{ plainErrorMessage() }}\n </p>\n }\n }\n </div>\n\n @if (showDate() || showActionColumn()) {\n <div class=\"operation-item__aside\">\n @if (showDate()) {\n <span class=\"operation-item__time\">{{ displayTime() | format: 'timeleft' | async }}</span>\n }\n @if (showActionColumn()) {\n <div class=\"operation-item__actions\" (click)=\"$event.stopPropagation()\">\n @if (isInProgressTab()) {\n @if (showCancelButton()) {\n <!-- ----- Cancel for in-progress cancellable tasks ----- -->\n <ax-button\n class=\"ax-xs operation-item__action-btn\"\n look=\"outline\"\n color=\"danger\"\n [text]=\"(actionLabelKey('cancel') | translate | async) ?? ''\"\n [disabled]=\"isActionDisabled('cancel') || isActionLoading('cancel')\"\n (onClick)=\"onAction('cancel')\"\n ></ax-button>\n }\n @if (showPauseButton()) {\n <!-- ----- Pause when supported and no cancel is shown ----- -->\n <ax-button\n class=\"ax-xs operation-item__action-btn\"\n look=\"outline\"\n color=\"default\"\n [text]=\"(actionLabelKey('pause') | translate | async) ?? ''\"\n [disabled]=\"isActionDisabled('pause') || isActionLoading('pause')\"\n (onClick)=\"onAction('pause')\"\n ></ax-button>\n }\n @if (showResumeButton()) {\n <!-- ----- Resume for paused tasks ----- -->\n <ax-button\n class=\"ax-xs operation-item__action-btn\"\n look=\"outline\"\n color=\"primary\"\n [text]=\"(actionLabelKey('resume') | translate | async) ?? ''\"\n [disabled]=\"isActionDisabled('resume') || isActionLoading('resume')\"\n (onClick)=\"onAction('resume')\"\n ></ax-button>\n }\n }\n </div>\n }\n </div>\n }\n</article>\n","//#region ----- Imports -----\n\nimport { AXBadgeModule } from '@acorex/components/badge';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXTabsComponent, AXTabsModule, type AXTabStripChangedEvent } from '@acorex/components/tabs';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPStateMessageComponent } from '../../state-message';\nimport { CommonModule } from '@angular/common';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n Injector,\n output,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AXPBackgroundOperationService } from '../background-operation.service';\nimport type { AXPBackgroundOperation, AXPBackgroundOperationStatus } from '../background-operation.types';\nimport {\n axpIsCompletedPanelBackgroundOperation,\n axpIsInProgressPanelBackgroundOperation,\n axpIsTrayVisibleBackgroundOperation,\n type AXPBackgroundOperationPanelTabKey,\n} from '../background-operation.util';\nimport { AXPBackgroundOperationItemComponent } from './background-operation-item.component';\n\n//#endregion\n\n//#region ----- Sort priority -----\n\nconst STATUS_SORT_PRIORITY: Record<AXPBackgroundOperationStatus, number> = {\n running: 0,\n queued: 1,\n paused: 2,\n failed: 3,\n completed: 4,\n cancelled: 5,\n};\n\nfunction sortBackgroundOperations(\n left: AXPBackgroundOperation,\n right: AXPBackgroundOperation,\n): number {\n const priorityDiff = STATUS_SORT_PRIORITY[left.status] - STATUS_SORT_PRIORITY[right.status];\n if (priorityDiff !== 0) {\n return priorityDiff;\n }\n return right.createdAt.getTime() - left.createdAt.getTime();\n}\n\n//#endregion\n\n//#region ----- Types -----\n\ninterface BackgroundOperationTabData {\n key: AXPBackgroundOperationPanelTabKey;\n labelKey: string;\n count: number;\n}\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axp-background-operation-panel',\n templateUrl: './background-operation-panel.component.html',\n styleUrls: ['./background-operation-panel.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n CommonModule,\n AXTranslationModule,\n AXButtonModule,\n AXTabsModule,\n AXDecoratorModule,\n AXBadgeModule,\n AXPStateMessageComponent,\n AXPBackgroundOperationItemComponent,\n ],\n})\nexport class AXPBackgroundOperationPanelComponent {\n //#region ----- Outputs -----\n\n onActiveCountChange = output<number>();\n\n onClosePopover = output<void>();\n\n //#endregion\n\n //#region ----- Services & Dependencies -----\n\n protected readonly operationService = inject(AXPBackgroundOperationService);\n private readonly injector = inject(Injector);\n\n //#endregion\n\n //#region ----- View Queries -----\n\n private readonly tabsHost = viewChild<AXTabsComponent>('tabsHost');\n\n //#endregion\n\n //#region ----- State -----\n\n protected readonly activeTab = signal<AXPBackgroundOperationPanelTabKey>('in-progress');\n\n protected readonly bulkActionPending = signal(false);\n\n //#endregion\n\n //#region ----- Computed -----\n\n protected readonly inProgressOperations = computed(() =>\n [...this.operationService.operations()]\n .filter(\n (operation) =>\n axpIsTrayVisibleBackgroundOperation(operation) &&\n axpIsInProgressPanelBackgroundOperation(operation),\n )\n .sort(sortBackgroundOperations),\n );\n\n protected readonly completedOperations = computed(() =>\n [...this.operationService.operations()]\n .filter((operation) => axpIsCompletedPanelBackgroundOperation(operation))\n .sort(sortBackgroundOperations),\n );\n\n protected readonly cancellableInProgressOperations = computed(() =>\n this.inProgressOperations().filter((operation) =>\n this.operationService.getAvailableActions(operation).includes('cancel'),\n ),\n );\n\n protected readonly dismissibleCompletedOperations = computed(() =>\n this.completedOperations().filter((operation) =>\n this.operationService.getAvailableActions(operation).includes('dismiss'),\n ),\n );\n\n protected readonly showCancelAllButton = computed(\n () => this.activeTab() === 'in-progress' && this.cancellableInProgressOperations().length > 1,\n );\n\n protected readonly showDismissAllButton = computed(\n () => this.activeTab() === 'completed' && this.dismissibleCompletedOperations().length > 1,\n );\n\n protected readonly showCloseButton = computed(\n () => !this.showCancelAllButton() && !this.showDismissAllButton(),\n );\n\n protected readonly tabItems = computed((): BackgroundOperationTabData[] => [\n {\n key: 'in-progress',\n labelKey: '@general:background-operation.tabs.in-progress',\n count: this.inProgressOperations().length,\n },\n {\n key: 'completed',\n labelKey: '@general:background-operation.tabs.completed',\n count: this.completedOperations().length,\n },\n ]);\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n /**\n * Pick In Progress when any running tasks exist; otherwise Completed.\n * Must call `ax-tabs.select` — `[active]` alone does not switch tab content.\n */\n syncDefaultTab(): void {\n const tab: AXPBackgroundOperationPanelTabKey =\n this.inProgressOperations().length > 0 ? 'in-progress' : 'completed';\n this.activeTab.set(tab);\n const index = this.tabItems().findIndex((item) => item.key === tab);\n if (index < 0) {\n return;\n }\n afterNextRender(\n () => {\n this.tabsHost()?.select(index);\n },\n { injector: this.injector },\n );\n }\n\n protected handleTabChange(event: AXTabStripChangedEvent): void {\n const tab = this.tabItems()[event.index];\n if (tab) {\n this.activeTab.set(tab.key);\n }\n }\n\n protected getOperations(tab: AXPBackgroundOperationPanelTabKey): AXPBackgroundOperation[] {\n return tab === 'in-progress' ? this.inProgressOperations() : this.completedOperations();\n }\n\n protected emptyStateForTab(tab: AXPBackgroundOperationPanelTabKey): {\n icon: string;\n titleKey: string;\n descriptionKey: string;\n } {\n if (tab === 'in-progress') {\n return {\n icon: 'fa-regular fa-clock',\n titleKey: '@general:background-operation.empty.in-progress',\n descriptionKey: '@general:background-operation.empty.in-progress-description',\n };\n }\n return {\n icon: 'fa-regular fa-circle-check',\n titleKey: '@general:background-operation.empty.completed',\n descriptionKey: '@general:background-operation.empty.completed-description',\n };\n }\n\n protected onItemActionCompleted(): void {\n this.onActiveCountChange.emit(this.operationService.activeCount());\n }\n\n protected async onCancelAll(): Promise<void> {\n if (this.bulkActionPending()) {\n return;\n }\n\n this.bulkActionPending.set(true);\n try {\n for (const operation of this.cancellableInProgressOperations()) {\n await this.operationService.runAction(operation.id, 'cancel');\n }\n this.onItemActionCompleted();\n } catch (error) {\n console.error('Background operation cancel-all failed:', error);\n } finally {\n this.bulkActionPending.set(false);\n }\n }\n\n protected async onDismissAll(): Promise<void> {\n if (this.bulkActionPending()) {\n return;\n }\n\n this.bulkActionPending.set(true);\n try {\n const ids = this.dismissibleCompletedOperations().map((operation) => operation.id);\n await this.operationService.dismissMany(ids);\n this.onItemActionCompleted();\n } catch (error) {\n console.error('Background operation dismiss-all failed:', error);\n } finally {\n this.bulkActionPending.set(false);\n }\n }\n\n //#endregion\n}\n\n//#endregion\n","<header class=\"operation-panel__header\">\n <h2 class=\"operation-panel__title\">\n {{ '@general:background-operation.panel.title' | translate | async }}\n </h2>\n @if (showCancelAllButton()) {\n <!-- ----- Cancel all cancellable in-progress tasks ----- -->\n <ax-button\n class=\"ax-xs operation-panel__header-action\"\n look=\"blank\"\n color=\"danger\"\n [text]=\"('@general:background-operation.actions.cancel-all' | translate | async) ?? ''\"\n [disabled]=\"bulkActionPending() || operationService.loading()\"\n (onClick)=\"onCancelAll()\"\n ></ax-button>\n }\n @if (showDismissAllButton()) {\n <!-- ----- Dismiss all dismissible completed tasks ----- -->\n <ax-button\n class=\"ax-xs operation-panel__header-action\"\n look=\"blank\"\n color=\"default\"\n [text]=\"('@general:background-operation.actions.dismiss-all' | translate | async) ?? ''\"\n [disabled]=\"bulkActionPending() || operationService.loading()\"\n (onClick)=\"onDismissAll()\"\n ></ax-button>\n }\n <ax-button class=\"ax-xs operation-panel__header-action\" look=\"blank\" [iconOnly]=\"true\" (onClick)=\"onClosePopover.emit()\">\n <ax-icon><i class=\"fa-light fa-xmark \" aria-hidden=\"true\"></i></ax-icon>\n </ax-button>\n</header>\n\n<ax-tabs\n #tabsHost\n [content]=\"tabContent\"\n [look]=\"'with-line'\"\n location=\"bottom\"\n (onActiveTabChanged)=\"handleTabChange($event)\"\n>\n @for (tab of tabItems(); track tab.key) {\n <ax-tab-item [text]=\"(tab.labelKey | translate | async) ?? ''\" [active]=\"activeTab() === tab.key\">\n <ax-suffix>\n @if (tab.count > 0) {\n <ax-badge [color]=\"activeTab() === tab.key ? 'primary' : 'ghost'\" [text]=\"tab.count.toString()\"></ax-badge>\n }\n </ax-suffix>\n <ax-content>\n <div class=\"operation-panel__list\">\n @if (getOperations(tab.key).length === 0) {\n @if (emptyStateForTab(tab.key); as emptyState) {\n <axp-state-message [icon]=\"emptyState.icon\" [title]=\"emptyState.titleKey\" [description]=\"emptyState.descriptionKey\" />\n }\n } @else {\n @for (operation of getOperations(tab.key); track operation.id) {\n <axp-background-operation-item [data]=\"operation\" [tabKey]=\"tab.key\" (actionCompleted)=\"onItemActionCompleted()\" (itemClicked)=\"onClosePopover.emit()\"></axp-background-operation-item>\n }\n }\n </div>\n </ax-content>\n </ax-tab-item>\n }\n</ax-tabs>\n\n<ng-template [axTabContent] #tabContent=\"axTabContent\"></ng-template>\n","//#region ---- Imports ----\n\nimport { AXBadgeModule } from '@acorex/components/badge';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXPopoverComponent, AXPopoverModule } from '@acorex/components/popover';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AXPBackgroundOperationService } from '../background-operation.service';\nimport { AXPBackgroundOperationPanelComponent } from './background-operation-panel.component';\n\n//#endregion\n\n//#region ---- Component ----\n\n@Component({\n selector: 'axp-background-operation-slot',\n templateUrl: './background-operation-slot.component.html',\n styleUrls: ['./background-operation-slot.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [CommonModule, AXBadgeModule, AXDecoratorModule, AXTranslationModule, AXPopoverModule, AXPBackgroundOperationPanelComponent],\n})\nexport class AXPBackgroundOperationSlotComponent {\n //#region ---- Services & Dependencies ----\n\n private readonly operationService = inject(AXPBackgroundOperationService);\n\n //#endregion\n\n //#region ---- View Queries ----\n\n private readonly popover = viewChild(AXPopoverComponent);\n\n //#endregion\n\n //#region ---- Computed ----\n\n protected readonly activeCount = this.operationService.activeCount;\n\n protected readonly failedCount = this.operationService.failedCount;\n\n protected readonly showSlot = computed(() => this.operationService.trayVisibleCount() > 0);\n\n protected readonly slotShowsFailureOnly = computed(\n () => this.operationService.activeCount() === 0 && this.operationService.failedCount() > 0,\n );\n\n protected readonly slotShowsRetainedOnly = computed(\n () =>\n this.operationService.activeCount() === 0 &&\n this.operationService.failedCount() === 0 &&\n this.operationService.retainedCompletedCount() > 0,\n );\n\n protected readonly slotLabelKey = computed(() => {\n if (this.slotShowsFailureOnly()) {\n return '@general:background-operation.slot.failed';\n }\n\n if (this.slotShowsRetainedOnly()) {\n return '@general:background-operation.slot.completed';\n }\n\n return '@general:background-operation.slot.in-progress';\n });\n\n protected readonly badgeDisplay = computed(() => {\n const total = this.slotShowsFailureOnly()\n ? this.failedCount()\n : this.slotShowsRetainedOnly()\n ? this.operationService.retainedCompletedCount()\n : this.activeCount();\n if (total <= 0) {\n return '';\n }\n return total > 50 ? '50+' : total.toString();\n });\n\n //#endregion\n\n //#region ---- Event Handlers ----\n\n protected onTriggerClick(panel: AXPBackgroundOperationPanelComponent): void {\n // Sync before open: popover toggles on the same click; skip when closing.\n if (!this.popover()?.isOpen) {\n panel.syncDefaultTab();\n }\n }\n\n protected onPopoverOpened(panel: AXPBackgroundOperationPanelComponent): void {\n panel.syncDefaultTab();\n }\n\n protected closePopover(): void {\n this.popover()?.close();\n }\n\n //#endregion\n}\n\n//#endregion\n","@if (showSlot()) {\n <!-- ----- Footer tray trigger ----- -->\n <button type=\"button\" class=\"operation-slot__trigger\" #operationTrigger (click)=\"onTriggerClick(panel)\">\n @if (badgeDisplay()) {\n <!-- ----- Count badge ----- -->\n <ax-badge class=\"operation-slot__badge\" [class.--xs]=\"badgeDisplay().length > 2\" color=\"danger\" [text]=\"badgeDisplay()\"></ax-badge>\n }\n @if (slotShowsFailureOnly()) {\n <!-- ----- Failed tasks ----- -->\n <ax-icon class=\"operation-slot__icon\">\n <i class=\"fa-light fa-circle-exclamation\"></i>\n </ax-icon>\n }\n <!--->\n <!-- ----- In-progress spinner (no icon for completed) ----- -->\n @else if (!slotShowsRetainedOnly()) {\n <ax-icon class=\"operation-slot__icon\">\n <i class=\"fa-light fa-spinner fa-spin\"></i>\n </ax-icon>\n }\n <span class=\"operation-slot__text\">\n {{ slotLabelKey() | translate | async }}\n </span>\n </button>\n\n <ax-popover\n [target]=\"operationTrigger\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n (onOpened)=\"onPopoverOpened(panel)\"\n >\n <axp-background-operation-panel\n #panel\n (onClosePopover)=\"closePopover()\"\n ></axp-background-operation-panel>\n </ax-popover>\n}\n","//#region ---- Imports ----\n\nimport { AXNotificationService } from '@acorex/components/notification';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport {\n axpResolveUserNotificationDelivery,\n type AXPUserNotificationInboxOptions,\n type AXPUserNotificationRequest,\n type AXPUserNotificationToastOptions,\n} from '@acorex-platform/framework-shared/core';\nimport { inject, Injectable } from '@angular/core';\nimport { get } from 'lodash-es';\nimport {\n AXP_IN_APP_NOTIFICATION_SERVICE,\n type AXPInAppNotificationPriority,\n} from '../background-operation/background-operation.notification';\nimport type { AXPUserNotificationPort } from './user-notification.port';\n\n//#endregion\n\n//#region ---- Service ----\n\n/**\n * Delivers {@link AXPUserNotificationRequest} to configured channels (toast overlay, in-app inbox).\n * Inbox persistence is delegated to {@link AXP_IN_APP_NOTIFICATION_SERVICE} when registered.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPUserNotificationService implements AXPUserNotificationPort {\n //#region ----- Dependencies -----\n\n private readonly toastService = inject(AXNotificationService);\n private readonly inAppNotificationService = inject(AXP_IN_APP_NOTIFICATION_SERVICE, { optional: true });\n private readonly sessionService = inject(AXPSessionService);\n\n //#endregion\n\n //#region ----- State -----\n\n private readonly recentToastCorrelationIds = new Map<string, number>();\n private static readonly TOAST_DEDUPE_MS = 15_000;\n\n //#endregion\n\n //#region ----- API -----\n\n async notify(request: AXPUserNotificationRequest): Promise<void> {\n const { toast, inbox } = axpResolveUserNotificationDelivery(request.delivery);\n\n if (toast) {\n this.deliverToast(request, toast);\n }\n\n if (inbox) {\n await this.deliverInbox(request, inbox);\n }\n }\n\n //#endregion\n\n //#region ----- Toast -----\n\n private deliverToast(request: AXPUserNotificationRequest, options: AXPUserNotificationToastOptions): void {\n const correlationId = request.correlationId.trim();\n if (correlationId && this.isDuplicateToast(correlationId)) {\n return;\n }\n\n const actions = request.toastActions ?? [];\n const showActions = options.showActions !== false && actions.length > 0;\n\n const ref = this.toastService.show({\n color: options.color ?? 'primary',\n location: options.location ?? 'bottom-center',\n closeButton: options.closeButton ?? true,\n timeOut: options.timeOut ?? 3_000,\n timeOutProgress: options.timeOutProgress ?? true,\n icon: request.icon,\n title: request.title,\n content: request.body,\n ...(showActions\n ? {\n buttons: actions.map((action) => ({\n text: action.text,\n color: action.color ?? 'primary',\n onClick: (event?: { handled?: boolean }) => {\n if (event) {\n event.handled = true;\n }\n ref.close();\n void action.onClick?.();\n },\n })),\n }\n : {}),\n });\n }\n\n //#endregion\n\n //#region ----- Inbox -----\n\n private async deliverInbox(\n request: AXPUserNotificationRequest,\n options: AXPUserNotificationInboxOptions,\n ): Promise<void> {\n if (!this.inAppNotificationService) {\n return;\n }\n\n const recipientUserId = request.recipientUserId?.trim() || this.sessionService.user?.id?.trim();\n if (!recipientUserId) {\n return;\n }\n\n const priority = (options.priority ?? 'Notice') as AXPInAppNotificationPriority;\n\n await this.inAppNotificationService.create({\n id: request.idempotencyKey?.trim() || request.correlationId.trim(),\n name: request.name?.trim() || request.title,\n title: request.title,\n body: request.body,\n icon: request.icon ?? 'fa-light fa-bell',\n priority,\n receiver: {\n id: recipientUserId,\n type: 'user',\n fullName: get(this.sessionService.user, 'title') as string | undefined,\n username: get(this.sessionService.user, 'name') as string | undefined,\n },\n data: {\n correlationId: request.correlationId,\n definitionKey: options.definitionKey,\n actions: options.actions,\n ...(request.data ?? {}),\n },\n });\n }\n\n //#endregion\n\n //#region ----- Helpers -----\n\n private isDuplicateToast(correlationId: string): boolean {\n const now = Date.now();\n const previous = this.recentToastCorrelationIds.get(correlationId);\n if (previous !== undefined && now - previous < AXPUserNotificationService.TOAST_DEDUPE_MS) {\n return true;\n }\n this.recentToastCorrelationIds.set(correlationId, now);\n return false;\n }\n\n //#endregion\n}\n\n//#endregion\n","import { AXP_USER_NOTIFICATION_SERVICE } from './user-notification.port';\nimport { AXPUserNotificationService } from './user-notification.service';\n\nexport * from './user-notification.port';\nexport * from './user-notification.service';\n\nexport function provideAXPUserNotificationService() {\n return {\n provide: AXP_USER_NOTIFICATION_SERVICE,\n useExisting: AXPUserNotificationService,\n } as const;\n}\n","import { InjectionToken } from '@angular/core';\nimport { merge } from 'lodash-es';\n\nexport const ENVIRONMENT = new InjectionToken<any>('ENVIRONMENT');\n\nexport const AXP_PLATFORM_CONFIG_TOKEN = new InjectionToken<AXPPlatformConfigs>('AXP_PLATFORM_CONFIG_TOKEN', {\n providedIn: 'root',\n factory: () => {\n return AXPPlatformDefaultConfigs;\n },\n});\n\nexport interface AXPPlatformConfigs {\n title?: string;\n copyright?: string;\n network?: {\n timeOut?: number;\n };\n}\n\nexport const AXPPlatformDefaultConfigs: AXPPlatformConfigs = {\n copyright: 'ACoreX @ 2026',\n title: 'ACoreX Platform',\n\n network: {\n timeOut: 5000,\n },\n};\n\nexport function configPlatform(config: Partial<AXPPlatformConfigs> = AXPPlatformDefaultConfigs): AXPPlatformConfigs {\n return merge(AXPPlatformDefaultConfigs, config);\n}\n","//#region ----- Platform branding setting keys (organization-management, tenant + platform inherit) -----\n\n/** Tenant-scope keys that inherit platform (P) values — resolved via {@link AXPSettingsService.get}. */\nexport const AXP_PLATFORM_BRANDING_SETTING_KEYS = {\n copyrightText: 'OrganizationManagement:Setting:Organization.CopyrightText',\n} as const;\n\n//#endregion\n","import { AXTranslationService } from '@acorex/core/translation';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport {\n AXPPlatformScope,\n coerceUnknownToMultiLanguageString,\n resolveMultiLanguageString,\n} from '@acorex-platform/framework-shared/core';\nimport { Injectable, inject } from '@angular/core';\nimport { AXPPlatformDefaultConfigs, AXP_PLATFORM_CONFIG_TOKEN } from '../configs/app.config';\nimport { AXPSettingsService } from '../settings/settings.service';\nimport { AXP_PLATFORM_BRANDING_SETTING_KEYS } from './platform-branding.constants';\n\n//#region ----- Platform branding (tenant settings → platform inherit → deploy fallback) -----\n\n/**\n * Resolves platform title and copyright from tenant settings (inherited from platform),\n * then falls back to {@link AXP_PLATFORM_CONFIG_TOKEN} when unset or unavailable.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPPlatformBrandingService {\n //#region ----- Services & Dependencies -----\n\n private readonly settingsService = inject(AXPSettingsService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly translateService = inject(AXTranslationService);\n private readonly platformConfig = inject(AXP_PLATFORM_CONFIG_TOKEN);\n\n //#endregion\n\n //#region ----- Public API -----\n\n /**\n * Footer / shell copyright: tenant scope (same path as Company Information settings) →\n * effective inherit → `platformConfig.copyright`.\n */\n async resolveCopyright(): Promise<string> {\n const key = AXP_PLATFORM_BRANDING_SETTING_KEYS.copyrightText;\n\n // Read tenant partition explicitly — matches the settings page (`scope(Tenant).all()`).\n try {\n const tenantTrimmed = await this.readTenantCopyright(key);\n if (tenantTrimmed) {\n return (await this.localize(tenantTrimmed)) ?? tenantTrimmed;\n }\n } catch {\n // Tenant scope unavailable (pre-auth); fall through to effective / deploy.\n }\n\n const fromSettings = await this.readInheritedString(key);\n if (fromSettings) {\n return fromSettings;\n }\n\n return this.resolveDeployCopyright();\n }\n\n /**\n * Browser tab / shell title when an application session exists:\n * session application title → deploy title.\n */\n async resolveApplicationTitle(): Promise<string> {\n const application = this.sessionService.application;\n const locale = this.translateService.getActiveLang();\n const sessionTitle =\n resolveMultiLanguageString(application?.title, locale).trim() ||\n application?.name?.trim() ||\n '';\n if (sessionTitle) {\n return (await this.localize(sessionTitle)) ?? sessionTitle;\n }\n\n return this.resolvePlatformTitle();\n }\n\n /** Auth and pre-application UI: deploy title from platform config. */\n async resolvePlatformTitle(): Promise<string> {\n return this.resolveDeployTitle();\n }\n\n //#endregion\n\n //#region ----- Private Helpers -----\n\n /**\n * Loads tenant-scoped copyright. If the in-memory tenant cache was marked ready while empty\n * (concurrent session reload race), force one remote reload before giving up.\n */\n private async readTenantCopyright(key: string): Promise<string> {\n await this.settingsService.ensureScopeLoaded(AXPPlatformScope.Tenant);\n const first = await this.settingsService.scope(AXPPlatformScope.Tenant).get(key);\n const firstTrimmed = this.asDisplayString(first);\n if (firstTrimmed) {\n return firstTrimmed;\n }\n\n await this.settingsService.reload(AXPPlatformScope.Tenant, 'full-reload');\n const second = await this.settingsService.scope(AXPPlatformScope.Tenant).get(key);\n return this.asDisplayString(second);\n }\n\n private async readInheritedString(key: string): Promise<string | null> {\n try {\n const value = await this.settingsService.get(key);\n const trimmed = this.asDisplayString(value);\n if (!trimmed) {\n return null;\n }\n return (await this.localize(trimmed)) ?? trimmed;\n } catch {\n return null;\n }\n }\n\n private asDisplayString(value: unknown): string {\n return resolveMultiLanguageString(\n coerceUnknownToMultiLanguageString(value),\n this.translateService.getActiveLang(),\n ).trim();\n }\n\n private resolveDeployCopyright(): string {\n return this.platformConfig.copyright?.trim() || AXPPlatformDefaultConfigs.copyright || '';\n }\n\n private async resolveDeployTitle(): Promise<string> {\n const fallback = this.platformConfig.title?.trim() || AXPPlatformDefaultConfigs.title || '';\n if (!fallback) {\n return '';\n }\n return (await this.localize(fallback)) ?? fallback;\n }\n\n private async localize(value: string): Promise<string | null> {\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n if (trimmed.startsWith('@')) {\n return (await this.translateService.translateAsync(trimmed)) || trimmed;\n }\n\n return trimmed;\n }\n\n //#endregion\n}\n\n//#endregion\n","import { NavigationExtras, Router } from '@angular/router';\n\n//#region ---- Types ----\n\nexport interface AXPAppPathParts {\n segments: string[];\n queryParams?: Record<string, string>;\n fragment?: string;\n}\n\n//#endregion\n\n//#region ---- App Path Navigation ----\n\n/**\n * Splits an absolute app path (`/app/m/module/e/Entity/id/view`) into router command segments.\n * Prefer this over `navigate([fullPath])` or ambiguous single-segment navigation so browser history stays correct.\n */\nexport function axpParseAppPath(path: string): AXPAppPathParts {\n const trimmed = path.trim();\n const withoutLeadingSlash = trimmed.startsWith('/') ? trimmed.slice(1) : trimmed;\n const [pathAndFragment, queryString] = withoutLeadingSlash.split('?');\n const [pathPart, fragment] = pathAndFragment.split('#');\n const segments = pathPart.split('/').filter(Boolean);\n\n const queryParams = queryString\n ? queryString.split('&').reduce<Record<string, string>>((params, pair) => {\n const [key, value = ''] = pair.split('=');\n if (key) {\n params[decodeURIComponent(key)] = decodeURIComponent(value);\n }\n return params;\n }, {})\n : undefined;\n\n return {\n segments,\n queryParams,\n fragment: fragment || undefined,\n };\n}\n\n/** Navigates using explicit path segments (same pattern as entity preload filters). */\nexport function axpNavigateAppPath(router: Router, path: string, extras?: NavigationExtras): Promise<boolean> {\n const { segments, queryParams, fragment } = axpParseAppPath(path);\n return router.navigate(segments, {\n ...extras,\n queryParams,\n fragment,\n });\n}\n\n/** True when a URL path is an entity master list route (`.../e/{Entity}/list`). */\nexport function axpIsEntityListPath(url: string): boolean {\n const path = url.split('?')[0].split('#')[0];\n return /\\/e\\/[^/]+\\/list$/.test(path);\n}\n\n/** True when the current browser URL is an entity master list route (`.../e/{Entity}/list`). */\nexport function axpIsEntityListRoute(router: Router): boolean {\n return axpIsEntityListPath(router.url);\n}\n\n/** True when a URL path is an entity details view route (`.../e/{Entity}/{id}/view`). */\nexport function axpIsEntityDetailsPath(url: string): boolean {\n const path = url.split('?')[0].split('#')[0];\n return /\\/e\\/[^/]+\\/[^/]+\\/view$/.test(path);\n}\n\n/** True when the current browser URL is an entity details view route (`.../e/{Entity}/{id}/view`). */\nexport function axpIsEntityDetailsViewRoute(router: Router): boolean {\n return axpIsEntityDetailsPath(router.url);\n}\n\n/**\n * Merges query params on the current entity list route without pushing history.\n * Uses absolute path segments so a stale `relativeTo` cannot rewrite the active URL after navigating away.\n */\nexport function axpReplaceEntityListRouteQueryParams(\n router: Router,\n queryParams: Record<string, string | null | undefined>,\n): void {\n const url = router.url;\n if (!axpIsEntityListPath(url)) {\n return;\n }\n\n const parsed = router.parseUrl(url);\n const pathOnly = url.split('?')[0].split('#')[0];\n const { segments } = axpParseAppPath(pathOnly);\n const mergedQueryParams = { ...parsed.queryParams, ...queryParams };\n\n void router.navigate(segments, {\n queryParams: mergedQueryParams,\n replaceUrl: true,\n });\n}\n\n//#endregion\n","import { axpIsEntityDetailsPath, axpIsEntityListPath } from '../../utils/app-path-navigation.util';\nimport { AXPMenuItem } from './menu.types';\n\nexport interface AXPMenuRouteMatchResult {\n item: AXPMenuItem;\n /** Parent menu items from root down to the direct parent of the matched item. */\n ancestors: AXPMenuItem[];\n isPartialMatch: boolean;\n}\n\nconst DEFAULT_TRAILING_SEGMENTS = ['list', 'view', 'edit', 'create'];\n\n/**\n * Query params that represent page UI state (not navigation identity).\n * Ignored when deciding whether a menu item matches the current route, so items stay\n * highlighted while the page mutates view/layout (e.g. task board, entity list view).\n */\nconst MENU_UI_QUERY_KEYS = new Set(['view', 'layout']);\n\ninterface EntityRouteKey {\n app: string;\n module: string;\n entity: string;\n /** Segment index after the entity name (first segment that is not part of the entity key). */\n entityEndIndex: number;\n}\n\n//#region ---- Entity Route Helpers ----\n\n/**\n * Parses `/{app}/m/{module}/e/{entity}/...` routes into a stable entity key.\n */\nfunction axpParseEntityRouteKey(segments: string[]): EntityRouteKey | null {\n const mIndex = segments.indexOf('m');\n const eIndex = segments.indexOf('e');\n\n if (mIndex < 1 || eIndex <= mIndex + 1 || eIndex + 1 >= segments.length) {\n return null;\n }\n\n return {\n app: segments[mIndex - 1],\n module: segments[mIndex + 1],\n entity: segments[eIndex + 1],\n entityEndIndex: eIndex + 2,\n };\n}\n\nfunction axpEntityRouteKeysEqual(left: EntityRouteKey, right: EntityRouteKey): boolean {\n return left.app === right.app && left.module === right.module && left.entity === right.entity;\n}\n\nfunction axpParseQueryString(queryString: string): URLSearchParams {\n return new URLSearchParams(queryString);\n}\n\nfunction axpMenuDeclaredNavigationParams(queryString: string): URLSearchParams {\n const params = axpParseQueryString(queryString);\n const navigationParams = new URLSearchParams();\n\n params.forEach((value, key) => {\n if (!MENU_UI_QUERY_KEYS.has(key)) {\n navigationParams.append(key, value);\n }\n });\n\n return navigationParams;\n}\n\nfunction axpMenuHasDeclaredNavigationParams(itemQueryString: string): boolean {\n return axpMenuDeclaredNavigationParams(itemQueryString).toString().length > 0;\n}\n\n/**\n * True when every navigation query param declared on the menu path equals the current URL.\n */\nfunction axpMenuDeclaredQueryParamsMatch(itemQueryString: string, currentQueryString: string): boolean {\n const itemParams = axpMenuDeclaredNavigationParams(itemQueryString);\n const declaredPairs: Array<[string, string]> = [];\n itemParams.forEach((value, key) => {\n declaredPairs.push([key, value]);\n });\n\n if (declaredPairs.length === 0) {\n return axpGenericEntityListMenuQueryParamsMatch(currentQueryString);\n }\n\n const currentParams = axpParseQueryString(currentQueryString);\n return declaredPairs.every(([key, value]) => currentParams.get(key) === value);\n}\n\n/**\n * Generic entity list menu items (no declared query params) match only when the URL has no\n * navigation query params beyond UI-managed keys such as `view`.\n */\nfunction axpGenericEntityListMenuQueryParamsMatch(currentQueryString: string): boolean {\n const currentParams = axpParseQueryString(currentQueryString);\n let hasNavigationParam = false;\n\n currentParams.forEach((_value, key) => {\n if (!MENU_UI_QUERY_KEYS.has(key)) {\n hasNavigationParam = true;\n }\n });\n\n return !hasNavigationParam;\n}\n\n/**\n * Counts declared menu query params that match the current URL (for best-match selection).\n */\nfunction axpMenuQueryParamSpecificity(itemPath: string, currentPath: string): number {\n const itemQueryString = itemPath.split('#')[0].split('?')[1] ?? '';\n const currentQueryString = currentPath.split('#')[0].split('?')[1] ?? '';\n const itemParams = axpMenuDeclaredNavigationParams(itemQueryString);\n const currentParams = axpParseQueryString(currentQueryString);\n let specificity = 0;\n\n itemParams.forEach((value, key) => {\n if (currentParams.get(key) === value) {\n specificity++;\n }\n });\n\n return specificity;\n}\n\n/**\n * Matches entity list menu entries against list/detail/create/edit routes for the same entity.\n */\nfunction axpTryMatchEntityMenuRoute(\n itemSegments: string[],\n pathSegments: string[],\n currentBase: string,\n itemQueryString: string,\n currentQueryString: string,\n): { isMatch: boolean; isPartial: boolean } | null {\n const menuEntity = axpParseEntityRouteKey(itemSegments);\n const currentEntity = axpParseEntityRouteKey(pathSegments);\n\n if (!menuEntity || !currentEntity || !axpEntityRouteKeysEqual(menuEntity, currentEntity)) {\n return null;\n }\n\n const itemHasDeclaredParams = axpMenuHasDeclaredNavigationParams(itemQueryString);\n\n if (itemHasDeclaredParams) {\n if (!axpIsEntityListPath(currentBase)) {\n return { isMatch: false, isPartial: false };\n }\n\n if (!axpMenuDeclaredQueryParamsMatch(itemQueryString, currentQueryString)) {\n return { isMatch: false, isPartial: false };\n }\n\n return { isMatch: true, isPartial: false };\n }\n\n if (axpIsEntityListPath(currentBase) && !axpGenericEntityListMenuQueryParamsMatch(currentQueryString)) {\n return { isMatch: false, isPartial: false };\n }\n\n const isPartial =\n pathSegments.length > menuEntity.entityEndIndex ||\n axpIsEntityDetailsPath(currentBase) ||\n !axpIsEntityListPath(currentBase);\n\n return { isMatch: true, isPartial };\n}\n\n//#endregion\n\n/**\n * Compares a menu item path with the current browser path.\n * Mirrors the matching rules used when selecting the active menu item.\n */\nexport function axpMenuPathsMatch(\n itemPath: string,\n currentPath: string,\n trailingSegmentsToIgnore: string[] = DEFAULT_TRAILING_SEGMENTS,\n): { isMatch: boolean; isPartial: boolean } {\n const itemNoHash = itemPath.split('#')[0];\n const currentNoHash = currentPath.split('#')[0];\n\n const [itemBase, itemQueryString = ''] = itemNoHash.split('?');\n const [currentBase, currentQueryString = ''] = currentNoHash.split('?');\n\n const itemSegments = itemBase.split('/').filter((segment) => segment.length > 0);\n const pathSegments = currentBase.split('/').filter((segment) => segment.length > 0);\n\n const entityMatch = axpTryMatchEntityMenuRoute(\n itemSegments,\n pathSegments,\n `/${currentBase}`,\n itemQueryString,\n currentQueryString,\n );\n if (entityMatch) {\n return entityMatch;\n }\n\n const menuLength = itemSegments.length;\n const pathLength = pathSegments.length;\n\n let effectiveMenuLength = menuLength;\n if (menuLength > 0 && trailingSegmentsToIgnore.includes(itemSegments[menuLength - 1])) {\n effectiveMenuLength--;\n }\n\n if (pathLength < effectiveMenuLength) {\n return { isMatch: false, isPartial: false };\n }\n\n let isPrefix = true;\n for (let i = 0; i < effectiveMenuLength; i++) {\n if (itemSegments[i] !== pathSegments[i]) {\n isPrefix = false;\n break;\n }\n }\n\n if (!isPrefix) {\n return { isMatch: false, isPartial: false };\n }\n\n const isPartialMatch = effectiveMenuLength < pathLength;\n const isExactMatch = effectiveMenuLength === pathLength;\n\n // Only non-UI query params on the menu path must match the current URL.\n // UI-only params (`view`, `layout`) are ignored so pages can mutate them freely.\n // Extra current-URL params (filters, etc.) do not break the match.\n const itemNavigationParams = axpMenuDeclaredNavigationParams(itemQueryString);\n const declaredPairs: Array<[string, string]> = [];\n itemNavigationParams.forEach((value, key) => {\n declaredPairs.push([key, value]);\n });\n\n let queryMatches = true;\n if (declaredPairs.length > 0) {\n const currentParams = axpParseQueryString(currentQueryString);\n queryMatches = declaredPairs.every(([key, value]) => currentParams.get(key) === value);\n }\n\n return {\n isMatch: (isExactMatch || isPartialMatch) && queryMatches,\n isPartial: isPartialMatch && !isExactMatch,\n };\n}\n\n/**\n * Finds the most specific menu item that matches the given route path.\n */\nexport function axpFindMenuItemByRoute(\n items: AXPMenuItem[],\n currentPath: string,\n trailingSegmentsToIgnore: string[] = DEFAULT_TRAILING_SEGMENTS,\n): AXPMenuRouteMatchResult | null {\n let bestMatch: AXPMenuRouteMatchResult | null = null;\n let bestEffectiveLength = -1;\n let bestQuerySpecificity = -1;\n\n const visit = (menuItems: AXPMenuItem[], ancestors: AXPMenuItem[]): void => {\n for (const item of menuItems) {\n if (item.children?.length) {\n visit(item.children, [...ancestors, item]);\n }\n\n if (!item.path) {\n continue;\n }\n\n const matchResult = axpMenuPathsMatch(item.path, currentPath, trailingSegmentsToIgnore);\n if (!matchResult.isMatch) {\n continue;\n }\n\n const itemNoHash = item.path.split('#')[0];\n const [itemBase] = itemNoHash.split('?');\n const itemSegments = itemBase.split('/').filter((segment) => segment.length > 0);\n\n let effectiveMenuLength = itemSegments.length;\n if (\n itemSegments.length > 0 &&\n trailingSegmentsToIgnore.includes(itemSegments[itemSegments.length - 1])\n ) {\n effectiveMenuLength--;\n }\n\n const menuEntity = axpParseEntityRouteKey(itemSegments);\n if (menuEntity) {\n effectiveMenuLength = menuEntity.entityEndIndex;\n }\n\n const querySpecificity = axpMenuQueryParamSpecificity(item.path, currentPath);\n\n if (\n effectiveMenuLength > bestEffectiveLength ||\n (effectiveMenuLength === bestEffectiveLength && querySpecificity > bestQuerySpecificity)\n ) {\n bestEffectiveLength = effectiveMenuLength;\n bestQuerySpecificity = querySpecificity;\n bestMatch = { item, ancestors, isPartialMatch: matchResult.isPartial };\n }\n }\n };\n\n visit(items, []);\n return bestMatch;\n}\n","import { AXPMenuItem } from './menu.types';\nimport { AXPMenuItemFinder, AXPMenuMiddlewareContext } from './menu.middleware';\n\n//#region ---- Menu Context Builder ----\n\n/**\n * Creates a rich context for menu manipulation\n * Similar to entity modifier context pattern\n */\nexport function createMenuContext(items: AXPMenuItem[]): AXPMenuMiddlewareContext {\n const context: AXPMenuMiddlewareContext = {\n get items() {\n return items;\n },\n\n find(nameOrPattern: string | RegExp): AXPMenuItemFinder {\n if (typeof nameOrPattern === 'string') {\n return context.findByName(nameOrPattern);\n }\n const found = context.findByPattern(nameOrPattern);\n return found.length > 0 ? found[0] : createEmptyFinder();\n },\n\n findByName(name: string): AXPMenuItemFinder {\n return createMenuItemFinder(items, name);\n },\n\n findByPattern(pattern: string | RegExp): AXPMenuItemFinder[] {\n const regex = typeof pattern === 'string' ? wildcardToRegex(pattern) : pattern;\n const results: AXPMenuItemFinder[] = [];\n\n const searchRecursive = (itemList: AXPMenuItem[]) => {\n for (const item of itemList) {\n if (item.name && regex.test(item.name)) {\n results.push(createMenuItemFinder(items, item.name));\n }\n if (item.children) {\n searchRecursive(item.children);\n }\n }\n };\n\n searchRecursive(items);\n return results;\n },\n\n add(...newItems: AXPMenuItem[]): AXPMenuMiddlewareContext {\n items.push(...newItems);\n return context;\n },\n\n remove(predicate: (item: AXPMenuItem) => boolean): AXPMenuMiddlewareContext {\n removeRecursive(items, predicate);\n return context;\n },\n\n sort(): AXPMenuMiddlewareContext {\n sortItemsRecursively(items);\n return context;\n },\n\n toArray(): AXPMenuItem[] {\n return items;\n },\n };\n\n return context;\n}\n\n//#endregion\n\n//#region ---- Menu Item Finder Implementation ----\n\n/**\n * Creates a finder for a specific menu item\n */\nfunction createMenuItemFinder(rootItems: AXPMenuItem[], targetName: string): AXPMenuItemFinder {\n const findItemWithParent = (\n items: AXPMenuItem[],\n name: string,\n parent: { items: AXPMenuItem[] } = { items: rootItems }\n ): { item: AXPMenuItem | undefined; parent: { items: AXPMenuItem[] } } => {\n for (const item of items) {\n if (item.name === name) {\n return { item, parent };\n }\n if (item.children) {\n const result = findItemWithParent(item.children, name, { items: item.children });\n if (result.item) {\n return result;\n }\n }\n }\n return { item: undefined, parent };\n };\n\n const finder: AXPMenuItemFinder = {\n get(): AXPMenuItem | undefined {\n return findItemWithParent(rootItems, targetName).item;\n },\n\n exists(): boolean {\n return finder.get() !== undefined;\n },\n\n update(updater: Partial<AXPMenuItem> | ((item: AXPMenuItem) => Partial<AXPMenuItem>)): AXPMenuItemFinder {\n const { item } = findItemWithParent(rootItems, targetName);\n if (item) {\n const updates = typeof updater === 'function' ? updater(item) : updater;\n Object.assign(item, updates);\n }\n return finder;\n },\n\n remove(): AXPMenuItemFinder {\n const { item, parent } = findItemWithParent(rootItems, targetName);\n if (item) {\n const index = parent.items.indexOf(item);\n if (index !== -1) {\n parent.items.splice(index, 1);\n }\n }\n return finder;\n },\n\n hide(): AXPMenuItemFinder {\n // Hide by removing the item from menu\n return finder.remove();\n },\n\n show(): AXPMenuItemFinder {\n // Show is a no-op since items are visible by default\n // To truly implement show, we'd need to track removed items and re-add them\n console.warn('show() is not fully implemented - items are visible by default');\n return finder;\n },\n\n setPriority(priority: number): AXPMenuItemFinder {\n return finder.update({ priority });\n },\n\n addChildren(...children: AXPMenuItem[]): AXPMenuItemFinder {\n const { item } = findItemWithParent(rootItems, targetName);\n if (item) {\n item.children = item.children || [];\n item.children.push(...children);\n }\n return finder;\n },\n\n removeChildren(predicate: (child: AXPMenuItem) => boolean): AXPMenuItemFinder {\n const { item } = findItemWithParent(rootItems, targetName);\n if (item && item.children) {\n item.children = item.children.filter((c) => !predicate(c));\n }\n return finder;\n },\n\n moveTo(parentName: string | null | undefined): AXPMenuItemFinder {\n const { item, parent: oldParent } = findItemWithParent(rootItems, targetName);\n if (!item) {\n return finder;\n }\n\n // Remove from old parent\n const oldIndex = oldParent.items.indexOf(item);\n if (oldIndex !== -1) {\n oldParent.items.splice(oldIndex, 1);\n }\n\n // Add to new parent\n if (!parentName || parentName === '') {\n // Move to root (handles null, undefined, and empty string)\n rootItems.push(item);\n } else {\n const { item: newParentItem } = findItemWithParent(rootItems, parentName);\n if (newParentItem) {\n newParentItem.children = newParentItem.children || [];\n newParentItem.children.push(item);\n }\n }\n\n return finder;\n },\n\n insertBefore(...items: AXPMenuItem[]): AXPMenuItemFinder {\n const { item, parent } = findItemWithParent(rootItems, targetName);\n if (item) {\n const index = parent.items.indexOf(item);\n if (index !== -1) {\n parent.items.splice(index, 0, ...items);\n }\n }\n return finder;\n },\n\n insertAfter(...items: AXPMenuItem[]): AXPMenuItemFinder {\n const { item, parent } = findItemWithParent(rootItems, targetName);\n if (item) {\n const index = parent.items.indexOf(item);\n if (index !== -1) {\n parent.items.splice(index + 1, 0, ...items);\n }\n }\n return finder;\n },\n };\n\n return finder;\n}\n\n/**\n * Creates an empty finder for items not found\n */\nfunction createEmptyFinder(): AXPMenuItemFinder {\n return {\n get: () => undefined,\n exists: () => false,\n update: () => createEmptyFinder(),\n remove: () => createEmptyFinder(),\n hide: () => createEmptyFinder(),\n show: () => createEmptyFinder(),\n setPriority: () => createEmptyFinder(),\n addChildren: () => createEmptyFinder(),\n removeChildren: () => createEmptyFinder(),\n moveTo: () => createEmptyFinder(),\n insertBefore: () => createEmptyFinder(),\n insertAfter: () => createEmptyFinder(),\n };\n}\n\n//#endregion\n\n//#region ---- Helper Functions ----\n\n/**\n * Converts wildcard pattern to regex\n */\nfunction wildcardToRegex(pattern: string): RegExp {\n const escaped = pattern.replace(/[.+?^${}()|\\[\\]\\\\]/g, '\\\\$&');\n const regexStr = `^${escaped.replace(/\\*/g, '.*')}$`;\n return new RegExp(regexStr);\n}\n\n/**\n * Recursively removes items matching predicate\n */\nfunction removeRecursive(items: AXPMenuItem[], predicate: (item: AXPMenuItem) => boolean): void {\n for (let i = items.length - 1; i >= 0; i--) {\n const item = items[i];\n if (predicate(item)) {\n items.splice(i, 1);\n } else if (item.children) {\n removeRecursive(item.children, predicate);\n }\n }\n}\n\n/**\n * Recursively sorts items by priority\n */\nfunction sortItemsRecursively(items: AXPMenuItem[]): void {\n items.sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n items.forEach((item) => {\n if (item.children && item.children.length > 0) {\n sortItemsRecursively(item.children);\n }\n });\n}\n\n//#endregion\n\n","import { InjectionToken } from '@angular/core';\nimport { AXPMenuItem } from './menu.types';\n\n//#region ---- Menu Middleware Context ----\n\n/**\n * Rich context API for manipulating menu items within middleware\n * Provides helper methods to find, update, remove, and add menu items easily\n */\nexport interface AXPMenuMiddlewareContext {\n /**\n * Get all menu items\n */\n readonly items: AXPMenuItem[];\n\n /**\n * Find menu item(s) by name or pattern\n */\n find(nameOrPattern: string | RegExp): AXPMenuItemFinder;\n\n /**\n * Find menu item by name (exact match)\n */\n findByName(name: string): AXPMenuItemFinder;\n\n /**\n * Find menu items by pattern (regex or wildcard)\n */\n findByPattern(pattern: string | RegExp): AXPMenuItemFinder[];\n\n /**\n * Add new menu items to root level\n */\n add(...items: AXPMenuItem[]): AXPMenuMiddlewareContext;\n\n /**\n * Remove menu items by predicate\n */\n remove(predicate: (item: AXPMenuItem) => boolean): AXPMenuMiddlewareContext;\n\n /**\n * Sort all menu items recursively by priority\n */\n sort(): AXPMenuMiddlewareContext;\n\n /**\n * Get the final menu items array\n */\n toArray(): AXPMenuItem[];\n}\n\n/**\n * Helper for finding and manipulating a specific menu item\n */\nexport interface AXPMenuItemFinder {\n /**\n * Get the found menu item (or undefined)\n */\n get(): AXPMenuItem | undefined;\n\n /**\n * Check if menu item exists\n */\n exists(): boolean;\n\n /**\n * Update menu item properties\n */\n update(updater: Partial<AXPMenuItem> | ((item: AXPMenuItem) => Partial<AXPMenuItem>)): AXPMenuItemFinder;\n\n /**\n * Remove the menu item\n */\n remove(): AXPMenuItemFinder;\n\n /**\n * Hide the menu item (removes it from the menu)\n */\n hide(): AXPMenuItemFinder;\n\n /**\n * Show the menu item (currently a no-op as items are visible by default)\n * Note: To truly implement show, we'd need to track removed items\n */\n show(): AXPMenuItemFinder;\n\n /**\n * Set priority\n */\n setPriority(priority: number): AXPMenuItemFinder;\n\n /**\n * Add children to this menu item\n */\n addChildren(...children: AXPMenuItem[]): AXPMenuItemFinder;\n\n /**\n * Remove children by predicate\n */\n removeChildren(predicate: (child: AXPMenuItem) => boolean): AXPMenuItemFinder;\n\n /**\n * Move menu item to a different parent\n */\n moveTo(parentName: string | null | undefined): AXPMenuItemFinder;\n\n /**\n * Insert menu items before this item\n */\n insertBefore(...items: AXPMenuItem[]): AXPMenuItemFinder;\n\n /**\n * Insert menu items after this item\n */\n insertAfter(...items: AXPMenuItem[]): AXPMenuItemFinder;\n}\n\n//#endregion\n\n//#region ---- Menu Middleware ----\n\n/**\n * Middleware that processes menu items after all providers have executed\n * Middlewares are executed in order based on their priority (higher priority = earlier execution)\n */\nexport interface AXPMenuMiddleware {\n /**\n * Optional priority for execution order (higher = earlier)\n * Default: 0\n */\n readonly priority?: number;\n\n /**\n * Optional name for debugging and identification\n */\n readonly name?: string;\n\n /**\n * Process menu items using the rich context API\n * @param context - The menu middleware context with helper methods\n * @returns Processed context or void (context is mutable)\n */\n process(context: AXPMenuMiddlewareContext): Promise<void | AXPMenuMiddlewareContext>;\n}\n\n/**\n * Provider definition for registering middleware via multi-provider\n */\nexport interface AXPMenuMiddlewareProvider {\n /**\n * The middleware instance\n */\n middleware: AXPMenuMiddleware;\n\n /**\n * Optional priority override\n */\n priority?: number;\n}\n\n/**\n * Injection token for menu middlewares (multi-provider)\n */\nexport const AXP_MENU_MIDDLEWARE = new InjectionToken<AXPMenuMiddleware[]>('AXP_MENU_MIDDLEWARE');\n\n//#endregion\n\n","import { inject, Injectable } from '@angular/core';\nimport { AXP_MENU_MIDDLEWARE, AXPMenuMiddleware } from './menu.middleware';\n\n//#region ---- Menu Middleware Registry ----\n\n/**\n * Central service for managing menu middlewares with priority-based ordering\n * Similar to token registry pattern used in identifier-management\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPMenuMiddlewareRegistry {\n\n //#region ---- Fields ----\n\n /**\n * Manually registered middlewares\n */\n private readonly manualMiddlewares = new Map<string, AXPMenuMiddleware>();\n\n /**\n * Provider-based middlewares (multi-provider injection)\n */\n private readonly providerMiddlewares = inject(AXP_MENU_MIDDLEWARE, { optional: true }) ?? [];\n\n //#endregion\n\n //#region ---- Registration Methods ----\n\n /**\n * Manually register a middleware\n * @param middleware - The middleware to register\n */\n register(middleware: AXPMenuMiddleware): void {\n const name = middleware.name || `middleware_${Date.now()}_${Math.random()}`;\n\n const existing = this.manualMiddlewares.get(name);\n if (!existing || (middleware.priority ?? 0) > (existing.priority ?? 0)) {\n this.manualMiddlewares.set(name, middleware);\n }\n }\n\n /**\n * Unregister a middleware by name\n * @param name - The name of the middleware to remove\n */\n unregister(name: string): void {\n this.manualMiddlewares.delete(name);\n }\n\n /**\n * Get a specific middleware by name\n * @param name - The middleware name\n */\n get(name: string): AXPMenuMiddleware | undefined {\n // Provider-provided middlewares take precedence\n const fromProvider = this.providerMiddlewares\n .filter((m) => m.name === name)\n .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))[0];\n\n if (fromProvider) {\n return fromProvider;\n }\n\n return this.manualMiddlewares.get(name);\n }\n\n /**\n * Get all middlewares sorted by priority (highest first)\n * Combines provider-based and manually registered middlewares\n */\n list(): AXPMenuMiddleware[] {\n const map = new Map<string, AXPMenuMiddleware>();\n\n // Helper to add middleware, respecting priority\n const addMiddleware = (m: AXPMenuMiddleware) => {\n const name = m.name || `anonymous_${Date.now()}`;\n const existing = map.get(name);\n if (!existing || (m.priority ?? 0) > (existing.priority ?? 0)) {\n map.set(name, m);\n }\n };\n\n // Add provider middlewares first (higher precedence)\n this.providerMiddlewares.forEach(addMiddleware);\n\n // Add manual middlewares\n Array.from(this.manualMiddlewares.values()).forEach(addMiddleware);\n\n // Return sorted by priority (highest first)\n return Array.from(map.values()).sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n }\n\n /**\n * Check if a middleware exists\n * @param name - The middleware name\n */\n exists(name: string): boolean {\n return this.get(name) !== undefined;\n }\n\n /**\n * Clear all manually registered middlewares\n * Provider-based middlewares are not affected\n */\n clear(): void {\n this.manualMiddlewares.clear();\n }\n\n //#endregion\n}\n\n//#endregion\n\n","import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { inject, Injectable, InjectionToken } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { AXPMenuFinderResult, AXPMenuInsertion, AXPMenuItem, AXPMenuProviderContext } from './menu.types';\nimport { createMenuContext } from './menu.context';\nimport { AXPMenuMiddlewareRegistry } from './menu-middleware.registry';\n\nexport interface AXPMenuProvider {\n provide(context: AXPMenuProviderContext): Promise<void>;\n}\n\nexport const AXP_MENU_PROVIDER = new InjectionToken<AXPMenuProvider[]>('AXP_MENU_PROVIDER');\n\n//TODO: check performance of this service\n@Injectable({ providedIn: 'root' })\nexport class AXPMenuProviderService {\n\n //#region ---- Dependencies ----\n\n private providers = inject(AXP_MENU_PROVIDER, { optional: true });\n private middlewareRegistry = inject(AXPMenuMiddlewareRegistry);\n private sessionService = inject(AXPSessionService);\n\n //#endregion\n\n //#region ---- State ----\n\n private cache: AXPMenuItem[] | null = null;\n private pendingInserts: Array<{ target: string; newItems: AXPMenuItem[]; position: AXPMenuInsertion }> = [];\n private pendingRemovals: string[] = [];\n private pendingUpdates: Array<{ target: string; updatedItem: Partial<AXPMenuItem> }> = [];\n private pendingAdditions: Array<{ target: string; newItems: AXPMenuItem[] }> = [];\n private pendingMoves: Array<{ source: string; destination: string; position: AXPMenuInsertion }> = [];\n\n /**\n * Observable for menu reload events\n * Emits when menu cache is cleared and consumers should reload\n */\n private menuReloadSubject = new Subject<void>();\n public readonly menuReload$ = this.menuReloadSubject.asObservable();\n\n /** Serializes menu builds so pending queues are not corrupted by concurrent items() calls. */\n private itemsBuildLock: Promise<void> = Promise.resolve();\n\n /** Bumped on clearCache so an in-flight build cannot repopulate a stale cache. */\n private buildGeneration = 0;\n\n //#endregion\n\n //#region ---- Public API ----\n\n /**\n * Get menu items with middlewares applied (for end-user display)\n */\n async items(): Promise<AXPMenuItem[]> {\n if (this.cache) {\n return this.cache;\n }\n\n let releaseLock!: () => void;\n const previousBuild = this.itemsBuildLock;\n this.itemsBuildLock = new Promise<void>((resolve) => {\n releaseLock = resolve;\n });\n await previousBuild;\n\n try {\n if (this.cache) {\n return this.cache;\n }\n\n return await this.buildItems();\n } finally {\n releaseLock();\n }\n }\n\n private async buildItems(): Promise<AXPMenuItem[]> {\n const generation = this.buildGeneration;\n this.resetPendingOperations();\n\n // Common shells (Configuration / Administration / …) only register when Authorized.\n // Building earlier caches a broken tree and floods \"Target … not found\" warnings.\n if (!this.sessionService.isAuthorized) {\n return [];\n }\n\n const items: AXPMenuItem[] = [];\n const context = this.createMenuProviderContext(items);\n\n // Load providers from DI tokens\n if (Array.isArray(this.providers)) {\n for (const provider of this.providers) {\n if (provider instanceof Promise) {\n const resolvedProvider = await provider;\n await resolvedProvider.provide(context);\n } else {\n await provider.provide(context);\n }\n // Apply pending ops after each provider so later providers can find new parents.\n // Keep unresolved child additions for later providers / a final flush.\n this.applyPendingOperations(items, { dropUnresolvedAdditions: false });\n }\n }\n\n // Final pass: attach any additions whose parents were created by a later provider.\n this.applyPendingOperations(items, { dropUnresolvedAdditions: true });\n\n // Sort items by priority\n items.sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n\n // Apply middlewares using registry (sorted by priority)\n await this.applyMiddlewares(items);\n\n // ADD level property to items\n setMenuItemMeta(items);\n\n // clearCache during this build — discard result so it cannot stick as the cache.\n if (generation !== this.buildGeneration) {\n return items;\n }\n\n // Cache the computed items\n this.cache = items;\n return items;\n }\n\n /**\n * Get raw menu items WITHOUT middleware applied (for management/editing)\n * Used by menu management pages to show original items before customization\n */\n async rawItems(): Promise<AXPMenuItem[]> {\n this.resetPendingOperations();\n\n if (!this.sessionService.isAuthorized) {\n return [];\n }\n\n const items: AXPMenuItem[] = [];\n const context = this.createMenuProviderContext(items);\n\n // Load providers from DI tokens\n if (Array.isArray(this.providers)) {\n for (const provider of this.providers) {\n if (provider instanceof Promise) {\n // If provider is a promise, resolve it\n const resolvedProvider = await provider;\n await resolvedProvider.provide(context);\n } else {\n // If provider is a direct instance, use it directly\n await provider.provide(context);\n }\n // Apply pending operations after each provider\n this.applyPendingOperations(items, { dropUnresolvedAdditions: false });\n }\n }\n\n this.applyPendingOperations(items, { dropUnresolvedAdditions: true });\n\n // Sort items by priority\n items.sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n\n // ADD level property to items (but NO middleware)\n setMenuItemMeta(items);\n\n return items;\n }\n\n /**\n * Clear the cache to force reload of menu items\n * Notifies all subscribers to reload their menu data\n */\n clearCache(): void {\n this.buildGeneration++;\n this.cache = null;\n this.resetPendingOperations();\n\n // Notify subscribers that menu should be reloaded\n this.menuReloadSubject.next();\n }\n\n /**\n * Drop cached items without emitting reload (logout / session clear).\n * Avoids racing an async rebuild while status is not Authorized.\n */\n invalidateCacheQuietly(): void {\n this.buildGeneration++;\n this.cache = null;\n this.resetPendingOperations();\n }\n\n //#endregion\n\n //#region ---- Private Methods ----\n\n private resetPendingOperations(): void {\n this.pendingInserts = [];\n this.pendingRemovals = [];\n this.pendingUpdates = [];\n this.pendingAdditions = [];\n this.pendingMoves = [];\n }\n\n /**\n * Apply middlewares in priority order using the enhanced context API\n */\n private async applyMiddlewares(items: AXPMenuItem[]): Promise<void> {\n const middlewares = this.middlewareRegistry.list();\n\n for (const middleware of middlewares) {\n try {\n const context = createMenuContext(items);\n await middleware.process(context);\n\n // The context mutates the items array, so no need to reassign\n } catch (error) {\n console.error(\n `Error in menu middleware ${middleware.name || 'anonymous'}:`,\n error\n );\n }\n }\n }\n\n /**\n * Create provider context for menu providers\n */\n private createMenuProviderContext(items: AXPMenuItem[]): AXPMenuProviderContext {\n return {\n addItems: (newItems: AXPMenuItem[]) => {\n for (const newItem of newItems) {\n if (newItem.name) {\n const existingItem = this.findItemByName(items, newItem.name);\n if (existingItem) {\n // Update existing item, merging properties\n this.mergeMenuItem(existingItem, newItem);\n } else {\n // Add new item if it doesn't exist\n items.push(newItem);\n }\n } else {\n // Add item without name (no way to check for duplicates)\n items.push(newItem);\n }\n }\n },\n find: (target: string): AXPMenuFinderResult => {\n const foundItemInfo = this.findItemWithParent(items, target);\n const exists = foundItemInfo.foundItem !== null;\n\n return {\n exists,\n insert: (newItems: AXPMenuItem[], position: AXPMenuInsertion) => {\n this.pendingInserts.push({ target, newItems, position });\n },\n remove: () => {\n this.pendingRemovals.push(target);\n },\n update: (updatedItem: Partial<AXPMenuItem>) => {\n this.pendingUpdates.push({ target, updatedItem });\n },\n addItems: (newItems: AXPMenuItem[]) => {\n this.pendingAdditions.push({ target, newItems });\n },\n moveTo: (destination: string, position: AXPMenuInsertion = 'inside') => {\n this.pendingMoves.push({\n source: target,\n destination,\n position: position ?? 'inside',\n });\n },\n };\n }\n };\n }\n\n private applyPendingOperations(\n items: AXPMenuItem[],\n options: { dropUnresolvedAdditions?: boolean } = {},\n ): void {\n const dropUnresolvedAdditions = options.dropUnresolvedAdditions ?? true;\n\n for (const { target, newItems, position } of this.pendingInserts) {\n const foundItemInfo = this.findItemWithParent(items, target);\n const { foundItem, parentItems } = foundItemInfo;\n if (!foundItem) {\n console.warn(`Target \"${target}\" not found, appending items.`);\n items.push(...newItems);\n } else {\n if (position === 'inside') {\n if (!foundItem.children) {\n foundItem.children = [];\n }\n\n // Check for duplicates by name and merge or add\n for (const newItem of newItems) {\n if (newItem.name) {\n const existingChild = this.findItemByName(foundItem.children, newItem.name);\n if (existingChild) {\n this.mergeMenuItem(existingChild, newItem);\n } else {\n foundItem.children.push(newItem);\n }\n } else {\n foundItem.children.push(newItem);\n }\n }\n } else {\n // For 'before' and 'after', check for duplicates in parent items\n const itemsToInsert: AXPMenuItem[] = [];\n for (const newItem of newItems) {\n if (newItem.name) {\n const existingItem = this.findItemByName(parentItems, newItem.name);\n if (existingItem) {\n this.mergeMenuItem(existingItem, newItem);\n } else {\n itemsToInsert.push(newItem);\n }\n } else {\n itemsToInsert.push(newItem);\n }\n }\n\n if (itemsToInsert.length > 0) {\n const index = parentItems.indexOf(foundItem);\n const insertPosition = position === 'before' ? index : index + 1;\n parentItems.splice(insertPosition, 0, ...itemsToInsert);\n }\n }\n }\n }\n\n for (const target of this.pendingRemovals) {\n const foundItemInfo = this.findItemWithParent(items, target);\n const { foundItem, parentItems } = foundItemInfo;\n if (!foundItem) {\n console.warn(`Target \"${target}\" not found, nothing to remove.`);\n } else {\n const index = parentItems.indexOf(foundItem);\n parentItems.splice(index, 1);\n }\n }\n\n for (const { target, updatedItem } of this.pendingUpdates) {\n const foundItemInfo = this.findItemWithParent(items, target);\n const { foundItem } = foundItemInfo;\n if (!foundItem) {\n console.warn(`Target \"${target}\" not found, nothing to update.`);\n } else {\n Object.assign(foundItem, updatedItem);\n }\n }\n\n this.applyPendingAdditions(items, { dropUnresolved: dropUnresolvedAdditions });\n\n for (const move of this.pendingMoves) {\n this.applyPendingMove(items, move.source, move.destination, move.position);\n }\n\n // Keep unresolved additions across providers; clear only queues that were fully handled.\n this.pendingInserts = [];\n this.pendingRemovals = [];\n this.pendingUpdates = [];\n this.pendingMoves = [];\n if (dropUnresolvedAdditions) {\n this.pendingAdditions = [];\n }\n }\n\n /**\n * Applies queued child additions in multiple passes so a provider can create a parent shell\n * and attach children in the same provide() call (parent is created in an earlier pass).\n * When `dropUnresolved` is false, unresolved targets stay queued for a later provider.\n */\n private applyPendingAdditions(\n items: AXPMenuItem[],\n options: { dropUnresolved?: boolean } = {},\n ): void {\n const dropUnresolved = options.dropUnresolved ?? true;\n const maxPasses = 32;\n\n for (let pass = 0; pass < maxPasses && this.pendingAdditions.length > 0; pass++) {\n const remaining: Array<{ target: string; newItems: AXPMenuItem[] }> = [];\n\n for (const { target, newItems } of this.pendingAdditions) {\n const foundItem = this.findItemWithParent(items, target).foundItem;\n if (!foundItem) {\n remaining.push({ target, newItems });\n continue;\n }\n\n if (!foundItem.children) {\n foundItem.children = [];\n }\n\n for (const newItem of newItems) {\n if (newItem.name) {\n const existingChild = this.findItemByName(foundItem.children, newItem.name);\n if (existingChild) {\n this.mergeMenuItem(existingChild, newItem);\n } else {\n foundItem.children.push(newItem);\n }\n } else {\n foundItem.children.push(newItem);\n }\n }\n }\n\n if (remaining.length === this.pendingAdditions.length) {\n if (dropUnresolved) {\n for (const { target } of remaining) {\n console.warn(`Target \"${target}\" not found, nothing to add items to.`);\n }\n this.pendingAdditions = [];\n } else {\n this.pendingAdditions = remaining;\n }\n break;\n }\n\n this.pendingAdditions = remaining;\n }\n }\n\n private findItemWithParent(items: AXPMenuItem[], target: string, parentItems: AXPMenuItem[] = items): { foundItem: AXPMenuItem | null, parentItems: AXPMenuItem[] } {\n for (const item of items) {\n if (item.name === target) {\n return { foundItem: item, parentItems };\n }\n\n if (item.children) {\n const result = this.findItemWithParent(item.children, target, item.children);\n if (result.foundItem) {\n return result;\n }\n }\n }\n return { foundItem: null, parentItems: items };\n }\n\n /**\n * Find menu item by name in the items tree (recursive search)\n */\n private findItemByName(items: AXPMenuItem[], name: string): AXPMenuItem | null {\n for (const item of items) {\n if (item.name === name) {\n return item;\n }\n\n if (item.children) {\n const found = this.findItemByName(item.children, name);\n if (found) {\n return found;\n }\n }\n }\n return null;\n }\n\n private applyPendingMove(\n items: AXPMenuItem[],\n sourceName: string,\n destName: string,\n position: AXPMenuInsertion\n ): void {\n if (sourceName === destName) {\n console.warn(`moveTo: source and destination are the same (\"${sourceName}\"), ignored.`);\n return;\n }\n\n const sourceInfo = this.findItemWithParent(items, sourceName);\n const { foundItem: sourceItem, parentItems: sourceParent } = sourceInfo;\n if (!sourceItem) {\n console.warn(`moveTo: source \"${sourceName}\" not found.`);\n return;\n }\n\n const destInfo = this.findItemWithParent(items, destName);\n const { foundItem: destItem, parentItems: destParent } = destInfo;\n if (!destItem) {\n console.warn(`moveTo: destination \"${destName}\" not found.`);\n return;\n }\n\n if (this.itemIsInSubtreeOf(sourceItem, destItem)) {\n console.warn(\n `moveTo: cannot move \"${sourceName}\" because \"${destName}\" is inside the source subtree.`\n );\n return;\n }\n\n const sourceIndex = sourceParent.indexOf(sourceItem);\n if (sourceIndex === -1) {\n console.warn(`moveTo: source \"${sourceName}\" not in parent list (inconsistent).`);\n return;\n }\n sourceParent.splice(sourceIndex, 1);\n\n if (position === 'inside') {\n if (!destItem.children) {\n destItem.children = [];\n }\n destItem.children.push(sourceItem);\n return;\n }\n\n const destIndexInParent = destParent.indexOf(destItem);\n if (destIndexInParent === -1) {\n console.warn(\n `moveTo: destination \"${destName}\" not in parent list, reverting source removal.`\n );\n sourceParent.splice(sourceIndex, 0, sourceItem);\n return;\n }\n const insertIndex = position === 'before' ? destIndexInParent : destIndexInParent + 1;\n destParent.splice(insertIndex, 0, sourceItem);\n }\n\n private itemIsInSubtreeOf(root: AXPMenuItem, candidate: AXPMenuItem): boolean {\n if (root === candidate) {\n return true;\n }\n if (!root.children?.length) {\n return false;\n }\n for (const child of root.children) {\n if (child === candidate) {\n return true;\n }\n if (this.itemIsInSubtreeOf(child, candidate)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Merge new item properties into existing item, handling children merge\n */\n private mergeMenuItem(existingItem: AXPMenuItem, newItem: AXPMenuItem): void {\n // Merge top-level properties (newItem properties override existing only if defined)\n if (newItem.text !== undefined) existingItem.text = newItem.text;\n if (newItem.description !== undefined) existingItem.description = newItem.description;\n if (newItem.icon !== undefined) existingItem.icon = newItem.icon;\n if (newItem.path !== undefined) existingItem.path = newItem.path;\n if (newItem.priority !== undefined) existingItem.priority = newItem.priority;\n if (newItem.type !== undefined) existingItem.type = newItem.type;\n if (newItem.command !== undefined) existingItem.command = newItem.command;\n if (newItem.badgeKey !== undefined) existingItem.badgeKey = newItem.badgeKey;\n if (newItem.data !== undefined) existingItem.data = newItem.data;\n if (newItem.policy !== undefined) existingItem.policy = newItem.policy;\n\n // Merge children if both have children\n if (newItem.children && newItem.children.length > 0) {\n if (!existingItem.children) {\n existingItem.children = [];\n }\n\n // For each child in newItem, check if it exists by name and merge or add\n for (const newChild of newItem.children) {\n if (newChild.name) {\n const existingChild = this.findItemByName(existingItem.children, newChild.name);\n if (existingChild) {\n this.mergeMenuItem(existingChild, newChild);\n } else {\n existingItem.children.push(newChild);\n }\n } else {\n existingItem.children.push(newChild);\n }\n }\n }\n }\n\n //#endregion\n}\n\nfunction setMenuItemMeta(items: any[], parentIndex: string = '', depth: number = 0) {\n items.forEach((item, index) => {\n const currentIndex = parentIndex ? `${parentIndex}-${index}` : `${index}`;\n const hasChildren = !!(item.children && Array.isArray(item.children) && item.children.length > 0);\n\n item.meta = {\n index: currentIndex,\n isRoot: depth === 0,\n hasChildren,\n depth\n }\n\n if (hasChildren) {\n setMenuItemMeta(item.children, currentIndex, depth + 1);\n }\n });\n}\n","import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPMenuItem } from './menu.types';\nimport { inject, Injectable } from '@angular/core';\n\n/**\n * Service for checking menu item visibility based on permissions, features, and children.\n * This service helps filter out empty menu items that have no visible children.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPMenuVisibilityService {\n private sessionService = inject(AXPSessionService);\n\n /**\n * Checks visibility for a menu branch, including ancestor policies.\n * Parent module features and permissions must pass before child routes are accessible.\n */\n isMenuBranchVisible(item: AXPMenuItem, ancestors: AXPMenuItem[] = []): boolean {\n for (const menuItem of [...ancestors, item]) {\n if (!this.isItemVisible(menuItem)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Checks if a menu item should be visible based on permissions and features.\n */\n isItemVisible(item: AXPMenuItem): boolean {\n const policy = item.policy;\n if (!policy) {\n return true; // No policy means visible\n }\n\n // Check features\n if (policy.features && policy.features.length > 0) {\n const featureKeys = Array.isArray(policy.features) ? policy.features : [policy.features];\n if (!this.sessionService.isFeatureEnabled(...featureKeys)) {\n return false;\n }\n }\n\n // Check permissions\n if (policy.permissions && policy.permissions.length > 0) {\n const permissionKeys = Array.isArray(policy.permissions) ? policy.permissions : [policy.permissions];\n if (!this.sessionService.authorize(...permissionKeys)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Recursively checks if a menu item has any visible children.\n * @param item The menu item to check\n * @param getRouterLink Optional function to check if an item has a router link\n */\n hasVisibleChildren(item: AXPMenuItem, getRouterLink?: (item: AXPMenuItem) => unknown): boolean {\n if (!item.children || item.children.length === 0) {\n return false;\n }\n\n return item.children.some((child) => {\n // Check if child itself is visible\n if (!this.isItemVisible(child)) {\n return false;\n }\n\n // If child has a routerLink, it's visible\n if (getRouterLink && getRouterLink(child)) {\n return true;\n }\n\n // If child has visible children, it's visible\n if (this.hasVisibleChildren(child, getRouterLink)) {\n return true;\n }\n\n // For items without routerLink, check if they have a command (non-empty menu items)\n if (child.command) {\n return true;\n }\n\n return false;\n });\n }\n\n /**\n * Determines if a menu item should be rendered.\n * A menu item should be rendered if:\n * 1. It has a routerLink, OR\n * 2. It has visible children, OR\n * 3. It has a command (for non-router navigation)\n *\n * @param item The menu item to check\n * @param getRouterLink Optional function to check if an item has a router link\n */\n shouldRenderMenuItem(item: AXPMenuItem, getRouterLink?: (item: AXPMenuItem) => unknown): boolean {\n // Check if item itself is visible (permissions/features)\n if (!this.isItemVisible(item)) {\n return false;\n }\n\n // If it has a routerLink, render it\n if (getRouterLink && getRouterLink(item)) {\n return true;\n }\n\n // If it has visible children, render it\n if (this.hasVisibleChildren(item, getRouterLink)) {\n return true;\n }\n\n // If it has a command (for non-router navigation), render it\n if (item.command) {\n return true;\n }\n\n // Otherwise, don't render empty menu items\n return false;\n }\n}\n\n","//#region ---- Imports ----\n\nimport { AXPKeyboardShortcutBinding, AXPKeyboardShortcutPriority } from '@acorex-platform/framework-shared/core';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPKeyboardShortcutRegistry, normalizeKeyboardShortcuts } from '@acorex-platform/framework-client/core';\nimport { DestroyRef, inject, Injectable, Injector } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { AXPMenuService } from './menu.service';\nimport { AXPMenuVisibilityService } from './menu-visibility.service';\nimport { AXPMenuItem } from './menu.types';\n\n//#endregion\n\n//#region ---- Types ----\n\ninterface AXPMenuShortcutEntry {\n item: AXPMenuItem;\n ancestors: AXPMenuItem[];\n}\n\n//#endregion\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPMenuKeyboardShortcutService {\n //#region ---- Services & Dependencies ----\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly injector = inject(Injector);\n private readonly shortcutRegistry = inject(AXPKeyboardShortcutRegistry);\n private readonly visibilityService = inject(AXPMenuVisibilityService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly isAuthenticated = toSignal(this.sessionService.isAuthenticated$, { initialValue: false });\n\n //#endregion\n\n //#region ---- Public Methods ----\n\n /**\n * Registers global keyboard shortcuts declared on menu items (`shortcuts` property).\n * Replaces the previous registration when the menu tree is reloaded.\n */\n sync(items: AXPMenuItem[]): void {\n const shortcuts = this.buildShortcutBindings(items);\n\n this.shortcutRegistry.register({\n owner: this.destroyRef,\n id: 'menu-items-shortcuts',\n priority: AXPKeyboardShortcutPriority.Global,\n group: '@general:keyboard-shortcuts.groups.global',\n when: () => this.isAuthenticated() === true,\n shortcuts,\n });\n }\n\n //#endregion\n\n //#region ---- Private Methods ----\n\n private buildShortcutBindings(items: AXPMenuItem[]): AXPKeyboardShortcutBinding[] {\n const shortcuts: AXPKeyboardShortcutBinding[] = [];\n\n for (const entry of this.collectShortcutEntries(items)) {\n if (!entry.item.path && !entry.item.command) {\n continue;\n }\n\n for (const shortcut of normalizeKeyboardShortcuts(entry.item.shortcuts)) {\n for (const chord of shortcut.keys) {\n shortcuts.push({\n keys: [chord],\n title: entry.item.text,\n group: '@general:keyboard-shortcuts.groups.global',\n allowInEditableFields: shortcut.allowInEditableFields,\n directionBehavior: shortcut.directionBehavior,\n when: () => this.isShortcutActive(entry) && (shortcut.when?.() ?? true),\n handler: () => {\n this.injector.get(AXPMenuService).executeCommand(entry.item);\n },\n });\n }\n }\n }\n\n return shortcuts;\n }\n\n private collectShortcutEntries(\n items: AXPMenuItem[],\n ancestors: AXPMenuItem[] = [],\n ): AXPMenuShortcutEntry[] {\n const result: AXPMenuShortcutEntry[] = [];\n\n for (const item of items) {\n const parents = ancestors;\n if (item.shortcuts?.length) {\n result.push({ item, ancestors: parents });\n }\n\n if (item.children?.length) {\n result.push(...this.collectShortcutEntries(item.children, [...parents, item]));\n }\n }\n\n return result;\n }\n\n private isShortcutActive(entry: AXPMenuShortcutEntry): boolean {\n if (this.isAuthenticated() !== true) {\n return false;\n }\n\n return this.visibilityService.isMenuBranchVisible(entry.item, entry.ancestors);\n }\n\n //#endregion\n}\n","import { AXPSessionService, AXPSessionStatus } from '@acorex-platform/framework-client/auth';\nimport { AXPExecuteCommand } from '@acorex-platform/framework-shared/core';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { patchState, signalStore, withHooks, withMethods, withState } from '@ngrx/signals';\nimport {\n distinctUntilChanged,\n filter,\n firstValueFrom,\n from,\n map,\n combineLatest,\n Subscription,\n switchMap,\n} from 'rxjs';\nimport { AXPMenuProviderService } from './menu.provider';\nimport { AXPMenuKeyboardShortcutService } from './menu-keyboard-shortcuts.service';\nimport { axpFindMenuItemByRoute } from './menu-route-matcher';\nimport { AXPMenuItem } from './menu.types';\n\n//#region ----- Helpers -----\n\nfunction axpMenuItemNeedsUpdate(item: AXPMenuItem, updates: Partial<AXPMenuItem>): boolean {\n return (Object.keys(updates) as Array<keyof AXPMenuItem>).some((key) => item[key] !== updates[key]);\n}\n\n/** Immutably patches the first menu item with the given name. */\nfunction axpUpdateMenuItemByName(\n items: AXPMenuItem[],\n name: string,\n updates: Partial<AXPMenuItem>,\n): { items: AXPMenuItem[]; changed: boolean } {\n let changed = false;\n\n const walk = (list: AXPMenuItem[]): AXPMenuItem[] => {\n let listChanged = false;\n const next = list.map((item) => {\n if (item.name === name) {\n if (!axpMenuItemNeedsUpdate(item, updates)) {\n return item;\n }\n changed = true;\n listChanged = true;\n return { ...item, ...updates };\n }\n\n if (item.children?.length) {\n const children = walk(item.children);\n if (children !== item.children) {\n listChanged = true;\n return { ...item, children };\n }\n }\n\n return item;\n });\n\n return listChanged ? next : list;\n };\n\n return { items: walk(items), changed };\n}\n\n//#endregion\n\nexport const AXPMenuService = signalStore(\n { providedIn: 'root' },\n\n // Initial State\n withState((router = inject(Router)) => {\n return {\n items: [] as AXPMenuItem[],\n selectedMenuItem: {\n item: null as AXPMenuItem | null,\n isFullMatch: false,\n },\n };\n }),\n\n // Methods for State Management\n withMethods(\n (\n store,\n router = inject(Router),\n commandService = inject(AXPCommandService),\n ) => {\n return {\n setMenuItems(items: AXPMenuItem[]): void {\n patchState(store, { items: items });\n },\n\n /**\n * Patches a single menu item by `name` without rebuilding the full menu tree.\n * Returns true when an item was found and its data changed.\n */\n updateItem(name: string, updates: Partial<AXPMenuItem>): boolean {\n if (!name) {\n return false;\n }\n\n const { items, changed } = axpUpdateMenuItemByName(store.items(), name, updates);\n if (!changed) {\n return false;\n }\n\n patchState(store, { items });\n return true;\n },\n\n selectMenuItemByRoute(path: string): void {\n const match = axpFindMenuItemByRoute(store.items(), path, ['list', 'view', 'edit', 'create']);\n patchState(store, {\n selectedMenuItem: {\n item: match?.item ?? null,\n isFullMatch: match ? !match.isPartialMatch : false,\n },\n });\n },\n\n executeCommand(item: AXPMenuItem): void {\n if (item.path) {\n void commandService.execute('navigate', { path: item.path });\n patchState(store, { selectedMenuItem: { item, isFullMatch: true } });\n }\n if (item.command) {\n const command = item.command as AXPExecuteCommand;\n if (commandService.exists(command?.name)) {\n void commandService.execute(command.name, command.options ?? {});\n }\n }\n },\n\n isItemOpen(item: AXPMenuItem): boolean {\n const selectedItem = store.selectedMenuItem().item;\n if (!selectedItem) {\n return false;\n }\n\n if (item === selectedItem || (item.name && item.name === selectedItem.name)) {\n return true;\n }\n\n const findParent = (currentItem: AXPMenuItem, targetItem: AXPMenuItem): boolean => {\n if (\n currentItem.children?.some(\n (child) => child === targetItem || (child.name && child.name === targetItem.name),\n )\n ) {\n return true;\n }\n return currentItem.children?.some((child) => findParent(child, targetItem)) ?? false;\n };\n\n return findParent(item, selectedItem);\n },\n };\n },\n ),\n withHooks((\n store,\n menuProviderService = inject(AXPMenuProviderService),\n menuKeyboardShortcuts = inject(AXPMenuKeyboardShortcutService),\n router = inject(Router),\n sessionService = inject(AXPSessionService),\n ) => {\n let reloadSubscription: ReturnType<typeof menuProviderService.menuReload$.subscribe> | undefined;\n let accessPolicySubscription: Subscription | undefined;\n let sessionStatusSubscription: Subscription | undefined;\n let reloadGeneration = 0;\n\n const applyMenuItems = (items: AXPMenuItem[]): void => {\n patchState(store, { items });\n menuKeyboardShortcuts.sync(items);\n store.selectMenuItemByRoute(router.url);\n };\n\n const rebuildMenu = async (generation: number): Promise<void> => {\n const authorized = await firstValueFrom(sessionService.isAuthorized$);\n if (!authorized || !sessionService.application?.id) {\n if (generation === reloadGeneration) {\n applyMenuItems([]);\n }\n return;\n }\n\n const userId = sessionService.user?.id;\n const applicationId = sessionService.application?.id;\n const items = await menuProviderService.items();\n if (generation !== reloadGeneration) {\n return;\n }\n // Drop stale rebuilds if user/app changed while providers were resolving.\n if (\n !sessionService.isAuthorized ||\n sessionService.user?.id !== userId ||\n sessionService.application?.id !== applicationId\n ) {\n return;\n }\n applyMenuItems(items);\n };\n\n return {\n onInit() {\n // Subscribe to menu reload events.\n reloadSubscription = menuProviderService.menuReload$.subscribe(() => {\n const generation = ++reloadGeneration;\n void rebuildMenu(generation);\n });\n\n // Drop menus on logout / session clear (quiet — do not trigger a rebuild race).\n sessionStatusSubscription = sessionService.status$\n .pipe(\n filter(\n (status) =>\n status === AXPSessionStatus.Unauthenticated ||\n status === AXPSessionStatus.SignedOut ||\n status === AXPSessionStatus.Expired,\n ),\n )\n .subscribe(() => {\n reloadGeneration++;\n menuProviderService.invalidateCacheQuietly();\n applyMenuItems([]);\n });\n\n // Rebuild when Authorized + application + policy identity are ready.\n // Emit null while not Authorized so re-Authorize with the same key still rebuilds\n // (updateToken demotes to Authenticated and previously stuck empty menus).\n accessPolicySubscription = combineLatest([\n sessionService.isAuthorized$,\n sessionService.user$,\n sessionService.application$,\n sessionService.permissions$,\n sessionService.features$,\n ])\n .pipe(\n map(([isAuthorized, user, application, permissions, features]) => {\n if (!isAuthorized || !application?.id) {\n return null;\n }\n return `${user?.id ?? ''}:${application.id}:${permissions.length}:${features.length}`;\n }),\n distinctUntilChanged(),\n filter((key): key is string => key != null),\n switchMap((key) => {\n const generation = ++reloadGeneration;\n menuProviderService.invalidateCacheQuietly();\n return from(\n (async () => {\n await rebuildMenu(generation);\n return key;\n })(),\n );\n }),\n )\n .subscribe();\n\n // Initial load: wait until the session is Authorized (not a one-shot false on login).\n void (async () => {\n await firstValueFrom(\n sessionService.isAuthorized$.pipe(filter((authorized) => authorized)),\n );\n menuProviderService.clearCache();\n })();\n },\n onDestroy() {\n reloadSubscription?.unsubscribe();\n accessPolicySubscription?.unsubscribe();\n sessionStatusSubscription?.unsubscribe();\n },\n };\n }),\n);\n","import { defaultTo } from 'lodash-es';\n\n//#region ---- Tab Key ----\n\n/** Query params ignored when building a tab dedupe key. */\nconst IGNORED_QUERY_KEYS = new Set(['_ts']);\n\n/**\n * Builds a stable tab key from a router URL.\n * Path segments define identity; query params are excluded so the same entity record\n * or list reuses one tab even when filters or refresh tokens change.\n */\nexport function axpBuildTabKey(url: string): string {\n const normalized = normalizeRouterUrl(url);\n const pathOnly = normalized.split('?')[0].split('#')[0];\n return pathOnly;\n}\n\n/** Normalizes a router URL for storage and navigation. */\nexport function normalizeRouterUrl(url: string): string {\n const trimmed = url.trim();\n if (!trimmed.length) {\n return '/';\n }\n\n const withLeadingSlash = trimmed.startsWith('/') ? trimmed : `/${trimmed}`;\n const [pathAndFragment, queryString = ''] = withLeadingSlash.split('?');\n const [pathPart, fragment = ''] = pathAndFragment.split('#');\n\n const normalizedPath = pathPart.replace(/\\/+$/, '') || '/';\n const filteredQuery = filterQueryString(queryString);\n\n let result = normalizedPath;\n if (filteredQuery) {\n result += `?${filteredQuery}`;\n }\n if (fragment) {\n result += `#${fragment}`;\n }\n return result;\n}\n\nfunction filterQueryString(queryString: string): string {\n if (!queryString) {\n return '';\n }\n\n const params = new URLSearchParams(queryString);\n const kept: string[] = [];\n params.forEach((value, key) => {\n if (!IGNORED_QUERY_KEYS.has(key)) {\n kept.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n }\n });\n kept.sort();\n return kept.join('&');\n}\n\n/** Human-readable fallback title from the URL path. */\nexport function axpFallbackTabTitle(url: string): string {\n const pathOnly = url.split('?')[0].split('#')[0];\n const segments = pathOnly.split('/').filter(Boolean);\n const last = defaultTo(segments[segments.length - 1], 'Page');\n return decodeURIComponent(last);\n}\n\n//#endregion\n","//#region ---- Types ----\n\nexport type AXPNavigationMode = 'simple' | 'tabular';\n\nexport const AXP_HOME_TAB_KEY = 'axp:home';\n\n/** Route `data` key for tab-navigation behavior (`data.tab`). */\nexport const AXP_TAB_ROUTE_DATA_KEY = 'tab';\n\n/**\n * Set `data.tab = true` on the route that should act as the tab boundary.\n * Child navigations under this route update the same tab rather than opening a new one.\n */\nexport type AXPTabRouteData = true;\n\nexport interface AXPTabDescriptor {\n /** Stable dedupe key derived from the route (path-based, query excluded). */\n key: string;\n /** Full router URL including query string and fragment. */\n url: string;\n title: string;\n /** Resolved breadcrumb segments used for tab chrome (leaf/prefix); avoids parsing joined titles. */\n titleSegments?: string[];\n icon?: string;\n pinned: boolean;\n closable: boolean;\n /** Timestamp used for LRU eviction when max tabs is reached. */\n openedAt: number;\n /** Updated whenever the tab becomes active. */\n lastActivatedAt: number;\n}\n\nexport interface AXPTabSessionState {\n tabs: AXPTabDescriptor[];\n activeTabKey: string | null;\n}\n\n/** Optional hook for confirming closure of a cached background tab (no router navigation). */\nexport interface AXPTabCloseConfirm {\n onBeforeTabClose(): boolean | Promise<boolean>;\n}\n\n//#endregion\n","import { ActivatedRouteSnapshot, Router, Routes } from '@angular/router';\nimport { normalizeRouterUrl } from './tab-key.util';\nimport { AXP_TAB_ROUTE_DATA_KEY } from './tab-navigation.types';\n\n//#region ---- Route Data ----\n\n/** True when the route declares itself as a scoped tab root (`data.tab = true`). */\nexport function axpHasTabScope(data: Record<string, unknown> | undefined): boolean {\n return data?.[AXP_TAB_ROUTE_DATA_KEY] === true;\n}\n\n//#endregion\n\n//#region ---- Snapshot Resolution ----\n\n/** Resolved URL path for a snapshot (no query or fragment). */\nexport function axpPathFromSnapshot(snapshot: ActivatedRouteSnapshot): string {\n const segments = snapshot.pathFromRoot\n .flatMap((entry) => entry.url.map((segment) => segment.path))\n .filter(Boolean);\n return segments.length ? `/${segments.join('/')}` : '/';\n}\n\n/** Returns the leaf snapshot under the router state root. */\nexport function axpGetLeafRouteSnapshot(root: ActivatedRouteSnapshot): ActivatedRouteSnapshot {\n let route = root;\n while (route.firstChild) {\n route = route.firstChild;\n }\n return route;\n}\n\n/**\n * Resolves the tab dedupe key from an activated route tree.\n * Uses the nearest ancestor with `data.tab = true`; otherwise the leaf path.\n */\nexport function axpResolveTabKeyFromSnapshot(leaf: ActivatedRouteSnapshot): string {\n const chain = leaf.pathFromRoot;\n\n for (let index = chain.length - 1; index >= 0; index--) {\n const snapshot = chain[index];\n if (axpHasTabScope(snapshot.data)) {\n return axpPathFromSnapshot(snapshot);\n }\n }\n\n return axpPathFromSnapshot(leaf);\n}\n\n//#endregion\n\n//#region ---- Router / URL Resolution ----\n\n/**\n * Resolves a tab key for the given URL (or the current router URL).\n * Prefers the live route snapshot when it matches the target URL; otherwise matches route config.\n */\nexport function axpResolveTabKey(router: Router, url?: string): string {\n const normalized = normalizeRouterUrl(url ?? router.url);\n const pathOnly = normalized.split('?')[0].split('#')[0];\n\n const currentPath = normalizeRouterUrl(router.url).split('?')[0].split('#')[0];\n if (!url || pathOnly === currentPath) {\n const leaf = axpGetLeafRouteSnapshot(router.routerState.snapshot.root);\n return axpResolveTabKeyFromSnapshot(leaf);\n }\n\n const fromConfig = axpResolveTabKeyFromRouteConfig(router.config, pathOnly);\n if (fromConfig) {\n return fromConfig;\n }\n\n return pathOnly.startsWith('/') ? pathOnly : `/${pathOnly}`;\n}\n\n//#endregion\n\n//#region ---- Route Config Matching ----\n\ninterface MatchedRouteLevel {\n mergedData: Record<string, unknown>;\n path: string;\n}\n\n/**\n * Matches a URL path against registered routes and resolves the tab key from `data.tab`.\n */\nexport function axpResolveTabKeyFromRouteConfig(routes: Routes, pathOnly: string): string | null {\n const normalized = pathOnly.startsWith('/') ? pathOnly.replace(/\\/+$/, '') || '/' : `/${pathOnly}`.replace(/\\/+$/, '') || '/';\n const segments = normalized === '/' ? [] : normalized.split('/').filter(Boolean);\n const chain = matchRouteConfigChain(routes, segments, 0, {}, []);\n\n if (!chain?.length) {\n return null;\n }\n\n for (let index = chain.length - 1; index >= 0; index--) {\n const level = chain[index];\n if (axpHasTabScope(level.mergedData)) {\n return level.path;\n }\n }\n\n return chain[chain.length - 1]?.path ?? null;\n}\n\nfunction matchRouteConfigChain(\n routes: Routes,\n segments: string[],\n startIndex: number,\n inheritedData: Record<string, unknown>,\n chain: MatchedRouteLevel[],\n): MatchedRouteLevel[] | null {\n let bestMatch: MatchedRouteLevel[] | null = null;\n\n for (const route of routes) {\n if (route.redirectTo) {\n continue;\n }\n\n const segmentMatch = matchRoutePath(route.path ?? '', segments, startIndex);\n if (!segmentMatch) {\n continue;\n }\n\n const pathSegments = [...segments.slice(0, startIndex), ...segments.slice(startIndex, startIndex + segmentMatch.consumed)];\n const path = pathSegments.length ? `/${pathSegments.join('/')}` : '/';\n const mergedData: Record<string, unknown> = { ...inheritedData, ...(route.data ?? {}) };\n const level: MatchedRouteLevel = { mergedData, path };\n const nextChain = [...chain, level];\n const nextIndex = startIndex + segmentMatch.consumed;\n\n if (route.children?.length) {\n const childMatch = matchRouteConfigChain(route.children, segments, nextIndex, mergedData, nextChain);\n if (childMatch && (!bestMatch || childMatch.length > bestMatch.length)) {\n bestMatch = childMatch;\n }\n }\n\n if (nextIndex === segments.length) {\n if (!bestMatch || nextChain.length > bestMatch.length) {\n bestMatch = nextChain;\n }\n }\n }\n\n return bestMatch;\n}\n\nfunction matchRoutePath(\n routePath: string,\n segments: string[],\n startIndex: number,\n): { consumed: number } | null {\n if (routePath === '**') {\n return { consumed: Math.max(0, segments.length - startIndex) };\n }\n\n const parts = routePath.split('/').filter(Boolean);\n if (!parts.length) {\n return { consumed: 0 };\n }\n\n let consumed = 0;\n for (const part of parts) {\n const segment = segments[startIndex + consumed];\n if (segment === undefined) {\n return null;\n }\n\n if (part.startsWith(':') || part === segment) {\n consumed++;\n continue;\n }\n\n return null;\n }\n\n return { consumed };\n}\n\n//#endregion\n","//#region ---- Tab Title ----\n\nexport const AXP_TAB_BREADCRUMB_JOIN_SEPARATOR = ' - ';\n\nexport interface AXPTabTitleParts {\n prefix: string | null;\n leaf: string;\n}\n\n/** Joins breadcrumb segments for the stored tab title and tooltip full label. */\nexport function axpJoinTabTitleSegments(segments: string[]): string {\n return segments.join(AXP_TAB_BREADCRUMB_JOIN_SEPARATOR);\n}\n\n/** Derives compact tab label parts from structured breadcrumb segments. */\nexport function axpResolveTabTitleParts(\n tab: { titleSegments?: string[] },\n fallbackTitle: string,\n): AXPTabTitleParts {\n const segments = tab.titleSegments;\n if (!segments?.length) {\n return { prefix: null, leaf: fallbackTitle };\n }\n\n if (segments.length === 1) {\n return { prefix: null, leaf: segments[0] };\n }\n\n return {\n prefix: axpJoinTabTitleSegments(segments.slice(0, -1)),\n leaf: segments[segments.length - 1],\n };\n}\n\n//#endregion\n","import { Injectable, signal } from '@angular/core';\nimport type { AXPTabStructuredPreview } from './tab-preview.types';\n\n//#region ---- Tab Preview Service ----\n\n/**\n * In-memory structured previews for tab hover cards and dirty indicators.\n * Populated by active/cached pages via {@link AXPPageLayoutBaseComponent}.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPTabPreviewService {\n //#region ---- State ----\n\n private readonly previewMap = signal<Readonly<Record<string, AXPTabStructuredPreview>>>({});\n\n readonly previews = this.previewMap.asReadonly();\n\n //#endregion\n\n //#region ---- Public API ----\n\n setPreview(key: string, preview: AXPTabStructuredPreview): void {\n this.previewMap.update((current) => ({\n ...current,\n [key]: preview,\n }));\n }\n\n patchPreview(key: string, patch: Partial<AXPTabStructuredPreview>): void {\n this.previewMap.update((current) => {\n const existing = current[key];\n if (!existing) {\n if (!patch.url) {\n return current;\n }\n\n return {\n ...current,\n [key]: {\n title: patch.title ?? '',\n url: patch.url,\n icon: patch.icon,\n subtitle: patch.subtitle,\n isDirty: patch.isDirty ?? false,\n breadcrumbTrail: patch.breadcrumbTrail ?? [],\n },\n };\n }\n\n return {\n ...current,\n [key]: {\n ...existing,\n ...patch,\n },\n };\n });\n }\n\n getPreview(key: string): AXPTabStructuredPreview | undefined {\n return this.previewMap()[key];\n }\n\n isTabDirty(key: string): boolean {\n return !!this.previewMap()[key]?.isDirty;\n }\n\n clearPreview(key: string): void {\n this.previewMap.update((current) => {\n if (!(key in current)) {\n return current;\n }\n\n const next = { ...current };\n delete next[key];\n return next;\n });\n }\n\n clearPreviews(keys: Iterable<string>): void {\n const keySet = new Set(keys);\n if (!keySet.size) {\n return;\n }\n\n this.previewMap.update((current) => {\n const next: Record<string, AXPTabStructuredPreview> = { ...current };\n let changed = false;\n\n for (const key of keySet) {\n if (key in next) {\n delete next[key];\n changed = true;\n }\n }\n\n return changed ? next : current;\n });\n }\n\n clearAll(): void {\n this.previewMap.set({});\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Tab Route Policy ----\n\nconst EXCLUDED_PATH_PREFIXES = ['/auth', '/error'] as const;\n\nconst EXCLUDED_PATH_PATTERNS: RegExp[] = [\n /^\\/assessment\\/fill\\//i,\n /^\\/forms\\//i,\n];\n\n/**\n * Returns true when the URL represents an in-app page that may appear in the tab bar.\n */\nexport function axpIsTabEligibleUrl(url: string): boolean {\n const pathOnly = url.split('?')[0].split('#')[0].trim();\n if (!pathOnly || pathOnly === '/') {\n return false;\n }\n\n const normalized = pathOnly.startsWith('/') ? pathOnly : `/${pathOnly}`;\n\n if (EXCLUDED_PATH_PREFIXES.some((prefix) => normalized.startsWith(prefix))) {\n return false;\n }\n\n if (EXCLUDED_PATH_PATTERNS.some((pattern) => pattern.test(normalized))) {\n return false;\n }\n\n return true;\n}\n\n//#endregion\n","import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPDeviceService } from '@acorex-platform/framework-client/core';\nimport { computed, DestroyRef, effect, inject, Injectable, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, NavigationExtras, Router } from '@angular/router';\nimport { cloneDeep, defaultTo } from 'lodash-es';\nimport { filter } from 'rxjs/operators';\nimport { AXPCommonSettings } from '../configs/common-settings.key';\nimport { AXPHomePageService } from '../home-page/home-page.service';\nimport { axpFindMenuItemByRoute } from '../layout/menu/menu-route-matcher';\nimport { AXPMenuService } from '../layout/menu/menu.service';\nimport { AXPSettingsService } from '../settings/settings.service';\nimport { AXPUnsavedChangesConfirmService } from '../settings/unsaved-changes-confirm.service';\nimport { axpNavigateAppPath } from '../utils/app-path-navigation.util';\nimport { axpFallbackTabTitle, normalizeRouterUrl } from './tab-key.util';\nimport { axpJoinTabTitleSegments } from './tab-title.util';\nimport {\n AXP_HOME_TAB_KEY,\n type AXPNavigationMode,\n type AXPTabCloseConfirm,\n type AXPTabDescriptor,\n type AXPTabSessionState,\n} from './tab-navigation.types';\nimport { AXPTabPreviewService } from './tab-preview.service';\nimport { AXPTabRouteCacheRegistry } from './tab-route-cache.registry';\nimport { axpIsTabEligibleUrl } from './tab-route-policy';\nimport { axpResolveTabKey } from './tab-route-resolver';\n\n//#region ---- Constants ----\n\nconst SESSION_STORAGE_PREFIX = 'AXP_TAB_NAV';\n\n//#endregion\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPTabNavigationService {\n //#region ---- Services & Dependencies ----\n\n private readonly router = inject(Router);\n private readonly settingsService = inject(AXPSettingsService);\n private readonly deviceService = inject(AXPDeviceService);\n private readonly menuService = inject(AXPMenuService);\n private readonly homePageService = inject(AXPHomePageService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly routeCacheRegistry = inject(AXPTabRouteCacheRegistry);\n private readonly tabPreviewService = inject(AXPTabPreviewService);\n private readonly unsavedChangesConfirm = inject(AXPUnsavedChangesConfirmService);\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ---- State ----\n\n private readonly navigationMode = signal<AXPNavigationMode>('simple');\n private readonly maxOpenTabs = signal(5);\n private readonly tabs = signal<AXPTabDescriptor[]>([]);\n private readonly activeTabKey = signal<string | null>(null);\n private suppressNavigationSync = false;\n\n //#endregion\n\n //#region ---- Computed ----\n\n /** Effective mode: mobile always uses simple navigation. */\n readonly effectiveMode = computed<AXPNavigationMode>(() => {\n if (this.deviceService.isSmall()) {\n return 'simple';\n }\n return this.navigationMode();\n });\n\n readonly isTabBarVisible = computed(() => this.effectiveMode() === 'tabular' && this.tabs().length > 0);\n\n readonly tabList = this.tabs.asReadonly();\n readonly activeKey = this.activeTabKey.asReadonly();\n\n //#endregion\n\n //#region ---- Lifecycle ----\n\n constructor() {\n void this.loadSettings();\n this.bindRouterEvents();\n this.bindSettingsChanges();\n this.bindSessionChanges();\n this.bindRouteCacheSync();\n }\n\n //#endregion\n\n //#region ---- Public API ----\n\n /** Navigates to a path, opening or activating a tab when tabular mode is active. */\n async navigate(path: string, extras?: NavigationExtras): Promise<boolean> {\n const normalizedPath = normalizeRouterUrl(path);\n\n if (this.effectiveMode() === 'simple' || !axpIsTabEligibleUrl(normalizedPath)) {\n return axpNavigateAppPath(this.router, normalizedPath, extras);\n }\n\n await this.openOrActivateTab(normalizedPath);\n return true;\n }\n\n /** Opens a tab or activates an existing tab with the same key. */\n async openOrActivateTab(url: string, title?: string): Promise<void> {\n if (this.effectiveMode() === 'simple') {\n await axpNavigateAppPath(this.router, url);\n return;\n }\n\n const normalizedUrl = normalizeRouterUrl(url);\n if (!axpIsTabEligibleUrl(normalizedUrl)) {\n await axpNavigateAppPath(this.router, normalizedUrl);\n return;\n }\n\n await this.ensureHomeTab();\n\n if (this.isHomePageUrl(normalizedUrl)) {\n await this.activateTabKey(AXP_HOME_TAB_KEY, normalizedUrl);\n return;\n }\n\n const resolvedKey = axpResolveTabKey(this.router, normalizedUrl);\n const existing = this.findTabForUrl(normalizedUrl);\n\n if (existing) {\n if (existing.key !== resolvedKey) {\n this.migrateTabKey(existing.key, resolvedKey);\n }\n this.updateTabUrl(resolvedKey, normalizedUrl);\n await this.activateTabKey(resolvedKey, normalizedUrl);\n return;\n }\n\n // Navigate first so scoped tab keys (`data.tab`) resolve from the live route snapshot.\n this.suppressNavigationSync = true;\n try {\n await axpNavigateAppPath(this.router, normalizedUrl);\n const key = axpResolveTabKey(this.router);\n const postNavExisting = this.findTabForUrl(normalizedUrl);\n\n if (postNavExisting) {\n if (postNavExisting.key !== key) {\n this.migrateTabKey(postNavExisting.key, key);\n }\n this.updateTabUrl(key, normalizedUrl);\n this.touchTab(key);\n this.activeTabKey.set(key);\n this.persistSession();\n return;\n }\n\n this.insertTab(this.createTabDescriptor(normalizedUrl, title, key));\n this.activeTabKey.set(key);\n this.persistSession();\n } finally {\n this.suppressNavigationSync = false;\n }\n }\n\n /**\n * Activates a tab and navigates to its URL. The previously active page is detached and cached by\n * the reuse strategy, so its state is preserved; this tab's cached instance is reattached when\n * available instead of being re-rendered.\n *\n * @param suspendDeactivateGuard When true (default for tab switches), unsaved-changes prompts are\n * skipped so switching tabs keeps a dirty page alive. Closing a tab passes false to keep the prompt.\n */\n async activateTabKey(key: string, urlOverride?: string, suspendDeactivateGuard = true): Promise<void> {\n const tab = this.tabs().find((item) => item.key === key);\n if (!tab) {\n return;\n }\n\n const targetUrl = urlOverride ?? tab.url;\n this.touchTab(key);\n this.activeTabKey.set(key);\n this.persistSession();\n\n const navigate = async (): Promise<void> => {\n this.suppressNavigationSync = true;\n try {\n await this.router.navigateByUrl(targetUrl);\n } finally {\n this.suppressNavigationSync = false;\n }\n };\n\n if (suspendDeactivateGuard) {\n await this.routeCacheRegistry.runWithSuspendedDeactivateGuards(navigate);\n return;\n }\n\n await navigate();\n }\n\n /** Closes a tab and navigates to a neighbor when the active tab is closed. */\n async closeTab(key: string): Promise<void> {\n await this.closeTabs([key]);\n }\n\n /** Closes every closable tab except the given key (pinned tabs are kept). */\n async closeOtherTabs(keepKey: string): Promise<void> {\n const keys = this.tabs()\n .filter((tab) => tab.closable && !tab.pinned && tab.key !== keepKey)\n .map((tab) => tab.key);\n await this.closeTabs(keys);\n }\n\n /** Closes all closable tabs (pinned tabs are kept). */\n async closeAllTabs(): Promise<void> {\n const keys = this.tabs()\n .filter((tab) => tab.closable && !tab.pinned)\n .map((tab) => tab.key);\n await this.closeTabs(keys);\n }\n\n /** Toggles whether a tab stays pinned in the strip (home tab is always pinned). */\n toggleTabPinned(key: string): void {\n if (key === AXP_HOME_TAB_KEY) {\n return;\n }\n\n this.tabs.update((items) => {\n const updated = items.map((tab) => {\n if (tab.key !== key) {\n return tab;\n }\n\n const pinned = !tab.pinned;\n return {\n ...tab,\n pinned,\n closable: !pinned,\n };\n });\n\n return this.normalizeTabOrder(updated);\n });\n this.persistSession();\n }\n\n /**\n * Reorders tabs after drag-and-drop. Home stays first; pinned and unpinned tabs cannot cross groups.\n */\n reorderTabs(previousIndex: number, currentIndex: number): void {\n if (previousIndex === currentIndex) {\n return;\n }\n\n const items = this.tabs();\n if (previousIndex < 0 || currentIndex < 0 || previousIndex >= items.length || currentIndex >= items.length) {\n return;\n }\n\n const moving = items[previousIndex];\n if (moving.key === AXP_HOME_TAB_KEY) {\n return;\n }\n\n const lastPinnedIndex = this.getLastPinnedTabIndex(items);\n let targetIndex = currentIndex;\n\n if (moving.pinned) {\n if (targetIndex === 0) {\n return;\n }\n targetIndex = Math.max(1, Math.min(targetIndex, lastPinnedIndex));\n } else {\n const firstUnpinnedIndex = lastPinnedIndex + 1;\n if (firstUnpinnedIndex >= items.length) {\n return;\n }\n targetIndex = Math.max(firstUnpinnedIndex, Math.min(targetIndex, items.length - 1));\n }\n\n if (previousIndex === targetIndex) {\n return;\n }\n\n const next = [...items];\n const [removed] = next.splice(previousIndex, 1);\n next.splice(targetIndex, 0, removed);\n this.tabs.set(next);\n this.persistSession();\n }\n\n /** Updates a tab title from the current page chrome (e.g. breadcrumb trail). */\n syncTabTitle(key: string, titleOrSegments: string | string[]): void {\n if (this.effectiveMode() === 'simple') {\n return;\n }\n\n if (!this.tabs().some((tab) => tab.key === key)) {\n return;\n }\n\n const segments = Array.isArray(titleOrSegments) ? titleOrSegments : undefined;\n const title = (Array.isArray(titleOrSegments) ? axpJoinTabTitleSegments(titleOrSegments) : titleOrSegments).trim();\n if (!title || this.isGenericHomeTitle(title)) {\n return;\n }\n\n this.updateTabTitle(key, title, segments);\n }\n\n /** Updates a tab icon from the current page chrome or menu metadata. */\n syncTabIcon(key: string, icon: string): void {\n if (this.effectiveMode() === 'simple') {\n return;\n }\n\n if (!this.tabs().some((tab) => tab.key === key)) {\n return;\n }\n\n const normalized = icon.trim();\n if (!normalized) {\n return;\n }\n\n this.updateTabIcon(key, normalized);\n }\n\n //#endregion\n\n //#region ---- Bulk Tab Close ----\n\n /** Closes multiple tabs in one update; navigates once when the active tab is closed. */\n private async closeTabs(keys: string[]): Promise<void> {\n const uniqueKeys = [...new Set(keys)];\n if (!uniqueKeys.length) {\n return;\n }\n\n const closableKeySet = new Set(\n uniqueKeys.filter((key) => {\n const tab = this.tabs().find((item) => item.key === key);\n return !!tab?.closable && !tab.pinned;\n }),\n );\n\n if (!closableKeySet.size) {\n return;\n }\n\n const activeKey = this.activeTabKey();\n const backgroundKeys = [...closableKeySet].filter((key) => key !== activeKey);\n\n for (const key of backgroundKeys) {\n if (!(await this.confirmBackgroundTabClose(key))) {\n closableKeySet.delete(key);\n }\n }\n\n if (!closableKeySet.size) {\n return;\n }\n\n const currentTabs = this.tabs();\n const wasActiveClosed = !!activeKey && closableKeySet.has(activeKey);\n const closedActiveIndex = wasActiveClosed ? currentTabs.findIndex((item) => item.key === activeKey) : -1;\n const nextTabs = currentTabs.filter((item) => !closableKeySet.has(item.key));\n\n if (wasActiveClosed) {\n const navigated = await this.navigateAwayBeforeClosingActiveTab(closedActiveIndex, nextTabs);\n if (!navigated) {\n return;\n }\n }\n\n this.tabs.set(nextTabs);\n this.tabPreviewService.clearPreviews(closableKeySet);\n this.persistSession();\n }\n\n //#endregion\n\n //#region ---- Tab Close Helpers ----\n\n /**\n * Prompts before closing a cached background tab. Uses the page's {@link AXPTabCloseConfirm}\n * hook when available, otherwise falls back to the tab preview dirty flag.\n */\n private async confirmBackgroundTabClose(key: string): Promise<boolean> {\n const instance = this.routeCacheRegistry.getComponentInstance<AXPTabCloseConfirm>(key);\n if (instance && typeof instance.onBeforeTabClose === 'function') {\n return instance.onBeforeTabClose();\n }\n\n return this.unsavedChangesConfirm.confirmIfDirty(this.tabPreviewService.isTabDirty(key), {\n approveLeaveOnConfirm: false,\n });\n }\n\n //#endregion\n\n //#region ---- Tab Close Navigation ----\n\n /**\n * Navigates away from the active tab before it is removed so canDeactivate runs while the tab is still visible.\n * Returns false when navigation was cancelled (e.g. unsaved-changes confirmation declined).\n */\n private async navigateAwayBeforeClosingActiveTab(\n closedActiveIndex: number,\n remainingTabs: AXPTabDescriptor[],\n ): Promise<boolean> {\n const fallbackIndex = this.resolveFallbackTabIndex(closedActiveIndex, remainingTabs);\n const fallback = fallbackIndex >= 0 ? remainingTabs[fallbackIndex] : undefined;\n\n let targetKey: string;\n let targetUrl: string;\n\n if (fallback) {\n targetKey = fallback.key;\n targetUrl = fallback.url;\n } else {\n await this.ensureHomeTab();\n const home = this.tabs().find((item) => item.key === AXP_HOME_TAB_KEY);\n if (!home) {\n return false;\n }\n targetKey = home.key;\n targetUrl = home.url;\n }\n\n this.suppressNavigationSync = true;\n try {\n const navigated = await this.router.navigateByUrl(targetUrl);\n if (!navigated) {\n return false;\n }\n } finally {\n this.suppressNavigationSync = false;\n }\n\n this.activeTabKey.set(targetKey);\n this.touchTab(targetKey);\n return true;\n }\n\n /** Prefers the tab to the right after removal, then the tab to the left (browser-like). */\n private resolveFallbackTabIndex(closedIndex: number, remainingTabs: AXPTabDescriptor[]): number {\n if (!remainingTabs.length) {\n return -1;\n }\n\n if (closedIndex < remainingTabs.length) {\n return closedIndex;\n }\n\n return closedIndex - 1;\n }\n\n //#endregion\n\n //#region ---- Route Cache Sync ----\n\n /**\n * Keeps the route cache registry aligned with the current navigation mode and the set of open\n * tabs. Cached page instances for closed/evicted tabs are destroyed by the registry.\n */\n private bindRouteCacheSync(): void {\n effect(() => {\n this.routeCacheRegistry.setEnabled(this.effectiveMode() === 'tabular');\n this.routeCacheRegistry.syncOpenKeys(\n this.tabs().map((tab) => tab.key),\n this.tabs().map((tab) => tab.url),\n );\n });\n }\n\n //#endregion\n\n //#region ---- Router Sync ----\n\n private bindRouterEvents(): void {\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((event: NavigationEnd) => {\n void this.handleNavigationEnd(event.urlAfterRedirects);\n });\n }\n\n private async handleNavigationEnd(url: string): Promise<void> {\n if (this.suppressNavigationSync) {\n return;\n }\n\n if (this.effectiveMode() === 'simple') {\n return;\n }\n\n const normalizedUrl = normalizeRouterUrl(url);\n if (!axpIsTabEligibleUrl(normalizedUrl)) {\n return;\n }\n\n await this.ensureHomeTab();\n\n if (this.isHomePageUrl(normalizedUrl)) {\n this.activateHomeTabForUrl(normalizedUrl);\n return;\n }\n\n const key = axpResolveTabKey(this.router, normalizedUrl);\n const existing = this.findTabForUrl(normalizedUrl);\n\n if (existing) {\n if (existing.key !== key) {\n this.migrateTabKey(existing.key, key);\n }\n this.updateTabUrl(key, normalizedUrl);\n this.touchTab(key);\n this.activeTabKey.set(key);\n this.persistSession();\n return;\n }\n\n this.insertTab(this.createTabDescriptor(normalizedUrl, undefined, key));\n this.activeTabKey.set(key);\n this.persistSession();\n }\n\n //#endregion\n\n //#region ---- Settings ----\n\n private async loadSettings(): Promise<void> {\n const [mode, maxTabs] = await Promise.all([\n this.settingsService.get<AXPNavigationMode>(AXPCommonSettings.NavigationMode),\n this.settingsService.get<number>(AXPCommonSettings.MaxOpenTabs),\n ]);\n\n this.navigationMode.set(mode === 'tabular' ? 'tabular' : 'simple');\n this.maxOpenTabs.set(this.normalizeMaxTabs(maxTabs));\n await this.restoreSessionIfNeeded();\n }\n\n private bindSettingsChanges(): void {\n this.settingsService.onChanged.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event) => {\n if (event.keys.includes(AXPCommonSettings.NavigationMode)) {\n const raw = event.values[AXPCommonSettings.NavigationMode] as AXPNavigationMode;\n const newMode: AXPNavigationMode = raw === 'tabular' ? 'tabular' : 'simple';\n if (newMode !== this.navigationMode()) {\n this.navigationMode.set(newMode);\n if (this.effectiveMode() === 'simple') {\n this.clearSession();\n } else {\n void this.ensureHomeTab().then(() => this.syncCurrentRouteAsTab());\n }\n }\n }\n\n if (event.keys.includes(AXPCommonSettings.MaxOpenTabs)) {\n this.maxOpenTabs.set(this.normalizeMaxTabs(event.values[AXPCommonSettings.MaxOpenTabs] as number));\n this.enforceMaxTabs();\n this.persistSession();\n }\n });\n }\n\n private bindSessionChanges(): void {\n this.sessionService.user$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n void this.restoreSessionIfNeeded();\n });\n }\n\n //#endregion\n\n //#region ---- Tab Management ----\n\n private async ensureHomeTab(): Promise<void> {\n const homePath = this.resolveHomePath();\n if (!homePath) {\n return;\n }\n\n const homeUrl = normalizeRouterUrl(homePath);\n const homeKey = AXP_HOME_TAB_KEY;\n const existing = this.tabs().find((tab) => tab.key === homeKey);\n\n if (existing) {\n this.tabs.update((items) =>\n items.map((tab) =>\n tab.key === homeKey\n ? {\n ...tab,\n url: homeUrl,\n title: this.isGenericHomeTitle(tab.title) ? this.resolveHomeTitle() : tab.title,\n icon: this.resolveTabIcon(homeUrl, 'fa-light fa-house'),\n }\n : tab,\n ),\n );\n return;\n }\n\n const now = Date.now();\n const homeTab: AXPTabDescriptor = {\n key: homeKey,\n url: homeUrl,\n title: this.resolveHomeTitle(),\n icon: this.resolveTabIcon(homeUrl, 'fa-light fa-house'),\n pinned: true,\n closable: false,\n openedAt: now,\n lastActivatedAt: now,\n };\n\n this.tabs.update((items) => this.normalizeTabOrder([homeTab, ...items.filter((tab) => tab.key !== homeKey)]));\n }\n\n private insertTab(tab: AXPTabDescriptor): void {\n if (this.isHomePageUrl(tab.url)) {\n this.activateHomeTabForUrl(tab.url);\n return;\n }\n\n this.tabs.update((items) => {\n const withoutDuplicate = items.filter((item) => {\n if (item.key === tab.key) {\n return false;\n }\n\n return axpResolveTabKey(this.router, item.url) !== tab.key;\n });\n return this.normalizeTabOrder([...withoutDuplicate, tab]);\n });\n this.enforceMaxTabs();\n }\n\n /** Home first; preserves session order for the remaining tabs. */\n private ensureHomeTabFirst(items: AXPTabDescriptor[]): AXPTabDescriptor[] {\n const home = items.find((tab) => tab.key === AXP_HOME_TAB_KEY);\n const others = items.filter((tab) => tab.key !== AXP_HOME_TAB_KEY);\n return home ? [home, ...others] : items;\n }\n\n private getLastPinnedTabIndex(items: ReadonlyArray<AXPTabDescriptor>): number {\n for (let index = items.length - 1; index >= 0; index -= 1) {\n if (items[index]?.pinned) {\n return index;\n }\n }\n\n return 0;\n }\n\n /** Home first, then other pinned tabs, then unpinned tabs (stable by openedAt within each group). */\n private normalizeTabOrder(items: AXPTabDescriptor[]): AXPTabDescriptor[] {\n const home = items.find((tab) => tab.key === AXP_HOME_TAB_KEY);\n const pinned = items.filter((tab) => tab.key !== AXP_HOME_TAB_KEY && tab.pinned);\n const unpinned = items.filter((tab) => tab.key !== AXP_HOME_TAB_KEY && !tab.pinned);\n const byOpenedAt = (a: AXPTabDescriptor, b: AXPTabDescriptor) => a.openedAt - b.openedAt;\n\n return [...(home ? [home] : []), ...pinned.sort(byOpenedAt), ...unpinned.sort(byOpenedAt)];\n }\n\n private enforceMaxTabs(): void {\n const limit = this.maxOpenTabs();\n let current = this.tabs();\n\n while (current.length > limit) {\n const evictionCandidate = [...current]\n .filter((tab) => tab.closable && !tab.pinned && tab.key !== this.activeTabKey())\n .filter((tab) => !this.tabPreviewService.isTabDirty(tab.key))\n .sort((a, b) => a.lastActivatedAt - b.lastActivatedAt)[0];\n\n if (!evictionCandidate) {\n break;\n }\n\n current = current.filter((tab) => tab.key !== evictionCandidate.key);\n }\n\n this.tabs.set(current);\n }\n\n private createTabDescriptor(url: string, title?: string, keyOverride?: string): AXPTabDescriptor {\n const now = Date.now();\n const key = keyOverride ?? axpResolveTabKey(this.router, url);\n return {\n key,\n url,\n title: title ?? this.resolveTabTitle(url),\n icon: this.resolveTabIcon(url),\n pinned: false,\n closable: true,\n openedAt: now,\n lastActivatedAt: now,\n };\n }\n\n /** Finds a tab by scoped key or legacy full-path key for the same URL. */\n private findTabForUrl(url: string): AXPTabDescriptor | undefined {\n if (this.isHomePageUrl(url)) {\n return this.tabs().find((tab) => tab.key === AXP_HOME_TAB_KEY);\n }\n\n const resolvedKey = axpResolveTabKey(this.router, url);\n return this.tabs().find(\n (tab) =>\n tab.key !== AXP_HOME_TAB_KEY &&\n (tab.key === resolvedKey || axpResolveTabKey(this.router, tab.url) === resolvedKey),\n );\n }\n\n /** True when the URL is the configured application home page (e.g. dashboard). */\n private isHomePageUrl(url: string): boolean {\n const homeUrl = this.resolveHomeUrl();\n if (!homeUrl) {\n return false;\n }\n\n return normalizeRouterUrl(url) === homeUrl;\n }\n\n private resolveHomeUrl(): string | null {\n const homePath = this.resolveHomePath();\n if (!homePath) {\n return null;\n }\n\n return normalizeRouterUrl(homePath);\n }\n\n /** Activates the pinned home tab for a home-page URL instead of opening a duplicate tab. */\n private activateHomeTabForUrl(url: string): void {\n this.updateTabUrl(AXP_HOME_TAB_KEY, normalizeRouterUrl(url));\n this.touchTab(AXP_HOME_TAB_KEY);\n this.activeTabKey.set(AXP_HOME_TAB_KEY);\n this.persistSession();\n }\n\n /** Drops non-home tabs that duplicate the home page URL after session restore. */\n private removeDuplicateHomeUrlTabs(tabs: AXPTabDescriptor[]): AXPTabDescriptor[] {\n const homeUrl = this.resolveHomeUrl();\n if (!homeUrl) {\n return tabs;\n }\n\n return tabs.filter((tab) => tab.key === AXP_HOME_TAB_KEY || normalizeRouterUrl(tab.url) !== homeUrl);\n }\n\n /** Rewrites a tab key when route-scope resolution changes (e.g. profile sub-routes). */\n private migrateTabKey(fromKey: string, toKey: string): void {\n if (fromKey === toKey) {\n return;\n }\n\n if (this.activeTabKey() === fromKey) {\n this.activeTabKey.set(toKey);\n }\n\n this.tabs.update((items) => {\n const tab = items.find((item) => item.key === fromKey);\n if (!tab) {\n return items;\n }\n\n const without = items.filter((item) => item.key !== fromKey && item.key !== toKey);\n return this.normalizeTabOrder([...without, { ...tab, key: toKey }]);\n });\n }\n\n /** Collapses restored tabs that share the same scoped route key. */\n private normalizeRestoredTabKeys(tabs: AXPTabDescriptor[]): AXPTabDescriptor[] {\n const byResolvedKey = new Map<string, AXPTabDescriptor>();\n\n for (const tab of tabs) {\n if (tab.key === AXP_HOME_TAB_KEY) {\n byResolvedKey.set(AXP_HOME_TAB_KEY, tab);\n continue;\n }\n\n const resolvedKey = axpResolveTabKey(this.router, tab.url);\n const normalized = { ...tab, key: resolvedKey };\n const existing = byResolvedKey.get(resolvedKey);\n\n if (!existing || normalized.lastActivatedAt > existing.lastActivatedAt) {\n byResolvedKey.set(resolvedKey, normalized);\n }\n }\n\n return [...byResolvedKey.values()];\n }\n\n private updateTabUrl(key: string, url: string): void {\n this.tabs.update((items) => items.map((tab) => (tab.key === key ? { ...tab, url } : tab)));\n }\n\n private updateTabTitle(key: string, title: string, titleSegments?: string[]): void {\n this.tabs.update((items) =>\n items.map((tab) => {\n if (tab.key !== key) {\n return tab;\n }\n\n const segmentsUnchanged =\n tab.titleSegments === titleSegments ||\n (tab.titleSegments?.length === titleSegments?.length &&\n tab.titleSegments?.every((segment, index) => segment === titleSegments?.[index]));\n\n if (tab.title === title && segmentsUnchanged) {\n return tab;\n }\n\n return { ...tab, title, titleSegments };\n }),\n );\n this.persistSession();\n }\n\n private updateTabIcon(key: string, icon: string): void {\n this.tabs.update((items) => items.map((tab) => (tab.key === key && tab.icon !== icon ? { ...tab, icon } : tab)));\n this.persistSession();\n }\n\n private touchTab(key: string): void {\n const now = Date.now();\n this.tabs.update((items) => items.map((tab) => (tab.key === key ? { ...tab, lastActivatedAt: now } : tab)));\n }\n\n private resolveTabTitle(url: string, fallback?: string): string {\n const match = axpFindMenuItemByRoute(this.menuService.items(), url);\n if (match?.item.text) {\n return match.item.text;\n }\n return fallback ?? axpFallbackTabTitle(url);\n }\n\n private resolveTabIcon(url: string, fallback = 'fa-light fa-window'): string {\n const match = axpFindMenuItemByRoute(this.menuService.items(), url);\n if (match?.item.icon?.trim()) {\n return match.item.icon.trim();\n }\n return fallback;\n }\n\n private resolveHomePath(): string {\n const current = this.homePageService.getCurrent();\n return current.path ? normalizeRouterUrl(current.path) : '';\n }\n\n private resolveHomeTitle(): string {\n const current = this.homePageService.getCurrent();\n return current.title || 'Home';\n }\n\n private isGenericHomeTitle(title: string): boolean {\n if (title === '@general:terms.interface.navigation.home') {\n return true;\n }\n\n const homeTitle = this.resolveHomeTitle().trim();\n return title === homeTitle;\n }\n\n private async syncCurrentRouteAsTab(): Promise<void> {\n if (this.effectiveMode() === 'simple') {\n return;\n }\n\n await this.ensureHomeTab();\n await this.handleNavigationEnd(this.router.url);\n }\n\n private normalizeMaxTabs(value: unknown): number {\n const parsed = Number(value);\n if (!Number.isFinite(parsed)) {\n return 5;\n }\n return Math.min(20, Math.max(2, Math.round(parsed)));\n }\n\n //#endregion\n\n //#region ---- Session Persistence ----\n\n private sessionStorageKey(): string | null {\n const userId = this.sessionService.user?.id;\n if (!userId) {\n return null;\n }\n return `${SESSION_STORAGE_PREFIX}(${userId})`;\n }\n\n private persistSession(): void {\n const key = this.sessionStorageKey();\n if (!key || this.effectiveMode() === 'simple') {\n return;\n }\n\n const payload: AXPTabSessionState = {\n tabs: cloneDeep(this.tabs()),\n activeTabKey: this.activeTabKey(),\n };\n sessionStorage.setItem(key, JSON.stringify(payload));\n }\n\n private clearSession(): void {\n const key = this.sessionStorageKey();\n if (key) {\n sessionStorage.removeItem(key);\n }\n this.tabs.set([]);\n this.activeTabKey.set(null);\n this.tabPreviewService.clearAll();\n }\n\n private async restoreSessionIfNeeded(): Promise<void> {\n if (this.effectiveMode() === 'simple') {\n return;\n }\n\n const storageKey = this.sessionStorageKey();\n if (!storageKey) {\n await this.ensureHomeTab();\n await this.syncCurrentRouteAsTab();\n return;\n }\n\n const raw = sessionStorage.getItem(storageKey);\n if (!raw) {\n await this.ensureHomeTab();\n await this.syncCurrentRouteAsTab();\n return;\n }\n\n try {\n const parsed = JSON.parse(raw) as AXPTabSessionState;\n const restoredTabs = this.removeDuplicateHomeUrlTabs(\n this.normalizeRestoredTabKeys(defaultTo(parsed.tabs, []).filter((tab) => tab?.key && tab?.url)),\n );\n this.tabs.set(this.ensureHomeTabFirst(restoredTabs));\n await this.ensureHomeTab();\n\n const activeKey = parsed.activeTabKey ?? this.tabs()[this.tabs().length - 1]?.key ?? AXP_HOME_TAB_KEY;\n this.activeTabKey.set(activeKey);\n\n const activeTab = this.tabs().find((tab) => tab.key === activeKey);\n if (activeTab && normalizeRouterUrl(this.router.url) !== normalizeRouterUrl(activeTab.url)) {\n this.suppressNavigationSync = true;\n try {\n await this.router.navigateByUrl(activeTab.url);\n } finally {\n this.suppressNavigationSync = false;\n }\n }\n } catch {\n await this.ensureHomeTab();\n await this.syncCurrentRouteAsTab();\n }\n }\n\n //#endregion\n}\n","import { DOCUMENT } from '@angular/common';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { DestroyRef, Injectable, effect, inject, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { filter } from 'rxjs/operators';\nimport { AXPPlatformBrandingService } from '../platform-branding/platform-branding.service';\nimport { axpFindMenuItemByRoute } from '../layout/menu/menu-route-matcher';\nimport { AXPMenuService } from '../layout/menu/menu.service';\nimport { axpResolveTabKey } from '../tab-navigation/tab-route-resolver';\nimport { AXPTabNavigationService } from '../tab-navigation/tab-navigation.service';\nimport type { AXPNavigationMode } from '../tab-navigation/tab-navigation.types';\n\ninterface AXPSimpleModePageTitleState {\n routeKey: string;\n title: string;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPBrowserTitleService {\n //#region ---- Services & Dependencies ----\n\n private readonly document = inject(DOCUMENT);\n private readonly translateService = inject(AXTranslationService);\n private readonly tabNavigation = inject(AXPTabNavigationService);\n private readonly menuService = inject(AXPMenuService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly platformBranding = inject(AXPPlatformBrandingService);\n private readonly router = inject(Router);\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ---- State ----\n\n private readonly simpleModePageTitle = signal<AXPSimpleModePageTitleState | null>(null);\n private readonly localeRevision = signal(0);\n private readonly sessionRevision = signal(0);\n private readonly routeRevision = signal(0);\n\n //#endregion\n\n //#region ---- Lifecycle ----\n\n constructor() {\n this.translateService.langChanges$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n this.localeRevision.update((value) => value + 1);\n });\n\n this.sessionService.application$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n this.sessionRevision.update((value) => value + 1);\n });\n\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(() => {\n this.routeRevision.update((value) => value + 1);\n });\n\n effect(() => {\n this.localeRevision();\n this.sessionRevision();\n this.routeRevision();\n const mode = this.tabNavigation.effectiveMode();\n const simpleModePageTitle = this.simpleModePageTitle();\n\n if (mode === 'tabular') {\n const activeKey = this.tabNavigation.activeKey();\n const tabs = this.tabNavigation.tabList();\n untracked(() => {\n void this.syncDocumentTitle(mode, activeKey, tabs, simpleModePageTitle);\n });\n return;\n }\n\n untracked(() => {\n void this.syncDocumentTitle(mode, null, [], simpleModePageTitle);\n });\n });\n }\n\n //#endregion\n\n //#region ---- Public API ----\n\n /** Publishes the resolved page title for the given route key (ignored in tabular mode). */\n setSimpleModePageTitle(title: string | null, routeKey: string): void {\n if (!routeKey.trim()) {\n return;\n }\n\n if (!title?.trim()) {\n const current = this.simpleModePageTitle();\n if (current?.routeKey === routeKey) {\n this.simpleModePageTitle.set(null);\n }\n return;\n }\n\n this.simpleModePageTitle.set({\n routeKey: routeKey.trim(),\n title: title.trim(),\n });\n }\n\n //#endregion\n\n //#region ---- Title Sync ----\n\n private async syncDocumentTitle(\n mode: AXPNavigationMode,\n activeTabKey: string | null,\n tabs: ReturnType<AXPTabNavigationService['tabList']>,\n simpleModePageTitle: AXPSimpleModePageTitleState | null,\n ): Promise<void> {\n const routeTitle =\n mode === 'tabular'\n ? await this.resolveTabularRouteTitle(activeTabKey, tabs)\n : await this.resolveSimpleRouteTitle(simpleModePageTitle);\n\n const appTitle = await this.resolveApplicationTitle();\n const nextTitle = this.buildDocumentTitle(routeTitle, appTitle);\n\n if (this.document?.title !== nextTitle) {\n this.document.title = nextTitle;\n }\n }\n\n private async resolveTabularRouteTitle(\n activeTabKey: string | null,\n tabs: ReturnType<AXPTabNavigationService['tabList']>,\n ): Promise<string | null> {\n if (!activeTabKey) {\n return null;\n }\n\n const tab = tabs.find((item) => item.key === activeTabKey);\n if (!tab?.title?.trim()) {\n return null;\n }\n\n return this.resolveLocalizedText(tab.title);\n }\n\n private async resolveSimpleRouteTitle(\n simpleModePageTitle: AXPSimpleModePageTitleState | null,\n ): Promise<string | null> {\n const currentRouteKey = axpResolveTabKey(this.router);\n if (simpleModePageTitle?.routeKey === currentRouteKey && simpleModePageTitle.title) {\n return simpleModePageTitle.title;\n }\n\n return this.resolveMenuRouteTitle(this.router.url);\n }\n\n private async resolveMenuRouteTitle(url: string): Promise<string | null> {\n const match = axpFindMenuItemByRoute(this.menuService.items(), url);\n if (!match?.item.text?.trim()) {\n return null;\n }\n\n return this.resolveLocalizedText(match.item.text);\n }\n\n private async resolveApplicationTitle(): Promise<string> {\n return this.platformBranding.resolveApplicationTitle();\n }\n\n private async resolveLocalizedText(value: string): Promise<string | null> {\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n if (trimmed.startsWith('@')) {\n return (await this.translateService.translateAsync(trimmed)) || trimmed;\n }\n\n return trimmed;\n }\n\n private buildDocumentTitle(routeTitle: string | null, appTitle: string): string {\n const route = routeTitle?.trim();\n const app = appTitle.trim();\n\n if (route && app) {\n return `${route} | ${app}`;\n }\n\n return route || app;\n }\n\n //#endregion\n}\n","export abstract class AXPDataProvider {\n abstract insertOne(entity: any, entityItem: any): Promise<any>;\n abstract insertMany(entity: any, entityList: any): Promise<any>;\n abstract getOne(entity: any, id: string): Promise<any>;\n abstract getMany(entity: any, params?: any): Promise<any>;\n abstract updateOne(entity: any, id?: string, data?: { [key: string]: any }): Promise<any>;\n abstract deleteOne(entity: any, id: string): Promise<any>;\n abstract getFirst(entity: any): Promise<any>;\n abstract uploadFile(file: File, title: string, customUrl?: string): Promise<string>;\n abstract updateFile(id:string,file: File, title: string, customUrl?: string): Promise<string>;\n abstract uploadMultipleFiles(files: File[], title: string): Promise<string[]>;\n abstract viewFile(id: string, name: string): Promise<Blob>;\n abstract downloadFile(id: string, name: string): Promise<Blob>;\n}\n","import { AXDataSourceOperator } from '@acorex/cdk/common';\nimport { Injectable } from '@angular/core';\n\nexport abstract class AXPCustomOperatorService {\n abstract getCustomOperators(): { [key: string]: AXDataSourceOperator };\n}\n\n@Injectable()\nexport class AXPCustomOperatorServiceImpl extends AXPCustomOperatorService {\n getCustomOperators(): { [key: string]: AXDataSourceOperator } {\n return {};\n }\n}\n","import { AXDataSourceFilterOption, AXDataSourceOperator } from '@acorex/cdk/common';\nimport { inject, Injectable } from '@angular/core';\nimport { ALL_DEFAULT_OPERATORS } from '../app';\nimport { AXPCustomOperatorService } from './operators.service';\n\nexport abstract class AXPFilterOperatorMiddlewareService {\n /**\n * Middleware to transform selected filters into corresponding operators.\n * @param filters Array of selected filters (e.g., user input).\n * @param customOperators Optional custom operators map to override default operators.\n * @returns Transformed filters based on custom or default operators.\n */\n abstract transformFilters(filters: AXDataSourceFilterOption[]): AXDataSourceFilterOption[];\n\n /**\n * Helper method to transform a single filter. This handles recursion for nested filters.\n * @param filter A single filter object.\n * @returns Transformed filter.\n */\n abstract transformFilter(filters: AXDataSourceFilterOption): AXDataSourceFilterOption;\n\n abstract getOperator(key: string): AXDataSourceOperator;\n}\n\n@Injectable()\nexport class AXPFilterOperatorMiddlewareServiceImpl extends AXPFilterOperatorMiddlewareService {\n private customOperatorService = inject(AXPCustomOperatorService);\n\n private operators: { [key: string]: AXDataSourceOperator } = {\n ...this.getDefaultOperators(),\n ...this.customOperatorService.getCustomOperators(),\n };\n\n transformFilters(filters: AXDataSourceFilterOption[]): AXDataSourceFilterOption[] {\n return filters.map((filter) => this.transformFilter(filter));\n }\n\n transformFilter(filter: AXDataSourceFilterOption): AXDataSourceFilterOption {\n const { operator, value, filters, field } = filter;\n // Find the operator (either default or custom)\n const filterOperator = this.operators[operator?.type ?? ''] || null;\n\n // Start by transforming the filter itself\n const transformedFilter: AXDataSourceFilterOption = {\n ...filter, // Keep the original filter structure\n operator: filterOperator ? filterOperator : operator, // Add operator name\n };\n\n // If the filter contains nested filters, recursively transform them\n if (filters && filters.length > 0) {\n transformedFilter.filters = this.transformFilters(filters); // Recursively transform nested filters\n }\n\n return transformedFilter;\n }\n\n getOperator(key: string) {\n return this.operators[key];\n }\n\n // Helper function to return the default operators\n private getDefaultOperators(): { [key: string]: AXDataSourceOperator } {\n return ALL_DEFAULT_OPERATORS.reduce(\n (acc, operator) => {\n acc[operator.name] = {\n type: operator.name as any,\n };\n return acc;\n },\n {} as { [key: string]: AXDataSourceOperator },\n );\n }\n}\n","import { Injectable, Injector } from \"@angular/core\";\nimport { AXPErrorHandler } from \"./error-handler.types\";\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AXPErrorHandlerRegistryService {\n private errorHandlers: AXPErrorHandler[] = [];\n\n constructor(private injector: Injector) {\n }\n\n register(...plugins: (new () => AXPErrorHandler)[]) {\n plugins.forEach(t => {\n const childInjector = Injector.create({ providers: [{ provide: t, useClass: t, deps: [] }], parent: this.injector });\n const handler = childInjector.get(t);\n if (handler) {\n this.errorHandlers.push(handler);\n }\n })\n }\n\n\n public get handlers(): AXPErrorHandler[] {\n return this.errorHandlers;\n }\n}","import { HttpErrorResponse } from '@angular/common/http';\nimport {\n AXP_PLATFORM_ERROR_CODES,\n AXPRequestError,\n mapUnknownToAXPErrorBody,\n type AXPRuntimeCommandResult,\n type AXPRequestErrorInfo,\n} from '@acorex-platform/framework-shared/core';\n\n//#region ---- Payload readers ----\n\nfunction readBodyRecord(body: unknown): Record<string, unknown> | null {\n if (body == null || typeof body !== 'object' || Array.isArray(body)) {\n return null;\n }\n return body as Record<string, unknown>;\n}\n\nfunction readPayload(body: unknown): Record<string, unknown> | null {\n const record = readBodyRecord(body);\n if (!record) {\n return null;\n }\n\n const nestedError = readBodyRecord(record['error']);\n if (nestedError && (nestedError['code'] != null || nestedError['message'] != null)) {\n return {\n ...record,\n ...nestedError,\n };\n }\n\n const nestedMessage = readBodyRecord(record['message']);\n if (nestedMessage && (nestedMessage['code'] != null || nestedMessage['message'] != null)) {\n return {\n ...record,\n ...nestedMessage,\n };\n }\n\n return record;\n}\n\nfunction readStringParam(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value : undefined;\n}\n\nfunction flattenDetailsParams(details: unknown): Record<string, string> {\n const record = readBodyRecord(details);\n if (!record) {\n return {};\n }\n const params: Record<string, string> = {};\n for (const key of ['jobId', 'status', 'scheduleId', 'field', 'name', 'entityName'] as const) {\n const value = readStringParam(record[key]);\n if (value) {\n params[key] = value;\n }\n }\n return params;\n}\n\nfunction isPayloadTooLargeHint(status?: number, code?: string, errorName?: string, message?: string): boolean {\n if (status === 413 || code === AXP_PLATFORM_ERROR_CODES.PAYLOAD_TOO_LARGE) {\n return true;\n }\n if (errorName && /payload.?too.?large/i.test(errorName)) {\n return true;\n }\n return /payload.?too.?large|request entity too large|file is too large|uploaded file is too large/i.test(\n message ?? '',\n );\n}\n\n//#endregion\n\n//#region ---- Extractors ----\n\nfunction extractFromHttpErrorResponse(error: HttpErrorResponse): AXPRequestErrorInfo | null {\n const payload = readPayload(error.error);\n if (!payload) {\n const fallbackMessage = error.message?.trim();\n if (!fallbackMessage && error.status !== 413) {\n return null;\n }\n const code = isPayloadTooLargeHint(error.status, undefined, undefined, fallbackMessage)\n ? AXP_PLATFORM_ERROR_CODES.PAYLOAD_TOO_LARGE\n : undefined;\n return {\n message: fallbackMessage || 'Payload Too Large',\n status: error.status,\n ...(code ? { code } : {}),\n };\n }\n\n let code = readStringParam(payload['code']);\n const errorName = typeof payload['error'] === 'string' ? payload['error'] : undefined;\n const messageFromBody = (() => {\n const message = payload['message'];\n if (typeof message === 'string') {\n return message;\n }\n if (Array.isArray(message)) {\n return message.map(String).join(', ');\n }\n return '';\n })();\n\n if (!code && isPayloadTooLargeHint(error.status, code, errorName, messageFromBody || error.message)) {\n code = AXP_PLATFORM_ERROR_CODES.PAYLOAD_TOO_LARGE;\n }\n\n const params = flattenDetailsParams(payload['details']);\n for (const key of ['jobId', 'status', 'scheduleId'] as const) {\n const value = readStringParam(payload[key]);\n if (value) {\n params[key] = value;\n }\n }\n\n if (!code && !messageFromBody) {\n return null;\n }\n\n return {\n message: messageFromBody || error.message,\n status: error.status,\n details: payload['details'],\n ...(code ? { code } : {}),\n ...(Object.keys(params).length > 0 ? { params } : {}),\n };\n}\n\nfunction extractFromCommandResult(result: AXPRuntimeCommandResult): AXPRequestErrorInfo | null {\n if (result.success) {\n return null;\n }\n const message = result.message;\n const text =\n typeof message?.text === 'string'\n ? message.text\n : message?.code || '';\n if (!message?.code && !text) {\n return null;\n }\n return {\n message: text,\n code: message?.code,\n details: message?.details,\n params: flattenDetailsParams(message?.details),\n };\n}\n\n/**\n * Transport-agnostic error extraction.\n * Accepts `HttpErrorResponse`, `AXPRequestError`, soft command results, and plain Errors.\n */\nexport function extractRequestErrorInfo(error: unknown): AXPRequestErrorInfo | null {\n if (error instanceof HttpErrorResponse) {\n return extractFromHttpErrorResponse(error);\n }\n\n if (AXPRequestError.is(error)) {\n return {\n message: error.message,\n code: error.code,\n status: error.status,\n details: error.details,\n params: flattenDetailsParams(error.details),\n };\n }\n\n if (\n error &&\n typeof error === 'object' &&\n 'success' in error &&\n (error as AXPRuntimeCommandResult).success === false\n ) {\n return extractFromCommandResult(error as AXPRuntimeCommandResult);\n }\n\n if (error instanceof Error && (error as Error & { code?: string }).code) {\n const coded = error as Error & { code?: string; status?: number; details?: unknown };\n return {\n message: coded.message,\n code: coded.code,\n status: coded.status,\n details: coded.details,\n params: flattenDetailsParams(coded.details),\n };\n }\n\n const body = mapUnknownToAXPErrorBody(error);\n if (!body.code && !body.message) {\n return null;\n }\n return {\n message: body.message || body.code || '',\n code: body.code,\n status: body.status,\n details: body.details,\n params: flattenDetailsParams(body.details),\n };\n}\n\n/** @deprecated Prefer {@link extractRequestErrorInfo}. */\nexport function extractHttpRequestErrorInfo(error: unknown): AXPRequestErrorInfo | null {\n return extractRequestErrorInfo(error);\n}\n\n/**\n * Log/dev fallback string only — do not show in product UI when a `code` exists.\n */\nexport function formatRequestError(error: unknown, fallback: string): string {\n const info = extractRequestErrorInfo(error);\n if (info) {\n return info.message || fallback;\n }\n return error instanceof Error ? error.message : fallback;\n}\n\n/** i18n key for a known platform error code, if any. */\nexport function platformErrorI18nKey(code: string | undefined): string | null {\n if (!code) {\n return null;\n }\n const known = Object.values(AXP_PLATFORM_ERROR_CODES) as string[];\n if (!known.includes(code)) {\n return null;\n }\n return `@general:errors.codes.${code}`;\n}\n\n/** Normalize any failure into {@link AXPRequestError} (connectivity + features). */\nexport function toAXPRequestError(error: unknown): AXPRequestError {\n if (AXPRequestError.is(error)) {\n return error;\n }\n const info = extractRequestErrorInfo(error);\n if (info) {\n return new AXPRequestError(info.message || info.code || 'Request failed', {\n code: info.code,\n status: info.status,\n details: info.details,\n });\n }\n return AXPRequestError.fromBody(mapUnknownToAXPErrorBody(error));\n}\n\n/**\n * Soft runtime failures return HTTP 200 + `{ success: false }`.\n * Throw so callers that only `await` the promise still fail closed.\n */\nexport function throwIfCommandFailed(result: unknown): void {\n if (\n result != null &&\n typeof result === 'object' &&\n 'success' in result &&\n (result as AXPRuntimeCommandResult).success === false\n ) {\n throw AXPRequestError.fromCommandResult(result as AXPRuntimeCommandResult);\n }\n}\n\n/** Map any thrown/soft failure into a soft command result for feature commands. */\nexport function toExecuteCommandFailureResult(\n error: unknown,\n fallbackText: string,\n): AXPRuntimeCommandResult {\n const info = extractRequestErrorInfo(error);\n const text =\n platformErrorI18nKey(info?.code) ??\n (typeof info?.message === 'string' && info.message.startsWith('@')\n ? info.message\n : undefined) ??\n fallbackText;\n return {\n success: false,\n message: {\n type: 'error',\n code: info?.code,\n text,\n details: info?.details,\n },\n };\n}\n\n//#endregion\n","/**\n * @deprecated Import from `./request-error.util` instead.\n * Kept as a stable path for existing imports.\n */\nexport {\n extractHttpRequestErrorInfo,\n extractRequestErrorInfo,\n formatRequestError,\n platformErrorI18nKey,\n} from './request-error.util';\n\nexport type { AXPRequestErrorInfo as HttpRequestErrorInfo } from '@acorex-platform/framework-shared/core';\n","import { ErrorHandler, Injectable, Injector } from \"@angular/core\";\nimport { AXPErrorHandlerRegistryService } from \"./error-handler-registry.service\";\n\n@Injectable({ providedIn: 'root' })\nexport class AXPGlobalErrorHandler extends ErrorHandler {\n\n\n\n constructor(private injector: Injector, private registry: AXPErrorHandlerRegistryService) {\n super()\n }\n\n override handleError(error: Error) {\n const handleErrorRecursively = (index: number, error: any) => {\n const errorHandlers = this.registry.handlers;\n if (index < errorHandlers.length) {\n errorHandlers[index].handleError(error, (err) => {\n handleErrorRecursively(index + 1, err);\n });\n } else {\n super.handleError(error); // Fallback to default handler\n }\n };\n if (error.message?.startsWith('NG0100')) {\n //ignore it\n return\n }\n handleErrorRecursively(0, error);\n }\n}\n","/** Thrown when a requested platform resource cannot be resolved. */\nexport class AXPNotFoundError extends Error {\n constructor(message = 'Resource not found') {\n super(message);\n this.name = 'AXPNotFoundError';\n }\n}\n","import { EnvironmentProviders, inject, makeEnvironmentProviders } from '@angular/core';\nimport { RedirectCommand, Route, Router, ROUTES } from '@angular/router';\n\n/** Canonical route path for the platform 404 page. */\nexport const AXP_NOT_FOUND_ROUTE = '/error/404';\n\n/**\n * Catch-all route that redirects unknown URLs to the platform 404 page.\n * Register this as the **last** route source in the application (after all app and module routes).\n */\nexport const AXP_NOT_FOUND_CATCH_ALL_ROUTE: Route = {\n path: '**',\n redirectTo: AXP_NOT_FOUND_ROUTE,\n};\n\n/**\n * Registers the platform catch-all 404 route.\n * Must be the last `ROUTES` provider in `app.config` so custom app routes are matched first.\n */\nexport function AXPNotFoundCatchAllRoute(): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: ROUTES,\n multi: true,\n useValue: [AXP_NOT_FOUND_CATCH_ALL_ROUTE],\n },\n ]);\n}\n\n/**\n * Returns true when an entity byKey query did not resolve a record.\n */\nexport function axpIsEntityRecordNotFound(data: unknown): boolean {\n return data == null;\n}\n\n/**\n * Creates an Angular redirect command to the platform 404 page.\n */\nexport function axpRedirectToNotFound(router: Router = inject(Router)): RedirectCommand {\n return new RedirectCommand(router.parseUrl(AXP_NOT_FOUND_ROUTE));\n}\n","import { inject } from '@angular/core';\nimport { RedirectCommand, Router } from '@angular/router';\n\n/** Canonical route path for the platform 401 page. */\nexport const AXP_UNAUTHORIZED_ROUTE = '/error/401';\n\n/**\n * Creates an Angular redirect command to the platform 401 page.\n */\nexport function axpRedirectToUnauthorized(router: Router = inject(Router)): RedirectCommand {\n return new RedirectCommand(router.parseUrl(AXP_UNAUTHORIZED_ROUTE));\n}\n","//#region ---- Imports ----\n\nimport { AXFormatOptions, AXFormatter } from '@acorex/core/format';\nimport { AXTranslationService, translateSync } from '@acorex/core/translation';\nimport { inject, Injectable } from '@angular/core';\nimport { isNil, isObject, isString } from 'lodash-es';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface AXPTranslateFormatterOptions extends AXFormatOptions {\n scope?: string;\n lang?: string;\n params?: Record<string, unknown>;\n}\n\n//#endregion\n\n/**\n * Platform formatter for display text: resolves ML objects, i18n keys (`@scope:key`), and primitives.\n * Register via {@link AXPCommonModule} (auto) or `AXFormatModule.forRoot({ formatters: [AXPTranslateFormatter] })`.\n */\n@Injectable()\nexport class AXPTranslateFormatter implements AXFormatter {\n //#region ---- Services & Dependencies ----\n\n private readonly translationService = inject(AXTranslationService);\n\n //#endregion\n\n //#region ---- AXFormatter ----\n\n get name(): string {\n return 'translate';\n }\n\n format(value: unknown, options?: AXPTranslateFormatterOptions | string): string {\n if (isNil(value) || value === '') {\n return '';\n }\n\n if (isObject(value) && !Array.isArray(value) && !(value instanceof Date)) {\n const resolved = this.translationService.resolve(value as never);\n return resolved?.trim() ?? '';\n }\n\n if (isString(value)) {\n const text = value.trim();\n if (!text) {\n return '';\n }\n if (text.startsWith('@')) {\n const translateOptions = typeof options === 'object' ? options : undefined;\n const translated = translateSync(text, translateOptions);\n return translated?.trim() ?? text;\n }\n return text;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n return String(value).trim();\n }\n\n //#endregion\n}\n","import { Injectable } from \"@angular/core\";\nimport { AXPFileManyStorageInfo, AXPFileStorageCreateRequest, AXPFileStorageFindRequest, AXPFileStorageInfo, AXPFileStorageUpdateRequest } from '@acorex-platform/framework-shared/core';\n\n@Injectable()\nexport abstract class AXPFileStorageService {\n\n abstract save(request: AXPFileStorageCreateRequest): Promise<AXPFileStorageInfo>;\n\n abstract update(request: AXPFileStorageUpdateRequest): Promise<AXPFileStorageInfo>;\n\n abstract find(request: AXPFileStorageFindRequest): Promise<AXPFileStorageInfo[]>;\n\n abstract findMany(ids : string[]): Promise<AXPFileManyStorageInfo[]>;\n\n abstract getInfo(fileId: string): Promise<AXPFileStorageInfo>;\n\n /**\n * Authenticated binary download URL for use in `<img src>` / media tags.\n * Same-origin + access cookie (or fetch with credentials) is required.\n */\n abstract getDownloadUrl(fileId: string): string;\n\n /** Download file bytes via the storage connector (includes auth when using API). */\n abstract download(fileId: string): Promise<Blob>;\n\n abstract remove(fileId: string): Promise<void>;\n\n abstract commit(fileId: string): Promise<void>;\n\n abstract markForDeletion(fileId: string): Promise<void>;\n}\n","import { AXPExpressionEvaluatorScopeProvider, AXPExpressionEvaluatorScopeProviderContext } from '@acorex-platform/framework-shared/core';\nimport { inject } from '@angular/core';\nimport { AXPFileStorageService } from './file-storage.service';\n\nexport class AXPFileStorageEvaluatorScopeProvider implements AXPExpressionEvaluatorScopeProvider {\n private readonly fileStorageService = inject(AXPFileStorageService);\n\n async provide(context: AXPExpressionEvaluatorScopeProviderContext): Promise<void> {\n context.addScope('fileStorage', {\n getFiles: async (entityType: string, entityId: string) => {\n const filesFromService = await this.fileStorageService.find({\n category: '',\n refId: entityId,\n refType: entityType,\n });\n const mappedFiles = filesFromService?.map((file) => ({\n id: file.id ?? '',\n name: file.name,\n size: file.size,\n status: 'remote',\n source: {\n kind: 'fileId',\n value: file.fileId,\n },\n }));\n\n return mappedFiles;\n },\n });\n }\n}\n","//#region ---- Stored image URL resolver ----\n\nconst FILE_STORAGE_ID_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nconst FILE_STORAGE_PREFIX = 'file:';\n\n/** Strips the file-cast prefix and whitespace from a stored image reference. */\nexport function normalizeStoredImageRef(value: string | null | undefined): string | null {\n if (!value) {\n return null;\n }\n const trimmed = value.trim();\n if (!trimmed || trimmed === 'null') {\n return null;\n }\n return trimmed.startsWith(FILE_STORAGE_PREFIX) ? trimmed.slice(FILE_STORAGE_PREFIX.length) : trimmed;\n}\n\nexport function isStoredImageFileId(value: string | null | undefined): boolean {\n const normalized = normalizeStoredImageRef(value);\n if (!normalized) {\n return false;\n }\n return FILE_STORAGE_ID_PATTERN.test(normalized);\n}\n\n/**\n * Builds the authenticated binary download URL for a file-storage id.\n * `baseUrl` is the API root (e.g. `/api` or `https://host/api`).\n */\nexport function buildFileStorageDownloadUrl(baseUrl: string, fileId: string): string {\n const base = baseUrl.replace(/\\/$/, '');\n return `${base}/v1/file-storage/download/${encodeURIComponent(fileId)}`;\n}\n\n/**\n * Resolves a stored image ref to a browser-displayable URL.\n * File-storage ids become authenticated binary download URLs (cookie/session auth).\n */\nexport function resolveStoredImageDisplayUrl(\n value: string,\n getDownloadUrl: (fileId: string) => string,\n): string {\n const normalized = normalizeStoredImageRef(value);\n if (!normalized) {\n return '';\n }\n if (\n normalized.startsWith('http://') ||\n normalized.startsWith('https://') ||\n normalized.startsWith('data:image/') ||\n normalized.startsWith('blob:')\n ) {\n return normalized;\n }\n if (isStoredImageFileId(normalized)) {\n return getDownloadUrl(normalized);\n }\n return normalized;\n}\n\n//#endregion\n","import { AXPLogoImageSrcResolver } from '@acorex-platform/framework-client/core';\nimport { Injectable } from '@angular/core';\n\nimport { AXPFileStorageService } from './file-storage.service';\nimport { isStoredImageFileId, resolveStoredImageDisplayUrl } from './resolve-stored-image-url';\n\n//#region ---- Logo image src resolver (file storage) ----\n\n@Injectable({ providedIn: 'root' })\nexport class AXPLogoImageSrcResolverService implements AXPLogoImageSrcResolver {\n constructor(private readonly fileStorage: AXPFileStorageService) {}\n\n async resolve(src: string): Promise<string | undefined> {\n const trimmed = src?.trim();\n if (!trimmed) {\n return undefined;\n }\n\n if (!isStoredImageFileId(trimmed)) {\n return trimmed;\n }\n\n try {\n const displayUrl = resolveStoredImageDisplayUrl(trimmed, (fileId) =>\n this.fileStorage.getDownloadUrl(fileId),\n );\n return displayUrl || undefined;\n } catch {\n return undefined;\n }\n }\n}\n\n//#endregion\n","import type { AXPFileListItem } from '@acorex-platform/framework-shared/core';\n\nimport { normalizeStoredImageRef } from './resolve-stored-image-url';\n\n//#region ---- Document → file list item ----\n\nfunction normalizeFileIdSource(value: string): { kind: 'fileId'; value: string } {\n return {\n kind: 'fileId',\n value: normalizeStoredImageRef(value) ?? value,\n };\n}\n\nfunction resolveSourceFromRaw(raw: unknown): AXPFileListItem['source'] | undefined {\n if (raw == null) {\n return undefined;\n }\n\n if (typeof raw === 'string') {\n return normalizeFileIdSource(raw);\n }\n\n if (typeof raw !== 'object') {\n return undefined;\n }\n\n const item = raw as AXPFileListItem;\n if (item.source?.kind === 'fileId' && typeof item.source.value === 'string') {\n return normalizeFileIdSource(item.source.value);\n }\n if (item.source?.kind === 'blob' || item.source?.kind === 'url') {\n return item.source;\n }\n if (typeof item.source?.value === 'string') {\n const value = item.source.value;\n if (value.startsWith('blob:') || value.startsWith('data:') || value.startsWith('http')) {\n return { kind: 'url', value };\n }\n return normalizeFileIdSource(value);\n }\n if (typeof item.id === 'string' && item.id) {\n return normalizeFileIdSource(item.id);\n }\n\n return undefined;\n}\n\n/**\n * Normalizes a drive document or explorer node into an {@link AXPFileListItem}\n * with a resolvable `source` for the gallery / media viewer.\n */\nexport function normalizeDocumentToFileListItem(doc: {\n id?: string;\n name: string;\n fileInfo?: unknown;\n fileId?: unknown;\n size?: number;\n}): AXPFileListItem {\n const raw = doc.fileInfo ?? doc.fileId;\n const source = resolveSourceFromRaw(raw);\n const rawItem = typeof raw === 'object' && raw != null ? (raw as AXPFileListItem) : undefined;\n const rawItemId = typeof rawItem?.id === 'string' ? rawItem.id : undefined;\n const sourceFileId =\n source?.kind === 'fileId' && typeof source.value === 'string' ? source.value : undefined;\n\n return {\n id: doc.id ?? rawItemId ?? sourceFileId ?? '',\n name: doc.name,\n size: rawItem?.size ?? doc.size ?? 0,\n status: rawItem?.status ?? 'attached',\n source,\n title: rawItem?.title,\n description: rawItem?.description,\n readOnly: rawItem?.readOnly,\n meta: rawItem?.meta,\n };\n}\n\n//#endregion\n","//#region ---- Media viewer type resolution ----\n\n/** Extensions supported by {@link AXMediaViewerData} (`image` | `audio` | `pdf` | `video`). */\nexport const GALLERY_MEDIA_EXTENSIONS = [\n 'jpg',\n 'jpeg',\n 'png',\n 'gif',\n 'bmp',\n 'webp',\n 'svg',\n 'pdf',\n 'mp4',\n 'webm',\n 'mov',\n 'm4v',\n 'avi',\n 'mkv',\n 'wmv',\n 'mp3',\n 'wav',\n 'ogg',\n 'oga',\n 'm4a',\n 'flac',\n 'aac',\n 'wma',\n 'weba',\n] as const;\n\nexport type AXMediaViewerResolvableType = 'image' | 'audio' | 'pdf' | 'video';\n\nconst IMAGE_EXTENSIONS = new Set(['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg']);\nconst PDF_EXTENSIONS = new Set(['pdf']);\nconst VIDEO_EXTENSIONS = new Set(['mp4', 'webm', 'mov', 'm4v', 'avi', 'mkv', 'wmv']);\nconst AUDIO_EXTENSIONS = new Set(['mp3', 'wav', 'ogg', 'oga', 'm4a', 'flac', 'aac', 'wma', 'weba']);\nconst GALLERY_EXTENSION_SET = new Set<string>(GALLERY_MEDIA_EXTENSIONS);\n\n/** Returns the lowercase extension from a file name, or `undefined` when missing. */\nexport function extractFileExtension(fileName: string | null | undefined): string | undefined {\n if (!fileName) {\n return undefined;\n }\n const ext = fileName.split('.').pop()?.toLowerCase();\n return ext && ext !== fileName.toLowerCase() ? ext : undefined;\n}\n\n/** Maps a file name extension to the media-viewer `type` discriminator. */\nexport function resolveMediaViewerType(fileName: string | null | undefined): AXMediaViewerResolvableType {\n const ext = extractFileExtension(fileName);\n if (!ext) {\n return 'image';\n }\n if (PDF_EXTENSIONS.has(ext)) {\n return 'pdf';\n }\n if (VIDEO_EXTENSIONS.has(ext)) {\n return 'video';\n }\n if (AUDIO_EXTENSIONS.has(ext)) {\n return 'audio';\n }\n if (IMAGE_EXTENSIONS.has(ext)) {\n return 'image';\n }\n return 'image';\n}\n\n/** Whether the extension can be rendered in the gallery / media viewer. */\nexport function isGalleryMediaExtension(extension: string | null | undefined): boolean {\n if (!extension) {\n return false;\n }\n return GALLERY_EXTENSION_SET.has(extension.toLowerCase());\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPKeyboardShortcutHelpEntry } from '@acorex-platform/framework-shared/core';\nimport { AXKBDComponent, AXKBDItemComponent } from '@acorex/components/kbd';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPKeyboardShortcutRegistry, chordToKbdItemKeys } from '@acorex-platform/framework-client/core';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, ViewEncapsulation } from '@angular/core';\n\n//#endregion\n\ninterface AXPKeyboardShortcutHelpGroup {\n label: string;\n items: AXPKeyboardShortcutHelpEntry[];\n}\n\n@Component({\n selector: 'axp-keyboard-shortcuts-help',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [AsyncPipe, AXKBDComponent, AXKBDItemComponent, AXTranslationModule],\n styleUrls: ['./keyboard-shortcuts-help.component.css'],\n template: `\n <div class=\"axp-keyboard-shortcuts-help\">\n <div class=\"__body\">\n @if (groups().length === 0) {\n <p class=\"__empty\">\n {{ '@general:keyboard-shortcuts.no-shortcuts' | translate | async }}\n </p>\n } @else {\n @for (group of groups(); track group.label) {\n <section class=\"__section\">\n <h3 class=\"__heading\">\n {{ group.label | translate | async }}\n </h3>\n <div class=\"__list\">\n @for (item of group.items; track item.registrationId + item.bindingTitle) {\n <div class=\"__row\">\n <span class=\"__action\">\n {{ item.bindingTitle | translate | async }}\n </span>\n <div class=\"__keys\">\n @for (chord of item.displayChords; track chord; let last = $last) {\n <ax-kbd look=\"solid\">\n <ax-kbd-item [keys]=\"chordToKbdKeys(chord)\" join=\"split\" look=\"solid\"></ax-kbd-item>\n </ax-kbd>\n @if (!last) {\n <span class=\"__or\">\n {{ '@general:keyboard-shortcuts.or' | translate | async }}\n </span>\n }\n }\n </div>\n </div>\n }\n </div>\n </section>\n }\n }\n </div>\n </div>\n `,\n})\nexport class AXPKeyboardShortcutsHelpComponent {\n //#region ---- Services & Dependencies ----\n\n private readonly shortcutRegistry = inject(AXPKeyboardShortcutRegistry);\n\n //#endregion\n\n //#region ---- Computed Properties ----\n\n protected readonly groups = computed((): AXPKeyboardShortcutHelpGroup[] => {\n const grouped = new Map<string, AXPKeyboardShortcutHelpEntry[]>();\n\n for (const entry of this.shortcutRegistry.helpEntries()) {\n const label = entry.group ?? entry.scope ?? '@general:keyboard-shortcuts.groups.general';\n const bucket = grouped.get(label) ?? [];\n bucket.push(entry);\n grouped.set(label, bucket);\n }\n\n return [...grouped.entries()].map(([label, items]) => ({ label, items }));\n });\n\n //#endregion\n\n //#region ---- Utility Methods ----\n\n protected chordToKbdKeys(chord: string): string[] {\n return chordToKbdItemKeys(chord, { skipDirectionResolve: true });\n }\n\n //#endregion\n}\n","//#region ---- Imports ----\n\nimport { DOCUMENT } from '@angular/common';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPKeyboardShortcutRegistry, hasForegroundOverlayLayer } from '@acorex-platform/framework-client/core';\nimport { Injectable, inject } from '@angular/core';\n\n//#endregion\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPKeyboardShortcutsHelpService {\n //#region ---- Services & Dependencies ----\n\n private readonly popupService = inject(AXPopupService);\n private readonly translationService = inject(AXTranslationService);\n private readonly shortcutRegistry = inject(AXPKeyboardShortcutRegistry);\n private readonly document = inject(DOCUMENT);\n\n //#endregion\n\n //#region ---- State ----\n\n /** In-flight help popup session (open until the popup closes). */\n private activeShow: Promise<void> | null = null;\n\n //#endregion\n\n //#region ---- Lifecycle ----\n\n constructor() {\n this.shortcutRegistry.setHelpDialogHandler(() => this.show());\n }\n\n //#endregion\n\n //#region ---- Public Methods ----\n\n /**\n * Opens the keyboard shortcuts help popup, or no-ops when it is already open.\n */\n show(): Promise<void> {\n if (this.activeShow) {\n return this.activeShow;\n }\n\n if (typeof this.document !== 'undefined' && hasForegroundOverlayLayer(this.document)) {\n return Promise.resolve();\n }\n\n this.activeShow = this.openHelpPopup().finally(() => {\n this.activeShow = null;\n });\n\n return this.activeShow;\n }\n\n //#endregion\n\n //#region ---- Private Methods ----\n\n private async openHelpPopup(): Promise<void> {\n const title = await this.translationService.translateAsync('@general:keyboard-shortcuts.help-title');\n const component = await import('./keyboard-shortcuts-help.component').then(\n (module) => module.AXPKeyboardShortcutsHelpComponent,\n );\n\n await this.popupService.open(component, {\n title,\n size: 'sm',\n closeButton: true,\n closeOnBackdropClick: true,\n draggable: false,\n });\n }\n\n //#endregion\n}\n","import {\n ChangeDetectorRef,\n Directive,\n ElementRef,\n EventEmitter,\n Input,\n NgZone,\n Output,\n Renderer2,\n} from '@angular/core';\n\n@Directive({\n selector: '[axpSticky]',\n exportAs: 'axpSticky',\n standalone: true,\n})\nexport class AXPStickyDirective {\n @Input('axpSticky') stickyClass!: string;\n @Input('stickyOffset') stickyOffset: number = 100;\n\n @Output() isStickyChange: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n private _isSticky: boolean = false;\n public get isSticky(): boolean {\n return this._isSticky;\n }\n public set isSticky(value: boolean) {\n if (this._isSticky !== value) {\n this._isSticky = value;\n this.isStickyChange.emit(value);\n }\n }\n\n private parentElement!: HTMLElement | Window;\n private targetElement!: HTMLElement;\n private mutationObserver!: MutationObserver;\n\n private readonly onWindowResize = (): void => {\n this.applyStickyStateFromScrollPosition();\n };\n\n @Input() stickyParent!: string | HTMLElement;\n @Input() stickyTarget!: string;\n\n constructor(\n private element: ElementRef<HTMLDivElement>,\n private renderer: Renderer2,\n private zone: NgZone,\n private cdr: ChangeDetectorRef,\n ) {}\n\n ngAfterViewInit() {\n this.initSticky();\n\n // Add mutation observer for dynamic content\n this.mutationObserver = new MutationObserver(() => {\n this.applyStickyStateFromScrollPosition();\n });\n\n this.mutationObserver.observe(this.element.nativeElement, {\n childList: true,\n subtree: true,\n });\n\n window.addEventListener('resize', this.onWindowResize);\n }\n\n private initSticky() {\n if (this.stickyParent instanceof HTMLElement) {\n this.parentElement = this.stickyParent;\n } else {\n this.parentElement = (document.querySelector(this.stickyParent) as HTMLElement) || window;\n }\n\n this.targetElement = (document.querySelector(this.stickyTarget) as HTMLElement) || this.element.nativeElement;\n\n this.parentElement.addEventListener('scroll', this.onParentScroll);\n this.applyStickyStateFromScrollPosition();\n }\n\n private getScrollTop(): number {\n return this.parentElement === window ? window.scrollY : (this.parentElement as HTMLElement).scrollTop;\n }\n\n /**\n * Toggle stuck styling only while this element is visually pinned (matches `position: sticky; top: 0`).\n * Scroll-offset thresholds would stay true for every section already passed, so multiple stacked stickies\n * would all keep `--stuck`; geometry fixes that.\n */\n private computeShouldStick(): boolean {\n if (this.getScrollTop() <= 0) {\n return false;\n }\n const tRect = this.targetElement.getBoundingClientRect();\n const epsilon = 3;\n let limitY: number;\n if (this.parentElement === window) {\n limitY = this.stickyOffset;\n } else {\n limitY = (this.parentElement as HTMLElement).getBoundingClientRect().top;\n }\n return tRect.top <= limitY + epsilon && tRect.top >= limitY - epsilon;\n }\n\n private applyStickyStateFromScrollPosition(): void {\n this.zone.runOutsideAngular(() => {\n const shouldStick = this.computeShouldStick();\n\n if (shouldStick !== this.isSticky) {\n this.zone.run(() => {\n this.isSticky = shouldStick;\n this.toggleStickyClasses(shouldStick);\n this.cdr.markForCheck();\n });\n }\n });\n }\n\n private onParentScroll = (): void => {\n this.applyStickyStateFromScrollPosition();\n };\n\n private toggleStickyClasses(isSticky: boolean): void {\n const classes = this.stickyClass.split(' ').filter(Boolean);\n classes.forEach((className) => {\n if (isSticky) {\n this.renderer.addClass(this.targetElement, className);\n } else {\n this.renderer.removeClass(this.targetElement, className);\n }\n });\n }\n\n ngOnDestroy() {\n this.parentElement.removeEventListener('scroll', this.onParentScroll);\n window.removeEventListener('resize', this.onWindowResize);\n\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n }\n }\n}\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { AXP_MENU_MIDDLEWARE, AXPMenuMiddleware } from './menu.middleware';\n\n//#region ---- Menu Middleware Provider Helper ----\n\n/**\n * Helper function to provide menu middlewares with proper DI setup\n * Similar to provideCommandMiddleware pattern\n * \n * @example\n * ```typescript\n * // In app.config.ts or module providers\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideMenuMiddleware([\n * customizationMiddleware,\n * securityMiddleware,\n * loggingMiddleware\n * ])\n * ]\n * };\n * ```\n */\nexport function provideMenuMiddleware(\n middlewares: AXPMenuMiddleware[]\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n ...middlewares.map((middleware) => ({\n provide: AXP_MENU_MIDDLEWARE,\n useValue: middleware,\n multi: true,\n })),\n ]);\n}\n\n/**\n * Helper to create a class-based middleware with priority\n * \n * @example\n * ```typescript\n * const myMiddleware = createMenuMiddleware({\n * name: 'my-middleware',\n * priority: 100,\n * process: async (context) => {\n * context.find('dashboard').setPriority(1);\n * }\n * });\n * ```\n */\nexport function createMenuMiddleware(config: {\n name: string;\n priority?: number;\n process: (context: import('./menu.middleware').AXPMenuMiddlewareContext) => Promise<void>;\n}): AXPMenuMiddleware {\n return {\n name: config.name,\n priority: config.priority ?? 0,\n process: config.process,\n };\n}\n\n//#endregion\n\n","import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { inject, Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot } from '@angular/router';\nimport { axpFindMenuItemByRoute } from './menu-route-matcher';\nimport { AXPMenuProviderService } from './menu.provider';\nimport { AXPMenuVisibilityService } from './menu-visibility.service';\n\nconst SKIP_ROUTE_PREFIXES = ['/auth', '/error'];\nconst SKIP_ROUTE_PATHS = new Set(['/404', '/401', '/error/404', '/error/401']);\n\n//#region ---- Menu Route Access Service ----\n\n/**\n * Resolves route access using menu policy, route metadata, permissions, and features.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPMenuRouteAccessService {\n //#region ---- Services & Dependencies ----\n\n private readonly menuProvider = inject(AXPMenuProviderService);\n private readonly menuVisibility = inject(AXPMenuVisibilityService);\n private readonly sessionService = inject(AXPSessionService);\n\n //#endregion\n\n //#region ---- Public Methods ----\n\n /**\n * Checks whether navigation to the target URL is allowed for the current user.\n */\n async canAccess(route: ActivatedRouteSnapshot, url: string): Promise<boolean> {\n if (this.shouldSkip(route, url)) {\n return true;\n }\n\n if (this.hasDeclaredRoutePolicy(route)) {\n return this.evaluateDeclaredRoutePolicy(route);\n }\n\n // Avoid building/caching a shell-less menu tree before session is Authorized.\n if (!this.sessionService.isAuthorized) {\n return true;\n }\n\n const menuItems = await this.menuProvider.items();\n const menuMatch = axpFindMenuItemByRoute(menuItems, url);\n\n if (!menuMatch) {\n return true;\n }\n\n if (this.menuVisibility.isMenuBranchVisible(menuMatch.item, menuMatch.ancestors)) {\n return true;\n }\n\n return false;\n }\n\n //#endregion\n\n //#region ---- Utility Methods ----\n\n private shouldSkip(route: ActivatedRouteSnapshot, url: string): boolean {\n if (this.hasRouteFlag(route, 'skipMenuRouteGuard')) {\n return true;\n }\n\n const normalizedUrl = this.normalizeUrl(url);\n\n if (SKIP_ROUTE_PATHS.has(normalizedUrl)) {\n return true;\n }\n\n return SKIP_ROUTE_PREFIXES.some((prefix) => normalizedUrl.startsWith(prefix));\n }\n\n private hasRouteFlag(route: ActivatedRouteSnapshot, key: string): boolean {\n let current: ActivatedRouteSnapshot | null = route;\n\n while (current) {\n if (current.data?.[key] === true) {\n return true;\n }\n current = current.parent;\n }\n\n return false;\n }\n\n /** Routes that declare requiredPermission / requiredFeature (deep links, bookmarks). */\n private hasDeclaredRoutePolicy(route: ActivatedRouteSnapshot): boolean {\n const permissionKeys = this.normalizeKeys(\n this.getInheritedRouteData<string | string[] | null>(route, 'requiredPermission'),\n );\n const featureKeys = this.normalizeKeys(\n this.getInheritedRouteData<string | string[] | null>(route, 'requiredFeature'),\n );\n return permissionKeys.length > 0 || featureKeys.length > 0;\n }\n\n private evaluateDeclaredRoutePolicy(route: ActivatedRouteSnapshot): boolean {\n const permissionKeys = this.normalizeKeys(\n this.getInheritedRouteData<string | string[] | null>(route, 'requiredPermission'),\n );\n if (permissionKeys.length > 0 && !this.sessionService.authorize(...permissionKeys)) {\n return false;\n }\n\n const featureKeys = this.normalizeKeys(\n this.getInheritedRouteData<string | string[] | null>(route, 'requiredFeature'),\n );\n if (featureKeys.length > 0 && !this.sessionService.isFeatureEnabled(...featureKeys)) {\n return false;\n }\n\n return true;\n }\n\n private getInheritedRouteData<T>(route: ActivatedRouteSnapshot, key: string): T | null {\n let current: ActivatedRouteSnapshot | null = route;\n\n while (current) {\n const value = current.data?.[key] as T | undefined;\n if (value != null) {\n return value;\n }\n current = current.parent;\n }\n\n return null;\n }\n\n private normalizeKeys(keys: string | string[] | null | undefined): string[] {\n if (!keys) {\n return [];\n }\n\n return Array.isArray(keys) ? keys : [keys];\n }\n\n private normalizeUrl(url: string): string {\n const path = url.split('?')[0]?.split('#')[0] ?? url;\n return path.startsWith('/') ? path : `/${path}`;\n }\n\n //#endregion\n}\n\n//#endregion\n","import { AXP_UNAUTHORIZED_ROUTE } from '../../errors/unauthorized.routes';\n\nimport { AXPUnauthenticatedError, AXPSessionService } from '@acorex-platform/framework-client/auth';\n\nimport { inject } from '@angular/core';\n\nimport { ActivatedRouteSnapshot, CanActivateFn, Router, RouterStateSnapshot, UrlTree } from '@angular/router';\n\nimport { filter, first, from, map, of, switchMap, take } from 'rxjs';\n\nimport { AXPMenuRouteAccessService } from './menu-route-access.service';\n\n\n\nconst APP_CHOOSER_ROUTE = '/auth/account/app-chooser';\n\n\n\n/**\n\n * Blocks navigation when the target route is not accessible for the current user.\n\n * Evaluates menu policy, permissions, and features.\n\n */\n\nexport const AXPMenuRouteGuard: CanActivateFn = (\n\n route: ActivatedRouteSnapshot,\n\n state: RouterStateSnapshot,\n\n) => {\n\n const sessionService = inject(AXPSessionService);\n\n const menuRouteAccessService = inject(AXPMenuRouteAccessService);\n\n const router = inject(Router);\n\n\n\n return sessionService.isLoading$.pipe(\n\n filter((loading) => !loading),\n\n take(1),\n\n switchMap(() => sessionService.isAuthorized$),\n\n take(1),\n\n switchMap((authorized) => {\n\n if (!authorized) {\n\n if (sessionService.isAuthenticated) {\n\n return of(router.parseUrl(APP_CHOOSER_ROUTE));\n\n }\n\n\n\n throw new AXPUnauthenticatedError(\n\n `Access denied. You are not currently logged in. Please log in to access this page. If you continue to see this message after logging in, please contact support.`,\n\n { redirectUrl: state.url },\n\n );\n\n }\n\n\n\n return from(menuRouteAccessService.canAccess(route, state.url));\n\n }),\n\n map((isAllowed): boolean | UrlTree => {\n\n if (isAllowed === true) {\n\n return true;\n\n }\n\n\n\n if (isAllowed instanceof UrlTree) {\n\n return isAllowed;\n\n }\n\n\n\n return router.parseUrl(AXP_UNAUTHORIZED_ROUTE);\n\n }),\n\n );\n\n};\n\n\n\n","import { AXPAuthGuard } from '@acorex-platform/framework-client/auth';\nimport { axpPlatformSettingsAvailableGuard } from '../../settings/platform-settings-available.guard';\nimport { AXPMenuRouteGuard } from './menu-route.guard';\n\n/** Standard guards for authenticated routes with menu-based access enforcement. */\nexport const AXP_PROTECTED_ROUTE_GUARDS = [\n axpPlatformSettingsAvailableGuard,\n AXPAuthGuard,\n AXPMenuRouteGuard,\n] as const;\n","import { AXPSearchDefinitionProvider, AXPSearchDefinitionProviderContext } from '../../search';\nimport { AXPSystemActionType } from '@acorex-platform/framework-shared/core';\n\nexport class AXPMenuSearchDefinitionProvider implements AXPSearchDefinitionProvider {\n async provide(context: AXPSearchDefinitionProviderContext): Promise<void> {\n context.addDefinition('menu', 'Menu', 'menu', 'fa-thin fa-bars', 2, {\n format: {\n id: '{{data.name}}',\n },\n actions: [\n {\n name: 'navigate',\n type: AXPSystemActionType.View,\n priority: 'primary',\n },\n ],\n });\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport { AXPSearchDefinition } from './search.types';\n\n/**\n * Optional hook to resolve entity search definitions on demand (e.g. Module.X.Entity).\n */\nexport interface AXPSearchDefinitionLazyResolver {\n resolve(definitionName: string): Promise<AXPSearchDefinition | null>;\n}\n\nexport const AXP_SEARCH_DEFINITION_LAZY_RESOLVER = new InjectionToken<AXPSearchDefinitionLazyResolver>(\n 'AXP_SEARCH_DEFINITION_LAZY_RESOLVER',\n);\n","import { AXPSearchAction, AXPSearchDefinition, AXPSearchDefinitionDisplayFormat } from './search.types';\nimport { AXPSystemActionType } from '@acorex-platform/framework-shared/core';\n\nexport class AXPSearchDefinitionProviderContext {\n private definitions: AXPSearchDefinition[] = [];\n private definitionMap: Map<string, AXPSearchDefinition> = new Map();\n\n addDefinition(\n name: string,\n title: string,\n group: string,\n icon: string,\n order: number,\n options?: {\n format?: AXPSearchDefinitionDisplayFormat;\n actions?: AXPSearchAction[];\n }\n ): AXPSearchDefinitionBuilder {\n const definitionSearch: AXPSearchDefinition = {\n name,\n title,\n group,\n icon,\n order,\n format: {\n title: options?.format?.title ?? '{{ title }}',\n description: options?.format?.description ?? undefined,\n icon: options?.format?.icon ?? undefined,\n id: options?.format?.id ?? '{{ id }}',\n },\n actions: options?.actions ?? [],\n };\n\n this.definitions.push(definitionSearch);\n this.definitionMap.set(name, definitionSearch); // Index by name\n return new AXPSearchDefinitionBuilder(this, definitionSearch);\n }\n\n getDefinitions(): AXPSearchDefinition[] {\n return this.definitions;\n }\n\n // Expose groupMap for controlled access\n hasEntity(name: string): boolean {\n return this.definitionMap.has(name);\n }\n\n getDefinition(name: string): AXPSearchDefinition | undefined {\n return this.definitionMap.get(name);\n }\n}\n\nexport class AXPSearchDefinitionBuilder {\n private context: AXPSearchDefinitionProviderContext;\n private definition: AXPSearchDefinition;\n\n constructor(context: AXPSearchDefinitionProviderContext, definition: AXPSearchDefinition) {\n this.context = context;\n this.definition = definition;\n }\n\n addAction(name: string): AXPSearchDefinitionActionBuilder {\n const newAction: AXPSearchAction = {\n name,\n type: AXPSystemActionType.View,\n priority: 'primary',\n };\n this.definition.actions.push(newAction);\n return new AXPSearchDefinitionActionBuilder(this);\n }\n\n action(name: string): AXPSearchDefinitionActionBuilder | null {\n const foundAction = this.definition.actions.find((action) => action.name === name);\n if (!foundAction) {\n throw new Error(`action with name \"${name}\" not found in entity \"${this.definition.name}\".`);\n }\n return new AXPSearchDefinitionActionBuilder(this);\n }\n\n endEntity(): AXPSearchDefinitionProviderContext {\n return this.context;\n }\n}\n\nexport class AXPSearchDefinitionActionBuilder {\n private entityBuilder: AXPSearchDefinitionBuilder;\n\n constructor(entityBuilder: AXPSearchDefinitionBuilder) {\n this.entityBuilder = entityBuilder;\n }\n\n endAction(): AXPSearchDefinitionBuilder {\n return this.entityBuilder;\n }\n}\n","import { Injectable, InjectionToken, inject } from '@angular/core';\nimport { AXPSearchDefinitionProviderContext } from './search-definition.builder';\nimport {\n AXP_SEARCH_DEFINITION_LAZY_RESOLVER,\n type AXPSearchDefinitionLazyResolver,\n} from './search-definition-lazy-resolver.token';\nimport { AXPSearchDefinition } from './search.types';\n\n// Interface for setting providers\nexport interface AXPSearchDefinitionProvider {\n provide(context: AXPSearchDefinitionProviderContext): Promise<void>;\n}\n\n// Injection token for setting providers\nexport const AXP_SEARCH_DEFINITION_PROVIDER = new InjectionToken<AXPSearchDefinitionProvider[]>(\n 'AXP_SEARCH_DEFINITION_PROVIDER'\n);\n\n@Injectable({ providedIn: 'root' })\nexport class AXPSearchDefinitionProviderService {\n private providers = inject(AXP_SEARCH_DEFINITION_PROVIDER, { optional: true });\n private lazyResolver = inject(AXP_SEARCH_DEFINITION_LAZY_RESOLVER, { optional: true });\n private cache: AXPSearchDefinition[] | null = null;\n\n private async load(): Promise<void> {\n if (this.cache) {\n return;\n }\n const context = new AXPSearchDefinitionProviderContext();\n \n // Load providers from DI tokens (backward compatibility)\n if (Array.isArray(this.providers)) {\n for (const provider of this.providers) {\n await provider.provide(context);\n }\n }\n\n // Note: Search definition providers are different from search command providers\n // Search command providers are handled separately in search.service.ts\n \n this.cache = context.getDefinitions();\n }\n\n public async getListAsync(): Promise<AXPSearchDefinition[]> {\n await this.load();\n return this.getList();\n }\n\n public getList(): AXPSearchDefinition[] {\n if (!this.cache) {\n return [];\n } else {\n return this.cache;\n }\n }\n\n public findDefinition(definitionName: string): AXPSearchDefinition {\n const definition = this.getList().find((item) => item.name === definitionName);\n if (!definition) {\n throw new Error(`Definition with name ${definitionName} not found`);\n }\n return definition;\n }\n\n public async findDefinitionAsync(definitionName: string): Promise<AXPSearchDefinition | null> {\n await this.load();\n\n const existing = this.getList().find((item) => item.name === definitionName);\n if (existing) {\n return existing;\n }\n\n const lazy = this.lazyResolver as AXPSearchDefinitionLazyResolver | null;\n if (!lazy) {\n return null;\n }\n\n const resolved = await lazy.resolve(definitionName);\n if (!resolved) {\n return null;\n }\n\n this.cache = [...(this.cache ?? []), resolved];\n return resolved;\n }\n\n public findDefinitionByGroup(definitionGroup: string): AXPSearchDefinition {\n const definition = this.getList().find((definition) => definition.group === definitionGroup);\n if (!definition) {\n throw new Error(`Definition with group ${definitionGroup} not found`);\n }\n return definition;\n }\n}\n","//#region ---- Imports ----\n\nimport { AXPMultiLanguageString, isLocaleStringMap } from '@acorex-platform/framework-shared/core';\nimport { AXFormatService } from '@acorex/core/format';\nimport { AXTranslationService, resolveMultiLanguageString } from '@acorex/core/translation';\n\nimport { AXPContextEvalFactory, AXPExpressionEvaluatorService } from '@acorex-platform/framework-client/core';\nimport { AXPExpressionEvaluatorScope } from '@acorex-platform/framework-shared/core';\nimport { isPlainObject, isString } from 'lodash-es';\nimport { normalizeEntityDisplayTemplate, sanitizeResolvedEntityDisplayTitle } from '@acorex-platform/framework-shared/entity';\n\n//#endregion\n\n//#region ---- Searchable text resolution ----\n\n/**\n * Resolves a value to plain text for global-search matching (i18n keys, locale maps, scalars).\n */\nexport function resolveSearchableText(\n value: unknown,\n locale: string,\n translationService: AXTranslationService,\n): string {\n if (value == null || value === false) {\n return '';\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) {\n return '';\n }\n if (trimmed.startsWith('@')) {\n return translationService.translateSync(trimmed) || trimmed;\n }\n return trimmed;\n }\n\n if (isLocaleStringMap(value) || translationService.isValidMultiLanguageObject(value)) {\n return resolveMultiLanguageString(value as AXPMultiLanguageString, locale).trim();\n }\n\n return '';\n}\n\n/**\n * Case-insensitive match against i18n keys, locale maps, and plain strings.\n */\nexport function searchInSearchableValue(\n value: unknown,\n query: string,\n locale: string,\n translationService: AXTranslationService,\n): boolean {\n const q = query.trim().toLocaleLowerCase(locale);\n if (!q) {\n return true;\n }\n\n if (isLocaleStringMap(value)) {\n return Object.values(value)\n .filter((entry): entry is string => typeof entry === 'string' && entry.trim() !== '')\n .some((entry) => entry.toLocaleLowerCase(locale).includes(q));\n }\n\n const text = resolveSearchableText(value, locale, translationService).toLocaleLowerCase(locale);\n return text.includes(q);\n}\n\n/**\n * Shallow + nested search over entity/command payloads (skips id / entityName keys).\n */\nexport function searchInRecordValues(\n value: unknown,\n query: string,\n locale: string,\n translationService: AXTranslationService,\n depth = 0,\n): boolean {\n const maxDepth = 4;\n if (depth > maxDepth || value == null) {\n return false;\n }\n\n if (searchInSearchableValue(value, query, locale, translationService)) {\n return true;\n }\n\n if (Array.isArray(value)) {\n return value.some((item) => searchInRecordValues(item, query, locale, translationService, depth + 1));\n }\n\n if (isPlainObject(value) && !isLocaleStringMap(value)) {\n return Object.entries(value as Record<string, unknown>).some(([key, entry]) => {\n if (key === 'id' || key === 'entityName') {\n return false;\n }\n return searchInRecordValues(entry, query, locale, translationService, depth + 1);\n });\n }\n\n return false;\n}\n\n//#endregion\n\n//#region ---- Display template resolution ----\n\nfunction countMustacheExpressions(template: string): number {\n return (template.match(/\\{\\{/g) ?? []).length;\n}\n\n/** Standard display-tier row scope for entity title/search templates. */\nexport function createEntityRowExpressionScope(\n data: unknown,\n contextEvalFactory: AXPContextEvalFactory,\n): AXPExpressionEvaluatorScope {\n return {\n context: contextEvalFactory.createScope((data ?? {}) as Record<string, unknown>),\n };\n}\n\n/**\n * Coerces an evaluated display segment to plain text.\n * Piped eval returns strings; unpiped MLS still resolves via compat fallback.\n */\nfunction formatDisplaySegment(\n segment: unknown,\n locale: string,\n translationService: AXTranslationService,\n): string {\n if (segment === false || segment == null) {\n return '';\n }\n if (isString(segment)) {\n return segment.trim();\n }\n return resolveSearchableText(segment, locale, translationService);\n}\n\n/**\n * Evaluates a normalized entity display template via {@link AXPExpressionEvaluatorService}.\n */\nexport async function evaluateEntityDisplayTemplate(\n template: string,\n data: unknown,\n expressionEvaluator: AXPExpressionEvaluatorService,\n locale: string,\n translationService: AXTranslationService,\n contextEvalFactory: AXPContextEvalFactory,\n): Promise<unknown> {\n const normalized = normalizeEntityDisplayTemplate(template);\n const scope = createEntityRowExpressionScope(data, contextEvalFactory);\n\n if (!normalized.includes('{{')) {\n return normalized;\n }\n\n if (\n countMustacheExpressions(normalized) === 1 &&\n expressionEvaluator.isExpression(normalized)\n ) {\n return expressionEvaluator.evaluate(normalized, scope);\n }\n\n const regex = /\\{\\{\\s*([\\s\\S]*?)\\s*\\}\\}/g;\n let result = '';\n let lastIndex = 0;\n\n for (const match of normalized.matchAll(regex)) {\n result += normalized.slice(lastIndex, match.index);\n const segment = await expressionEvaluator.evaluate(`{{ ${match[1].trim()} }}`, scope);\n result += formatDisplaySegment(segment, locale, translationService);\n lastIndex = (match.index ?? 0) + match[0].length;\n }\n\n result += normalized.slice(lastIndex);\n return result;\n}\n\n/**\n * Best display string from row values that contain the active search query (deep-match fallback).\n */\nexport function resolveQueryMatchingDisplayText(\n value: unknown,\n query: string,\n locale: string,\n translationService: AXTranslationService,\n depth = 0,\n): string {\n const q = query.trim().toLocaleLowerCase(locale);\n if (!q || depth > 4 || value == null) {\n return '';\n }\n\n let best = '';\n const consider = (candidate: unknown) => {\n const text = resolveSearchableText(candidate, locale, translationService).trim();\n if (text && text.toLocaleLowerCase(locale).includes(q) && text.length > best.length) {\n best = text;\n }\n };\n\n consider(value);\n\n if (Array.isArray(value)) {\n for (const item of value) {\n const nested = resolveQueryMatchingDisplayText(item, query, locale, translationService, depth + 1);\n if (nested.length > best.length) {\n best = nested;\n }\n }\n return best;\n }\n\n if (isPlainObject(value) && !isLocaleStringMap(value)) {\n for (const [key, entry] of Object.entries(value as Record<string, unknown>)) {\n if (key === 'id' || key === 'entityName') {\n continue;\n }\n const nested = resolveQueryMatchingDisplayText(entry, query, locale, translationService, depth + 1);\n if (nested.length > best.length) {\n best = nested;\n }\n }\n }\n\n return best;\n}\n\n/**\n * Resolves entity search display templates; coerces multi-language field values to readable text.\n */\nexport async function resolveSearchDisplayTemplate(\n template: string | undefined,\n data: unknown,\n locale: string,\n translationService: AXTranslationService,\n formatService: AXFormatService,\n expressionEvaluator: AXPExpressionEvaluatorService,\n contextEvalFactory: AXPContextEvalFactory,\n): Promise<AXPMultiLanguageString> {\n if (!template) {\n return '';\n }\n\n if (!template.includes('{{') && !template.includes('{')) {\n if (template.trim().startsWith('@')) {\n return resolveSearchableText(template, locale, translationService);\n }\n\n const formatted = formatService.format(template, 'string', data);\n return sanitizeResolvedEntityDisplayTitle(\n typeof formatted === 'string' ? formatted : String(formatted ?? ''),\n );\n }\n\n const evaluated = await evaluateEntityDisplayTemplate(\n template,\n data,\n expressionEvaluator,\n locale,\n translationService,\n contextEvalFactory,\n );\n return sanitizeResolvedEntityDisplayTitle(\n resolveSearchableText(evaluated, locale, translationService),\n );\n}\n\n//#endregion\n","import { AXTranslationService } from '@acorex/core/translation';\nimport { inject } from '@angular/core';\nimport { searchInSearchableValue } from './search-display-string.util';\nimport { AXPSearchResult } from './search.types';\n\n// Interface for setting providers\nexport interface AXPSearchProvider {\n search(text: string): Promise<AXPSearchResult[]>;\n}\n\nexport abstract class AXPSearchCommandProvider {\n private readonly translationService = inject(AXTranslationService);\n abstract commands: AXPSearchResult[];\n\n async search(text: string): Promise<AXPSearchResult[]> {\n const locale = this.translationService.getActiveLang() ?? 'en-US';\n return this.commands.filter(\n (command) =>\n searchInSearchableValue(command.title, text, locale, this.translationService) ||\n searchInSearchableValue(command.description, text, locale, this.translationService),\n );\n }\n}\n","//#region ---- Imports ----\n\nimport { type AXPEntity, buildEntitySearchTitleContext, isMeaningfulEntityDisplayTitle, isUnresolvedEntityDisplayTemplate, normalizeEntityDisplayTemplate, resolveEntityModifyRecordTitleTemplate, resolveEntityRowTitleTemplate, sanitizeResolvedEntityDisplayTitle } from '@acorex-platform/framework-shared/entity';\nimport { AXFormatService } from '@acorex/core/format';\nimport { AXTranslationService } from '@acorex/core/translation';\n\nimport { AXPContextEvalFactory, AXPExpressionEvaluatorService } from '@acorex-platform/framework-client/core';\nimport { get } from 'lodash-es';\n\nimport { resolveSearchDisplayTemplate, resolveSearchableText } from './search-display-string.util';\nimport { AXPSearchDefinitionDisplayFormat } from './search.types';\n\n//#endregion\n\n//#region ---- Runtime resolution ----\n\n/**\n * Modify/edit popup chrome: `{action} {individual} ({update.title ?? single.title})` when a record template exists.\n */\nexport async function resolveEntityModifyPopupTitle(\n entity: AXPEntity,\n recordData: unknown,\n translationService: AXTranslationService,\n formatService: AXFormatService,\n expressionEvaluator: AXPExpressionEvaluatorService,\n contextEvalFactory: AXPContextEvalFactory,\n actionTitleKey = '@general:actions.modify.title',\n): Promise<string> {\n const actionPrefix = translationService.translateSync(actionTitleKey);\n const entityLabel = translationService.translateSync(entity.formats.individual);\n const baseTitle = `${actionPrefix} ${entityLabel}`.trim();\n\n const recordTemplate = resolveEntityModifyRecordTitleTemplate(entity);\n if (!recordTemplate) {\n return baseTitle;\n }\n\n const locale = translationService.getActiveLang();\n const resolved = await resolveSearchDisplayTemplate(\n recordTemplate,\n recordData,\n locale,\n translationService,\n formatService,\n expressionEvaluator,\n contextEvalFactory,\n );\n const recordTitle = sanitizeResolvedEntityDisplayTitle(\n typeof resolved === 'string'\n ? resolved\n : resolveSearchableText(resolved, locale, translationService),\n );\n\n if (!isMeaningfulEntityDisplayTitle(recordTitle)) {\n return baseTitle;\n }\n\n return `${baseTitle} (${recordTitle})`;\n}\n\n/**\n * Resolves an entity row title using entity-driven fallback templates and property paths.\n */\nexport async function resolveEntitySearchTitleFallback(\n format: Pick<AXPSearchDefinitionDisplayFormat, 'titleFallbackTemplates' | 'titleFallbackFields'>,\n data: unknown,\n locale: string,\n translationService: AXTranslationService,\n formatService: AXFormatService,\n expressionEvaluator: AXPExpressionEvaluatorService,\n contextEvalFactory: AXPContextEvalFactory,\n): Promise<string> {\n if (data == null) {\n return '';\n }\n\n for (const template of format.titleFallbackTemplates ?? []) {\n const resolved = await resolveSearchDisplayTemplate(\n template,\n data,\n locale,\n translationService,\n formatService,\n expressionEvaluator,\n contextEvalFactory,\n );\n const text = sanitizeResolvedEntityDisplayTitle(\n typeof resolved === 'string'\n ? resolved\n : resolveSearchableText(resolved, locale, translationService),\n );\n if (isMeaningfulEntityDisplayTitle(text)) {\n return text;\n }\n }\n\n for (const path of format.titleFallbackFields ?? []) {\n const text = resolveSearchableText(get(data, path), locale, translationService).trim();\n if (text) {\n return text;\n }\n }\n\n return '';\n}\n\n//#endregion\n","import { isMeaningfulEntityDisplayTitle, sanitizeResolvedEntityDisplayTitle } from '@acorex-platform/framework-shared/entity';\nimport { AXFormatService } from '@acorex/core/format';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPContextEvalFactory, AXPExpressionEvaluatorService } from '@acorex-platform/framework-client/core';\nimport { inject, Injectable, InjectionToken } from '@angular/core';\nimport { omit } from 'lodash-es';\nimport { AXPSearchDefinitionProviderService } from './search-definition.provider';\nimport { resolveEntitySearchTitleFallback } from './entity-search-display-title.util';\nimport {\n resolveSearchDisplayTemplate,\n resolveSearchableText,\n searchInRecordValues,\n searchInSearchableValue,\n} from './search-display-string.util';\nimport { AXPSearchProvider } from './search.provider';\nimport { AXPSearchDisplayGroupResult, AXPSearchDisplayResult } from './search.types';\n\n// Injection token for setting providers\nexport const AXP_SEARCH_PROVIDER = new InjectionToken<AXPSearchProvider[]>('AXP_SEARCH_PROVIDER');\n\n@Injectable({ providedIn: 'root' })\nexport class AXPSearchService {\n private providers = inject(AXP_SEARCH_PROVIDER, { optional: true });\n private definitionService = inject(AXPSearchDefinitionProviderService);\n private formatService = inject(AXFormatService);\n private translationService = inject(AXTranslationService);\n private expressionEvaluator = inject(AXPExpressionEvaluatorService);\n private contextEvalFactory = inject(AXPContextEvalFactory);\n\n async search(text: string): Promise<AXPSearchDisplayGroupResult[]> {\n //TODO better handle this\n if (this.definitionService.getList().length == 0) {\n await this.definitionService.getListAsync();\n }\n\n // Collect providers from DI tokens\n const allProviders: AXPSearchProvider[] = [];\n\n // Load from DI tokens\n if (Array.isArray(this.providers)) {\n allProviders.push(...this.providers);\n } else if (this.providers) {\n allProviders.push(this.providers);\n }\n\n if (allProviders.length === 0) {\n throw new Error('No search providers available');\n }\n\n const providersWithSearch = allProviders.filter(\n (provider): provider is AXPSearchProvider => provider != null && typeof provider.search === 'function',\n );\n\n if (providersWithSearch.length === 0) {\n throw new Error('No search providers with a valid search method available');\n }\n\n const locale = this.translationService.getActiveLang() ?? 'en-US';\n const mergeData: AXPSearchDisplayResult[] = [];\n const promises = providersWithSearch.map((provider) => provider.search(text));\n const results = await Promise.all(promises);\n for (const resultArray of results) {\n for (const result of resultArray) {\n try {\n const definition = await this.definitionService.findDefinitionAsync(result.group);\n if (!definition) {\n continue;\n }\n\n const resolvedTitle =\n result.title ??\n (definition.format.title\n ? await resolveSearchDisplayTemplate(\n definition.format.title,\n result.data,\n locale,\n this.translationService,\n this.formatService,\n this.expressionEvaluator,\n this.contextEvalFactory,\n )\n : '');\n const resolvedDescription =\n result.description ??\n (definition.format.description\n ? await resolveSearchDisplayTemplate(\n definition.format.description,\n result.data,\n locale,\n this.translationService,\n this.formatService,\n this.expressionEvaluator,\n this.contextEvalFactory,\n )\n : undefined);\n\n let titleText = sanitizeResolvedEntityDisplayTitle(\n typeof resolvedTitle === 'string'\n ? resolvedTitle\n : resolveSearchableText(resolvedTitle, locale, this.translationService),\n );\n\n if (!isMeaningfulEntityDisplayTitle(titleText)) {\n titleText = await resolveEntitySearchTitleFallback(\n definition.format,\n result.data,\n locale,\n this.translationService,\n this.formatService,\n this.expressionEvaluator,\n this.contextEvalFactory,\n );\n }\n\n if (!isMeaningfulEntityDisplayTitle(titleText)) {\n continue;\n }\n\n mergeData.push({\n definitionName: definition.group,\n definitionTitle: definition.title,\n name: result.group,\n id: `${definition.name}:${this.formatService.format(definition.format.id, 'string', result.data ?? result)}`,\n title: titleText,\n description: resolvedDescription,\n icon: result.icon ?? definition.icon,\n data: result.data,\n command: result.command,\n actions: definition.actions,\n parent: result.parent,\n order: definition.order,\n });\n } catch (e) {\n console.error(e);\n }\n }\n }\n\n const normalizedQuery = text.trim();\n const visibleData =\n normalizedQuery.length === 0\n ? mergeData\n : mergeData.filter(\n (item) =>\n searchInSearchableValue(item.title, normalizedQuery, locale, this.translationService) ||\n searchInSearchableValue(item.description, normalizedQuery, locale, this.translationService) ||\n searchInRecordValues(item.data, normalizedQuery, locale, this.translationService),\n );\n\n // Group data\n const groupedData: AXPSearchDisplayGroupResult[] = [];\n const groupMap: { [key: string]: AXPSearchDisplayGroupResult } = {};\n\n // Create groups\n for (const item of visibleData) {\n const groupName = item.definitionName!; // Change this to the property you want to group by\n if (!groupMap[groupName]) {\n groupMap[groupName] = {\n name: groupName,\n title: item.definitionTitle!, // You can adjust the title logic if needed\n order: item.order, // Add order to the group\n children: [],\n };\n groupedData.push(groupMap[groupName]);\n }\n groupMap[groupName].children.push(omit(item, ['definitionName', 'definitionTitle', 'order']));\n }\n\n // Sort groups by order\n groupedData.sort((a, b) => a.order - b.order);\n\n return groupedData;\n }\n}\n","//#region ---- Imports ----\n\nimport { type AXPEntity, buildEntitySearchTitleContext, ENTITY_LAYOUT_SINGLE_TITLE_PATH, ENTITY_ROW_POPUP_TITLE_OPTION, ENTITY_ROW_TITLE_TEMPLATE_OPTION, isUnresolvedEntityDisplayTemplate, normalizeEntityDisplayTemplate, resolveEntityRowTitleTemplate } from '@acorex-platform/framework-shared/entity';\nimport { AXFormatService } from '@acorex/core/format';\nimport { resolveMultiLanguageString } from '@acorex/core/translation';\n\nimport { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\n\nimport { get } from 'lodash-es';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface AXPResolveEntityRowDisplayTitleOptions {\n /** Row or form context data used to evaluate title templates. */\n data: Record<string, unknown> | undefined;\n activeLang: string;\n formatService: AXFormatService;\n /** Entity definition when available (forms, columns with entity resolver). */\n entity?: AXPEntity | null;\n /** Widget/interface options — may contain `popupTitle` or `titleTemplate`. */\n widgetOptions?: Record<string, unknown> | undefined;\n}\n\n//#endregion\n\n//#region ---- Constants ----\n\nconst INVALID_DISPLAY_TEXT = '[object Object]';\n\nconst DEFAULT_ROW_TITLE_FALLBACK_PATHS = ['title', 'name', 'code'] as const;\n\n//#endregion\n\n//#region ---- Value normalization ----\n\n/** Resolves a row field or format result to a plain display string for the active locale. */\nexport function resolveEntityRowDisplayText(value: unknown, activeLang: string): string {\n if (value == null || value === '') {\n return '';\n }\n\n if (typeof value === 'string') {\n const text = value.trim();\n if (!text || text === INVALID_DISPLAY_TEXT || isUnresolvedEntityDisplayTemplate(text)) {\n return '';\n }\n return text;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n\n if (typeof value === 'object' && !Array.isArray(value)) {\n const text = resolveMultiLanguageString(value as AXPMultiLanguageString, activeLang).trim();\n if (!text || text === INVALID_DISPLAY_TEXT || isUnresolvedEntityDisplayTemplate(text)) {\n return '';\n }\n return text;\n }\n\n return '';\n}\n\n//#endregion\n\n//#region ---- Row title resolution ----\n\nfunction readTitleTemplateFromWidgetOptions(\n widgetOptions: Record<string, unknown> | undefined,\n): unknown {\n if (!widgetOptions) {\n return undefined;\n }\n\n return widgetOptions[ENTITY_ROW_POPUP_TITLE_OPTION] ?? widgetOptions[ENTITY_ROW_TITLE_TEMPLATE_OPTION];\n}\n\nfunction resolveEntityRowDisplayTitleFromContext(\n data: Record<string, unknown>,\n widgetOptions: Record<string, unknown> | undefined,\n formatService: AXFormatService,\n activeLang: string,\n): string {\n const titleTemplate = readTitleTemplateFromWidgetOptions(widgetOptions);\n const fromTemplateValue = resolveEntityRowDisplayText(titleTemplate, activeLang);\n if (fromTemplateValue) {\n return fromTemplateValue;\n }\n\n const fromEntityLayout = resolveEntityRowDisplayText(get(data, ENTITY_LAYOUT_SINGLE_TITLE_PATH), activeLang);\n if (fromEntityLayout) {\n return fromEntityLayout;\n }\n\n if (typeof titleTemplate === 'string' && titleTemplate.trim()) {\n const formatted = formatService.format(normalizeEntityDisplayTemplate(titleTemplate), 'string', data);\n const fromFormattedTemplate = resolveEntityRowDisplayText(formatted, activeLang);\n if (fromFormattedTemplate) {\n return fromFormattedTemplate;\n }\n }\n\n for (const path of DEFAULT_ROW_TITLE_FALLBACK_PATHS) {\n const fromField = resolveEntityRowDisplayText(get(data, path), activeLang);\n if (fromField) {\n return fromField;\n }\n }\n\n return '';\n}\n\n/**\n * Resolves an entity row title for list columns, view widgets, and edit widgets.\n * Uses entity metadata when provided, otherwise widget title templates and common field paths.\n */\nexport function resolveEntityRowDisplayTitle(options: AXPResolveEntityRowDisplayTitleOptions): string {\n const { data, activeLang, formatService, entity, widgetOptions } = options;\n if (!data) {\n return '';\n }\n\n if (entity) {\n const fromEntity = formatEntityRowDisplayTitle(entity, data, formatService, activeLang);\n if (fromEntity) {\n return fromEntity;\n }\n }\n\n return resolveEntityRowDisplayTitleFromContext(data, widgetOptions, formatService, activeLang);\n}\n\n/**\n * @deprecated Use {@link resolveEntityRowDisplayTitle} instead.\n */\nexport function resolveEntityRowDisplayTitleFromColumnContext(\n rowData: Record<string, unknown> | undefined,\n columnOptions: Record<string, unknown> | undefined,\n formatService: AXFormatService,\n activeLang: string,\n): string {\n return resolveEntityRowDisplayTitle({\n data: rowData,\n widgetOptions: columnOptions,\n formatService,\n activeLang,\n });\n}\n\n/**\n * Formats the entity row title for display using entity-driven templates and property paths.\n */\nexport function formatEntityRowDisplayTitle(\n entity: AXPEntity | null | undefined,\n rowData: Record<string, unknown> | undefined,\n formatService: AXFormatService,\n activeLang: string,\n): string {\n if (!rowData) {\n return '';\n }\n\n const titleContext = buildEntitySearchTitleContext(entity ?? ({} as AXPEntity));\n\n for (const path of titleContext.fallbackFields) {\n const fromField = resolveEntityRowDisplayText(get(rowData, path), activeLang);\n if (fromField) {\n return fromField;\n }\n }\n\n const templates = [\n resolveEntityRowTitleTemplate(entity),\n ...titleContext.fallbackTemplates,\n ].filter((template): template is string => !!template?.trim());\n\n for (const template of templates) {\n const formatted = formatService.format(normalizeEntityDisplayTemplate(template), 'string', rowData);\n const fromTemplate = resolveEntityRowDisplayText(formatted, activeLang);\n if (fromTemplate) {\n return fromTemplate;\n }\n }\n\n return '';\n}\n\n//#endregion\n","import type { AXPSearchResult } from './search.types';\n\n/**\n * Shared utility for creating Entity:Create command options used in search command providers.\n * Use with command: { name: 'Entity:Create', options: createEntityCommandOptions(...) }\n */\nexport function createEntityCommandOptions(\n entityKey: string,\n entityInfo: { name: string; module: string; title: string }\n): Record<string, unknown> {\n return {\n entity: entityKey,\n entityInfo: {\n name: entityInfo.name,\n module: entityInfo.module,\n title: entityInfo.title,\n parentKey: undefined,\n source: entityKey,\n },\n data: {},\n options: {},\n \n };\n}\n\n/**\n * Creates a search command for \"Create {Entity}\" with consistent i18n pattern.\n * Use titleKey/descriptionKey from module (e.g. @module:entity.permissions.create.title).\n * Standard: \"Create {Entity}\" for title, \"Create new {entities}\" for description.\n */\nexport function createEntitySearchCommand(config: {\n id: string;\n entityKey: string;\n entityInfo: { name: string; module: string; title: string };\n titleKey: string;\n descriptionKey?: string;\n icon: string;\n}): AXPSearchResult {\n return {\n id: config.id,\n group: 'command',\n title: config.titleKey,\n description: config.descriptionKey ?? config.titleKey,\n icon: config.icon,\n command: {\n name: 'Entity:Create',\n options: createEntityCommandOptions(config.entityKey, config.entityInfo),\n },\n };\n}\n","import { AXTranslationService } from '@acorex/core/translation';\nimport { AXPExecuteCommand } from '@acorex-platform/framework-shared/core';\nimport { inject } from '@angular/core';\nimport { omit, sortBy } from 'lodash-es';\nimport { AXPSearchProvider, AXPSearchResult, searchInSearchableValue } from '../../search';\nimport { AXPMenuProviderService } from './menu.provider';\nimport { AXPMenuItem } from './menu.types';\n\nexport interface AXPMenuItemWithParent extends AXPMenuItem {\n parent?: AXPMenuItem;\n}\n\nexport class AXPMenuSearchProvider implements AXPSearchProvider {\n menuService = inject(AXPMenuProviderService);\n translateService = inject(AXTranslationService);\n\n async search(text: string): Promise<AXPSearchResult[]> {\n const menuItems = this.searchMenuItems(await this.menuService.items(), text);\n return sortBy<AXPSearchResult>(\n menuItems.map<AXPSearchResult>((item) => ({\n group: 'menu', // Use `name` or empty string if undefined\n title: item.text, // Use `text` for the `title`\n icon: item.icon, // Include the `icon` if present\n data: omit(item, ['parent', 'children']), // Include all data except `parent` and `children`\n command: item.path\n ? ({\n name: 'navigate',\n options: {\n type: 'router',\n options: {\n path: item.path,\n },\n },\n } as AXPExecuteCommand)\n : (item.command as AXPExecuteCommand),\n parent: item.parent\n ? {\n title: item.parent.text,\n }\n : undefined,\n })),\n [(o) => this.translateService.translateSync(String(o.title ?? ''))],\n );\n }\n\n /**\n * Recursively searches AXPMenuItem and its children for a matching text.\n *\n * @param menuItems - The array of AXPMenuItem to search in.\n * @param searchText - The text to search for (case-insensitive).\n * @returns An array of AXPMenuItem that match the search text.\n */\n private searchMenuItems(menuItems: AXPMenuItem[], searchText: string): AXPMenuItemWithParent[] {\n const result: AXPMenuItemWithParent[] = [];\n const locale = this.translateService.getActiveLang() ?? 'en-US';\n\n for (const item of menuItems) {\n // Check if the current item's text matches the search text\n if (\n item.type != 'group' &&\n (item.children?.length ?? 0) == 0 &&\n searchInSearchableValue(item.text, searchText, locale, this.translateService)\n ) {\n result.push(item as AXPMenuItemWithParent);\n }\n\n // Recursively search in children if they exist\n if (item.children && item.children.length > 0) {\n const childResults = this.searchMenuItems(item.children, searchText);\n result.push(...childResults.map((x) => ({ ...x, parent: item }) as AXPMenuItemWithParent));\n }\n }\n\n return result;\n }\n}\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\n\n@Component({\n template: `\n <small class=\"text-sm\" [innerHTML]=\"text\"></small>\n `,\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXPFooterTextSlotComponent {\n @Input()\n public text!: string;\n}","\nimport { Component, Input, ViewEncapsulation, inject, ChangeDetectionStrategy } from '@angular/core';\nimport { AXPMenuItem, AXPMenuItemCommand } from '../../../menu';\n\n@Component({\n template: `\n <div class=\"flex items-center justify-between gap-5\">\n @for (link of items; track link) {\n <a (click)=\"handleCommand(link.command)\" >{{ link.text }}</a>\n }\n </div>\n `,\n imports: [],\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.None\n})\nexport class AXPNavBarSlotComponent {\n @Input()\n public items!: AXPMenuItem[];\n\n\n protected handleCommand(action?: AXPMenuItemCommand) {\n // if (action)\n // this.store.dispatch(action)\n }\n}","import { InjectionToken } from '@angular/core';\n\nexport type AXPTokenDefinitionProviderToken =\n | AXPTokenDefinitionProvider\n | Promise<AXPTokenDefinitionProvider>;\n\nexport const AXP_TOKEN_DEFINITION_PROVIDER = new InjectionToken<AXPTokenDefinitionProviderToken[]>(\n 'AXP_TOKEN_DEFINITION_PROVIDER',\n {\n factory: () => [],\n },\n);\n\nexport interface AXPTokenDefinitionProvider<T = any> {\n name: string;\n title: string;\n description?: string;\n\n execute(): Promise<T> | T;\n}\n","//#region ---- Imports ----\n\nimport { inject, Injectable, Injector } from '@angular/core';\nimport { AXP_TOKEN_DEFINITION_PROVIDER, type AXPTokenDefinitionProviderToken } from './token-definition.provider';\nimport { AXPTokenDefinition } from './token.types';\n\n//#endregion\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPTokenDefinitionService {\n //#region ---- Providers & Caches ----\n\n private readonly injector = inject(Injector);\n\n /** Cache for definitions by name. */\n private definitionsByName: Map<string, AXPTokenDefinition> = new Map();\n\n\n\n //#endregion\n\n //#region ---- Public API ----\n\n /**\n * Returns a token definition by its name.\n * First checks the cache, then queries all providers if not found.\n * @param name The token name.\n * @returns The token definition if found, undefined otherwise.\n */\n async getDefinition(name: string): Promise<AXPTokenDefinition | undefined> {\n // Check cache first\n if (this.definitionsByName.has(name)) {\n return this.definitionsByName.get(name);\n }\n // Not in cache, query providers\n // Resolve all providers (some may be promises, some may be arrays)\n const resolvedProviders = await Promise.all(this.resolveDefinitionProviders());\n\n // Flatten the array - some providers may be arrays of providers (e.g., dynamic token providers)\n const flattenedProviders: AXPTokenDefinition[] = [];\n for (const provider of resolvedProviders) {\n if (Array.isArray(provider)) {\n // If provider is an array, add all items\n flattenedProviders.push(...provider);\n } else if (provider) {\n // If provider is a single provider, add it\n flattenedProviders.push(provider);\n }\n }\n\n const match = flattenedProviders.find(def => def?.name === name);\n if (match) {\n this.definitionsByName.set(name, match);\n return match;\n }\n return undefined;\n }\n\n /**\n * Gets the resolved value of a token by its name.\n * @param name The token name.\n * @returns The resolved token value, or undefined if the token is not found.\n */\n async getValue(name: string): Promise<any> {\n const definition = await this.getDefinition(name);\n if (definition) {\n return await definition.execute();\n }\n return undefined;\n }\n\n //#endregion\n\n //#region ---- Cache Management ----\n\n /** Clears the definitions by name cache. */\n clearDefinitionsCache(): void {\n this.definitionsByName.clear();\n }\n\n /**\n * Resolves token providers on demand so dynamic backend loading does not run\n * during unrelated DI (e.g. expression scope registration before login).\n */\n private resolveDefinitionProviders(): AXPTokenDefinitionProviderToken[] {\n return this.injector.get(AXP_TOKEN_DEFINITION_PROVIDER, { optional: true }) || [];\n }\n\n //#endregion\n}\n","\nimport { AXPExpressionEvaluatorScopeProvider, AXPExpressionEvaluatorScopeProviderContext } from \"@acorex-platform/framework-shared/core\";\nimport { inject } from \"@angular/core\";\nimport { AXPTokenDefinitionService } from \"./token-definition.service\";\n\nexport class AXPTokenEvaluatorScopeProvider implements AXPExpressionEvaluatorScopeProvider {\n\n protected tokenService = inject(AXPTokenDefinitionService);\n\n async provide(context: AXPExpressionEvaluatorScopeProviderContext): Promise<void> {\n context.addScope('tokens', {\n get: async (name: string) => {\n return await this.tokenService.getValue(name);\n }\n })\n }\n}\n","import { AXPExpressionEvaluatorScopeProvider, AXPExpressionEvaluatorScopeProviderContext } from '@acorex-platform/framework-shared/core';\nimport { inject } from '@angular/core';\nimport { Router } from '@angular/router';\n\n//#region ---- Query params expression scope ----\n\n/**\n * Exposes URL query parameters in expression strings, e.g.\n * `{{ queryParams.get('view') }}`.\n */\nexport class AXPQueryParamsEvaluatorScopeProvider implements AXPExpressionEvaluatorScopeProvider {\n private readonly router = inject(Router);\n\n async provide(context: AXPExpressionEvaluatorScopeProviderContext): Promise<void> {\n context.addScope('queryParams', {\n get: (key: string) => {\n const value = this.router.parseUrl(this.router.url).queryParamMap.get(key);\n return value ?? undefined;\n },\n });\n }\n}\n\n//#endregion\n","import { AXPQueryService } from '@acorex-platform/framework-client/runtime';\nimport {\n AXPExpressionEvaluatorScopeProvider,\n AXPExpressionEvaluatorScopeProviderContext,\n runtimeQueryCollectionData,\n} from '@acorex-platform/framework-shared/core';\nimport { inject } from '@angular/core';\n\n//#region ----- Query expression scope -----\n\n/**\n * Exposes registered queries in expression strings, e.g.\n * `{{ await query.toArray('Module:ListSomething') }}`.\n */\nexport class AXPQueryEvaluatorScopeProvider implements AXPExpressionEvaluatorScopeProvider {\n private readonly queryService = inject(AXPQueryService);\n\n async provide(context: AXPExpressionEvaluatorScopeProviderContext): Promise<void> {\n context.addScope('query', {\n /**\n * Load all items from a registered query as an array.\n * @param queryKey - Runtime query key\n * @returns Array of items from the query collection result\n */\n toArray: async (queryKey: string) => {\n if (!queryKey) {\n return [];\n }\n\n try {\n const result = await this.queryService.fetch(queryKey, {\n skip: 0,\n take: 10_000,\n });\n const page = runtimeQueryCollectionData(result);\n return page?.items ?? [];\n } catch (error) {\n console.error(`Error loading query \"${queryKey}\":`, error);\n return [];\n }\n },\n });\n }\n}\n\n//#endregion\n","import { AXPopupModule } from '@acorex/components/popup';\nimport { AXNotificationModule } from '@acorex/components/notification';\nimport { AXToastModule } from '@acorex/components/toast';\nimport { AXFormatterRegistryService } from '@acorex/core/format';\nimport { AXDateTimeModule } from '@acorex/core/date-time';\nimport {\n AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,\n AXPComponentSlotModule,\n AXPModuleManifestModule,\n AXP_LOGO_IMAGE_SRC_RESOLVER,\n} from '@acorex-platform/framework-client/core';\n\nimport { provideCommandSetups } from '@acorex-platform/framework-client/runtime';\nimport { ErrorHandler, inject, Inject, Injector, ModuleWithProviders, NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\n\nimport { AXPBackgroundOperationSlotComponent } from './background-operation';\nimport { AXPBrowserTitleService } from './browser-title';\nimport {\n AXPCustomOperatorService,\n AXPCustomOperatorServiceImpl,\n AXPFilterOperatorMiddlewareService,\n AXPFilterOperatorMiddlewareServiceImpl,\n} from './data';\nimport { AXPErrorHandler, AXPErrorHandlerRegistryService, AXPGlobalErrorHandler } from './errors';\nimport { AXPTranslateFormatter } from './formatters';\nimport { AXPFileStorageEvaluatorScopeProvider } from './file-storage';\nimport { AXPLogoImageSrcResolverService } from './file-storage/logo-image-src-resolver.service';\nimport { AXPKeyboardShortcutsHelpService } from './keyboard-shortcuts';\nimport { AXPMenuSearchDefinitionProvider } from './layout';\nimport { AXPMenuSearchProvider } from './layout/menu/search.provider';\nimport { AXP_SEARCH_DEFINITION_PROVIDER, AXP_SEARCH_PROVIDER } from './search';\nimport { AXP_SETTING_DEFINITION_PROVIDER, AXPSettingsEvaluatorScopeProvider } from './settings';\nimport {\n AXP_SETTING_VALUE_PROVIDER,\n createIndexedDbSettingValueProviders,\n} from './settings/settings.provider';\nimport { AXPSettingsService } from './settings/settings.service';\nimport { AXP_SETTINGS_CACHE_SYNC } from './settings/settings-cache-sync.token';\nimport { AXPTokenEvaluatorScopeProvider } from './tokens';\nimport { AXPQueryParamsEvaluatorScopeProvider } from './utils/query-params-evaluator-scope.provider';\nimport { AXPQueryEvaluatorScopeProvider } from './utils/query-evaluator-scope.provider';\nimport { provideAXPUserNotificationService } from './user-notification';\n\nexport interface AXPCommonModuleConfigs {\n errorHandlers: (new () => AXPErrorHandler)[];\n}\n\n@NgModule({\n imports: [\n AXPComponentSlotModule.forChild({\n 'root-footer-end': [\n {\n name: 'background-operation',\n component: AXPBackgroundOperationSlotComponent,\n },\n ],\n }),\n AXPopupModule,\n AXDateTimeModule,\n AXToastModule,\n AXNotificationModule,\n AXPModuleManifestModule,\n RouterModule.forChild([]),\n ],\n exports: [RouterModule],\n providers: [\n provideAXPUserNotificationService(),\n {\n provide: ErrorHandler,\n useClass: AXPGlobalErrorHandler,\n },\n {\n provide: AXPCustomOperatorService,\n useClass: AXPCustomOperatorServiceImpl,\n },\n {\n provide: AXPFilterOperatorMiddlewareService,\n useClass: AXPFilterOperatorMiddlewareServiceImpl,\n },\n\n {\n provide: AXP_SEARCH_PROVIDER,\n useClass: AXPMenuSearchProvider,\n multi: true,\n },\n {\n provide: AXP_SEARCH_DEFINITION_PROVIDER,\n useClass: AXPMenuSearchDefinitionProvider,\n multi: true,\n },\n {\n provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,\n useClass: AXPTokenEvaluatorScopeProvider,\n multi: true,\n },\n {\n provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,\n useClass: AXPSettingsEvaluatorScopeProvider,\n multi: true,\n },\n {\n provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,\n useClass: AXPFileStorageEvaluatorScopeProvider,\n multi: true,\n },\n {\n provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,\n useClass: AXPQueryParamsEvaluatorScopeProvider,\n multi: true,\n },\n {\n provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,\n useClass: AXPQueryEvaluatorScopeProvider,\n multi: true,\n },\n {\n provide: AXP_SETTINGS_CACHE_SYNC,\n useExisting: AXPSettingsService,\n },\n {\n provide: AXP_LOGO_IMAGE_SRC_RESOLVER,\n useExisting: AXPLogoImageSrcResolverService,\n },\n {\n provide: AXP_SETTING_VALUE_PROVIDER,\n useFactory: createIndexedDbSettingValueProviders,\n deps: [Injector],\n },\n {\n provide: AXP_SETTING_DEFINITION_PROVIDER,\n useFactory: async () => {\n const injector = inject(Injector);\n const provider = (await import('./configs/common-settings.provider')).AXPCommonSettingProvider;\n return new provider(injector);\n },\n multi: true,\n },\n provideCommandSetups([\n {\n key: 'navigate',\n command: () => import('./commands/navigate.command').then((c) => c.AXPNavigateCommand),\n },\n ]),\n ],\n})\nexport class AXPCommonModule {\n static forRoot(configs?: AXPCommonModuleConfigs): ModuleWithProviders<AXPCommonModule> {\n return {\n ngModule: AXPCommonModule,\n providers: [\n ...(configs?.errorHandlers || []),\n {\n provide: 'AXPCommonModuleFactory',\n useFactory: (registry: AXPErrorHandlerRegistryService) => () => {\n registry.register(...(configs?.errorHandlers || []));\n },\n deps: [AXPErrorHandlerRegistryService],\n multi: true,\n },\n ],\n };\n }\n\n static forChild(configs?: AXPCommonModuleConfigs): ModuleWithProviders<AXPCommonModule> {\n return {\n ngModule: AXPCommonModule,\n providers: [\n ...(configs?.errorHandlers || []),\n {\n provide: 'AXPCommonModuleFactory',\n useFactory: (registry: AXPErrorHandlerRegistryService) => () => {\n registry.register(...(configs?.errorHandlers || []));\n },\n deps: [AXPErrorHandlerRegistryService],\n multi: true,\n },\n ],\n };\n }\n\n /**\n * @ignore\n */\n constructor(\n @Inject('AXPCommonModuleFactory') instances: any[],\n _keyboardShortcutsHelp: AXPKeyboardShortcutsHelpService,\n formatterRegistry: AXFormatterRegistryService,\n ) {\n formatterRegistry.register(AXPTranslateFormatter);\n instances.forEach((f) => {\n f();\n });\n }\n}\n","import { AXPCommonSettings } from './common-settings.key';\nimport type { AXPSettingsService } from '../settings/settings.service';\n\nexport interface AXPEntityCreateListBehaviorOptions {\n redirect?: boolean;\n}\n\nexport interface AXPEntityCreateListBehavior {\n shouldRedirect: boolean;\n shouldHighlight: boolean;\n}\n\n/**\n * Resolves post-create list behavior from user settings and optional action overrides.\n */\nexport async function resolveEntityCreateListBehavior(\n settingsService: AXPSettingsService,\n options?: AXPEntityCreateListBehaviorOptions,\n): Promise<AXPEntityCreateListBehavior> {\n const [redirectSetting, highlightSetting] = await Promise.all([\n settingsService.get<boolean>(AXPCommonSettings.RedirectToDetailsAfterCreate),\n settingsService.get<boolean>(AXPCommonSettings.HighlightAfterCreateInList),\n ]);\n\n const shouldRedirect =\n options?.redirect !== undefined ? options.redirect : redirectSetting !== false;\n const shouldHighlight = highlightSetting === true;\n\n return { shouldRedirect, shouldHighlight };\n}\n","import { InjectionToken } from \"@angular/core\";\n\nexport const AXP_ROOT_CONFIG_TOKEN = new InjectionToken<AXPRootConfigs>('AXP_ROOT_CONFIG_TOKEN');\n\nexport interface AXPRootConfigs {\n baseUrl: string;\n}","import { DOCUMENT } from '@angular/common';\nimport { inject } from '@angular/core';\n\n//#region ---- System file picker ----\n\nexport interface ChooseSystemFilesOptions {\n accept?: string;\n multiple?: boolean;\n}\n\n/**\n * Opens the native file picker and always settles — including when the user cancels.\n * `AXFileService.choose()` can hang on cancel because no `change` event fires.\n */\nexport function chooseSystemFiles(options: ChooseSystemFilesOptions = {}): Promise<File[]> {\n const document = inject(DOCUMENT);\n const accept = options.accept ?? '';\n const multiple = options.multiple ?? false;\n\n return new Promise((resolve) => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = accept;\n input.multiple = multiple;\n input.style.display = 'none';\n document.body.appendChild(input);\n\n let settled = false;\n\n const settle = (files: File[]) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve(files);\n };\n\n const cleanup = () => {\n input.removeEventListener('change', onChange);\n window.removeEventListener('focus', onWindowFocus);\n input.remove();\n };\n\n const onChange = () => {\n settle(Array.from(input.files ?? []));\n };\n\n const onWindowFocus = () => {\n // Allow `change` to fire first when the user confirms a selection.\n window.setTimeout(() => settle([]), 300);\n };\n\n input.addEventListener('change', onChange);\n window.addEventListener('focus', onWindowFocus, { once: true });\n input.click();\n });\n}\n\n//#endregion\n","import { InjectionToken } from '@angular/core';\nimport { AXCFileUploaderActionsPayload } from './file-actions.types';\n\n//#region ---- Provider Interface ----\n\n/**\n * Type for file action provider token (supports both direct and async providers).\n */\nexport type AXPFileActionProviderToken =\n | AXPFileActionProvider\n | Promise<AXPFileActionProvider>;\n\n/**\n * File action provider interface.\n * Providers can add actions to the file uploader widget.\n */\nexport interface AXPFileActionProvider {\n /**\n * Unique key identifying this provider.\n * Should match the webhook key for backward compatibility: 'file-uploader.actions'\n */\n key: string;\n\n /**\n * Execute the provider to add actions.\n * @param payload The payload containing capabilities and current actions.\n * @returns The modified payload with new actions added.\n */\n execute(payload: AXCFileUploaderActionsPayload): Promise<AXCFileUploaderActionsPayload> | AXCFileUploaderActionsPayload;\n\n /**\n * Priority for execution order (lower numbers execute first).\n * Defaults to 0 if not specified.\n */\n priority?: number;\n}\n\n//#endregion\n\n//#region ---- Injection Token ----\n\n/**\n * Multi-provider injection token for file action providers.\n * Modules can provide multiple implementations using this token.\n */\nexport const AXP_FILE_ACTION_PROVIDER = new InjectionToken<AXPFileActionProviderToken[]>(\n 'AXP_FILE_ACTION_PROVIDER',\n);\n\n//#endregion\n","import { inject, Injectable, Injector, runInInjectionContext } from '@angular/core';\nimport { AXPHookService } from '@acorex-platform/framework-client/core';\nimport { AXP_FILE_ACTION_PROVIDER, AXPFileActionProvider } from './file-actions.provider';\nimport { AXCFileUploaderAction, AXCFileUploaderActionsPayload } from './file-actions.types';\n\n//#region ---- Service ----\n\n/**\n * Service for managing file uploader actions.\n * Aggregates actions from multiple providers and filters them based on plugin configuration.\n * Wraps the hook system for backward compatibility.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPFileActionsService {\n //#region ---- Dependencies ----\n\n private readonly actionProviders = inject(AXP_FILE_ACTION_PROVIDER, { optional: true }) || [];\n private readonly hookService = inject(AXPHookService);\n private readonly injector = inject(Injector);\n\n //#endregion\n\n //#region ---- Public API ----\n\n /**\n * Get all actions from providers, filtered based on plugin configuration.\n * Wraps the hook system for backward compatibility.\n * @param payload Initial payload with capabilities and plugin configuration.\n * @returns Filtered list of actions.\n */\n async getActions(payload: AXCFileUploaderActionsPayload): Promise<AXCFileUploaderAction[]> {\n // First, run hook system for backward compatibility\n // Note: Hook system may still use old format with 'host', but we pass capabilities\n // Hook providers that need host will need to be migrated to use capabilities\n let hookPayload: any;\n try {\n hookPayload = await this.hookService.runAsync('file-uploader.actions', {\n ...payload,\n // For backward compatibility, hooks might expect 'host' but we're using capabilities\n // Old hook providers will need to be migrated\n });\n } catch (err) {\n // If hook fails, continue with new system\n console.warn('[AXPFileActionsService] Hook system failed, continuing with providers only', err);\n }\n\n // Merge hook actions into payload (if any)\n const mergedPayload: AXCFileUploaderActionsPayload = {\n ...payload,\n actions: hookPayload?.actions ?? payload.actions ?? [],\n };\n\n // Resolve all providers (handle both direct and Promise<provider>)\n const providers = await this.resolveProviders();\n\n // Filter providers by key\n const matchingProviders = providers\n .filter((p) => p.key === 'file-uploader.actions')\n .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));\n\n // Execute providers sequentially (waterfall pattern)\n let currentPayload = { ...mergedPayload, actions: [...mergedPayload.actions] };\n for (const provider of matchingProviders) {\n try {\n currentPayload = await Promise.resolve(\n runInInjectionContext(this.injector, () => provider.execute(currentPayload)),\n );\n } catch (err) {\n console.error(`[AXPFileActionsService] Provider '${provider.key}' failed`, err);\n }\n }\n\n // Filter actions based on plugin configuration\n return this.filterActions(currentPayload.actions, payload.plugins, payload.excludePlugins);\n }\n\n //#endregion\n\n //#region ---- Private Methods ----\n\n /**\n * Resolve all providers (handle both direct providers and Promise<provider>).\n */\n private async resolveProviders(): Promise<AXPFileActionProvider[]> {\n return Promise.all(\n this.actionProviders.map((p) => (p instanceof Promise ? p : Promise.resolve(p))),\n );\n }\n\n /**\n * Filter actions based on enabled plugins and exclude list.\n */\n private filterActions(\n actions: AXCFileUploaderAction[],\n enabledPlugins: { name: string; options?: unknown }[],\n excludePlugins: string[],\n ): AXCFileUploaderAction[] {\n const enabledPluginNames = enabledPlugins?.map((p) => p.name) ?? [];\n const excludedPluginNames = excludePlugins ?? [];\n\n return actions.filter((action) => {\n // Exclude if in exclude list\n if (excludedPluginNames.includes(action.plugin)) {\n return false;\n }\n\n // Include if global\n if (action.global === true) {\n return true;\n }\n\n // Include if plugin is explicitly enabled\n if (enabledPluginNames.length > 0 && enabledPluginNames.includes(action.plugin)) {\n return true;\n }\n\n // If no plugins are enabled, only show global actions\n if (enabledPluginNames.length === 0) {\n return !!action.global;\n }\n\n return false;\n });\n }\n\n //#endregion\n}\n\n//#endregion\n","import { AXPFileListItem } from '@acorex-platform/framework-shared/core';\n\n//#region ---- File Uploader Capabilities ----\n\n/**\n * Capabilities API provided to file action providers.\n * These methods allow actions to interact with the file uploader widget.\n */\nexport interface AXCFileUploaderCapabilities {\n /**\n * Get all current files in the uploader.\n */\n getFiles: () => AXPFileListItem[];\n\n /**\n * Replace all files in the uploader.\n */\n setFiles: (files: AXPFileListItem[]) => void;\n\n /**\n * Add new files to the uploader.\n */\n addFiles: (files: AXPFileListItem[]) => void;\n\n /**\n * Update files matching a predicate.\n */\n updateFile: (\n predicate: (f: AXPFileListItem) => boolean,\n updater: (f: AXPFileListItem) => AXPFileListItem,\n ) => void;\n\n /**\n * Remove a file from the uploader.\n */\n removeFile: (file: AXPFileListItem) => void;\n\n /**\n * Clear all files from the uploader.\n */\n clear: () => void;\n\n /**\n * Get a file by its ID.\n */\n getFileById: (id: string) => AXPFileListItem | undefined;\n\n /**\n * Update a file by its ID.\n */\n updateFileById: (id: string, next: Partial<AXPFileListItem>) => void;\n}\n\n//#endregion\n\n//#region ---- File Uploader Action ----\n\n/**\n * A file uploader action that can be added by providers.\n */\nexport interface AXCFileUploaderAction {\n /**\n * Unique identifier for the action/plugin.\n */\n plugin: string;\n\n /**\n * Whether this action is global (available even if plugin is not explicitly enabled).\n */\n global?: boolean;\n\n /**\n * Display text for the action (optional if textKey is provided).\n */\n text?: string;\n\n /**\n * Translation key for the action text (optional if text is provided).\n */\n textKey?: string;\n\n /**\n * Icon class for the action (e.g., 'fa-light fa-file-arrow-up').\n */\n icon?: string;\n\n /**\n * Action execution handler.\n * Receives capabilities to interact with the file uploader.\n * @param capabilities The capabilities API for file operations.\n */\n run: (capabilities: AXCFileUploaderCapabilities) => void | Promise<void>;\n}\n\n//#endregion\n\n//#region ---- File Uploader Actions Payload ----\n\n/**\n * Payload passed to file action providers.\n */\nexport interface AXCFileUploaderActionsPayload {\n /**\n * Enabled plugins configuration.\n */\n plugins: { name: string; options?: unknown }[];\n\n /**\n * List of plugin names to exclude.\n */\n excludePlugins: string[];\n\n /**\n * Capabilities API for interacting with the file uploader.\n */\n capabilities: AXCFileUploaderCapabilities;\n\n /**\n * Current list of actions (providers can add to this array).\n */\n actions: AXCFileUploaderAction[];\n\n /**\n * Widget options (optional, for accessing widget-specific settings).\n */\n options?: {\n /**\n * Whether multiple files are allowed.\n */\n multiple?: boolean;\n\n /**\n * Accepted file types (e.g., '.jpg,.png' or 'image/*').\n */\n accept?: string;\n };\n}\n\n//#endregion\n","import { AXPDataGenerator } from '@acorex-platform/framework-client/core';\nimport { AXPFileListItem } from '@acorex-platform/framework-shared/core';\n\nimport { chooseSystemFiles } from './choose-system-files.util';\nimport { AXPFileActionProvider } from './file-actions.provider';\nimport { AXCFileUploaderActionsPayload, AXCFileUploaderCapabilities } from './file-actions.types';\n\nexport const UploadFromComputerActionProvider: AXPFileActionProvider = {\n key: 'file-uploader.actions',\n priority: 1, // Higher priority than upload-from-drive to show first\n execute: (payload: AXCFileUploaderActionsPayload): AXCFileUploaderActionsPayload => {\n // Capture widget options for use in the action\n const widgetOptions = payload.options;\n\n payload.actions = [\n ...payload.actions,\n {\n plugin: 'upload-from-computer',\n global: true,\n textKey: '@document-management:actions.upload-from-device',\n icon: 'fa-light fa-file-arrow-up',\n run: async (capabilities: AXCFileUploaderCapabilities) => {\n // Open file picker with widget options\n const files = await chooseSystemFiles({\n multiple: widgetOptions?.multiple ?? true,\n accept: widgetOptions?.accept,\n });\n\n // If no files are selected, return\n if (files.length === 0) {\n return;\n }\n\n // Create file list items from selected files\n const fileItems = files.map(\n (file) =>\n ({\n id: AXPDataGenerator.uuid(),\n name: file.name,\n size: file.size,\n status: 'attached',\n source: {\n kind: 'blob',\n value: file,\n },\n }) as AXPFileListItem,\n );\n\n // Add files using capabilities\n capabilities.addFiles(fileItems);\n },\n },\n ];\n\n return payload;\n },\n};\n","import { inject, Injectable, InjectionToken } from '@angular/core';\nimport { AXPFileType } from './file-type.types';\n\nexport interface AXPFileTypeInfoProvider {\n items(purpose?: string | string[]): Promise<AXPFileType[]>;\n}\n\nexport const AXP_FILE_TYPE_INFO_PROVIDER = new InjectionToken<AXPFileTypeInfoProvider[]>('AXP_FILE_TYPE_INFO_PROVIDER');\n\n@Injectable({ providedIn: 'root' })\nexport class AXPFileTypeProviderService implements AXPFileTypeInfoProvider {\n private providers = inject(AXP_FILE_TYPE_INFO_PROVIDER, { optional: true });\n\n async items(purpose?: string | string[]): Promise<AXPFileType[]> {\n const items: AXPFileType[] = [];\n\n if (Array.isArray(this.providers)) {\n for (const provider of this.providers) {\n items.push(...(await provider.items(purpose)));\n }\n }\n return items;\n }\n\n async get(name: string, purpose?: string | string[]): Promise<AXPFileType | undefined> {\n return (await this.items(purpose)).find((c) => c.name == name);\n }\n}\n","/** Default catalog purposes for document-management (excludes conversation). */\nexport const AXP_DOCUMENT_FILE_TYPE_PURPOSES = ['system', 'document'] as const;\n\nexport function normalizeDocumentFileTypePurposes(purpose?: string | string[]): string[] {\n if (!purpose) {\n return [...AXP_DOCUMENT_FILE_TYPE_PURPOSES];\n }\n return Array.isArray(purpose) ? purpose : [purpose];\n}\n\nexport {\n AX_FILE_TYPE_METADATA_PURPOSE,\n filterFileTypesByPurpose,\n getFileTypePurposes,\n} from '@acorex/core/file';\n","import { getFileExtension } from '@acorex/core/file';\nimport type { AXPFileListItem } from '@acorex-platform/framework-shared/core';\n\nimport { AXPFileType } from './file-type.types';\n\n//#region ---- File type display (catalog-backed icons) ----\n\nexport interface AXPFileTypeDisplayInfo {\n /** Font Awesome classes from the catalog (extension or parent file type). */\n icon: string;\n /** Logical catalog type name (e.g. `video`, `audio`, `file`, `document`). */\n typeName: string;\n /** Lowercase extension without a leading dot; empty when unknown. */\n extension: string;\n}\n\nconst DEFAULT_ICON = 'fa-solid fa-file';\nconst DEFAULT_TYPE_NAME = 'file';\n\n/**\n * Picks the best file name for extension-based icon lookup in the explorer.\n * Document display names may omit the extension while `fileId.name` retains it.\n */\nexport function resolveExplorerFileDisplayName(\n nodeName: string,\n fileId?: AXPFileListItem | string,\n): string {\n if (nodeName.includes('.')) {\n return nodeName;\n }\n\n if (fileId != null && typeof fileId === 'object' && fileId.name?.includes('.')) {\n return fileId.name;\n }\n\n return nodeName;\n}\n\n/**\n * Resolves explorer / list icon and logical file type from the ACoreX file-type catalog.\n * Matches the file name extension against each catalog entry's `extensions`, then falls back\n * to the parent type icon (`video`, `audio`, `file`, …).\n */\nexport function resolveFileTypeDisplay(fileName: string, catalog: AXPFileType[]): AXPFileTypeDisplayInfo {\n const extension = (getFileExtension(fileName) ?? '').toLowerCase();\n\n if (!extension || catalog.length === 0) {\n return { icon: DEFAULT_ICON, typeName: DEFAULT_TYPE_NAME, extension };\n }\n\n for (const type of catalog) {\n const match = (type.extensions ?? []).find((ext) => ext.name?.toLowerCase() === extension);\n if (match) {\n return {\n icon: match.icon || type.icon || DEFAULT_ICON,\n typeName: type.name,\n extension,\n };\n }\n }\n\n return { icon: DEFAULT_ICON, typeName: DEFAULT_TYPE_NAME, extension };\n}\n\n//#endregion\n","import { AXFileService, getFileExtension, resolveFileTypeExtension, resolveFileTypeOpen, runFileTypeOpen, type AXFileTypeExtensionHint, type AXFileTypeOpenContext } from '@acorex/core/file';\nimport { Injector } from '@angular/core';\n\nimport { resolveFileTypeDisplay } from './file-type-display.util';\nimport { AXPFileType } from './file-type.types';\n\nexport const AX_FILE_TYPE_METADATA_SUPPORT_BY_FILE_VIEWER = 'showInViewer';\n\n/**\n * Whether a catalog file type should appear in the file viewer.\n * Missing metadata defaults to `true` (shown).\n */\nexport function isFileTypeShownInViewer(\n fileType: Pick<AXPFileType, 'metadata'> | null | undefined,\n): boolean {\n return fileType?.metadata?.[AX_FILE_TYPE_METADATA_SUPPORT_BY_FILE_VIEWER] !== false;\n}\n\n/**\n * Resolves the catalog type for `fileName` and returns whether it should appear in the file viewer.\n * Unmatched / unknown types default to shown (`true`).\n */\nexport function isFileNameShownInViewer(fileName: string, catalog: AXPFileType[]): boolean {\n const { typeName } = resolveFileTypeDisplay(fileName, catalog);\n const fileType = catalog.find((type) => type.name === typeName);\n return isFileTypeShownInViewer(fileType);\n}\n\n//#region ---- File type open (catalog → AX registry) ----\n\nexport function createFileTypeOpenContext(injector: Injector, platformId: object): AXFileTypeOpenContext {\n return {\n injector,\n platformId,\n readAsDataUrl: (file) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = () => reject(reader.error);\n reader.readAsDataURL(file);\n }),\n };\n}\n\nfunction buildFileTypeExtensionHint(fileName: string, payload?: unknown): AXFileTypeExtensionHint {\n if (payload instanceof File) {\n return {\n file: payload,\n extensionName: getFileExtension(payload.name) || getFileExtension(fileName) || undefined,\n };\n }\n\n const extensionName = getFileExtension(fileName) || undefined;\n if (!payload || typeof payload !== 'object') {\n return { extensionName };\n }\n\n const record = payload as Record<string, unknown>;\n const itemName = typeof record['name'] === 'string' ? record['name'] : fileName;\n const resolvedExtension = getFileExtension(itemName) || extensionName;\n\n const source = record['source'] as { kind?: string; value?: unknown } | undefined;\n if (source?.kind === 'blob' && source.value instanceof Blob) {\n return {\n extensionName: resolvedExtension,\n mimeType: source.value.type || undefined,\n };\n }\n\n return { extensionName: resolvedExtension };\n}\n\n/**\n * Returns whether the catalog-resolved file type has an `open` handler on the matched\n * extension or its parent type (extension-first, per {@link resolveFileTypeOpen}).\n */\nexport async function hasFileTypeOpenHandler(options: { fileName: string; catalog: AXPFileType[]; fileService: AXFileService; payload?: unknown }): Promise<boolean> {\n const display = resolveFileTypeDisplay(options.fileName, options.catalog);\n const fileType = await options.fileService.getFileType(display.typeName);\n if (!fileType) {\n return false;\n }\n\n const extension = resolveFileTypeExtension(fileType, buildFileTypeExtensionHint(options.fileName, options.payload));\n\n return typeof resolveFileTypeOpen(fileType, extension) === 'function';\n}\n\n/**\n * Resolves extension → parent `open` and runs it when present.\n * Returns `true` when a handler ran; `false` when none exists (caller should download).\n */\nexport async function tryOpenFileByCatalogType(options: { fileName: string; catalog: AXPFileType[]; fileService: AXFileService; openContext: AXFileTypeOpenContext; payload: unknown }): Promise<boolean> {\n const display = resolveFileTypeDisplay(options.fileName, options.catalog);\n const fileType = await options.fileService.getFileType(display.typeName);\n if (!fileType) {\n return false;\n }\n\n const extension = resolveFileTypeExtension(fileType, buildFileTypeExtensionHint(options.fileName, options.payload));\n\n if (!resolveFileTypeOpen(fileType, extension)) {\n return false;\n }\n\n const result = await runFileTypeOpen(fileType, options.openContext, options.payload, extension);\n return result !== false;\n}\n\n//#endregion\n","import { inject, Injectable } from '@angular/core';\nimport {\n AX_FILE_TYPE_METADATA_PURPOSE,\n AXFileTypeRegistryService,\n getFileTypePurposes,\n type AXFileType,\n} from '@acorex/core/file';\n\nimport { normalizeDocumentFileTypePurposes } from './file-type-purpose.util';\nimport { AXPFileExtension, AXPFileType } from './file-type.types';\nimport { AXPFileTypeInfoProvider } from './file-type.provider';\n\n//#region ---- ACoreX file type bridge ----\n\nfunction mapExtension(ext: NonNullable<AXFileType['extensions']>[number]): AXPFileExtension {\n return {\n name: ext.name,\n title: ext.title ?? ext.name,\n icon: ext.icon,\n };\n}\n\nfunction mapFileType(type: AXFileType): AXPFileType {\n return {\n name: type.name,\n title: type.title ?? type.name,\n icon: type.icon,\n metadata: type.metadata ?? { [AX_FILE_TYPE_METADATA_PURPOSE]: getFileTypePurposes(type) },\n extensions: (type.extensions ?? []).map(mapExtension),\n };\n}\n\n/**\n * Bridges {@link AXFileTypeRegistryService} into the platform {@link AXPFileTypeInfoProvider} token.\n * Excludes conversation-purpose types by default.\n */\n@Injectable()\nexport class AXPAcorexFileTypeBridgeProvider implements AXPFileTypeInfoProvider {\n private readonly registry = inject(AXFileTypeRegistryService);\n\n async items(purpose?: string | string[]): Promise<AXPFileType[]> {\n const types = await this.registry.getTypes({\n purpose: normalizeDocumentFileTypePurposes(purpose),\n });\n return types.map(mapFileType);\n }\n}\n\n//#endregion\n","import { AXFileModule } from '@acorex/core/file';\nimport { NgModule } from '@angular/core';\n\nimport { AXP_FILE_TYPE_INFO_PROVIDER } from './file-type.provider';\nimport { AXPAcorexFileTypeBridgeProvider } from './acorex-file-type.bridge';\n\n//#region ---- ACoreX file type module ----\n\n/**\n * Registers ACoreX built-in file types (image, video, audio, file, document) and exposes them\n * through the platform {@link AXP_FILE_TYPE_INFO_PROVIDER} token.\n */\n@NgModule({\n imports: [AXFileModule.forRoot()],\n providers: [\n {\n provide: AXP_FILE_TYPE_INFO_PROVIDER,\n useClass: AXPAcorexFileTypeBridgeProvider,\n multi: true,\n },\n ],\n})\nexport class AXPAcorexFileTypeModule {}\n\n//#endregion\n","import { InjectionToken } from '@angular/core';\nimport type { AXPIntegrationProviderContext } from './integration-provider.context';\n\n//#region ---- Integration provider interface ----\n\nexport interface AXPIntegrationProvider {\n provide(context: AXPIntegrationProviderContext): Promise<void>;\n}\n\nexport const AXP_INTEGRATION_PROVIDER = new InjectionToken<AXPIntegrationProvider[]>(\n 'AXP_INTEGRATION_PROVIDER',\n {\n providedIn: 'root',\n factory: () => [],\n },\n);\n\n//#endregion\n\n//#region ---- Integration runtime provider (lazy hooks) ----\n\nexport interface AXPIntegrationRuntimeProvider {\n readonly providerId: string;\n getHooks(): Promise<import('@acorex-platform/framework-shared/core').AXPIntegrationProviderRuntimeHooks>;\n}\n\nexport const AXP_INTEGRATION_RUNTIME_PROVIDER = new InjectionToken<AXPIntegrationRuntimeProvider[]>(\n 'AXP_INTEGRATION_RUNTIME_PROVIDER',\n {\n providedIn: 'root',\n factory: () => [],\n },\n);\n\n//#endregion\n","import { InjectionToken } from '@angular/core';\nimport type { AXPIntegrationDomainProviderContext } from './integration-domain-provider.context';\n\n//#region ---- Integration domain provider interface ----\n\nexport interface AXPIntegrationDomainProvider {\n provide(context: AXPIntegrationDomainProviderContext): Promise<void>;\n}\n\nexport const AXP_INTEGRATION_DOMAIN_PROVIDER = new InjectionToken<AXPIntegrationDomainProvider[]>(\n 'AXP_INTEGRATION_DOMAIN_PROVIDER',\n {\n providedIn: 'root',\n factory: () => [],\n },\n);\n\n//#endregion\n","import type { AXPIntegrationDomainDefinition } from '@acorex-platform/framework-shared/core';\n\n//#region ---- Integration domain context ----\n\nexport class AXPIntegrationDomainProviderContext {\n private readonly definitions = new Map<string, AXPIntegrationDomainDefinition>();\n\n register(definition: AXPIntegrationDomainDefinition): void {\n // Idempotent: multiple extensions (e.g. Telegram + WhatsApp) may register the same domain.\n if (this.definitions.has(definition.id)) {\n return;\n }\n this.definitions.set(definition.id, definition);\n }\n\n getDefinitions(): ReadonlyMap<string, AXPIntegrationDomainDefinition> {\n return this.definitions;\n }\n}\n\n//#endregion\n","import type { AXPIntegrationProviderDefinition } from '@acorex-platform/framework-shared/core';\n\n//#region ---- Integration provider context ----\n\nexport class AXPIntegrationProviderContext {\n //#region ---- State ----\n\n private readonly definitions = new Map<string, AXPIntegrationProviderDefinition>();\n\n //#endregion\n\n //#region ---- Builder API ----\n\n /**\n * Registers a provider definition. Throws when duplicate ids are registered.\n */\n register(definition: AXPIntegrationProviderDefinition): void {\n if (this.definitions.has(definition.id)) {\n throw new Error(\n `[AXPIntegrationProviderContext] Duplicate integration provider id '${definition.id}'.`,\n );\n }\n this.definitions.set(definition.id, definition);\n }\n\n //#endregion\n\n //#region ---- Accessors ----\n\n getDefinitions(): ReadonlyMap<string, AXPIntegrationProviderDefinition> {\n return this.definitions;\n }\n\n //#endregion\n}\n\n//#endregion\n","import type {\n AXPIntegrationCapability,\n AXPIntegrationDomainDefinition,\n AXPIntegrationProviderDefinition,\n AXPIntegrationProviderDefinitionResolved,\n} from '@acorex-platform/framework-shared/core';\nimport { inject, Injectable } from '@angular/core';\nimport { defaultTo, uniq } from 'lodash-es';\n\nimport { AXPIntegrationDomainProviderContext } from './integration-domain-provider.context';\nimport {\n AXP_INTEGRATION_DOMAIN_PROVIDER,\n type AXPIntegrationDomainProvider,\n} from './integration-domain.provider';\nimport { AXPIntegrationProviderContext } from './integration-provider.context';\nimport { AXP_INTEGRATION_PROVIDER, type AXPIntegrationProvider } from './integration.provider';\n\n//#region ---- Integration domain registry ----\n\n@Injectable({ providedIn: 'root' })\nexport class AXPIntegrationDomainRegistryService {\n private readonly domainProviders = inject(AXP_INTEGRATION_DOMAIN_PROVIDER, { optional: true });\n private readonly integrationProviders = inject(AXP_INTEGRATION_PROVIDER, { optional: true });\n\n private domainCache: Map<string, AXPIntegrationDomainDefinition> | null = null;\n private providerCache: Map<string, AXPIntegrationProviderDefinitionResolved> | null = null;\n\n async listDomains(): Promise<AXPIntegrationDomainDefinition[]> {\n const map = await this.loadDomains();\n return Array.from(map.values()).sort(\n (a, b) => defaultTo(a.sortOrder, 100) - defaultTo(b.sortOrder, 100),\n );\n }\n\n async getDomain(id: string): Promise<AXPIntegrationDomainDefinition | null> {\n const map = await this.loadDomains();\n return map.get(id) ?? null;\n }\n\n async getDomainOrThrow(id: string): Promise<AXPIntegrationDomainDefinition> {\n const domain = await this.getDomain(id);\n if (!domain) {\n throw new Error(`[AXPIntegrationDomainRegistry] Unknown integration domain '${id}'.`);\n }\n return domain;\n }\n\n async listProviders(): Promise<AXPIntegrationProviderDefinitionResolved[]> {\n const map = await this.loadProviders();\n return Array.from(map.values());\n }\n\n async listProvidersByDomain(domainId: string): Promise<AXPIntegrationProviderDefinitionResolved[]> {\n const providers = await this.listProviders();\n return providers.filter((provider) => provider.domainId === domainId);\n }\n\n async getProvider(id: string): Promise<AXPIntegrationProviderDefinitionResolved | null> {\n const map = await this.loadProviders();\n return map.get(id) ?? null;\n }\n\n async getProviderOrThrow(id: string): Promise<AXPIntegrationProviderDefinitionResolved> {\n const provider = await this.getProvider(id);\n if (!provider) {\n throw new Error(`[AXPIntegrationDomainRegistry] Unknown integration provider '${id}'.`);\n }\n return provider;\n }\n\n clearCache(): void {\n this.domainCache = null;\n this.providerCache = null;\n }\n\n private normalizeProviders<T>(providers: T | T[] | null | undefined): T[] {\n if (!providers) {\n return [];\n }\n return Array.isArray(providers) ? providers : [providers];\n }\n\n private async loadDomains(): Promise<Map<string, AXPIntegrationDomainDefinition>> {\n if (this.domainCache) {\n return this.domainCache;\n }\n\n const context = new AXPIntegrationDomainProviderContext();\n for (const provider of this.normalizeProviders(this.domainProviders)) {\n const resolved: AXPIntegrationDomainProvider =\n provider instanceof Promise ? await provider : provider;\n await resolved.provide(context);\n }\n\n this.domainCache = new Map(context.getDefinitions());\n return this.domainCache;\n }\n\n private async loadProviders(): Promise<Map<string, AXPIntegrationProviderDefinitionResolved>> {\n if (this.providerCache) {\n return this.providerCache;\n }\n\n const domains = await this.loadDomains();\n const context = new AXPIntegrationProviderContext();\n\n for (const provider of this.normalizeProviders(this.integrationProviders)) {\n const resolved: AXPIntegrationProvider =\n provider instanceof Promise ? await provider : provider;\n await resolved.provide(context);\n }\n\n const resolvedProviders = new Map<string, AXPIntegrationProviderDefinitionResolved>();\n for (const definition of context.getDefinitions().values()) {\n resolvedProviders.set(definition.id, this.resolveProviderDefinition(definition, domains));\n }\n\n this.providerCache = resolvedProviders;\n return this.providerCache;\n }\n\n private resolveProviderDefinition(\n definition: AXPIntegrationProviderDefinition,\n domains: Map<string, AXPIntegrationDomainDefinition>,\n ): AXPIntegrationProviderDefinitionResolved {\n const domain = domains.get(definition.domainId);\n if (!domain) {\n throw new Error(\n `[AXPIntegrationDomainRegistry] Provider '${definition.id}' references unknown domain '${definition.domainId}'.`,\n );\n }\n\n const domainCapabilities = defaultTo(domain.capabilities, []);\n const providerCapabilities = defaultTo(definition.capabilities, []);\n\n return {\n ...definition,\n category: domain.category,\n capabilities: uniq([...domainCapabilities, ...providerCapabilities]) as AXPIntegrationCapability[],\n };\n }\n}\n\n//#endregion\n","import type {\n AXPIntegrationDomainDefinition,\n AXPIntegrationProviderDefinitionResolved,\n} from '@acorex-platform/framework-shared/core';\nimport { inject, Injectable } from '@angular/core';\n\nimport { AXPIntegrationDomainRegistryService } from './integration-domain.registry.service';\n\n//#region ---- Integration provider registry ----\n\n/** @deprecated Use {@link AXPIntegrationDomainRegistryService} for domain-aware provider access. */\n@Injectable({ providedIn: 'root' })\nexport class AXPIntegrationProviderRegistryService {\n private readonly domainRegistry = inject(AXPIntegrationDomainRegistryService);\n\n async list(): Promise<AXPIntegrationProviderDefinitionResolved[]> {\n return this.domainRegistry.listProviders();\n }\n\n async get(id: string): Promise<AXPIntegrationProviderDefinitionResolved | null> {\n return this.domainRegistry.getProvider(id);\n }\n\n async getOrThrow(id: string): Promise<AXPIntegrationProviderDefinitionResolved> {\n return this.domainRegistry.getProviderOrThrow(id);\n }\n\n clearCache(): void {\n this.domainRegistry.clearCache();\n }\n}\n\n/** Convenience alias for domain listing. */\n@Injectable({ providedIn: 'root' })\nexport class AXPIntegrationDomainRegistryFacade {\n private readonly domainRegistry = inject(AXPIntegrationDomainRegistryService);\n\n listDomains(): Promise<AXPIntegrationDomainDefinition[]> {\n return this.domainRegistry.listDomains();\n }\n\n listProvidersByDomain(domainId: string): Promise<AXPIntegrationProviderDefinitionResolved[]> {\n return this.domainRegistry.listProvidersByDomain(domainId);\n }\n}\n\n//#endregion\n","import type { AXPIntegrationAuthContext, AXPIntegrationProviderDefinition, AXPIntegrationResolvedCredentials, AXPIntegrationRuntimeContext, AXPIntegrationSecretPayload } from '@acorex-platform/framework-shared/core';\nimport { InjectionToken } from '@angular/core';\n\n//#region ---- Secret store token ----\n\nexport interface AXPIntegrationSecretRefInput {\n providerId: string;\n connectionId: string;\n tenantId: string;\n userId: string;\n authMethodType: string;\n}\n\nexport interface AXPIntegrationSecretStore {\n store(ref: AXPIntegrationSecretRefInput, payload: AXPIntegrationSecretPayload): Promise<string>;\n rotate(\n secretRef: string,\n context: AXPIntegrationAuthContext,\n payload: Partial<AXPIntegrationSecretPayload>,\n ): Promise<void>;\n resolve(secretRef: string, context: AXPIntegrationAuthContext): Promise<AXPIntegrationResolvedCredentials>;\n revoke(secretRef: string, context: AXPIntegrationAuthContext): Promise<void>;\n delete(secretRef: string, context: AXPIntegrationAuthContext): Promise<void>;\n}\n\nexport const AXP_INTEGRATION_SECRET_STORE = new InjectionToken<AXPIntegrationSecretStore>(\n 'AXP_INTEGRATION_SECRET_STORE',\n);\n\n//#endregion\n\n//#region ---- Runtime service token ----\n\nexport interface AXPIntegrationWithClientOptions {\n providerId: string;\n connectionScope?: 'user' | 'tenant';\n connectionKey?: string;\n requiredCapabilities?: string[];\n requiredScopes?: string[];\n}\n\nexport abstract class AXPIntegrationRuntimeService {\n abstract getProvider(id: string): Promise<AXPIntegrationProviderDefinition>;\n abstract listProviders(): Promise<AXPIntegrationProviderDefinition[]>;\n abstract getConnection(\n options: AXPIntegrationWithClientOptions,\n ): Promise<import('@acorex-platform/framework-shared/core').AXPSafeIntegrationConnectionDto>;\n abstract withClient<T>(\n options: AXPIntegrationWithClientOptions,\n fn: (client: unknown, ctx: AXPIntegrationRuntimeContext) => Promise<T>,\n ): Promise<T>;\n abstract buildRuntimeContext(\n connection: import('@acorex-platform/framework-shared/core').AXPSafeIntegrationConnectionDto & { secretRef: string },\n ): Promise<AXPIntegrationRuntimeContext>;\n}\n\nexport interface AXPIntegrationOAuthStartInput {\n providerId: string;\n connectionScope: 'user' | 'tenant';\n connectionKey: string;\n displayName: string;\n redirectUri: string;\n tenantId: string;\n userId: string;\n scopes?: string[];\n}\n\nexport interface AXPIntegrationOAuthCompleteInput {\n providerId: string;\n state: string;\n code: string;\n}\n\nexport abstract class AXPIntegrationOAuthService {\n abstract startAuthorization(\n input: AXPIntegrationOAuthStartInput,\n ): Promise<{ redirectUrl: string; state: string }>;\n abstract completeCallback(input: AXPIntegrationOAuthCompleteInput): Promise<{ connectionId: string }>;\n}\n\nexport const AXP_INTEGRATION_OAUTH_SERVICE = new InjectionToken<AXPIntegrationOAuthService>(\n 'AXP_INTEGRATION_OAUTH_SERVICE',\n);\n\n//#endregion\n","import type { AXPSafeIntegrationConnectionDto } from '@acorex-platform/framework-shared/core';\nimport { InjectionToken } from '@angular/core';\n\n//#region ---- Connection established handler ----\n\n/**\n * Optional hook invoked after a connection is successfully established (OAuth callback or credentials connect).\n * Use to link provider-specific records (e.g. Jira/GitLab instance ↔ integration connection).\n */\nexport interface AXPIntegrationConnectionEstablishedHandler {\n readonly providerId: string;\n onEstablished(connection: AXPSafeIntegrationConnectionDto): Promise<void>;\n}\n\nexport const AXP_INTEGRATION_CONNECTION_ESTABLISHED = new InjectionToken<\n AXPIntegrationConnectionEstablishedHandler[]\n>('AXP_INTEGRATION_CONNECTION_ESTABLISHED', {\n providedIn: 'root',\n factory: () => [],\n});\n\n//#endregion\n","import type { AXPSafeIntegrationConnectionDto } from '@acorex-platform/framework-shared/core';\nimport { InjectionToken } from '@angular/core';\n\n//#region ---- Connection lifecycle handler ----\n\n/**\n * Optional hooks for connection disconnect / delete / enable toggles.\n * Providers (e.g. Simpro) use these to manage schedules and background jobs.\n */\nexport interface AXPIntegrationConnectionLifecycleHandler {\n readonly providerId: string;\n onDisconnected?(connection: AXPSafeIntegrationConnectionDto): Promise<void>;\n onDeleted?(connection: AXPSafeIntegrationConnectionDto): Promise<void>;\n onEnabledChanged?(connection: AXPSafeIntegrationConnectionDto, enabled: boolean): Promise<void>;\n}\n\nexport const AXP_INTEGRATION_CONNECTION_LIFECYCLE = new InjectionToken<\n AXPIntegrationConnectionLifecycleHandler[]\n>('AXP_INTEGRATION_CONNECTION_LIFECYCLE', {\n providedIn: 'root',\n factory: () => [],\n});\n\n//#endregion\n","//#region ---- Integration barrel ----\n\nexport * from './integration.provider';\nexport * from './integration-domain.provider';\nexport * from './integration-domain-provider.context';\nexport * from './integration-domain.registry.service';\nexport * from './integration-provider.context';\nexport * from './integration-provider.registry.service';\nexport * from './integration-secret-store.token';\nexport * from './integration-connection-established.token';\nexport * from './integration-connection-lifecycle.token';\n\n//#endregion\n","//#region ----- Types -----\n\n/** Online local strategies (offline modes are out of scope for this phase). */\nexport type AXPLocalEntityMode = 'cache' | 'local-first';\n\n/** How this entity participates in the local-data graph. */\nexport type AXPLocalEntityRole = 'entity' | 'catalog' | 'lookup-target';\n\n/** How a host entity prefetches a related / lookup target into local stores. */\nexport type AXPLocalRelatedStrategy = 'referenced-ids' | 'catalog';\n\nexport interface AXPLocalEntityRelatedOption {\n /** Host field holding the FK (e.g. `assigneeId`). */\n field: string;\n /** Target entity key (`Module.Entity`). */\n entity: string;\n strategy: AXPLocalRelatedStrategy;\n}\n\n/**\n * Policy for one entity's local store.\n * Declared via `plugins: [{ name: 'client-local', options }]`.\n */\nexport interface AXPLocalEntityPolicy {\n mode: AXPLocalEntityMode;\n /** Cap for the hot subset kept in IndexedDB. */\n maxItems: number;\n role?: AXPLocalEntityRole;\n /**\n * Field used for recency prune / default hot-list sort.\n * Falls back to `updatedAt`, then `createdAt`, then stable id.\n */\n sortField?: string;\n /** Optional related prefetch graph (depth 1). Prefetch wiring is incremental. */\n related?: AXPLocalEntityRelatedOption[];\n}\n\n/** Runtime registration key: `Module.Entity`. */\nexport type AXPLocalEntityKey = string;\n\nexport interface AXPLocalEntityStoreMeta {\n id: string;\n entityKey: string;\n userKey: string;\n lastSyncedAt: string | null;\n}\n\n/** Row persisted in IndexedDB (payload is JSON-serializable entity data). */\nexport interface AXPLocalEntityStoredItem {\n /** `${entityKey}|${userKey}|${id}` */\n storageId: string;\n entityKey: string;\n userKey: string;\n id: string;\n /** Epoch ms used for prune / sort. */\n sortAt: number;\n payload: Record<string, unknown>;\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport Dexie, { type Table } from 'dexie';\nimport type { AXPLocalEntityStoreMeta, AXPLocalEntityStoredItem } from './local-entity.types';\n\n//#endregion\n\n//#region ----- Constants -----\n\nexport const AXP_LOCAL_ENTITY_DEFAULT_MAX_ITEMS = 100;\nexport const AXP_LOCAL_ENTITY_BROADCAST_CHANNEL = 'axp-local-entity';\n\n//#endregion\n\n//#region ----- Dexie DB -----\n\nexport class AXPLocalEntityIndexedDb extends Dexie {\n items!: Table<AXPLocalEntityStoredItem, string>;\n meta!: Table<AXPLocalEntityStoreMeta, string>;\n\n constructor() {\n super('ACoreXLocalEntity');\n this.version(1).stores({\n items: 'storageId, entityKey, userKey, [entityKey+userKey], sortAt',\n meta: 'id, entityKey, userKey, [entityKey+userKey]',\n });\n }\n}\n\nexport const axpLocalEntityIndexedDb = new AXPLocalEntityIndexedDb();\n\nexport function buildLocalEntityStorageId(entityKey: string, userKey: string, id: string): string {\n return `${entityKey}|${userKey}|${id}`;\n}\n\nexport function buildLocalEntityMetaId(entityKey: string, userKey: string): string {\n return `${entityKey}|${userKey}`;\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport type { AXPQueryRequest } from '@acorex-platform/framework-shared/core';\nimport type { AXPLocalEntityPolicy } from './local-entity.types';\n\n//#endregion\n\n//#region ----- Record helpers -----\n\nexport function axpLocalEntityRecordId(record: unknown): string | null {\n if (record == null || typeof record !== 'object') {\n return null;\n }\n const id = (record as { id?: unknown }).id;\n if (id == null || id === '') {\n return null;\n }\n return String(id);\n}\n\nexport function axpLocalEntitySortAt(record: unknown, sortField?: string): number {\n if (record == null || typeof record !== 'object') {\n return 0;\n }\n const row = record as Record<string, unknown>;\n const candidates = [sortField, 'updatedAt', 'createdAt'].filter(Boolean) as string[];\n for (const field of candidates) {\n const value = row[field];\n const ms = toEpochMs(value);\n if (ms != null) {\n return ms;\n }\n }\n return 0;\n}\n\nfunction toEpochMs(value: unknown): number | null {\n if (value == null || value === '') {\n return null;\n }\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (value instanceof Date) {\n const ms = value.getTime();\n return Number.isFinite(ms) ? ms : null;\n }\n if (typeof value === 'string') {\n const ms = Date.parse(value);\n return Number.isFinite(ms) ? ms : null;\n }\n return null;\n}\n\nexport function axpLocalEntityToPayload(record: unknown): Record<string, unknown> {\n if (record != null && typeof record === 'object' && !Array.isArray(record)) {\n return { ...(record as Record<string, unknown>) };\n }\n return {};\n}\n\n//#endregion\n\n//#region ----- Query helpers -----\n\n/** True when the request can be answered from the capped hot subset. */\nexport function axpLocalEntityCanServeListLocally(\n request: AXPQueryRequest | undefined,\n policy: AXPLocalEntityPolicy,\n): boolean {\n const skip = request?.skip ?? 0;\n const take = request?.take ?? 10;\n if (skip < 0 || take < 0) {\n return false;\n }\n if (skip + take > policy.maxItems) {\n return false;\n }\n if (!isEmptyQueryFilter(request?.filter)) {\n return false;\n }\n return true;\n}\n\nexport function axpLocalEntityHotListRequest(policy: AXPLocalEntityPolicy): AXPQueryRequest {\n const request: AXPQueryRequest = {\n skip: 0,\n take: policy.maxItems,\n };\n if (policy.sortField) {\n request.sort = [{ field: policy.sortField, dir: 'desc' }];\n }\n return request;\n}\n\nfunction isEmptyQueryFilter(filter: AXPQueryRequest['filter']): boolean {\n if (filter == null) {\n return true;\n }\n if (Array.isArray(filter)) {\n return filter.length === 0;\n }\n if (typeof filter === 'object') {\n return Object.keys(filter as object).length === 0;\n }\n return false;\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { createRandomUuid, type AXPPagedListResult, type AXPQueryRequest } from '@acorex-platform/framework-shared/core';\nimport { computed, DestroyRef, inject, Injectable, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { combineLatest, distinctUntilChanged, map } from 'rxjs';\nimport {\n AXP_LOCAL_ENTITY_BROADCAST_CHANNEL,\n AXP_LOCAL_ENTITY_DEFAULT_MAX_ITEMS,\n axpLocalEntityIndexedDb,\n buildLocalEntityMetaId,\n buildLocalEntityStorageId,\n} from './local-entity-indexed-db';\nimport {\n axpLocalEntityCanServeListLocally,\n axpLocalEntityHotListRequest,\n axpLocalEntityRecordId,\n axpLocalEntitySortAt,\n axpLocalEntityToPayload,\n} from './local-entity-query.util';\nimport type {\n AXPLocalEntityKey,\n AXPLocalEntityPolicy,\n AXPLocalEntityStoredItem,\n} from './local-entity.types';\n\n//#endregion\n\n//#region ----- Types -----\n\ntype AXPLocalEntityBroadcastMessage =\n | { type: 'store-changed'; entityKey: string; userKey: string; originId: string }\n | { type: 'store-cleared'; entityKey: string; userKey: string; originId: string };\n\ninterface AXPLocalEntityBucket {\n policy: AXPLocalEntityPolicy;\n items: ReturnType<typeof signal<Record<string, unknown>[]>>;\n hydrated: ReturnType<typeof signal<boolean>>;\n hydratePromise: Promise<void> | null;\n bootstrapPromise: Promise<void> | null;\n syncInFlight: Promise<void> | null;\n}\n\n//#endregion\n\n//#region ----- Local entity engine -----\n\n/**\n * Shared IndexedDB-backed hot-subset store for entity client-local caching.\n * Online only for this phase (cache / local-first). Offline modes come later.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPLocalEntityEngine {\n private readonly sessionService = inject(AXPSessionService);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly originId = createRandomUuid();\n\n private readonly buckets = new Map<AXPLocalEntityKey, AXPLocalEntityBucket>();\n private readonly userKeySignal = signal<string | null>(null);\n private broadcast: BroadcastChannel | null = null;\n\n constructor() {\n this.bindBroadcastChannel();\n this.bindSessionContext();\n this.destroyRef.onDestroy(() => {\n this.broadcast?.close();\n this.broadcast = null;\n });\n }\n\n //#region ----- Policy & session -----\n\n registerPolicy(entityKey: AXPLocalEntityKey, policy: Partial<AXPLocalEntityPolicy> | undefined): AXPLocalEntityPolicy {\n const normalized = normalizePolicy(policy);\n const existing = this.buckets.get(entityKey);\n if (existing) {\n existing.policy = normalized;\n return normalized;\n }\n this.buckets.set(entityKey, {\n policy: normalized,\n items: signal<Record<string, unknown>[]>([]),\n hydrated: signal(false),\n hydratePromise: null,\n bootstrapPromise: null,\n syncInFlight: null,\n });\n return normalized;\n }\n\n getPolicy(entityKey: AXPLocalEntityKey): AXPLocalEntityPolicy | null {\n return this.buckets.get(entityKey)?.policy ?? null;\n }\n\n resolveUserKey(): string | null {\n const tenantId = this.sessionService.tenant?.id?.trim();\n const userId = this.sessionService.user?.id?.trim();\n if (!tenantId || !userId) {\n return null;\n }\n return `${tenantId}:${userId}`;\n }\n\n //#endregion\n\n //#region ----- Read API -----\n\n isHydrated(entityKey: AXPLocalEntityKey): boolean {\n return this.buckets.get(entityKey)?.hydrated() ?? false;\n }\n\n items(entityKey: AXPLocalEntityKey): Record<string, unknown>[] {\n return this.buckets.get(entityKey)?.items() ?? [];\n }\n\n itemsSignal(entityKey: AXPLocalEntityKey) {\n const bucket = this.ensureBucket(entityKey);\n return computed(() => bucket.items());\n }\n\n getById(entityKey: AXPLocalEntityKey, id: string): Record<string, unknown> | undefined {\n return this.items(entityKey).find((item) => axpLocalEntityRecordId(item) === id);\n }\n\n canServeListLocally(entityKey: AXPLocalEntityKey, request?: AXPQueryRequest): boolean {\n const policy = this.getPolicy(entityKey);\n if (!policy || !this.isHydrated(entityKey)) {\n return false;\n }\n return axpLocalEntityCanServeListLocally(request, policy);\n }\n\n queryPage(entityKey: AXPLocalEntityKey, request?: AXPQueryRequest): AXPPagedListResult<Record<string, unknown>> {\n const items = this.items(entityKey);\n const skip = request?.skip ?? 0;\n const take = request?.take ?? 10;\n return {\n items: items.slice(skip, skip + take),\n total: items.length,\n };\n }\n\n hotListRequest(entityKey: AXPLocalEntityKey): AXPQueryRequest {\n const policy = this.ensureBucket(entityKey).policy;\n return axpLocalEntityHotListRequest(policy);\n }\n\n //#endregion\n\n //#region ----- Lifecycle / sync -----\n\n /**\n * Hydrate from IndexedDB then sync the hot subset once (idempotent per session user).\n */\n ensureReady(\n entityKey: AXPLocalEntityKey,\n fetchHot: () => Promise<AXPPagedListResult<unknown>>,\n ): Promise<void> {\n const bucket = this.ensureBucket(entityKey);\n if (!bucket.bootstrapPromise) {\n bucket.bootstrapPromise = this.bootstrap(entityKey, fetchHot).finally(() => {\n // Allow re-bootstrap after user switch (session handler clears promises).\n });\n }\n return bucket.bootstrapPromise;\n }\n\n async hydrate(entityKey: AXPLocalEntityKey): Promise<void> {\n const bucket = this.ensureBucket(entityKey);\n if (bucket.hydratePromise) {\n return bucket.hydratePromise;\n }\n bucket.hydratePromise = this.hydrateInternal(entityKey).finally(() => {\n bucket.hydratePromise = null;\n });\n return bucket.hydratePromise;\n }\n\n async syncHot(\n entityKey: AXPLocalEntityKey,\n fetchHot: () => Promise<AXPPagedListResult<unknown>>,\n ): Promise<void> {\n const bucket = this.ensureBucket(entityKey);\n if (bucket.syncInFlight) {\n return bucket.syncInFlight;\n }\n bucket.syncInFlight = (async () => {\n const result = await fetchHot();\n await this.replaceAll(entityKey, result.items ?? []);\n })().finally(() => {\n bucket.syncInFlight = null;\n });\n return bucket.syncInFlight;\n }\n\n //#endregion\n\n //#region ----- Mutations -----\n\n async replaceAll(entityKey: AXPLocalEntityKey, items: unknown[]): Promise<void> {\n const bucket = this.ensureBucket(entityKey);\n const userKey = this.resolveUserKey();\n if (!userKey) {\n bucket.items.set([]);\n bucket.hydrated.set(true);\n return;\n }\n\n const normalized = this.prune(entityKey, items);\n await this.persistUserItems(entityKey, userKey, normalized);\n this.publish({ type: 'store-changed', entityKey, userKey, originId: this.originId });\n }\n\n async upsertMany(entityKey: AXPLocalEntityKey, items: unknown[]): Promise<void> {\n if (!items.length) {\n return;\n }\n const userKey = this.resolveUserKey();\n if (!userKey) {\n return;\n }\n\n const byId = new Map(this.items(entityKey).map((item) => [axpLocalEntityRecordId(item)!, item]));\n for (const item of items) {\n const id = axpLocalEntityRecordId(item);\n if (!id) {\n continue;\n }\n byId.set(id, axpLocalEntityToPayload(item));\n }\n\n const next = this.prune(entityKey, [...byId.values()]);\n await this.persistUserItems(entityKey, userKey, next);\n this.publish({ type: 'store-changed', entityKey, userKey, originId: this.originId });\n }\n\n async patchMany(\n entityKey: AXPLocalEntityKey,\n ids: string[],\n patch: (item: Record<string, unknown>) => Record<string, unknown> | unknown,\n ): Promise<void> {\n if (!ids.length) {\n return;\n }\n const idSet = new Set(ids.map(String));\n const next = this.items(entityKey).map((item) => {\n const id = axpLocalEntityRecordId(item);\n if (!id || !idSet.has(id)) {\n return item;\n }\n return axpLocalEntityToPayload(patch(item));\n });\n await this.writeItems(entityKey, next);\n }\n\n async patchAll(\n entityKey: AXPLocalEntityKey,\n patch: (item: Record<string, unknown>) => Record<string, unknown> | unknown,\n ): Promise<void> {\n const next = this.items(entityKey).map((item) => axpLocalEntityToPayload(patch(item)));\n await this.writeItems(entityKey, next);\n }\n\n async removeMany(entityKey: AXPLocalEntityKey, ids: string[]): Promise<void> {\n if (!ids.length) {\n return;\n }\n const userKey = this.resolveUserKey();\n const idSet = new Set(ids.map(String));\n const next = this.items(entityKey).filter((item) => !idSet.has(axpLocalEntityRecordId(item) ?? ''));\n const bucket = this.ensureBucket(entityKey);\n\n if (!userKey) {\n bucket.items.set(next);\n bucket.hydrated.set(true);\n return;\n }\n\n const storageIds = ids.map((id) => buildLocalEntityStorageId(entityKey, userKey, String(id)));\n await axpLocalEntityIndexedDb.transaction('rw', axpLocalEntityIndexedDb.items, async () => {\n await axpLocalEntityIndexedDb.items.bulkDelete(storageIds);\n });\n\n bucket.items.set(next);\n bucket.hydrated.set(true);\n this.publish({ type: 'store-changed', entityKey, userKey, originId: this.originId });\n }\n\n async clear(entityKey: AXPLocalEntityKey): Promise<void> {\n const bucket = this.ensureBucket(entityKey);\n const userKey = this.resolveUserKey();\n bucket.items.set([]);\n bucket.hydrated.set(true);\n if (!userKey) {\n return;\n }\n\n const metaId = buildLocalEntityMetaId(entityKey, userKey);\n await axpLocalEntityIndexedDb.transaction('rw', axpLocalEntityIndexedDb.items, axpLocalEntityIndexedDb.meta, async () => {\n await axpLocalEntityIndexedDb.items.where('[entityKey+userKey]').equals([entityKey, userKey]).delete();\n await axpLocalEntityIndexedDb.meta.delete(metaId);\n });\n\n this.publish({ type: 'store-cleared', entityKey, userKey, originId: this.originId });\n }\n\n //#endregion\n\n //#region ----- Private helpers -----\n\n private ensureBucket(entityKey: AXPLocalEntityKey): AXPLocalEntityBucket {\n let bucket = this.buckets.get(entityKey);\n if (!bucket) {\n this.registerPolicy(entityKey, undefined);\n bucket = this.buckets.get(entityKey)!;\n }\n return bucket;\n }\n\n private async bootstrap(\n entityKey: AXPLocalEntityKey,\n fetchHot: () => Promise<AXPPagedListResult<unknown>>,\n ): Promise<void> {\n await this.hydrate(entityKey);\n try {\n await this.syncHot(entityKey, fetchHot);\n } catch {\n // Keep hydrated local snapshot when sync fails (online cache resilience).\n }\n }\n\n private async writeItems(entityKey: AXPLocalEntityKey, items: Record<string, unknown>[]): Promise<void> {\n const bucket = this.ensureBucket(entityKey);\n const userKey = this.resolveUserKey();\n const next = this.prune(entityKey, items);\n if (!userKey) {\n bucket.items.set(next);\n bucket.hydrated.set(true);\n return;\n }\n await this.persistUserItems(entityKey, userKey, next);\n this.publish({ type: 'store-changed', entityKey, userKey, originId: this.originId });\n }\n\n private async hydrateInternal(entityKey: AXPLocalEntityKey): Promise<void> {\n const bucket = this.ensureBucket(entityKey);\n const userKey = this.resolveUserKey();\n if (!userKey) {\n bucket.items.set([]);\n bucket.hydrated.set(true);\n return;\n }\n\n const stored = await axpLocalEntityIndexedDb.items\n .where('[entityKey+userKey]')\n .equals([entityKey, userKey])\n .toArray();\n\n const items = this.prune(\n entityKey,\n stored.map((row) => row.payload),\n );\n this.userKeySignal.set(userKey);\n bucket.items.set(items);\n bucket.hydrated.set(true);\n }\n\n private async persistUserItems(\n entityKey: AXPLocalEntityKey,\n userKey: string,\n items: Record<string, unknown>[],\n ): Promise<void> {\n const bucket = this.ensureBucket(entityKey);\n const policy = bucket.policy;\n const stored: AXPLocalEntityStoredItem[] = items.map((item) => {\n const id = axpLocalEntityRecordId(item)!;\n return {\n storageId: buildLocalEntityStorageId(entityKey, userKey, id),\n entityKey,\n userKey,\n id,\n sortAt: axpLocalEntitySortAt(item, policy.sortField),\n payload: item,\n };\n });\n const keepIds = new Set(stored.map((row) => row.storageId));\n const metaId = buildLocalEntityMetaId(entityKey, userKey);\n\n await axpLocalEntityIndexedDb.transaction('rw', axpLocalEntityIndexedDb.items, axpLocalEntityIndexedDb.meta, async () => {\n const existing = await axpLocalEntityIndexedDb.items\n .where('[entityKey+userKey]')\n .equals([entityKey, userKey])\n .primaryKeys();\n const staleIds = existing.filter((id) => !keepIds.has(String(id)));\n if (staleIds.length > 0) {\n await axpLocalEntityIndexedDb.items.bulkDelete(staleIds);\n }\n if (stored.length > 0) {\n await axpLocalEntityIndexedDb.items.bulkPut(stored);\n }\n await axpLocalEntityIndexedDb.meta.put({\n id: metaId,\n entityKey,\n userKey,\n lastSyncedAt: new Date().toISOString(),\n });\n });\n\n this.userKeySignal.set(userKey);\n bucket.items.set(items);\n bucket.hydrated.set(true);\n }\n\n private prune(entityKey: AXPLocalEntityKey, items: unknown[]): Record<string, unknown>[] {\n const policy = this.ensureBucket(entityKey).policy;\n const mapped = items\n .map((item) => axpLocalEntityToPayload(item))\n .filter((item) => axpLocalEntityRecordId(item) != null);\n\n const byRecency = [...mapped].sort(\n (left, right) =>\n axpLocalEntitySortAt(right, policy.sortField) - axpLocalEntitySortAt(left, policy.sortField),\n );\n return byRecency.slice(0, policy.maxItems);\n }\n\n private bindSessionContext(): void {\n combineLatest([this.sessionService.user$, this.sessionService.tenant$])\n .pipe(\n map(([user, tenant]) => (user?.id && tenant?.id ? `${tenant.id}:${user.id}` : null)),\n distinctUntilChanged(),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((userKey) => {\n if (userKey === this.userKeySignal()) {\n return;\n }\n this.userKeySignal.set(userKey);\n for (const [entityKey, bucket] of this.buckets) {\n bucket.bootstrapPromise = null;\n bucket.hydratePromise = null;\n bucket.syncInFlight = null;\n void this.hydrateInternal(entityKey);\n }\n });\n }\n\n private bindBroadcastChannel(): void {\n if (typeof BroadcastChannel === 'undefined') {\n return;\n }\n\n this.broadcast = new BroadcastChannel(AXP_LOCAL_ENTITY_BROADCAST_CHANNEL);\n this.broadcast.onmessage = (event: MessageEvent<AXPLocalEntityBroadcastMessage>) => {\n const message = event.data;\n if (!message || message.originId === this.originId) {\n return;\n }\n const userKey = this.resolveUserKey();\n if (!userKey || message.userKey !== userKey) {\n return;\n }\n if (!this.buckets.has(message.entityKey)) {\n return;\n }\n void this.hydrateInternal(message.entityKey);\n };\n }\n\n private publish(message: AXPLocalEntityBroadcastMessage): void {\n try {\n this.broadcast?.postMessage(message);\n } catch {\n // BroadcastChannel can fail in restricted contexts; local tab still works.\n }\n }\n\n //#endregion\n}\n\n//#endregion\n\n//#region ----- Policy normalize -----\n\nfunction normalizePolicy(policy: Partial<AXPLocalEntityPolicy> | undefined): AXPLocalEntityPolicy {\n const maxItems =\n typeof policy?.maxItems === 'number' && policy.maxItems > 0\n ? Math.floor(policy.maxItems)\n : AXP_LOCAL_ENTITY_DEFAULT_MAX_ITEMS;\n\n return {\n mode: policy?.mode === 'cache' ? 'cache' : 'local-first',\n maxItems,\n role: policy?.role,\n sortField: typeof policy?.sortField === 'string' && policy.sortField.trim() ? policy.sortField.trim() : undefined,\n related: Array.isArray(policy?.related) ? policy.related : undefined,\n };\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport type { AXPPagedListResult } from '@acorex-platform/framework-shared/core';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { inject, Injectable } from '@angular/core';\nimport { AXPLocalEntityEngine } from './local-entity.engine';\nimport { axpLocalEntityRecordId } from './local-entity-query.util';\nimport type { AXPLocalEntityKey } from './local-entity.types';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport type AXPLocalEntityRealtimeChangeType = 'upsert' | 'remove' | 'invalidate';\n\nexport interface AXPLocalEntityRealtimeChange {\n entityKey: AXPLocalEntityKey;\n type: AXPLocalEntityRealtimeChangeType;\n /** Target ids for upsert/remove. */\n ids?: string[];\n /** Optional full records for upsert (skips fetchByIds). */\n items?: unknown[];\n}\n\nexport interface AXPLocalEntityRealtimeSyncHandlers {\n /** Load records by id for delta upsert (missing ids are removed locally). */\n fetchByIds?: (ids: string[]) => Promise<unknown[]>;\n /** Reload the hot subset for full invalidate. */\n fetchHot?: () => Promise<AXPPagedListResult<unknown>>;\n}\n\n//#endregion\n\n//#region ----- Realtime → local engine bridge -----\n\n/**\n * Applies realtime / reconnect deltas to {@link AXPLocalEntityEngine}.\n * Features register sync handlers per entityKey (inbox, client-local plugin, …).\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPLocalEntityRealtimeBridge {\n private readonly engine = inject(AXPLocalEntityEngine);\n private readonly sessionService = inject(AXPSessionService);\n private readonly handlers = new Map<AXPLocalEntityKey, AXPLocalEntityRealtimeSyncHandlers>();\n\n register(entityKey: AXPLocalEntityKey, handlers: AXPLocalEntityRealtimeSyncHandlers): void {\n this.handlers.set(entityKey, handlers);\n }\n\n unregister(entityKey: AXPLocalEntityKey): void {\n this.handlers.delete(entityKey);\n }\n\n /** True when the engine has a policy or sync handlers for this key. */\n isManaged(entityKey: AXPLocalEntityKey): boolean {\n return this.handlers.has(entityKey) || this.engine.getPolicy(entityKey) != null;\n }\n\n async apply(change: AXPLocalEntityRealtimeChange): Promise<void> {\n const entityKey = change.entityKey?.trim();\n if (!entityKey || !this.isManaged(entityKey) || !this.sessionService.isReadyForAppScopedApi) {\n return;\n }\n\n if (change.type === 'remove') {\n const ids = normalizeIds(change.ids);\n if (ids.length > 0) {\n await this.engine.removeMany(entityKey, ids);\n }\n return;\n }\n\n if (change.type === 'upsert') {\n if (change.items?.length) {\n await this.engine.upsertMany(entityKey, change.items);\n return;\n }\n\n const ids = normalizeIds(change.ids);\n const fetchByIds = this.handlers.get(entityKey)?.fetchByIds;\n if (ids.length > 0 && fetchByIds) {\n try {\n const loaded = await fetchByIds(ids);\n const foundIds = new Set(\n loaded.map((item) => axpLocalEntityRecordId(item)).filter((id): id is string => id != null),\n );\n const missingIds = ids.filter((id) => !foundIds.has(id));\n if (loaded.length > 0) {\n await this.engine.upsertMany(entityKey, loaded);\n }\n if (missingIds.length > 0) {\n await this.engine.removeMany(entityKey, missingIds);\n }\n return;\n } catch {\n // Fall through to hot invalidate.\n }\n } else if (ids.length === 0 && !change.items?.length) {\n // No delta payload — treat as invalidate below.\n } else if (ids.length > 0 && !fetchByIds) {\n // Ids without a fetcher — invalidate if possible.\n } else {\n return;\n }\n }\n\n await this.invalidate(entityKey);\n }\n\n async invalidate(entityKey: AXPLocalEntityKey): Promise<void> {\n if (!this.sessionService.isReadyForAppScopedApi) {\n return;\n }\n\n const fetchHot = this.handlers.get(entityKey)?.fetchHot;\n if (!fetchHot) {\n return;\n }\n await this.engine.hydrate(entityKey);\n await this.engine.syncHot(entityKey, fetchHot);\n }\n}\n\n//#endregion\n\n//#region ----- Helpers -----\n\nfunction normalizeIds(ids: string[] | undefined): string[] {\n if (!ids?.length) {\n return [];\n }\n return [...new Set(ids.map((id) => id?.trim()).filter((id): id is string => Boolean(id)))];\n}\n\n//#endregion\n","import { Injectable } from \"@angular/core\";\nimport {AXPLockGetInfoRequest, AXPLockInfo, AXPLockRequest, AXPUnLockRequest } from \"./lock.types\";\n\n@Injectable()\nexport abstract class AXPLockService {\n\n abstract lock(request: AXPLockRequest): Promise<AXPLockInfo>;\n\n abstract unlock(request: AXPUnLockRequest): Promise<void>;\n\n abstract check(request: AXPLockGetInfoRequest): Promise<boolean>;\n\n abstract getInfo(request: AXPLockGetInfoRequest): Promise<AXPLockInfo>;\n}\n","import { AXPStatusProvider, AXPStatusTransition } from '@acorex-platform/framework-shared/core';\nimport { Injectable, InjectionToken, inject } from '@angular/core';\n\nimport { commandMessageTextForError } from '../errors/command-message-text.util';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\n\n//#region ---- Injection Token ----\n\n/**\n * Injection token for status providers\n * Use with multi: true to register multiple providers\n */\nexport const AXP_STATUS_PROVIDERS = new InjectionToken<AXPStatusProvider[]>('AXP_STATUS_PROVIDERS');\n\n//#endregion\n\n//#region ---- Provider Service ----\n\n/**\n * Service for managing status definitions from multiple providers\n * Similar to AXPTaskBadgeService pattern - no cache, direct access\n * \n * @example\n * ```typescript\n * // In a module providers array:\n * {\n * provide: AXP_STATUS_PROVIDERS,\n * useClass: TaskStatusProvider,\n * multi: true,\n * }\n * \n * // Example provider implementation:\n * export class TaskStatusProvider extends AXPStatusProvider {\n * readonly key = 'task-management.status';\n * readonly statuses = [\n * { name: 'todo', title: 'To Do', color: '#6b7280', icon: 'fa-light fa-circle', isInitial: true },\n * { name: 'in-progress', title: 'In Progress', color: '#3b82f6', icon: 'fa-light fa-play' },\n * { name: 'done', title: 'Done', color: '#10b981', icon: 'fa-light fa-check-circle', isFinal: true },\n * ];\n * readonly transitions = [\n * { from: 'todo', to: 'in-progress', title: 'Start', condition: '{{user.canEdit}}' },\n * { from: 'in-progress', to: 'done', title: 'Complete' },\n * ];\n * readonly defaultStatus = 'todo';\n * }\n * \n * // Later, get the status:\n * const status = await statusService.getStatus('task-management.status');\n * if (status) {\n * console.log('Statuses:', status.statuses);\n * console.log('Transitions:', status.transitions);\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPStatusDefinitionProviderService {\n //#region ---- Dependencies ----\n\n private providers: AXPStatusProvider[] = inject(AXP_STATUS_PROVIDERS, { optional: true }) ?? [];\n private commandService = inject(AXPCommandService);\n\n //#endregion\n\n //#region ---- State ----\n\n private statusMap = new Map<string, AXPStatusProvider>();\n private initializationPromise: Promise<void> | null = null;\n private isInitialized = false;\n\n //#endregion\n\n //#region ---- Initialization ----\n\n /**\n * Initialize providers (resolve promises if needed)\n * Called lazily on first access\n */\n private async initialize(): Promise<void> {\n if (this.isInitialized) {\n return;\n }\n\n if (this.initializationPromise) {\n return this.initializationPromise;\n }\n\n this.initializationPromise = this._doInitialize();\n await this.initializationPromise;\n }\n\n private async _doInitialize(): Promise<void> {\n // Register all providers, resolving promises if needed\n for (const provider of this.providers) {\n let resolvedProvider: AXPStatusProvider;\n\n if (provider instanceof Promise) {\n // If provider is a promise, resolve it\n resolvedProvider = await provider;\n } else {\n // If provider is a direct instance, use it directly\n resolvedProvider = provider;\n }\n\n if (this.statusMap.has(resolvedProvider.key)) {\n console.warn(`Status with key \"${resolvedProvider.key}\" already exists. Overwriting with new status.`);\n }\n\n this.statusMap.set(resolvedProvider.key, resolvedProvider);\n }\n\n this.isInitialized = true;\n }\n\n //#endregion\n\n //#region ---- Public API ----\n\n /**\n * Get a status provider by key\n * Ensures initialization is complete before accessing the status map.\n * \n * @param key - Status key (e.g., 'task-management.status')\n * @returns Promise that resolves to status provider with all statuses and transitions, or undefined if not found\n * \n * @example\n * ```typescript\n * const status = await statusService.getStatus('task-management.status');\n * if (status) {\n * console.log('Statuses:', status.statuses);\n * console.log('Transitions:', status.transitions);\n * }\n * ```\n */\n public async getStatus(key: string): Promise<AXPStatusProvider | undefined> {\n await this.initialize();\n return this.statusMap.get(key);\n }\n\n /**\n * Execute a status transition workflow action\n * Uses transition.command if provided, otherwise defaults to Entity:UpdateStatus\n * Validates the transition is allowed before executing\n * \n * @param definitionKey - Status definition key\n * @param transition - The transition to execute\n * @param context - Context data for the command (must include entity name and id/ids)\n * @returns Promise that resolves when the command execution completes\n * \n * @example\n * ```typescript\n * await statusService.executeTransition(\n * 'task-management.status',\n * { from: 'todo', to: 'in-progress' },\n * { entity: 'TaskManagement.Task', id: '123', ...entityData }\n * );\n * ```\n */\n public async executeTransition(\n definitionKey: string,\n transition: AXPStatusTransition,\n context: Record<string, any>\n ): Promise<void> {\n await this.initialize();\n const provider = this.statusMap.get(definitionKey);\n if (!provider) {\n throw new Error(`Status provider with key \"${definitionKey}\" not found.`);\n }\n\n // Validate transition is allowed\n if (!this.isValidTransition(provider, transition.from, transition.to)) {\n throw new Error(`Invalid transition from \"${transition.from}\" to \"${transition.to}\"`);\n }\n\n // Determine which command to use\n let commandName: string;\n let commandOptions: Record<string, unknown>;\n\n if (transition.command) {\n // Use transition's explicit command\n commandName = transition.command.name;\n commandOptions = {\n ...(transition.command.options ?? {}),\n ...context,\n };\n } else {\n // Use default Entity:UpdateStatus command\n const entity =\n context['entity'] ?? context['entityName'] ?? context['__meta__']?.config?.name;\n if (!entity) {\n throw new Error('Entity name is required in context when using default status update command');\n }\n\n const id = context['id'];\n const ids = context['ids'];\n\n if (!id && !ids) {\n throw new Error('Either id or ids must be provided in context');\n }\n\n commandName = 'Entity:UpdateStatus';\n commandOptions = {\n entity,\n status: transition.to,\n statusField: context['statusField'] ?? context['fieldName'] ?? 'statusId',\n ...(id ? { id } : {}),\n ...(ids ? { ids } : {}),\n };\n }\n\n // Execute the command\n const result = await this.commandService.execute(commandName, commandOptions);\n\n if (!result?.success) {\n const text = commandMessageTextForError(result?.message?.text);\n throw new Error(text || 'Failed to execute status transition command');\n }\n }\n\n /**\n * Validate if a transition is allowed\n * Checks if the transition exists in the provider's transitions list\n */\n private isValidTransition(\n provider: AXPStatusProvider,\n from: string,\n to: string\n ): boolean {\n return provider.transitions.some(\n (transition) => transition.from === from && transition.to === to\n );\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Types ----\n\n/** Structured hover-card payload for a tab (kept in memory; not session-persisted). */\nexport interface AXPTabStructuredPreview {\n /** Primary label (usually page title or breadcrumb trail). */\n title: string;\n /** Optional page description or secondary line. */\n subtitle?: string;\n /** Full router URL for the tab. */\n url: string;\n icon?: string;\n /** Whether the cached page reports unsaved user edits. */\n isDirty: boolean;\n /** Breadcrumb segments excluding home (for the hover card). */\n breadcrumbTrail: string[];\n}\n\n//#endregion\n","import { normalizeRouterUrl } from '../tab-navigation/tab-key.util';\nimport { axpIsEntityListPath } from './app-path-navigation.util';\n\n//#region ---- Types ----\n\nexport interface AXPEntityListRouteParts {\n module: string;\n entity: string;\n}\n\nexport interface AXPEntityDetailsRouteParts extends AXPEntityListRouteParts {\n id: string;\n}\n\n//#endregion\n\n//#region ---- Constants ----\n\nconst SESSION_KEY_PREFIX = 'axp-entity-list-return:';\n\n//#endregion\n\n//#region ---- Route Parsing ----\n\n/** Parses an entity master list route (`.../m/{module}/e/{entity}/list`). */\nexport function axpParseEntityListRoute(url: string): AXPEntityListRouteParts | null {\n const path = url.split('?')[0].split('#')[0];\n const match = path.match(/\\/m\\/([^/]+)\\/e\\/([^/]+)\\/list$/);\n if (!match) {\n return null;\n }\n\n return {\n module: decodeURIComponent(match[1]),\n entity: decodeURIComponent(match[2]),\n };\n}\n\n/** Parses an entity details route (`.../m/{module}/e/{entity}/{id}/view`). */\nexport function axpParseEntityDetailsRoute(url: string): AXPEntityDetailsRouteParts | null {\n const path = url.split('?')[0].split('#')[0];\n const match = path.match(/\\/m\\/([^/]+)\\/e\\/([^/]+)\\/([^/]+)\\/view$/);\n if (!match) {\n return null;\n }\n\n return {\n module: decodeURIComponent(match[1]),\n entity: decodeURIComponent(match[2]),\n id: decodeURIComponent(match[3]),\n };\n}\n\n//#endregion\n\n//#region ---- Session Storage ----\n\nfunction buildStorageKey(module: string, entity: string): string {\n return `${SESSION_KEY_PREFIX}${module}.${entity}`;\n}\n\n/** Persists the last list URL (including query params) used before opening entity details. */\nexport function axpSaveEntityListReturnUrl(module: string, entity: string, url: string): void {\n if (!axpIsEntityListPath(url)) {\n return;\n }\n\n const parsed = axpParseEntityListRoute(url);\n if (!parsed || parsed.module !== module || parsed.entity !== entity) {\n return;\n }\n\n try {\n sessionStorage.setItem(buildStorageKey(module, entity), normalizeRouterUrl(url));\n } catch {\n // sessionStorage may be unavailable\n }\n}\n\n/** Returns the stored list URL for the entity, or the provided fallback path. */\nexport function axpGetEntityListReturnUrl(module: string, entity: string, fallbackPath: string): string {\n try {\n const stored = sessionStorage.getItem(buildStorageKey(module, entity));\n if (!stored || !axpIsEntityListPath(stored)) {\n return fallbackPath;\n }\n\n const parsed = axpParseEntityListRoute(stored);\n if (parsed?.module === module && parsed.entity === entity) {\n return stored;\n }\n } catch {\n // sessionStorage may be unavailable\n }\n\n return fallbackPath;\n}\n\n//#endregion\n","import { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { Injectable, inject } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPClipBoardService {\n //#region ---- Services & Dependencies ----\n\n private readonly toast = inject(AXToastService);\n private readonly translationService = inject(AXTranslationService);\n\n //#endregion\n\n //#region ---- Public Methods ----\n\n public async copy(title: string, value: string): Promise<void> {\n const copyText = document.createElement('input');\n copyText.type = 'text';\n copyText.select();\n copyText.setSelectionRange(0, 99999); // For mobile devices\n copyText.remove();\n await navigator.clipboard.writeText(value);\n\n const message = await this.translationService.translateAsync('@general:messages.clipboard.copied', {\n params: { title },\n });\n this.toast.success(message);\n }\n\n //#endregion\n}\n","//#region ---- Types ----\n\nexport type AXPGraphicDownloadFormat = 'svg' | 'png' | 'jpeg';\n\nexport interface AXPGraphicPrintContent {\n bodyMarkup: string;\n styleRule: string;\n}\n\nexport interface AXPPrintGraphicOptions {\n /** Used when the rendered element has no measurable size. */\n fallbackSize?: number;\n title?: string;\n imageAlt?: string;\n}\n\nexport interface AXPGraphicDownloadOptions {\n format: AXPGraphicDownloadFormat;\n filename: string;\n /** Used when rasterizing SVG or sizing canvas output. */\n fallbackSize?: number;\n}\n\n//#endregion\n\n//#region ---- Option normalization ----\n\n/**\n * Normalizes widget option values to a positive finite number\n * (plain number, numeric string, or editor object with `value` / `id`).\n */\nexport function normalizePositiveNumberOption(value: unknown, fallback: number): number {\n if (typeof value === 'number' && Number.isFinite(value) && value > 0) {\n return value;\n }\n\n if (typeof value === 'string') {\n const parsed = Number(value);\n if (Number.isFinite(parsed) && parsed > 0) {\n return parsed;\n }\n }\n\n if (value != null && typeof value === 'object') {\n const record = value as Record<string, unknown>;\n if ('value' in record) {\n return normalizePositiveNumberOption(record['value'], fallback);\n }\n if ('id' in record) {\n return normalizePositiveNumberOption(record['id'], fallback);\n }\n }\n\n return fallback;\n}\n\n//#endregion\n\n//#region ---- DOM measurement ----\n\n/**\n * Resolves the rendered graphic size from a container (canvas or SVG).\n */\nexport function resolveGraphicElementSize(container: HTMLElement, fallback: number): number {\n const canvas = container.querySelector('canvas');\n if (canvas instanceof HTMLCanvasElement && canvas.width > 0) {\n return canvas.width;\n }\n\n const svg = container.querySelector('svg');\n if (svg instanceof SVGSVGElement) {\n const svgWidth = svg.width?.baseVal?.value;\n if (svgWidth > 0) {\n return svgWidth;\n }\n\n const widthAttr = svg.getAttribute('width');\n if (widthAttr) {\n const parsed = Number.parseFloat(widthAttr);\n if (Number.isFinite(parsed) && parsed > 0) {\n return parsed;\n }\n }\n }\n\n return normalizePositiveNumberOption(fallback, fallback);\n}\n\n//#endregion\n\n//#region ---- SVG helpers ----\n\n/**\n * Serializes an SVG element to a string, optionally prefixing the XML declaration.\n */\nexport function serializeSvgElement(svg: SVGSVGElement, includeXmlDeclaration = true): string {\n const serializer = new XMLSerializer();\n let source = serializer.serializeToString(svg);\n\n if (includeXmlDeclaration && !source.match(/^<\\?xml/)) {\n source = `<?xml version=\"1.0\" standalone=\"no\"?>\\r\\n${source}`;\n }\n\n return source;\n}\n\n//#endregion\n\n//#region ---- Graphic content resolution ----\n\n/**\n * Builds printable HTML body markup and CSS for an SVG or canvas inside a container.\n */\nexport function resolveGraphicPrintContent(\n container: HTMLElement,\n size: number,\n imageAlt = 'Graphic',\n): AXPGraphicPrintContent | undefined {\n const svg = container.querySelector('svg');\n if (svg instanceof SVGSVGElement) {\n return {\n bodyMarkup: svg.outerHTML,\n styleRule: `svg { width: ${size}px !important; height: ${size}px !important; }`,\n };\n }\n\n const canvas = container.querySelector('canvas');\n if (canvas instanceof HTMLCanvasElement) {\n try {\n const dataUrl = canvas.toDataURL('image/png');\n if (!dataUrl.startsWith('data:image/png')) {\n return undefined;\n }\n\n return {\n bodyMarkup: `<img src=\"${dataUrl}\" width=\"${size}\" height=\"${size}\" alt=\"${imageAlt}\" />`,\n styleRule: `img { width: ${size}px !important; height: ${size}px !important; }`,\n };\n } catch {\n return undefined;\n }\n }\n\n return undefined;\n}\n\n//#endregion\n\n//#region ---- Browser download ----\n\n/**\n * Triggers a file download for the given blob via a temporary anchor element.\n */\nexport function triggerBrowserDownload(blob: Blob, filename: string): void {\n const link = document.createElement('a');\n const url = URL.createObjectURL(blob);\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\n//#endregion\n\n//#region ---- Print ----\n\n/**\n * Opens the system print dialog for an SVG or canvas graphic inside the given container.\n */\nexport function printGraphicFromElement(container: HTMLElement, options: AXPPrintGraphicOptions = {}): void {\n const fallbackSize = options.fallbackSize ?? 200;\n const size = resolveGraphicElementSize(container, fallbackSize);\n const printContent = resolveGraphicPrintContent(container, size, options.imageAlt ?? 'Graphic');\n if (!printContent) {\n return;\n }\n\n const iframe = document.createElement('iframe');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.style.cssText = `position:fixed;left:0;top:0;width:${size}px;height:${size}px;border:0;visibility:hidden;`;\n document.body.appendChild(iframe);\n\n const printWindow = iframe.contentWindow;\n const doc = printWindow?.document;\n if (!printWindow || !doc) {\n iframe.remove();\n return;\n }\n\n const title = options.title ?? 'Print';\n\n doc.open();\n doc.write(`<!DOCTYPE html>\n<html>\n <head>\n <title>${title}</title>\n <style>\n body {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n margin: 0;\n }\n @media print {\n body {\n min-height: auto;\n }\n }\n ${printContent.styleRule}\n </style>\n </head>\n <body>${printContent.bodyMarkup}</body>\n</html>`);\n doc.close();\n\n const cleanup = (): void => {\n iframe.remove();\n };\n\n const triggerPrint = (): void => {\n printWindow.focus();\n printWindow.print();\n\n printWindow.addEventListener('afterprint', cleanup, { once: true });\n window.setTimeout(cleanup, 1000);\n };\n\n const image = doc.querySelector('img');\n if (image && !image.complete) {\n image.addEventListener('load', triggerPrint, { once: true });\n image.addEventListener('error', cleanup, { once: true });\n return;\n }\n\n requestAnimationFrame(triggerPrint);\n}\n\n//#endregion\n\n//#region ---- Download ----\n\n/**\n * Downloads an SVG or canvas graphic from a container as SVG, PNG, or JPEG.\n */\nexport function downloadGraphicFromElement(container: HTMLElement, options: AXPGraphicDownloadOptions): void {\n const size = resolveGraphicElementSize(container, options.fallbackSize ?? 200);\n\n if (options.format === 'svg') {\n downloadSvgGraphic(container, options.filename);\n return;\n }\n\n const mime = options.format === 'png' ? 'image/png' : 'image/jpeg';\n downloadRasterGraphic(container, mime, options.filename, size);\n}\n\nfunction downloadSvgGraphic(container: HTMLElement, filename: string): void {\n const svg = container.querySelector('svg');\n if (!(svg instanceof SVGSVGElement)) {\n return;\n }\n\n const source = serializeSvgElement(svg);\n triggerBrowserDownload(new Blob([source], { type: 'image/svg+xml;charset=utf-8' }), filename);\n}\n\nfunction downloadRasterGraphic(\n container: HTMLElement,\n mime: 'image/png' | 'image/jpeg',\n filename: string,\n size: number,\n): void {\n const canvas = container.querySelector('canvas');\n if (canvas instanceof HTMLCanvasElement) {\n const dataUrl = rasterizeCanvasToDataUrl(canvas, mime, size);\n if (dataUrl) {\n triggerBrowserDownload(dataUrlToBlob(dataUrl), filename);\n }\n return;\n }\n\n const svg = container.querySelector('svg');\n if (svg instanceof SVGSVGElement) {\n rasterizeSvgToDataUrl(svg, mime, size, (dataUrl) => {\n triggerBrowserDownload(dataUrlToBlob(dataUrl), filename);\n });\n }\n}\n\nfunction rasterizeCanvasToDataUrl(\n canvas: HTMLCanvasElement,\n mime: 'image/png' | 'image/jpeg',\n size: number,\n): string | undefined {\n if (mime === 'image/png') {\n try {\n return canvas.toDataURL('image/png');\n } catch {\n return undefined;\n }\n }\n\n const outputCanvas = document.createElement('canvas');\n outputCanvas.width = size;\n outputCanvas.height = size;\n const ctx = outputCanvas.getContext('2d');\n if (!ctx) {\n return undefined;\n }\n\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(0, 0, size, size);\n ctx.drawImage(canvas, 0, 0, size, size);\n\n try {\n return outputCanvas.toDataURL('image/jpeg');\n } catch {\n return undefined;\n }\n}\n\nfunction rasterizeSvgToDataUrl(\n svg: SVGSVGElement,\n mime: 'image/png' | 'image/jpeg',\n size: number,\n onReady: (dataUrl: string) => void,\n): void {\n const source = serializeSvgElement(svg);\n const svgUrl = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(source)}`;\n const img = new Image();\n const canvas = document.createElement('canvas');\n canvas.width = size;\n canvas.height = size;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n return;\n }\n\n if (mime === 'image/jpeg') {\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(0, 0, size, size);\n }\n\n img.onload = () => {\n ctx.drawImage(img, 0, 0, size, size);\n onReady(canvas.toDataURL(mime));\n };\n img.src = svgUrl;\n}\n\nfunction dataUrlToBlob(dataUrl: string): Blob {\n const [header, data] = dataUrl.split(',');\n const mime = header.match(/:(.*?);/)?.[1] ?? 'application/octet-stream';\n const binary = atob(data);\n const bytes = new Uint8Array(binary.length);\n\n for (let index = 0; index < binary.length; index++) {\n bytes[index] = binary.charCodeAt(index);\n }\n\n return new Blob([bytes], { type: mime });\n}\n\n//#endregion\n","import { AXButtonModule } from '@acorex/components/button';\nimport { AXCheckBoxModule } from '@acorex/components/check-box';\nimport { AXColorBoxModule } from '@acorex/components/color-box';\nimport { AXValueChangedEvent } from '@acorex/cdk/common';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXLabelModule } from '@acorex/components/label';\nimport { AXNumberBoxModule } from '@acorex/components/number-box';\nimport { AXBasePageComponent } from '@acorex/components/page';\nimport { AXTextBoxModule } from '@acorex/components/text-box';\nimport { afterNextRender, Component, linkedSignal, model, signal, ChangeDetectionStrategy } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AXPDomToImageOptions } from './export.service';\n\n@Component({\n template: ` <div class=\"grid grid-cols-[auto_18rem] gap-4 justify-center p-4 items-center\">\n <ax-label>Resolution (px)</ax-label>\n <div class=\"flex gap-2 items-center\">\n <ax-number-box\n [changeOnScroll]=\"true\"\n [decimals]=\"4\"\n [value]=\"width()\"\n (onValueChanged)=\"calculateRatio($event, 'width')\"\n name=\"Width\"\n >\n </ax-number-box>\n <ax-button [toggleable]=\"true\" [(selected)]=\"ratio\"\n ><ax-icon><i class=\"fa-solid fa-vector-square\"></i></ax-icon\n ></ax-button>\n <ax-number-box\n [changeOnScroll]=\"true\"\n [decimals]=\"4\"\n [value]=\"height()\"\n (onValueChanged)=\"calculateRatio($event, 'height')\"\n name=\"Height\"\n >\n </ax-number-box>\n </div>\n\n <ax-label>Background color</ax-label>\n <ax-color-box [(ngModel)]=\"bgcolor\"></ax-color-box>\n\n <ax-label>Quality of image (50-100%)</ax-label>\n <ax-number-box\n [changeOnScroll]=\"true\"\n [minValue]=\"50\"\n [maxValue]=\"100\"\n [(ngModel)]=\"qualityComputed\"\n name=\"Quality\"\n >\n </ax-number-box>\n\n <ax-label>Scale</ax-label>\n <ax-number-box [changeOnScroll]=\"true\" [minValue]=\"1\" [(ngModel)]=\"scale\" name=\"scale\"> </ax-number-box>\n </div>\n\n <ax-footer>\n <ax-prefix> </ax-prefix>\n <ax-suffix>\n <ax-button text=\"Cancel\" look=\"solid\" (onClick)=\"handleClose(true)\"> </ax-button>\n <ax-button text=\"Print\" look=\"solid\" color=\"primary\" (onClick)=\"handleClose()\">\n <ax-icon class=\"fa-solid fa-print\"> </ax-icon>\n </ax-button>\n </ax-suffix>\n </ax-footer>`,\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [\n FormsModule,\n AXCheckBoxModule,\n AXNumberBoxModule,\n AXTextBoxModule,\n AXLabelModule,\n AXDecoratorModule,\n AXButtonModule,\n AXColorBoxModule,\n ],\n})\nexport class AXMOrgChartPrintPage extends AXBasePageComponent {\n private data: AXPDomToImageOptions;\n\n protected ratio = signal(false);\n protected baseWidth = signal<number | undefined>(undefined);\n protected baseHeight = signal<number | undefined>(undefined);\n\n protected bgcolor = model<string>();\n protected width = model<number>();\n protected height = model<number>();\n protected quality = model<number>();\n protected qualityComputed = linkedSignal(() => (this.data.quality ?? 1) * 100);\n protected scale = model<number>();\n\n #init = afterNextRender(() => {\n this.bgcolor.set(this.data.bgcolor);\n\n this.width.set(this.data.width);\n this.baseWidth.set(this.data.width);\n\n this.height.set(this.data.height);\n this.baseHeight.set(this.data.height);\n\n this.quality.set(this.data.quality);\n this.scale.set(this.data.scale);\n });\n\n protected calculateRatio(event: AXValueChangedEvent, type: 'width' | 'height'): void {\n if (!this.ratio() || !event.isUserInteraction) return;\n const value = event.value;\n if (type === 'width') {\n const newHeight = Math.round((value / this.baseWidth()!) * this.baseHeight()! * 100) / 100;\n this.height.set(newHeight);\n this.width.set(value);\n } else {\n const newWidth = Math.round((value / this.baseHeight()!) * this.baseWidth()! * 100) / 100;\n this.width.set(newWidth);\n this.height.set(value);\n }\n }\n\n protected async handleClose(isCanceled = false) {\n this.close({\n bgcolor: this.bgcolor(),\n width: this.width(),\n height: this.height(),\n quality: this.qualityComputed() / 100,\n scale: this.scale(),\n isCanceled,\n });\n }\n}\n","// AXPPdfService\nimport { AXPopupService } from '@acorex/components/popup';\nimport { Injectable, inject } from '@angular/core';\nimport { AXMOrgChartPrintPage } from './export-popup';\nimport { triggerBrowserDownload } from './dom-graphic.util';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPExportService {\n popupService = inject(AXPopupService);\n async generateBlobFromElement(element: HTMLElement, blobOptions?: AXPDomToImageOptions): Promise<Blob> {\n const domtoimage = (await import('dom-to-image')).default;\n\n const originalWidth = element.scrollWidth;\n const originalHeight = element.scrollHeight;\n\n let popup: boolean | undefined,\n options: AXPDomToImageOptions = {},\n newOptions: AXPDomToImageOptions = {};\n\n if (blobOptions) {\n ({ popup, ...options } = blobOptions);\n }\n\n if (popup) {\n const result = await this.popupService.open(AXMOrgChartPrintPage, {\n header: true,\n size: 'fit',\n draggable: true,\n hasBackdrop: true,\n title: 'Export Options',\n data: { data: options },\n });\n if (result.data.isCanceled) {\n throw new Error('Process is Canceled by User!');\n } else {\n newOptions = { ...options, ...result.data };\n }\n }\n\n return domtoimage.toBlob(element, {\n ...newOptions,\n width: (newOptions.width ?? originalWidth) * (newOptions?.scale ?? 1),\n height: (newOptions.height ?? originalHeight) * (newOptions?.scale ?? 1),\n style: {\n transform: `scale(${newOptions?.scale ?? 1})`,\n transformOrigin: 'top left',\n },\n });\n }\n\n download(blob: Blob, filename: string): void {\n triggerBrowserDownload(blob, filename);\n }\n}\n\nexport interface AXPDomToImageOptions {\n popup?: true;\n filter?: (node: Node) => boolean;\n bgcolor?: string;\n width?: number;\n height?: number;\n style?: {};\n quality?: number;\n imagePlaceholder?: string;\n cacheBust?: boolean;\n scale?: number;\n}\n","import { AXDataSourceFilterOption } from '@acorex/cdk/common';\n\nexport function AXPCleanNestedFilters(filters: AXDataSourceFilterOption[]): AXDataSourceFilterOption[] {\n return filters\n .map((filter) => {\n if (!filter) return undefined;\n if (filter.filters?.length) {\n const cleanedNestedFilters = AXPCleanNestedFilters(filter.filters);\n if (!filter.field && !filter.operator && cleanedNestedFilters.length === 0) {\n return undefined;\n }\n return {\n ...filter,\n filters: cleanedNestedFilters.filter(Boolean),\n };\n }\n if ((!filter.value && filter.value != false) || filter.value === 'unknown') {\n return undefined;\n }\n return filter;\n })\n .filter(Boolean) as AXDataSourceFilterOption[];\n}\n","//#region ----- Locale codes -----\r\r\n/** Normalizes AvailableLanguages values (string codes or `{ code }` rows) to BCP-47 locale strings. */\r\r\nexport function normalizeAvailableLanguageCodes(raw: unknown): string[] {\r\r\n if (!Array.isArray(raw)) {\r\r\n return [];\r\r\n }\r\r\n\r\r\n const codes: string[] = [];\r\r\n for (const entry of raw) {\r\r\n if (typeof entry === 'string') {\r\r\n const trimmed = entry.trim();\r\r\n if (trimmed) {\r\r\n codes.push(trimmed);\r\r\n }\r\r\n continue;\r\r\n }\r\r\n\r\r\n if (entry && typeof entry === 'object' && 'code' in entry) {\r\r\n const code = (entry as { code: unknown }).code;\r\r\n if (typeof code === 'string' && code.trim()) {\r\r\n codes.push(code.trim());\r\r\n }\r\r\n }\r\r\n }\r\r\n\r\r\n return codes;\r\r\n}\r\r\n\r\r\nexport function primaryLanguageSubtag(localeCode: string): string {\r\r\n return localeCode.trim().toLowerCase().split(/[-_]/u)[0] ?? '';\r\r\n}\r\r\n//#endregion\r\r\n","import { InjectionToken } from '@angular/core';\nimport { AXPLanguage, AXPLocaleProfile } from './regional.types';\n\n/**\n * Narrow API for reading app locale profiles and active languages.\n * Implemented by locale-management; consumed by platform layout without importing the module (avoids circular deps).\n */\nexport interface AXPLocaleManagementPort {\n /**\n * Built-in locale profiles for the Available Languages picker.\n * May be narrowed by `configureLocaleProfileCatalogCodes` (deploy/app boot).\n */\n getLocaleProfiles(): Promise<AXPLocaleProfile[]>;\n /**\n * Locale profiles allowed for the current tenant (Platform AvailableLanguages,\n * overridden by Tenant when set), intersected with {@link getLocaleProfiles}.\n */\n getAvailableLocaleProfiles(): Promise<AXPLocaleProfile[]>;\n getLanguages(): Promise<AXPLanguage[]>;\n}\n\nexport const AXP_LOCALE_MANAGEMENT_PORT = new InjectionToken<AXPLocaleManagementPort>('AXP_LOCALE_MANAGEMENT_PORT');\n","//#region ----- Imports -----\nimport { AXPPlatformScope, AXPRegionalSetting } from '@acorex-platform/framework-shared/core';\nimport type { AXPSettingsServiceInterface } from '../settings/settings.service';\nimport { normalizeAvailableLanguageCodes } from './locale-code.util';\n//#endregion\n\n//#region ----- Available languages -----\n/**\n * Resolves tenant AvailableLanguages when the tenant scope has an explicit override;\n * otherwise falls back to the effective merged value (tenant → platform).\n */\nexport async function resolveEffectiveAvailableLanguageCodes(\n settingsService: AXPSettingsServiceInterface,\n): Promise<string[]> {\n const key = AXPRegionalSetting.AvailableLanguages;\n\n await settingsService.ensureScopeLoaded(AXPPlatformScope.Tenant);\n await settingsService.ensureScopeLoaded(AXPPlatformScope.Platform);\n\n try {\n const tenantValues = await settingsService.scope(AXPPlatformScope.Tenant).all();\n if (Object.prototype.hasOwnProperty.call(tenantValues, key)) {\n return normalizeAvailableLanguageCodes(tenantValues[key]);\n }\n } catch {\n // fall through to effective merged value\n }\n\n return normalizeAvailableLanguageCodes(await settingsService.get<unknown>(key));\n}\n//#endregion\n","//#region ---- Versioning Types ----\n\nexport interface AXPVersionStream {\n id: string;\n entityType: string;\n entityId: string;\n createdAt: string;\n}\n\nexport enum AXVChangeType {\n Create = 'Create',\n Update = 'Update',\n Delete = 'Delete',\n}\n\nexport type CanonicalChangeOp = 'add' | 'remove' | 'replace' | 'rename' | 'metadata';\n\nexport interface CanonicalChange {\n path: string;\n op: CanonicalChangeOp;\n oldValue?: unknown;\n newValue?: unknown;\n meta?: Record<string, unknown>;\n}\n\n/** Ready-to-render history sub-row stamped at write time (MLS maps or resolved strings). */\nexport interface AXPVersionChangeLine {\n path: string;\n field: string | Record<string, string>;\n text: string | Record<string, string>;\n}\n\nexport interface AXPVersionEntry {\n id: string;\n streamId: string;\n versionNumber: number;\n changeType: AXVChangeType;\n changedBy: string;\n /**\n * Display name for {@link changedBy}, stamped at write time when available.\n * When omitted, UI falls back to id / \"System\".\n */\n changedByName?: string;\n changedAt: string;\n snapshotJson: unknown;\n patchFromPrevJson: CanonicalChange[];\n /** Human-readable summary (plain string or multi-language map). */\n summary?: string | Record<string, string>;\n /**\n * Prebuilt field/text lines for the timeline. When present, UI renders these\n * without client-side lookup/file/title resolution.\n */\n changeLines?: AXPVersionChangeLine[];\n metadataJson?: unknown;\n}\n\nexport interface AXPVersionChange {\n id?: number;\n versionEntryId: string;\n path: string;\n op: CanonicalChangeOp;\n oldValue?: unknown;\n newValue?: unknown;\n}\n\nexport interface VersionedFileInfo {\n id: string;\n name: string;\n size: number;\n mime: string;\n hash: string;\n url?: string;\n thumbUrl?: string;\n}\n\n//#endregion\n\n//#region ---- Service Contract ----\n\nexport abstract class AXPVersioningService {\n abstract getStreamIdIfExists(entityType: string, entityId: string): Promise<string | null>;\n abstract listEntries(streamId: string, options?: { limit?: number; offset?: number }): Promise<AXPVersionEntry[]>;\n abstract getUiFriendlyDiff(streamId: string, v1: number, v2: number): Promise<Array<{ badge: string; path: string; summary: string; oldValue?: unknown; newValue?: unknown }>>;\n}\n\n//#endregion\n\n\n","import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport { Injectable, inject } from '@angular/core';\nimport { NavigationExtras } from '@angular/router';\n\nimport { AXPTabNavigationService } from '../tab-navigation/tab-navigation.service';\n\n//#region ----- Types -----\n\nexport interface AXPNavigateCommandInput {\n type?: 'router' | 'modal';\n path?: string;\n options?: {\n path?: string;\n extras?: NavigationExtras & { target?: string };\n };\n}\n\n//#endregion\n\n//#region ----- Helpers -----\n\nexport function axpResolveNavigatePath(input?: AXPNavigateCommandInput | null): string | undefined {\n if (!input) {\n return undefined;\n }\n\n if (typeof input.options?.path === 'string') {\n return input.options.path;\n }\n\n if (typeof input.path === 'string') {\n return input.path;\n }\n\n return undefined;\n}\n\n/**\n * Replaces `{app}` / `{{app}}` with the current session application name.\n * Example: `{app}/drive/user` → `safetyminder/drive/user`\n */\nexport function axpInterpolateNavigatePath(path: string, appName?: string | null): string {\n if (!appName) {\n return path;\n }\n\n return path.replaceAll('{{app}}', appName).replaceAll('{app}', appName);\n}\n\nfunction axpResolveNavigateExtras(\n input?: AXPNavigateCommandInput | null,\n): (NavigationExtras & { target?: string }) | undefined {\n return input?.options?.extras;\n}\n\n//#endregion\n\n//#region ----- Navigate Command -----\n\n@Injectable({ providedIn: 'root' })\nexport class AXPNavigateCommand implements AXPCommand<AXPNavigateCommandInput> {\n private readonly tabNavigation = inject(AXPTabNavigationService);\n private readonly sessionService = inject(AXPSessionService);\n\n async execute(input: AXPNavigateCommandInput = {}): AXPCommandExecuteResultPromise {\n const rawPath = axpResolveNavigatePath(input);\n if (!rawPath) {\n console.error('Path is required for navigate command');\n return {\n success: false,\n message: {\n text: 'Path is required for navigate command',\n },\n };\n }\n\n const path = axpInterpolateNavigatePath(rawPath, this.sessionService.application?.name);\n const extras = axpResolveNavigateExtras(input);\n\n if (path.toLowerCase().startsWith('http') || extras?.target === 'blank') {\n window.open(path, '_blank');\n } else {\n await this.tabNavigation.navigate(path, extras);\n }\n\n return { success: true, kind: 'object', data: undefined };\n }\n}\n\n//#endregion\n","/**\n * Build-time only. Do not import from Angular modules.\n */\n\nimport { AXP_COMMAND_DEFINITION_CATEGORY_PLATFORM, defineCommand } from '@acorex-platform/framework-shared/runtime';\n\nexport const axpNavigateCommandDefinition = defineCommand({\n key: 'navigate',\n title: 'Navigate',\n description:\n 'AXPNavigateCommand resolves a router path from input.path or input.options.path, opens external URLs in a new tab, otherwise navigates via AXPTabNavigationService.',\n executionMode: 'frontend',\n inputs: [\n {\n name: 'path',\n title: 'Path',\n description: 'Router path or absolute URL (AXPNavigateCommandInput.path or input.options.path).',\n interface: { name: 'text-editor' },\n validations: [{ rule: 'required' }],\n },\n ],\n outcomes: {\n mode: 'static',\n values: ['success', 'failure'],\n },\n ai: {\n tags: ['navigation', 'router'],\n },\n categories: [AXP_COMMAND_DEFINITION_CATEGORY_PLATFORM],\n});\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i5","i3","i4","filter","i1.AXPErrorHandlerRegistryService","i1.AXPFileStorageService","resolveMultiLanguageString","i1.AXPKeyboardShortcutsHelpService","i6"],"mappings":"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"}
|