@acorex-platform/framework-client 0.0.68 → 0.0.70

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 (15) 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-Dla4tdzi.mjs → acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-CXziIWed.mjs} +211 -30
  4. package/fesm2022/acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-CXziIWed.mjs.map +1 -0
  5. package/fesm2022/{acorex-platform-framework-client-layout-entity-attachments-page.component-CDlY8DOy.mjs → acorex-platform-framework-client-layout-entity-attachments-page.component-DLgSciUV.mjs} +2 -2
  6. package/fesm2022/{acorex-platform-framework-client-layout-entity-attachments-page.component-CDlY8DOy.mjs.map → acorex-platform-framework-client-layout-entity-attachments-page.component-DLgSciUV.mjs.map} +1 -1
  7. package/fesm2022/{acorex-platform-framework-client-layout-entity-bulk-entity.command-B2mxC3ze.mjs → acorex-platform-framework-client-layout-entity-bulk-entity.command-XZc1xZcD.mjs} +2 -2
  8. package/fesm2022/{acorex-platform-framework-client-layout-entity-bulk-entity.command-B2mxC3ze.mjs.map → acorex-platform-framework-client-layout-entity-bulk-entity.command-XZc1xZcD.mjs.map} +1 -1
  9. package/fesm2022/{acorex-platform-framework-client-layout-entity-gallery-page.component-mLLnQemg.mjs → acorex-platform-framework-client-layout-entity-gallery-page.component-DqfikqLb.mjs} +2 -2
  10. package/fesm2022/{acorex-platform-framework-client-layout-entity-gallery-page.component-mLLnQemg.mjs.map → acorex-platform-framework-client-layout-entity-gallery-page.component-DqfikqLb.mjs.map} +1 -1
  11. package/fesm2022/acorex-platform-framework-client-layout-entity.mjs +1 -1
  12. package/package.json +2 -2
  13. package/types/acorex-platform-framework-client-common.d.ts +29 -5
  14. package/types/acorex-platform-framework-client-layout-entity.d.ts +12 -1
  15. package/fesm2022/acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-Dla4tdzi.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 } 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 } 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,6 +2412,138 @@ 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';
2417
+ /**
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.
2422
+ */
2423
+ function resolveIndividualViewPermissions(actions) {
2424
+ const views = (actions ?? []).filter((action) => action.scope === INDIVIDUAL_SCOPE && action.type === VIEW_TYPE);
2425
+ if (views.length === 0) {
2426
+ return null;
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}`;
2444
+ }
2445
+
2446
+ /**
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.
2449
+ */
2450
+ class AXPEntityDetailsAccessService {
2451
+ constructor() {
2452
+ //#region ----- Services & Dependencies -----
2453
+ this.sessionService = inject(AXPSessionService);
2454
+ this.entityRegistry = inject(AXPEntityDefinitionRegistryService);
2455
+ //#endregion
2456
+ //#region ----- State -----
2457
+ this.accessStamp = '';
2458
+ this.decisions = new Map();
2459
+ }
2460
+ //#endregion
2461
+ //#region ----- Public Methods -----
2462
+ /**
2463
+ * Whether the current session may open the entity details route.
2464
+ * The record id does not change the view-action permission.
2465
+ * Missing entity, missing view action, or an empty permission list stays allowed.
2466
+ */
2467
+ async canOpen(entity, _id = '0') {
2468
+ this.syncStamp();
2469
+ const cacheKey = entity;
2470
+ const cached = this.decisions.get(cacheKey);
2471
+ if (cached) {
2472
+ return cached;
2473
+ }
2474
+ const pending = this.resolveCanOpen(entity);
2475
+ this.decisions.set(cacheKey, pending);
2476
+ void pending.then(() => undefined, () => {
2477
+ if (this.decisions.get(cacheKey) === pending) {
2478
+ this.decisions.delete(cacheKey);
2479
+ }
2480
+ });
2481
+ return pending;
2482
+ }
2483
+ //#endregion
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
+ }
2493
+ /** Drop cached decisions when application, permissions, or features change. */
2494
+ syncStamp() {
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
+ });
2501
+ if (stamp === this.accessStamp) {
2502
+ return;
2503
+ }
2504
+ this.accessStamp = stamp;
2505
+ this.decisions.clear();
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
+ }
2524
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPEntityDetailsAccessService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2525
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPEntityDetailsAccessService, providedIn: 'root' }); }
2526
+ }
2527
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPEntityDetailsAccessService, decorators: [{
2528
+ type: Injectable,
2529
+ args: [{ providedIn: 'root' }]
2530
+ }] });
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
+
2415
2547
  function resolveOpenEntityDetailsInput(input = {}) {
2416
2548
  const context = resolveEntityActionCommandInput(input);
2417
2549
  return {
@@ -2431,7 +2563,7 @@ class AXPOpenEntityDetailsCommand {
2431
2563
  //#region ---- Services & Dependencies ----
2432
2564
  this.router = inject(Router);
2433
2565
  this.sessionService = inject(AXPSessionService);
2434
- this.menuRouteAccess = inject(AXPMenuRouteAccessService);
2566
+ this.detailsAccess = inject(AXPEntityDetailsAccessService);
2435
2567
  }
2436
2568
  //#endregion
2437
2569
  //#region ---- Command Execution ----
@@ -2457,28 +2589,25 @@ class AXPOpenEntityDetailsCommand {
2457
2589
  },
2458
2590
  };
2459
2591
  }
2460
- const [module, entityName] = entity.split('.');
2461
- if (!module || !entityName) {
2592
+ const applicationName = this.sessionService.application?.name;
2593
+ if (!applicationName) {
2462
2594
  return {
2463
2595
  success: false,
2464
2596
  message: {
2465
- text: 'Entity must be in format "ModuleName.EntityName"',
2597
+ text: 'Application is required for opening details view',
2466
2598
  },
2467
2599
  };
2468
2600
  }
2469
- const applicationName = this.sessionService.application?.name;
2470
- if (!applicationName) {
2601
+ const route = buildEntityDetailsRoute(applicationName, entity, String(data.id));
2602
+ if (!route) {
2471
2603
  return {
2472
2604
  success: false,
2473
2605
  message: {
2474
- text: 'Application is required for opening details view',
2606
+ text: 'Entity must be in format "ModuleName.EntityName"',
2475
2607
  },
2476
2608
  };
2477
2609
  }
2478
- const commands = ['/', applicationName, 'm', module, 'e', entityName, String(data.id), 'view'];
2479
- const extras = { queryParams: { page: entityName } };
2480
- const url = this.router.serializeUrl(this.router.createUrlTree(commands, extras));
2481
- if (!(await this.menuRouteAccess.canAccessUrl(url))) {
2610
+ if (!(await this.detailsAccess.canOpen(entity, String(data.id)))) {
2482
2611
  return {
2483
2612
  success: false,
2484
2613
  message: { text: '@general:errors.codes.FORBIDDEN' },
@@ -2486,7 +2615,7 @@ class AXPOpenEntityDetailsCommand {
2486
2615
  }
2487
2616
  // Explicit segments so IDs containing `/` (and `http:` prefixes) stay one route param.
2488
2617
  // Primary page id is the entity name (`main-entity-content-builder`).
2489
- const navigated = await this.router.navigate(commands, extras);
2618
+ const navigated = await this.router.navigate(route.commands, { queryParams: route.queryParams });
2490
2619
  if (!navigated) {
2491
2620
  return {
2492
2621
  success: false,
@@ -8124,11 +8253,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
8124
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"] }] } });
8125
8254
 
8126
8255
  class AXPEntityDetailPopoverComponent {
8256
+ //#endregion
8257
+ //#region ----- Lifecycle -----
8127
8258
  constructor() {
8128
8259
  //#region ----- Services & Dependencies -----
8129
8260
  this.commandService = inject(AXPCommandService);
8130
8261
  this.queryService = inject(AXPQueryService);
8131
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: '' });
8132
8276
  //#endregion
8133
8277
  //#region ----- Inputs -----
8134
8278
  this.entity = input.required(/* @ts-ignore */
@@ -8147,6 +8291,10 @@ class AXPEntityDetailPopoverComponent {
8147
8291
  ...(ngDevMode ? [{ debugName: "entityData" }] : /* istanbul ignore next */ []));
8148
8292
  this.isLoadingDetails = signal(false, /* @ts-ignore */
8149
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;
8150
8298
  //#endregion
8151
8299
  //#region ----- Computed Properties -----
8152
8300
  this.cardLayout = computed(() => {
@@ -8190,7 +8338,7 @@ class AXPEntityDetailPopoverComponent {
8190
8338
  /** Same footer slot the master-list card uses for primary row actions. */
8191
8339
  this.openDetailsActions = computed(() => {
8192
8340
  const definition = this.entityDefinition();
8193
- if (!definition) {
8341
+ if (!definition || !this.canOpenDetails()) {
8194
8342
  return [];
8195
8343
  }
8196
8344
  return [
@@ -8205,6 +8353,22 @@ class AXPEntityDetailPopoverComponent {
8205
8353
  ];
8206
8354
  }, /* @ts-ignore */
8207
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
+ });
8208
8372
  }
8209
8373
  //#endregion
8210
8374
  //#region ----- Event Handlers -----
@@ -8255,7 +8419,7 @@ class AXPEntityDetailPopoverComponent {
8255
8419
  }
8256
8420
  }
8257
8421
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPEntityDetailPopoverComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
8258
- 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 }); }
8259
8423
  }
8260
8424
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPEntityDetailPopoverComponent, decorators: [{
8261
8425
  type: Component,
@@ -8267,8 +8431,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
8267
8431
  AXTranslationModule,
8268
8432
  AXPEntityCardComponent,
8269
8433
  AXPEntityCardSkeletonComponent,
8270
- ], 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"] }]
8271
- }], 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 }] }] } });
8272
8436
 
8273
8437
  class AXPEntityDetailPopoverService {
8274
8438
  constructor() {
@@ -14131,7 +14295,7 @@ class AXMAttachmentsPageComponentProvider {
14131
14295
  return [
14132
14296
  {
14133
14297
  key: ATTACHMENTS_PAGE_COMPONENT_KEY,
14134
- loader: () => import('./acorex-platform-framework-client-layout-entity-attachments-page.component-CDlY8DOy.mjs').then((m) => m.AXMAttachmentsPageComponent),
14298
+ loader: () => import('./acorex-platform-framework-client-layout-entity-attachments-page.component-DLgSciUV.mjs').then((m) => m.AXMAttachmentsPageComponent),
14135
14299
  },
14136
14300
  ];
14137
14301
  }
@@ -14668,7 +14832,7 @@ class AXMGalleryPageComponentProvider {
14668
14832
  return [
14669
14833
  {
14670
14834
  key: GALLERY_PAGE_COMPONENT_KEY,
14671
- loader: () => import('./acorex-platform-framework-client-layout-entity-gallery-page.component-mLLnQemg.mjs').then((m) => m.AXMGalleryPageComponent),
14835
+ loader: () => import('./acorex-platform-framework-client-layout-entity-gallery-page.component-DqfikqLb.mjs').then((m) => m.AXMGalleryPageComponent),
14672
14836
  },
14673
14837
  ];
14674
14838
  }
@@ -25436,6 +25600,9 @@ class AXPLookupWidgetColumnComponent extends AXPColumnWidgetComponent {
25436
25600
  return popover?.enabled !== false;
25437
25601
  }, /* @ts-ignore */
25438
25602
  ...(ngDevMode ? [{ debugName: "detailPopoverEnabled" }] : /* istanbul ignore next */ []));
25603
+ /** Cell opens the preview card. Open Details inside the card follows the view permission. */
25604
+ this.linkEnabled = computed(() => this.detailPopoverEnabled(), /* @ts-ignore */
25605
+ ...(ngDevMode ? [{ debugName: "linkEnabled" }] : /* istanbul ignore next */ []));
25439
25606
  //#endregion
25440
25607
  //#region ---- Signals ----
25441
25608
  this.isMorePopoverOpen = signal(false, /* @ts-ignore */
@@ -25633,7 +25800,17 @@ class AXPLookupWidgetColumnComponent extends AXPColumnWidgetComponent {
25633
25800
  this.entityDetailPopoverService.hide();
25634
25801
  this.openPopoverFromRef(this.moreButton());
25635
25802
  }
25803
+ onLazySummaryClick(event) {
25804
+ if (!this.linkEnabled()) {
25805
+ return;
25806
+ }
25807
+ event.stopPropagation();
25808
+ this.openLazyPopover();
25809
+ }
25636
25810
  openLazyPopover() {
25811
+ if (!this.linkEnabled()) {
25812
+ return;
25813
+ }
25637
25814
  this.entityDetailPopoverService.hide();
25638
25815
  this.openPopoverFromRef(this.lazyTrigger());
25639
25816
  if (!this.isHydratedStrategy()) {
@@ -25648,7 +25825,7 @@ class AXPLookupWidgetColumnComponent extends AXPColumnWidgetComponent {
25648
25825
  }
25649
25826
  }
25650
25827
  async showItemDetail(item, index, anchor) {
25651
- if (!this.detailPopoverEnabled()) {
25828
+ if (!this.linkEnabled()) {
25652
25829
  return;
25653
25830
  }
25654
25831
  const detailAnchor = this.resolveStableDetailAnchor(anchor);
@@ -25707,7 +25884,7 @@ class AXPLookupWidgetColumnComponent extends AXPColumnWidgetComponent {
25707
25884
  });
25708
25885
  }
25709
25886
  handleItemClick(index, event) {
25710
- if (!this.detailPopoverEnabled()) {
25887
+ if (!this.linkEnabled()) {
25711
25888
  return;
25712
25889
  }
25713
25890
  const items = this.allItems();
@@ -25716,7 +25893,7 @@ class AXPLookupWidgetColumnComponent extends AXPColumnWidgetComponent {
25716
25893
  }
25717
25894
  }
25718
25895
  handleResolvedItemClick(index, event) {
25719
- if (!this.detailPopoverEnabled()) {
25896
+ if (!this.linkEnabled()) {
25720
25897
  return;
25721
25898
  }
25722
25899
  const items = this.resolvedPopoverItems();
@@ -25725,6 +25902,9 @@ class AXPLookupWidgetColumnComponent extends AXPColumnWidgetComponent {
25725
25902
  }
25726
25903
  }
25727
25904
  handlePopoverItemClick(index, _event) {
25905
+ if (!this.linkEnabled()) {
25906
+ return;
25907
+ }
25728
25908
  const anchor = this.resolveMorePopoverDetailAnchor();
25729
25909
  if (this.isHydratedStrategy()) {
25730
25910
  const items = this.allItems();
@@ -26156,11 +26336,11 @@ class AXPLookupWidgetColumnComponent extends AXPColumnWidgetComponent {
26156
26336
  return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value) || /^\d+$/.test(value);
26157
26337
  }
26158
26338
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLookupWidgetColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26159
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPLookupWidgetColumnComponent, isStandalone: true, selector: "ng-component", inputs: { rawValue: "rawValue", rowData: "rowData" }, viewQueries: [{ propertyName: "moreButton", first: true, predicate: ["moreButton"], descendants: true, isSignal: true }, { propertyName: "lazyTrigger", first: true, predicate: ["lazyTrigger"], descendants: true, isSignal: true }, { propertyName: "morePopover", first: true, predicate: ["morePopover"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@if (isHydratedStrategy()) {\n <div class=\"relative flex min-w-0 items-center gap-1\">\n @for (item of visibleItems(); track $index) {\n <span\n class=\"min-w-0 truncate\"\n [class.cursor-pointer]=\"detailPopoverEnabled()\"\n [class.hover:text-primary]=\"detailPopoverEnabled()\"\n [class.hover:underline]=\"detailPopoverEnabled()\"\n [attr.title]=\"getItemLabel($index)\"\n (click)=\"handleItemClick($index, $event)\"\n >\n {{ getItemLabel($index) }}\n </span>\n @if ($index < visibleItems().length - 1) {\n <span class=\"text-muted\">\u2022</span>\n }\n } @empty {\n <span class=\"text-muted\">---</span>\n }\n @if (hasMoreItems()) {\n <span\n class=\"absolute end-0 flex h-full cursor-pointer items-center px-1 hover:primary-lighter-surface\"\n (click)=\"showMoreItems(); $event.stopPropagation()\"\n #moreButton\n >\n <i class=\"fa-light fa-ellipsis-vertical\"></i>\n </span>\n }\n </div>\n} @else {\n <div class=\"flex min-w-0 items-center gap-1\">\n @if (displayCount() > 0) {\n <span\n class=\"min-w-0 truncate cursor-pointer text-primary hover:underline\"\n [attr.title]=\"summaryLabel()\"\n (click)=\"openLazyPopover(); $event.stopPropagation()\"\n #lazyTrigger\n >\n {{ summaryLabel() }}\n </span>\n } @else {\n <span class=\"text-muted\">---</span>\n }\n </div>\n}\n\n<ax-popover [openOn]=\"'manual'\" #morePopover (openChange)=\"onPopoverOpenChange($event)\">\n <div class=\"lightest-surface dark:dark-surface min-w-[280px] rounded-lg p-4 shadow-lg\">\n <div class=\"mb-4 border-b pb-2\">\n <h3 class=\"text-base font-semibold\">{{ popoverHeader() }}</h3>\n </div>\n\n @if (!isHydratedStrategy() && resolveStatus() === 'loading') {\n <div class=\"flex min-h-[120px] items-center justify-center\">\n <ax-loading></ax-loading>\n </div>\n } @else if (!isHydratedStrategy() && resolveStatus() === 'error') {\n <div class=\"text-danger text-sm\">{{ resolveError() }}</div>\n } @else {\n <div class=\"flex max-h-64 flex-col gap-3\">\n @for (item of popoverListItems(); track $index) {\n <span\n [class.cursor-pointer]=\"detailPopoverEnabled()\"\n [class.hover:text-primary]=\"detailPopoverEnabled()\"\n [class.hover:underline]=\"detailPopoverEnabled()\"\n (click)=\"handlePopoverItemClick($index, $event)\"\n >\n {{ getPopoverItemLabel($index) }}\n </span>\n } @empty {\n <span class=\"text-muted\">---</span>\n }\n </div>\n }\n </div>\n</ax-popover>\n", dependencies: [{ kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i1$2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i1$1.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "closeOnNavigation", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26339
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPLookupWidgetColumnComponent, isStandalone: true, selector: "ng-component", inputs: { rawValue: "rawValue", rowData: "rowData" }, viewQueries: [{ propertyName: "moreButton", first: true, predicate: ["moreButton"], descendants: true, isSignal: true }, { propertyName: "lazyTrigger", first: true, predicate: ["lazyTrigger"], descendants: true, isSignal: true }, { propertyName: "morePopover", first: true, predicate: ["morePopover"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@if (isHydratedStrategy()) {\n <div class=\"relative flex min-w-0 items-center gap-1\">\n @for (item of visibleItems(); track $index) {\n <span\n class=\"min-w-0 truncate\"\n [class.cursor-pointer]=\"linkEnabled()\"\n [class.hover:text-primary]=\"linkEnabled()\"\n [class.hover:underline]=\"linkEnabled()\"\n [attr.title]=\"getItemLabel($index)\"\n (click)=\"handleItemClick($index, $event)\"\n >\n {{ getItemLabel($index) }}\n </span>\n @if ($index < visibleItems().length - 1) {\n <span class=\"text-muted\">\u2022</span>\n }\n } @empty {\n <span class=\"text-muted\">---</span>\n }\n @if (hasMoreItems()) {\n <span\n class=\"absolute end-0 flex h-full cursor-pointer items-center px-1 hover:primary-lighter-surface\"\n (click)=\"showMoreItems(); $event.stopPropagation()\"\n #moreButton\n >\n <i class=\"fa-light fa-ellipsis-vertical\"></i>\n </span>\n }\n </div>\n} @else {\n <div class=\"flex min-w-0 items-center gap-1\">\n @if (displayCount() > 0) {\n <span\n class=\"min-w-0 truncate\"\n [class.cursor-pointer]=\"linkEnabled()\"\n [class.text-primary]=\"linkEnabled()\"\n [class.hover:underline]=\"linkEnabled()\"\n [attr.title]=\"summaryLabel()\"\n (click)=\"onLazySummaryClick($event)\"\n #lazyTrigger\n >\n {{ summaryLabel() }}\n </span>\n } @else {\n <span class=\"text-muted\">---</span>\n }\n </div>\n}\n\n<ax-popover [openOn]=\"'manual'\" #morePopover (openChange)=\"onPopoverOpenChange($event)\">\n <div class=\"lightest-surface dark:dark-surface min-w-[280px] rounded-lg p-4 shadow-lg\">\n <div class=\"mb-4 border-b pb-2\">\n <h3 class=\"text-base font-semibold\">{{ popoverHeader() }}</h3>\n </div>\n\n @if (!isHydratedStrategy() && resolveStatus() === 'loading') {\n <div class=\"flex min-h-[120px] items-center justify-center\">\n <ax-loading></ax-loading>\n </div>\n } @else if (!isHydratedStrategy() && resolveStatus() === 'error') {\n <div class=\"text-danger text-sm\">{{ resolveError() }}</div>\n } @else {\n <div class=\"flex max-h-64 flex-col gap-3\">\n @for (item of popoverListItems(); track $index) {\n <span\n [class.cursor-pointer]=\"linkEnabled()\"\n [class.hover:text-primary]=\"linkEnabled()\"\n [class.hover:underline]=\"linkEnabled()\"\n (click)=\"handlePopoverItemClick($index, $event)\"\n >\n {{ getPopoverItemLabel($index) }}\n </span>\n } @empty {\n <span class=\"text-muted\">---</span>\n }\n </div>\n }\n </div>\n</ax-popover>\n", dependencies: [{ kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i1$2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i1$1.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "closeOnNavigation", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26160
26340
  }
26161
26341
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLookupWidgetColumnComponent, decorators: [{
26162
26342
  type: Component,
26163
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, imports: [AXLoadingModule, AXPopoverModule], inputs: ['rawValue', 'rowData'], template: "@if (isHydratedStrategy()) {\n <div class=\"relative flex min-w-0 items-center gap-1\">\n @for (item of visibleItems(); track $index) {\n <span\n class=\"min-w-0 truncate\"\n [class.cursor-pointer]=\"detailPopoverEnabled()\"\n [class.hover:text-primary]=\"detailPopoverEnabled()\"\n [class.hover:underline]=\"detailPopoverEnabled()\"\n [attr.title]=\"getItemLabel($index)\"\n (click)=\"handleItemClick($index, $event)\"\n >\n {{ getItemLabel($index) }}\n </span>\n @if ($index < visibleItems().length - 1) {\n <span class=\"text-muted\">\u2022</span>\n }\n } @empty {\n <span class=\"text-muted\">---</span>\n }\n @if (hasMoreItems()) {\n <span\n class=\"absolute end-0 flex h-full cursor-pointer items-center px-1 hover:primary-lighter-surface\"\n (click)=\"showMoreItems(); $event.stopPropagation()\"\n #moreButton\n >\n <i class=\"fa-light fa-ellipsis-vertical\"></i>\n </span>\n }\n </div>\n} @else {\n <div class=\"flex min-w-0 items-center gap-1\">\n @if (displayCount() > 0) {\n <span\n class=\"min-w-0 truncate cursor-pointer text-primary hover:underline\"\n [attr.title]=\"summaryLabel()\"\n (click)=\"openLazyPopover(); $event.stopPropagation()\"\n #lazyTrigger\n >\n {{ summaryLabel() }}\n </span>\n } @else {\n <span class=\"text-muted\">---</span>\n }\n </div>\n}\n\n<ax-popover [openOn]=\"'manual'\" #morePopover (openChange)=\"onPopoverOpenChange($event)\">\n <div class=\"lightest-surface dark:dark-surface min-w-[280px] rounded-lg p-4 shadow-lg\">\n <div class=\"mb-4 border-b pb-2\">\n <h3 class=\"text-base font-semibold\">{{ popoverHeader() }}</h3>\n </div>\n\n @if (!isHydratedStrategy() && resolveStatus() === 'loading') {\n <div class=\"flex min-h-[120px] items-center justify-center\">\n <ax-loading></ax-loading>\n </div>\n } @else if (!isHydratedStrategy() && resolveStatus() === 'error') {\n <div class=\"text-danger text-sm\">{{ resolveError() }}</div>\n } @else {\n <div class=\"flex max-h-64 flex-col gap-3\">\n @for (item of popoverListItems(); track $index) {\n <span\n [class.cursor-pointer]=\"detailPopoverEnabled()\"\n [class.hover:text-primary]=\"detailPopoverEnabled()\"\n [class.hover:underline]=\"detailPopoverEnabled()\"\n (click)=\"handlePopoverItemClick($index, $event)\"\n >\n {{ getPopoverItemLabel($index) }}\n </span>\n } @empty {\n <span class=\"text-muted\">---</span>\n }\n </div>\n }\n </div>\n</ax-popover>\n" }]
26343
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, imports: [AXLoadingModule, AXPopoverModule], inputs: ['rawValue', 'rowData'], template: "@if (isHydratedStrategy()) {\n <div class=\"relative flex min-w-0 items-center gap-1\">\n @for (item of visibleItems(); track $index) {\n <span\n class=\"min-w-0 truncate\"\n [class.cursor-pointer]=\"linkEnabled()\"\n [class.hover:text-primary]=\"linkEnabled()\"\n [class.hover:underline]=\"linkEnabled()\"\n [attr.title]=\"getItemLabel($index)\"\n (click)=\"handleItemClick($index, $event)\"\n >\n {{ getItemLabel($index) }}\n </span>\n @if ($index < visibleItems().length - 1) {\n <span class=\"text-muted\">\u2022</span>\n }\n } @empty {\n <span class=\"text-muted\">---</span>\n }\n @if (hasMoreItems()) {\n <span\n class=\"absolute end-0 flex h-full cursor-pointer items-center px-1 hover:primary-lighter-surface\"\n (click)=\"showMoreItems(); $event.stopPropagation()\"\n #moreButton\n >\n <i class=\"fa-light fa-ellipsis-vertical\"></i>\n </span>\n }\n </div>\n} @else {\n <div class=\"flex min-w-0 items-center gap-1\">\n @if (displayCount() > 0) {\n <span\n class=\"min-w-0 truncate\"\n [class.cursor-pointer]=\"linkEnabled()\"\n [class.text-primary]=\"linkEnabled()\"\n [class.hover:underline]=\"linkEnabled()\"\n [attr.title]=\"summaryLabel()\"\n (click)=\"onLazySummaryClick($event)\"\n #lazyTrigger\n >\n {{ summaryLabel() }}\n </span>\n } @else {\n <span class=\"text-muted\">---</span>\n }\n </div>\n}\n\n<ax-popover [openOn]=\"'manual'\" #morePopover (openChange)=\"onPopoverOpenChange($event)\">\n <div class=\"lightest-surface dark:dark-surface min-w-[280px] rounded-lg p-4 shadow-lg\">\n <div class=\"mb-4 border-b pb-2\">\n <h3 class=\"text-base font-semibold\">{{ popoverHeader() }}</h3>\n </div>\n\n @if (!isHydratedStrategy() && resolveStatus() === 'loading') {\n <div class=\"flex min-h-[120px] items-center justify-center\">\n <ax-loading></ax-loading>\n </div>\n } @else if (!isHydratedStrategy() && resolveStatus() === 'error') {\n <div class=\"text-danger text-sm\">{{ resolveError() }}</div>\n } @else {\n <div class=\"flex max-h-64 flex-col gap-3\">\n @for (item of popoverListItems(); track $index) {\n <span\n [class.cursor-pointer]=\"linkEnabled()\"\n [class.hover:text-primary]=\"linkEnabled()\"\n [class.hover:underline]=\"linkEnabled()\"\n (click)=\"handlePopoverItemClick($index, $event)\"\n >\n {{ getPopoverItemLabel($index) }}\n </span>\n } @empty {\n <span class=\"text-muted\">---</span>\n }\n </div>\n }\n </div>\n</ax-popover>\n" }]
26164
26344
  }], ctorParameters: () => [], propDecorators: { moreButton: [{ type: i0.ViewChild, args: ['moreButton', { isSignal: true }] }], lazyTrigger: [{ type: i0.ViewChild, args: ['lazyTrigger', { isSignal: true }] }], morePopover: [{ type: i0.ViewChild, args: ['morePopover', { isSignal: true }] }] } });
26165
26345
 
26166
26346
  var lookupWidgetColumn_component = /*#__PURE__*/Object.freeze({
@@ -28822,7 +29002,6 @@ const ENTITY_EXTENDED_WIDGETS = [
28822
29002
  defaultFilterOperator: AXP_LOOKUP_FILTER_DEFAULT_OPERATOR,
28823
29003
  components: {},
28824
29004
  options: {
28825
- look: 'select',
28826
29005
  filterMode: true,
28827
29006
  },
28828
29007
  },
@@ -32419,6 +32598,7 @@ class AXPEntityModule {
32419
32598
  AXPWidgetCoreModule,
32420
32599
  LayoutBuilderModule] }); }
32421
32600
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPEntityModule, providers: [
32601
+ { provide: AXP_ENTITY_VIEW_ACCESS, useExisting: AXPEntityDetailsAccessService },
32422
32602
  AXP_ENTITY_DETAILS_VIEW_ADAPTER_LOADER_PROVIDER,
32423
32603
  {
32424
32604
  provide: AXP_REPEATER_ENTITY_BY_KEY_LOOKUP,
@@ -32531,7 +32711,7 @@ class AXPEntityModule {
32531
32711
  },
32532
32712
  {
32533
32713
  key: 'Entity:Bulk',
32534
- command: () => import('./acorex-platform-framework-client-layout-entity-bulk-entity.command-B2mxC3ze.mjs').then((c) => c.AXPBulkEntityCommand),
32714
+ command: () => import('./acorex-platform-framework-client-layout-entity-bulk-entity.command-XZc1xZcD.mjs').then((c) => c.AXPBulkEntityCommand),
32535
32715
  },
32536
32716
  {
32537
32717
  key: 'Entity:OpenList',
@@ -32580,6 +32760,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
32580
32760
  exports: [],
32581
32761
  declarations: [],
32582
32762
  providers: [
32763
+ { provide: AXP_ENTITY_VIEW_ACCESS, useExisting: AXPEntityDetailsAccessService },
32583
32764
  AXP_ENTITY_DETAILS_VIEW_ADAPTER_LOADER_PROVIDER,
32584
32765
  {
32585
32766
  provide: AXP_REPEATER_ENTITY_BY_KEY_LOOKUP,
@@ -32692,7 +32873,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
32692
32873
  },
32693
32874
  {
32694
32875
  key: 'Entity:Bulk',
32695
- command: () => import('./acorex-platform-framework-client-layout-entity-bulk-entity.command-B2mxC3ze.mjs').then((c) => c.AXPBulkEntityCommand),
32876
+ command: () => import('./acorex-platform-framework-client-layout-entity-bulk-entity.command-XZc1xZcD.mjs').then((c) => c.AXPBulkEntityCommand),
32696
32877
  },
32697
32878
  {
32698
32879
  key: 'Entity:OpenList',
@@ -33018,4 +33199,4 @@ function detectEntityChanges(oldObj, newObj) {
33018
33199
  */
33019
33200
 
33020
33201
  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 };
33021
- //# sourceMappingURL=acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-Dla4tdzi.mjs.map
33202
+ //# sourceMappingURL=acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-CXziIWed.mjs.map