@acorex-platform/framework-client 0.0.53 → 0.0.54

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/fesm2022/{acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-DS3F1_EN.mjs → acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-bGKRfOH2.mjs} +427 -117
  2. package/fesm2022/acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-bGKRfOH2.mjs.map +1 -0
  3. package/fesm2022/{acorex-platform-framework-client-layout-entity-attachments-page.component-CWeKcj8t.mjs → acorex-platform-framework-client-layout-entity-attachments-page.component-9inrzTyH.mjs} +2 -2
  4. package/fesm2022/{acorex-platform-framework-client-layout-entity-attachments-page.component-CWeKcj8t.mjs.map → acorex-platform-framework-client-layout-entity-attachments-page.component-9inrzTyH.mjs.map} +1 -1
  5. package/fesm2022/{acorex-platform-framework-client-layout-entity-bulk-entity.command-CgsgFxT8.mjs → acorex-platform-framework-client-layout-entity-bulk-entity.command-C4fDZV2N.mjs} +2 -2
  6. package/fesm2022/{acorex-platform-framework-client-layout-entity-bulk-entity.command-CgsgFxT8.mjs.map → acorex-platform-framework-client-layout-entity-bulk-entity.command-C4fDZV2N.mjs.map} +1 -1
  7. package/fesm2022/{acorex-platform-framework-client-layout-entity-gallery-page.component-Pfp7Lw_A.mjs → acorex-platform-framework-client-layout-entity-gallery-page.component-BFdbsR0q.mjs} +2 -2
  8. package/fesm2022/{acorex-platform-framework-client-layout-entity-gallery-page.component-Pfp7Lw_A.mjs.map → acorex-platform-framework-client-layout-entity-gallery-page.component-BFdbsR0q.mjs.map} +1 -1
  9. package/fesm2022/acorex-platform-framework-client-layout-entity.mjs +1 -1
  10. package/fesm2022/{acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-CWvC9Eh2.mjs → acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-nVzW1Bka.mjs} +249 -139
  11. package/fesm2022/acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-nVzW1Bka.mjs.map +1 -0
  12. package/fesm2022/{acorex-platform-framework-client-layout-widgets-button-widget-designer.component-BkrPu1wO.mjs → acorex-platform-framework-client-layout-widgets-button-widget-designer.component-Cw2yZfaz.mjs} +3 -3
  13. package/fesm2022/{acorex-platform-framework-client-layout-widgets-button-widget-designer.component-BkrPu1wO.mjs.map → acorex-platform-framework-client-layout-widgets-button-widget-designer.component-Cw2yZfaz.mjs.map} +1 -1
  14. package/fesm2022/{acorex-platform-framework-client-layout-widgets-condition-builder-edit-popup.component-WpiEHusZ.mjs → acorex-platform-framework-client-layout-widgets-condition-builder-edit-popup.component-Cbd5Va40.mjs} +3 -3
  15. package/fesm2022/{acorex-platform-framework-client-layout-widgets-condition-builder-edit-popup.component-WpiEHusZ.mjs.map → acorex-platform-framework-client-layout-widgets-condition-builder-edit-popup.component-Cbd5Va40.mjs.map} +1 -1
  16. package/fesm2022/{acorex-platform-framework-client-layout-widgets-page-widget-designer.component-Cadl6guA.mjs → acorex-platform-framework-client-layout-widgets-page-widget-designer.component-CcBk1zN_.mjs} +3 -3
  17. package/fesm2022/{acorex-platform-framework-client-layout-widgets-page-widget-designer.component-Cadl6guA.mjs.map → acorex-platform-framework-client-layout-widgets-page-widget-designer.component-CcBk1zN_.mjs.map} +1 -1
  18. package/fesm2022/{acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-MHOUqz2l.mjs → acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-DfK7xcSW.mjs} +2 -2
  19. package/fesm2022/{acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-MHOUqz2l.mjs.map → acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-DfK7xcSW.mjs.map} +1 -1
  20. package/fesm2022/{acorex-platform-framework-client-layout-widgets-tabular-data-edit-popup.component-BCLxS3rS.mjs → acorex-platform-framework-client-layout-widgets-tabular-data-edit-popup.component-TWxthl21.mjs} +3 -3
  21. package/fesm2022/{acorex-platform-framework-client-layout-widgets-tabular-data-edit-popup.component-BCLxS3rS.mjs.map → acorex-platform-framework-client-layout-widgets-tabular-data-edit-popup.component-TWxthl21.mjs.map} +1 -1
  22. package/fesm2022/{acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-oLFeaHdz.mjs → acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-DZbHlccx.mjs} +4 -4
  23. package/fesm2022/{acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-oLFeaHdz.mjs.map → acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-DZbHlccx.mjs.map} +1 -1
  24. package/fesm2022/{acorex-platform-framework-client-layout-widgets-trigger-expression-editor-popup.component-C2PGoC7r.mjs → acorex-platform-framework-client-layout-widgets-trigger-expression-editor-popup.component-ZvUXJs3G.mjs} +3 -3
  25. package/fesm2022/{acorex-platform-framework-client-layout-widgets-trigger-expression-editor-popup.component-C2PGoC7r.mjs.map → acorex-platform-framework-client-layout-widgets-trigger-expression-editor-popup.component-ZvUXJs3G.mjs.map} +1 -1
  26. package/fesm2022/{acorex-platform-framework-client-layout-widgets-triggers-widget-editor.component-DDDoPoQa.mjs → acorex-platform-framework-client-layout-widgets-triggers-widget-editor.component-B_OM0T7i.mjs} +5 -5
  27. package/fesm2022/{acorex-platform-framework-client-layout-widgets-triggers-widget-editor.component-DDDoPoQa.mjs.map → acorex-platform-framework-client-layout-widgets-triggers-widget-editor.component-B_OM0T7i.mjs.map} +1 -1
  28. package/fesm2022/acorex-platform-framework-client-layout-widgets.mjs +1 -1
  29. package/fesm2022/acorex-platform-framework-client-themes-default.mjs +42 -6
  30. package/fesm2022/acorex-platform-framework-client-themes-default.mjs.map +1 -1
  31. package/package.json +2 -2
  32. package/types/acorex-platform-framework-client-layout-entity.d.ts +28 -3
  33. package/types/acorex-platform-framework-client-layout-widgets.d.ts +34 -2
  34. package/types/acorex-platform-framework-client-themes-default.d.ts +5 -1
  35. package/fesm2022/acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-DS3F1_EN.mjs.map +0 -1
  36. package/fesm2022/acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-CWvC9Eh2.mjs.map +0 -1
@@ -1,4 +1,4 @@
1
- import { isEntityColumnBand, mergeForeignKeyFieldIntoCreateActions, collectNestedCreateHiddenProperties, relatedEntityListViewWidgetOptions, AXPEntityCommandScope, isCardFieldBadgeDisplay, resolveCardFieldBadgeColor, resolveEntityCardAvatarPath, isEntityCardQrField, collectLeftoverCardMoreFieldNames, parseDottedFieldPath, AXP_ENTITY_LIST_RECORD_STYLING_TARGET, isCompleteEntityListStylingCondition, createEntityMasterStylingScope, normalizeEntityMasterStylingClass, resolveEntityMasterStyling, resolveEntityMasterFieldExpression, resolveEntityCardIdentityKind, resolveEntityCardUserId, ENTITY_CARD_LABELED_PREVIEW_MAX, resolveEntityCardLayout, buildDefaultEntityCardLayout, resolveEntityListFilterContextField, resolveEntityListFilterQueryField, resolveEnabledMasterListLayouts, resolveDefaultMasterListLayout, isEntityMasterListCardHost, normalizeEntityMasterListLayoutType, getEntityInfo, normalizeEntityListUserStylingRules, mergeQueryViewAndUserFilters, mergeDefinitionAndCustomQueryViews, isQueryViewDirty, isCustomQueryView, collectEntityListSortPresets, flattenEntityTableColumns, createCustomQueryViewName, removePersistedCustomQueryView, readPersistedCustomQueryViews, upsertPersistedCustomQueryView, snapshotCustomQueryView, isQueryViewColumnVisible, collectEntityListSortableFields, collectEntityListFilterDefinitions, withQueryViewFilterVisibility, queryViewConditionsToFilterQueries, collectEntityCardUserIdQueryFields, buildEntityQueryFields, normalizeAXPQueryViewColumns, findEntityTableColumnInTree, AXPEntityQueryType, ENTITY_ROW_POPUP_TITLE_OPTION, resolveEnabledPageListLayouts, resolveRelatedEntityListViews, buildPageListWidgetName, applyQueryViewToColumnQueries, normalizeEntityDisplayTemplate, sanitizeResolvedEntityDisplayTitle, isUnresolvedEntityDisplayTemplate, resolveLookupWidgetCreateOptions, promoteLegacyEntityCardLayout, inferEntityListSortPresets, buildEntitySearchTitleContext } from '@acorex-platform/framework-shared/entity';
1
+ import { isEntityColumnBand, mergeForeignKeyFieldIntoCreateActions, collectNestedCreateHiddenProperties, relatedEntityListViewWidgetOptions, AXPEntityCommandScope, isCardFieldBadgeDisplay, resolveCardFieldBadgeColor, resolveEntityCardAvatarPath, isEntityCardQrField, collectLeftoverCardMoreFieldNames, parseDottedFieldPath, AXP_ENTITY_LIST_RECORD_STYLING_TARGET, isCompleteEntityListStylingCondition, createEntityMasterStylingScope, normalizeEntityMasterStylingClass, resolveEntityMasterStyling, resolveEntityMasterFieldExpression, resolveEntityCardIdentityKind, resolveEntityCardUserId, ENTITY_CARD_LABELED_PREVIEW_MAX, resolveEntityCardLayout, buildDefaultEntityCardLayout, resolveEntityListFilterContextField, resolveEntityListFilterQueryField, resolveEnabledMasterListLayouts, resolveDefaultMasterListLayout, isEntityMasterListCardHost, normalizeEntityMasterListLayoutType, getEntityInfo, normalizeEntityListUserStylingRules, mergeQueryViewAndUserFilters, flattenEntityTableColumns, mergeDefinitionAndCustomQueryViews, isQueryViewDirty, isCustomQueryView, collectEntityListSortPresets, createCustomQueryViewName, removePersistedCustomQueryView, readPersistedCustomQueryViews, upsertPersistedCustomQueryView, snapshotCustomQueryView, isQueryViewColumnVisible, collectEntityListSortableFields, collectEntityListFilterDefinitions, withQueryViewFilterVisibility, queryViewConditionsToFilterQueries, collectEntityCardUserIdQueryFields, buildEntityQueryFields, normalizeAXPQueryViewColumns, findEntityTableColumnInTree, AXPEntityQueryType, ENTITY_ROW_POPUP_TITLE_OPTION, resolveEnabledPageListLayouts, resolveRelatedEntityListViews, buildPageListWidgetName, applyQueryViewToColumnQueries, normalizeEntityDisplayTemplate, sanitizeResolvedEntityDisplayTitle, isUnresolvedEntityDisplayTemplate, resolveLookupWidgetCreateOptions, promoteLegacyEntityCardLayout, inferEntityListSortPresets, buildEntitySearchTitleContext } from '@acorex-platform/framework-shared/entity';
2
2
  import { resolveEntityActionCommandInput, entityActionDataRecord, defineCommand, AXP_COMMAND_DEFINITION_CATEGORY_ENTITY, analyzeBulkCommandFailures, ENTITY_DELETE_DEFAULT, ENTITY_GET_BY_ID_DEFAULT, ENTITY_QUERY_DEFAULT, ENTITY_INSERT_DEFAULT, ENTITY_UPDATE_DEFAULT, DOMAIN_GET_ENTITY_LAYOUT_DEFAULT, DOMAIN_LIST_ENTITY_LAYOUTS_DEFAULT, resolveEntityNameFromRuntimeKey } from '@acorex-platform/framework-shared/runtime';
3
3
  import { AXToastService } from '@acorex/components/toast';
4
4
  import * as i3$1 from '@acorex/core/translation';
@@ -44,7 +44,7 @@ import * as i1$5 from '@angular/forms';
44
44
  import { FormsModule } from '@angular/forms';
45
45
  import { AXUploaderModule } from '@acorex/components/uploader';
46
46
  import { createStringProperty, createBooleanProperty, createNumberProperty, AXPWidgetGroupEnum, AXPPageStatus, AXPWidgetStatus, createSelectProperty } from '@acorex-platform/framework-shared/widget-core';
47
- import { AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_ALLOW_MULTIPLE_PROPERTY, AXP_DOWNLOADABLE_PROPERTY, AXP_READONLY_PROPERTY, AXP_DESCRIPTION_PROPERTY, AXP_BEHAVIOR_PROPERTY_GROUP, AXP_DISABLED_PROPERTY, AXP_ALLOW_CLEAR_PROPERTY, AXP_DATA_PROPERTY_GROUP, AXP_PLACEHOLDER_PROPERTY, AXPProviderSelectWidgetEditBase, isDataListColumnBand, AXP_ROW_EXPR_PREFIX, applyLeafVisibilityToDataListColumnTree, AXP_REPEATER_ENTITY_BY_KEY_LOOKUP } from '@acorex-platform/framework-client/layout/widgets';
47
+ import { AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_ALLOW_MULTIPLE_PROPERTY, AXP_DOWNLOADABLE_PROPERTY, AXP_READONLY_PROPERTY, AXP_DESCRIPTION_PROPERTY, AXP_BEHAVIOR_PROPERTY_GROUP, AXP_DISABLED_PROPERTY, AXP_ALLOW_CLEAR_PROPERTY, AXP_DATA_PROPERTY_GROUP, AXP_PLACEHOLDER_PROPERTY, AXPProviderSelectWidgetEditBase, flattenDataListWidgetColumns, isDataListColumnBand, AXP_ROW_EXPR_PREFIX, applyLeafVisibilityToDataListColumnTree, AXP_REPEATER_ENTITY_BY_KEY_LOOKUP } from '@acorex-platform/framework-client/layout/widgets';
48
48
  import { AXPopupService } from '@acorex/components/popup';
49
49
  import * as i1$4 from '@acorex/components/skeleton';
50
50
  import { AXSkeletonModule } from '@acorex/components/skeleton';
@@ -10065,6 +10065,114 @@ function buildDataSourceTraceSnapshot(dataSource, extras) {
10065
10065
  };
10066
10066
  }
10067
10067
 
10068
+ //#endregion
10069
+ //#region ----- Specs -----
10070
+ function collectEntityColumnFooterSpecs(columns) {
10071
+ if (!columns?.length) {
10072
+ return [];
10073
+ }
10074
+ const specs = [];
10075
+ for (const column of flattenEntityTableColumns(columns)) {
10076
+ const footer = column.footer;
10077
+ if (!footer) {
10078
+ continue;
10079
+ }
10080
+ specs.push({
10081
+ name: column.name,
10082
+ field: column.options?.dataPath || column.name,
10083
+ operation: footer.operation,
10084
+ });
10085
+ }
10086
+ return specs;
10087
+ }
10088
+ //#endregion
10089
+ //#region ----- Loader -----
10090
+ /**
10091
+ * Loads column footer aggregates without blocking the list page.
10092
+ * The request uses the list filter and ignores skip/take.
10093
+ */
10094
+ class AXPEntityListColumnFooterLoader {
10095
+ constructor(aggregate) {
10096
+ this.aggregate = aggregate;
10097
+ this.state = signal({
10098
+ loading: false,
10099
+ values: {},
10100
+ }, /* @ts-ignore */
10101
+ ...(ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []));
10102
+ this.cache = {
10103
+ filterKey: '',
10104
+ requestId: 0,
10105
+ inFlight: false,
10106
+ };
10107
+ }
10108
+ request(specs, filter) {
10109
+ if (!specs.length) {
10110
+ return;
10111
+ }
10112
+ const filterKey = JSON.stringify(filter ?? null);
10113
+ const sameFilter = this.cache.filterKey === filterKey;
10114
+ if (this.cache.inFlight && sameFilter) {
10115
+ return;
10116
+ }
10117
+ this.cache.filterKey = filterKey;
10118
+ this.cache.inFlight = true;
10119
+ const requestId = ++this.cache.requestId;
10120
+ if (!sameFilter) {
10121
+ this.state.set({ loading: true, values: {} });
10122
+ }
10123
+ const measures = specs.map((spec) => ({
10124
+ reducer: spec.operation,
10125
+ field: spec.operation === 'count' ? undefined : spec.field,
10126
+ alias: spec.name,
10127
+ }));
10128
+ void this.load(specs, filter, measures, requestId);
10129
+ }
10130
+ async load(specs, filter, measures, requestId) {
10131
+ try {
10132
+ const result = await this.aggregate({
10133
+ groupBy: [],
10134
+ measures,
10135
+ filter,
10136
+ });
10137
+ if (requestId !== this.cache.requestId) {
10138
+ return;
10139
+ }
10140
+ const row = result.rows[0];
10141
+ const values = {};
10142
+ for (const spec of specs) {
10143
+ if (!row) {
10144
+ values[spec.name] = spec.operation === 'sum' || spec.operation === 'count' ? 0 : null;
10145
+ continue;
10146
+ }
10147
+ values[spec.name] = coerceFooterNumber(row[spec.name]);
10148
+ }
10149
+ this.state.set({ loading: false, values });
10150
+ }
10151
+ catch {
10152
+ if (requestId !== this.cache.requestId) {
10153
+ return;
10154
+ }
10155
+ this.state.set({ loading: false, values: {} });
10156
+ }
10157
+ finally {
10158
+ if (requestId === this.cache.requestId) {
10159
+ this.cache.inFlight = false;
10160
+ }
10161
+ }
10162
+ }
10163
+ }
10164
+ function coerceFooterNumber(value) {
10165
+ if (typeof value === 'number' && Number.isFinite(value)) {
10166
+ return value;
10167
+ }
10168
+ if (typeof value === 'string' && value.trim().length > 0) {
10169
+ const parsed = Number(value);
10170
+ return Number.isFinite(parsed) ? parsed : null;
10171
+ }
10172
+ return null;
10173
+ }
10174
+ //#endregion
10175
+
10068
10176
  /** @deprecated Use {@link AXPEntityCardSelectActionName}. */
10069
10177
  const AXPEntityMasterListCardSelectActionName = AXPEntityCardSelectActionName;
10070
10178
  class AXPEntityMasterListViewQueryViewModel {
@@ -10317,6 +10425,9 @@ class AXPEntityMasterListViewModel {
10317
10425
  this.filterOperatorMiddleware = this.injector.get(AXPFilterOperatorMiddlewareService);
10318
10426
  this.entityDefinitionRegistry = this.injector.get(AXPEntityDefinitionRegistryService);
10319
10427
  this.cardFieldsResolver = this.injector.get(AXPEntityCardFieldsResolver);
10428
+ this.columnFooterLoader = new AXPEntityListColumnFooterLoader((request) => this.injector.get(AXPEntityRuntimeAccessorService).aggregate(getEntityInfo(this.entityDef).source, request));
10429
+ /** Whole-table footer aggregates for columns that declare `footer`. */
10430
+ this.columnFooter = this.columnFooterLoader.state;
10320
10431
  this.settingEntityKey = `${this.config.module}:${this.config.name}`;
10321
10432
  this.destroyed = new Subject();
10322
10433
  this.lastAppliedSortKey = null;
@@ -10441,6 +10552,7 @@ class AXPEntityMasterListViewModel {
10441
10552
  load: async (e) => {
10442
10553
  resetPagingForTreeChildrenLoad(e, this.entityDef.parentKey);
10443
10554
  const listRequest = this.entityDef.parentKey != null ? applyHierarchicalRootListFilter(e, this.entityDef.parentKey) : e;
10555
+ this.columnFooterLoader.request(collectEntityColumnFooterSpecs(this.entityDef.columns), listRequest.filter);
10444
10556
  const fields = this.buildColumnQueryFields();
10445
10557
  const requestWithFields = fields?.length ? { ...listRequest, fields } : listRequest;
10446
10558
  const execute = this.entityDef.queries?.list?.execute;
@@ -10776,6 +10888,9 @@ class AXPEntityMasterListViewModel {
10776
10888
  }
10777
10889
  return next;
10778
10890
  });
10891
+ // `columnTree` snapshots `visible` when columns are first built. Refresh that snapshot
10892
+ // so a persisted `visible: false` actually hides the column after reload.
10893
+ this.rebuildColumnTree();
10779
10894
  }
10780
10895
  if (Array.isArray(sorts) && sorts.length) {
10781
10896
  this.setActiveSortsFromQueries(sorts);
@@ -11020,6 +11135,18 @@ class AXPEntityMasterListViewModel {
11020
11135
  return next;
11021
11136
  });
11022
11137
  }
11138
+ /**
11139
+ * Table resize events send `column.name` (for example `title`).
11140
+ * Older columns used a `col-` prefix. Persisted settings store `dataPath` when set.
11141
+ */
11142
+ resolvePersistedColumnName(dataField) {
11143
+ const raw = dataField.startsWith('col-') ? dataField.slice(4) : dataField;
11144
+ const match = this.columns().find((column) => {
11145
+ const persistedName = column.column?.options?.dataPath ?? column.name;
11146
+ return column.name === raw || persistedName === raw;
11147
+ });
11148
+ return match ? (match.column?.options?.dataPath ?? match.name) : raw;
11149
+ }
11023
11150
  async saveSettings(changesType, data) {
11024
11151
  if (!(await this.shouldPersistListState())) {
11025
11152
  return;
@@ -11027,8 +11154,29 @@ class AXPEntityMasterListViewModel {
11027
11154
  switch (changesType) {
11028
11155
  case 'columnSizes': {
11029
11156
  const columnSizeData = data;
11157
+ const dataField = String(columnSizeData?.dataField ?? '');
11158
+ const width = toPersistedColumnWidth(columnSizeData?.width);
11159
+ if (!dataField || !width) {
11160
+ break;
11161
+ }
11162
+ const persistedName = this.resolvePersistedColumnName(dataField);
11163
+ this.columns.update((columns) => {
11164
+ let changed = false;
11165
+ const next = columns.map((column) => {
11166
+ const key = column.column?.options?.dataPath ?? column.name;
11167
+ if (key !== persistedName && column.name !== persistedName) {
11168
+ return column;
11169
+ }
11170
+ if (column.width === width) {
11171
+ return column;
11172
+ }
11173
+ changed = true;
11174
+ column.width = width;
11175
+ return column;
11176
+ });
11177
+ return changed ? next : columns;
11178
+ });
11030
11179
  await this.enqueueSettingsUpdate((prev) => {
11031
- const field = columnSizeData.dataField.split('-')[1];
11032
11180
  const newSettings = { ...prev };
11033
11181
  const existingColumns = prev?.list?.views?.[this.view().name]?.columns;
11034
11182
  const baseColumns = Array.isArray(existingColumns) && existingColumns.length
@@ -11040,7 +11188,7 @@ class AXPEntityMasterListViewModel {
11040
11188
  }));
11041
11189
  const updatedColumns = baseColumns.map((c) => ({
11042
11190
  ...c,
11043
- width: c.name === field ? columnSizeData.width : c.width,
11191
+ width: c.name === persistedName ? width : c.width,
11044
11192
  }));
11045
11193
  set(newSettings, `list.views.${this.view().name}.columns`, updatedColumns);
11046
11194
  set(newSettings, `list.views.${this.view().name}.columnsVersion`, getEntityListColumnsSettingsVersion());
@@ -12260,6 +12408,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
12260
12408
  type: Injectable,
12261
12409
  args: [{ providedIn: 'root' }]
12262
12410
  }] });
12411
+ function toPersistedColumnWidth(width) {
12412
+ if (typeof width === 'number' && Number.isFinite(width) && width > 0) {
12413
+ return `${Math.round(width)}px`;
12414
+ }
12415
+ if (typeof width !== 'string') {
12416
+ return undefined;
12417
+ }
12418
+ const trimmed = width.trim();
12419
+ if (!trimmed || trimmed === 'auto') {
12420
+ return undefined;
12421
+ }
12422
+ if (/^\d+(\.\d+)?$/.test(trimmed)) {
12423
+ const parsed = Number(trimmed);
12424
+ return Number.isFinite(parsed) && parsed > 0 ? `${Math.round(parsed)}px` : undefined;
12425
+ }
12426
+ return trimmed;
12427
+ }
12263
12428
  const AXPEntityListViewModelResolver = async (route, state, service = inject(AXPEntityListViewModelFactory), router = inject(Router), hooks = inject(AXPHookService)) => {
12264
12429
  const moduleName = route.parent?.paramMap.get('module');
12265
12430
  const entityName = route.paramMap.get('entity');
@@ -13835,7 +14000,7 @@ class AXMAttachmentsPageComponentProvider {
13835
14000
  return [
13836
14001
  {
13837
14002
  key: ATTACHMENTS_PAGE_COMPONENT_KEY,
13838
- loader: () => import('./acorex-platform-framework-client-layout-entity-attachments-page.component-CWeKcj8t.mjs').then((m) => m.AXMAttachmentsPageComponent),
14003
+ loader: () => import('./acorex-platform-framework-client-layout-entity-attachments-page.component-9inrzTyH.mjs').then((m) => m.AXMAttachmentsPageComponent),
13839
14004
  },
13840
14005
  ];
13841
14006
  }
@@ -14372,7 +14537,7 @@ class AXMGalleryPageComponentProvider {
14372
14537
  return [
14373
14538
  {
14374
14539
  key: GALLERY_PAGE_COMPONENT_KEY,
14375
- loader: () => import('./acorex-platform-framework-client-layout-entity-gallery-page.component-Pfp7Lw_A.mjs').then((m) => m.AXMGalleryPageComponent),
14540
+ loader: () => import('./acorex-platform-framework-client-layout-entity-gallery-page.component-BFdbsR0q.mjs').then((m) => m.AXMGalleryPageComponent),
14376
14541
  },
14377
14542
  ];
14378
14543
  }
@@ -18528,9 +18693,25 @@ function mapEntityColumnToWidgetColumn(entity, column) {
18528
18693
  title: columnDef.title || property?.title || columnDef.name,
18529
18694
  width: columnDef.options?.width,
18530
18695
  visible: columnDef.options?.visible !== false,
18696
+ ...(columnDef.footer ? { footer: columnDef.footer } : {}),
18531
18697
  widget,
18532
18698
  };
18533
18699
  }
18700
+ function collectDataListColumnFooterSpecs(columns) {
18701
+ const specs = [];
18702
+ for (const column of flattenDataListWidgetColumns(columns)) {
18703
+ const footer = column.footer;
18704
+ if (!footer) {
18705
+ continue;
18706
+ }
18707
+ specs.push({
18708
+ name: column.name,
18709
+ field: column.widget?.path || column.name,
18710
+ operation: footer.operation,
18711
+ });
18712
+ }
18713
+ return specs;
18714
+ }
18534
18715
  /**
18535
18716
  * Applies entity column width (explicit or resolved via {@link AXPColumnWidthService}) to data-list columns.
18536
18717
  */
@@ -18612,6 +18793,7 @@ class AXPEntityListTableService {
18612
18793
  this.contextEvalFactory = inject(AXPContextEvalFactory);
18613
18794
  this.settings = inject(AXPSettingsService);
18614
18795
  this.columnWidthService = inject(AXPColumnWidthService);
18796
+ this.entityAccessor = inject(AXPEntityRuntimeAccessorService);
18615
18797
  this.evaluateExpressions = async (options, data) => {
18616
18798
  if (!options) {
18617
18799
  return {};
@@ -18640,11 +18822,16 @@ class AXPEntityListTableService {
18640
18822
  showIndex = false;
18641
18823
  }
18642
18824
  }
18825
+ const columns = this.createColumnsFromProperties(entity, options);
18826
+ const footerSpecs = collectDataListColumnFooterSpecs(columns);
18827
+ const columnFooter = footerSpecs.length
18828
+ ? new AXPEntityListColumnFooterLoader((request) => this.entityAccessor.aggregate(getEntityInfo(entity).source, request))
18829
+ : undefined;
18643
18830
  const listOptions = {
18644
18831
  // 📊 Data Source
18645
- dataSource: this.createDataSource(entity, options),
18832
+ dataSource: this.createDataSource(entity, options, columnFooter, footerSpecs),
18646
18833
  // 📋 Columns from Properties
18647
- columns: this.createColumnsFromProperties(entity, options),
18834
+ columns,
18648
18835
  // 🎯 Row Commands from Actions
18649
18836
  primaryCommands: this.createRowCommands(allActions, 'primary'),
18650
18837
  secondaryCommands: this.createRowCommands(allActions, 'secondary'),
@@ -18653,7 +18840,8 @@ class AXPEntityListTableService {
18653
18840
  allowSelection: this.hasSelectedScopeActions(entity),
18654
18841
  paging: true,
18655
18842
  showHeader: true,
18656
- showFooter: false,
18843
+ showFooter: footerSpecs.length > 0,
18844
+ ...(columnFooter ? { columnFooter: columnFooter.state } : {}),
18657
18845
  // 🔗 Entity Configuration
18658
18846
  parentField: entity.parentKey,
18659
18847
  fetchDataMode: 'manual',
@@ -18673,7 +18861,7 @@ class AXPEntityListTableService {
18673
18861
  /**
18674
18862
  * Create DataSource for Entity
18675
18863
  */
18676
- createDataSource(entity, options) {
18864
+ createDataSource(entity, options, columnFooter, footerSpecs) {
18677
18865
  return new AXDataSource({
18678
18866
  byKey: (key) => {
18679
18867
  const func = entity.queries?.byKey?.execute;
@@ -18685,6 +18873,10 @@ class AXPEntityListTableService {
18685
18873
  throw new Error(`Entity ${entity.name} does not have a list query`);
18686
18874
  }
18687
18875
  resetPagingForTreeChildrenLoad(e, entity.parentKey);
18876
+ if (columnFooter && footerSpecs.length) {
18877
+ const scoped = entity.parentKey ? applyHierarchicalRootListFilter(e, entity.parentKey) : e;
18878
+ columnFooter.request(footerSpecs, scoped.filter);
18879
+ }
18688
18880
  return func(e);
18689
18881
  },
18690
18882
  pageSize: options?.pageSize || entity.interfaces?.master?.list?.views?.[0]?.pageSize || 10,
@@ -21369,83 +21561,6 @@ var lookupWidgetView_component = /*#__PURE__*/Object.freeze({
21369
21561
  AXPLookupWidgetViewComponent: AXPLookupWidgetViewComponent
21370
21562
  });
21371
21563
 
21372
- //#region ---- Expression Scope ----
21373
- /**
21374
- * Builds the expression scope used to evaluate lookup `create.context` templates.
21375
- * Matches widget-renderer `context.eval` / `context.set` semantics.
21376
- */
21377
- function buildLookupExpressionScope(contextService, parentPath) {
21378
- return {
21379
- context: {
21380
- eval: (path) => {
21381
- const fullPath = path.startsWith('>') && parentPath ? `${parentPath}.${path.substring(1)}` : path;
21382
- return contextService.getValue(fullPath);
21383
- },
21384
- set: (path, value) => {
21385
- contextService.update(path, value, { origin: 'user' });
21386
- },
21387
- data: () => contextService.data(),
21388
- isDirty: () => {
21389
- if (!contextService.isSavedCommitted()) {
21390
- return false;
21391
- }
21392
- return contextService.isDirty();
21393
- },
21394
- options: (path) => {
21395
- if (path == null || path === '') {
21396
- return contextService.getValue('options');
21397
- }
21398
- return contextService.getValue(`options.${path}`);
21399
- },
21400
- },
21401
- events: {},
21402
- widget: {},
21403
- methods: {},
21404
- vars: {},
21405
- };
21406
- }
21407
- //#endregion
21408
- //#region ---- Create Context Evaluation ----
21409
- /**
21410
- * Deep-evaluates expression strings inside lookup `create.context` (e.g. parentId from context).
21411
- */
21412
- async function evaluateLookupCreateContext(template, expressionEvaluator, scope) {
21413
- if (!template || !isObjectLike(template)) {
21414
- return {};
21415
- }
21416
- return (await evaluateLookupCreateContextValue(template, expressionEvaluator, scope));
21417
- }
21418
- async function evaluateLookupCreateContextValue(value, expressionEvaluator, scope) {
21419
- if (typeof value === 'string' && expressionEvaluator.isExpression(value)) {
21420
- return expressionEvaluator.evaluate(value, scope);
21421
- }
21422
- if (isArray(value)) {
21423
- const results = await Promise.all(value.map((entry) => evaluateLookupCreateContextValue(entry, expressionEvaluator, scope)));
21424
- return results;
21425
- }
21426
- if (isObjectLike(value)) {
21427
- const result = {};
21428
- for (const [key, entry] of Object.entries(value)) {
21429
- result[key] = await evaluateLookupCreateContextValue(entry, expressionEvaluator, scope);
21430
- }
21431
- return result;
21432
- }
21433
- return value;
21434
- }
21435
- /**
21436
- * Removes null/undefined entries from resolved create context before Entity:Create.
21437
- */
21438
- function compactLookupCreateContext(data) {
21439
- const result = {};
21440
- for (const [key, value] of Object.entries(cloneDeep(data))) {
21441
- if (!isNil(value) && value !== '') {
21442
- result[key] = value;
21443
- }
21444
- }
21445
- return result;
21446
- }
21447
- //#endregion
21448
-
21449
21564
  //#endregion
21450
21565
  class AXPEntityDataSelectorRowActionsService {
21451
21566
  constructor() {
@@ -21629,6 +21744,83 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
21629
21744
  }]
21630
21745
  }] });
21631
21746
 
21747
+ //#region ---- Expression Scope ----
21748
+ /**
21749
+ * Builds the expression scope used to evaluate lookup `create.context` templates.
21750
+ * Matches widget-renderer `context.eval` / `context.set` semantics.
21751
+ */
21752
+ function buildLookupExpressionScope(contextService, parentPath) {
21753
+ return {
21754
+ context: {
21755
+ eval: (path) => {
21756
+ const fullPath = path.startsWith('>') && parentPath ? `${parentPath}.${path.substring(1)}` : path;
21757
+ return contextService.getValue(fullPath);
21758
+ },
21759
+ set: (path, value) => {
21760
+ contextService.update(path, value, { origin: 'user' });
21761
+ },
21762
+ data: () => contextService.data(),
21763
+ isDirty: () => {
21764
+ if (!contextService.isSavedCommitted()) {
21765
+ return false;
21766
+ }
21767
+ return contextService.isDirty();
21768
+ },
21769
+ options: (path) => {
21770
+ if (path == null || path === '') {
21771
+ return contextService.getValue('options');
21772
+ }
21773
+ return contextService.getValue(`options.${path}`);
21774
+ },
21775
+ },
21776
+ events: {},
21777
+ widget: {},
21778
+ methods: {},
21779
+ vars: {},
21780
+ };
21781
+ }
21782
+ //#endregion
21783
+ //#region ---- Create Context Evaluation ----
21784
+ /**
21785
+ * Deep-evaluates expression strings inside lookup `create.context` (e.g. parentId from context).
21786
+ */
21787
+ async function evaluateLookupCreateContext(template, expressionEvaluator, scope) {
21788
+ if (!template || !isObjectLike(template)) {
21789
+ return {};
21790
+ }
21791
+ return (await evaluateLookupCreateContextValue(template, expressionEvaluator, scope));
21792
+ }
21793
+ async function evaluateLookupCreateContextValue(value, expressionEvaluator, scope) {
21794
+ if (typeof value === 'string' && expressionEvaluator.isExpression(value)) {
21795
+ return expressionEvaluator.evaluate(value, scope);
21796
+ }
21797
+ if (isArray(value)) {
21798
+ const results = await Promise.all(value.map((entry) => evaluateLookupCreateContextValue(entry, expressionEvaluator, scope)));
21799
+ return results;
21800
+ }
21801
+ if (isObjectLike(value)) {
21802
+ const result = {};
21803
+ for (const [key, entry] of Object.entries(value)) {
21804
+ result[key] = await evaluateLookupCreateContextValue(entry, expressionEvaluator, scope);
21805
+ }
21806
+ return result;
21807
+ }
21808
+ return value;
21809
+ }
21810
+ /**
21811
+ * Removes null/undefined entries from resolved create context before Entity:Create.
21812
+ */
21813
+ function compactLookupCreateContext(data) {
21814
+ const result = {};
21815
+ for (const [key, value] of Object.entries(cloneDeep(data))) {
21816
+ if (!isNil(value) && value !== '') {
21817
+ result[key] = value;
21818
+ }
21819
+ }
21820
+ return result;
21821
+ }
21822
+ //#endregion
21823
+
21632
21824
  const LEGACY_ENTITY_DATA_SELECTOR_OPTION_KEYS = [
21633
21825
  'allowMultiple',
21634
21826
  'allowUnselect',
@@ -22800,6 +22992,18 @@ function createLookupEntityTreeDataSource(config) {
22800
22992
  //#endregion
22801
22993
  //#region ---- Helpers ----
22802
22994
  const LOADING_LABEL = '@acorex:common.status.loading';
22995
+ /**
22996
+ * Entity keys can come back as strings from `byKey` while the bound value is numeric (or vice versa).
22997
+ */
22998
+ function isSameLookupKey(left, right) {
22999
+ if (left === right) {
23000
+ return true;
23001
+ }
23002
+ if (left == null || right == null) {
23003
+ return false;
23004
+ }
23005
+ return String(left) === String(right);
23006
+ }
22803
23007
  /**
22804
23008
  * Resolves stored widget value(s) to entity key(s).
22805
23009
  */
@@ -22856,7 +23060,7 @@ function areLookupSelectionItemsHydrated(rawValue, items, options) {
22856
23060
  }
22857
23061
  const { valueField } = options;
22858
23062
  return ids.every((id) => {
22859
- const item = items.find((candidate) => get(candidate, valueField) === id);
23063
+ const item = items.find((candidate) => isSameLookupKey(get(candidate, valueField), id));
22860
23064
  return item != null && isLookupItemHydrated(item, options);
22861
23065
  });
22862
23066
  }
@@ -23254,6 +23458,8 @@ function findTreeNode(nodes, valueField, key) {
23254
23458
  //#region ----- Component -----
23255
23459
  class AXPLookupWidgetTablePanelComponent {
23256
23460
  #loadedItems;
23461
+ /** Set when a row command fires so the following row click does not select. */
23462
+ #skipNextRowSelection;
23257
23463
  #totalCount;
23258
23464
  //#endregion
23259
23465
  //#region ----- Lifecycle -----
@@ -23282,9 +23488,13 @@ class AXPLookupWidgetTablePanelComponent {
23282
23488
  /** When set, matching text in table cells is highlighted. */
23283
23489
  this.highlightText = input('', /* @ts-ignore */
23284
23490
  ...(ngDevMode ? [{ debugName: "highlightText" }] : /* istanbul ignore next */ []));
23491
+ /** Entity list row actions (preview, etc.) shown as command columns. */
23492
+ this.rowActions = input(/* @ts-ignore */
23493
+ ...(ngDevMode ? [undefined, { debugName: "rowActions" }] : /* istanbul ignore next */ []));
23285
23494
  //#endregion
23286
23495
  //#region ----- Outputs -----
23287
23496
  this.itemClick = output();
23497
+ this.rowAction = output();
23288
23498
  //#endregion
23289
23499
  //#region ----- View Children -----
23290
23500
  this.tableRef = viewChild(AXDataTableComponent, /* @ts-ignore */
@@ -23293,7 +23503,20 @@ class AXPLookupWidgetTablePanelComponent {
23293
23503
  //#region ----- State -----
23294
23504
  this.visibleColumns = computed(() => this.columns().filter((column) => column.visible !== false), /* @ts-ignore */
23295
23505
  ...(ngDevMode ? [{ debugName: "visibleColumns" }] : /* istanbul ignore next */ []));
23506
+ this.hasRowActionPrimary = computed(() => this.rowActions()?.hasPrimary() ?? false, /* @ts-ignore */
23507
+ ...(ngDevMode ? [{ debugName: "hasRowActionPrimary" }] : /* istanbul ignore next */ []));
23508
+ this.hasRowActionDropdown = computed(() => this.rowActions()?.hasDropdown() ?? false, /* @ts-ignore */
23509
+ ...(ngDevMode ? [{ debugName: "hasRowActionDropdown" }] : /* istanbul ignore next */ []));
23510
+ this.primaryRowActionItems = computed(() => (this.rowActions()?.getPrimaryItems() ?? []), /* @ts-ignore */
23511
+ ...(ngDevMode ? [{ debugName: "primaryRowActionItems" }] : /* istanbul ignore next */ []));
23512
+ this.primaryRowActionColumnWidth = computed(() => {
23513
+ const count = this.primaryRowActionItems().length;
23514
+ return count > 0 ? `${count * 70}px` : '60px';
23515
+ }, /* @ts-ignore */
23516
+ ...(ngDevMode ? [{ debugName: "primaryRowActionColumnWidth" }] : /* istanbul ignore next */ []));
23296
23517
  this.#loadedItems = [];
23518
+ /** Set when a row command fires so the following row click does not select. */
23519
+ this.#skipNextRowSelection = false;
23297
23520
  this.#totalCount = signal(0, /* @ts-ignore */
23298
23521
  ...(ngDevMode ? [{ debugName: "#totalCount" }] : /* istanbul ignore next */ []));
23299
23522
  this.tableDataSource = new AXDataSource({
@@ -23323,6 +23546,13 @@ class AXPLookupWidgetTablePanelComponent {
23323
23546
  }), /* @ts-ignore */
23324
23547
  ...(ngDevMode ? [{ debugName: "loadingConfig" }] : /* istanbul ignore next */ []));
23325
23548
  this.host = inject((ElementRef));
23549
+ this.getDropdownRowActionItems = (rowData) => {
23550
+ const handler = this.rowActions();
23551
+ if (!handler) {
23552
+ return Promise.resolve([]);
23553
+ }
23554
+ return handler.getDropdownItems(rowData).then((items) => items);
23555
+ };
23326
23556
  //#endregion
23327
23557
  //#region ----- Row State -----
23328
23558
  this.resolveRowCssClass = (row) => {
@@ -23385,8 +23615,22 @@ class AXPLookupWidgetTablePanelComponent {
23385
23615
  //#endregion
23386
23616
  //#region ----- Event Handlers -----
23387
23617
  handleRowClick(event) {
23618
+ if (this.#skipNextRowSelection) {
23619
+ this.#skipNextRowSelection = false;
23620
+ return;
23621
+ }
23388
23622
  this.#handleItemClick(event.data);
23389
23623
  }
23624
+ handleRowActionClick(event) {
23625
+ event.nativeEvent.preventDefault();
23626
+ event.nativeEvent.stopPropagation();
23627
+ this.#skipNextRowSelection = true;
23628
+ const item = event.data;
23629
+ if (!item) {
23630
+ return;
23631
+ }
23632
+ this.rowAction.emit({ name: event.name, item });
23633
+ }
23390
23634
  handleItemMouseDown(event, item) {
23391
23635
  event.preventDefault();
23392
23636
  event.stopPropagation();
@@ -23438,7 +23682,7 @@ class AXPLookupWidgetTablePanelComponent {
23438
23682
  return Boolean(item[this.disabledField()]);
23439
23683
  }
23440
23684
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLookupWidgetTablePanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23441
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPLookupWidgetTablePanelComponent, isStandalone: true, selector: "axp-lookup-widget-table-panel", inputs: { dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: true, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, valueField: { classPropertyName: "valueField", publicName: "valueField", isSignal: true, isRequired: false, transformFunction: null }, disabledField: { classPropertyName: "disabledField", publicName: "disabledField", isSignal: true, isRequired: false, transformFunction: null }, selectedValues: { classPropertyName: "selectedValues", publicName: "selectedValues", isSignal: true, isRequired: false, transformFunction: null }, parentField: { classPropertyName: "parentField", publicName: "parentField", isSignal: true, isRequired: false, transformFunction: null }, hasChildrenField: { classPropertyName: "hasChildrenField", publicName: "hasChildrenField", isSignal: true, isRequired: false, transformFunction: null }, itemHeight: { classPropertyName: "itemHeight", publicName: "itemHeight", isSignal: true, isRequired: false, transformFunction: null }, maxVisibleItems: { classPropertyName: "maxVisibleItems", publicName: "maxVisibleItems", isSignal: true, isRequired: false, transformFunction: null }, alternate: { classPropertyName: "alternate", publicName: "alternate", isSignal: true, isRequired: false, transformFunction: null }, highlightText: { classPropertyName: "highlightText", publicName: "highlightText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick" }, host: { properties: { "class.ax-lookup-multi-column-tree": "!!parentField()", "style.height.px": "tableHeight()" }, classAttribute: "ax-lookup-multi-column block min-h-0" }, viewQueries: [{ propertyName: "tableRef", first: true, predicate: AXDataTableComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<ax-data-table\n class=\"ax-lookup-multi-column-table\"\n look=\"minimal\"\n [dataSource]=\"parentField() ? dataSource() : tableDataSource\"\n [parentField]=\"parentField() ?? ''\"\n [hasChildrenField]=\"hasChildrenField()\"\n [itemHeight]=\"itemHeight()\"\n [alternative]=\"alternate()\"\n [highlightText]=\"highlightText()\"\n [loading]=\"loadingConfig()\"\n [paging]=\"false\"\n [showHeader]=\"true\"\n [fixedHeader]=\"true\"\n [showFooter]=\"false\"\n [allowReordering]=\"false\"\n [rowCssClass]=\"resolveRowCssClass\"\n (onRowClick)=\"handleRowClick($event)\"\n>\n @for (column of visibleColumns(); track column.name) {\n <axp-widget-column-renderer\n [expandHandler]=\"$index === 0 && !!parentField()\"\n [caption]=\"column.title\"\n [customWidth]=\"resolveColumnWidth(column)\"\n [node]=\"column.node\"\n ></axp-widget-column-renderer>\n }\n</ax-data-table>\n", dependencies: [{ kind: "ngmodule", type: AXDataTableModule }, { kind: "component", type: i1$7.AXDataTableComponent, selector: "ax-data-table", inputs: ["dataSource", "selectedRows", "parentField", "hasChildrenField", "rowDetailsTemplate", "rowCssClass", "cellCssClass", "highlightText", "look", "rowTemplate", "emptyTemplate", "noDataTemplate", "alternative", "showHeader", "fixedHeader", "showFooter", "fixedFooter", "itemHeight", "allowReordering", "paging", "fetchDataMode", "loading", "focusedRow"], outputs: ["selectedRowsChange", "focusedRowChange", "onRowClick", "onRowDbClick", "onColumnsOrderChanged", "onColumnSizeChanged", "onPageChanged"] }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i1$6.AXPWidgetColumnRendererComponent, selector: "axp-widget-column-renderer", inputs: ["caption", "customExpandIcon", "customCollapseIcon", "customWidth", "columnKey", "node", "footerTemplate", "expandHandler", "sortEnabled", "headerSortDirection", "headerSortPriority", "columnFixed", "cellTemplate", "headerTemplate"], outputs: ["sortToggle"] }, { kind: "ngmodule", type: AXTranslationModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23685
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPLookupWidgetTablePanelComponent, isStandalone: true, selector: "axp-lookup-widget-table-panel", inputs: { dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: true, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, valueField: { classPropertyName: "valueField", publicName: "valueField", isSignal: true, isRequired: false, transformFunction: null }, disabledField: { classPropertyName: "disabledField", publicName: "disabledField", isSignal: true, isRequired: false, transformFunction: null }, selectedValues: { classPropertyName: "selectedValues", publicName: "selectedValues", isSignal: true, isRequired: false, transformFunction: null }, parentField: { classPropertyName: "parentField", publicName: "parentField", isSignal: true, isRequired: false, transformFunction: null }, hasChildrenField: { classPropertyName: "hasChildrenField", publicName: "hasChildrenField", isSignal: true, isRequired: false, transformFunction: null }, itemHeight: { classPropertyName: "itemHeight", publicName: "itemHeight", isSignal: true, isRequired: false, transformFunction: null }, maxVisibleItems: { classPropertyName: "maxVisibleItems", publicName: "maxVisibleItems", isSignal: true, isRequired: false, transformFunction: null }, alternate: { classPropertyName: "alternate", publicName: "alternate", isSignal: true, isRequired: false, transformFunction: null }, highlightText: { classPropertyName: "highlightText", publicName: "highlightText", isSignal: true, isRequired: false, transformFunction: null }, rowActions: { classPropertyName: "rowActions", publicName: "rowActions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick", rowAction: "rowAction" }, host: { properties: { "class.ax-lookup-multi-column-tree": "!!parentField()", "style.height.px": "tableHeight()" }, classAttribute: "ax-lookup-multi-column block min-h-0" }, viewQueries: [{ propertyName: "tableRef", first: true, predicate: AXDataTableComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<ax-data-table\n class=\"ax-lookup-multi-column-table\"\n look=\"minimal\"\n [dataSource]=\"parentField() ? dataSource() : tableDataSource\"\n [parentField]=\"parentField() ?? ''\"\n [hasChildrenField]=\"hasChildrenField()\"\n [itemHeight]=\"itemHeight()\"\n [alternative]=\"alternate()\"\n [highlightText]=\"highlightText()\"\n [loading]=\"loadingConfig()\"\n [paging]=\"false\"\n [showHeader]=\"true\"\n [fixedHeader]=\"true\"\n [showFooter]=\"false\"\n [allowReordering]=\"false\"\n [rowCssClass]=\"resolveRowCssClass\"\n (onRowClick)=\"handleRowClick($event)\"\n>\n @for (column of visibleColumns(); track column.name) {\n <axp-widget-column-renderer\n [expandHandler]=\"$index === 0 && !!parentField()\"\n [caption]=\"column.title\"\n [customWidth]=\"resolveColumnWidth(column)\"\n [node]=\"column.node\"\n ></axp-widget-column-renderer>\n }\n <!-- ----- Entity row actions (preview, etc.) ----- -->\n @if (hasRowActionPrimary()) {\n <ax-command-column\n fixed=\"end\"\n [width]=\"primaryRowActionColumnWidth()\"\n [items]=\"primaryRowActionItems()\"\n (onItemClick)=\"handleRowActionClick($event)\"\n ></ax-command-column>\n }\n @if (hasRowActionDropdown()) {\n <ax-dropdown-command-column\n fixed=\"end\"\n [width]=\"'60px'\"\n [items]=\"getDropdownRowActionItems\"\n (onItemClick)=\"handleRowActionClick($event)\"\n ></ax-dropdown-command-column>\n }\n</ax-data-table>\n", dependencies: [{ kind: "ngmodule", type: AXDataTableModule }, { kind: "component", type: i1$7.AXDataTableComponent, selector: "ax-data-table", inputs: ["dataSource", "selectedRows", "parentField", "hasChildrenField", "rowDetailsTemplate", "rowCssClass", "cellCssClass", "highlightText", "look", "rowTemplate", "emptyTemplate", "noDataTemplate", "alternative", "showHeader", "fixedHeader", "showFooter", "fixedFooter", "itemHeight", "allowReordering", "paging", "fetchDataMode", "loading", "focusedRow"], outputs: ["selectedRowsChange", "focusedRowChange", "onRowClick", "onRowDbClick", "onColumnsOrderChanged", "onColumnSizeChanged", "onPageChanged"] }, { kind: "component", type: i1$7.AXRowCommandColumnComponent, selector: "ax-command-column", inputs: ["width", "caption", "fixed", "footerTemplate", "items"], outputs: ["onItemClick"] }, { kind: "component", type: i1$7.AXRowDropdownCommandColumnComponent, selector: "ax-dropdown-command-column", inputs: ["width", "caption", "fixed", "footerTemplate", "emptyStateTemplate", "emptyStateText", "items"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i1$6.AXPWidgetColumnRendererComponent, selector: "axp-widget-column-renderer", inputs: ["caption", "customExpandIcon", "customCollapseIcon", "customWidth", "columnKey", "node", "footerTemplate", "expandHandler", "sortEnabled", "headerSortDirection", "headerSortPriority", "columnFixed", "cellTemplate", "headerTemplate"], outputs: ["sortToggle"] }, { kind: "ngmodule", type: AXTranslationModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23442
23686
  }
23443
23687
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLookupWidgetTablePanelComponent, decorators: [{
23444
23688
  type: Component,
@@ -23446,8 +23690,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
23446
23690
  class: 'ax-lookup-multi-column block min-h-0',
23447
23691
  '[class.ax-lookup-multi-column-tree]': '!!parentField()',
23448
23692
  '[style.height.px]': 'tableHeight()',
23449
- }, template: "<ax-data-table\n class=\"ax-lookup-multi-column-table\"\n look=\"minimal\"\n [dataSource]=\"parentField() ? dataSource() : tableDataSource\"\n [parentField]=\"parentField() ?? ''\"\n [hasChildrenField]=\"hasChildrenField()\"\n [itemHeight]=\"itemHeight()\"\n [alternative]=\"alternate()\"\n [highlightText]=\"highlightText()\"\n [loading]=\"loadingConfig()\"\n [paging]=\"false\"\n [showHeader]=\"true\"\n [fixedHeader]=\"true\"\n [showFooter]=\"false\"\n [allowReordering]=\"false\"\n [rowCssClass]=\"resolveRowCssClass\"\n (onRowClick)=\"handleRowClick($event)\"\n>\n @for (column of visibleColumns(); track column.name) {\n <axp-widget-column-renderer\n [expandHandler]=\"$index === 0 && !!parentField()\"\n [caption]=\"column.title\"\n [customWidth]=\"resolveColumnWidth(column)\"\n [node]=\"column.node\"\n ></axp-widget-column-renderer>\n }\n</ax-data-table>\n" }]
23450
- }], ctorParameters: () => [], propDecorators: { dataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSource", required: true }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: true }] }], valueField: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueField", required: false }] }], disabledField: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledField", required: false }] }], selectedValues: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedValues", required: false }] }], parentField: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentField", required: false }] }], hasChildrenField: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasChildrenField", required: false }] }], itemHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemHeight", required: false }] }], maxVisibleItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxVisibleItems", required: false }] }], alternate: [{ type: i0.Input, args: [{ isSignal: true, alias: "alternate", required: false }] }], highlightText: [{ type: i0.Input, args: [{ isSignal: true, alias: "highlightText", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }], tableRef: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXDataTableComponent), { isSignal: true }] }] } });
23693
+ }, template: "<ax-data-table\n class=\"ax-lookup-multi-column-table\"\n look=\"minimal\"\n [dataSource]=\"parentField() ? dataSource() : tableDataSource\"\n [parentField]=\"parentField() ?? ''\"\n [hasChildrenField]=\"hasChildrenField()\"\n [itemHeight]=\"itemHeight()\"\n [alternative]=\"alternate()\"\n [highlightText]=\"highlightText()\"\n [loading]=\"loadingConfig()\"\n [paging]=\"false\"\n [showHeader]=\"true\"\n [fixedHeader]=\"true\"\n [showFooter]=\"false\"\n [allowReordering]=\"false\"\n [rowCssClass]=\"resolveRowCssClass\"\n (onRowClick)=\"handleRowClick($event)\"\n>\n @for (column of visibleColumns(); track column.name) {\n <axp-widget-column-renderer\n [expandHandler]=\"$index === 0 && !!parentField()\"\n [caption]=\"column.title\"\n [customWidth]=\"resolveColumnWidth(column)\"\n [node]=\"column.node\"\n ></axp-widget-column-renderer>\n }\n <!-- ----- Entity row actions (preview, etc.) ----- -->\n @if (hasRowActionPrimary()) {\n <ax-command-column\n fixed=\"end\"\n [width]=\"primaryRowActionColumnWidth()\"\n [items]=\"primaryRowActionItems()\"\n (onItemClick)=\"handleRowActionClick($event)\"\n ></ax-command-column>\n }\n @if (hasRowActionDropdown()) {\n <ax-dropdown-command-column\n fixed=\"end\"\n [width]=\"'60px'\"\n [items]=\"getDropdownRowActionItems\"\n (onItemClick)=\"handleRowActionClick($event)\"\n ></ax-dropdown-command-column>\n }\n</ax-data-table>\n" }]
23694
+ }], ctorParameters: () => [], propDecorators: { dataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSource", required: true }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: true }] }], valueField: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueField", required: false }] }], disabledField: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledField", required: false }] }], selectedValues: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedValues", required: false }] }], parentField: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentField", required: false }] }], hasChildrenField: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasChildrenField", required: false }] }], itemHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemHeight", required: false }] }], maxVisibleItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxVisibleItems", required: false }] }], alternate: [{ type: i0.Input, args: [{ isSignal: true, alias: "alternate", required: false }] }], highlightText: [{ type: i0.Input, args: [{ isSignal: true, alias: "highlightText", required: false }] }], rowActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowActions", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }], rowAction: [{ type: i0.Output, args: ["rowAction"] }], tableRef: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXDataTableComponent), { isSignal: true }] }] } });
23451
23695
 
23452
23696
  //#region ----- Imports -----
23453
23697
  //#endregion
@@ -23504,6 +23748,8 @@ class AXPLookupWidgetTableHostComponent extends NXValueComponent {
23504
23748
  ...(ngDevMode ? [{ debugName: "searchable" }] : /* istanbul ignore next */ []));
23505
23749
  this.selectedTemplate = input(undefined, /* @ts-ignore */
23506
23750
  ...(ngDevMode ? [{ debugName: "selectedTemplate" }] : /* istanbul ignore next */ []));
23751
+ this.rowActions = input(/* @ts-ignore */
23752
+ ...(ngDevMode ? [undefined, { debugName: "rowActions" }] : /* istanbul ignore next */ []));
23507
23753
  //#endregion
23508
23754
  //#region ----- Outputs -----
23509
23755
  this.onItemSelected = output();
@@ -23547,7 +23793,7 @@ class AXPLookupWidgetTableHostComponent extends NXValueComponent {
23547
23793
  * the selection (same as ax-lookup).
23548
23794
  */
23549
23795
  this.showSelectedTemplate = computed(() => {
23550
- if (!this.selectedTemplate() || this.valueItems().length === 0) {
23796
+ if (!this.selectedTemplate() || this.valueItems().length === 0 || !this.displayText()) {
23551
23797
  return false;
23552
23798
  }
23553
23799
  return !this.expanded() && this.searchText() === this.displayText();
@@ -23648,6 +23894,14 @@ class AXPLookupWidgetTableHostComponent extends NXValueComponent {
23648
23894
  this.expanded.set(true);
23649
23895
  }
23650
23896
  }
23897
+ async handleTableRowAction(event) {
23898
+ const handler = this.rowActions();
23899
+ if (!handler) {
23900
+ return;
23901
+ }
23902
+ this.expanded.set(false);
23903
+ await handler.execute(event.name, event.item);
23904
+ }
23651
23905
  handleTableItemClick(event) {
23652
23906
  this.onItemSelected.emit({
23653
23907
  component: this,
@@ -23760,11 +24014,11 @@ class AXPLookupWidgetTableHostComponent extends NXValueComponent {
23760
24014
  return this.#hydrationPromise;
23761
24015
  }
23762
24016
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLookupWidgetTableHostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23763
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPLookupWidgetTableHostComponent, isStandalone: true, selector: "axp-lookup-widget-table-host", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, caption: { classPropertyName: "caption", publicName: "caption", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: true, transformFunction: null }, treeDataSource: { classPropertyName: "treeDataSource", publicName: "treeDataSource", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, valueField: { classPropertyName: "valueField", publicName: "valueField", isSignal: true, isRequired: false, transformFunction: null }, textField: { classPropertyName: "textField", publicName: "textField", isSignal: true, isRequired: false, transformFunction: null }, disabledField: { classPropertyName: "disabledField", publicName: "disabledField", isSignal: true, isRequired: false, transformFunction: null }, parentField: { classPropertyName: "parentField", publicName: "parentField", isSignal: true, isRequired: false, transformFunction: null }, hasChildrenField: { classPropertyName: "hasChildrenField", publicName: "hasChildrenField", isSignal: true, isRequired: false, transformFunction: null }, searchFields: { classPropertyName: "searchFields", publicName: "searchFields", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, valueItems: { classPropertyName: "valueItems", publicName: "valueItems", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, selectedTemplate: { classPropertyName: "selectedTemplate", publicName: "selectedTemplate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", onItemSelected: "onItemSelected" }, host: { classAttribute: "block w-full" }, providers: [
24017
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPLookupWidgetTableHostComponent, isStandalone: true, selector: "axp-lookup-widget-table-host", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, caption: { classPropertyName: "caption", publicName: "caption", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: true, transformFunction: null }, treeDataSource: { classPropertyName: "treeDataSource", publicName: "treeDataSource", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, valueField: { classPropertyName: "valueField", publicName: "valueField", isSignal: true, isRequired: false, transformFunction: null }, textField: { classPropertyName: "textField", publicName: "textField", isSignal: true, isRequired: false, transformFunction: null }, disabledField: { classPropertyName: "disabledField", publicName: "disabledField", isSignal: true, isRequired: false, transformFunction: null }, parentField: { classPropertyName: "parentField", publicName: "parentField", isSignal: true, isRequired: false, transformFunction: null }, hasChildrenField: { classPropertyName: "hasChildrenField", publicName: "hasChildrenField", isSignal: true, isRequired: false, transformFunction: null }, searchFields: { classPropertyName: "searchFields", publicName: "searchFields", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, valueItems: { classPropertyName: "valueItems", publicName: "valueItems", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, selectedTemplate: { classPropertyName: "selectedTemplate", publicName: "selectedTemplate", isSignal: true, isRequired: false, transformFunction: null }, rowActions: { classPropertyName: "rowActions", publicName: "rowActions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", onItemSelected: "onItemSelected" }, host: { classAttribute: "block w-full" }, providers: [
23764
24018
  { provide: AXComponent, useExisting: AXPLookupWidgetTableHostComponent },
23765
24019
  { provide: AXClearableComponent, useExisting: AXPLookupWidgetTableHostComponent },
23766
24020
  { provide: AXValuableComponent, useExisting: AXPLookupWidgetTableHostComponent },
23767
- ], viewQueries: [{ propertyName: "triggerSearchInput", first: true, predicate: ["triggerSearchInput"], descendants: true, isSignal: true }, { propertyName: "popoverRef", first: true, predicate: AXPopoverComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div\n #origin\n class=\"ax-editor-container ax-solid ax-default ax-lookup-trigger w-full\"\n [class.ax-state-disabled]=\"disabled()\"\n [class.ax-state-readonly]=\"readonly()\"\n (click)=\"onTriggerClick()\"\n>\n <div class=\"ax-lookup-value\">\n @if (showSelectedTemplate()) {\n <div class=\"ax-lookup-selected-content\" aria-hidden=\"true\">\n <ng-container\n [ngTemplateOutlet]=\"selectedTemplate()!\"\n [ngTemplateOutletContext]=\"{ $implicit: valueItems()[0] }\"\n />\n </div>\n }\n <input\n #triggerSearchInput\n type=\"text\"\n class=\"ax-input\"\n [class.ax-lookup-select-input]=\"!searchable()\"\n [class.ax-lookup-input-overlay]=\"showSelectedTemplate()\"\n [placeholder]=\"triggerSearchPlaceholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly() || !searchable()\"\n [attr.inputmode]=\"searchable() ? null : 'none'\"\n [value]=\"triggerInputValue()\"\n (input)=\"onTriggerSearchInput($any($event.target).value)\"\n (keydown)=\"onTriggerKeydown($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n </div>\n\n @if (selectedValues().length > 0 && !disabled() && !readonly()) {\n <ng-content select=\"ax-clear-button\"></ng-content>\n }\n\n <button type=\"button\" class=\"ax-general-button-icon\" tabindex=\"-1\" [disabled]=\"disabled() || readonly()\">\n <span\n class=\"ax-icon\"\n [class.ax-icon-chevron-down]=\"!expanded()\"\n [class.ax-icon-chevron-up]=\"expanded()\"\n ></span>\n </button>\n\n <ng-content select=\"ax-validation-rule\"></ng-content>\n</div>\n\n<ax-popover\n [target]=\"origin\"\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [placement]=\"'bottom-start'\"\n [width]=\"origin.offsetWidth + 'px'\"\n [disabled]=\"disabled() || readonly()\"\n (onClosed)=\"onPopoverClosed()\"\n>\n <div class=\"ax-lookup-popup\" (keydown.escape)=\"expanded.set(false)\">\n <axp-lookup-widget-table-panel\n [dataSource]=\"resolvedTableDataSource()\"\n [columns]=\"columns()\"\n [highlightText]=\"highlightQuery()\"\n [valueField]=\"valueField()\"\n [disabledField]=\"disabledField()\"\n [parentField]=\"parentField()\"\n [hasChildrenField]=\"hasChildrenField()\"\n [selectedValues]=\"selectedValues()\"\n (itemClick)=\"handleTableItemClick($event)\"\n ></axp-lookup-widget-table-panel>\n </div>\n</ax-popover>\n", styles: ["@layer properties;:host{display:block;width:100%}:host .ax-editor-container{justify-content:flex-start;gap:var(--spacing, .25rem)}:host .ax-lookup-trigger{cursor:pointer;-webkit-user-select:none;user-select:none}:host .ax-lookup-value{position:relative;display:flex;min-width:0px;flex:1;align-items:center;overflow:hidden}:host .ax-lookup-select-input{cursor:pointer;caret-color:transparent;-webkit-user-select:none;user-select:none}:host .ax-lookup-selected-content{pointer-events:none;position:relative;z-index:0;display:flex;min-width:0px;flex:1;align-items:center;overflow:hidden}:host .ax-lookup-input-overlay{position:absolute;inset:0;z-index:10;margin:0!important;height:100%;width:100%;border-style:var(--tw-border-style);border-width:0px;background-color:transparent;padding:0!important;color:transparent;caret-color:transparent}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "component", type: 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"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXValidationModule }, { kind: "component", type: AXPLookupWidgetTablePanelComponent, selector: "axp-lookup-widget-table-panel", inputs: ["dataSource", "columns", "valueField", "disabledField", "selectedValues", "parentField", "hasChildrenField", "itemHeight", "maxVisibleItems", "alternate", "highlightText"], outputs: ["itemClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24021
+ ], viewQueries: [{ propertyName: "triggerSearchInput", first: true, predicate: ["triggerSearchInput"], descendants: true, isSignal: true }, { propertyName: "popoverRef", first: true, predicate: AXPopoverComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div\n #origin\n class=\"ax-editor-container ax-solid ax-default ax-lookup-trigger w-full\"\n [class.ax-state-disabled]=\"disabled()\"\n [class.ax-state-readonly]=\"readonly()\"\n (click)=\"onTriggerClick()\"\n>\n <div class=\"ax-lookup-value\">\n @if (showSelectedTemplate()) {\n <div class=\"ax-lookup-selected-content\" aria-hidden=\"true\">\n <ng-container\n [ngTemplateOutlet]=\"selectedTemplate()!\"\n [ngTemplateOutletContext]=\"{ $implicit: valueItems()[0] }\"\n />\n </div>\n }\n <input\n #triggerSearchInput\n type=\"text\"\n class=\"ax-input\"\n [class.ax-lookup-select-input]=\"!searchable()\"\n [class.ax-lookup-input-overlay]=\"showSelectedTemplate()\"\n [placeholder]=\"triggerSearchPlaceholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly() || !searchable()\"\n [attr.inputmode]=\"searchable() ? null : 'none'\"\n [value]=\"triggerInputValue()\"\n (input)=\"onTriggerSearchInput($any($event.target).value)\"\n (keydown)=\"onTriggerKeydown($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n </div>\n\n @if (selectedValues().length > 0 && !disabled() && !readonly()) {\n <ng-content select=\"ax-clear-button\"></ng-content>\n }\n\n <button type=\"button\" class=\"ax-general-button-icon\" tabindex=\"-1\" [disabled]=\"disabled() || readonly()\">\n <span\n class=\"ax-icon\"\n [class.ax-icon-chevron-down]=\"!expanded()\"\n [class.ax-icon-chevron-up]=\"expanded()\"\n ></span>\n </button>\n\n <ng-content select=\"ax-validation-rule\"></ng-content>\n</div>\n\n<ax-popover\n [target]=\"origin\"\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [placement]=\"'bottom-start'\"\n [width]=\"origin.offsetWidth + 'px'\"\n [disabled]=\"disabled() || readonly()\"\n (onClosed)=\"onPopoverClosed()\"\n>\n <div class=\"ax-lookup-popup\" (keydown.escape)=\"expanded.set(false)\">\n <axp-lookup-widget-table-panel\n [dataSource]=\"resolvedTableDataSource()\"\n [columns]=\"columns()\"\n [highlightText]=\"highlightQuery()\"\n [valueField]=\"valueField()\"\n [disabledField]=\"disabledField()\"\n [parentField]=\"parentField()\"\n [hasChildrenField]=\"hasChildrenField()\"\n [selectedValues]=\"selectedValues()\"\n [rowActions]=\"rowActions()\"\n (itemClick)=\"handleTableItemClick($event)\"\n (rowAction)=\"handleTableRowAction($event)\"\n ></axp-lookup-widget-table-panel>\n </div>\n</ax-popover>\n", styles: ["@layer properties;:host{display:block;width:100%}:host .ax-editor-container{justify-content:flex-start;gap:var(--spacing, .25rem)}:host .ax-lookup-trigger{cursor:pointer;-webkit-user-select:none;user-select:none}:host .ax-lookup-value{position:relative;display:flex;min-width:0px;flex:1;align-items:center;overflow:hidden}:host .ax-lookup-select-input{cursor:pointer;caret-color:transparent;-webkit-user-select:none;user-select:none}:host .ax-lookup-selected-content{pointer-events:none;position:relative;z-index:0;display:flex;min-width:0px;flex:1;align-items:center;overflow:hidden}:host .ax-lookup-input-overlay{position:absolute;inset:0;z-index:10;margin:0!important;height:100%;width:100%;border-style:var(--tw-border-style);border-width:0px;background-color:transparent;padding:0!important;color:transparent;caret-color:transparent}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "component", type: 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"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXValidationModule }, { kind: "component", type: AXPLookupWidgetTablePanelComponent, selector: "axp-lookup-widget-table-panel", inputs: ["dataSource", "columns", "valueField", "disabledField", "selectedValues", "parentField", "hasChildrenField", "itemHeight", "maxVisibleItems", "alternate", "highlightText", "rowActions"], outputs: ["itemClick", "rowAction"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23768
24022
  }
23769
24023
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLookupWidgetTableHostComponent, decorators: [{
23770
24024
  type: Component,
@@ -23774,8 +24028,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
23774
24028
  { provide: AXComponent, useExisting: AXPLookupWidgetTableHostComponent },
23775
24029
  { provide: AXClearableComponent, useExisting: AXPLookupWidgetTableHostComponent },
23776
24030
  { provide: AXValuableComponent, useExisting: AXPLookupWidgetTableHostComponent },
23777
- ], template: "<div\n #origin\n class=\"ax-editor-container ax-solid ax-default ax-lookup-trigger w-full\"\n [class.ax-state-disabled]=\"disabled()\"\n [class.ax-state-readonly]=\"readonly()\"\n (click)=\"onTriggerClick()\"\n>\n <div class=\"ax-lookup-value\">\n @if (showSelectedTemplate()) {\n <div class=\"ax-lookup-selected-content\" aria-hidden=\"true\">\n <ng-container\n [ngTemplateOutlet]=\"selectedTemplate()!\"\n [ngTemplateOutletContext]=\"{ $implicit: valueItems()[0] }\"\n />\n </div>\n }\n <input\n #triggerSearchInput\n type=\"text\"\n class=\"ax-input\"\n [class.ax-lookup-select-input]=\"!searchable()\"\n [class.ax-lookup-input-overlay]=\"showSelectedTemplate()\"\n [placeholder]=\"triggerSearchPlaceholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly() || !searchable()\"\n [attr.inputmode]=\"searchable() ? null : 'none'\"\n [value]=\"triggerInputValue()\"\n (input)=\"onTriggerSearchInput($any($event.target).value)\"\n (keydown)=\"onTriggerKeydown($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n </div>\n\n @if (selectedValues().length > 0 && !disabled() && !readonly()) {\n <ng-content select=\"ax-clear-button\"></ng-content>\n }\n\n <button type=\"button\" class=\"ax-general-button-icon\" tabindex=\"-1\" [disabled]=\"disabled() || readonly()\">\n <span\n class=\"ax-icon\"\n [class.ax-icon-chevron-down]=\"!expanded()\"\n [class.ax-icon-chevron-up]=\"expanded()\"\n ></span>\n </button>\n\n <ng-content select=\"ax-validation-rule\"></ng-content>\n</div>\n\n<ax-popover\n [target]=\"origin\"\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [placement]=\"'bottom-start'\"\n [width]=\"origin.offsetWidth + 'px'\"\n [disabled]=\"disabled() || readonly()\"\n (onClosed)=\"onPopoverClosed()\"\n>\n <div class=\"ax-lookup-popup\" (keydown.escape)=\"expanded.set(false)\">\n <axp-lookup-widget-table-panel\n [dataSource]=\"resolvedTableDataSource()\"\n [columns]=\"columns()\"\n [highlightText]=\"highlightQuery()\"\n [valueField]=\"valueField()\"\n [disabledField]=\"disabledField()\"\n [parentField]=\"parentField()\"\n [hasChildrenField]=\"hasChildrenField()\"\n [selectedValues]=\"selectedValues()\"\n (itemClick)=\"handleTableItemClick($event)\"\n ></axp-lookup-widget-table-panel>\n </div>\n</ax-popover>\n", styles: ["@layer properties;:host{display:block;width:100%}:host .ax-editor-container{justify-content:flex-start;gap:var(--spacing, .25rem)}:host .ax-lookup-trigger{cursor:pointer;-webkit-user-select:none;user-select:none}:host .ax-lookup-value{position:relative;display:flex;min-width:0px;flex:1;align-items:center;overflow:hidden}:host .ax-lookup-select-input{cursor:pointer;caret-color:transparent;-webkit-user-select:none;user-select:none}:host .ax-lookup-selected-content{pointer-events:none;position:relative;z-index:0;display:flex;min-width:0px;flex:1;align-items:center;overflow:hidden}:host .ax-lookup-input-overlay{position:absolute;inset:0;z-index:10;margin:0!important;height:100%;width:100%;border-style:var(--tw-border-style);border-width:0px;background-color:transparent;padding:0!important;color:transparent;caret-color:transparent}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
23778
- }], ctorParameters: () => [], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], caption: [{ type: i0.Input, args: [{ isSignal: true, alias: "caption", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], dataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSource", required: true }] }], treeDataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "treeDataSource", required: false }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: true }] }], valueField: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueField", required: false }] }], textField: [{ type: i0.Input, args: [{ isSignal: true, alias: "textField", required: false }] }], disabledField: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledField", required: false }] }], parentField: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentField", required: false }] }], hasChildrenField: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasChildrenField", required: false }] }], searchFields: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchFields", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], valueItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueItems", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], selectedTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedTemplate", required: false }] }], onItemSelected: [{ type: i0.Output, args: ["onItemSelected"] }], triggerSearchInput: [{ type: i0.ViewChild, args: ['triggerSearchInput', { isSignal: true }] }], popoverRef: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXPopoverComponent), { isSignal: true }] }] } });
24031
+ ], template: "<div\n #origin\n class=\"ax-editor-container ax-solid ax-default ax-lookup-trigger w-full\"\n [class.ax-state-disabled]=\"disabled()\"\n [class.ax-state-readonly]=\"readonly()\"\n (click)=\"onTriggerClick()\"\n>\n <div class=\"ax-lookup-value\">\n @if (showSelectedTemplate()) {\n <div class=\"ax-lookup-selected-content\" aria-hidden=\"true\">\n <ng-container\n [ngTemplateOutlet]=\"selectedTemplate()!\"\n [ngTemplateOutletContext]=\"{ $implicit: valueItems()[0] }\"\n />\n </div>\n }\n <input\n #triggerSearchInput\n type=\"text\"\n class=\"ax-input\"\n [class.ax-lookup-select-input]=\"!searchable()\"\n [class.ax-lookup-input-overlay]=\"showSelectedTemplate()\"\n [placeholder]=\"triggerSearchPlaceholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly() || !searchable()\"\n [attr.inputmode]=\"searchable() ? null : 'none'\"\n [value]=\"triggerInputValue()\"\n (input)=\"onTriggerSearchInput($any($event.target).value)\"\n (keydown)=\"onTriggerKeydown($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n </div>\n\n @if (selectedValues().length > 0 && !disabled() && !readonly()) {\n <ng-content select=\"ax-clear-button\"></ng-content>\n }\n\n <button type=\"button\" class=\"ax-general-button-icon\" tabindex=\"-1\" [disabled]=\"disabled() || readonly()\">\n <span\n class=\"ax-icon\"\n [class.ax-icon-chevron-down]=\"!expanded()\"\n [class.ax-icon-chevron-up]=\"expanded()\"\n ></span>\n </button>\n\n <ng-content select=\"ax-validation-rule\"></ng-content>\n</div>\n\n<ax-popover\n [target]=\"origin\"\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [placement]=\"'bottom-start'\"\n [width]=\"origin.offsetWidth + 'px'\"\n [disabled]=\"disabled() || readonly()\"\n (onClosed)=\"onPopoverClosed()\"\n>\n <div class=\"ax-lookup-popup\" (keydown.escape)=\"expanded.set(false)\">\n <axp-lookup-widget-table-panel\n [dataSource]=\"resolvedTableDataSource()\"\n [columns]=\"columns()\"\n [highlightText]=\"highlightQuery()\"\n [valueField]=\"valueField()\"\n [disabledField]=\"disabledField()\"\n [parentField]=\"parentField()\"\n [hasChildrenField]=\"hasChildrenField()\"\n [selectedValues]=\"selectedValues()\"\n [rowActions]=\"rowActions()\"\n (itemClick)=\"handleTableItemClick($event)\"\n (rowAction)=\"handleTableRowAction($event)\"\n ></axp-lookup-widget-table-panel>\n </div>\n</ax-popover>\n", styles: ["@layer properties;:host{display:block;width:100%}:host .ax-editor-container{justify-content:flex-start;gap:var(--spacing, .25rem)}:host .ax-lookup-trigger{cursor:pointer;-webkit-user-select:none;user-select:none}:host .ax-lookup-value{position:relative;display:flex;min-width:0px;flex:1;align-items:center;overflow:hidden}:host .ax-lookup-select-input{cursor:pointer;caret-color:transparent;-webkit-user-select:none;user-select:none}:host .ax-lookup-selected-content{pointer-events:none;position:relative;z-index:0;display:flex;min-width:0px;flex:1;align-items:center;overflow:hidden}:host .ax-lookup-input-overlay{position:absolute;inset:0;z-index:10;margin:0!important;height:100%;width:100%;border-style:var(--tw-border-style);border-width:0px;background-color:transparent;padding:0!important;color:transparent;caret-color:transparent}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
24032
+ }], ctorParameters: () => [], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], caption: [{ type: i0.Input, args: [{ isSignal: true, alias: "caption", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], dataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSource", required: true }] }], treeDataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "treeDataSource", required: false }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: true }] }], valueField: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueField", required: false }] }], textField: [{ type: i0.Input, args: [{ isSignal: true, alias: "textField", required: false }] }], disabledField: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledField", required: false }] }], parentField: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentField", required: false }] }], hasChildrenField: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasChildrenField", required: false }] }], searchFields: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchFields", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], valueItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueItems", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], selectedTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedTemplate", required: false }] }], rowActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowActions", required: false }] }], onItemSelected: [{ type: i0.Output, args: ["onItemSelected"] }], triggerSearchInput: [{ type: i0.ViewChild, args: ['triggerSearchInput', { isSignal: true }] }], popoverRef: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXPopoverComponent), { isSignal: true }] }] } });
23779
24033
 
23780
24034
  //#region ----- Imports -----
23781
24035
  //#endregion
@@ -23800,6 +24054,7 @@ class AXPLookupWidgetEditComponent extends AXPValueWidgetComponent {
23800
24054
  this.localeService = inject(AXLocaleService);
23801
24055
  this.destroyRef = inject(DestroyRef);
23802
24056
  this.lookupByKeyCache = inject(AXPLookupByKeyCacheService);
24057
+ this.rowActionsService = inject(AXPEntityDataSelectorRowActionsService);
23803
24058
  //#endregion
23804
24059
  //#region ----- View Children -----
23805
24060
  this.lookup = viewChild(AXLookupComponent, /* @ts-ignore */
@@ -23829,6 +24084,8 @@ class AXPLookupWidgetEditComponent extends AXPValueWidgetComponent {
23829
24084
  ...(ngDevMode ? [{ debugName: "shouldFocus" }] : /* istanbul ignore next */ []));
23830
24085
  /** Skips one {@link findByValue} pass after inline create when selection is already hydrated. */
23831
24086
  this.skipFindByValueOnce = false;
24087
+ /** Latest {@link findByValue} run; older in-flight runs must not overwrite its result. */
24088
+ this.findByValueRequestId = 0;
23832
24089
  this.lastEditorLocaleKey = this.resolveEditorLocaleKey();
23833
24090
  //#endregion
23834
24091
  //#region ----- Computed Properties -----
@@ -23907,6 +24164,20 @@ class AXPLookupWidgetEditComponent extends AXPValueWidgetComponent {
23907
24164
  allowCreate: this.options()['allowCreate'],
23908
24165
  }), /* @ts-ignore */
23909
24166
  ...(ngDevMode ? [{ debugName: "resolvedCreate" }] : /* istanbul ignore next */ []));
24167
+ this.rowActionsConfig = computed(() => this.options()['rowActions'] ?? undefined, { ...(ngDevMode ? { debugName: "rowActionsConfig" } : /* istanbul ignore next */ {}), equal: isEqual });
24168
+ this.rowActionsHandler = computed(() => {
24169
+ const entity = this.entityDef();
24170
+ const config = this.rowActionsConfig();
24171
+ if (!entity || !config) {
24172
+ return undefined;
24173
+ }
24174
+ return this.rowActionsService.createHandler(entity, config);
24175
+ }, /* @ts-ignore */
24176
+ ...(ngDevMode ? [{ debugName: "rowActionsHandler" }] : /* istanbul ignore next */ []));
24177
+ this.rowActionPrimaryItems = computed(() => this.rowActionsHandler()?.getPrimaryItems() ?? [], /* @ts-ignore */
24178
+ ...(ngDevMode ? [{ debugName: "rowActionPrimaryItems" }] : /* istanbul ignore next */ []));
24179
+ this.hasRowActionPrimary = computed(() => this.rowActionPrimaryItems().length > 0, /* @ts-ignore */
24180
+ ...(ngDevMode ? [{ debugName: "hasRowActionPrimary" }] : /* istanbul ignore next */ []));
23910
24181
  this.valueField = computed(() => {
23911
24182
  const explicit = this.options()['valueField']?.trim();
23912
24183
  if (explicit) {
@@ -24089,6 +24360,23 @@ class AXPLookupWidgetEditComponent extends AXPValueWidgetComponent {
24089
24360
  }
24090
24361
  }, /* @ts-ignore */
24091
24362
  ...(ngDevMode ? [{ debugName: "#efValue" }] : /* istanbul ignore next */ []));
24363
+ /** Value can be bound before the entity definition resolves; hydrate the selection label once it does. */
24364
+ this.#efEntityHydration = effect(() => {
24365
+ if (!this.entityDef()) {
24366
+ return;
24367
+ }
24368
+ untracked(() => {
24369
+ const currentValue = this.getValue();
24370
+ if (!this.hasValue(currentValue)) {
24371
+ return;
24372
+ }
24373
+ if (areLookupSelectionItemsHydrated(currentValue, this.selectedItems(), this.getHydrationOptions())) {
24374
+ return;
24375
+ }
24376
+ void this.findByValue();
24377
+ });
24378
+ }, /* @ts-ignore */
24379
+ ...(ngDevMode ? [{ debugName: "#efEntityHydration" }] : /* istanbul ignore next */ []));
24092
24380
  this.#filterEffect = effect(() => {
24093
24381
  const entity = this.entityDef();
24094
24382
  const pending = this.hasPendingCascadeFilter();
@@ -24174,10 +24462,25 @@ class AXPLookupWidgetEditComponent extends AXPValueWidgetComponent {
24174
24462
  #efEntity;
24175
24463
  #hydrateBoundValue;
24176
24464
  #efValue;
24465
+ /** Value can be bound before the entity definition resolves; hydrate the selection label once it does. */
24466
+ #efEntityHydration;
24177
24467
  #filterEffect;
24178
24468
  #focusEffect;
24179
24469
  //#endregion
24180
24470
  //#region ----- Event Handlers -----
24471
+ async handleItemRowAction(event, commandName, item) {
24472
+ event.nativeEvent?.preventDefault();
24473
+ event.nativeEvent?.stopPropagation();
24474
+ const handler = this.rowActionsHandler();
24475
+ if (!handler) {
24476
+ return;
24477
+ }
24478
+ await handler.execute(commandName, item);
24479
+ }
24480
+ handleLookupItemRowActionMouseDown(event) {
24481
+ event.preventDefault();
24482
+ event.stopPropagation();
24483
+ }
24181
24484
  handleLookupItemSelected(e) {
24182
24485
  const item = e.item;
24183
24486
  if (item == null) {
@@ -24343,30 +24646,33 @@ class AXPLookupWidgetEditComponent extends AXPValueWidgetComponent {
24343
24646
  this.setItems(currentItems, false);
24344
24647
  return;
24345
24648
  }
24649
+ // Without the entity definition the rows cannot be fetched; `#efEntityHydration` retries once it resolves.
24650
+ const entityDef = this.entityDef();
24651
+ if (!entityDef) {
24652
+ return;
24653
+ }
24654
+ const requestId = ++this.findByValueRequestId;
24346
24655
  this.isLoading.set(true);
24347
24656
  this.beginHydration();
24348
24657
  try {
24349
- const entityDef = this.entityDef();
24350
24658
  const entityDataAccessor = this.entityService.withEntity(this.entity()).data();
24351
24659
  const valueField = hydration.valueField;
24352
24660
  const idsToFetch = ids.filter((id) => {
24353
- const existing = currentItems.find((item) => get(item, valueField) === id);
24661
+ const existing = currentItems.find((item) => isSameLookupKey(get(item, valueField), id));
24354
24662
  return existing == null || !isLookupItemHydrated(existing, hydration);
24355
24663
  });
24356
24664
  const entityKey = this.entity();
24357
- const fetchedById = entityDef
24358
- ? await fetchLookupRowsByKeys({
24359
- entity: entityDef,
24360
- valueField,
24361
- keys: idsToFetch,
24362
- getQueryFields: () => this.lookupQueryFields(),
24363
- byKey: this.lookupByKeyCache.wrap(entityKey, (id) => entityDataAccessor.byKey(id)),
24364
- queryList: (request) => entityDataAccessor.query(request),
24365
- onRow: (key, row) => this.lookupByKeyCache.remember(entityKey, key, row),
24366
- })
24367
- : new Map();
24665
+ const fetchedById = await fetchLookupRowsByKeys({
24666
+ entity: entityDef,
24667
+ valueField,
24668
+ keys: idsToFetch,
24669
+ getQueryFields: () => this.lookupQueryFields(),
24670
+ byKey: this.lookupByKeyCache.wrap(entityKey, (id) => entityDataAccessor.byKey(id)),
24671
+ queryList: (request) => entityDataAccessor.query(request),
24672
+ onRow: (key, row) => this.lookupByKeyCache.remember(entityKey, key, row),
24673
+ });
24368
24674
  const mergedItems = (await Promise.all(ids.map(async (id) => {
24369
- const existing = currentItems.find((item) => get(item, valueField) === id);
24675
+ const existing = currentItems.find((item) => isSameLookupKey(get(item, valueField), id));
24370
24676
  if (existing != null && isLookupItemHydrated(existing, hydration)) {
24371
24677
  return existing;
24372
24678
  }
@@ -24376,11 +24682,15 @@ class AXPLookupWidgetEditComponent extends AXPValueWidgetComponent {
24376
24682
  }
24377
24683
  return this.decorateLookupItem(fetched);
24378
24684
  }))).filter((item) => item != null);
24379
- this.setItems(mergedItems, false);
24685
+ if (requestId === this.findByValueRequestId) {
24686
+ this.setItems(mergedItems, false);
24687
+ }
24380
24688
  }
24381
24689
  catch (error) {
24382
24690
  console.error('[LookupWidget] findByValue() error:', error);
24383
- this.setItems([], false);
24691
+ if (requestId === this.findByValueRequestId) {
24692
+ this.setItems([], false);
24693
+ }
24384
24694
  }
24385
24695
  finally {
24386
24696
  this.isLoading.set(false);
@@ -24653,7 +24963,7 @@ class AXPLookupWidgetEditComponent extends AXPValueWidgetComponent {
24653
24963
  this.shouldFocus.set(true);
24654
24964
  }
24655
24965
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLookupWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
24656
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPLookupWidgetEditComponent, isStandalone: true, selector: "axp-lookup-widget-edit", host: { classAttribute: "w-full" }, viewQueries: [{ propertyName: "lookup", first: true, predicate: AXLookupComponent, descendants: true, isSignal: true }, { propertyName: "tableLookupHost", first: true, predicate: AXPLookupWidgetTableHostComponent, descendants: true, isSignal: true }, { propertyName: "popupTagBox", first: true, predicate: ["popupTagBox"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@if (entityDef() && editorKey()) {\n <!-- ----- Entity lookup editor ----- -->\n <div class=\"flex items-center gap-1 w-full\">\n <!--------------------------------------------------------------->\n <!-- ----- Popup look: full entity data selector ----- -->\n @if (isPopupLook()) {\n <ax-tag-box\n #popupTagBox\n class=\"flex-1 min-w-0\"\n [tagTemplate]=\"popupTagTemplate\"\n [ngModel]=\"selectedItems()\"\n [textField]=\"displayField()\"\n [valueField]=\"valueField()\"\n (onValueChanged)=\"handlePopupValueChange($event)\"\n [placeholder]=\"selectedItems().length ? '' : ((placeholderText() | translate | async) ?? '')\"\n [addOnEnter]=\"false\"\n [addOnComma]=\"false\"\n [readonly]=\"true\"\n [disabled]=\"isLookupDisabled()\"\n (click)=\"handlePopupTriggerClick($event)\"\n (onKeyUp)=\"handlePopupKeyUp($event)\"\n (onBlur)=\"handlePopupBlur($event)\"\n >\n @if (hasClearButton() && selectedItems().length > 0) {\n <ax-clear-button (click)=\"handlePopupClearClick()\"></ax-clear-button>\n }\n @for (validation of validationRules(); track $index) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"$safeNavigationMigration(validation.options?.message)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n <ax-suffix>\n <ax-button\n color=\"ghost\"\n look=\"blank\"\n [disabled]=\"isLookupDisabled() || isReadonly() || isLoading()\"\n (onClick)=\"handlePopupTriggerClick($event)\"\n >\n @if (isLoading()) {\n <ax-loading></ax-loading>\n }\n <!-- ----- Search icon opens entity selector ----- -->\n @else {\n <ax-icon icon=\"far fa-search\"></ax-icon>\n }\n </ax-button>\n </ax-suffix>\n </ax-tag-box>\n }\n <!-- ----- Inline ax-lookup / table host ----- -->\n @else if (effectiveDataSource(); as dataSource) {\n <!-- ----- Multi-column modes: platform widget column renderer ----- -->\n @if (isTableLookupMode()) {\n <axp-lookup-widget-table-host\n class=\"flex-1 min-w-0\"\n [name]=\"name ?? ''\"\n [placeholder]=\"(placeholderText() | translate | async) ?? ''\"\n [caption]=\"(placeholderText() | translate | async) ?? ''\"\n [searchPlaceholder]=\"('@general:widgets.lookup.search.placeholder' | translate | async) ?? ''\"\n [dataSource]=\"dataSource\"\n [columns]=\"lookupWidgetTableColumns()\"\n [valueField]=\"valueField()\"\n [textField]=\"displayField()\"\n [disabledField]=\"'disabled'\"\n [parentField]=\"lookupMode() === 'multi-column-tree' ? treeParentField() : undefined\"\n [treeDataSource]=\"lookupMode() === 'multi-column-tree' ? entityTreeDataSource() : undefined\"\n [searchFields]=\"lookupTreeSearchFields()\"\n [value]=\"boundValue()\"\n [valueItems]=\"selectedItems()\"\n [disabled]=\"isLookupDisabled()\"\n [readonly]=\"isReadonly()\"\n [searchable]=\"true\"\n [selectedTemplate]=\"lookupItemTemplate\"\n (valueChange)=\"handleLookupModelChange($event)\"\n (onItemSelected)=\"handleLookupItemSelected($event)\"\n >\n @if (hasClearButton()) {\n <ax-clear-button></ax-clear-button>\n }\n @for (validation of validationRules(); track $index) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"$safeNavigationMigration(validation.options?.message)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </axp-lookup-widget-table-host>\n }\n <!-- ----- List / tree chip modes: ax-lookup ----- -->\n @else {\n <ax-lookup\n class=\"flex-1 min-w-0\"\n [name]=\"name ?? ''\"\n [placeholder]=\"(placeholderText() | translate | async) ?? ''\"\n [caption]=\"(placeholderText() | translate | async) ?? ''\"\n [searchPlaceholder]=\"('@general:widgets.lookup.search.placeholder' | translate | async) ?? ''\"\n [mode]=\"lookupMode()\"\n [treeParentField]=\"treeParentField()\"\n [dataSource]=\"dataSource\"\n [treeDataSource]=\"entityTreeDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"displayField()\"\n [value]=\"boundValue()\"\n [valueItems]=\"selectedItems()\"\n [disabled]=\"isLookupDisabled()\"\n [readonly]=\"isReadonly()\"\n [searchable]=\"true\"\n [itemTemplate]=\"$any(multiple() ? lookupItemTemplate : lookupDropDownListItemTemplate)\"\n [selectedTemplate]=\"lookupItemTemplate\"\n (valueChange)=\"handleLookupModelChange($event)\"\n (onItemSelected)=\"handleLookupItemSelected($event)\"\n >\n @if (hasClearButton()) {\n <ax-clear-button></ax-clear-button>\n }\n @for (validation of validationRules(); track $index) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"$safeNavigationMigration(validation.options?.message)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-lookup>\n }\n }\n <!--------------------------------------------------------------->\n <!-- ----- Inline create for the lookup entity ----- -->\n @if (resolvedCreate().enabled) {\n <ax-button\n color=\"primary\"\n look=\"twotone\"\n [disabled]=\"isLookupDisabled() || isLoading()\"\n (onClick)=\"handleCreateClick($event)\"\n [title]=\"'@general:actions.create.title' | translate | async\"\n >\n <ax-icon icon=\"far fa-plus\"></ax-icon>\n </ax-button>\n }\n </div>\n}\n\n<!-- ----- Lookup item and selected-value label ----- -->\n<ng-template #lookupItemTemplate let-item let-highlightText=\"highlightText\">\n <span class=\"ax-lookup-option-text\">\n <ax-highlight-text\n [text]=\"(getLookupItemLabel(item) | translate | async) ?? ''\"\n [query]=\"highlightText ?? ''\"\n ></ax-highlight-text>\n </span>\n</ng-template>\n<!-- ----- Drop-down-list rows: library skips .ax-lookup-option chrome when itemTemplate is set ----- -->\n<ng-template #lookupDropDownListItemTemplate let-item let-highlightText=\"highlightText\">\n <span class=\"flex h-full w-full min-w-0 items-center px-3 text-sm\">\n <span class=\"ax-lookup-option-text min-w-0 flex-1 truncate\">\n <ax-highlight-text\n [text]=\"(getLookupItemLabel(item) | translate | async) ?? ''\"\n [query]=\"highlightText ?? ''\"\n ></ax-highlight-text>\n </span>\n </span>\n</ng-template>\n<!-- ----- Popup look selected chips ----- -->\n<ng-template #popupTagTemplate let-item let-index=\"index\">\n <div class=\"inline-flex items-center gap-1.5 rounded-md px-3 py-1 text-sm surface\">\n <span>{{ (getLookupItemLabel(item) | translate | async) ?? '' }}</span>\n @if (!isReadonly() && !isLookupDisabled()) {\n <button type=\"button\" (click)=\"handlePopupRemoveItem($event, index)\">\n <ax-icon class=\"ax-icon ax-icon-close\"></ax-icon>\n </button>\n }\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i3.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "component", type: i3.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i5.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "component", type: AXHighlightTextComponent, selector: "ax-highlight-text", inputs: ["text", "query", "highlightDisabled", "highlightOptions"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i1$2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "component", type: AXLookupComponent, selector: "ax-lookup", inputs: ["name", "mode", "dataSource", "treeDataSource", "valueField", "textField", "disabledField", "columns", "treeParentField", "hasChildrenField", "searchable", "adaptivityEnabled", "caption", "alternate", "searchPlaceholder", "placeholder", "disabled", "readonly", "look", "itemHeight", "maxVisibleItems", "treeSelectionBehavior", "highlightSearch", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "value", "valueItems"], outputs: ["lookChange", "valueChange", "onValueChanged", "onSelectionChanged", "onFocus", "onBlur", "onItemClick", "onItemSelected", "onOpened", "onClosed"] }, { kind: "component", type: AXPLookupWidgetTableHostComponent, selector: "axp-lookup-widget-table-host", inputs: ["name", "placeholder", "caption", "searchPlaceholder", "dataSource", "treeDataSource", "columns", "valueField", "textField", "disabledField", "parentField", "hasChildrenField", "searchFields", "value", "valueItems", "disabled", "readonly", "searchable", "selectedTemplate"], outputs: ["valueChange", "onItemSelected"] }, { kind: "ngmodule", type: AXTagBoxModule }, { kind: "component", type: i6$1.AXTagBoxComponent, selector: "ax-tag-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "allowNull", "type", "look", "addOnComma", "addOnEnter", "valueField", "textField", "readonlyField", "allowDuplicateValues", "tagTemplate"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onTagClick", "onTagDblClick", "onTagContextMenu"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXValidationModule }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: i3$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24966
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPLookupWidgetEditComponent, isStandalone: true, selector: "axp-lookup-widget-edit", host: { classAttribute: "w-full" }, viewQueries: [{ propertyName: "lookup", first: true, predicate: AXLookupComponent, descendants: true, isSignal: true }, { propertyName: "tableLookupHost", first: true, predicate: AXPLookupWidgetTableHostComponent, descendants: true, isSignal: true }, { propertyName: "popupTagBox", first: true, predicate: ["popupTagBox"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@if (entityDef() && editorKey()) {\n <!-- ----- Entity lookup editor ----- -->\n <div class=\"flex items-center gap-1 w-full\">\n <!--------------------------------------------------------------->\n <!-- ----- Popup look: full entity data selector ----- -->\n @if (isPopupLook()) {\n <ax-tag-box\n #popupTagBox\n class=\"flex-1 min-w-0\"\n [tagTemplate]=\"popupTagTemplate\"\n [ngModel]=\"selectedItems()\"\n [textField]=\"displayField()\"\n [valueField]=\"valueField()\"\n (onValueChanged)=\"handlePopupValueChange($event)\"\n [placeholder]=\"selectedItems().length ? '' : ((placeholderText() | translate | async) ?? '')\"\n [addOnEnter]=\"false\"\n [addOnComma]=\"false\"\n [readonly]=\"true\"\n [disabled]=\"isLookupDisabled()\"\n (click)=\"handlePopupTriggerClick($event)\"\n (onKeyUp)=\"handlePopupKeyUp($event)\"\n (onBlur)=\"handlePopupBlur($event)\"\n >\n @if (hasClearButton() && selectedItems().length > 0) {\n <ax-clear-button (click)=\"handlePopupClearClick()\"></ax-clear-button>\n }\n @for (validation of validationRules(); track $index) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"$safeNavigationMigration(validation.options?.message)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n <ax-suffix>\n <ax-button\n color=\"ghost\"\n look=\"blank\"\n [disabled]=\"isLookupDisabled() || isReadonly() || isLoading()\"\n (onClick)=\"handlePopupTriggerClick($event)\"\n >\n @if (isLoading()) {\n <ax-loading></ax-loading>\n }\n <!-- ----- Search icon opens entity selector ----- -->\n @else {\n <ax-icon icon=\"far fa-search\"></ax-icon>\n }\n </ax-button>\n </ax-suffix>\n </ax-tag-box>\n }\n <!-- ----- Inline ax-lookup / table host ----- -->\n @else if (effectiveDataSource(); as dataSource) {\n <!-- ----- Multi-column modes: platform widget column renderer ----- -->\n @if (isTableLookupMode()) {\n <axp-lookup-widget-table-host\n class=\"flex-1 min-w-0\"\n [name]=\"name ?? ''\"\n [placeholder]=\"(placeholderText() | translate | async) ?? ''\"\n [caption]=\"(placeholderText() | translate | async) ?? ''\"\n [searchPlaceholder]=\"('@general:widgets.lookup.search.placeholder' | translate | async) ?? ''\"\n [dataSource]=\"dataSource\"\n [columns]=\"lookupWidgetTableColumns()\"\n [valueField]=\"valueField()\"\n [textField]=\"displayField()\"\n [disabledField]=\"'disabled'\"\n [parentField]=\"lookupMode() === 'multi-column-tree' ? treeParentField() : undefined\"\n [treeDataSource]=\"lookupMode() === 'multi-column-tree' ? entityTreeDataSource() : undefined\"\n [searchFields]=\"lookupTreeSearchFields()\"\n [value]=\"boundValue()\"\n [valueItems]=\"selectedItems()\"\n [disabled]=\"isLookupDisabled()\"\n [readonly]=\"isReadonly()\"\n [searchable]=\"true\"\n [selectedTemplate]=\"lookupItemTemplate\"\n [rowActions]=\"rowActionsHandler()\"\n (valueChange)=\"handleLookupModelChange($event)\"\n (onItemSelected)=\"handleLookupItemSelected($event)\"\n >\n @if (hasClearButton()) {\n <ax-clear-button></ax-clear-button>\n }\n @for (validation of validationRules(); track $index) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"$safeNavigationMigration(validation.options?.message)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </axp-lookup-widget-table-host>\n }\n <!-- ----- List / tree chip modes: ax-lookup ----- -->\n @else {\n <ax-lookup\n class=\"flex-1 min-w-0\"\n [name]=\"name ?? ''\"\n [placeholder]=\"(placeholderText() | translate | async) ?? ''\"\n [caption]=\"(placeholderText() | translate | async) ?? ''\"\n [searchPlaceholder]=\"('@general:widgets.lookup.search.placeholder' | translate | async) ?? ''\"\n [mode]=\"lookupMode()\"\n [treeParentField]=\"treeParentField()\"\n [dataSource]=\"dataSource\"\n [treeDataSource]=\"entityTreeDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"displayField()\"\n [value]=\"boundValue()\"\n [valueItems]=\"selectedItems()\"\n [disabled]=\"isLookupDisabled()\"\n [readonly]=\"isReadonly()\"\n [searchable]=\"true\"\n [itemTemplate]=\"\n $any(\n multiple()\n ? hasRowActionPrimary()\n ? lookupListItemWithActionsTemplate\n : lookupItemTemplate\n : lookupDropDownListItemTemplate\n )\n \"\n [selectedTemplate]=\"lookupItemTemplate\"\n (valueChange)=\"handleLookupModelChange($event)\"\n (onItemSelected)=\"handleLookupItemSelected($event)\"\n >\n @if (hasClearButton()) {\n <ax-clear-button></ax-clear-button>\n }\n @for (validation of validationRules(); track $index) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"$safeNavigationMigration(validation.options?.message)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-lookup>\n }\n }\n <!--------------------------------------------------------------->\n <!-- ----- Inline create for the lookup entity ----- -->\n @if (resolvedCreate().enabled) {\n <ax-button\n color=\"primary\"\n look=\"twotone\"\n [disabled]=\"isLookupDisabled() || isLoading()\"\n (onClick)=\"handleCreateClick($event)\"\n [title]=\"'@general:actions.create.title' | translate | async\"\n >\n <ax-icon icon=\"far fa-plus\"></ax-icon>\n </ax-button>\n }\n </div>\n}\n\n<!-- ----- Lookup item and selected-value label ----- -->\n<ng-template #lookupItemTemplate let-item let-highlightText=\"highlightText\">\n <span class=\"ax-lookup-option-text\">\n <ax-highlight-text\n [text]=\"(getLookupItemLabel(item) | translate | async) ?? ''\"\n [query]=\"highlightText ?? ''\"\n ></ax-highlight-text>\n </span>\n</ng-template>\n<!-- ----- Drop-down-list rows: library skips .ax-lookup-option chrome when itemTemplate is set ----- -->\n<ng-template #lookupDropDownListItemTemplate let-item let-highlightText=\"highlightText\">\n <span class=\"flex h-full w-full min-w-0 items-center gap-1 px-3 text-sm\">\n <span class=\"ax-lookup-option-text min-w-0 flex-1 truncate\">\n <ax-highlight-text\n [text]=\"(getLookupItemLabel(item) | translate | async) ?? ''\"\n [query]=\"highlightText ?? ''\"\n ></ax-highlight-text>\n </span>\n <!-- ----- Primary row actions (preview, etc.) ----- -->\n @if (hasRowActionPrimary()) {\n <span class=\"inline-flex shrink-0 items-center\" (mousedown)=\"handleLookupItemRowActionMouseDown($event)\">\n @for (action of rowActionPrimaryItems(); track action.name) {\n <ax-button\n look=\"blank\"\n color=\"ghost\"\n [title]=\"action.text\"\n (onClick)=\"handleItemRowAction($event, action.name, item)\"\n >\n @if (action.icon) {\n <ax-icon [icon]=\"action.icon\"></ax-icon>\n }\n </ax-button>\n }\n </span>\n }\n </span>\n</ng-template>\n<!-- ----- Multi-select list rows with row actions ----- -->\n<ng-template #lookupListItemWithActionsTemplate let-item let-highlightText=\"highlightText\">\n <span class=\"flex w-full min-w-0 items-center gap-1\">\n <span class=\"ax-lookup-option-text min-w-0 flex-1 truncate\">\n <ax-highlight-text\n [text]=\"(getLookupItemLabel(item) | translate | async) ?? ''\"\n [query]=\"highlightText ?? ''\"\n ></ax-highlight-text>\n </span>\n <span class=\"inline-flex shrink-0 items-center\" (mousedown)=\"handleLookupItemRowActionMouseDown($event)\">\n @for (action of rowActionPrimaryItems(); track action.name) {\n <ax-button\n look=\"blank\"\n color=\"ghost\"\n [title]=\"action.text\"\n (onClick)=\"handleItemRowAction($event, action.name, item)\"\n >\n @if (action.icon) {\n <ax-icon [icon]=\"action.icon\"></ax-icon>\n }\n </ax-button>\n }\n </span>\n </span>\n</ng-template>\n<!-- ----- Popup look selected chips ----- -->\n<ng-template #popupTagTemplate let-item let-index=\"index\">\n <div class=\"inline-flex items-center gap-1.5 rounded-md px-3 py-1 text-sm surface\">\n <span>{{ (getLookupItemLabel(item) | translate | async) ?? '' }}</span>\n @if (!isReadonly() && !isLookupDisabled()) {\n <button type=\"button\" (click)=\"handlePopupRemoveItem($event, index)\">\n <ax-icon class=\"ax-icon ax-icon-close\"></ax-icon>\n </button>\n }\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i3.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "component", type: i3.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i5.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "component", type: AXHighlightTextComponent, selector: "ax-highlight-text", inputs: ["text", "query", "highlightDisabled", "highlightOptions"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i1$2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "component", type: AXLookupComponent, selector: "ax-lookup", inputs: ["name", "mode", "dataSource", "treeDataSource", "valueField", "textField", "disabledField", "columns", "treeParentField", "hasChildrenField", "searchable", "adaptivityEnabled", "caption", "alternate", "searchPlaceholder", "placeholder", "disabled", "readonly", "look", "itemHeight", "maxVisibleItems", "treeSelectionBehavior", "highlightSearch", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "value", "valueItems"], outputs: ["lookChange", "valueChange", "onValueChanged", "onSelectionChanged", "onFocus", "onBlur", "onItemClick", "onItemSelected", "onOpened", "onClosed"] }, { kind: "component", type: AXPLookupWidgetTableHostComponent, selector: "axp-lookup-widget-table-host", inputs: ["name", "placeholder", "caption", "searchPlaceholder", "dataSource", "treeDataSource", "columns", "valueField", "textField", "disabledField", "parentField", "hasChildrenField", "searchFields", "value", "valueItems", "disabled", "readonly", "searchable", "selectedTemplate", "rowActions"], outputs: ["valueChange", "onItemSelected"] }, { kind: "ngmodule", type: AXTagBoxModule }, { kind: "component", type: i6$1.AXTagBoxComponent, selector: "ax-tag-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "allowNull", "type", "look", "addOnComma", "addOnEnter", "valueField", "textField", "readonlyField", "allowDuplicateValues", "tagTemplate"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onTagClick", "onTagDblClick", "onTagContextMenu"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXValidationModule }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: i3$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24657
24967
  }
24658
24968
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLookupWidgetEditComponent, decorators: [{
24659
24969
  type: Component,
@@ -24672,7 +24982,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
24672
24982
  AXTagBoxModule,
24673
24983
  AXTranslationModule,
24674
24984
  AXValidationModule,
24675
- ], template: "@if (entityDef() && editorKey()) {\n <!-- ----- Entity lookup editor ----- -->\n <div class=\"flex items-center gap-1 w-full\">\n <!--------------------------------------------------------------->\n <!-- ----- Popup look: full entity data selector ----- -->\n @if (isPopupLook()) {\n <ax-tag-box\n #popupTagBox\n class=\"flex-1 min-w-0\"\n [tagTemplate]=\"popupTagTemplate\"\n [ngModel]=\"selectedItems()\"\n [textField]=\"displayField()\"\n [valueField]=\"valueField()\"\n (onValueChanged)=\"handlePopupValueChange($event)\"\n [placeholder]=\"selectedItems().length ? '' : ((placeholderText() | translate | async) ?? '')\"\n [addOnEnter]=\"false\"\n [addOnComma]=\"false\"\n [readonly]=\"true\"\n [disabled]=\"isLookupDisabled()\"\n (click)=\"handlePopupTriggerClick($event)\"\n (onKeyUp)=\"handlePopupKeyUp($event)\"\n (onBlur)=\"handlePopupBlur($event)\"\n >\n @if (hasClearButton() && selectedItems().length > 0) {\n <ax-clear-button (click)=\"handlePopupClearClick()\"></ax-clear-button>\n }\n @for (validation of validationRules(); track $index) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"$safeNavigationMigration(validation.options?.message)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n <ax-suffix>\n <ax-button\n color=\"ghost\"\n look=\"blank\"\n [disabled]=\"isLookupDisabled() || isReadonly() || isLoading()\"\n (onClick)=\"handlePopupTriggerClick($event)\"\n >\n @if (isLoading()) {\n <ax-loading></ax-loading>\n }\n <!-- ----- Search icon opens entity selector ----- -->\n @else {\n <ax-icon icon=\"far fa-search\"></ax-icon>\n }\n </ax-button>\n </ax-suffix>\n </ax-tag-box>\n }\n <!-- ----- Inline ax-lookup / table host ----- -->\n @else if (effectiveDataSource(); as dataSource) {\n <!-- ----- Multi-column modes: platform widget column renderer ----- -->\n @if (isTableLookupMode()) {\n <axp-lookup-widget-table-host\n class=\"flex-1 min-w-0\"\n [name]=\"name ?? ''\"\n [placeholder]=\"(placeholderText() | translate | async) ?? ''\"\n [caption]=\"(placeholderText() | translate | async) ?? ''\"\n [searchPlaceholder]=\"('@general:widgets.lookup.search.placeholder' | translate | async) ?? ''\"\n [dataSource]=\"dataSource\"\n [columns]=\"lookupWidgetTableColumns()\"\n [valueField]=\"valueField()\"\n [textField]=\"displayField()\"\n [disabledField]=\"'disabled'\"\n [parentField]=\"lookupMode() === 'multi-column-tree' ? treeParentField() : undefined\"\n [treeDataSource]=\"lookupMode() === 'multi-column-tree' ? entityTreeDataSource() : undefined\"\n [searchFields]=\"lookupTreeSearchFields()\"\n [value]=\"boundValue()\"\n [valueItems]=\"selectedItems()\"\n [disabled]=\"isLookupDisabled()\"\n [readonly]=\"isReadonly()\"\n [searchable]=\"true\"\n [selectedTemplate]=\"lookupItemTemplate\"\n (valueChange)=\"handleLookupModelChange($event)\"\n (onItemSelected)=\"handleLookupItemSelected($event)\"\n >\n @if (hasClearButton()) {\n <ax-clear-button></ax-clear-button>\n }\n @for (validation of validationRules(); track $index) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"$safeNavigationMigration(validation.options?.message)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </axp-lookup-widget-table-host>\n }\n <!-- ----- List / tree chip modes: ax-lookup ----- -->\n @else {\n <ax-lookup\n class=\"flex-1 min-w-0\"\n [name]=\"name ?? ''\"\n [placeholder]=\"(placeholderText() | translate | async) ?? ''\"\n [caption]=\"(placeholderText() | translate | async) ?? ''\"\n [searchPlaceholder]=\"('@general:widgets.lookup.search.placeholder' | translate | async) ?? ''\"\n [mode]=\"lookupMode()\"\n [treeParentField]=\"treeParentField()\"\n [dataSource]=\"dataSource\"\n [treeDataSource]=\"entityTreeDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"displayField()\"\n [value]=\"boundValue()\"\n [valueItems]=\"selectedItems()\"\n [disabled]=\"isLookupDisabled()\"\n [readonly]=\"isReadonly()\"\n [searchable]=\"true\"\n [itemTemplate]=\"$any(multiple() ? lookupItemTemplate : lookupDropDownListItemTemplate)\"\n [selectedTemplate]=\"lookupItemTemplate\"\n (valueChange)=\"handleLookupModelChange($event)\"\n (onItemSelected)=\"handleLookupItemSelected($event)\"\n >\n @if (hasClearButton()) {\n <ax-clear-button></ax-clear-button>\n }\n @for (validation of validationRules(); track $index) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"$safeNavigationMigration(validation.options?.message)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-lookup>\n }\n }\n <!--------------------------------------------------------------->\n <!-- ----- Inline create for the lookup entity ----- -->\n @if (resolvedCreate().enabled) {\n <ax-button\n color=\"primary\"\n look=\"twotone\"\n [disabled]=\"isLookupDisabled() || isLoading()\"\n (onClick)=\"handleCreateClick($event)\"\n [title]=\"'@general:actions.create.title' | translate | async\"\n >\n <ax-icon icon=\"far fa-plus\"></ax-icon>\n </ax-button>\n }\n </div>\n}\n\n<!-- ----- Lookup item and selected-value label ----- -->\n<ng-template #lookupItemTemplate let-item let-highlightText=\"highlightText\">\n <span class=\"ax-lookup-option-text\">\n <ax-highlight-text\n [text]=\"(getLookupItemLabel(item) | translate | async) ?? ''\"\n [query]=\"highlightText ?? ''\"\n ></ax-highlight-text>\n </span>\n</ng-template>\n<!-- ----- Drop-down-list rows: library skips .ax-lookup-option chrome when itemTemplate is set ----- -->\n<ng-template #lookupDropDownListItemTemplate let-item let-highlightText=\"highlightText\">\n <span class=\"flex h-full w-full min-w-0 items-center px-3 text-sm\">\n <span class=\"ax-lookup-option-text min-w-0 flex-1 truncate\">\n <ax-highlight-text\n [text]=\"(getLookupItemLabel(item) | translate | async) ?? ''\"\n [query]=\"highlightText ?? ''\"\n ></ax-highlight-text>\n </span>\n </span>\n</ng-template>\n<!-- ----- Popup look selected chips ----- -->\n<ng-template #popupTagTemplate let-item let-index=\"index\">\n <div class=\"inline-flex items-center gap-1.5 rounded-md px-3 py-1 text-sm surface\">\n <span>{{ (getLookupItemLabel(item) | translate | async) ?? '' }}</span>\n @if (!isReadonly() && !isLookupDisabled()) {\n <button type=\"button\" (click)=\"handlePopupRemoveItem($event, index)\">\n <ax-icon class=\"ax-icon ax-icon-close\"></ax-icon>\n </button>\n }\n </div>\n</ng-template>\n" }]
24985
+ ], template: "@if (entityDef() && editorKey()) {\n <!-- ----- Entity lookup editor ----- -->\n <div class=\"flex items-center gap-1 w-full\">\n <!--------------------------------------------------------------->\n <!-- ----- Popup look: full entity data selector ----- -->\n @if (isPopupLook()) {\n <ax-tag-box\n #popupTagBox\n class=\"flex-1 min-w-0\"\n [tagTemplate]=\"popupTagTemplate\"\n [ngModel]=\"selectedItems()\"\n [textField]=\"displayField()\"\n [valueField]=\"valueField()\"\n (onValueChanged)=\"handlePopupValueChange($event)\"\n [placeholder]=\"selectedItems().length ? '' : ((placeholderText() | translate | async) ?? '')\"\n [addOnEnter]=\"false\"\n [addOnComma]=\"false\"\n [readonly]=\"true\"\n [disabled]=\"isLookupDisabled()\"\n (click)=\"handlePopupTriggerClick($event)\"\n (onKeyUp)=\"handlePopupKeyUp($event)\"\n (onBlur)=\"handlePopupBlur($event)\"\n >\n @if (hasClearButton() && selectedItems().length > 0) {\n <ax-clear-button (click)=\"handlePopupClearClick()\"></ax-clear-button>\n }\n @for (validation of validationRules(); track $index) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"$safeNavigationMigration(validation.options?.message)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n <ax-suffix>\n <ax-button\n color=\"ghost\"\n look=\"blank\"\n [disabled]=\"isLookupDisabled() || isReadonly() || isLoading()\"\n (onClick)=\"handlePopupTriggerClick($event)\"\n >\n @if (isLoading()) {\n <ax-loading></ax-loading>\n }\n <!-- ----- Search icon opens entity selector ----- -->\n @else {\n <ax-icon icon=\"far fa-search\"></ax-icon>\n }\n </ax-button>\n </ax-suffix>\n </ax-tag-box>\n }\n <!-- ----- Inline ax-lookup / table host ----- -->\n @else if (effectiveDataSource(); as dataSource) {\n <!-- ----- Multi-column modes: platform widget column renderer ----- -->\n @if (isTableLookupMode()) {\n <axp-lookup-widget-table-host\n class=\"flex-1 min-w-0\"\n [name]=\"name ?? ''\"\n [placeholder]=\"(placeholderText() | translate | async) ?? ''\"\n [caption]=\"(placeholderText() | translate | async) ?? ''\"\n [searchPlaceholder]=\"('@general:widgets.lookup.search.placeholder' | translate | async) ?? ''\"\n [dataSource]=\"dataSource\"\n [columns]=\"lookupWidgetTableColumns()\"\n [valueField]=\"valueField()\"\n [textField]=\"displayField()\"\n [disabledField]=\"'disabled'\"\n [parentField]=\"lookupMode() === 'multi-column-tree' ? treeParentField() : undefined\"\n [treeDataSource]=\"lookupMode() === 'multi-column-tree' ? entityTreeDataSource() : undefined\"\n [searchFields]=\"lookupTreeSearchFields()\"\n [value]=\"boundValue()\"\n [valueItems]=\"selectedItems()\"\n [disabled]=\"isLookupDisabled()\"\n [readonly]=\"isReadonly()\"\n [searchable]=\"true\"\n [selectedTemplate]=\"lookupItemTemplate\"\n [rowActions]=\"rowActionsHandler()\"\n (valueChange)=\"handleLookupModelChange($event)\"\n (onItemSelected)=\"handleLookupItemSelected($event)\"\n >\n @if (hasClearButton()) {\n <ax-clear-button></ax-clear-button>\n }\n @for (validation of validationRules(); track $index) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"$safeNavigationMigration(validation.options?.message)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </axp-lookup-widget-table-host>\n }\n <!-- ----- List / tree chip modes: ax-lookup ----- -->\n @else {\n <ax-lookup\n class=\"flex-1 min-w-0\"\n [name]=\"name ?? ''\"\n [placeholder]=\"(placeholderText() | translate | async) ?? ''\"\n [caption]=\"(placeholderText() | translate | async) ?? ''\"\n [searchPlaceholder]=\"('@general:widgets.lookup.search.placeholder' | translate | async) ?? ''\"\n [mode]=\"lookupMode()\"\n [treeParentField]=\"treeParentField()\"\n [dataSource]=\"dataSource\"\n [treeDataSource]=\"entityTreeDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"displayField()\"\n [value]=\"boundValue()\"\n [valueItems]=\"selectedItems()\"\n [disabled]=\"isLookupDisabled()\"\n [readonly]=\"isReadonly()\"\n [searchable]=\"true\"\n [itemTemplate]=\"\n $any(\n multiple()\n ? hasRowActionPrimary()\n ? lookupListItemWithActionsTemplate\n : lookupItemTemplate\n : lookupDropDownListItemTemplate\n )\n \"\n [selectedTemplate]=\"lookupItemTemplate\"\n (valueChange)=\"handleLookupModelChange($event)\"\n (onItemSelected)=\"handleLookupItemSelected($event)\"\n >\n @if (hasClearButton()) {\n <ax-clear-button></ax-clear-button>\n }\n @for (validation of validationRules(); track $index) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"$safeNavigationMigration(validation.options?.message)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-lookup>\n }\n }\n <!--------------------------------------------------------------->\n <!-- ----- Inline create for the lookup entity ----- -->\n @if (resolvedCreate().enabled) {\n <ax-button\n color=\"primary\"\n look=\"twotone\"\n [disabled]=\"isLookupDisabled() || isLoading()\"\n (onClick)=\"handleCreateClick($event)\"\n [title]=\"'@general:actions.create.title' | translate | async\"\n >\n <ax-icon icon=\"far fa-plus\"></ax-icon>\n </ax-button>\n }\n </div>\n}\n\n<!-- ----- Lookup item and selected-value label ----- -->\n<ng-template #lookupItemTemplate let-item let-highlightText=\"highlightText\">\n <span class=\"ax-lookup-option-text\">\n <ax-highlight-text\n [text]=\"(getLookupItemLabel(item) | translate | async) ?? ''\"\n [query]=\"highlightText ?? ''\"\n ></ax-highlight-text>\n </span>\n</ng-template>\n<!-- ----- Drop-down-list rows: library skips .ax-lookup-option chrome when itemTemplate is set ----- -->\n<ng-template #lookupDropDownListItemTemplate let-item let-highlightText=\"highlightText\">\n <span class=\"flex h-full w-full min-w-0 items-center gap-1 px-3 text-sm\">\n <span class=\"ax-lookup-option-text min-w-0 flex-1 truncate\">\n <ax-highlight-text\n [text]=\"(getLookupItemLabel(item) | translate | async) ?? ''\"\n [query]=\"highlightText ?? ''\"\n ></ax-highlight-text>\n </span>\n <!-- ----- Primary row actions (preview, etc.) ----- -->\n @if (hasRowActionPrimary()) {\n <span class=\"inline-flex shrink-0 items-center\" (mousedown)=\"handleLookupItemRowActionMouseDown($event)\">\n @for (action of rowActionPrimaryItems(); track action.name) {\n <ax-button\n look=\"blank\"\n color=\"ghost\"\n [title]=\"action.text\"\n (onClick)=\"handleItemRowAction($event, action.name, item)\"\n >\n @if (action.icon) {\n <ax-icon [icon]=\"action.icon\"></ax-icon>\n }\n </ax-button>\n }\n </span>\n }\n </span>\n</ng-template>\n<!-- ----- Multi-select list rows with row actions ----- -->\n<ng-template #lookupListItemWithActionsTemplate let-item let-highlightText=\"highlightText\">\n <span class=\"flex w-full min-w-0 items-center gap-1\">\n <span class=\"ax-lookup-option-text min-w-0 flex-1 truncate\">\n <ax-highlight-text\n [text]=\"(getLookupItemLabel(item) | translate | async) ?? ''\"\n [query]=\"highlightText ?? ''\"\n ></ax-highlight-text>\n </span>\n <span class=\"inline-flex shrink-0 items-center\" (mousedown)=\"handleLookupItemRowActionMouseDown($event)\">\n @for (action of rowActionPrimaryItems(); track action.name) {\n <ax-button\n look=\"blank\"\n color=\"ghost\"\n [title]=\"action.text\"\n (onClick)=\"handleItemRowAction($event, action.name, item)\"\n >\n @if (action.icon) {\n <ax-icon [icon]=\"action.icon\"></ax-icon>\n }\n </ax-button>\n }\n </span>\n </span>\n</ng-template>\n<!-- ----- Popup look selected chips ----- -->\n<ng-template #popupTagTemplate let-item let-index=\"index\">\n <div class=\"inline-flex items-center gap-1.5 rounded-md px-3 py-1 text-sm surface\">\n <span>{{ (getLookupItemLabel(item) | translate | async) ?? '' }}</span>\n @if (!isReadonly() && !isLookupDisabled()) {\n <button type=\"button\" (click)=\"handlePopupRemoveItem($event, index)\">\n <ax-icon class=\"ax-icon ax-icon-close\"></ax-icon>\n </button>\n }\n </div>\n</ng-template>\n" }]
24676
24986
  }], propDecorators: { lookup: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXLookupComponent), { isSignal: true }] }], tableLookupHost: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXPLookupWidgetTableHostComponent), { isSignal: true }] }], popupTagBox: [{ type: i0.ViewChild, args: ['popupTagBox', { isSignal: true }] }] } });
24677
24987
 
24678
24988
  var lookupWidgetEdit_component = /*#__PURE__*/Object.freeze({
@@ -31983,7 +32293,7 @@ class AXPEntityModule {
31983
32293
  },
31984
32294
  {
31985
32295
  key: 'Entity:Bulk',
31986
- command: () => import('./acorex-platform-framework-client-layout-entity-bulk-entity.command-CgsgFxT8.mjs').then((c) => c.AXPBulkEntityCommand),
32296
+ command: () => import('./acorex-platform-framework-client-layout-entity-bulk-entity.command-C4fDZV2N.mjs').then((c) => c.AXPBulkEntityCommand),
31987
32297
  },
31988
32298
  {
31989
32299
  key: 'Entity:OpenList',
@@ -32144,7 +32454,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
32144
32454
  },
32145
32455
  {
32146
32456
  key: 'Entity:Bulk',
32147
- command: () => import('./acorex-platform-framework-client-layout-entity-bulk-entity.command-CgsgFxT8.mjs').then((c) => c.AXPBulkEntityCommand),
32457
+ command: () => import('./acorex-platform-framework-client-layout-entity-bulk-entity.command-C4fDZV2N.mjs').then((c) => c.AXPBulkEntityCommand),
32148
32458
  },
32149
32459
  {
32150
32460
  key: 'Entity:OpenList',
@@ -32470,4 +32780,4 @@ function detectEntityChanges(oldObj, newObj) {
32470
32780
  */
32471
32781
 
32472
32782
  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, detectEntityChanges 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, axpUpdateEntityStatusCommandDefinition as bA, buildDataSourceTraceSnapshot as bB, canPersistEntityListState as bC, clientLocalPlugin as bD, cloneLayoutArrays as bE, columnOrderingMiddleware as bF, columnOrderingMiddlewareProvider as bG, columnWidthMiddleware as bH, columnWidthMiddlewareProvider as bI, committedAttachments as bJ, composeEntityMiddlewares as bK, composeEntityStorageMiddlewares as bL, computeEntityAggregates as bM, configureEntityListColumnsSettingsMigrateDrop as bN, configureEntityListColumnsSettingsVersion as bO, createColumnOrderingMiddlewareProvider as bP, createEntityCardDisplayScope as bQ, createEntityCardLogicScope as bR, createEntityMiddlewareContext as bS, createEntityStorageContext as bT, createLayoutOrderingMiddlewareProvider as bU, defaultCardLayoutMiddleware as bV, defaultCardLayoutMiddlewareProvider as bW, defaultMultiLanguageMiddleware as bX, defaultMultiLanguageMiddlewareProvider as bY, defaultSortPresetsMiddleware as bZ, defaultSortPresetsMiddlewareProvider as b_, AXP_MULTI_SOURCE_DEFINITION_PROVIDER as ba, DEFAULT_COLUMN_ORDER as bb, DEFAULT_PAIR_SPAN_RULES as bc, DEFAULT_PROPERTY_ORDER as bd, DEFAULT_SECTION_ORDER as be, ENTITY_FORM_ACTION_FIRST_STEP_CONTINUE as bf, ENTITY_LIST_LAYOUT_META as bg, ENTITY_LIST_ROUTE_CONTEXT_SESSION_KEY as bh, ENTITY_MASTER_LIST_TRACE_NS as bi, EntityBuilder as bj, EntityDataAccessor as bk, GALLERY_PAGE_COMPONENT_KEY as bl, TREE_CHILDREN_QUERY_TAKE as bm, actionExists as bn, applyDataSourcePagingWithoutLoad as bo, attachmentFieldCount as bp, attachmentNeedsHydration as bq, attachmentsPlugin as br, attachmentsSemanticallyEqual as bs, axpBuildEntityListPageContextSnapshot as bt, axpCreateEntityAiToolInputDefaults as bu, axpCreateEntityCommandDefinition as bv, axpDeleteEntityCommandDefinition as bw, axpOpenEntityListCommandDefinition as bx, axpRunEntityListPageContextAction as by, axpShowFileUploaderPopupCommandDefinition as bz, ATTACHMENTS_PAGE_COMPONENT_KEY as c, readPersistedEntityListInstanceCurrentView as c$, dispatchEntityModifiedSideEffects as c0, ensureHierarchicalRootFilter as c1, ensureLayoutPropertyView as c2, ensureLayoutSection as c3, ensureListActions as c4, entityCreateBridgeMiddleware as c5, entityDeleteBridgeMiddleware as c6, entityGetOneBridgeMiddleware as c7, entityListInstanceCurrentViewPath as c8, entityListInstanceFilterPath as c9, hydrateAttachmentFieldToFileList as cA, isAXPMiddlewareAbortError as cB, isAttachmentFieldPresentOnRow as cC, isAttachmentListEntry as cD, isAttachmentStorageRef as cE, isCategoryEntity as cF, isCategoryFilter as cG, isFileListItem as cH, isFileUploaderEditDialogAuto as cI, isLegacyEntityDataSelectorOptions as cJ, layoutOrderingMiddlewareFactory as cK, layoutOrderingMiddlewareProvider as cL, mapEntityStorageErrorToCommandResult as cM, mapLegacyEntityDataSelectorOptions as cN, mergeEntityListViewAndPersistedFilters as cO, normalizeEntityCardHeaderDisplayValue as cP, normalizeEntityDataSelectorColumnSpecs as cQ, normalizeEntityDataSelectorOptions as cR, normalizeEntityFieldToFileList as cS, normalizeEntityListPersistenceMode as cT, normalizeListPaging as cU, prefetchClientLocalRelated as cV, provideEntity as cW, provideEntityMiddlewareBridge as cX, provideEntityRealtimeHandlers as cY, provideEntityStorageMiddlewareBridge as cZ, provideLocalEntityCatalog as c_, entityListStylingRulesPath as ca, entityQueryBridgeMiddleware as cb, entityStorageCreateBridgeMiddleware as cc, entityStorageDeleteBridgeMiddleware as cd, entityStorageGetOneBridgeMiddleware as ce, entityStorageQueryBridgeMiddleware as cf, entityStorageUpdateBridgeMiddleware as cg, entityUpdateBridgeMiddleware as ch, eventDispatchMiddleware as ci, filterEntityMiddlewares as cj, filterEntityStorageMiddlewares as ck, filterSortEntityRows as cl, filterTouchesParentKey as cm, findEntityListRowDataInTree as cn, fingerprintAttachmentItem as co, fingerprintAttachments as cp, fireEntityLifecycleHook as cq, formatLookupItemDisplay as cr, formatLookupItemDisplayAsync as cs, galleryPlugin as ct, getDataSourcePageIndex as cu, getEntityListColumnsSettingsMigrateDrop as cv, getEntityListColumnsSettingsVersion as cw, getEntityListRowId as cx, getMasterInterfacePropertySortKey as cy, hasFileUploaderTitleOrDescriptionFields as cz, AXMEntityCrudService as d, readPersistedEntityListInstanceFilters as d0, readPersistedEntityListStylingRules as d1, resetPagingForTreeChildrenLoad as d2, resolveAttachmentFieldPath as d3, resolveEntityCardBadgeColorValue as d4, resolveEntityCardHeaderValue as d5, resolveEntityMasterFieldStylingClass as d6, resolveEntityMasterRecordStylingClass as d7, resolveEntityMasterStylingClass as d8, resolveEntityPluginDetailPageOrder as d9, resolveFileUploaderEditDialog as da, resolveFileUploaderEntityScope as db, resolveLookupDisplayField as dc, resolveLookupDisplayTemplate as dd, resolveLookupEntityCacheKey as de, resolveLookupEntityKey as df, resolveMasterInterfacePropertyOrder as dg, restoreEntityListExpandedRows as dh, runEntityMiddlewarePipeline as di, runEntityQuery as dj, runEntityStorageMiddlewarePipeline as dk, searchResultDescriptionMiddleware as dl, searchResultDescriptionMiddlewareProvider as dm, shouldLoadEntityListStateFromStorage as dn, shouldResetEntityListStateOnRouteEntry as dp, traceEntityMasterList as dq, 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 };
32473
- //# sourceMappingURL=acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-DS3F1_EN.mjs.map
32783
+ //# sourceMappingURL=acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-bGKRfOH2.mjs.map