@acorex-platform/framework-client 0.0.69 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/fesm2022/acorex-platform-framework-client-common.mjs +48 -8
  2. package/fesm2022/acorex-platform-framework-client-common.mjs.map +1 -1
  3. package/fesm2022/{acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-40YjUhSy.mjs → acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-i9oZEXUR.mjs} +144 -88
  4. package/fesm2022/acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-i9oZEXUR.mjs.map +1 -0
  5. package/fesm2022/{acorex-platform-framework-client-layout-entity-attachments-page.component-TJwyeB27.mjs → acorex-platform-framework-client-layout-entity-attachments-page.component-DyrvSBEY.mjs} +2 -2
  6. package/fesm2022/{acorex-platform-framework-client-layout-entity-attachments-page.component-TJwyeB27.mjs.map → acorex-platform-framework-client-layout-entity-attachments-page.component-DyrvSBEY.mjs.map} +1 -1
  7. package/fesm2022/{acorex-platform-framework-client-layout-entity-bulk-entity.command-CgLVcZHZ.mjs → acorex-platform-framework-client-layout-entity-bulk-entity.command-B8s_JEV8.mjs} +2 -2
  8. package/fesm2022/{acorex-platform-framework-client-layout-entity-bulk-entity.command-CgLVcZHZ.mjs.map → acorex-platform-framework-client-layout-entity-bulk-entity.command-B8s_JEV8.mjs.map} +1 -1
  9. package/fesm2022/{acorex-platform-framework-client-layout-entity-gallery-page.component-_ZIlTKUf.mjs → acorex-platform-framework-client-layout-entity-gallery-page.component-fATD9Uax.mjs} +2 -2
  10. package/fesm2022/{acorex-platform-framework-client-layout-entity-gallery-page.component-_ZIlTKUf.mjs.map → acorex-platform-framework-client-layout-entity-gallery-page.component-fATD9Uax.mjs.map} +1 -1
  11. package/fesm2022/acorex-platform-framework-client-layout-entity.mjs +1 -1
  12. package/fesm2022/acorex-platform-framework-client-layout-views.mjs +6 -2
  13. package/fesm2022/acorex-platform-framework-client-layout-views.mjs.map +1 -1
  14. package/fesm2022/{acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-Dlk7A1vo.mjs → acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-Drmmu4HQ.mjs} +5 -5
  15. package/fesm2022/acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-Drmmu4HQ.mjs.map +1 -0
  16. package/fesm2022/{acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-Cl1--FuB.mjs → acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-BiuahYd8.mjs} +2 -2
  17. package/fesm2022/{acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-Cl1--FuB.mjs.map → acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-BiuahYd8.mjs.map} +1 -1
  18. package/fesm2022/{acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-cgSIlPcq.mjs → acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-CU_5b_te.mjs} +2 -2
  19. package/fesm2022/{acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-cgSIlPcq.mjs.map → acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-CU_5b_te.mjs.map} +1 -1
  20. package/fesm2022/acorex-platform-framework-client-layout-widgets.mjs +1 -1
  21. package/package.json +2 -2
  22. package/types/acorex-platform-framework-client-common.d.ts +29 -5
  23. package/types/acorex-platform-framework-client-layout-entity.d.ts +9 -9
  24. package/types/acorex-platform-framework-client-layout-views.d.ts +2 -0
  25. package/fesm2022/acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-40YjUhSy.mjs.map +0 -1
  26. package/fesm2022/acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-Dlk7A1vo.mjs.map +0 -1
@@ -4,14 +4,14 @@ import { AXToastService } from '@acorex/components/toast';
4
4
  import * as i3$1 from '@acorex/core/translation';
5
5
  import { AXTranslationService, AXTranslationModule, resolveMultiLanguageString, translateSync } from '@acorex/core/translation';
6
6
  import * as i4$3 from '@acorex-platform/framework-client/common';
7
- import { AXPNotFoundError, AXPMenuRouteAccessService, AXPSettingsService, AXPCommonSettings, resolveEntityCreateListBehavior, platformErrorI18nKey, extractRequestErrorInfo, axpNavigateAppPath, AXPFileTypeProviderService, AXPFileStorageService, resolveFileTypeDisplay, resolveEntityRowDisplayTitle, resolveEntityModifyPopupTitle, commandMessageTextForError, resolveStoredImageDisplayUrl, isStoredImageFileId, AXPFilterOperatorMiddlewareService, AXP_ENTITY_LIST_DISPLAY_MODE_DEFAULT, ENTITY_LIST_DEFAULT_INSTANCE_ID, axpNormalizeEntityListInstanceId, axpGetEntityListInstanceIdFromParamMap, axpRedirectToNotFound, CONTAINS_OPER, toExecuteCommandFailureResult, AXPLocalEntityEngine, AXPLocalEntityRealtimeBridge, AXP_LOCAL_ENTITY_DEFAULT_MAX_ITEMS, resolveSearchableText, evaluateEntityDisplayTemplate, AXPCleanNestedFilters, AXPEntityDetailsNavTrailService, axpComposeEntityDetailsNavTrail, axpIsEntityRecordNotFound, coerceAXPSettingRawValueByKind, AXPDefaultMultiLanguageConfigService, withDefaultMultiLanguageOnWidgetNodeTree, axpIsEntityListPath, axpIsEntityDetailsPath, axpParseEntityListRoute, axpParseEntityDetailsRoute, axpSaveEntityListReturnUrl, AXPMenuRouteGuard, AXP_NOT_FOUND_ROUTE, AXP_PROTECTED_ROUTE_GUARDS, AXP_SEARCH_DEFINITION_PROVIDER, AXP_SEARCH_DEFINITION_LAZY_RESOLVER } from '@acorex-platform/framework-client/common';
7
+ import { AXPNotFoundError, AXPSettingsService, AXPCommonSettings, resolveEntityCreateListBehavior, platformErrorI18nKey, extractRequestErrorInfo, axpNavigateAppPath, AXPFileTypeProviderService, AXPFileStorageService, resolveFileTypeDisplay, resolveEntityRowDisplayTitle, resolveEntityModifyPopupTitle, commandMessageTextForError, resolveStoredImageDisplayUrl, isStoredImageFileId, AXPFilterOperatorMiddlewareService, AXP_ENTITY_LIST_DISPLAY_MODE_DEFAULT, ENTITY_LIST_DEFAULT_INSTANCE_ID, axpNormalizeEntityListInstanceId, axpGetEntityListInstanceIdFromParamMap, axpRedirectToNotFound, CONTAINS_OPER, toExecuteCommandFailureResult, AXPLocalEntityEngine, AXPLocalEntityRealtimeBridge, AXP_LOCAL_ENTITY_DEFAULT_MAX_ITEMS, resolveSearchableText, evaluateEntityDisplayTemplate, AXPCleanNestedFilters, AXPEntityDetailsNavTrailService, axpComposeEntityDetailsNavTrail, axpIsEntityRecordNotFound, coerceAXPSettingRawValueByKind, AXPDefaultMultiLanguageConfigService, withDefaultMultiLanguageOnWidgetNodeTree, axpIsEntityListPath, axpIsEntityDetailsPath, axpParseEntityListRoute, axpParseEntityDetailsRoute, axpSaveEntityListReturnUrl, AXPMenuRouteGuard, AXP_NOT_FOUND_ROUTE, AXP_PROTECTED_ROUTE_GUARDS, AXP_ENTITY_VIEW_ACCESS, AXP_SEARCH_DEFINITION_PROVIDER, AXP_SEARCH_DEFINITION_LAZY_RESOLVER } from '@acorex-platform/framework-client/common';
8
8
  import { AXPWidgetsCatalog, runtimeCommandPayloadData, createRandomUuid, AXPRequestError, runtimeQueryPayloadData, runtimeQueryCollectionData, runtimeQueryFailure, runtimeQuerySuccessObject, runtimeCommandFailure, runtimeCommandSuccessObject, resolveActionLook, listThemeSurfaceClasses, parseRuntimeHexSurface, AXP_THEME_SURFACE_STYLES, AXPWidgetsList, AXPSystemActionType, coerceFilterDisplayText, AXPPlatformScope, flattenQueryFilterUserGroups, AXP_QUERY_QUICK_SEARCH_FIELD, wrapQueryFilterRoot, isPersistableFilterQuery, collectQueryFilterLeaves, isCompleteFilterCondition, resolveFilterQueryIdentityField, extractValue, setSmart, getChangedPaths, isSelectionValueEqual, toAxpGridItemWidgetOptions, runtimeQuerySuccessCollection } from '@acorex-platform/framework-shared/core';
9
9
  import { AXPDeviceService, AXPExpressionEvaluatorService, AXPEntityBroadcastService, AXPHookService, AXPDebugService, AXPDataGenerator, AXPContextEvalFactory, ensureRuntimeSurfaceClass, applyFilterArray, createCommandExpressionScope, toExpressionRecord, AXPDistributedEventListenerService, applySortArray, AXHighlightService, AXPColumnWidthService, objectKeyValueTransforms, setupPopupFooterKeyboardShortcuts, AXPContextStore, AXPModuleManifestRegistry, provideAppStartUpTask, AXP_APP_STARTUP_PRIORITY, defaultColumnWidthProvider, AXP_COLUMN_WIDTH_PROVIDER } from '@acorex-platform/framework-client/core';
10
10
  import { AXPLayoutBuilderService, AXPDialogOpener, LayoutBuilderModule } from '@acorex-platform/framework-client/layout/builder';
11
11
  import * as i0 from '@angular/core';
12
12
  import { InjectionToken, inject, Injector, runInInjectionContext, Injectable, signal, output, input, computed, effect, ChangeDetectionStrategy, Component, viewChild, untracked, HostBinding, model, ViewEncapsulation, ElementRef, EnvironmentInjector, NgModule, ChangeDetectorRef, Input, afterNextRender, viewChildren, linkedSignal, DestroyRef, makeEnvironmentProviders } from '@angular/core';
13
13
  import { cloneDeep, merge, get, isNil, set, isArray, isString, castArray, has, isPlainObject, orderBy, defaultTo, isEmpty, isEqual, isObjectLike } from 'lodash-es';
14
- import { Subject, filter, takeUntil, map, distinctUntilChanged, fromEvent, auditTime, merge as merge$1, combineLatest } from 'rxjs';
14
+ import { Subject, combineLatest, map, filter, takeUntil, distinctUntilChanged, fromEvent, auditTime, merge as merge$1 } from 'rxjs';
15
15
  import { AXPSessionService } from '@acorex-platform/framework-client/auth';
16
16
  import { Router, NavigationStart, ActivatedRoute, ROUTES } from '@angular/router';
17
17
  import { AXDialogService } from '@acorex/components/dialog';
@@ -52,6 +52,7 @@ import * as i2 from '@acorex/components/badge';
52
52
  import { AXBadgeModule } from '@acorex/components/badge';
53
53
  import * as i6 from '@acorex/components/dropdown';
54
54
  import { AXDropdownModule } from '@acorex/components/dropdown';
55
+ import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
55
56
  import { AXOverlayService } from '@acorex/cdk/overlay';
56
57
  import { AXLocaleService } from '@acorex/core/locale';
57
58
  import { AXPlatform } from '@acorex/core/platform';
@@ -71,7 +72,6 @@ import { AXTagBoxModule } from '@acorex/components/tag-box';
71
72
  import { AXValidationModule } from '@acorex/core/validation';
72
73
  import { AXLookupComponent } from '@acorex/components/lookup';
73
74
  import { AXHighlightTextComponent } from '@acorex/components/highlight';
74
- import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
75
75
  import * as i1$7 from '@acorex/components/data-table';
76
76
  import { AXDataTableComponent, AXDataTableModule } from '@acorex/components/data-table';
77
77
  import * as i2$1 from '@acorex/components/tabs';
@@ -2412,31 +2412,46 @@ function sortMergedSections(mainSections, extraSections, mainSectionIds) {
2412
2412
  return [...beforeSections, ...sortedMiddleBlock, ...afterSections];
2413
2413
  }
2414
2414
 
2415
+ const INDIVIDUAL_SCOPE = 'individual';
2416
+ const VIEW_TYPE = 'view';
2415
2417
  /**
2416
- * Route for `/{app}/m/{module}/e/{entity}/{id}/view`, matching Entity:OpenDetails.
2417
- * The id segment is not part of menu matching; callers may pass the real record id.
2418
+ * Permissions of the individual view action on `interfaces.master.list.actions`.
2419
+ * Prefers `default === true`, otherwise the first individual view action.
2420
+ * `null` means the hyperlink stays available: no view action, or no permissions declared.
2421
+ * Match is by type and scope. The command name is not part of the match.
2418
2422
  */
2419
- function buildEntityDetailsRoute(applicationName, entity, id) {
2420
- const [moduleName, entityName] = entity.split('.');
2421
- if (!applicationName || !moduleName || !entityName || !id) {
2423
+ function resolveIndividualViewPermissions(actions) {
2424
+ const views = (actions ?? []).filter((action) => action.scope === INDIVIDUAL_SCOPE && action.type === VIEW_TYPE);
2425
+ if (views.length === 0) {
2422
2426
  return null;
2423
2427
  }
2424
- return {
2425
- commands: ['/', applicationName, 'm', moduleName, 'e', entityName, id, 'view'],
2426
- queryParams: { page: entityName },
2427
- };
2428
+ const selected = views.find((action) => action.default === true) ?? views[0];
2429
+ const permissions = selected.permissions;
2430
+ if (!permissions || permissions.length === 0) {
2431
+ return null;
2432
+ }
2433
+ return permissions;
2434
+ }
2435
+ /**
2436
+ * Session stamp for cached details-access decisions.
2437
+ * Changes when authorization, application, permissions, or features change.
2438
+ */
2439
+ function buildEntityDetailsAccessStamp(input) {
2440
+ const features = input.features
2441
+ .map((feature) => `${feature.name}:${String(feature.value ?? '')}`)
2442
+ .join('\n');
2443
+ return `${input.isAuthorized ? '1' : '0'}|${input.applicationName}|${input.permissions.join('\n')}|${features}`;
2428
2444
  }
2429
2445
 
2430
2446
  /**
2431
- * Same menu-policy gate as Entity:OpenDetails.
2432
- * Lookup column links and the detail popover use this before loading a related record.
2447
+ * Whether the current session may navigate to an entity details view.
2448
+ * Lookup preview cards stay available. This gates the Open Details action and deep links.
2433
2449
  */
2434
2450
  class AXPEntityDetailsAccessService {
2435
2451
  constructor() {
2436
2452
  //#region ----- Services & Dependencies -----
2437
- this.router = inject(Router);
2438
2453
  this.sessionService = inject(AXPSessionService);
2439
- this.menuRouteAccess = inject(AXPMenuRouteAccessService);
2454
+ this.entityRegistry = inject(AXPEntityDefinitionRegistryService);
2440
2455
  //#endregion
2441
2456
  //#region ----- State -----
2442
2457
  this.accessStamp = '';
@@ -2446,22 +2461,17 @@ class AXPEntityDetailsAccessService {
2446
2461
  //#region ----- Public Methods -----
2447
2462
  /**
2448
2463
  * Whether the current session may open the entity details route.
2449
- * Result is per entity key; the record id does not change menu policy.
2464
+ * The record id does not change the view-action permission.
2465
+ * Missing entity, missing view action, or an empty permission list stays allowed.
2450
2466
  */
2451
- async canOpen(entity, id = '0') {
2452
- const applicationName = this.sessionService.application?.name;
2453
- const route = buildEntityDetailsRoute(applicationName, entity, id);
2454
- if (!route) {
2455
- return false;
2456
- }
2467
+ async canOpen(entity, _id = '0') {
2457
2468
  this.syncStamp();
2458
2469
  const cacheKey = entity;
2459
2470
  const cached = this.decisions.get(cacheKey);
2460
2471
  if (cached) {
2461
2472
  return cached;
2462
2473
  }
2463
- const url = this.router.serializeUrl(this.router.createUrlTree(route.commands, { queryParams: route.queryParams }));
2464
- const pending = this.menuRouteAccess.canAccessUrl(url);
2474
+ const pending = this.resolveCanOpen(entity);
2465
2475
  this.decisions.set(cacheKey, pending);
2466
2476
  void pending.then(() => undefined, () => {
2467
2477
  if (this.decisions.get(cacheKey) === pending) {
@@ -2472,21 +2482,45 @@ class AXPEntityDetailsAccessService {
2472
2482
  }
2473
2483
  //#endregion
2474
2484
  //#region ----- Private Methods -----
2485
+ async resolveCanOpen(entity) {
2486
+ const definition = await this.tryResolveEntity(entity);
2487
+ const permissions = resolveIndividualViewPermissions(definition?.interfaces?.master?.list?.actions);
2488
+ if (!permissions) {
2489
+ return true;
2490
+ }
2491
+ return this.sessionService.authorize(...permissions);
2492
+ }
2475
2493
  /** Drop cached decisions when application, permissions, or features change. */
2476
2494
  syncStamp() {
2477
- const applicationName = this.sessionService.application?.name ?? '';
2478
- const permissions = this.sessionService.permissions.join('\n');
2479
- const features = this.sessionService.features
2480
- .map((feature) => `${feature.name}:${String(feature.value ?? '')}`)
2481
- .join('\n');
2482
- const authorized = this.sessionService.isAuthorized ? '1' : '0';
2483
- const stamp = `${authorized}|${applicationName}|${permissions}|${features}`;
2495
+ const stamp = buildEntityDetailsAccessStamp({
2496
+ isAuthorized: this.sessionService.isAuthorized,
2497
+ applicationName: this.sessionService.application?.name ?? '',
2498
+ permissions: this.sessionService.permissions,
2499
+ features: this.sessionService.features,
2500
+ });
2484
2501
  if (stamp === this.accessStamp) {
2485
2502
  return;
2486
2503
  }
2487
2504
  this.accessStamp = stamp;
2488
2505
  this.decisions.clear();
2489
2506
  }
2507
+ async tryResolveEntity(entityKey) {
2508
+ const separator = entityKey.indexOf('.');
2509
+ if (separator <= 0 || separator >= entityKey.length - 1) {
2510
+ return null;
2511
+ }
2512
+ const moduleName = entityKey.slice(0, separator);
2513
+ const entityName = entityKey.slice(separator + 1);
2514
+ try {
2515
+ return await this.entityRegistry.resolve(moduleName, entityName);
2516
+ }
2517
+ catch (error) {
2518
+ if (error instanceof AXPNotFoundError) {
2519
+ return null;
2520
+ }
2521
+ throw error;
2522
+ }
2523
+ }
2490
2524
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPEntityDetailsAccessService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2491
2525
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPEntityDetailsAccessService, providedIn: 'root' }); }
2492
2526
  }
@@ -2495,6 +2529,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
2495
2529
  args: [{ providedIn: 'root' }]
2496
2530
  }] });
2497
2531
 
2532
+ /**
2533
+ * Route for `/{app}/m/{module}/e/{entity}/{id}/view`, matching Entity:OpenDetails.
2534
+ * The id segment is not part of menu matching; callers may pass the real record id.
2535
+ */
2536
+ function buildEntityDetailsRoute(applicationName, entity, id) {
2537
+ const [moduleName, entityName] = entity.split('.');
2538
+ if (!applicationName || !moduleName || !entityName || !id) {
2539
+ return null;
2540
+ }
2541
+ return {
2542
+ commands: ['/', applicationName, 'm', moduleName, 'e', entityName, id, 'view'],
2543
+ queryParams: { page: entityName },
2544
+ };
2545
+ }
2546
+
2498
2547
  function resolveOpenEntityDetailsInput(input = {}) {
2499
2548
  const context = resolveEntityActionCommandInput(input);
2500
2549
  return {
@@ -8204,11 +8253,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
8204
8253
  }], ctorParameters: () => [], propDecorators: { entity: [{ type: i0.Input, args: [{ isSignal: true, alias: "entity", required: true }] }], layout: [{ type: i0.Input, args: [{ isSignal: true, alias: "layout", required: false }] }], row: [{ type: i0.Input, args: [{ isSignal: true, alias: "row", required: true }] }], fields: [{ type: i0.Input, args: [{ isSignal: true, alias: "fields", required: false }] }], userStylingRules: [{ type: i0.Input, args: [{ isSignal: true, alias: "userStylingRules", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], embedded: [{ type: i0.Input, args: [{ isSignal: true, alias: "embedded", required: false }] }], elevated: [{ type: i0.Input, args: [{ isSignal: true, alias: "elevated", required: false }] }], disableLookupPopover: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableLookupPopover", required: false }] }], fillHost: [{ type: i0.Input, args: [{ isSignal: true, alias: "fillHost", required: false }] }], extraExpanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "extraExpanded", required: false }] }, { type: i0.Output, args: ["extraExpandedChange"] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }], showNewBadge: [{ type: i0.Input, args: [{ isSignal: true, alias: "showNewBadge", required: false }] }], showSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSelection", required: false }] }], showClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClose", required: false }] }], primaryActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "primaryActions", required: false }] }], primaryActionLook: [{ type: i0.Input, args: [{ isSignal: true, alias: "primaryActionLook", required: false }] }], secondaryActionLoader: [{ type: i0.Input, args: [{ isSignal: true, alias: "secondaryActionLoader", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], commandClick: [{ type: i0.Output, args: ["commandClick"] }], closeClick: [{ type: i0.Output, args: ["closeClick"] }] } });
8205
8254
 
8206
8255
  class AXPEntityDetailPopoverComponent {
8256
+ //#endregion
8257
+ //#region ----- Lifecycle -----
8207
8258
  constructor() {
8208
8259
  //#region ----- Services & Dependencies -----
8209
8260
  this.commandService = inject(AXPCommandService);
8210
8261
  this.queryService = inject(AXPQueryService);
8211
8262
  this.cardFieldsResolver = inject(AXPEntityCardFieldsResolver);
8263
+ this.detailsAccess = inject(AXPEntityDetailsAccessService);
8264
+ this.sessionService = inject(AXPSessionService);
8265
+ /** Re-check the Open Details action when application, permissions, or features change. */
8266
+ this.accessRevision = toSignal(combineLatest([
8267
+ this.sessionService.application$,
8268
+ this.sessionService.permissions$,
8269
+ this.sessionService.features$,
8270
+ ]).pipe(map(([application, permissions, features]) => {
8271
+ const featureStamp = features
8272
+ .map((feature) => `${feature.name}:${String(feature.value ?? '')}`)
8273
+ .join('\n');
8274
+ return `${this.sessionService.isAuthorized ? '1' : '0'}|${application?.name ?? ''}|${permissions.join('\n')}|${featureStamp}`;
8275
+ })), { initialValue: '' });
8212
8276
  //#endregion
8213
8277
  //#region ----- Inputs -----
8214
8278
  this.entity = input.required(/* @ts-ignore */
@@ -8227,6 +8291,10 @@ class AXPEntityDetailPopoverComponent {
8227
8291
  ...(ngDevMode ? [{ debugName: "entityData" }] : /* istanbul ignore next */ []));
8228
8292
  this.isLoadingDetails = signal(false, /* @ts-ignore */
8229
8293
  ...(ngDevMode ? [{ debugName: "isLoadingDetails" }] : /* istanbul ignore next */ []));
8294
+ /** View-action permission for the Open Details footer. Hidden until the check allows it. */
8295
+ this.canOpenDetails = signal(false, /* @ts-ignore */
8296
+ ...(ngDevMode ? [{ debugName: "canOpenDetails" }] : /* istanbul ignore next */ []));
8297
+ this.accessRequestId = 0;
8230
8298
  //#endregion
8231
8299
  //#region ----- Computed Properties -----
8232
8300
  this.cardLayout = computed(() => {
@@ -8270,7 +8338,7 @@ class AXPEntityDetailPopoverComponent {
8270
8338
  /** Same footer slot the master-list card uses for primary row actions. */
8271
8339
  this.openDetailsActions = computed(() => {
8272
8340
  const definition = this.entityDefinition();
8273
- if (!definition) {
8341
+ if (!definition || !this.canOpenDetails()) {
8274
8342
  return [];
8275
8343
  }
8276
8344
  return [
@@ -8285,6 +8353,22 @@ class AXPEntityDetailPopoverComponent {
8285
8353
  ];
8286
8354
  }, /* @ts-ignore */
8287
8355
  ...(ngDevMode ? [{ debugName: "openDetailsActions" }] : /* istanbul ignore next */ []));
8356
+ effect(() => {
8357
+ this.accessRevision();
8358
+ const entity = this.entity();
8359
+ const id = this.entityId();
8360
+ if (!entity || id == null || id === '') {
8361
+ this.accessRequestId++;
8362
+ this.canOpenDetails.set(false);
8363
+ return;
8364
+ }
8365
+ const requestId = ++this.accessRequestId;
8366
+ void this.detailsAccess.canOpen(entity, String(id)).then((allowed) => {
8367
+ if (requestId === this.accessRequestId) {
8368
+ this.canOpenDetails.set(allowed);
8369
+ }
8370
+ });
8371
+ });
8288
8372
  }
8289
8373
  //#endregion
8290
8374
  //#region ----- Event Handlers -----
@@ -8335,7 +8419,7 @@ class AXPEntityDetailPopoverComponent {
8335
8419
  }
8336
8420
  }
8337
8421
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPEntityDetailPopoverComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
8338
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPEntityDetailPopoverComponent, isStandalone: true, selector: "axp-entity-detail-popover", inputs: { entity: { classPropertyName: "entity", publicName: "entity", isSignal: true, isRequired: true, transformFunction: null }, entityId: { classPropertyName: "entityId", publicName: "entityId", isSignal: true, isRequired: true, transformFunction: null }, requestClose: { classPropertyName: "requestClose", publicName: "requestClose", isSignal: true, isRequired: false, transformFunction: null }, breadcrumb: { classPropertyName: "breadcrumb", publicName: "breadcrumb", isSignal: true, isRequired: false, transformFunction: null } }, providers: [{ provide: AXP_SELECT_COLUMN_RESOLVE_QUERY, useValue: true }], ngImport: i0, template: "<div class=\"axp-entity-detail-popover\">\n @if (breadcrumb()) {\n <!-- ----- Optional lookup breadcrumb above the shared entity card ----- -->\n <div class=\"text-xs text-neutral-500 mb-2\">{{ breadcrumb() }}</div>\n }\n @if (isLoadingDetails()) {\n <!-- ----- Loading placeholder while Entity:GetDetails is fetched ----- -->\n <div class=\"axp-entity-detail-popover__loading\">\n @if (canClose()) {\n <!-- ----- Dismiss while the lookup card is still loading ----- -->\n <ax-button\n class=\"axp-entity-detail-popover__close ax-sm\"\n [look]=\"'blank'\"\n [color]=\"'default'\"\n [iconOnly]=\"true\"\n [attr.title]=\"('@general:actions.close.title' | translate | async)\"\n [attr.aria-label]=\"('@general:actions.close.title' | translate | async)\"\n (onClick)=\"onClose()\"\n >\n <i class=\"fa-light fa-xmark\" aria-hidden=\"true\"></i>\n </ax-button>\n }\n <axp-entity-card-skeleton\n [fieldCount]=\"skeletonFieldCount()\"\n [badgeCount]=\"skeletonBadgeCount()\"\n [showContent]=\"true\"\n [showFooter]=\"true\"\n [showAvatar]=\"showSkeletonAvatar()\"\n [elevated]=\"true\"\n />\n </div>\n }\n <!-- ----- Same card chrome as the master list; Open Details uses the card footer ----- -->\n @else if (entityDefinition(); as definition) {\n <!--->\n <!-- ----- Entity card when row details have loaded ----- -->\n @if (entityData(); as row) {\n <axp-entity-card\n [entity]=\"definition\"\n [layout]=\"cardLayout()\"\n [row]=\"row\"\n [fields]=\"cardFields()\"\n variant=\"card\"\n [interactive]=\"false\"\n [elevated]=\"true\"\n [showClose]=\"canClose()\"\n primaryActionLook=\"solid\"\n [disableLookupPopover]=\"true\"\n [primaryActions]=\"openDetailsActions()\"\n (commandClick)=\"onCardCommandClick($event)\"\n (closeClick)=\"onClose()\"\n />\n }\n }\n</div>\n", styles: [":host{display:block;border-radius:var(--radius-md, .375rem);width:min(600px,calc(100vw - 2rem));background-color:rgb(var(--ax-sys-color-lightest-surface));box-shadow:0 8px 16px #00000029,0 24px 48px #00000038,0 48px 96px #00000047}.axp-entity-detail-popover__loading{position:relative}.axp-entity-detail-popover__close{position:absolute;z-index:20;inset-block-start:.75rem;inset-inline-end:1rem}.axp-entity-detail-popover-overlay,.axp-entity-detail-popover-overlay.ax-overlay-container,.axp-entity-detail-popover-overlay.ax-overlay-pane,.axp-entity-detail-popover-overlay .ax-overlay-pane,.axp-entity-detail-popover-overlay .overlay-pane{width:min(600px,calc(100vw - 2rem))!important;min-width:min(600px,calc(100vw - 2rem));overflow:visible!important;background:transparent!important;border:none!important;box-shadow:none!important;padding:0!important}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPEntityCardComponent, selector: "axp-entity-card", inputs: ["entity", "layout", "row", "fields", "userStylingRules", "variant", "interactive", "embedded", "elevated", "disableLookupPopover", "fillHost", "extraExpanded", "selected", "showNewBadge", "showSelection", "showClose", "primaryActions", "primaryActionLook", "secondaryActionLoader"], outputs: ["extraExpandedChange", "selectionChange", "commandClick", "closeClick"] }, { kind: "component", type: AXPEntityCardSkeletonComponent, selector: "axp-entity-card-skeleton", inputs: ["fieldCount", "badgeCount", "showFooter", "showHeaderMenu", "showContent", "rowLayout", "showAvatar", "fillHost", "embedded", "elevated"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: i3$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
8422
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPEntityDetailPopoverComponent, isStandalone: true, selector: "axp-entity-detail-popover", inputs: { entity: { classPropertyName: "entity", publicName: "entity", isSignal: true, isRequired: true, transformFunction: null }, entityId: { classPropertyName: "entityId", publicName: "entityId", isSignal: true, isRequired: true, transformFunction: null }, requestClose: { classPropertyName: "requestClose", publicName: "requestClose", isSignal: true, isRequired: false, transformFunction: null }, breadcrumb: { classPropertyName: "breadcrumb", publicName: "breadcrumb", isSignal: true, isRequired: false, transformFunction: null } }, providers: [{ provide: AXP_SELECT_COLUMN_RESOLVE_QUERY, useValue: true }], ngImport: i0, template: "<div class=\"axp-entity-detail-popover\">\n @if (breadcrumb()) {\n <!-- ----- Optional lookup breadcrumb above the shared entity card ----- -->\n <div class=\"text-xs text-neutral-500 mb-2\">{{ breadcrumb() }}</div>\n }\n @if (isLoadingDetails()) {\n <!-- ----- Loading placeholder while Entity:GetDetails is fetched ----- -->\n <div class=\"axp-entity-detail-popover__loading\">\n @if (canClose()) {\n <!-- ----- Dismiss while the lookup card is still loading ----- -->\n <ax-button\n class=\"axp-entity-detail-popover__close ax-sm\"\n [look]=\"'blank'\"\n [color]=\"'default'\"\n [iconOnly]=\"true\"\n [attr.title]=\"('@general:actions.close.title' | translate | async)\"\n [attr.aria-label]=\"('@general:actions.close.title' | translate | async)\"\n (onClick)=\"onClose()\"\n >\n <i class=\"fa-light fa-xmark\" aria-hidden=\"true\"></i>\n </ax-button>\n }\n <axp-entity-card-skeleton\n [fieldCount]=\"skeletonFieldCount()\"\n [badgeCount]=\"skeletonBadgeCount()\"\n [showContent]=\"true\"\n [showFooter]=\"canOpenDetails()\"\n [showAvatar]=\"showSkeletonAvatar()\"\n [elevated]=\"true\"\n />\n </div>\n }\n <!-- ----- Same card chrome as the master list; Open Details uses the card footer ----- -->\n @else if (entityDefinition(); as definition) {\n <!--->\n <!-- ----- Entity card when row details have loaded ----- -->\n @if (entityData(); as row) {\n <axp-entity-card\n [entity]=\"definition\"\n [layout]=\"cardLayout()\"\n [row]=\"row\"\n [fields]=\"cardFields()\"\n variant=\"card\"\n [interactive]=\"false\"\n [elevated]=\"true\"\n [showClose]=\"canClose()\"\n primaryActionLook=\"solid\"\n [disableLookupPopover]=\"true\"\n [primaryActions]=\"openDetailsActions()\"\n (commandClick)=\"onCardCommandClick($event)\"\n (closeClick)=\"onClose()\"\n />\n }\n }\n</div>\n", styles: [":host{display:block;border-radius:var(--radius-md, .375rem);width:min(600px,calc(100vw - 2rem));background-color:rgb(var(--ax-sys-color-lightest-surface));box-shadow:0 8px 16px #00000029,0 24px 48px #00000038,0 48px 96px #00000047}.axp-entity-detail-popover__loading{position:relative}.axp-entity-detail-popover__close{position:absolute;z-index:20;inset-block-start:.75rem;inset-inline-end:1rem}.axp-entity-detail-popover-overlay,.axp-entity-detail-popover-overlay.ax-overlay-container,.axp-entity-detail-popover-overlay.ax-overlay-pane,.axp-entity-detail-popover-overlay .ax-overlay-pane,.axp-entity-detail-popover-overlay .overlay-pane{width:min(600px,calc(100vw - 2rem))!important;min-width:min(600px,calc(100vw - 2rem));overflow:visible!important;background:transparent!important;border:none!important;box-shadow:none!important;padding:0!important}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPEntityCardComponent, selector: "axp-entity-card", inputs: ["entity", "layout", "row", "fields", "userStylingRules", "variant", "interactive", "embedded", "elevated", "disableLookupPopover", "fillHost", "extraExpanded", "selected", "showNewBadge", "showSelection", "showClose", "primaryActions", "primaryActionLook", "secondaryActionLoader"], outputs: ["extraExpandedChange", "selectionChange", "commandClick", "closeClick"] }, { kind: "component", type: AXPEntityCardSkeletonComponent, selector: "axp-entity-card-skeleton", inputs: ["fieldCount", "badgeCount", "showFooter", "showHeaderMenu", "showContent", "rowLayout", "showAvatar", "fillHost", "embedded", "elevated"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: i3$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
8339
8423
  }
8340
8424
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPEntityDetailPopoverComponent, decorators: [{
8341
8425
  type: Component,
@@ -8347,8 +8431,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
8347
8431
  AXTranslationModule,
8348
8432
  AXPEntityCardComponent,
8349
8433
  AXPEntityCardSkeletonComponent,
8350
- ], providers: [{ provide: AXP_SELECT_COLUMN_RESOLVE_QUERY, useValue: true }], template: "<div class=\"axp-entity-detail-popover\">\n @if (breadcrumb()) {\n <!-- ----- Optional lookup breadcrumb above the shared entity card ----- -->\n <div class=\"text-xs text-neutral-500 mb-2\">{{ breadcrumb() }}</div>\n }\n @if (isLoadingDetails()) {\n <!-- ----- Loading placeholder while Entity:GetDetails is fetched ----- -->\n <div class=\"axp-entity-detail-popover__loading\">\n @if (canClose()) {\n <!-- ----- Dismiss while the lookup card is still loading ----- -->\n <ax-button\n class=\"axp-entity-detail-popover__close ax-sm\"\n [look]=\"'blank'\"\n [color]=\"'default'\"\n [iconOnly]=\"true\"\n [attr.title]=\"('@general:actions.close.title' | translate | async)\"\n [attr.aria-label]=\"('@general:actions.close.title' | translate | async)\"\n (onClick)=\"onClose()\"\n >\n <i class=\"fa-light fa-xmark\" aria-hidden=\"true\"></i>\n </ax-button>\n }\n <axp-entity-card-skeleton\n [fieldCount]=\"skeletonFieldCount()\"\n [badgeCount]=\"skeletonBadgeCount()\"\n [showContent]=\"true\"\n [showFooter]=\"true\"\n [showAvatar]=\"showSkeletonAvatar()\"\n [elevated]=\"true\"\n />\n </div>\n }\n <!-- ----- Same card chrome as the master list; Open Details uses the card footer ----- -->\n @else if (entityDefinition(); as definition) {\n <!--->\n <!-- ----- Entity card when row details have loaded ----- -->\n @if (entityData(); as row) {\n <axp-entity-card\n [entity]=\"definition\"\n [layout]=\"cardLayout()\"\n [row]=\"row\"\n [fields]=\"cardFields()\"\n variant=\"card\"\n [interactive]=\"false\"\n [elevated]=\"true\"\n [showClose]=\"canClose()\"\n primaryActionLook=\"solid\"\n [disableLookupPopover]=\"true\"\n [primaryActions]=\"openDetailsActions()\"\n (commandClick)=\"onCardCommandClick($event)\"\n (closeClick)=\"onClose()\"\n />\n }\n }\n</div>\n", styles: [":host{display:block;border-radius:var(--radius-md, .375rem);width:min(600px,calc(100vw - 2rem));background-color:rgb(var(--ax-sys-color-lightest-surface));box-shadow:0 8px 16px #00000029,0 24px 48px #00000038,0 48px 96px #00000047}.axp-entity-detail-popover__loading{position:relative}.axp-entity-detail-popover__close{position:absolute;z-index:20;inset-block-start:.75rem;inset-inline-end:1rem}.axp-entity-detail-popover-overlay,.axp-entity-detail-popover-overlay.ax-overlay-container,.axp-entity-detail-popover-overlay.ax-overlay-pane,.axp-entity-detail-popover-overlay .ax-overlay-pane,.axp-entity-detail-popover-overlay .overlay-pane{width:min(600px,calc(100vw - 2rem))!important;min-width:min(600px,calc(100vw - 2rem));overflow:visible!important;background:transparent!important;border:none!important;box-shadow:none!important;padding:0!important}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
8351
- }], propDecorators: { entity: [{ type: i0.Input, args: [{ isSignal: true, alias: "entity", required: true }] }], entityId: [{ type: i0.Input, args: [{ isSignal: true, alias: "entityId", required: true }] }], requestClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "requestClose", required: false }] }], breadcrumb: [{ type: i0.Input, args: [{ isSignal: true, alias: "breadcrumb", required: false }] }] } });
8434
+ ], providers: [{ provide: AXP_SELECT_COLUMN_RESOLVE_QUERY, useValue: true }], template: "<div class=\"axp-entity-detail-popover\">\n @if (breadcrumb()) {\n <!-- ----- Optional lookup breadcrumb above the shared entity card ----- -->\n <div class=\"text-xs text-neutral-500 mb-2\">{{ breadcrumb() }}</div>\n }\n @if (isLoadingDetails()) {\n <!-- ----- Loading placeholder while Entity:GetDetails is fetched ----- -->\n <div class=\"axp-entity-detail-popover__loading\">\n @if (canClose()) {\n <!-- ----- Dismiss while the lookup card is still loading ----- -->\n <ax-button\n class=\"axp-entity-detail-popover__close ax-sm\"\n [look]=\"'blank'\"\n [color]=\"'default'\"\n [iconOnly]=\"true\"\n [attr.title]=\"('@general:actions.close.title' | translate | async)\"\n [attr.aria-label]=\"('@general:actions.close.title' | translate | async)\"\n (onClick)=\"onClose()\"\n >\n <i class=\"fa-light fa-xmark\" aria-hidden=\"true\"></i>\n </ax-button>\n }\n <axp-entity-card-skeleton\n [fieldCount]=\"skeletonFieldCount()\"\n [badgeCount]=\"skeletonBadgeCount()\"\n [showContent]=\"true\"\n [showFooter]=\"canOpenDetails()\"\n [showAvatar]=\"showSkeletonAvatar()\"\n [elevated]=\"true\"\n />\n </div>\n }\n <!-- ----- Same card chrome as the master list; Open Details uses the card footer ----- -->\n @else if (entityDefinition(); as definition) {\n <!--->\n <!-- ----- Entity card when row details have loaded ----- -->\n @if (entityData(); as row) {\n <axp-entity-card\n [entity]=\"definition\"\n [layout]=\"cardLayout()\"\n [row]=\"row\"\n [fields]=\"cardFields()\"\n variant=\"card\"\n [interactive]=\"false\"\n [elevated]=\"true\"\n [showClose]=\"canClose()\"\n primaryActionLook=\"solid\"\n [disableLookupPopover]=\"true\"\n [primaryActions]=\"openDetailsActions()\"\n (commandClick)=\"onCardCommandClick($event)\"\n (closeClick)=\"onClose()\"\n />\n }\n }\n</div>\n", styles: [":host{display:block;border-radius:var(--radius-md, .375rem);width:min(600px,calc(100vw - 2rem));background-color:rgb(var(--ax-sys-color-lightest-surface));box-shadow:0 8px 16px #00000029,0 24px 48px #00000038,0 48px 96px #00000047}.axp-entity-detail-popover__loading{position:relative}.axp-entity-detail-popover__close{position:absolute;z-index:20;inset-block-start:.75rem;inset-inline-end:1rem}.axp-entity-detail-popover-overlay,.axp-entity-detail-popover-overlay.ax-overlay-container,.axp-entity-detail-popover-overlay.ax-overlay-pane,.axp-entity-detail-popover-overlay .ax-overlay-pane,.axp-entity-detail-popover-overlay .overlay-pane{width:min(600px,calc(100vw - 2rem))!important;min-width:min(600px,calc(100vw - 2rem));overflow:visible!important;background:transparent!important;border:none!important;box-shadow:none!important;padding:0!important}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
8435
+ }], ctorParameters: () => [], propDecorators: { entity: [{ type: i0.Input, args: [{ isSignal: true, alias: "entity", required: true }] }], entityId: [{ type: i0.Input, args: [{ isSignal: true, alias: "entityId", required: true }] }], requestClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "requestClose", required: false }] }], breadcrumb: [{ type: i0.Input, args: [{ isSignal: true, alias: "breadcrumb", required: false }] }] } });
8352
8436
 
8353
8437
  class AXPEntityDetailPopoverService {
8354
8438
  constructor() {
@@ -8358,7 +8442,6 @@ class AXPEntityDetailPopoverService {
8358
8442
  this.localeService = inject(AXLocaleService);
8359
8443
  this.document = inject(DOCUMENT);
8360
8444
  this.router = inject(Router);
8361
- this.detailsAccess = inject(AXPEntityDetailsAccessService);
8362
8445
  //#endregion
8363
8446
  //#region ---- Private Properties ----
8364
8447
  this.overlayRef = null;
@@ -8378,9 +8461,6 @@ class AXPEntityDetailPopoverService {
8378
8461
  if (!anchorElement) {
8379
8462
  return;
8380
8463
  }
8381
- if (!(await this.detailsAccess.canOpen(options.entity, String(options.id)))) {
8382
- return;
8383
- }
8384
8464
  this.hide();
8385
8465
  const panelClasses = ['animate-fadeIn', 'animate-faster', 'axp-entity-detail-popover-overlay'];
8386
8466
  if (this.platform.isDark()) {
@@ -14215,7 +14295,7 @@ class AXMAttachmentsPageComponentProvider {
14215
14295
  return [
14216
14296
  {
14217
14297
  key: ATTACHMENTS_PAGE_COMPONENT_KEY,
14218
- loader: () => import('./acorex-platform-framework-client-layout-entity-attachments-page.component-TJwyeB27.mjs').then((m) => m.AXMAttachmentsPageComponent),
14298
+ loader: () => import('./acorex-platform-framework-client-layout-entity-attachments-page.component-DyrvSBEY.mjs').then((m) => m.AXMAttachmentsPageComponent),
14219
14299
  },
14220
14300
  ];
14221
14301
  }
@@ -14752,7 +14832,7 @@ class AXMGalleryPageComponentProvider {
14752
14832
  return [
14753
14833
  {
14754
14834
  key: GALLERY_PAGE_COMPONENT_KEY,
14755
- loader: () => import('./acorex-platform-framework-client-layout-entity-gallery-page.component-_ZIlTKUf.mjs').then((m) => m.AXMGalleryPageComponent),
14835
+ loader: () => import('./acorex-platform-framework-client-layout-entity-gallery-page.component-fATD9Uax.mjs').then((m) => m.AXMGalleryPageComponent),
14756
14836
  },
14757
14837
  ];
14758
14838
  }
@@ -17141,7 +17221,6 @@ class AXPEntityCategoryWidgetColumnComponent extends AXPColumnWidgetComponent {
17141
17221
  this.formatService = inject(AXFormatService);
17142
17222
  this.entityResolver = inject(AXPEntityDefinitionRegistryService);
17143
17223
  this.categoryBatchResolver = inject(AXPEntityCategoryBatchResolverService);
17144
- this.detailsAccess = inject(AXPEntityDetailsAccessService);
17145
17224
  //#endregion
17146
17225
  //#region ---- Inputs ----
17147
17226
  this.rawValueSignal = signal(null, /* @ts-ignore */
@@ -17235,7 +17314,7 @@ class AXPEntityCategoryWidgetColumnComponent extends AXPColumnWidgetComponent {
17235
17314
  const id = Array.isArray(columnData) ? columnData[index] : columnData;
17236
17315
  this.selectedItemIndex.set(index);
17237
17316
  const entityKey = this.entity();
17238
- if (entityKey && id && (await this.detailsAccess.canOpen(entityKey, String(id)))) {
17317
+ if (entityKey && id) {
17239
17318
  await this.entityDetailPopoverService.show(anchor ?? this.host.nativeElement, {
17240
17319
  entity: entityKey,
17241
17320
  id: id,
@@ -20593,7 +20672,7 @@ class AXPEntityListWidgetViewComponent extends AXPValueWidgetComponent {
20593
20672
  this.destroyed.complete();
20594
20673
  }
20595
20674
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPEntityListWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
20596
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPEntityListWidgetViewComponent, isStandalone: true, selector: "ng-component", host: { properties: { "class": "\"flex h-full min-h-0 flex-col\"" } }, providers: [AXPEntityListTableService, AXPEntityListToolbarService], viewQueries: [{ propertyName: "list", first: true, predicate: ["list"], descendants: true, isSignal: true }, { propertyName: "allWidgets", predicate: AXPWidgetRendererDirective, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
20675
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPEntityListWidgetViewComponent, isStandalone: true, selector: "ng-component", host: { properties: { "class": "\"axp-entity-list flex h-full min-h-0 flex-col\"" } }, providers: [AXPEntityListTableService, AXPEntityListToolbarService], viewQueries: [{ propertyName: "list", first: true, predicate: ["list"], descendants: true, isSignal: true }, { propertyName: "allWidgets", predicate: AXPWidgetRendererDirective, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
20597
20676
  @if (showEntityActions()) {
20598
20677
  <div class="flex gap-2 justify-end mb-4">
20599
20678
  @for (action of primaryActions(); track $index) {
@@ -20672,7 +20751,11 @@ class AXPEntityListWidgetViewComponent extends AXPValueWidgetComponent {
20672
20751
  }
20673
20752
  </div>
20674
20753
  }
20675
- <div class="flex min-h-0 h-full flex-col gap-2" [style.max-height]="maxHeight()">
20754
+ <div
20755
+ class="axp-entity-list-body flex h-full min-h-0 flex-col gap-2"
20756
+ [class.overflow-hidden]="maxHeight() != null"
20757
+ [style.max-height]="maxHeight()"
20758
+ >
20676
20759
  @if (toolbarNode() != null && showListToolbar()) {
20677
20760
  <ng-container
20678
20761
  #toolbar
@@ -20694,7 +20777,7 @@ class AXPEntityListWidgetViewComponent extends AXPValueWidgetComponent {
20694
20777
  (onClick)="handleUnselectAll()"
20695
20778
  ></ax-button>
20696
20779
  </div> -->
20697
- <div class="relative flex min-h-0 flex-1 flex-col">
20780
+ <div class="relative flex min-h-0 flex-1 flex-col overflow-hidden">
20698
20781
  @if (listNode() != null) {
20699
20782
  <div
20700
20783
  class="flex min-h-0 h-full flex-1 flex-col"
@@ -20833,7 +20916,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
20833
20916
  }
20834
20917
  </div>
20835
20918
  }
20836
- <div class="flex min-h-0 h-full flex-col gap-2" [style.max-height]="maxHeight()">
20919
+ <div
20920
+ class="axp-entity-list-body flex h-full min-h-0 flex-col gap-2"
20921
+ [class.overflow-hidden]="maxHeight() != null"
20922
+ [style.max-height]="maxHeight()"
20923
+ >
20837
20924
  @if (toolbarNode() != null && showListToolbar()) {
20838
20925
  <ng-container
20839
20926
  #toolbar
@@ -20855,7 +20942,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
20855
20942
  (onClick)="handleUnselectAll()"
20856
20943
  ></ax-button>
20857
20944
  </div> -->
20858
- <div class="relative flex min-h-0 flex-1 flex-col">
20945
+ <div class="relative flex min-h-0 flex-1 flex-col overflow-hidden">
20859
20946
  @if (listNode() != null) {
20860
20947
  <div
20861
20948
  class="flex min-h-0 h-full flex-1 flex-col"
@@ -20913,7 +21000,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
20913
21000
  `,
20914
21001
  standalone: true,
20915
21002
  host: {
20916
- '[class]': '"flex h-full min-h-0 flex-col"',
21003
+ '[class]': '"axp-entity-list flex h-full min-h-0 flex-col"',
20917
21004
  },
20918
21005
  changeDetection: ChangeDetectionStrategy.OnPush,
20919
21006
  providers: [AXPEntityListTableService, AXPEntityListToolbarService],
@@ -25484,19 +25571,6 @@ class AXPLookupWidgetColumnComponent extends AXPColumnWidgetComponent {
25484
25571
  this.expressionEvaluator = inject(AXPExpressionEvaluatorService);
25485
25572
  this.contextEvalFactory = inject(AXPContextEvalFactory);
25486
25573
  this.lookupByKeyCache = inject(AXPLookupByKeyCacheService);
25487
- this.detailsAccess = inject(AXPEntityDetailsAccessService);
25488
- this.sessionService = inject(AXPSessionService);
25489
- /** Re-check lookup links when application, permissions, or features change. */
25490
- this.accessRevision = toSignal(combineLatest([
25491
- this.sessionService.application$,
25492
- this.sessionService.permissions$,
25493
- this.sessionService.features$,
25494
- ]).pipe(map(([application, permissions, features]) => {
25495
- const featureStamp = features
25496
- .map((feature) => `${feature.name}:${String(feature.value ?? '')}`)
25497
- .join('\n');
25498
- return `${this.sessionService.isAuthorized ? '1' : '0'}|${application?.name ?? ''}|${permissions.join('\n')}|${featureStamp}`;
25499
- })), { initialValue: '' });
25500
25574
  //#endregion
25501
25575
  //#region ---- View Children ----
25502
25576
  this.moreButton = viewChild('moreButton', /* @ts-ignore */
@@ -25534,10 +25608,8 @@ class AXPLookupWidgetColumnComponent extends AXPColumnWidgetComponent {
25534
25608
  return popover?.enabled !== false;
25535
25609
  }, /* @ts-ignore */
25536
25610
  ...(ngDevMode ? [{ debugName: "detailPopoverEnabled" }] : /* istanbul ignore next */ []));
25537
- /** Menu policy for the lookup target. False until the check resolves, so the cell is not a link yet. */
25538
- this.canOpenLinkedEntity = signal(false, /* @ts-ignore */
25539
- ...(ngDevMode ? [{ debugName: "canOpenLinkedEntity" }] : /* istanbul ignore next */ []));
25540
- this.linkEnabled = computed(() => this.detailPopoverEnabled() && this.canOpenLinkedEntity(), /* @ts-ignore */
25611
+ /** Cell opens the preview card. Open Details inside the card follows the view permission. */
25612
+ this.linkEnabled = computed(() => this.detailPopoverEnabled(), /* @ts-ignore */
25541
25613
  ...(ngDevMode ? [{ debugName: "linkEnabled" }] : /* istanbul ignore next */ []));
25542
25614
  //#endregion
25543
25615
  //#region ---- Signals ----
@@ -25564,7 +25636,6 @@ class AXPLookupWidgetColumnComponent extends AXPColumnWidgetComponent {
25564
25636
  this.hydratedDisplayItems = signal(null, /* @ts-ignore */
25565
25637
  ...(ngDevMode ? [{ debugName: "hydratedDisplayItems" }] : /* istanbul ignore next */ []));
25566
25638
  this.hydrateRequestId = 0;
25567
- this.accessRequestId = 0;
25568
25639
  this.mainLabelsVersion = 0;
25569
25640
  this.lazyPopoverLabelsVersion = 0;
25570
25641
  //#endregion
@@ -25664,22 +25735,6 @@ class AXPLookupWidgetColumnComponent extends AXPColumnWidgetComponent {
25664
25735
  : this.displayCount();
25665
25736
  void this.refreshPopoverHeader(count);
25666
25737
  });
25667
- effect(() => {
25668
- this.accessRevision();
25669
- const key = this.getEntityKey();
25670
- const popoverEnabled = this.detailPopoverEnabled();
25671
- if (!popoverEnabled || key.indexOf('.') <= 0) {
25672
- this.accessRequestId++;
25673
- this.canOpenLinkedEntity.set(false);
25674
- return;
25675
- }
25676
- const requestId = ++this.accessRequestId;
25677
- void this.detailsAccess.canOpen(key).then((allowed) => {
25678
- if (requestId === this.accessRequestId) {
25679
- this.canOpenLinkedEntity.set(allowed);
25680
- }
25681
- });
25682
- });
25683
25738
  effect(() => {
25684
25739
  const key = this.getEntityKey();
25685
25740
  const dotIndex = key.indexOf('.');
@@ -28955,7 +29010,6 @@ const ENTITY_EXTENDED_WIDGETS = [
28955
29010
  defaultFilterOperator: AXP_LOOKUP_FILTER_DEFAULT_OPERATOR,
28956
29011
  components: {},
28957
29012
  options: {
28958
- look: 'select',
28959
29013
  filterMode: true,
28960
29014
  },
28961
29015
  },
@@ -32552,6 +32606,7 @@ class AXPEntityModule {
32552
32606
  AXPWidgetCoreModule,
32553
32607
  LayoutBuilderModule] }); }
32554
32608
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPEntityModule, providers: [
32609
+ { provide: AXP_ENTITY_VIEW_ACCESS, useExisting: AXPEntityDetailsAccessService },
32555
32610
  AXP_ENTITY_DETAILS_VIEW_ADAPTER_LOADER_PROVIDER,
32556
32611
  {
32557
32612
  provide: AXP_REPEATER_ENTITY_BY_KEY_LOOKUP,
@@ -32664,7 +32719,7 @@ class AXPEntityModule {
32664
32719
  },
32665
32720
  {
32666
32721
  key: 'Entity:Bulk',
32667
- command: () => import('./acorex-platform-framework-client-layout-entity-bulk-entity.command-CgLVcZHZ.mjs').then((c) => c.AXPBulkEntityCommand),
32722
+ command: () => import('./acorex-platform-framework-client-layout-entity-bulk-entity.command-B8s_JEV8.mjs').then((c) => c.AXPBulkEntityCommand),
32668
32723
  },
32669
32724
  {
32670
32725
  key: 'Entity:OpenList',
@@ -32713,6 +32768,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
32713
32768
  exports: [],
32714
32769
  declarations: [],
32715
32770
  providers: [
32771
+ { provide: AXP_ENTITY_VIEW_ACCESS, useExisting: AXPEntityDetailsAccessService },
32716
32772
  AXP_ENTITY_DETAILS_VIEW_ADAPTER_LOADER_PROVIDER,
32717
32773
  {
32718
32774
  provide: AXP_REPEATER_ENTITY_BY_KEY_LOOKUP,
@@ -32825,7 +32881,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
32825
32881
  },
32826
32882
  {
32827
32883
  key: 'Entity:Bulk',
32828
- command: () => import('./acorex-platform-framework-client-layout-entity-bulk-entity.command-CgLVcZHZ.mjs').then((c) => c.AXPBulkEntityCommand),
32884
+ command: () => import('./acorex-platform-framework-client-layout-entity-bulk-entity.command-B8s_JEV8.mjs').then((c) => c.AXPBulkEntityCommand),
32829
32885
  },
32830
32886
  {
32831
32887
  key: 'Entity:OpenList',
@@ -33151,4 +33207,4 @@ function detectEntityChanges(oldObj, newObj) {
33151
33207
  */
33152
33208
 
33153
33209
  export { AXPEntityListViewModelResolver as $, AXPEntityDefinitionRegistryService as A, AXPEntityCategoryWidgetViewComponent as B, AXPEntityCommandTriggerViewModel as C, AXPEntityCreateViewElementViewModel as D, AXPEntityCreateViewModelFactory as E, AXPEntityCreateViewSectionViewModel as F, AXPEntityDataProvider as G, AXPEntityDataProviderImpl as H, AXPEntityDataSelectorRowActionsService as I, AXPEntityDataSelectorService as J, AXPEntityDefinitionProviderWidget as K, AXPEntityDefinitionProviderWidgetEditComponent as L, AXPEntityDeletePerformService as M, AXPEntityDetailListViewModel as N, AXPEntityDetailPopoverComponent as O, AXPEntityDetailPopoverService as P, AXPEntityDetailViewModelFactory as Q, AXPEntityDetailViewModelResolver as R, AXPEntityEventDispatcherService as S, AXPEntityFormBuilderService as T, AXPEntityLifecycleHookKeys as U, AXPEntityListPersistenceModeDefault as V, AXPEntityListTableService as W, AXPEntityListToolbarService as X, AXPEntityListViewCardFieldViewModel as Y, AXPEntityListViewColumnViewModel as Z, AXPEntityListViewModelFactory as _, showOperationResultToast as a, AXP_CATEGORY_TREE_ROOT_TITLE_I18N_KEY as a$, AXPEntityListWidget as a0, AXPEntityListWidgetViewComponent as a1, AXPEntityMasterCreateViewModel as a2, AXPEntityMasterListCardSelectActionName as a3, AXPEntityMasterListViewModel as a4, AXPEntityMasterListViewQueryViewModel as a5, AXPEntityMasterSingleElementViewModel as a6, AXPEntityMasterSingleViewGroupViewModel as a7, AXPEntityMasterSingleViewModel as a8, AXPEntityMasterUpdateElementViewModel as a9, AXPLookupWidgetViewComponent as aA, AXPMiddlewareAbortError as aB, AXPMiddlewareEntityStorageService as aC, AXPMultiSourceDefinitionProviderContext as aD, AXPMultiSourceDefinitionProviderService as aE, AXPMultiSourceFederatedSearchService as aF, AXPMultiSourceSelectorComponent as aG, AXPMultiSourceSelectorService as aH, AXPMultiSourceSelectorWidget as aI, AXPMultiSourceSelectorWidgetColumnComponent as aJ, AXPMultiSourceSelectorWidgetEditComponent as aK, AXPMultiSourceSelectorWidgetViewComponent as aL, AXPMultiSourceType as aM, AXPOpenEntityDetailsCommand as aN, AXPOpenEntityListCommand as aO, AXPRelatedColumnEnrichmentService as aP, AXPRelatedColumnMetadataResolver as aQ, AXPSelectorStructureWidget as aR, AXPSelectorStructureWidgetColumnComponent as aS, AXPSelectorStructureWidgetEditComponent as aT, AXPSelectorStructureWidgetViewComponent as aU, AXPShowFileUploaderPopupCommand as aV, AXPTruncatedBreadcrumbComponent as aW, AXPUpdateEntityCommand as aX, AXPUpdateEntityStatusCommand as aY, AXPViewEntityDetailsCommand as aZ, AXP_APPEARANCE_SECTION_ORDER as a_, AXPEntityMasterUpdateViewModel as aa, AXPEntityMasterUpdateViewModelFactory as ab, AXPEntityMiddlewareSkipContext as ac, AXPEntityModule as ad, AXPEntityPreloadFiltersContainerComponent as ae, AXPEntityPreloadFiltersViewModel as af, AXPEntityPreloadFiltersViewModelResolver as ag, AXPEntityResolver as ah, AXPEntityRuntimeAccessorService as ai, AXPEntityService as aj, AXPEntityStorageService as ak, AXPEntityUpdateViewSectionViewModel as al, AXPFileListComponent as am, AXPFileUploaderLoadFilesQuery as an, AXPFileUploaderSaveFilesCommand as ao, AXPFileUploaderWidget as ap, AXPFileUploaderWidgetColumnComponent as aq, AXPFileUploaderWidgetEditComponent as ar, AXPFileUploaderWidgetService as as, AXPFileUploaderWidgetViewComponent as at, AXPGetEntityDetailsQuery as au, AXPLayoutOrderingConfigService as av, AXPLookupByKeyCacheService as aw, AXPLookupWidget as ax, AXPLookupWidgetColumnComponent as ay, AXPLookupWidgetEditComponent as az, buildSelectedIdsFilter as b, defaultSortPresetsMiddlewareProvider as b$, AXP_CLASSIFICATION_SECTION_ORDER as b0, AXP_CLIENT_LOCAL_DEFAULT_MAX_ITEMS as b1, AXP_CLIENT_LOCAL_PLUGIN_NAME as b2, AXP_DATA_SEEDER_TOKEN as b3, AXP_ENTITY_ACTION_PLUGIN as b4, AXP_ENTITY_CONFIG_TOKEN as b5, AXP_ENTITY_DEFINITION_LOADER as b6, AXP_ENTITY_MIDDLEWARE as b7, AXP_ENTITY_MODIFIER as b8, AXP_ENTITY_STORAGE_MIDDLEWARE as b9, axpShowFileUploaderPopupCommandDefinition as bA, axpUpdateEntityStatusCommandDefinition as bB, buildDataSourceTraceSnapshot as bC, canPersistEntityListState as bD, clientLocalPlugin as bE, cloneLayoutArrays as bF, columnOrderingMiddleware as bG, columnOrderingMiddlewareProvider as bH, columnWidthMiddleware as bI, columnWidthMiddlewareProvider as bJ, committedAttachments as bK, composeEntityMiddlewares as bL, composeEntityStorageMiddlewares as bM, computeEntityAggregates as bN, configureEntityListColumnsSettingsMigrateDrop as bO, configureEntityListColumnsSettingsVersion as bP, createColumnOrderingMiddlewareProvider as bQ, createEntityCardDisplayScope as bR, createEntityCardLogicScope as bS, createEntityMiddlewareContext as bT, createEntityStorageContext as bU, createLayoutOrderingMiddlewareProvider as bV, defaultCardLayoutMiddleware as bW, defaultCardLayoutMiddlewareProvider as bX, defaultMultiLanguageMiddleware as bY, defaultMultiLanguageMiddlewareProvider as bZ, defaultSortPresetsMiddleware as b_, AXP_LOOKUP_FILTER_DEFAULT_OPERATOR as ba, AXP_MULTI_SOURCE_DEFINITION_PROVIDER as bb, DEFAULT_COLUMN_ORDER as bc, DEFAULT_PAIR_SPAN_RULES as bd, DEFAULT_PROPERTY_ORDER as be, DEFAULT_SECTION_ORDER as bf, ENTITY_FORM_ACTION_FIRST_STEP_CONTINUE as bg, ENTITY_LIST_LAYOUT_META as bh, ENTITY_LIST_ROUTE_CONTEXT_SESSION_KEY as bi, ENTITY_MASTER_LIST_TRACE_NS as bj, EntityBuilder as bk, EntityDataAccessor as bl, GALLERY_PAGE_COMPONENT_KEY as bm, TREE_CHILDREN_QUERY_TAKE as bn, actionExists as bo, applyDataSourcePagingWithoutLoad as bp, attachmentFieldCount as bq, attachmentNeedsHydration as br, attachmentsPlugin as bs, attachmentsSemanticallyEqual as bt, axpBuildEntityListPageContextSnapshot as bu, axpCreateEntityAiToolInputDefaults as bv, axpCreateEntityCommandDefinition as bw, axpDeleteEntityCommandDefinition as bx, axpOpenEntityListCommandDefinition as by, axpRunEntityListPageContextAction as bz, ATTACHMENTS_PAGE_COMPONENT_KEY as c, provideLocalEntityCatalog as c$, detectEntityChanges as c0, dispatchEntityModifiedSideEffects as c1, ensureHierarchicalRootFilter as c2, ensureLayoutPropertyView as c3, ensureLayoutSection as c4, ensureListActions as c5, entityCreateBridgeMiddleware as c6, entityDeleteBridgeMiddleware as c7, entityGetOneBridgeMiddleware as c8, entityListInstanceCurrentViewPath as c9, hasFileUploaderTitleOrDescriptionFields as cA, hydrateAttachmentFieldToFileList as cB, isAXPMiddlewareAbortError as cC, isAttachmentFieldPresentOnRow as cD, isAttachmentListEntry as cE, isAttachmentStorageRef as cF, isCategoryEntity as cG, isCategoryFilter as cH, isFileListItem as cI, isFileUploaderEditDialogAuto as cJ, isLegacyEntityDataSelectorOptions as cK, layoutOrderingMiddlewareFactory as cL, layoutOrderingMiddlewareProvider as cM, mapEntityStorageErrorToCommandResult as cN, mapLegacyEntityDataSelectorOptions as cO, mergeEntityListViewAndPersistedFilters as cP, normalizeEntityCardHeaderDisplayValue as cQ, normalizeEntityDataSelectorColumnSpecs as cR, normalizeEntityDataSelectorOptions as cS, normalizeEntityFieldToFileList as cT, normalizeEntityListPersistenceMode as cU, normalizeListPaging as cV, prefetchClientLocalRelated as cW, provideEntity as cX, provideEntityMiddlewareBridge as cY, provideEntityRealtimeHandlers as cZ, provideEntityStorageMiddlewareBridge as c_, entityListInstanceFilterPath as ca, entityListStylingRulesPath as cb, entityQueryBridgeMiddleware as cc, entityStorageCreateBridgeMiddleware as cd, entityStorageDeleteBridgeMiddleware as ce, entityStorageGetOneBridgeMiddleware as cf, entityStorageQueryBridgeMiddleware as cg, entityStorageUpdateBridgeMiddleware as ch, entityUpdateBridgeMiddleware as ci, eventDispatchMiddleware as cj, filterEntityMiddlewares as ck, filterEntityStorageMiddlewares as cl, filterSortEntityRows as cm, filterTouchesParentKey as cn, findEntityListRowDataInTree as co, fingerprintAttachmentItem as cp, fingerprintAttachments as cq, fireEntityLifecycleHook as cr, formatLookupItemDisplay as cs, formatLookupItemDisplayAsync as ct, galleryPlugin as cu, getDataSourcePageIndex as cv, getEntityListColumnsSettingsMigrateDrop as cw, getEntityListColumnsSettingsVersion as cx, getEntityListRowId as cy, getMasterInterfacePropertySortKey as cz, AXMEntityCrudService as d, readPersistedEntityListInstanceCurrentView as d0, readPersistedEntityListInstanceFilters as d1, readPersistedEntityListStylingRules as d2, resetPagingForTreeChildrenLoad as d3, resolveAttachmentFieldPath as d4, resolveEntityCardBadgeColorValue as d5, resolveEntityCardHeaderValue as d6, resolveEntityMasterFieldStylingClass as d7, resolveEntityMasterRecordStylingClass as d8, resolveEntityMasterStylingClass as d9, resolveEntityPluginDetailPageOrder as da, resolveFileUploaderEditDialog as db, resolveFileUploaderEntityScope as dc, resolveLookupDisplayField as dd, resolveLookupDisplayTemplate as de, resolveLookupEntityCacheKey as df, resolveLookupEntityKey as dg, resolveMasterInterfacePropertyOrder as dh, restoreEntityListExpandedRows as di, runEntityMiddlewarePipeline as dj, runEntityQuery as dk, runEntityStorageMiddlewarePipeline as dl, searchResultDescriptionMiddleware as dm, searchResultDescriptionMiddlewareProvider as dn, shouldLoadEntityListStateFromStorage as dp, shouldResetEntityListStateOnRouteEntry as dq, traceEntityMasterList as dr, AXMEntityCrudServiceImpl as e, AXPCategoryTreeService as f, AXPClientLocalPluginModule as g, AXPCreateEntityCommand as h, AXPDataSeederService as i, AXPDeleteEntityCommand as j, AXPDomainQueryEntityDefinitionLoader as k, AXPEditFileUploaderCommand as l, AXPEntityBulkPatchPerformService as m, newBulkExecutionId as n, AXPEntityCardComponent as o, persistedAttachments as p, AXPEntityCardFieldsResolver as q, resolveBulkFailureBody as r, settleAfterLoadingDialog as s, AXPEntityCardSelectActionName as t, AXPEntityCardSkeletonComponent as u, AXPEntityCategoryTreeSelectorComponent as v, watchBulkProgress as w, AXPEntityCategoryWidget as x, AXPEntityCategoryWidgetColumnComponent as y, AXPEntityCategoryWidgetEditComponent as z };
33154
- //# sourceMappingURL=acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-40YjUhSy.mjs.map
33210
+ //# sourceMappingURL=acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-i9oZEXUR.mjs.map